@timeax/digital-service-engine 0.0.9 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/react/workspace/context/provider/context.ts","../../src/react/workspace/context/provider/provider.tsx","../../src/react/workspace/context/provider/helpers.ts","../../src/react/workspace/context/provider/runtime/use-backend-runtime.ts","../../src/react/workspace/context/provider/slices/use-authors-slice.ts","../../src/react/workspace/context/provider/slices/use-permissions-slice.ts","../../src/react/workspace/context/provider/slices/use-branches-slice.ts","../../src/react/workspace/context/provider/slices/use-templates-slice.ts","../../src/react/workspace/context/provider/slices/use-services-slice.ts","../../src/react/workspace/context/provider/slices/use-snapshots-slice.ts","../../src/react/workspace/context/provider/slices/use-comments-slice.ts","../../src/react/workspace/context/provider/compose/use-branch-cache.ts","../../src/react/workspace/context/provider/compose/use-live-polling.ts","../../src/react/workspace/context/provider/slices/use-policies-slice.ts","../../src/core/policy.ts","../../src/react/workspace/context/provider/compose/use-workspace-boot.ts","../../src/react/workspace/context/context.tsx","../../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/utils/util.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/builder.ts","../../src/core/rate-coherence.ts","../../src/core/validate/index.ts","../../src/core/fallback.ts","../../src/core/tag-relations.ts","../../src/core/service-filter.ts","../../src/react/canvas/editor/editor-ids.ts","../../src/react/canvas/editor/editor-duplicate.ts","../../src/react/canvas/editor/editor-notices.ts","../../src/react/canvas/editor/editor-nodes.ts","../../src/react/canvas/editor/editor-utils.ts","../../src/react/canvas/editor/editor-constraints.ts","../../src/react/canvas/editor/editor-field-rules.ts","../../src/react/canvas/editor/editor-relations.ts","../../src/react/canvas/editor/editor-service-filter.ts","../../src/react/canvas/editor/editor-placement.ts","../../src/react/canvas/editor/editor-catalog.ts","../../src/react/canvas/selection.ts","../../src/react/canvas/api.ts","../../src/react/workspace/context/hooks/use-canvas.ts","../../src/react/workspace/context/hooks/use-errors.ts","../../src/react/workspace/context/provider/live/adapters/poll.ts","../../src/react/workspace/context/memory/ids.ts","../../src/react/workspace/context/memory/errors.ts","../../src/react/workspace/context/memory/time.ts","../../src/react/workspace/context/memory/store.ts","../../src/react/workspace/context/memory/persistence.ts","../../src/react/workspace/context/memory/memory-backend.ts","../../src/react/workspace/app.tsx","../../src/react/workspace/components/canvas.tsx","../../src/react/workspace/adapters/reactflow/adapter.ts","../../src/react/workspace/adapters/reactflow/toolbar.tsx","../../src/react/workspace/adapters/reactflow/toolbar/merge.ts","../../src/react/workspace/adapters/reactflow/toolbar/icons.tsx","../../src/react/workspace/components/reactflow/nodes/node.tsx","../../src/react/workspace/components/reactflow/nodes/tags.tsx","../../src/react/workspace/components/reactflow/nodes/field.tsx","../../src/react/workspace/components/reactflow/nodes/options.tsx","../../src/react/workspace/components/reactflow/index.tsx","../../src/react/workspace/components/index.tsx"],"sourcesContent":["// src/react/workspace/context/provider/context.ts\nimport * as React from \"react\";\nimport type { WorkspaceAPI, WorkspaceBootState } from \"./types\";\n\nexport const WorkspaceContext = React.createContext<WorkspaceAPI | null>(null);\n\nexport function useWorkspace(): WorkspaceAPI {\n const ctx = React.useContext(WorkspaceContext);\n if (!ctx) {\n throw new Error(\n \"useWorkspace() must be used under <WorkspaceProvider/>\",\n );\n }\n return ctx;\n}\n\nexport function useWorkspaceMaybe(): WorkspaceAPI | null {\n return React.useContext(WorkspaceContext);\n}\n\nexport function useWorkspaceBoot(): WorkspaceBootState {\n return useWorkspace().boot;\n}\n","// src/react/workspace/context/provider/provider.tsx\nimport * as React from \"react\";\nimport type {\n LiveOptions,\n MergeResult,\n Result,\n TemplatesListParams,\n} from \"@/react/workspace\";\nimport type { DgpServiceMap } from \"@/schema/provider\";\n\nimport { WorkspaceContext } from \"@/react/workspace\";\nimport type { WorkspaceAPI, WorkspaceProviderProps } from \"./types\";\nimport { LIVE_OFF } from \"./helpers\";\n\nimport { useBackendRuntime } from \"./runtime/use-backend-runtime\";\n\nimport { useAuthorsSlice } from \"./slices/use-authors-slice\";\nimport { usePermissionsSlice } from \"./slices/use-permissions-slice\";\nimport { useBranchesSlice } from \"./slices/use-branches-slice\";\nimport { useTemplatesSlice } from \"./slices/use-templates-slice\";\nimport { useServicesSlice } from \"./slices/use-services-slice\";\nimport { useSnapshotsSlice } from \"./slices/use-snapshots-slice\";\nimport { useCommentsSlice } from \"./slices/use-comments-slice\";\nimport { useBranchCache } from \"./compose/use-branch-cache\";\nimport { useLivePolling } from \"./compose/use-live-polling\";\nimport { usePoliciesSlice } from \"@/react/workspace/context/provider/slices/use-policies-slice\";\nimport { useWorkspaceBoot } from \"./compose/use-workspace-boot\";\n\n/* ---------------- provider (thin composition root) ---------------- */\n\nexport function WorkspaceProvider(\n props: WorkspaceProviderProps,\n): React.JSX.Element {\n const {\n backend,\n actor,\n initial,\n ensureMain = true,\n live: liveProp,\n autosaveMs = 9000,\n autoAutosave = true,\n children,\n liveAdapters,\n liveDebounceMs = 250,\n } = props;\n\n const runtime = useBackendRuntime();\n\n const workspaceId: string = backend.info.id;\n const live: LiveOptions = liveProp ?? LIVE_OFF;\n\n const authorsSlice = useAuthorsSlice({\n backend,\n workspaceId,\n initialAuthors: initial?.authors ?? null,\n runtime,\n });\n\n const permissionsSlice = usePermissionsSlice({\n backend,\n workspaceId,\n actor,\n initialPermissions: initial?.permissions ?? null,\n runtime,\n });\n\n const branchesSlice = useBranchesSlice({\n backend,\n workspaceId,\n ensureMain,\n initialBranches: initial?.branches ?? [],\n initialMainId: initial?.mainId,\n initialCurrentId: initial?.currentBranchId ?? initial?.mainId,\n initialParticipants: initial?.participants ?? null,\n runtime,\n });\n\n const getCurrentBranchId = React.useCallback(\n (): string | undefined => branchesSlice.branches.currentId,\n [branchesSlice.branches.currentId],\n );\n\n const templatesSlice = useTemplatesSlice({\n backend,\n workspaceId,\n getCurrentBranchId,\n initialTemplates: initial?.templates ?? null,\n runtime,\n });\n\n const servicesSlice = useServicesSlice({\n backend,\n workspaceId,\n initialServices: (initial?.services as DgpServiceMap | null) ?? null,\n runtime,\n });\n\n const snapshotsSlice = useSnapshotsSlice({\n backend,\n workspaceId,\n actor,\n getCurrentBranchId,\n initialSnapshot: initial?.snapshot\n ? {\n schema_version: initial.snapshot.schema_version,\n data: initial.snapshot.data as any,\n }\n : null,\n initialHead: initial?.head,\n initialDraft: initial?.draft,\n autosaveMs,\n autoAutosave,\n runtime,\n });\n\n const branchCache = useBranchCache(workspaceId);\n\n const comments = useCommentsSlice({\n backend: backend.comments,\n workspaceId,\n actorId: actor.id,\n getCurrentBranchId,\n initialThreads: initial?.comments,\n });\n\n const policiesSlice = usePoliciesSlice({\n backend,\n workspaceId,\n actorId: actor.id,\n getCurrentBranchId,\n initialPolicies: initial?.policies ?? null,\n runtime,\n });\n\n const bootCtl = useWorkspaceBoot({\n workspaceId,\n actorId: actor.id,\n preferredBranchId: initial?.currentBranchId ?? initial?.mainId,\n hasInitialData: Boolean(\n initial?.authors ||\n initial?.permissions ||\n initial?.branches ||\n initial?.templates ||\n initial?.participants ||\n initial?.services ||\n initial?.snapshot ||\n initial?.policies ||\n initial?.comments,\n ),\n runtime,\n getBranchesState: () => branchesSlice.branches.data,\n getCurrentBranchId,\n setCurrentBranchId: branchesSlice.setCurrentBranchId,\n refreshAuthors: authorsSlice.refreshAuthors,\n refreshPermissions: permissionsSlice.refreshPermissions,\n refreshBranches: branchesSlice.refreshBranches,\n refreshServices: servicesSlice.refreshServices as () => Promise<any>,\n refreshParticipants: (branchId: string) =>\n branchesSlice.refreshParticipants({ branchId }),\n refreshTemplates: (branchId: string) =>\n templatesSlice.refreshTemplates({ branchId }),\n refreshSnapshotPointers: (branchId: string) =>\n snapshotsSlice.refreshSnapshotPointersForBranch(branchId) as any,\n loadSnapshotBody: async (branchId: string) => {\n const res = await snapshotsSlice.loadSnapshotForBranch(branchId);\n if (!res.ok) {\n return res;\n }\n return { ok: true, value: undefined };\n },\n refreshPolicies: (branchId: string) =>\n policiesSlice.refreshPolicies({ branchId }),\n refreshComments: (branchId: string) =>\n comments.refreshThreads({ branchId }),\n });\n\n const hasAnyData: boolean = Boolean(\n (authorsSlice.authors.data && authorsSlice.authors.data.length) ||\n (branchesSlice.branches.data &&\n branchesSlice.branches.data.length) ||\n (templatesSlice.templates.data &&\n templatesSlice.templates.data.length) ||\n (branchesSlice.participants.data &&\n branchesSlice.participants.data.length) ||\n snapshotsSlice.snapshot.data,\n );\n\n const liveCtl = useLivePolling({\n live,\n workspaceId,\n actor,\n hasAnyData,\n getCurrentBranchId: () => branchesSlice.branches.currentId,\n refreshAll: bootCtl.refreshAll,\n refreshBranchContext: bootCtl.refreshBranchContext,\n refreshSnapshotPointers: bootCtl.refreshSnapshotPointers,\n adapters: liveAdapters,\n debounceMs: liveDebounceMs,\n });\n\n const currentBranchIdRef = React.useRef<string | undefined>(\n branchesSlice.branches.currentId,\n );\n const currentSnapshotRef = React.useRef(snapshotsSlice.snapshot);\n\n React.useEffect(() => {\n currentBranchIdRef.current = branchesSlice.branches.currentId;\n }, [branchesSlice.branches.currentId]);\n\n React.useEffect(() => {\n currentSnapshotRef.current = snapshotsSlice.snapshot;\n }, [snapshotsSlice.snapshot]);\n\n /* ---------------- branch ops ---------------- */\n\n const setCurrentBranch = React.useCallback(\n (id: string): void => {\n const prevId: string | undefined = branchesSlice.branches.currentId;\n\n branchCache.switchBranch({\n workspaceId,\n nextId: id,\n prevId,\n templates: templatesSlice.templates,\n participants: branchesSlice.participants,\n snapshot: snapshotsSlice.snapshot,\n setTemplates: templatesSlice.__setTemplatesState,\n setParticipants: branchesSlice.__setParticipantsState,\n setSnapshot: snapshotsSlice.__setSnapshotState,\n resetTemplates: templatesSlice.resetTemplatesForBranch,\n resetParticipants: () => {\n branchesSlice.__setParticipantsState((state) => ({\n ...state,\n data: null,\n error: undefined,\n }));\n },\n resetSnapshot: snapshotsSlice.resetSnapshotForBranch,\n setCurrentBranchId: branchesSlice.setCurrentBranchId,\n getCurrentBranchId: () => currentBranchIdRef.current,\n getCurrentSnapshot: () => currentSnapshotRef.current,\n });\n\n void bootCtl.refreshBranchContext({\n branchId: id,\n includeWorkspaceData: false,\n });\n },\n [\n branchesSlice.branches.currentId,\n branchesSlice.participants,\n branchesSlice.setCurrentBranchId,\n branchesSlice.__setParticipantsState,\n branchCache,\n bootCtl,\n snapshotsSlice.__setSnapshotState,\n snapshotsSlice.resetSnapshotForBranch,\n snapshotsSlice.snapshot,\n templatesSlice.__setTemplatesState,\n templatesSlice.resetTemplatesForBranch,\n templatesSlice.templates,\n workspaceId,\n ],\n );\n\n const createBranch = React.useCallback<WorkspaceAPI[\"createBranch\"]>(\n async (name: string, opts?: Readonly<{ fromId?: string }>) => {\n const res = await backend.branches.create(workspaceId, name, opts);\n if (res.ok) {\n await branchesSlice.refreshBranches();\n setCurrentBranch(res.value.id);\n }\n return res;\n },\n [backend.branches, branchesSlice, setCurrentBranch, workspaceId],\n );\n\n const setMain = React.useCallback<WorkspaceAPI[\"setMain\"]>(\n async (branchId: string) => {\n const res = await backend.branches.setMain(workspaceId, branchId);\n if (res.ok) {\n await branchesSlice.refreshBranches();\n }\n return res;\n },\n [backend.branches, branchesSlice, workspaceId],\n );\n\n const mergeBranch = React.useCallback<WorkspaceAPI[\"mergeBranch\"]>(\n async (sourceId: string, targetId: string): Result<MergeResult> => {\n const res = await backend.branches.merge(\n workspaceId,\n sourceId,\n targetId,\n );\n\n if (res.ok) {\n await runtime.runTasks(\n [\n async () => {\n await branchesSlice.refreshBranches();\n },\n async () => {\n await bootCtl.refreshBranchContext();\n },\n ],\n true,\n );\n }\n\n return res;\n },\n [backend.branches, bootCtl, branchesSlice, runtime, workspaceId],\n );\n\n const deleteBranch = React.useCallback<WorkspaceAPI[\"deleteBranch\"]>(\n async (branchId: string) => {\n const res = await backend.branches.delete(workspaceId, branchId);\n if (res.ok) {\n const refreshed = await branchesSlice.refreshBranches();\n\n if (\n refreshed.ok &&\n branchesSlice.branches.currentId === branchId\n ) {\n const fallback = refreshed.value.find(\n (branch) => branch.id !== branchId,\n )?.id;\n\n if (fallback) {\n setCurrentBranch(fallback);\n }\n }\n }\n return res;\n },\n [backend.branches, branchesSlice, setCurrentBranch, workspaceId],\n );\n\n /* ---------------- cache invalidation ---------------- */\n\n const invalidate = React.useCallback<WorkspaceAPI[\"invalidate\"]>(\n (keys) => {\n const setAll: boolean = !keys || keys.length === 0;\n\n if (setAll || keys?.includes(\"authors\")) {\n authorsSlice.invalidateAuthors();\n }\n if (setAll || keys?.includes(\"permissions\")) {\n permissionsSlice.invalidatePermissions();\n }\n if (setAll || keys?.includes(\"branches\")) {\n branchesSlice.invalidateBranches();\n }\n if (setAll || keys?.includes(\"services\")) {\n servicesSlice.invalidateServices();\n }\n\n if (setAll || keys?.includes(\"templates\")) {\n templatesSlice.invalidateTemplates();\n }\n if (setAll || keys?.includes(\"participants\")) {\n branchesSlice.invalidateParticipants();\n }\n\n if (\n setAll ||\n keys?.includes(\"templates\") ||\n keys?.includes(\"participants\") ||\n keys?.includes(\"snapshot\")\n ) {\n branchCache.clear();\n }\n\n if (setAll || keys?.includes(\"policies\")) {\n policiesSlice.invalidatePolicies();\n }\n },\n [\n authorsSlice,\n branchCache,\n branchesSlice,\n permissionsSlice,\n policiesSlice,\n servicesSlice,\n templatesSlice,\n ],\n );\n\n /* ---------------- memo API ---------------- */\n\n const api: WorkspaceAPI = React.useMemo<WorkspaceAPI>(\n () => ({\n info: backend.info,\n actor,\n boot: bootCtl.boot,\n\n authors: authorsSlice.authors,\n permissions: permissionsSlice.permissions,\n branches: branchesSlice.branches,\n\n templates: templatesSlice.templates,\n participants: branchesSlice.participants,\n services: servicesSlice.services,\n\n refresh: {\n all: bootCtl.refreshAll,\n authors: async () => {\n await authorsSlice.refreshAuthors();\n },\n permissions: async () => {\n await permissionsSlice.refreshPermissions();\n },\n branches: async () => {\n await branchesSlice.refreshBranches();\n },\n services: async () => {\n await servicesSlice.refreshServices();\n },\n branchContext: bootCtl.refreshBranchContext,\n templates: async (\n params?: Partial<\n Pick<TemplatesListParams, \"branchId\" | \"since\">\n >,\n ) => {\n await templatesSlice.refreshTemplates(params);\n },\n participants: async (\n params?: Partial<{\n branchId: string;\n since?: number | string;\n }>,\n ) => {\n await branchesSlice.refreshParticipants(params);\n },\n snapshotPointers: bootCtl.refreshSnapshotPointers,\n policies: async () => {\n await policiesSlice.refreshPolicies();\n },\n },\n\n setCurrentBranch,\n\n createBranch,\n setMain,\n mergeBranch,\n deleteBranch,\n\n createTemplate: templatesSlice.createTemplate,\n updateTemplate: templatesSlice.updateTemplate,\n cloneTemplate: templatesSlice.cloneTemplate,\n publishTemplate: templatesSlice.publishTemplate,\n unpublishTemplate: templatesSlice.unpublishTemplate,\n deleteTemplate: templatesSlice.deleteTemplate,\n\n invalidate,\n\n live: {\n connected: liveCtl.connected,\n lastEventAt: liveCtl.lastEventAt,\n connect: liveCtl.connect,\n disconnect: liveCtl.disconnect,\n },\n\n snapshot: {\n state: snapshotsSlice.snapshot.state,\n saving: snapshotsSlice.snapshot.saving,\n dirty: snapshotsSlice.snapshot.dirty,\n head: snapshotsSlice.snapshot.head,\n draft: snapshotsSlice.snapshot.draft,\n schemaVersion: snapshotsSlice.snapshot.schemaVersion,\n data: snapshotsSlice.snapshot.data,\n lastSavedAt: snapshotsSlice.snapshot.lastSavedAt,\n lastDraftAt: snapshotsSlice.snapshot.lastDraftAt,\n\n set: snapshotsSlice.setSnapshotData,\n load: snapshotsSlice.loadSnapshot,\n refresh: async () => {\n await snapshotsSlice.refreshSnapshotPointers();\n },\n\n autosave: snapshotsSlice.autosave,\n save: snapshotsSlice.save,\n publish: snapshotsSlice.publish,\n discardDraft: snapshotsSlice.discardDraft,\n },\n comments: {\n threads: comments.threads,\n refreshThreads: comments.refreshThreads,\n createThread: comments.createThread,\n addMessage: comments.addMessage,\n editMessage: comments.editMessage,\n deleteMessage: comments.deleteMessage,\n moveThread: comments.moveThread,\n resolveThread: comments.resolveThread,\n deleteThread: comments.deleteThread,\n },\n policies: policiesSlice,\n }),\n [\n actor,\n authorsSlice.authors,\n authorsSlice.refreshAuthors,\n backend.info,\n bootCtl,\n branchesSlice.branches,\n branchesSlice.participants,\n branchesSlice.refreshBranches,\n branchesSlice.refreshParticipants,\n comments,\n createBranch,\n deleteBranch,\n invalidate,\n liveCtl.connected,\n liveCtl.lastEventAt,\n mergeBranch,\n permissionsSlice.permissions,\n permissionsSlice.refreshPermissions,\n policiesSlice,\n servicesSlice.refreshServices,\n servicesSlice.services,\n setCurrentBranch,\n setMain,\n snapshotsSlice.autosave,\n snapshotsSlice.discardDraft,\n snapshotsSlice.loadSnapshot,\n snapshotsSlice.publish,\n snapshotsSlice.refreshSnapshotPointers,\n snapshotsSlice.save,\n snapshotsSlice.setSnapshotData,\n snapshotsSlice.snapshot,\n templatesSlice.createTemplate,\n templatesSlice.deleteTemplate,\n templatesSlice.publishTemplate,\n templatesSlice.refreshTemplates,\n templatesSlice.templates,\n templatesSlice.cloneTemplate,\n templatesSlice.unpublishTemplate,\n templatesSlice.updateTemplate,\n ],\n );\n\n return (\n <WorkspaceContext.Provider value={api}>\n {children}\n </WorkspaceContext.Provider>\n );\n}\n","// src/react/workspace/context/provider/helpers.ts\nimport type { BackendError, LiveOptions } from \"../backend\";\nimport type { DgpServiceCapability, DgpServiceMap } from \"@/schema/provider\";\nimport type { RunResult } from \"./types\";\n\n// Stable default — avoids a new object per render\nexport const LIVE_OFF: LiveOptions = Object.freeze({ mode: \"off\" as const });\n\nfunction isBackendErrorLike(e: unknown): e is BackendError {\n if (!e || typeof e !== \"object\") return false;\n const obj: Record<string, unknown> = e as Record<string, unknown>;\n return typeof obj.code === \"string\" && typeof obj.message === \"string\";\n}\n\nexport function toBackendError(e: unknown): BackendError {\n if (isBackendErrorLike(e)) return e;\n\n // Preserve real Error information (without assuming BackendError supports extra fields)\n if (e instanceof Error) {\n const name: string = e.name || \"Error\";\n const msg: string = e.message || String(e);\n return {\n code: \"runtime_error\",\n message: `${name}: ${msg}`,\n };\n }\n\n if (typeof e === \"string\") {\n return { code: \"unknown_error\", message: e };\n }\n\n try {\n return { code: \"unknown_error\", message: JSON.stringify(e) };\n } catch {\n return { code: \"unknown_error\", message: String(e ?? \"Unknown error\") };\n }\n}\n\n/**\n * Sequential task runner (ordering preserved).\n * - tolerant=true: collects errors and continues\n * - tolerant=false: throws on first failure\n */\nexport async function runTasks(\n tasks: Array<() => Promise<unknown>>,\n tolerant: boolean,\n): Promise<RunResult> {\n const errors: BackendError[] = [];\n for (const t of tasks) {\n try {\n await t();\n } catch (e) {\n if (!tolerant) throw e;\n errors.push(toBackendError(e));\n }\n }\n return errors.length ? { ok: false, errors } : { ok: true };\n}\n\n/**\n * Parallel task runner (ordering not guaranteed).\n * Kept separate so callers can choose intentionally.\n */\nexport async function runTasksParallel(\n tasks: Array<() => Promise<unknown>>,\n tolerant: boolean,\n): Promise<RunResult> {\n if (tasks.length === 0) return { ok: true };\n\n const results: Array<{ ok: true } | { ok: false; error: BackendError }> =\n await Promise.all(\n tasks.map(async (t) => {\n try {\n await t();\n return { ok: true } as const;\n } catch (e) {\n if (!tolerant) throw e;\n return { ok: false, error: toBackendError(e) } as const;\n }\n }),\n );\n\n const errors: BackendError[] = results\n .filter((r) => !r.ok)\n .map((r) => (r as { ok: false; error: BackendError }).error);\n\n return errors.length ? { ok: false, errors } : { ok: true };\n}\n\nexport function toServiceMap(\n input?: readonly DgpServiceCapability[] | DgpServiceMap | null,\n): DgpServiceMap | null {\n if (!input) return null;\n\n if (Array.isArray(input)) {\n const out: Record<string, DgpServiceCapability> = Object.create(null);\n for (const s of input) out[s.id] = s;\n return out as unknown as DgpServiceMap;\n }\n\n return input as DgpServiceMap;\n}\n","// src/react/workspace/context/provider/runtime/use-backend-runtime.ts\nimport * as React from \"react\";\nimport type { BackendError } from \"@/react/workspace\";\nimport type { RunResult } from \"../types\";\nimport {\n runTasks as runTasksBase,\n toBackendError as toBackendErrorBase,\n} from \"../helpers\";\n\nexport interface BackendRuntime {\n readonly now: () => number;\n readonly toBackendError: (e: unknown) => BackendError;\n readonly runTasks: (\n tasks: Array<() => Promise<unknown>>,\n tolerant: boolean,\n ) => Promise<RunResult>;\n}\n\nexport function useBackendRuntime(): BackendRuntime {\n const now = React.useCallback((): number => Date.now(), []);\n\n const toBackendError = React.useCallback(\n (e: unknown): BackendError => toBackendErrorBase(e),\n [],\n );\n\n const runTasks = React.useCallback(\n async (\n tasks: Array<() => Promise<unknown>>,\n tolerant: boolean,\n ): Promise<RunResult> => runTasksBase(tasks, tolerant),\n [],\n );\n\n return React.useMemo<BackendRuntime>(\n () => ({ now, toBackendError, runTasks }),\n [now, toBackendError, runTasks],\n );\n}\n","// src/react/workspace/context/provider/slices/use-authors-slice.ts\nimport * as React from \"react\";\nimport type {\n Author,\n BackendError,\n BackendResult,\n WorkspaceBackend,\n} from \"../../backend\";\nimport type { Loadable } from \"@/react/workspace\";\nimport type { BackendRuntime } from \"../runtime/use-backend-runtime\";\n\nexport interface AuthorsSliceApi {\n readonly authors: Loadable<readonly Author[]>;\n readonly refreshAuthors: () => Promise<BackendResult<readonly Author[]>>;\n readonly invalidateAuthors: () => void;\n}\n\nfunction setLoadableError<T>(\n updater: React.Dispatch<React.SetStateAction<Loadable<T>>>,\n error: BackendError,\n): void {\n updater((s) => ({ ...s, loading: false, error }));\n}\n\nexport interface UseAuthorsSliceParams {\n readonly backend: WorkspaceBackend;\n readonly workspaceId: string;\n readonly initialAuthors?: readonly Author[] | null;\n readonly runtime: BackendRuntime;\n}\n\nexport function useAuthorsSlice(\n params: UseAuthorsSliceParams,\n): AuthorsSliceApi {\n const { backend, workspaceId, initialAuthors, runtime } = params;\n\n const [authors, setAuthors] = React.useState<Loadable<readonly Author[]>>({\n data: initialAuthors ?? null,\n loading: false,\n updatedAt: initialAuthors ? runtime.now() : undefined,\n });\n\n const refreshAuthors = React.useCallback(async (): Promise<\n BackendResult<readonly Author[]>\n > => {\n setAuthors((s) => ({ ...s, loading: true }));\n const res = await backend.authors.refresh(workspaceId);\n\n if (res.ok) {\n setAuthors({\n data: res.value,\n loading: false,\n updatedAt: runtime.now(),\n });\n return res;\n } else {\n setLoadableError(setAuthors, res.error);\n return res;\n }\n }, [backend.authors, workspaceId, runtime]);\n\n const invalidateAuthors = React.useCallback((): void => {\n setAuthors((s) => ({ ...s, updatedAt: undefined }));\n }, []);\n\n return React.useMemo<AuthorsSliceApi>(\n () => ({ authors, refreshAuthors, invalidateAuthors }),\n [authors, refreshAuthors, invalidateAuthors],\n );\n}\n","// src/react/workspace/context/provider/slices/use-permissions-slice.ts\nimport * as React from \"react\";\nimport type {\n Actor,\n BackendError,\n BackendResult,\n PermissionsMap,\n WorkspaceBackend,\n} from \"../../backend\";\nimport type { Loadable } from \"@/react/workspace\";\nimport type { BackendRuntime } from \"../runtime/use-backend-runtime\";\n\nexport interface PermissionsSliceApi {\n readonly permissions: Loadable<PermissionsMap>;\n readonly refreshPermissions: () => Promise<BackendResult<PermissionsMap>>;\n readonly invalidatePermissions: () => void;\n}\n\nfunction setLoadableError<T>(\n updater: React.Dispatch<React.SetStateAction<Loadable<T>>>,\n error: BackendError,\n): void {\n updater((s) => ({ ...s, loading: false, error }));\n}\n\nexport interface UsePermissionsSliceParams {\n readonly backend: WorkspaceBackend;\n readonly workspaceId: string;\n readonly actor: Actor;\n readonly initialPermissions?: PermissionsMap | null;\n readonly runtime: BackendRuntime;\n}\n\nexport function usePermissionsSlice(\n params: UsePermissionsSliceParams,\n): PermissionsSliceApi {\n const { backend, workspaceId, actor, initialPermissions, runtime } = params;\n\n const [permissions, setPermissions] = React.useState<\n Loadable<PermissionsMap>\n >({\n data: initialPermissions ?? null,\n loading: false,\n updatedAt: initialPermissions ? runtime.now() : undefined,\n });\n\n const refreshPermissions = React.useCallback(async (): Promise<\n BackendResult<PermissionsMap>\n > => {\n setPermissions((s) => ({ ...s, loading: true }));\n const res = await backend.permissions.refresh(workspaceId, actor);\n\n if (res.ok) {\n setPermissions({\n data: res.value,\n loading: false,\n updatedAt: runtime.now(),\n });\n return res;\n } else {\n setLoadableError(setPermissions, res.error);\n return res;\n }\n }, [backend.permissions, workspaceId, actor, runtime]);\n\n const invalidatePermissions = React.useCallback((): void => {\n setPermissions((s) => ({ ...s, updatedAt: undefined }));\n }, []);\n\n return React.useMemo<PermissionsSliceApi>(\n () => ({ permissions, refreshPermissions, invalidatePermissions }),\n [permissions, refreshPermissions, invalidatePermissions],\n );\n}\n","// src/react/workspace/context/provider/slices/use-branches-slice.ts\nimport * as React from \"react\";\nimport type {\n BackendError,\n BackendResult,\n Branch,\n BranchParticipant,\n WorkspaceBackend,\n} from \"../../backend\";\nimport type { BranchesSlice, Loadable } from \"@/react/workspace\";\nimport type { BackendRuntime } from \"../runtime/use-backend-runtime\";\n\nexport interface BranchesSliceApi {\n readonly branches: BranchesSlice;\n readonly participants: Loadable<readonly BranchParticipant[]>;\n\n readonly setCurrentBranchId: (id: string) => void;\n\n readonly refreshBranches: () => Promise<BackendResult<readonly Branch[]>>;\n readonly refreshParticipants: (\n params?: Partial<{ branchId: string; since?: number | string }>,\n ) => Promise<BackendResult<readonly BranchParticipant[]>>;\n\n readonly invalidateBranches: () => void;\n readonly invalidateParticipants: () => void;\n\n /** internal setters for branch-cache composition */\n readonly __setParticipantsState: React.Dispatch<\n React.SetStateAction<Loadable<readonly BranchParticipant[]>>\n >;\n}\n\nfunction setLoadableError<T>(\n updater: React.Dispatch<React.SetStateAction<Loadable<T>>>,\n error: BackendError,\n): void {\n updater((s) => ({ ...s, loading: false, error }));\n}\n\nexport interface UseBranchesSliceParams {\n readonly backend: WorkspaceBackend;\n readonly workspaceId: string;\n\n readonly ensureMain: boolean;\n\n readonly initialBranches?: readonly Branch[];\n readonly initialMainId?: string;\n readonly initialCurrentId?: string;\n readonly initialParticipants?: readonly BranchParticipant[] | null;\n\n readonly runtime: BackendRuntime;\n}\n\nexport function useBranchesSlice(\n params: UseBranchesSliceParams,\n): BranchesSliceApi {\n const {\n backend,\n workspaceId,\n ensureMain,\n initialBranches,\n initialMainId,\n initialCurrentId,\n initialParticipants,\n runtime,\n } = params;\n\n const [branches, setBranches] = React.useState<BranchesSlice>({\n data: initialBranches ?? [],\n mainId: initialMainId,\n currentId: initialCurrentId ?? initialMainId,\n loading: false,\n updatedAt: initialBranches ? runtime.now() : undefined,\n });\n\n const [participants, setParticipants] = React.useState<\n Loadable<readonly BranchParticipant[]>\n >({\n data: initialParticipants ?? null,\n loading: false,\n updatedAt: initialParticipants ? runtime.now() : undefined,\n });\n\n // Ensure main branch pointer is stable (same behavior as old provider)\n React.useEffect((): void => {\n if (!ensureMain) return;\n if (branches.data.length === 0) return;\n\n const existingMain: string | undefined = branches.data.find(\n (b) => b.isMain,\n )?.id;\n\n if (existingMain && branches.mainId !== existingMain) {\n setBranches((s) => ({\n ...s,\n mainId: existingMain,\n currentId: s.currentId ?? existingMain,\n }));\n return;\n }\n\n if (!existingMain) {\n const first: string | undefined = branches.data[0]?.id;\n if (first && !branches.currentId) {\n setBranches((s) => ({ ...s, currentId: first }));\n }\n }\n }, [branches.data, branches.mainId, branches.currentId, ensureMain]);\n\n const setCurrentBranchId = React.useCallback((id: string): void => {\n setBranches((s) => ({ ...s, currentId: id }));\n }, []);\n\n const refreshBranches = React.useCallback(async (): Promise<\n BackendResult<readonly Branch[]>\n > => {\n setBranches((s) => ({ ...s, loading: true }));\n const res = await backend.branches.refresh(workspaceId);\n\n if (!res.ok) {\n setBranches((s) => ({ ...s, loading: false, error: res.error }));\n return res;\n }\n\n const data: readonly Branch[] = res.value;\n const main: string | undefined = data.find((b) => b.isMain)?.id;\n\n setBranches((s) => {\n const currentStillExists: boolean =\n Boolean(s.currentId) && data.some((b) => b.id === s.currentId);\n\n const nextCurrent: string | undefined = currentStillExists\n ? s.currentId\n : (main ?? data[0]?.id);\n\n return {\n data,\n mainId: main ?? s.mainId,\n currentId: nextCurrent,\n loading: false,\n updatedAt: runtime.now(),\n };\n });\n return res;\n }, [backend.branches, workspaceId, runtime]);\n\n const refreshParticipants = React.useCallback(\n async (\n params?: Partial<{ branchId: string; since?: number | string }>,\n ): Promise<BackendResult<readonly BranchParticipant[]>> => {\n const branchId: string | undefined =\n params?.branchId ?? branches.currentId;\n if (!branchId) {\n return {\n ok: false,\n error: {\n code: \"no_branch\",\n message: \"No current branch to load participants for.\",\n },\n };\n }\n\n setParticipants((s) => ({ ...s, loading: true }));\n\n const res = await backend.access.refreshParticipants(\n workspaceId,\n branchId,\n { since: params?.since ?? participants.updatedAt },\n );\n\n if (res.ok) {\n setParticipants({\n data: res.value,\n loading: false,\n updatedAt: runtime.now(),\n });\n return res;\n } else {\n setLoadableError(setParticipants, res.error);\n return res;\n }\n },\n [\n backend.access,\n workspaceId,\n branches.currentId,\n participants.updatedAt,\n runtime,\n ],\n );\n\n const invalidateBranches = React.useCallback((): void => {\n setBranches((s) => ({ ...s, updatedAt: undefined }));\n }, []);\n\n const invalidateParticipants = React.useCallback((): void => {\n setParticipants((s) => ({ ...s, updatedAt: undefined }));\n }, []);\n\n return React.useMemo<BranchesSliceApi>(\n () => ({\n branches,\n participants,\n setCurrentBranchId,\n refreshBranches,\n refreshParticipants,\n invalidateBranches,\n invalidateParticipants,\n __setParticipantsState: setParticipants,\n }),\n [\n branches,\n participants,\n setCurrentBranchId,\n refreshBranches,\n refreshParticipants,\n invalidateBranches,\n invalidateParticipants,\n ],\n );\n}\n","// src/react/workspace/context/provider/slices/use-templates-slice.ts\nimport * as React from \"react\";\nimport type {\n BackendError,\n BackendResult,\n FieldTemplate,\n TemplateCreateInput,\n TemplateUpdatePatch,\n TemplatesListParams,\n WorkspaceBackend,\n} from \"../../backend\";\nimport type { Loadable, WorkspaceAPI } from \"@/react/workspace\";\nimport type { BackendRuntime } from \"../runtime/use-backend-runtime\";\n\nexport interface TemplatesSliceApi {\n readonly templates: Loadable<readonly FieldTemplate[]>;\n\n readonly refreshTemplates: (\n params?: Partial<Pick<TemplatesListParams, \"branchId\" | \"since\">>,\n ) => Promise<BackendResult<readonly FieldTemplate[]>>;\n\n readonly createTemplate: WorkspaceAPI[\"createTemplate\"];\n readonly updateTemplate: WorkspaceAPI[\"updateTemplate\"];\n readonly cloneTemplate: WorkspaceAPI[\"cloneTemplate\"];\n readonly publishTemplate: WorkspaceAPI[\"publishTemplate\"];\n readonly unpublishTemplate: WorkspaceAPI[\"unpublishTemplate\"];\n readonly deleteTemplate: WorkspaceAPI[\"deleteTemplate\"];\n\n readonly invalidateTemplates: () => void;\n\n /** internal setters for branch-cache composition */\n readonly __setTemplatesState: React.Dispatch<\n React.SetStateAction<Loadable<readonly FieldTemplate[]>>\n >;\n\n readonly resetTemplatesForBranch: () => void;\n}\n\nfunction setLoadableError<T>(\n updater: React.Dispatch<React.SetStateAction<Loadable<T>>>,\n error: BackendError,\n): void {\n updater((s) => ({ ...s, loading: false, error }));\n}\n\nexport interface UseTemplatesSliceParams {\n readonly backend: WorkspaceBackend;\n readonly workspaceId: string;\n\n readonly getCurrentBranchId: () => string | undefined;\n\n readonly initialTemplates?: readonly FieldTemplate[] | null;\n\n readonly runtime: BackendRuntime;\n}\n\nexport function useTemplatesSlice(\n params: UseTemplatesSliceParams,\n): TemplatesSliceApi {\n const {\n backend,\n workspaceId,\n getCurrentBranchId,\n initialTemplates,\n runtime,\n } = params;\n\n const [templates, setTemplates] = React.useState<\n Loadable<readonly FieldTemplate[]>\n >({\n data: initialTemplates ?? null,\n loading: false,\n updatedAt: initialTemplates ? runtime.now() : undefined,\n });\n\n const refreshTemplates = React.useCallback(\n async (\n params?: Partial<Pick<TemplatesListParams, \"branchId\" | \"since\">>,\n ): Promise<BackendResult<readonly FieldTemplate[]>> => {\n const branchId: string | undefined =\n params?.branchId ?? getCurrentBranchId();\n if (!branchId) {\n return {\n ok: false,\n error: {\n code: \"no_branch\",\n message: \"No current branch to load templates for.\",\n },\n };\n }\n\n setTemplates((s) => ({ ...s, loading: true }));\n\n const res = await backend.templates.refresh({\n workspaceId,\n branchId,\n since: params?.since ?? templates.updatedAt,\n });\n\n if (res.ok) {\n setTemplates({\n data: res.value,\n loading: false,\n updatedAt: runtime.now(),\n });\n return res;\n } else {\n setLoadableError(setTemplates, res.error);\n return res;\n }\n },\n [\n backend.templates,\n workspaceId,\n getCurrentBranchId,\n templates.updatedAt,\n runtime,\n ],\n );\n\n const createTemplate = React.useCallback<WorkspaceAPI[\"createTemplate\"]>(\n async (input: TemplateCreateInput) => {\n const res = await backend.templates.create(workspaceId, {\n ...input,\n branchId: input.branchId ?? getCurrentBranchId(),\n });\n\n if (res.ok) {\n await refreshTemplates({\n branchId: res.value.branchId ?? getCurrentBranchId(),\n });\n }\n\n return res;\n },\n [backend.templates, workspaceId, getCurrentBranchId, refreshTemplates],\n );\n\n const updateTemplate = React.useCallback<WorkspaceAPI[\"updateTemplate\"]>(\n async (id: string, patch: TemplateUpdatePatch) => {\n const res = await backend.templates.update(id, patch);\n\n if (res.ok) {\n await refreshTemplates({\n branchId: res.value.branchId ?? getCurrentBranchId(),\n });\n }\n\n return res;\n },\n [backend.templates, getCurrentBranchId, refreshTemplates],\n );\n\n const cloneTemplate = React.useCallback<WorkspaceAPI[\"cloneTemplate\"]>(\n async (source, opts) => {\n const res = await backend.templates.clone(\n source,\n opts ?? { branchId: getCurrentBranchId() ?? undefined },\n );\n\n if (res.ok) {\n await refreshTemplates({\n branchId: res.value.branchId ?? getCurrentBranchId(),\n });\n }\n\n return res;\n },\n [backend.templates, getCurrentBranchId, refreshTemplates],\n );\n\n const publishTemplate = React.useCallback<WorkspaceAPI[\"publishTemplate\"]>(\n async (id: string) => {\n const res = await backend.templates.publish(id);\n if (res.ok) {\n await refreshTemplates({ branchId: getCurrentBranchId() });\n }\n return res;\n },\n [backend.templates, getCurrentBranchId, refreshTemplates],\n );\n\n const unpublishTemplate = React.useCallback<\n WorkspaceAPI[\"unpublishTemplate\"]\n >(\n async (id: string) => {\n const res = await backend.templates.unpublish(id);\n if (res.ok) {\n await refreshTemplates({ branchId: getCurrentBranchId() });\n }\n return res;\n },\n [backend.templates, getCurrentBranchId, refreshTemplates],\n );\n\n const deleteTemplate = React.useCallback<WorkspaceAPI[\"deleteTemplate\"]>(\n async (id: string) => {\n const res = await backend.templates.delete(id);\n if (res.ok) {\n await refreshTemplates({ branchId: getCurrentBranchId() });\n }\n return res;\n },\n [backend.templates, getCurrentBranchId, refreshTemplates],\n );\n\n const invalidateTemplates = React.useCallback((): void => {\n setTemplates((s) => ({ ...s, updatedAt: undefined }));\n }, []);\n\n const resetTemplatesForBranch = React.useCallback((): void => {\n setTemplates((s) => ({ ...s, data: null, error: undefined }));\n }, []);\n\n return React.useMemo<TemplatesSliceApi>(\n () => ({\n templates,\n refreshTemplates,\n createTemplate,\n updateTemplate,\n cloneTemplate,\n publishTemplate,\n unpublishTemplate,\n deleteTemplate,\n invalidateTemplates,\n __setTemplatesState: setTemplates,\n resetTemplatesForBranch,\n }),\n [\n templates,\n refreshTemplates,\n createTemplate,\n updateTemplate,\n cloneTemplate,\n publishTemplate,\n unpublishTemplate,\n deleteTemplate,\n invalidateTemplates,\n resetTemplatesForBranch,\n ],\n );\n}\n","// src/react/workspace/context/provider/slices/use-services-slice.ts\nimport * as React from \"react\";\nimport type {\n BackendError,\n BackendResult,\n WorkspaceBackend,\n} from \"../../backend\";\nimport type { DgpServiceMap } from \"@/schema\";\nimport type { Loadable } from \"@/react/workspace\";\nimport type { BackendRuntime } from \"../runtime/use-backend-runtime\";\nimport { toServiceMap } from \"../helpers\";\n\nexport interface ServicesSliceApi {\n readonly services: Loadable<DgpServiceMap>;\n readonly refreshServices: () => Promise<BackendResult<DgpServiceMap>>;\n readonly invalidateServices: () => void;\n}\n\nfunction setLoadableError<T>(\n updater: React.Dispatch<React.SetStateAction<Loadable<T>>>,\n error: BackendError,\n): void {\n updater((s) => ({ ...s, loading: false, error }));\n}\n\nexport interface UseServicesSliceParams {\n readonly backend: WorkspaceBackend;\n readonly workspaceId: string;\n readonly initialServices?: DgpServiceMap | null;\n readonly runtime: BackendRuntime;\n}\n\nexport function useServicesSlice(\n params: UseServicesSliceParams,\n): ServicesSliceApi {\n const { backend, workspaceId, initialServices, runtime } = params;\n\n const [services, setServices] = React.useState<Loadable<DgpServiceMap>>({\n data: initialServices ?? null,\n loading: false,\n updatedAt: initialServices ? runtime.now() : undefined,\n });\n\n const refreshServices = React.useCallback(async (): Promise<\n BackendResult<DgpServiceMap>\n > => {\n setServices((s) => ({ ...s, loading: true }));\n\n const res = await backend.services.refresh(workspaceId, {\n since: services.updatedAt,\n });\n\n if (!res.ok) {\n setLoadableError(setServices, res.error);\n return res;\n }\n\n const map: DgpServiceMap | null = toServiceMap(res.value);\n setServices({\n data: map ?? ({} as DgpServiceMap),\n loading: false,\n updatedAt: runtime.now(),\n });\n return { ok: true, value: map ?? ({} as DgpServiceMap) };\n }, [backend.services, workspaceId, services.updatedAt, runtime]);\n\n const invalidateServices = React.useCallback((): void => {\n setServices((s) => ({ ...s, updatedAt: undefined }));\n }, []);\n\n return React.useMemo<ServicesSliceApi>(\n () => ({ services, refreshServices, invalidateServices }),\n [services, refreshServices, invalidateServices],\n );\n}\n","// src/react/workspace/context/provider/slices/use-snapshots-slice.ts\nimport * as React from \"react\";\nimport type {\n Actor,\n BackendError,\n BackendResult,\n Commit,\n Draft,\n Result,\n SnapshotsLoadResult,\n WorkspaceBackend,\n} from \"../../backend\";\nimport type { EditorSnapshot } from \"@/schema\";\nimport type { SnapshotSlice, WorkspaceAPI } from \"@/react/workspace\";\nimport type { BackendRuntime } from \"../runtime/use-backend-runtime\";\n\nexport interface SnapshotsSliceApi {\n readonly snapshot: SnapshotSlice;\n\n readonly loadSnapshotForBranch: (\n branchId: string,\n params?: Readonly<{ versionId?: string }>,\n ) => Result<SnapshotsLoadResult>;\n\n readonly loadSnapshot: WorkspaceAPI[\"snapshot\"][\"load\"];\n readonly refreshSnapshotPointersForBranch: (\n branchId: string,\n ) => Promise<BackendResult<Readonly<{ head?: Commit; draft?: Draft }>>>;\n readonly refreshSnapshotPointers: () => Promise<\n BackendResult<Readonly<{ head?: Commit; draft?: Draft }>>\n >;\n\n readonly setSnapshotData: WorkspaceAPI[\"snapshot\"][\"set\"];\n readonly autosave: WorkspaceAPI[\"snapshot\"][\"autosave\"];\n readonly save: WorkspaceAPI[\"snapshot\"][\"save\"];\n readonly publish: WorkspaceAPI[\"snapshot\"][\"publish\"];\n readonly discardDraft: WorkspaceAPI[\"snapshot\"][\"discardDraft\"];\n\n /** internal setters for branch-cache composition */\n readonly __setSnapshotState: React.Dispatch<\n React.SetStateAction<SnapshotSlice>\n >;\n\n readonly resetSnapshotForBranch: () => void;\n}\n\nfunction setSnapshotError(error: BackendError): {\n ok: false;\n error: BackendError;\n} {\n return { ok: false, error };\n}\n\nfunction hasSnapshotProps(data: unknown): data is EditorSnapshot {\n if (!data || typeof data !== \"object\") return false;\n const props = (data as { props?: unknown }).props;\n return Boolean(props && typeof props === \"object\");\n}\n\nfunction hasUsableSnapshotPayload(input: {\n schemaVersion?: string;\n data?: unknown;\n}): boolean {\n return (\n typeof input.schemaVersion === \"string\" &&\n input.schemaVersion.length > 0 &&\n hasSnapshotProps(input.data)\n );\n}\n\nfunction createClearedSnapshotState(): SnapshotSlice {\n return {\n schemaVersion: undefined,\n data: undefined,\n head: undefined,\n draft: undefined,\n state: \"clean\",\n saving: false,\n dirty: false,\n lastSavedAt: undefined,\n lastDraftAt: undefined,\n };\n}\n\nfunction normalizeSnapshotState(input: {\n schemaVersion?: string;\n data?: unknown;\n head?: Commit;\n draft?: Draft;\n state?: SnapshotSlice[\"state\"];\n saving?: boolean;\n dirty?: boolean;\n lastSavedAt?: number;\n lastDraftAt?: number;\n}): SnapshotSlice {\n if (!hasUsableSnapshotPayload(input)) {\n return createClearedSnapshotState();\n }\n\n return {\n schemaVersion: input.schemaVersion,\n data: input.data as EditorSnapshot,\n head: input.head,\n draft: input.draft,\n state: input.state ?? (input.draft ? \"uncommitted\" : \"clean\"),\n saving: input.saving ?? false,\n dirty: input.dirty ?? false,\n lastSavedAt: input.lastSavedAt,\n lastDraftAt: input.lastDraftAt,\n };\n}\n\nexport interface UseSnapshotsSliceParams {\n readonly backend: WorkspaceBackend;\n readonly workspaceId: string;\n readonly actor: Actor;\n\n readonly getCurrentBranchId: () => string | undefined;\n\n readonly initialSnapshot?: {\n schema_version: string;\n data: EditorSnapshot;\n } | null;\n readonly initialHead?: Commit;\n readonly initialDraft?: Draft;\n\n readonly autosaveMs: number;\n readonly autoAutosave: boolean;\n\n readonly runtime: BackendRuntime;\n}\n\nexport function useSnapshotsSlice(\n params: UseSnapshotsSliceParams,\n): SnapshotsSliceApi {\n const {\n backend,\n workspaceId,\n actor,\n getCurrentBranchId,\n initialSnapshot,\n initialHead,\n initialDraft,\n autosaveMs,\n autoAutosave,\n runtime,\n } = params;\n\n const [snapshot, setSnapshot] = React.useState<SnapshotSlice>(() =>\n normalizeSnapshotState({\n schemaVersion: initialSnapshot?.schema_version,\n data: initialSnapshot?.data,\n head: initialHead,\n draft: initialDraft,\n state: initialDraft ? \"uncommitted\" : \"clean\",\n saving: false,\n dirty: false,\n }),\n );\n\n const autosaveTimerRef = React.useRef<number | null>(null);\n\n const loadSnapshotForBranch = React.useCallback(\n async (\n branchId: string,\n params?: Readonly<{ versionId?: string }>,\n ): Result<SnapshotsLoadResult> => {\n const res = await backend.snapshots.load({\n workspaceId,\n branchId,\n actorId: actor.id,\n versionId: params?.versionId,\n });\n\n if (res.ok) {\n const { head, draft, snapshot: snap } = res.value;\n setSnapshot(\n normalizeSnapshotState({\n schemaVersion: snap.schema_version,\n data: snap.data,\n head,\n draft,\n state: draft ? \"uncommitted\" : \"clean\",\n saving: false,\n dirty: false,\n lastSavedAt: undefined,\n lastDraftAt: undefined,\n }),\n );\n }\n\n return res;\n },\n [backend.snapshots, workspaceId, actor.id],\n );\n\n const loadSnapshot = React.useCallback<WorkspaceAPI[\"snapshot\"][\"load\"]>(\n async (params?: Readonly<{ versionId?: string }>) => {\n const branchId = getCurrentBranchId();\n if (!branchId) {\n return setSnapshotError({\n code: \"no_branch\",\n message: \"No current branch to load snapshot from.\",\n }) as unknown as Result<SnapshotsLoadResult>;\n }\n return loadSnapshotForBranch(branchId, params);\n },\n [getCurrentBranchId, loadSnapshotForBranch],\n );\n\n const setSnapshotData = React.useCallback<WorkspaceAPI[\"snapshot\"][\"set\"]>(\n (\n updater: (curr: EditorSnapshot | undefined) => EditorSnapshot,\n ): void => {\n setSnapshot((s) => ({\n ...s,\n data: updater(s.data),\n state: s.draft ? \"uncommitted\" : \"dirty\",\n dirty: true,\n }));\n },\n [],\n );\n\n const refreshSnapshotPointersForBranch = React.useCallback(\n async (\n branchId: string,\n ): Promise<\n BackendResult<Readonly<{ head?: Commit; draft?: Draft }>>\n > => {\n const res = await backend.snapshots.refresh({\n workspaceId,\n branchId,\n actorId: actor.id,\n since: snapshot.lastSavedAt ?? snapshot.lastDraftAt,\n });\n\n if (!res.ok) return res;\n\n setSnapshot((s) => ({\n ...s,\n head: res.value.head ?? s.head,\n draft: res.value.draft,\n state: res.value.draft\n ? \"uncommitted\"\n : s.dirty\n ? \"dirty\"\n : \"clean\",\n }));\n return res;\n },\n [\n backend.snapshots,\n workspaceId,\n actor.id,\n snapshot.lastSavedAt,\n snapshot.lastDraftAt,\n ],\n );\n\n const refreshSnapshotPointers = React.useCallback(async (): Promise<\n BackendResult<Readonly<{ head?: Commit; draft?: Draft }>>\n > => {\n const branchId = getCurrentBranchId();\n if (!branchId) {\n return {\n ok: false,\n error: {\n code: \"no_branch\",\n message:\n \"No current branch to refresh snapshot pointers for.\",\n },\n };\n }\n return refreshSnapshotPointersForBranch(branchId);\n }, [getCurrentBranchId, refreshSnapshotPointersForBranch]);\n\n const autosave = React.useCallback<\n WorkspaceAPI[\"snapshot\"][\"autosave\"]\n >(async () => {\n const branchId = getCurrentBranchId();\n if (!branchId) {\n return setSnapshotError({\n code: \"no_branch\",\n message: \"No current branch to autosave.\",\n }) as any;\n }\n\n if (!hasUsableSnapshotPayload(snapshot)) {\n return setSnapshotError({\n code: \"no_snapshot\",\n message: \"Nothing to autosave.\",\n }) as any;\n }\n const schemaVersion = snapshot.schemaVersion as string;\n const data = snapshot.data as EditorSnapshot;\n\n const res = await backend.snapshots.autosave({\n workspaceId,\n branchId,\n actorId: actor.id,\n snapshot: {\n schema_version: schemaVersion,\n data,\n },\n etag: snapshot.draft?.etag,\n });\n\n if (res.ok) {\n setSnapshot((s) => ({\n ...s,\n draft: res.value.draft,\n state: \"uncommitted\",\n dirty: false,\n lastDraftAt: runtime.now(),\n }));\n }\n\n return res;\n }, [\n backend.snapshots,\n workspaceId,\n actor.id,\n getCurrentBranchId,\n snapshot.data,\n snapshot.schemaVersion,\n snapshot.draft?.etag,\n runtime,\n ]);\n\n const save = React.useCallback<WorkspaceAPI[\"snapshot\"][\"save\"]>(\n async (message?: string) => {\n const branchId = getCurrentBranchId();\n if (!branchId) {\n return setSnapshotError({\n code: \"no_branch\",\n message: \"No current branch to save.\",\n }) as any;\n }\n\n if (!hasUsableSnapshotPayload(snapshot)) {\n return setSnapshotError({\n code: \"no_snapshot\",\n message: \"Nothing to save.\",\n }) as any;\n }\n const schemaVersion = snapshot.schemaVersion as string;\n const data = snapshot.data as EditorSnapshot;\n\n setSnapshot((s) => ({ ...s, state: \"saving\", saving: true }));\n\n const res = await backend.snapshots.save({\n workspaceId,\n branchId,\n actorId: actor.id,\n snapshot: {\n schema_version: schemaVersion,\n data,\n },\n message,\n draftId: snapshot.draft?.id,\n etag: snapshot.draft?.id\n ? snapshot.draft?.etag\n : snapshot.head?.etag,\n });\n\n if (res.ok) {\n const commit = res.value.commit;\n setSnapshot((s) => ({\n ...s,\n head: commit,\n draft: undefined,\n state: \"clean\",\n saving: false,\n dirty: false,\n lastSavedAt: runtime.now(),\n }));\n } else {\n setSnapshot((s) => ({\n ...s,\n state: s.draft ? \"uncommitted\" : \"dirty\",\n saving: false,\n }));\n }\n\n return res;\n },\n [\n backend.snapshots,\n workspaceId,\n actor.id,\n getCurrentBranchId,\n snapshot.data,\n snapshot.schemaVersion,\n snapshot.draft?.id,\n snapshot.head?.etag,\n runtime,\n ],\n );\n\n const publish = React.useCallback<WorkspaceAPI[\"snapshot\"][\"publish\"]>(\n async (message?: string) => {\n const draftId = snapshot.draft?.id;\n if (!draftId) return save(message);\n\n const res = await backend.snapshots.publish({\n workspaceId,\n actorId: actor.id,\n draftId,\n message,\n });\n\n if (res.ok) {\n const commit = res.value.commit;\n setSnapshot((s) => ({\n ...s,\n head: commit,\n draft: undefined,\n state: \"clean\",\n saving: false,\n dirty: false,\n lastSavedAt: runtime.now(),\n }));\n }\n\n return res;\n },\n [\n backend.snapshots,\n workspaceId,\n actor.id,\n snapshot.draft?.id,\n save,\n runtime,\n ],\n );\n\n const discardDraft = React.useCallback<\n WorkspaceAPI[\"snapshot\"][\"discardDraft\"]\n >(async () => {\n const draftId = snapshot.draft?.id;\n if (!draftId) return { ok: true, value: undefined } as const;\n\n const res = await backend.snapshots.discard({\n workspaceId,\n actorId: actor.id,\n draftId,\n });\n\n if (res.ok) {\n setSnapshot((s) => ({\n ...s,\n draft: undefined,\n state: s.dirty ? \"dirty\" : \"clean\",\n }));\n }\n\n return res;\n }, [backend.snapshots, workspaceId, actor.id, snapshot.draft?.id]);\n\n // Autosave effect (same behavior as old provider)\n React.useEffect((): (() => void) | void => {\n if (!autoAutosave || !snapshot.dirty) return;\n\n if (autosaveTimerRef.current) {\n window.clearTimeout(autosaveTimerRef.current);\n autosaveTimerRef.current = null;\n }\n\n autosaveTimerRef.current = window.setTimeout(() => {\n void autosave();\n autosaveTimerRef.current = null;\n }, autosaveMs) as unknown as number;\n\n return (): void => {\n if (autosaveTimerRef.current) {\n window.clearTimeout(autosaveTimerRef.current);\n autosaveTimerRef.current = null;\n }\n };\n }, [snapshot.dirty, autosaveMs, autoAutosave, autosave]);\n\n const resetSnapshotForBranch = React.useCallback((): void => {\n setSnapshot(createClearedSnapshotState());\n }, []);\n\n const setSnapshotStateSafe = React.useCallback<\n React.Dispatch<React.SetStateAction<SnapshotSlice>>\n >((updater) => {\n setSnapshot((current) => {\n const next =\n typeof updater === \"function\"\n ? (updater as (prev: SnapshotSlice) => SnapshotSlice)(\n current,\n )\n : updater;\n\n return normalizeSnapshotState({\n schemaVersion: next.schemaVersion,\n data: next.data,\n head: next.head,\n draft: next.draft,\n state: next.state,\n saving: next.saving,\n dirty: next.dirty,\n lastSavedAt: next.lastSavedAt,\n lastDraftAt: next.lastDraftAt,\n });\n });\n }, []);\n\n return React.useMemo<SnapshotsSliceApi>(\n () => ({\n snapshot,\n loadSnapshotForBranch,\n loadSnapshot,\n refreshSnapshotPointersForBranch,\n refreshSnapshotPointers,\n setSnapshotData,\n autosave,\n save,\n publish,\n discardDraft,\n __setSnapshotState: setSnapshotStateSafe,\n resetSnapshotForBranch,\n }),\n [\n snapshot,\n loadSnapshotForBranch,\n loadSnapshot,\n refreshSnapshotPointersForBranch,\n refreshSnapshotPointers,\n setSnapshotData,\n autosave,\n save,\n publish,\n discardDraft,\n resetSnapshotForBranch,\n setSnapshotStateSafe,\n ],\n );\n}\n","// src/react/workspace/context/provider/slices/use-comments-slice.ts\n\nimport * as React from \"react\";\n\nimport type {\n BackendError,\n BackendResult,\n BackendScope,\n Result,\n WorkspaceBackend,\n} from \"../../backend\";\nimport type { Loadable } from \"@/react/workspace\";\n\nimport type {\n CommentAnchor,\n CommentMessage,\n CommentThread,\n} from \"@/schema/comments\";\n\nexport interface CommentsSliceApi {\n readonly threads: Loadable<readonly CommentThread[]>;\n\n readonly refreshThreads: (\n params?: Readonly<{ branchId?: string }>,\n ) => Promise<BackendResult<readonly CommentThread[]>>;\n\n readonly createThread: (\n input: Readonly<{\n anchor?: CommentAnchor;\n body: string;\n meta?: Readonly<Record<string, unknown>>;\n branchId?: string;\n }>,\n ) => Result<CommentThread>;\n\n readonly addMessage: (\n input: Readonly<{\n threadId: string;\n body: string;\n meta?: Readonly<Record<string, unknown>>;\n branchId?: string;\n }>,\n ) => Result<CommentMessage>;\n\n readonly editMessage: (\n input: Readonly<{\n threadId: string;\n messageId: string;\n body: string;\n branchId?: string;\n }>,\n ) => Result<CommentMessage>;\n\n readonly deleteMessage: (\n input: Readonly<{\n threadId: string;\n messageId: string;\n branchId?: string;\n }>,\n ) => Result<void>;\n\n readonly moveThread: (\n input: Readonly<{\n threadId: string;\n anchor: CommentAnchor;\n branchId?: string;\n }>,\n ) => Result<CommentThread>;\n\n readonly resolveThread: (\n input: Readonly<{\n threadId: string;\n resolved: boolean;\n branchId?: string;\n }>,\n ) => Result<CommentThread>;\n\n readonly deleteThread: (\n input: Readonly<{\n threadId: string;\n branchId?: string;\n }>,\n ) => Result<void>;\n}\n\nexport interface UseCommentsSliceParams {\n readonly actorId: string;\n readonly workspaceId: string;\n\n /** backend.comments */\n readonly backend: WorkspaceBackend[\"comments\"];\n\n /** Current branch resolver (provider owns currentId) */\n readonly getCurrentBranchId: () => string | undefined;\n\n /** Optional initial preload */\n readonly initialThreads?: readonly CommentThread[] | null;\n}\n\nfunction missingScopeError<T>(): Result<T> {\n return Promise.resolve({\n ok: false,\n error: {\n code: \"missing_scope\",\n message:\n \"Workspace comments require workspaceId, actorId, and branchId.\",\n },\n });\n}\n\nfunction setLoadableError<T>(\n set: React.Dispatch<React.SetStateAction<Loadable<T>>>,\n err: BackendError,\n): void {\n set((s: Loadable<T>) => ({ ...s, loading: false, error: err }));\n}\n\nexport function useCommentsSlice(\n params: UseCommentsSliceParams,\n): CommentsSliceApi {\n const {\n backend,\n workspaceId,\n actorId,\n getCurrentBranchId,\n initialThreads,\n } = params;\n\n const now = (): number => Date.now();\n\n const [threads, setThreads] = React.useState<\n Loadable<readonly CommentThread[]>\n >({\n data: initialThreads ?? null,\n loading: false,\n updatedAt: initialThreads ? now() : undefined,\n });\n\n const resolveScope = React.useCallback(\n (branchId?: string): BackendScope | null => {\n const bid: string | undefined = branchId ?? getCurrentBranchId();\n if (!workspaceId || !actorId || !bid) return null;\n return { workspaceId, actorId, branchId: bid };\n },\n [workspaceId, actorId, getCurrentBranchId],\n );\n\n const refreshThreads = React.useCallback(\n async (\n p?: Readonly<{ branchId?: string }>,\n ): Promise<BackendResult<readonly CommentThread[]>> => {\n const scope: BackendScope | null = resolveScope(p?.branchId);\n if (!scope) {\n return {\n ok: false,\n error: {\n code: \"missing_scope\",\n message:\n \"Workspace comments require workspaceId, actorId, and branchId.\",\n },\n };\n }\n\n setThreads((s) => ({ ...s, loading: true }));\n const res = await backend.listThreads(scope);\n\n if (res.ok) {\n setThreads({\n data: res.value as readonly CommentThread[],\n loading: false,\n updatedAt: now(),\n });\n return res as BackendResult<readonly CommentThread[]>;\n } else {\n setLoadableError(setThreads, res.error);\n return res as BackendResult<readonly CommentThread[]>;\n }\n },\n [backend, resolveScope],\n );\n\n const createThread = React.useCallback(\n async (\n input: Readonly<{\n anchor?: CommentAnchor;\n body: string;\n meta?: Readonly<Record<string, unknown>>;\n branchId?: string;\n }>,\n ): Result<CommentThread> => {\n const scope: BackendScope | null = resolveScope(input.branchId);\n if (!scope) return missingScopeError<CommentThread>();\n\n const res = await backend.createThread(scope, {\n anchor: input.anchor,\n body: input.body,\n meta: input.meta ? { ...input.meta } : undefined,\n });\n\n if (res.ok) {\n setThreads((s) => {\n const prev: readonly CommentThread[] = s.data ?? [];\n return {\n ...s,\n data: [res.value as CommentThread, ...prev],\n loading: false,\n updatedAt: now(),\n };\n });\n }\n\n return res as unknown as Result<CommentThread>;\n },\n [backend, resolveScope],\n );\n\n const addMessage = React.useCallback(\n async (\n input: Readonly<{\n threadId: string;\n body: string;\n meta?: Readonly<Record<string, unknown>>;\n branchId?: string;\n }>,\n ): Result<CommentMessage> => {\n const scope: BackendScope | null = resolveScope(input.branchId);\n if (!scope) return missingScopeError<CommentMessage>();\n\n const res = await backend.addMessage(scope, {\n threadId: input.threadId,\n body: input.body,\n meta: input.meta ? { ...input.meta } : undefined,\n });\n\n if (res.ok) {\n const msg: CommentMessage = res.value as CommentMessage;\n\n setThreads((s) => {\n if (!s.data) return s;\n\n const next: readonly CommentThread[] = s.data.map((t) => {\n if (t.id !== input.threadId) return t;\n const msgs: readonly CommentMessage[] = (t.messages ??\n []) as readonly CommentMessage[];\n return { ...t, messages: [...msgs, msg] };\n });\n\n return { ...s, data: next, updatedAt: now() };\n });\n }\n\n return res as unknown as Result<CommentMessage>;\n },\n [backend, resolveScope],\n );\n\n const editMessage = React.useCallback(\n async (\n input: Readonly<{\n threadId: string;\n messageId: string;\n body: string;\n branchId?: string;\n }>,\n ): Result<CommentMessage> => {\n const scope: BackendScope | null = resolveScope(input.branchId);\n if (!scope) return missingScopeError<CommentMessage>();\n\n const res = await backend.editMessage(scope, {\n threadId: input.threadId,\n messageId: input.messageId,\n body: input.body,\n });\n\n if (res.ok) {\n const msg: CommentMessage = res.value as CommentMessage;\n\n setThreads((s) => {\n if (!s.data) return s;\n const next: readonly CommentThread[] = s.data.map((t) => {\n if (t.id !== input.threadId) return t;\n const msgs: readonly CommentMessage[] = (t.messages ??\n []) as readonly CommentMessage[];\n const updated: readonly CommentMessage[] = msgs.map(\n (m) => (m.id === input.messageId ? msg : m),\n );\n return { ...t, messages: updated } as CommentThread;\n });\n\n return { ...s, data: next, updatedAt: now() };\n });\n }\n\n return res as unknown as Result<CommentMessage>;\n },\n [backend, resolveScope],\n );\n\n const deleteMessage = React.useCallback(\n async (\n input: Readonly<{\n threadId: string;\n messageId: string;\n branchId?: string;\n }>,\n ): Result<void> => {\n const scope: BackendScope | null = resolveScope(input.branchId);\n if (!scope) return missingScopeError<void>();\n\n const res = await backend.deleteMessage(scope, {\n threadId: input.threadId,\n messageId: input.messageId,\n });\n\n if (res.ok) {\n setThreads((s) => {\n if (!s.data) return s;\n\n const next: readonly CommentThread[] = s.data.map((t) => {\n if (t.id !== input.threadId) return t;\n const msgs: readonly CommentMessage[] = (t.messages ??\n []) as readonly CommentMessage[];\n return {\n ...t,\n messages: msgs.filter(\n (m) => m.id !== input.messageId,\n ),\n };\n });\n\n return { ...s, data: next, updatedAt: now() };\n });\n }\n\n return res as unknown as Result<void>;\n },\n [backend, resolveScope],\n );\n\n const updateThread = React.useCallback((thread: CommentThread) => {\n setThreads((s) => {\n if (!s.data) return s;\n return {\n ...s,\n data: s.data.map((t) => (t.id === thread.id ? thread : t)),\n updatedAt: now(),\n };\n });\n }, []);\n\n const moveThread = React.useCallback(\n async (\n input: Readonly<{\n threadId: string;\n anchor: CommentAnchor;\n branchId?: string;\n }>,\n ): Result<CommentThread> => {\n const scope: BackendScope | null = resolveScope(input.branchId);\n if (!scope) return missingScopeError<CommentThread>();\n\n const res = await backend.moveThread(scope, {\n threadId: input.threadId,\n anchor: input.anchor,\n });\n\n if (res.ok) {\n updateThread(res.value as CommentThread);\n }\n\n return res as unknown as Result<CommentThread>;\n },\n [backend, resolveScope, updateThread],\n );\n\n const resolveThread = React.useCallback(\n async (\n input: Readonly<{\n threadId: string;\n resolved: boolean;\n branchId?: string;\n }>,\n ): Result<CommentThread> => {\n const scope: BackendScope | null = resolveScope(input.branchId);\n if (!scope) return missingScopeError<CommentThread>();\n\n const res = await backend.resolveThread(scope, {\n threadId: input.threadId,\n resolved: input.resolved,\n });\n\n if (res.ok) {\n updateThread(res.value as CommentThread);\n }\n\n return res as unknown as Result<CommentThread>;\n },\n [backend, resolveScope, updateThread],\n );\n\n const deleteThread = React.useCallback(\n async (\n input: Readonly<{\n threadId: string;\n branchId?: string;\n }>,\n ): Result<void> => {\n const scope: BackendScope | null = resolveScope(input.branchId);\n if (!scope) return missingScopeError<void>();\n\n const res = await backend.deleteThread(scope, {\n threadId: input.threadId,\n });\n\n if (res.ok) {\n setThreads((s) => {\n if (!s.data) return s;\n return {\n ...s,\n data: s.data.filter((t) => t.id !== input.threadId),\n updatedAt: now(),\n };\n });\n }\n\n return res as unknown as Result<void>;\n },\n [backend, resolveScope],\n );\n\n return React.useMemo(\n () => ({\n threads,\n refreshThreads,\n createThread,\n addMessage,\n editMessage,\n deleteMessage,\n moveThread,\n resolveThread,\n deleteThread,\n }),\n [\n threads,\n refreshThreads,\n createThread,\n addMessage,\n editMessage,\n deleteMessage,\n moveThread,\n resolveThread,\n deleteThread,\n ],\n );\n}\n","// src/react/workspace/context/provider/compose/use-branch-cache.ts\nimport * as React from \"react\";\nimport type { BranchCacheEntry, Loadable, SnapshotSlice } from \"../types\";\nimport type { FieldTemplate, BranchParticipant } from \"../../backend\";\n\nimport { createCache, createIndexedDBDriver } from \"@timeax/cache-store\";\nimport type { CacheStore } from \"@timeax/cache-store\";\n\nexport interface BranchCacheApi {\n /**\n * Clear cached branch scopes for THIS workspace.\n */\n readonly clear: () => void;\n\n readonly switchBranch: (\n args: Readonly<{\n /**\n * Redundant on purpose: call-sites must pass workspaceId explicitly,\n * and the hook is also workspace-scoped.\n *\n * This allows us to detect wiring bugs (mismatched workspace scopes).\n */\n workspaceId: string;\n\n nextId: string;\n prevId?: string;\n\n templates: Loadable<readonly FieldTemplate[]>;\n participants: Loadable<readonly BranchParticipant[]>;\n snapshot: SnapshotSlice;\n\n setTemplates: React.Dispatch<\n React.SetStateAction<Loadable<readonly FieldTemplate[]>>\n >;\n setParticipants: React.Dispatch<\n React.SetStateAction<Loadable<readonly BranchParticipant[]>>\n >;\n setSnapshot: React.Dispatch<React.SetStateAction<SnapshotSlice>>;\n\n resetTemplates: () => void;\n resetParticipants: () => void;\n resetSnapshot: () => void;\n\n setCurrentBranchId: (id: string) => void;\n getCurrentBranchId: () => string | undefined;\n getCurrentSnapshot: () => SnapshotSlice;\n }>,\n ) => void;\n}\n\nconst DB_NAME = \"dgp-cache\";\nconst STORE_NAME = \"kv\";\nconst NS = \"workspace\";\n\n// Key scheme (per workspace):\n// ws:<workspaceId>:branch:<branchId>\nconst WS_PREFIX = \"ws:\";\nconst keyOf = (workspaceId: string, branchId: string): string =>\n `${WS_PREFIX}${workspaceId}:branch:${branchId}`;\n\nconst branchPrefixOf = (workspaceId: string): string =>\n `${WS_PREFIX}${workspaceId}:branch:`;\n\ntype PendingSwitch = Readonly<{\n token: number;\n workspaceId: string;\n nextId: string;\n\n getCurrentBranchId: () => string | undefined;\n getCurrentSnapshot: () => SnapshotSlice;\n\n setTemplates: React.Dispatch<\n React.SetStateAction<Loadable<readonly FieldTemplate[]>>\n >;\n setParticipants: React.Dispatch<\n React.SetStateAction<Loadable<readonly BranchParticipant[]>>\n >;\n setSnapshot: React.Dispatch<React.SetStateAction<SnapshotSlice>>;\n}>;\n\nfunction hasSnapshotProps(data: unknown): boolean {\n if (!data || typeof data !== \"object\") return false;\n const props = (data as { props?: unknown }).props;\n return Boolean(props && typeof props === \"object\");\n}\n\nfunction hasUsableSnapshot(slice?: SnapshotSlice): boolean {\n return Boolean(\n slice &&\n typeof slice.schemaVersion === \"string\" &&\n slice.schemaVersion.length > 0 &&\n hasSnapshotProps(slice.data),\n );\n}\n\nexport function useBranchCache(workspaceId: string): BranchCacheApi {\n // IndexedDB-backed cache instance (scoped by ns + key prefixing).\n const cache: CacheStore = React.useMemo(() => {\n return createCache({\n driver: createIndexedDBDriver({\n dbName: DB_NAME,\n storeName: STORE_NAME,\n ns: NS,\n }),\n hydrate: true,\n cleanupExpiredOnHydrate: true,\n });\n }, []);\n\n const wsIdRef = React.useRef<string>(workspaceId);\n React.useEffect(() => {\n wsIdRef.current = workspaceId;\n }, [workspaceId]);\n\n // IDB hydration is async. We keep it internal to preserve the hook API.\n const readyRef = React.useRef<boolean>(cache.isReady());\n const switchTokenRef = React.useRef(0);\n\n // If switchBranch runs before hydration completes, defer the cache-apply decision.\n const pendingRef = React.useRef<PendingSwitch | null>(null);\n\n const applyPendingCacheIfSafe = React.useCallback(\n (p: PendingSwitch): void => {\n if (p.token !== switchTokenRef.current) return;\n if (p.getCurrentBranchId() !== p.nextId) return;\n if (hasUsableSnapshot(p.getCurrentSnapshot())) return;\n\n const cached = cache.get<BranchCacheEntry>(\n keyOf(p.workspaceId, p.nextId),\n );\n if (!cached) return;\n\n p.setTemplates(cached.templates);\n p.setParticipants(cached.participants);\n\n if (hasUsableSnapshot(cached.snapshot)) {\n p.setSnapshot(cached.snapshot);\n }\n },\n [cache],\n );\n\n React.useEffect(() => {\n if (cache.isReady()) {\n readyRef.current = true;\n return;\n }\n\n const unsub = cache.subscribeReady(() => {\n readyRef.current = true;\n\n const p = pendingRef.current;\n if (!p) return;\n\n applyPendingCacheIfSafe(p);\n pendingRef.current = null;\n });\n\n return () => unsub();\n }, [cache, applyPendingCacheIfSafe]);\n\n const clear = React.useCallback((): void => {\n switchTokenRef.current += 1;\n pendingRef.current = null;\n\n // Clear ONLY this workspace scope.\n cache.clear(branchPrefixOf(wsIdRef.current));\n }, [cache]);\n\n const switchBranch = React.useCallback(\n (\n args: Readonly<{\n workspaceId: string;\n\n nextId: string;\n prevId?: string;\n\n templates: Loadable<readonly FieldTemplate[]>;\n participants: Loadable<readonly BranchParticipant[]>;\n snapshot: SnapshotSlice;\n\n setTemplates: React.Dispatch<\n React.SetStateAction<Loadable<readonly FieldTemplate[]>>\n >;\n setParticipants: React.Dispatch<\n React.SetStateAction<Loadable<readonly BranchParticipant[]>>\n >;\n setSnapshot: React.Dispatch<\n React.SetStateAction<SnapshotSlice>\n >;\n\n resetTemplates: () => void;\n resetParticipants: () => void;\n resetSnapshot: () => void;\n\n setCurrentBranchId: (id: string) => void;\n getCurrentBranchId: () => string | undefined;\n getCurrentSnapshot: () => SnapshotSlice;\n }>,\n ): void => {\n const token = switchTokenRef.current + 1;\n switchTokenRef.current = token;\n\n const hookWsId: string = wsIdRef.current;\n const callWsId: string = args.workspaceId;\n\n // Redundant-by-design safety check (catch wiring mistakes).\n if (callWsId !== hookWsId) {\n // Keep it non-fatal (warn) to avoid breaking UX in production.\n // eslint-disable-next-line no-console\n console.warn(\n `[useBranchCache] workspaceId mismatch: hook=\"${hookWsId}\" vs switchBranch=\"${callWsId}\". Using switchBranch workspaceId.`,\n );\n }\n\n const wsId: string = callWsId;\n const prevId: string | undefined = args.prevId;\n\n // Cache previous branch scope (per workspace).\n if (prevId && prevId !== args.nextId) {\n cache.set<BranchCacheEntry>(keyOf(wsId, prevId), {\n templates: args.templates,\n participants: args.participants,\n snapshot: args.snapshot,\n });\n }\n\n // Try to read cached next branch from mirror (may be empty before hydration).\n const cached = cache.get<BranchCacheEntry>(\n keyOf(wsId, args.nextId),\n );\n const cachedSnapshot = hasUsableSnapshot(cached?.snapshot)\n ? cached!.snapshot\n : undefined;\n\n if (cached) {\n args.setTemplates(cached.templates);\n args.setParticipants(cached.participants);\n } else {\n args.resetTemplates();\n args.resetParticipants();\n }\n\n if (cachedSnapshot) {\n args.setSnapshot(cachedSnapshot);\n } else {\n args.resetSnapshot();\n }\n\n args.setCurrentBranchId(args.nextId);\n\n // If not hydrated yet, defer the no-cache => load decision because hydration\n // might still reveal a valid cached snapshot for this workspace+branch.\n if (!readyRef.current && !cachedSnapshot) {\n pendingRef.current = {\n token,\n workspaceId: wsId,\n nextId: args.nextId,\n getCurrentBranchId: args.getCurrentBranchId,\n getCurrentSnapshot: args.getCurrentSnapshot,\n setTemplates: args.setTemplates,\n setParticipants: args.setParticipants,\n setSnapshot: args.setSnapshot,\n };\n return;\n }\n\n pendingRef.current = null;\n },\n [cache],\n );\n\n return React.useMemo<BranchCacheApi>(\n () => ({ clear, switchBranch }),\n [clear, switchBranch],\n );\n}\n","// src/react/workspace/context/provider/compose/use-live-polling.ts\nimport * as React from \"react\";\nimport type { Actor, BackendError, LiveOptions } from \"../../backend\";\nimport type { RunResult } from \"../types\";\nimport type {\n WorkspaceLiveAdapter,\n WorkspaceLiveAdapterContext,\n WorkspaceLiveAdapterRegistry,\n WorkspaceLiveStatus,\n WorkspaceLiveTick,\n} from \"../live/types\";\nimport { createPollAdapter } from \"@/react/workspace\";\n\nexport interface LiveControl {\n readonly connected: boolean;\n readonly lastEventAt?: number;\n readonly lastError?: BackendError;\n readonly connect: () => void;\n readonly disconnect: () => void;\n}\n\nexport interface UseLivePollingParams {\n readonly live: LiveOptions;\n readonly workspaceId: string;\n readonly actor: Actor;\n\n readonly hasAnyData: boolean;\n\n readonly getCurrentBranchId: () => string | undefined;\n\n readonly refreshAll: (opts?: { strict?: boolean }) => Promise<RunResult>;\n readonly refreshBranchContext?: () => Promise<void>;\n readonly refreshSnapshotPointers?: () => Promise<void>;\n\n /**\n * Host can provide adapters for modes like \"ws\" / \"sse\"\n * (and even custom strings later).\n */\n readonly adapters?: WorkspaceLiveAdapterRegistry;\n\n /**\n * Simple debounce to avoid refresh storms (WS bursts etc).\n * Default: 250ms\n */\n readonly debounceMs?: number;\n}\n\nfunction toError(e: unknown): BackendError {\n if (\n typeof e === \"object\" &&\n e &&\n \"code\" in (e as Record<string, unknown>) &&\n \"message\" in (e as Record<string, unknown>)\n ) {\n return e as BackendError;\n }\n if (e instanceof Error) {\n return { code: \"runtime_error\", message: `${e.name}: ${e.message}` };\n }\n return { code: \"unknown_error\", message: String(e ?? \"Unknown error\") };\n}\n\nexport function useLivePolling(params: UseLivePollingParams): LiveControl {\n const {\n live,\n workspaceId,\n actor,\n hasAnyData,\n getCurrentBranchId,\n refreshAll,\n refreshBranchContext,\n refreshSnapshotPointers,\n adapters,\n debounceMs,\n } = params;\n\n const [status, setStatus] = React.useState<WorkspaceLiveStatus>(() => ({\n connected: false,\n }));\n\n const adapterRef = React.useRef<WorkspaceLiveAdapter | null>(null);\n const inflightRef = React.useRef<boolean>(false);\n const debounceTimerRef = React.useRef<number | null>(null);\n const lastTickRef = React.useRef<WorkspaceLiveTick | null>(null);\n\n const debounceWindowMs: number = debounceMs ?? 250;\n\n const disconnect = React.useCallback((): void => {\n if (debounceTimerRef.current != null) {\n window.clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = null;\n }\n adapterRef.current?.disconnect();\n adapterRef.current = null;\n inflightRef.current = false;\n lastTickRef.current = null;\n setStatus({ connected: false });\n }, []);\n\n const resolveAdapter =\n React.useCallback((): WorkspaceLiveAdapter | null => {\n if (live.mode === \"off\") return null;\n\n if (live.mode === \"poll\") {\n return createPollAdapter({ defaultIntervalMs: 15000 });\n }\n\n // ws/sse (or future modes) must be provided by host registry\n const reg: WorkspaceLiveAdapterRegistry | undefined = adapters;\n const factory = reg ? reg[live.mode] : undefined;\n\n return factory ? factory() : null;\n }, [live.mode, adapters]);\n\n const ctx = React.useMemo<WorkspaceLiveAdapterContext>(\n () => ({\n workspaceId,\n actorId: actor.id,\n live,\n getCurrentBranchId,\n refreshAll,\n refreshBranchContext,\n refreshSnapshotPointers,\n }),\n [\n workspaceId,\n actor.id,\n live,\n getCurrentBranchId,\n refreshAll,\n refreshBranchContext,\n refreshSnapshotPointers,\n ],\n );\n\n const scheduleRefresh = React.useCallback(\n (tick: WorkspaceLiveTick): void => {\n lastTickRef.current = tick;\n\n if (debounceTimerRef.current != null) {\n window.clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = null;\n }\n\n debounceTimerRef.current = window.setTimeout(() => {\n debounceTimerRef.current = null;\n\n if (inflightRef.current) return;\n inflightRef.current = true;\n\n void (async () => {\n try {\n const res: RunResult = await refreshAll({\n strict: false,\n });\n\n if (!res.ok) {\n setStatus((s) => ({\n ...s,\n connected: true,\n lastEventAt: tick.at,\n lastError: res.errors[0],\n }));\n } else {\n setStatus((s) => ({\n ...s,\n connected: true,\n lastEventAt: tick.at,\n lastError: undefined,\n }));\n }\n } catch (e: unknown) {\n setStatus((s) => ({\n ...s,\n connected: true,\n lastEventAt: tick.at,\n lastError: toError(e),\n }));\n } finally {\n inflightRef.current = false;\n }\n })();\n }, debounceWindowMs) as unknown as number;\n },\n [refreshAll, debounceWindowMs],\n );\n\n const connect = React.useCallback((): void => {\n // idempotent: disconnect current first\n disconnect();\n\n if (live.mode === \"off\") {\n setStatus({ connected: false });\n\n // parity with old behavior: if nothing loaded yet, do an initial refresh\n if (!hasAnyData) {\n void (async () => {\n await refreshAll({ strict: false });\n })();\n }\n\n return;\n }\n\n const adapter: WorkspaceLiveAdapter | null = resolveAdapter();\n\n if (!adapter) {\n setStatus({\n connected: false,\n lastError: {\n code: \"live_adapter_missing\",\n message: `No live adapter registered for mode \"${live.mode}\".`,\n },\n });\n return;\n }\n\n adapterRef.current = adapter;\n\n void Promise.resolve(\n adapter.connect(ctx, {\n onTick: (tick: WorkspaceLiveTick) => {\n // treat any tick as “refresh now”\n scheduleRefresh(tick);\n },\n onStatus: (s: WorkspaceLiveStatus) => {\n setStatus((prev) => ({\n ...prev,\n ...s,\n }));\n },\n }),\n ).catch((e: unknown) => {\n setStatus({\n connected: false,\n lastError: toError(e),\n });\n });\n }, [\n disconnect,\n live.mode,\n hasAnyData,\n refreshAll,\n resolveAdapter,\n ctx,\n scheduleRefresh,\n ]);\n\n // Auto-connect/disconnect based on (workspaceId + live.mode + key options)\n const liveKey: string = React.useMemo(() => {\n if (live.mode === \"poll\") return `poll:${live.intervalMs ?? 15000}`;\n if (live.mode === \"ws\") return `ws:${live.url}`;\n if (live.mode === \"sse\") return `sse:${live.url}`;\n return String(live.mode);\n }, [live]);\n\n React.useEffect(() => {\n connect();\n return () => disconnect();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [workspaceId, liveKey]);\n\n return React.useMemo<LiveControl>(\n () => ({\n connected: status.connected,\n lastEventAt: status.lastEventAt,\n lastError: status.lastError,\n connect,\n disconnect,\n }),\n [\n status.connected,\n status.lastEventAt,\n status.lastError,\n connect,\n disconnect,\n ],\n );\n}\n","// src/react/workspace/context/provider/slices/use-policies-slice.ts\nimport * as React from \"react\";\n\nimport type {\n WorkspaceBackend,\n Result,\n BackendError,\n BackendResult,\n} from \"../../backend\";\nimport type { Loadable } from \"@/react/workspace\";\n\nimport type { DynamicRule } from \"@/schema\";\nimport { compilePolicies, type PolicyDiagnostic } from \"@/core/policy\";\n\n/* ---------------- helpers ---------------- */\n\nfunction idle<T>(data: T | null = null): Loadable<T> {\n return { state: \"idle\", data } as any;\n}\nfunction loading<T>(prev: Loadable<T>): Loadable<T> {\n return { ...prev, state: \"loading\", error: undefined } as any;\n}\nfunction ready<T>(data: T): Loadable<T> {\n return { state: \"ready\", data, error: undefined } as any;\n}\nfunction failed<T>(prev: Loadable<T>, error: BackendError): Loadable<T> {\n return { ...prev, state: \"error\", error } as any;\n}\n\nfunction missingBackendError(key: string): BackendError {\n return {\n code: \"backend_missing\",\n message: `WorkspaceBackend.policies.${key} is not implemented.`,\n };\n}\n\n/* ---------------- slice ---------------- */\n\nexport type PoliciesSlice = {\n readonly policies: Loadable<readonly DynamicRule[]>;\n readonly policyDiagnostics: Loadable<readonly PolicyDiagnostic[]>;\n\n /** internal state setters (for cache switching parity) */\n readonly __setPoliciesState: React.Dispatch<\n React.SetStateAction<Loadable<readonly DynamicRule[]>>\n >;\n readonly __setPolicyDiagnosticsState: React.Dispatch<\n React.SetStateAction<Loadable<readonly PolicyDiagnostic[]>>\n >;\n\n readonly invalidatePolicies: () => void;\n\n readonly refreshPolicies: (\n params?: Readonly<{ since?: number | string; branchId?: string }>,\n ) => Promise<BackendResult<readonly DynamicRule[]>>;\n\n readonly savePolicies: (\n rules: readonly DynamicRule[],\n params?: Readonly<{ branchId?: string }>,\n ) => Result<Readonly<{ policies: readonly DynamicRule[] }>>;\n\n /** local-only compile helper for editor UIs */\n readonly compilePoliciesFromRaw: (raw: unknown) => Readonly<{\n policies: DynamicRule[];\n diagnostics: PolicyDiagnostic[];\n }>;\n};\n\nexport function usePoliciesSlice(\n args: Readonly<{\n backend: WorkspaceBackend;\n workspaceId: string;\n actorId: string;\n getCurrentBranchId: () => string | undefined;\n\n /** optional hydration */\n initialPolicies?: readonly DynamicRule[] | null;\n\n /** runtime is accepted for parity with other slices (not required here) */\n runtime?: unknown;\n }>,\n): PoliciesSlice {\n const {\n backend,\n workspaceId,\n actorId,\n getCurrentBranchId,\n initialPolicies = null,\n } = args;\n\n const [policies, __setPoliciesState] = React.useState<\n Loadable<readonly DynamicRule[]>\n >(() => (initialPolicies ? ready(initialPolicies) : idle(null)) as any);\n\n const [policyDiagnostics, __setPolicyDiagnosticsState] = React.useState<\n Loadable<readonly PolicyDiagnostic[]>\n >(() => idle([]));\n\n const invalidatePolicies = React.useCallback((): void => {\n __setPoliciesState((s) => idle(s.data ?? null));\n __setPolicyDiagnosticsState(() => idle([]));\n }, []);\n\n const refreshPolicies = React.useCallback(\n async (\n params?: Readonly<{ since?: number | string; branchId?: string }>,\n ): Promise<BackendResult<readonly DynamicRule[]>> => {\n const branchId: string | undefined =\n params?.branchId ?? getCurrentBranchId();\n\n const api: any = (backend as any).policies;\n\n // Prefer refresh(); fallback to get(); backend contract exposes load().\n const fn: any = api?.refresh ?? api?.get ?? api?.load;\n const fnKey: string = api?.refresh\n ? \"refresh\"\n : api?.get\n ? \"get\"\n : \"load\";\n\n if (!fn) {\n const error = missingBackendError(fnKey);\n __setPoliciesState((s) => failed(s, error));\n return { ok: false, error };\n }\n\n __setPoliciesState((s) => loading(s));\n\n const res = await fn({\n workspaceId,\n branchId,\n actorId,\n since: params?.since,\n });\n\n if (!res?.ok) {\n const error = res?.error ?? missingBackendError(fnKey);\n __setPoliciesState((s) => failed(s, error));\n return { ok: false, error };\n }\n\n const loaded = res.value;\n const raw = loaded?.raw;\n const compiled =\n loaded?.compiled ??\n (raw != null ? compilePolicies(raw).policies : []);\n const diagnostics =\n loaded?.diagnostics ??\n (raw != null ? compilePolicies(raw).diagnostics : []);\n\n __setPoliciesState(() => ready(compiled));\n __setPolicyDiagnosticsState(() => ready(diagnostics));\n return { ok: true, value: compiled };\n },\n [backend, workspaceId, actorId, getCurrentBranchId],\n );\n\n const savePolicies = React.useCallback<PoliciesSlice[\"savePolicies\"]>(\n async (rules, params) => {\n const branchId: string | undefined =\n params?.branchId ?? getCurrentBranchId();\n\n const api: any = (backend as any).policies;\n if (!api?.save) {\n const err = missingBackendError(\"save\");\n __setPoliciesState((s) => failed(s, err));\n return { ok: false, error: err };\n }\n\n __setPoliciesState((s) => loading(s));\n\n const res = await api.save({\n workspaceId,\n branchId,\n actorId,\n policies: rules,\n });\n\n if (!res?.ok) {\n __setPoliciesState((s) =>\n failed(s, res?.error ?? missingBackendError(\"save\")),\n );\n return res;\n }\n\n const list: readonly DynamicRule[] = (res.value?.policies ??\n res.value ??\n rules) as readonly DynamicRule[];\n\n __setPoliciesState(() => ready(list));\n\n return {\n ok: true,\n value: { policies: list },\n };\n },\n [backend, workspaceId, actorId, getCurrentBranchId],\n );\n\n const compilePoliciesFromRaw = React.useCallback((raw: unknown) => {\n const { policies: compiled, diagnostics } = compilePolicies(raw);\n\n __setPoliciesState(() => ready(compiled));\n __setPolicyDiagnosticsState(() => ready(diagnostics));\n\n return { policies: compiled, diagnostics };\n }, []);\n\n return {\n policies,\n policyDiagnostics,\n\n __setPoliciesState,\n __setPolicyDiagnosticsState,\n\n invalidatePolicies,\n refreshPolicies,\n savePolicies,\n\n compilePoliciesFromRaw,\n };\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","import * as React from \"react\";\n\nimport type {\n BackendError,\n BackendResult,\n Branch,\n Commit,\n Draft,\n} from \"../../backend\";\nimport type {\n RunResult,\n WorkspaceBootSection,\n WorkspaceBootSectionState,\n WorkspaceBootState,\n} from \"../types\";\nimport type { BackendRuntime } from \"../runtime/use-backend-runtime\";\n\nconst ALL_SECTIONS: readonly WorkspaceBootSection[] = [\n \"authors\",\n \"permissions\",\n \"branches\",\n \"services\",\n \"participants\",\n \"templates\",\n \"snapshotPointers\",\n \"snapshotBody\",\n \"policies\",\n \"comments\",\n];\n\nconst BLOCKING_SECTIONS: readonly WorkspaceBootSection[] = [\n \"authors\",\n \"permissions\",\n \"branches\",\n \"services\",\n \"participants\",\n \"templates\",\n \"snapshotPointers\",\n \"snapshotBody\",\n \"policies\",\n];\n\nfunction createInitialSections(): Record<\n WorkspaceBootSection,\n WorkspaceBootSectionState\n> {\n return {\n authors: { status: \"idle\" },\n permissions: { status: \"idle\" },\n branches: { status: \"idle\" },\n services: { status: \"idle\" },\n participants: { status: \"idle\" },\n templates: { status: \"idle\" },\n snapshotPointers: { status: \"idle\" },\n snapshotBody: { status: \"idle\" },\n policies: { status: \"idle\" },\n comments: { status: \"idle\" },\n };\n}\n\nfunction createNoBranchError(section: WorkspaceBootSection): BackendError {\n return {\n code: \"no_branch\",\n message: `No current branch available to load ${section}.`,\n };\n}\n\nfunction collectErrors(\n sections: Readonly<Record<WorkspaceBootSection, WorkspaceBootSectionState>>,\n): Partial<Record<WorkspaceBootSection, BackendError>> {\n const errors: Partial<Record<WorkspaceBootSection, BackendError>> = {};\n for (const section of ALL_SECTIONS) {\n const error = sections[section].error;\n if (error) {\n errors[section] = error;\n }\n }\n return errors;\n}\n\nfunction getRunErrors(result: RunResult): BackendError[] {\n return result.ok ? [] : result.errors;\n}\n\nfunction resolveBranchId(\n branches: readonly Branch[],\n preferredId?: string,\n): string | undefined {\n if (preferredId && branches.some((branch) => branch.id === preferredId)) {\n return preferredId;\n }\n return branches.find((branch) => branch.isMain)?.id ?? branches[0]?.id;\n}\n\nasync function toVoidResult<T>(\n result: Promise<BackendResult<T>>,\n): Promise<BackendResult<void>> {\n const res = await result;\n if (!res.ok) {\n return res;\n }\n return { ok: true, value: undefined };\n}\n\nexport interface UseWorkspaceBootParams {\n readonly workspaceId: string;\n readonly actorId: string;\n readonly preferredBranchId?: string;\n readonly hasInitialData: boolean;\n readonly runtime: BackendRuntime;\n readonly getBranchesState: () => readonly Branch[];\n readonly getCurrentBranchId: () => string | undefined;\n readonly setCurrentBranchId: (id: string) => void;\n readonly refreshAuthors: () => Promise<BackendResult<readonly unknown[]>>;\n readonly refreshPermissions: () => Promise<\n BackendResult<Readonly<Record<string, boolean>>>\n >;\n readonly refreshBranches: () => Promise<BackendResult<readonly Branch[]>>;\n readonly refreshServices: () => Promise<\n BackendResult<Readonly<Record<string, unknown>>>\n >;\n readonly refreshParticipants: (\n branchId: string,\n ) => Promise<BackendResult<readonly unknown[]>>;\n readonly refreshTemplates: (\n branchId: string,\n ) => Promise<BackendResult<readonly unknown[]>>;\n readonly refreshSnapshotPointers: (\n branchId: string,\n ) => Promise<BackendResult<Readonly<{ head?: Commit; draft?: Draft }>>>;\n readonly loadSnapshotBody: (\n branchId: string,\n ) => Promise<BackendResult<void>>;\n readonly refreshPolicies: (\n branchId: string,\n ) => Promise<BackendResult<readonly unknown[]>>;\n readonly refreshComments: (\n branchId: string,\n ) => Promise<BackendResult<readonly unknown[]>>;\n}\n\nexport interface WorkspaceBootController {\n readonly boot: WorkspaceBootState;\n readonly refreshAll: (opts?: { strict?: boolean }) => Promise<RunResult>;\n readonly refreshBranchContext: (\n opts?: Readonly<{\n branchId?: string;\n strict?: boolean;\n includeWorkspaceData?: boolean;\n }>,\n ) => Promise<void>;\n readonly refreshSnapshotPointers: (\n opts?: Readonly<{ branchId?: string; strict?: boolean }>,\n ) => Promise<void>;\n}\n\nexport function useWorkspaceBoot(\n params: UseWorkspaceBootParams,\n): WorkspaceBootController {\n const {\n workspaceId,\n actorId,\n preferredBranchId,\n hasInitialData,\n runtime,\n getBranchesState,\n getCurrentBranchId,\n setCurrentBranchId,\n refreshAuthors,\n refreshPermissions,\n refreshBranches,\n refreshServices,\n refreshParticipants,\n refreshTemplates,\n refreshSnapshotPointers,\n loadSnapshotBody,\n refreshPolicies,\n refreshComments,\n } = params;\n\n const [sections, setSections] = React.useState(createInitialSections);\n const [lastError, setLastError] = React.useState<BackendError | undefined>(\n undefined,\n );\n const runIdRef = React.useRef(0);\n const refreshAllRef = React.useRef<\n ((opts?: { strict?: boolean }) => Promise<RunResult>) | null\n >(null);\n\n const markLoading = React.useCallback(\n (section: WorkspaceBootSection): void => {\n setSections((prev) => ({\n ...prev,\n [section]: {\n status: \"loading\",\n updatedAt: runtime.now(),\n },\n }));\n },\n [runtime],\n );\n\n const markResult = React.useCallback(\n (section: WorkspaceBootSection, result: BackendResult<unknown>): void => {\n if (result.ok) {\n setSections((prev) => ({\n ...prev,\n [section]: {\n status: \"success\",\n updatedAt: runtime.now(),\n },\n }));\n return;\n }\n\n setLastError(result.error);\n setSections((prev) => ({\n ...prev,\n [section]: {\n status: \"error\",\n error: result.error,\n updatedAt: runtime.now(),\n },\n }));\n },\n [runtime],\n );\n\n const runSection = React.useCallback(\n async <T,>(\n section: WorkspaceBootSection,\n task: () => Promise<BackendResult<T>>,\n ): Promise<BackendResult<T>> => {\n markLoading(section);\n try {\n const result = await task();\n markResult(section, result as BackendResult<unknown>);\n return result;\n } catch (error) {\n const backendError = runtime.toBackendError(error);\n setLastError(backendError);\n setSections((prev) => ({\n ...prev,\n [section]: {\n status: \"error\",\n error: backendError,\n updatedAt: runtime.now(),\n },\n }));\n return { ok: false, error: backendError };\n }\n },\n [markLoading, markResult, runtime],\n );\n\n const runGroup = React.useCallback(\n async (\n tasks: ReadonlyArray<\n readonly [WorkspaceBootSection, () => Promise<BackendResult<unknown>>]\n >,\n strict: boolean,\n ): Promise<RunResult> => {\n const errors: BackendError[] = [];\n\n for (const [section, task] of tasks) {\n const result = await runSection(section, task);\n if (!result.ok) {\n errors.push(result.error);\n if (strict) {\n break;\n }\n }\n }\n\n return errors.length > 0 ? { ok: false, errors } : { ok: true };\n },\n [runSection],\n );\n\n const resolveActiveBranch = React.useCallback(\n (candidateId?: string): string | undefined => {\n const branches = getBranchesState();\n const branchId = resolveBranchId(\n branches,\n candidateId ?? getCurrentBranchId() ?? preferredBranchId,\n );\n if (branchId) {\n setCurrentBranchId(branchId);\n }\n return branchId;\n },\n [\n getBranchesState,\n getCurrentBranchId,\n preferredBranchId,\n setCurrentBranchId,\n ],\n );\n\n const markBranchScopedNoBranch = React.useCallback((): RunResult => {\n const errors: BackendError[] = [];\n for (const section of BLOCKING_SECTIONS) {\n if (![\"participants\", \"templates\", \"snapshotPointers\", \"snapshotBody\", \"policies\"].includes(section)) {\n continue;\n }\n const error = createNoBranchError(section);\n errors.push(error);\n setLastError(error);\n setSections((prev) => ({\n ...prev,\n [section]: {\n status: \"error\",\n error,\n updatedAt: runtime.now(),\n },\n }));\n }\n return { ok: false, errors };\n }, [runtime]);\n\n const refreshBranchContext = React.useCallback(\n async (\n opts?: Readonly<{\n branchId?: string;\n strict?: boolean;\n includeWorkspaceData?: boolean;\n }>,\n ): Promise<void> => {\n const strict = opts?.strict ?? false;\n const tasks: Array<\n readonly [WorkspaceBootSection, () => Promise<BackendResult<unknown>>]\n > = [];\n const branchId =\n resolveActiveBranch(opts?.branchId) ?? opts?.branchId;\n\n if (opts?.includeWorkspaceData ?? true) {\n tasks.push([\"authors\", refreshAuthors]);\n tasks.push([\"permissions\", refreshPermissions]);\n tasks.push([\"services\", refreshServices]);\n }\n\n if (!branchId) {\n markBranchScopedNoBranch();\n return;\n }\n\n tasks.push([\n \"participants\",\n () => refreshParticipants(branchId),\n ]);\n tasks.push([\"templates\", () => refreshTemplates(branchId)]);\n tasks.push([\n \"snapshotPointers\",\n () => refreshSnapshotPointers(branchId),\n ]);\n tasks.push([\"policies\", () => refreshPolicies(branchId)]);\n tasks.push([\"snapshotBody\", () => loadSnapshotBody(branchId)]);\n\n await runGroup(tasks, strict);\n void runSection(\"comments\", () => refreshComments(branchId));\n },\n [\n loadSnapshotBody,\n markBranchScopedNoBranch,\n refreshAuthors,\n refreshComments,\n refreshParticipants,\n refreshPermissions,\n refreshPolicies,\n refreshServices,\n refreshSnapshotPointers,\n refreshTemplates,\n resolveActiveBranch,\n runGroup,\n runSection,\n ],\n );\n\n const refreshAll = React.useCallback(\n async (opts?: { strict?: boolean }): Promise<RunResult> => {\n const runId = ++runIdRef.current;\n const strict = opts?.strict ?? false;\n const workspaceErrors: BackendError[] = [];\n\n const authorsResult = await runSection(\"authors\", refreshAuthors);\n if (!authorsResult.ok) {\n workspaceErrors.push(authorsResult.error);\n if (strict) {\n return { ok: false, errors: workspaceErrors };\n }\n }\n\n const permissionsResult = await runSection(\n \"permissions\",\n refreshPermissions,\n );\n if (!permissionsResult.ok) {\n workspaceErrors.push(permissionsResult.error);\n if (strict) {\n return { ok: false, errors: workspaceErrors };\n }\n }\n\n const branchesResult = await runSection(\"branches\", refreshBranches);\n if (!branchesResult.ok) {\n workspaceErrors.push(branchesResult.error);\n if (strict) {\n return { ok: false, errors: workspaceErrors };\n }\n }\n\n const servicesResult = await runSection(\"services\", refreshServices);\n if (!servicesResult.ok) {\n workspaceErrors.push(servicesResult.error);\n if (strict) {\n return { ok: false, errors: workspaceErrors };\n }\n }\n\n if (runIdRef.current !== runId) {\n return workspaceErrors.length > 0\n ? { ok: false, errors: workspaceErrors }\n : { ok: true };\n }\n\n const resolvedBranches =\n branchesResult.ok && branchesResult.value\n ? (branchesResult.value as readonly Branch[])\n : getBranchesState();\n const branchId = resolveBranchId(\n resolvedBranches,\n preferredBranchId ?? getCurrentBranchId(),\n );\n if (branchId) {\n setCurrentBranchId(branchId);\n }\n if (!branchId) {\n const noBranchResult = markBranchScopedNoBranch();\n if (workspaceErrors.length > 0) {\n return {\n ok: false,\n errors: [\n ...workspaceErrors,\n ...getRunErrors(noBranchResult),\n ],\n };\n }\n return noBranchResult;\n }\n\n const branchResult = await runGroup(\n [\n [\"participants\", () => refreshParticipants(branchId)],\n [\"templates\", () => refreshTemplates(branchId)],\n [\n \"snapshotPointers\",\n () => refreshSnapshotPointers(branchId),\n ],\n [\"policies\", () => refreshPolicies(branchId)],\n [\"snapshotBody\", () => loadSnapshotBody(branchId)],\n ],\n strict,\n );\n\n if (runIdRef.current === runId) {\n void runSection(\"comments\", () => refreshComments(branchId));\n }\n\n if (workspaceErrors.length > 0 || !branchResult.ok) {\n const branchErrors = !branchResult.ok ? branchResult.errors : [];\n return {\n ok: false,\n errors: [...workspaceErrors, ...branchErrors],\n };\n }\n\n return { ok: true };\n },\n [\n loadSnapshotBody,\n markBranchScopedNoBranch,\n preferredBranchId,\n refreshAuthors,\n refreshBranches,\n refreshComments,\n refreshParticipants,\n refreshPermissions,\n refreshPolicies,\n refreshServices,\n refreshSnapshotPointers,\n refreshTemplates,\n getBranchesState,\n getCurrentBranchId,\n runGroup,\n runSection,\n setCurrentBranchId,\n ],\n );\n\n const retrySection = React.useCallback(\n async (\n section: WorkspaceBootSection,\n ): Promise<BackendResult<void>> => {\n const branchId = resolveActiveBranch();\n\n switch (section) {\n case \"authors\":\n return toVoidResult(refreshAuthors());\n case \"permissions\":\n return toVoidResult(refreshPermissions());\n case \"branches\":\n return toVoidResult(refreshBranches());\n case \"services\":\n return toVoidResult(refreshServices());\n case \"participants\":\n return branchId\n ? toVoidResult(\n runSection(section, () =>\n refreshParticipants(branchId),\n ),\n )\n : { ok: false, error: createNoBranchError(section) };\n case \"templates\":\n return branchId\n ? toVoidResult(\n runSection(section, () =>\n refreshTemplates(branchId),\n ),\n )\n : { ok: false, error: createNoBranchError(section) };\n case \"snapshotPointers\":\n return branchId\n ? toVoidResult(\n runSection(section, () =>\n refreshSnapshotPointers(branchId),\n ),\n )\n : { ok: false, error: createNoBranchError(section) };\n case \"snapshotBody\":\n return branchId\n ? toVoidResult(\n runSection(section, () =>\n loadSnapshotBody(branchId),\n ),\n )\n : { ok: false, error: createNoBranchError(section) };\n case \"policies\":\n return branchId\n ? toVoidResult(\n runSection(section, () =>\n refreshPolicies(branchId),\n ),\n )\n : { ok: false, error: createNoBranchError(section) };\n case \"comments\":\n return branchId\n ? toVoidResult(\n runSection(section, () =>\n refreshComments(branchId),\n ),\n )\n : { ok: false, error: createNoBranchError(section) };\n default:\n return {\n ok: false,\n error: {\n code: \"invalid_section\",\n message: `Unknown boot section: ${String(section)}.`,\n },\n };\n }\n },\n [\n loadSnapshotBody,\n refreshAuthors,\n refreshBranches,\n refreshComments,\n refreshParticipants,\n refreshPermissions,\n refreshPolicies,\n refreshServices,\n refreshSnapshotPointers,\n refreshTemplates,\n resolveActiveBranch,\n runSection,\n ],\n );\n\n const refreshSnapshotPointersOnly = React.useCallback(\n async (\n opts?: Readonly<{ branchId?: string; strict?: boolean }>,\n ): Promise<void> => {\n const branchId = resolveActiveBranch(opts?.branchId);\n if (!branchId) {\n markBranchScopedNoBranch();\n return;\n }\n await runGroup(\n [[\"snapshotPointers\", () => refreshSnapshotPointers(branchId)]],\n opts?.strict ?? false,\n );\n },\n [markBranchScopedNoBranch, refreshSnapshotPointers, resolveActiveBranch, runGroup],\n );\n\n React.useEffect(() => {\n refreshAllRef.current = refreshAll;\n }, [refreshAll]);\n\n React.useEffect(() => {\n setSections(createInitialSections());\n setLastError(undefined);\n void refreshAllRef.current?.();\n }, [actorId, workspaceId]);\n\n const boot = React.useMemo<WorkspaceBootState>(() => {\n const errorsBySection = collectErrors(sections);\n const statuses = ALL_SECTIONS.map((section) => sections[section].status);\n const completedSections = statuses.filter((status) => status !== \"idle\" && status !== \"loading\").length;\n const succeededSections = statuses.filter((status) => status === \"success\").length;\n const failedSections = statuses.filter((status) => status === \"error\").length;\n const isBooting = statuses.some((status) => status === \"loading\");\n const isReady = BLOCKING_SECTIONS.every(\n (section) => sections[section].status === \"success\",\n );\n const hasErrors = failedSections > 0;\n const hasPartialFailure = succeededSections > 0 && failedSections > 0;\n const isLiveConfirmed = isReady;\n\n return {\n sections,\n isBooting,\n isReady,\n hasErrors,\n hasPartialFailure,\n lastError,\n errorsBySection,\n isSeededView: hasInitialData && !isLiveConfirmed,\n isLiveConfirmed,\n completedSections,\n succeededSections,\n failedSections,\n totalSections: ALL_SECTIONS.length,\n retryAll: refreshAll,\n retrySection,\n };\n }, [hasInitialData, lastError, refreshAll, retrySection, sections]);\n\n return React.useMemo(\n () => ({\n boot,\n refreshAll,\n refreshBranchContext,\n refreshSnapshotPointers: refreshSnapshotPointersOnly,\n }),\n [boot, refreshAll, refreshBranchContext, refreshSnapshotPointersOnly],\n );\n}\n","import React, {\n createContext,\n type ReactNode,\n useContext,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { CanvasAPI } from \"@/react\";\nimport { Builder, BuilderOptions, createBuilder } from \"@/core\";\nimport type { CanvasOptions, CanvasState } from \"@/schema/canvas-types\";\nimport type { CanvasBackendOptions } from \"../../canvas/backend\";\nimport type { EditorSnapshot, ServiceProps } from \"@/schema\";\nimport { useWorkspaceMaybe } from \".\";\n\nconst Ctx = createContext<CanvasAPI | null>(null);\n\ntype CanvasProviderManagedProps = {\n api: CanvasAPI;\n children: ReactNode;\n};\n\ntype CanvasProviderWorkspaceProps = {\n children: ReactNode;\n builderOpts?: BuilderOptions;\n canvasOpts?: CanvasOptions & CanvasBackendOptions;\n attachToWorkspace?: boolean;\n};\n\ntype CanvasProviderProps =\n | CanvasProviderManagedProps\n | CanvasProviderWorkspaceProps;\n\ntype BootSectionStatus = \"idle\" | \"loading\" | \"success\" | \"error\";\n\nexport function CanvasProvider(props: CanvasProviderProps) {\n if (\"api\" in props) {\n return <Ctx.Provider value={props.api}>{props.children}</Ctx.Provider>;\n }\n\n return <CanvasProviderWorkspaceRuntime {...props} />;\n}\n\nfunction CanvasProviderWorkspaceRuntime({\n children,\n builderOpts,\n canvasOpts,\n attachToWorkspace = true,\n}: CanvasProviderWorkspaceProps) {\n const ws = useWorkspaceMaybe();\n\n if (!attachToWorkspace || !ws) {\n throw new Error(\n \"CanvasProvider: no `api` provided and no Workspace context available. \" +\n \"Either pass an `api` prop or render within <WorkspaceProvider>.\",\n );\n }\n\n const snapshotSection = ws.boot.sections.snapshotBody;\n const currentBranchId = ws.branches.currentId;\n const snapshotData = ws.snapshot.data as EditorSnapshot | undefined;\n const initialProps = snapshotData?.props as ServiceProps | undefined;\n\n const hasMountedOnceRef = useRef(false);\n\n // useEffect(() => {\n // console.log(\n // \"service-builder effect from the CanvasProvider\",\n // JSON.stringify({\n // currentBranchId: ws.branches.currentId,\n // snapshotState: ws.snapshot.state,\n // hasData: !!ws.snapshot.data,\n // snapshotKeys: ws.snapshot.data\n // ? Object.keys(ws.snapshot.data)\n // : [],\n // }),\n // );\n // }, [ws.branches.currentId, ws.snapshot]);\n\n const canMountCanvas =\n ws.boot.isBooting === false &&\n snapshotSection.status === \"success\" &&\n initialProps != null;\n\n const debug = \"\";\n\n const resolvedBuilderOpts: BuilderOptions | undefined = useMemo(() => {\n const svc = ws.services.data as unknown;\n const hasMap =\n svc != null &&\n typeof svc === \"object\" &&\n !Array.isArray(svc as unknown[]);\n\n return hasMap\n ? {\n ...(builderOpts ?? {}),\n serviceMap: svc as BuilderOptions[\"serviceMap\"],\n }\n : builderOpts;\n }, [builderOpts, ws.services.data]);\n\n if (canMountCanvas) {\n hasMountedOnceRef.current = true;\n }\n\n if (!canMountCanvas && !hasMountedOnceRef.current) {\n return (\n <>\n {debug}\n <WorkspaceBootScreen boot={ws.boot} />\n </>\n );\n }\n\n if (!canMountCanvas) {\n return (\n <>\n {debug}\n <WorkspaceBootOverlay boot={ws.boot} />\n <CanvasShellPlaceholder />\n </>\n );\n }\n\n const mountKey = currentBranchId ?? \"workspace-canvas\";\n\n return (\n <>\n {debug}\n <CanvasProviderOwned\n key={mountKey}\n initialSnapshot={snapshotData!}\n canvasOpts={canvasOpts}\n builderOpts={resolvedBuilderOpts}\n >\n {children}\n </CanvasProviderOwned>\n </>\n );\n}\n\nfunction CanvasProviderOwned({\n children,\n initialSnapshot,\n canvasOpts,\n builderOpts,\n}: {\n children: ReactNode;\n initialSnapshot: EditorSnapshot;\n canvasOpts?: CanvasOptions & CanvasBackendOptions;\n builderOpts?: BuilderOptions;\n}) {\n const { api } = useCanvasOwned(\n initialSnapshot.props,\n canvasOpts,\n builderOpts,\n );\n\n useHydrateEditorSnapshot(api, initialSnapshot);\n\n return <Ctx.Provider value={api}>{children}</Ctx.Provider>;\n}\n\nexport function useCanvasAPI(): CanvasAPI {\n const api = useContext(Ctx);\n if (!api) {\n throw new Error(\"useCanvasAPI must be used within <CanvasProvider>\");\n }\n return api;\n}\n\nexport function useCanvasFromBuilder(\n builder: Builder,\n opts?: CanvasOptions & CanvasBackendOptions,\n): CanvasAPI {\n useDevWarnOnOptsChurn(opts);\n\n const lastOptsRef = useRef<\n (CanvasOptions & CanvasBackendOptions) | undefined\n >(undefined);\n\n const stableOpts =\n opts &&\n lastOptsRef.current &&\n shallowEqualOpts(lastOptsRef.current, opts)\n ? lastOptsRef.current\n : (lastOptsRef.current = opts);\n\n const api = useMemo(\n () => new CanvasAPI(builder, stableOpts),\n [builder, stableOpts],\n );\n\n useEffect(() => {\n return () => {\n api.dispose?.();\n };\n }, [api]);\n\n return api;\n}\n\nexport function useCanvasFromExisting(api: CanvasAPI): CanvasAPI {\n return api;\n}\n\nfunction useHydrateEditorSnapshot(api: CanvasAPI, snapshot?: EditorSnapshot) {\n const hydratedRef = useRef<string | null>(null);\n\n useEffect(() => {\n if (!snapshot?.props) return;\n\n const hydrationKey = getSnapshotHydrationKey(snapshot);\n if (hydratedRef.current === hydrationKey) return;\n hydratedRef.current = hydrationKey;\n\n hydrateEditorFromSnapshot(api, snapshot);\n }, [api, snapshot]);\n}\n\nfunction getSnapshotHydrationKey(snapshot: EditorSnapshot): string {\n const meta = snapshot.meta as Record<string, unknown> | undefined;\n\n const preferred =\n meta?.snapshot_id ??\n meta?.snapshotId ??\n meta?.version_id ??\n meta?.versionId ??\n meta?.branch_id ??\n meta?.branchId;\n\n if (preferred != null) {\n return String(preferred);\n }\n\n const layout = snapshot.layout?.canvas;\n const positionKeys = layout?.positions\n ? Object.keys(layout.positions).sort().join(\"|\")\n : \"\";\n const viewport = layout?.viewport\n ? `${layout.viewport.x}:${layout.viewport.y}:${layout.viewport.zoom}`\n : \"\";\n const selection = layout?.selection\n ? Array.from(layout.selection).sort().join(\"|\")\n : \"\";\n const catalogKey = snapshot.catalog\n ? JSON.stringify({\n opened: (snapshot.catalog as any).opened ?? null,\n mode: (snapshot.catalog as any).mode ?? null,\n tab: (snapshot.catalog as any).tab ?? null,\n query: (snapshot.catalog as any).query ?? null,\n })\n : \"\";\n\n return [\n String((snapshot.props?.fields ?? []).length),\n String((snapshot.props?.filters ?? []).length),\n positionKeys,\n viewport,\n selection,\n catalogKey,\n ].join(\"::\");\n}\n\nfunction hydrateEditorFromSnapshot(api: CanvasAPI, snapshot: EditorSnapshot) {\n api.refreshGraph();\n\n hydrateCatalog(api, snapshot);\n hydrateCanvasLayout(api, snapshot.layout?.canvas);\n}\n\nfunction hydrateCatalog(api: CanvasAPI, snapshot: EditorSnapshot) {\n if (snapshot.catalog) {\n api.editor.setCatalog(snapshot.catalog);\n return;\n }\n\n api.editor.clearCatalog();\n}\n\nfunction hydrateCanvasLayout(api: CanvasAPI, canvas?: CanvasState) {\n if (!canvas) return;\n\n if (canvas.positions) {\n api.setPositions(canvas.positions);\n }\n\n if (canvas.viewport) {\n api.setViewport(canvas.viewport);\n }\n\n if (canvas.selection) {\n const ids = Array.isArray(canvas.selection)\n ? canvas.selection\n : Array.from(canvas.selection);\n\n if (ids.length > 0) {\n api.select(ids);\n } else {\n api.clearSelection();\n }\n } else {\n api.clearSelection();\n }\n\n if ((canvas as any).highlighted) {\n const ids = Array.isArray((canvas as any).highlighted)\n ? (canvas as any).highlighted\n : Array.from((canvas as any).highlighted);\n\n api.setHighlighted(ids);\n }\n\n if (\"hoverId\" in canvas) {\n api.setHover((canvas as any).hoverId);\n }\n}\n\nfunction WorkspaceBootScreen({\n boot,\n}: {\n boot: {\n isBooting: boolean;\n totalSections: number;\n completedSections: number;\n sections: Record<\n string,\n {\n status: BootSectionStatus;\n error?: { message?: string } | null;\n }\n >;\n };\n}) {\n const sections = getOrderedBootSections(boot.sections);\n const percent =\n boot.totalSections > 0\n ? (boot.completedSections / boot.totalSections) * 100\n : 0;\n\n return (\n <div className=\"flex min-h-screen items-center justify-center bg-white px-6 py-10 dark:bg-slate-950\">\n <div className=\"w-full max-w-2xl rounded-2xl border border-slate-200 bg-white p-6 shadow-sm dark:border-slate-800 dark:bg-slate-900\">\n <div className=\"mb-5\">\n <div className=\"text-[11px] uppercase tracking-[0.22em] text-slate-400 dark:text-slate-500\">\n Workspace boot\n </div>\n <h2 className=\"mt-1 text-lg font-semibold text-slate-900 dark:text-slate-100\">\n Loading Service Builder\n </h2>\n <p className=\"mt-1 text-sm text-slate-500 dark:text-slate-400\">\n {boot.completedSections} of {boot.totalSections}{\" \"}\n sections completed\n </p>\n </div>\n\n <div className=\"mb-5 h-2 overflow-hidden rounded-full bg-slate-100 dark:bg-slate-800\">\n <div\n className=\"h-full rounded-full bg-blue-600 transition-all\"\n style={{ width: `${percent}%` }}\n />\n </div>\n\n <div className=\"grid gap-2\">\n {sections.map(({ key, status, error }) => (\n <div\n key={key}\n className=\"flex items-center justify-between rounded-xl border border-slate-200 px-3 py-2 dark:border-slate-800\"\n >\n <div className=\"text-sm font-medium text-slate-700 dark:text-slate-200\">\n {formatBootSection(key)}\n </div>\n\n <div className=\"flex items-center gap-2\">\n {error?.message ? (\n <span className=\"max-w-[18rem] truncate text-xs text-rose-500\">\n {error.message}\n </span>\n ) : null}\n <BootStatusBadge status={status} />\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n}\n\nfunction WorkspaceBootOverlay({\n boot,\n}: {\n boot: {\n isBooting: boolean;\n totalSections: number;\n completedSections: number;\n };\n}) {\n if (!boot.isBooting) return null;\n\n return (\n <div className=\"pointer-events-none fixed inset-x-0 top-0 z-50 flex justify-center px-4 pt-3\">\n <div className=\"pointer-events-auto inline-flex items-center gap-3 rounded-full border border-slate-200 bg-white/95 px-4 py-2 text-sm shadow-sm backdrop-blur dark:border-slate-800 dark:bg-slate-900/95\">\n <span className=\"inline-block h-2 w-2 animate-pulse rounded-full bg-blue-600\" />\n <span className=\"text-slate-700 dark:text-slate-200\">\n Refreshing workspace… {boot.completedSections}/\n {boot.totalSections}\n </span>\n </div>\n </div>\n );\n}\n\nfunction CanvasShellPlaceholder() {\n return <div className=\"min-h-screen bg-white dark:bg-slate-950\" />;\n}\n\nfunction BootStatusBadge({ status }: { status: BootSectionStatus }) {\n if (status === \"success\") {\n return (\n <span className=\"rounded-full bg-emerald-50 px-2 py-0.5 text-xs font-medium text-emerald-700 dark:bg-emerald-500/10 dark:text-emerald-300\">\n Loaded\n </span>\n );\n }\n\n if (status === \"error\") {\n return (\n <span className=\"rounded-full bg-rose-50 px-2 py-0.5 text-xs font-medium text-rose-700 dark:bg-rose-500/10 dark:text-rose-300\">\n Failed\n </span>\n );\n }\n\n if (status === \"loading\") {\n return (\n <span className=\"rounded-full bg-blue-50 px-2 py-0.5 text-xs font-medium text-blue-700 dark:bg-blue-500/10 dark:text-blue-300\">\n Loading\n </span>\n );\n }\n\n return (\n <span className=\"rounded-full bg-slate-100 px-2 py-0.5 text-xs font-medium text-slate-600 dark:bg-slate-800 dark:text-slate-300\">\n Pending\n </span>\n );\n}\n\nfunction getOrderedBootSections(\n sections: Record<\n string,\n {\n status: BootSectionStatus;\n error?: { message?: string } | null;\n }\n >,\n) {\n const order = [\n \"authors\",\n \"permissions\",\n \"branches\",\n \"services\",\n \"participants\",\n \"templates\",\n \"snapshotPointers\",\n \"snapshotBody\",\n \"policies\",\n \"comments\",\n ];\n\n return order\n .filter((key) => key in sections)\n .map((key) => ({\n key,\n status: sections[key]?.status ?? \"idle\",\n error: sections[key]?.error ?? null,\n }));\n}\n\nfunction formatBootSection(section: string) {\n switch (section) {\n case \"snapshotPointers\":\n return \"Snapshot pointers\";\n case \"snapshotBody\":\n return \"Snapshot body\";\n default:\n return section.charAt(0).toUpperCase() + section.slice(1);\n }\n}\n\nfunction shallowEqualOpts(\n a?: CanvasOptions & CanvasBackendOptions,\n b?: CanvasOptions & CanvasBackendOptions,\n) {\n if (a === b) return true;\n if (!a || !b) return false;\n\n const aKeys = Object.keys(a) as (keyof (CanvasOptions &\n CanvasBackendOptions))[];\n const bKeys = Object.keys(b) as (keyof (CanvasOptions &\n CanvasBackendOptions))[];\n\n if (aKeys.length !== bKeys.length) return false;\n\n for (const k of aKeys) {\n if ((a as any)[k] !== (b as any)[k]) return false;\n }\n\n return true;\n}\n\nfunction useDevWarnOnOptsChurn(opts?: CanvasOptions & CanvasBackendOptions) {\n const rawRef = useRef<typeof opts>(undefined);\n const churnCountRef = useRef(0);\n const lastWindowStartRef = useRef<number>(Date.now());\n const warnedRef = useRef(false);\n\n useEffect(() => {\n // @ts-ignore\n if (window.SITE?.env === \"production\") return;\n\n const now = Date.now();\n\n if (now - lastWindowStartRef.current > 2000) {\n lastWindowStartRef.current = now;\n churnCountRef.current = 0;\n }\n\n if (rawRef.current !== opts) {\n churnCountRef.current += 1;\n rawRef.current = opts;\n }\n\n if (!warnedRef.current && churnCountRef.current >= 5) {\n warnedRef.current = true;\n console.warn(\n \"[digital-service-ui-builder] useCanvasFromBuilder: `opts` is changing identity frequently. \" +\n \"Wrap your options in useMemo to avoid unnecessary API re-instantiation.\",\n );\n }\n });\n}\n\ntype UseCanvasOwnedReturn = {\n api: CanvasAPI;\n builder: Builder;\n};\n\nexport function useCanvasOwned(\n initialProps?: ServiceProps,\n canvasOpts?: CanvasOptions & CanvasBackendOptions,\n builderOpts?: BuilderOptions,\n): UseCanvasOwnedReturn {\n const builderRef = useRef<Builder>();\n const builderOptsRef = useRef<BuilderOptions | undefined>(builderOpts);\n const loadedOnceRef = useRef<boolean>(false);\n\n if (!builderRef.current) {\n builderRef.current = createBuilder(builderOptsRef.current);\n\n if (initialProps) {\n builderRef.current.load(initialProps);\n loadedOnceRef.current = true;\n }\n // @ts-ignore\n } else if (window.SITE?.env !== \"production\") {\n if (builderOptsRef.current !== builderOpts) {\n console.warn(\n \"[useCanvasOwned] builderOpts changed after init; new values are ignored. \" +\n \"If you need to recreate the builder, remount the hook (e.g. change a React key).\",\n );\n builderOptsRef.current = builderOpts;\n }\n }\n\n const builder = builderRef.current!;\n\n useEffect(() => {\n if (!loadedOnceRef.current && initialProps) {\n builderRef.current!.load(initialProps);\n loadedOnceRef.current = true;\n }\n }, [initialProps]);\n\n const lastCanvasOptsRef = useRef<typeof canvasOpts>();\n\n const stableCanvasOpts = useMemo(() => {\n if (!lastCanvasOptsRef.current) {\n lastCanvasOptsRef.current = canvasOpts;\n return canvasOpts;\n }\n\n const a = canvasOpts ?? {};\n const b = lastCanvasOptsRef.current ?? {};\n const same = Object.keys({ ...a, ...b }).every(\n (k) => (a as any)[k] === (b as any)[k],\n );\n\n if (same) return lastCanvasOptsRef.current;\n\n lastCanvasOptsRef.current = canvasOpts;\n return canvasOpts;\n }, [canvasOpts]);\n\n const api = useMemo(\n () => new CanvasAPI(builder, stableCanvasOpts),\n [builder, stableCanvasOpts],\n );\n\n useEffect(() => {\n return () => {\n api.dispose?.();\n };\n }, [api]);\n\n return { api, builder };\n}\n","// 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 { Builder, normalise } from \"@/core\";\nimport type {\n CatalogId,\n CatalogNode,\n CatalogServiceId,\n CatalogSmartRule,\n Command,\n EditorEvents,\n EditorOptions,\n EditorSnapshot,\n FallbackSettings,\n Field,\n FieldValidationRule,\n ServiceIdRef,\n ServiceCatalogState,\n ServiceProps,\n ServicePropsNotice,\n Tag,\n} from \"@/schema\";\nimport type { CanvasAPI } from \"./api\";\nimport type { PolicyDiagnostic } from \"@/core/policy\";\nimport type {\n DuplicateOptions,\n EditorModuleContext,\n FieldRef,\n NodeRef,\n OptionRef,\n QuantityRule,\n ServiceCheck,\n TagRef,\n WireKind,\n} from \"./editor/editor-types\";\nimport { duplicate } from \"./editor/editor-duplicate\";\nimport { addNotice, removeNotice, updateNotice } from \"./editor/editor-notices\";\nimport {\n addField,\n addOption,\n addTag,\n editLabel,\n editName,\n getNode,\n reLabel,\n remove,\n removeField,\n removeOption,\n removeTag,\n setFieldName,\n setService,\n updateField,\n updateOption,\n updateTag,\n} from \"./editor/editor-nodes\";\nimport {\n clearConstraint,\n clearConstraintOverride,\n setConstraint,\n} from \"./editor/editor-constraints\";\nimport {\n clearFieldQuantityRule,\n clearFieldValidation,\n getFieldQuantityRule,\n getFieldValidation,\n setFieldQuantityRule,\n setFieldValidation,\n} from \"./editor/editor-field-rules\";\nimport {\n connect,\n disconnect,\n exclude,\n include,\n} from \"./editor/editor-relations\";\nimport { filterServicesForVisibleGroup } from \"./editor/editor-service-filter\";\nimport { genId, uniqueId, uniqueOptionId } from \"./editor/editor-ids\";\nimport { placeNode, placeOption } from \"./editor/editor-placement\";\nimport {\n addCatalogGroup,\n addSmartCatalogGroup,\n assignServicesToCatalogGroup,\n createEmptyCatalog,\n moveCatalogNode as moveCatalogNodeState,\n removeCatalogNode as removeCatalogNodeState,\n resolveSmartCatalogGroup,\n setActiveCatalogNode as setActiveCatalogNodeState,\n setCatalogExpanded,\n setCatalogViewMode,\n setSelectedCatalogService,\n toggleCatalogExpanded,\n toggleCatalogPinned,\n updateCatalogNode as updateCatalogNodeState,\n} from \"./editor/editor-catalog\";\n\nconst MAX_LIMIT = 100;\n\nexport type { TagRef, FieldRef, OptionRef, NodeRef, DuplicateOptions };\n\nexport class Editor {\n private readonly builder: Builder;\n private readonly api: CanvasAPI;\n private readonly opts: Required<EditorOptions>;\n private history: EditorSnapshot[] = [];\n private index = -1;\n private txnDepth = 0;\n private txnLabel?: string;\n private stagedBefore?: EditorSnapshot;\n private _lastPolicyDiagnostics?: PolicyDiagnostic[];\n private catalog?: ServiceCatalogState;\n\n constructor(builder: Builder, api: CanvasAPI, opts: EditorOptions = {}) {\n this.builder = builder;\n this.api = api;\n // @ts-ignore\n this.opts = {\n ...opts,\n historyLimit: Math.max(\n 1,\n Math.min(opts.historyLimit ?? MAX_LIMIT, 1000),\n ),\n validateAfterEach: opts.validateAfterEach ?? false,\n };\n this.pushHistory(this.makeSnapshot(\"init\"));\n }\n\n isTagId(id: string) {\n return this.builder.isTagId(id);\n }\n\n isFieldId(id: string) {\n return this.builder.isFieldId(id);\n }\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);\n } else if (this.stagedBefore) {\n this.loadSnapshot(this.stagedBefore, \"undo\");\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 duplicate(ref: NodeRef, opts: DuplicateOptions = {}): string {\n return duplicate(this.moduleCtx(), ref, opts);\n }\n\n reLabel(id: string, nextLabel: string): void {\n return reLabel(this.moduleCtx(), id, nextLabel);\n }\n\n setFieldName(fieldId: string, nextName: string | null | undefined): void {\n return setFieldName(this.moduleCtx(), fieldId, nextName);\n }\n\n getLastPolicyDiagnostics(): PolicyDiagnostic[] | undefined {\n return this._lastPolicyDiagnostics;\n }\n\n placeNode(\n id: string,\n opts: {\n scopeTagId?: string;\n beforeId?: string;\n afterId?: string;\n index?: number;\n },\n ) {\n return placeNode(this.moduleCtx(), id, opts);\n }\n\n placeOption(\n optionId: string,\n opts: { beforeId?: string; afterId?: string; index?: number },\n ) {\n return placeOption(this.moduleCtx(), optionId, opts);\n }\n\n addOption(\n fieldId: string,\n input: {\n id?: string;\n label: string;\n service_id?: ServiceIdRef;\n pricing_role?: \"base\" | \"utility\" | \"addon\";\n [k: string]: any;\n },\n ): string {\n return addOption(this.moduleCtx(), fieldId, input);\n }\n\n updateOption(\n optionId: string,\n patch: Partial<\n {\n label: string;\n service_id: ServiceIdRef;\n pricing_role: \"base\" | \"utility\" | \"addon\";\n } & Record<string, any>\n >,\n ) {\n return updateOption(this.moduleCtx(), optionId, patch);\n }\n\n removeOption(optionId: string) {\n return removeOption(this.moduleCtx(), optionId);\n }\n\n editLabel(id: string, label: string): void {\n return editLabel(this.moduleCtx(), id, label);\n }\n\n editName(fieldId: string, name: string | undefined) {\n return editName(this.moduleCtx(), fieldId, name);\n }\n\n setService(\n id: string,\n input: { service_id?: ServiceIdRef; pricing_role?: \"base\" | \"utility\" },\n ): void {\n return setService(this.moduleCtx(), id, input);\n }\n\n addTag(\n partial: Omit<Tag, \"id\" | \"label\"> & { id?: string; label: string },\n ) {\n return addTag(this.moduleCtx(), partial);\n }\n\n updateTag(id: string, patch: Partial<Tag>) {\n return updateTag(this.moduleCtx(), id, patch);\n }\n\n removeTag(id: string) {\n return removeTag(this.moduleCtx(), id);\n }\n\n addNotice(input: Omit<ServicePropsNotice, \"id\"> & { id?: string }): string {\n return addNotice(this.moduleCtx(), input);\n }\n\n updateNotice(id: string, patch: Partial<ServicePropsNotice>): void {\n return updateNotice(this.moduleCtx(), id, patch);\n }\n\n removeNotice(id: string): void {\n return removeNotice(this.moduleCtx(), id);\n }\n\n addField(\n partial: Omit<Field, \"id\" | \"label\" | \"type\"> & {\n id?: string;\n label: string;\n type: Field[\"type\"];\n },\n ) {\n return addField(this.moduleCtx(), partial);\n }\n\n updateField(id: string, patch: Partial<Field>) {\n return updateField(this.moduleCtx(), id, patch);\n }\n\n removeField(id: string) {\n return removeField(this.moduleCtx(), id);\n }\n\n remove(id: string) {\n return remove(this.moduleCtx(), id);\n }\n\n getNode(id: string) {\n return getNode(this.moduleCtx(), id);\n }\n\n getFieldQuantityRule(id: string): QuantityRule | undefined {\n return getFieldQuantityRule(this.moduleCtx(), id);\n }\n\n setFieldQuantityRule(id: string, rule: unknown): void {\n return setFieldQuantityRule(this.moduleCtx(), id, rule);\n }\n\n clearFieldQuantityRule(id: string): void {\n return clearFieldQuantityRule(this.moduleCtx(), id);\n }\n\n include(receiverId: string, idOrIds: string | string[]) {\n return include(this.moduleCtx(), receiverId, idOrIds);\n }\n\n exclude(receiverId: string, idOrIds: string | string[]) {\n return exclude(this.moduleCtx(), receiverId, idOrIds);\n }\n\n connect(kind: WireKind, fromId: string, toId: string): void {\n return connect(this.moduleCtx(), kind, fromId, toId);\n }\n\n disconnect(kind: WireKind, fromId: string, toId: string): void {\n return disconnect(this.moduleCtx(), kind, fromId, toId);\n }\n\n setConstraint(tagId: string, flag: string, value: boolean | undefined) {\n return setConstraint(this.moduleCtx(), tagId, flag, value);\n }\n\n clearConstraintOverride(tagId: string, flag: string) {\n return clearConstraintOverride(this.moduleCtx(), tagId, flag);\n }\n\n clearConstraint(tagId: string, flag: string) {\n return clearConstraint(this.moduleCtx(), tagId, flag);\n }\n\n getFieldValidation(id: string): FieldValidationRule[] | undefined {\n return getFieldValidation(this.moduleCtx(), id);\n }\n\n setFieldValidation(id: string, rules: unknown): void {\n return setFieldValidation(this.moduleCtx(), id, rules);\n }\n\n clearFieldValidation(id: string): void {\n return clearFieldValidation(this.moduleCtx(), id);\n }\n\n getCatalog(): ServiceCatalogState | undefined {\n return cloneDeep(this.catalog);\n }\n\n setCatalog(next?: ServiceCatalogState): void {\n this.replaceCatalog(next, \"catalog:set\");\n }\n\n clearCatalog(): void {\n this.replaceCatalog(undefined, \"catalog:clear\");\n }\n\n ensureCatalog(): ServiceCatalogState {\n const next = this.catalog\n ? cloneDeep(this.catalog)\n : createEmptyCatalog();\n this.catalog = cloneDeep(next);\n return next;\n }\n\n createCatalogGroup(input: {\n id?: string;\n label: string;\n parentId?: string;\n description?: string;\n serviceIds?: CatalogServiceId[];\n collapsed?: boolean;\n order?: number;\n color?: string;\n icon?: string;\n }): string {\n const next = addCatalogGroup(this.catalog, input);\n this.replaceCatalog(next, \"catalog:create-group\");\n return next.activeNodeId!;\n }\n\n createSmartCatalogGroup(input: {\n id?: string;\n label: string;\n parentId?: string;\n description?: string;\n rules: CatalogSmartRule[];\n match?: \"all\" | \"any\";\n collapsed?: boolean;\n order?: number;\n color?: string;\n icon?: string;\n }): string {\n const next = addSmartCatalogGroup(this.catalog, input);\n this.replaceCatalog(next, \"catalog:create-smart-group\");\n return next.activeNodeId!;\n }\n\n updateCatalogNode(\n id: CatalogId,\n patch: Partial<Omit<CatalogNode, \"id\" | \"kind\">>,\n ): void {\n this.replaceCatalog(\n updateCatalogNodeState(this.catalog, id, patch),\n \"catalog:update-node\",\n );\n }\n\n removeCatalogNode(id: CatalogId, opts?: { cascade?: boolean }): void {\n this.replaceCatalog(\n removeCatalogNodeState(this.catalog, id, opts),\n \"catalog:remove-node\",\n );\n }\n\n moveCatalogNode(\n nodeId: CatalogId,\n opts: {\n parentId?: CatalogId;\n beforeId?: CatalogId;\n afterId?: CatalogId;\n index?: number;\n },\n ): void {\n this.replaceCatalog(\n moveCatalogNodeState(this.catalog, nodeId, opts),\n \"catalog:move-node\",\n );\n }\n\n assignServicesToCatalogGroup(\n nodeId: CatalogId,\n serviceIds: CatalogServiceId[],\n mode: \"append\" | \"replace\" | \"remove\" = \"append\",\n ): void {\n this.replaceCatalog(\n assignServicesToCatalogGroup(\n this.catalog,\n nodeId,\n serviceIds,\n mode,\n ),\n \"catalog:assign-services\",\n );\n }\n\n setActiveCatalogNode(id?: CatalogId): void {\n const next = setActiveCatalogNodeState(this.catalog, id);\n this.catalog = cloneDeep(next);\n\n this.emit(\n \"catalog:active-change\" as any,\n {\n activeNodeId: id,\n } as any,\n );\n\n this.emit(\n \"catalog:change\" as any,\n {\n catalog: cloneDeep(this.catalog),\n reason: \"catalog:set-active\",\n } as any,\n );\n }\n\n setCatalogViewMode(mode: ServiceCatalogState[\"viewMode\"]): void {\n this.replaceCatalog(\n setCatalogViewMode(this.catalog, mode),\n \"catalog:set-view-mode\",\n );\n }\n\n setSelectedCatalogService(serviceId?: CatalogServiceId): void {\n this.replaceCatalog(\n setSelectedCatalogService(this.catalog, serviceId),\n \"catalog:set-selected-service\",\n );\n }\n\n toggleCatalogExpanded(id: CatalogId): void {\n this.replaceCatalog(\n toggleCatalogExpanded(this.catalog, id),\n \"catalog:toggle-expanded\",\n );\n }\n\n setCatalogExpanded(id: CatalogId, expanded: boolean): void {\n this.replaceCatalog(\n setCatalogExpanded(this.catalog, id, expanded),\n \"catalog:set-expanded\",\n );\n }\n\n toggleCatalogPinned(id: CatalogId): void {\n this.replaceCatalog(\n toggleCatalogPinned(this.catalog, id),\n \"catalog:toggle-pinned\",\n );\n }\n\n resolveSmartCatalogGroup(\n nodeId: CatalogId,\n candidates: CatalogServiceId[],\n matchers: {\n serviceField?: (\n candidate: CatalogServiceId,\n rule: Extract<CatalogSmartRule, { type: \"service-field\" }>,\n ) => boolean;\n policyFamily?: (\n candidate: CatalogServiceId,\n rule: Extract<CatalogSmartRule, { type: \"policy-family\" }>,\n ) => boolean;\n compatibility?: (\n candidate: CatalogServiceId,\n rule: Extract<CatalogSmartRule, { type: \"compatibility\" }>,\n ) => boolean;\n },\n ): CatalogServiceId[] {\n const next = resolveSmartCatalogGroup(\n this.catalog,\n nodeId,\n candidates,\n matchers,\n );\n\n this.replaceCatalog(next, \"catalog:resolve-smart-group\");\n\n const node = next?.nodes.find(\n (x) => x.id === nodeId && x.kind === \"smart-group\",\n ) as Extract<CatalogNode, { kind: \"smart-group\" }> | undefined;\n\n return node?.resolvedServiceIds?.slice() ?? [];\n }\n\n private replaceCatalog(\n next: ServiceCatalogState | undefined,\n reason = \"catalog:set\",\n ) {\n this.catalog = cloneDeep(next);\n this.emit(\n \"catalog:change\" as any,\n {\n catalog: cloneDeep(this.catalog),\n snapshot: this.makeSnapshot(reason),\n reason,\n } as any,\n );\n }\n private replaceProps(next: ServiceProps): void {\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;\n const snap = this.makeSnapshot(command);\n this.pushHistory(snap);\n this.emit(\"editor:command\", { name: command });\n if (this.opts.validateAfterEach) {\n this.emit(\"editor:change\", {\n props: snap.props,\n reason: \"validate\",\n command,\n snapshot: snap,\n });\n } else {\n this.emit(\"editor:change\", {\n props: snap.props,\n reason: \"mutation\",\n command,\n snapshot: snap,\n });\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 snapshot: snap,\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 catalog: cloneDeep(this.catalog),\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 }\n } else {\n this.api.refreshGraph();\n }\n this.emit(\"editor:change\", { props: s.props, reason, snapshot: s });\n }\n\n private pushHistory(snap: EditorSnapshot) {\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 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 private emit<K extends keyof (EditorEvents & any)>(\n event: K,\n payload: (EditorEvents & any)[K],\n ) {\n this.api.emit(event as any, payload as any);\n }\n\n public filterServicesForVisibleGroup(\n candidates: Array<number | string>,\n ctx: {\n tagId: string;\n selectedButtons?: 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 return filterServicesForVisibleGroup(this.moduleCtx(), candidates, ctx);\n }\n\n private moduleCtx(): EditorModuleContext {\n return {\n builder: this.builder,\n api: this.api,\n opts: this.opts,\n getProps: () => this.builder.getProps(),\n isTagId: (id) => this.isTagId(id),\n isFieldId: (id) => this.isFieldId(id),\n isOptionId: (id) => this.isOptionId(id),\n transact: (label, fn) => this.transact(label, fn),\n exec: (cmd) => this.exec(cmd),\n undo: () => this.undo(),\n patchProps: (mut) => this.patchProps(mut),\n replaceProps: (next) => this.replaceProps(next),\n emit: (event, payload) => this.emit(event, payload),\n makeSnapshot: (why) => this.makeSnapshot(why),\n loadSnapshot: (s, reason) => this.loadSnapshot(s, reason),\n getNode: (id) => getNode(this.moduleCtx(), id),\n uniqueId: (base) => uniqueId(this.moduleCtx(), base),\n uniqueOptionId: (fieldId, base) =>\n uniqueOptionId(this.moduleCtx(), fieldId, base),\n genId: (prefix) => genId(this.moduleCtx(), prefix as any),\n setLastPolicyDiagnostics: (value) => {\n this._lastPolicyDiagnostics = value;\n },\n };\n }\n}\n","// src/core/normalise.ts\n\nimport { cloneDeep } from \"lodash-es\";\nimport type {\n Field,\n FieldOption,\n FieldValidationRule,\n PricingRole,\n ServiceFallback,\n ServiceIdRef,\n ServiceProps,\n ServicePropsNotice,\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 const notices = toNoticeArray((obj as any).notices);\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 ...(notices.length > 0 && { notices }),\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 = toServiceIdOrUndefined(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 const validation = normalizeFieldValidation(src.validation);\n\n // field-level service_id is allowed only for *buttons* with base role\n const field_service_id_raw = toServiceIdOrUndefined(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 ...(validation && { validation }),\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 = toServiceIdOrUndefined(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 toNoticeArray(v: any): ServicePropsNotice[] {\n if (!Array.isArray(v)) return [];\n return v\n .filter((item) => item && typeof item === \"object\")\n .map((item) => cloneDeep(item as ServicePropsNotice));\n}\n\nfunction toServiceIdOrUndefined(v: any): ServiceIdRef | undefined {\n if (v === null || v === undefined) return undefined;\n if (typeof v === \"number\") {\n return Number.isFinite(v) ? v : undefined;\n }\n if (typeof v === \"string\") {\n const trimmed = v.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n return 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\n\nfunction normalizeFieldValidationRule(\n input: unknown,\n): FieldValidationRule | undefined {\n if (!input || typeof input !== \"object\") return undefined;\n const v = input as any;\n\n const op = v.op;\n if (\n op !== \"eq\" &&\n op !== \"neq\" &&\n op !== \"gt\" &&\n op !== \"gte\" &&\n op !== \"lt\" &&\n op !== \"lte\" &&\n op !== \"between\" &&\n op !== \"in\" &&\n op !== \"nin\" &&\n op !== \"truthy\" &&\n op !== \"falsy\" &&\n op !== \"match\"\n ) {\n return undefined;\n }\n\n const valueBy =\n v.valueBy === \"value\" || v.valueBy === \"length\" || v.valueBy === \"eval\"\n ? v.valueBy\n : undefined;\n\n const out: FieldValidationRule = {\n op,\n ...(valueBy ? { valueBy } : {}),\n };\n\n if (\"value\" in v) out.value = v.value;\n if (typeof v.min === \"number\" && Number.isFinite(v.min)) out.min = v.min;\n if (typeof v.max === \"number\" && Number.isFinite(v.max)) out.max = v.max;\n if (Array.isArray(v.values)) out.values = [...v.values];\n if (typeof v.pattern === \"string\" && v.pattern.trim()) out.pattern = v.pattern;\n if (typeof v.flags === \"string\") out.flags = v.flags;\n if (typeof v.message === \"string\" && v.message.trim()) out.message = v.message;\n\n if (valueBy === \"eval\" && typeof v.code === \"string\" && v.code.trim()) {\n out.code = v.code;\n }\n\n return out;\n}\n\nexport function normalizeFieldValidation(\n input: unknown,\n): FieldValidationRule[] | undefined {\n if (Array.isArray(input)) {\n const rules = input\n .map(normalizeFieldValidationRule)\n .filter(Boolean) as FieldValidationRule[];\n return rules.length ? rules : undefined;\n }\n\n const one = normalizeFieldValidationRule(input);\n return one ? [one] : undefined;\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 invalidRateFieldIds: Set<string>;\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 isServiceIdRef(v: unknown): v is import(\"@/schema\").ServiceIdRef {\n return (\n (typeof v === \"string\" && v.trim().length > 0) ||\n (typeof v === \"number\" && Number.isFinite(v))\n );\n}\n\nexport function hasAnyServiceOption(f: Field): boolean {\n return (f.options ?? []).some((o) => isServiceIdRef(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 { isServiceIdRef, 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 (!isServiceIdRef(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, isServiceIdRef, 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 = isServiceIdRef(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","import type {\n DgpServiceCapability,\n DgpServiceMap,\n ServiceIdRef,\n} from \"@/schema\";\nimport type { FallbackSettings, RatePolicy } from \"@/schema/validation\";\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(\n svcMap: DgpServiceMap,\n candidate: ServiceIdRef,\n constraints: Partial<Record<\"refill\" | \"cancel\" | \"dripfeed\", boolean>>,\n): boolean {\n const cap = getServiceCapability(svcMap, candidate);\n if (!cap) return false;\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}\n\nexport function getServiceCapability(\n svcMap: DgpServiceMap,\n candidate: ServiceIdRef | undefined,\n): DgpServiceCapability | undefined {\n if (candidate === undefined || candidate === null) return undefined;\n\n const direct = (svcMap as any)[candidate] as DgpServiceCapability | undefined;\n if (direct) return direct;\n\n const byString = (svcMap as any)[String(candidate)] as\n | DgpServiceCapability\n | undefined;\n if (byString) return byString;\n\n if (typeof candidate === \"string\") {\n const maybeNumber = Number(candidate);\n if (Number.isFinite(maybeNumber)) {\n return (svcMap as any)[maybeNumber] as DgpServiceCapability | undefined;\n }\n }\n\n return undefined;\n}\n\nexport function normalizeRatePolicy(policy: RatePolicy | undefined): RatePolicy {\n if (!policy) return { kind: \"lte_primary\", pct: 5 };\n if (policy.kind === \"eq_primary\") return policy;\n const pct = Math.max(0, Number(policy.pct ?? 0));\n return { ...policy, pct };\n}\n\nexport function passesRatePolicy(\n policy: RatePolicy | undefined,\n primaryRate: number,\n candidateRate: number,\n): boolean {\n if (!Number.isFinite(primaryRate) || !Number.isFinite(candidateRate)) {\n return false;\n }\n\n const rp = normalizeRatePolicy(policy);\n switch (rp.kind) {\n case \"eq_primary\":\n return candidateRate === primaryRate;\n case \"lte_primary\": {\n const floor = primaryRate * (1 - rp.pct / 100);\n return candidateRate <= primaryRate && candidateRate >= floor;\n }\n case \"within_pct\":\n return candidateRate <= primaryRate * (1 + rp.pct / 100);\n case \"at_least_pct_lower\":\n return candidateRate <= primaryRate * (1 - rp.pct / 100);\n }\n}\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(\n svcMap: DgpServiceMap,\n candidate: ServiceIdRef,\n primary: ServiceIdRef,\n policy: FallbackSettings,\n): boolean {\n const cand = getServiceCapability(svcMap, candidate);\n const prim = getServiceCapability(svcMap, primary);\n if (!cand || !prim) return false;\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 return passesRatePolicy(policy.ratePolicy, pRate, cRate);\n}\n","// src/core/validate/steps/rates.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { isServiceIdRef, withAffected } from \"../shared\";\nimport { isMultiField } from \"@/utils\";\nimport {\n getServiceCapability,\n normalizeRatePolicy,\n passesRatePolicy,\n} from \"@/utils/util\";\n\nexport function validateRates(v: ValidationCtx): void {\n const ratePolicy = normalizeRatePolicy(\n v.options.fallbackSettings?.ratePolicy,\n );\n\n for (const f of v.fields) {\n if (!isMultiField(f)) continue;\n\n const baseRates: Array<{ optionId: string; serviceId: string; rate: number }> =\n [];\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 (!isServiceIdRef(sid)) continue;\n\n const cap = getServiceCapability(v.serviceMap, sid);\n const rate = cap?.rate;\n if (typeof rate === \"number\" && Number.isFinite(rate)) {\n baseRates.push({\n optionId: o.id,\n serviceId: String(sid),\n rate,\n });\n }\n }\n\n if (baseRates.length <= 1) continue;\n\n const primary = baseRates.reduce((best, current) =>\n current.rate > best.rate ? current : best,\n );\n\n const offenders = baseRates.filter(\n (candidate) =>\n candidate.optionId !== primary.optionId &&\n !passesRatePolicy(ratePolicy, primary.rate, candidate.rate),\n );\n\n if (offenders.length > 0) {\n v.invalidRateFieldIds.add(f.id);\n const affectedIds: string[] = [\n f.id,\n ...baseRates.map((entry) => entry.optionId),\n ];\n\n v.errors.push({\n code: \"rate_mismatch_across_base\",\n severity: \"error\",\n message: `Base options under field \"${f.id}\" violate rate policy \"${ratePolicy.kind}\".`,\n nodeId: f.id,\n details: withAffected(\n {\n fieldId: f.id,\n policy: ratePolicy.kind,\n policyPct: \"pct\" in ratePolicy ? ratePolicy.pct : undefined,\n primaryOptionId: primary.optionId,\n primaryRate: primary.rate,\n rates: baseRates.map((entry) => entry.rate),\n optionIds: baseRates.map((entry) => entry.optionId),\n offenderOptionIds: offenders.map((entry) => entry.optionId),\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 isServiceIdRef,\n isServiceFlagEnabled,\n withAffected, // <-- your helper (adjust name/import if you named it differently)\n} from \"../shared\";\nimport { getServiceCapability } from \"@/utils/util\";\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 (!isServiceIdRef(o.service_id)) continue;\n\n const svc: unknown = getServiceCapability(v.serviceMap, 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 (!isServiceIdRef(sid)) continue;\n\n const svc: unknown = getServiceCapability(v.serviceMap, 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 { isServiceIdRef } 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 (!isServiceIdRef(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/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\";\nimport {cloneDeep} from \"lodash-es\";\n\n/** Options you can set on the builder (used for validation/visibility) */\nexport type BuilderOptions = Omit<ValidatorOptions, \"serviceMap\"> & {\n serviceMap?: DgpServiceMap;\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 /** 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 _nodemap: NodeMap | null = null;\n\n constructor(opts: BuilderOptions = {}) {\n this.options = { ...opts };\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.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 getOptions() {\n return cloneDeep(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 /* ───── 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\n/* ───────────────────────── helpers ───────────────────────── */\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","import type {\n DgpServiceMap,\n Field,\n PricingRole,\n ServiceIdRef,\n ServiceProps,\n Tag,\n} from \"@/schema\";\nimport type { RatePolicy } from \"@/schema/validation\";\nimport { Builder } from \"./builder\";\nimport {\n getServiceCapability,\n normalizeRatePolicy,\n passesRatePolicy,\n} from \"@/utils/util\";\nimport { isMultiField } from \"@/utils\";\n\ntype BaseMember = {\n kind: \"field\" | \"option\";\n id: string;\n fieldId: string;\n label?: string;\n service_id: ServiceIdRef;\n rate: number;\n};\n\ntype FieldReference = {\n refKind: \"single\" | \"multi\";\n nodeId: string;\n fieldId: string;\n label?: string;\n rate: number;\n service_id?: ServiceIdRef;\n members: BaseMember[];\n};\n\ntype Anchor = {\n kind: \"field\" | \"option\";\n id: string;\n fieldId: string;\n label?: string;\n};\n\ntype SimulationAnchor = {\n kind: \"field\" | \"option\";\n id: string;\n fieldId: string;\n label?: string;\n};\n\ntype SharedDiagnostic = {\n scope: \"visible_group\";\n tagId: string;\n nodeId: string;\n message: string;\n simulationAnchor?: SimulationAnchor;\n invalidFieldIds: string[];\n};\n\nexport type RateCoherenceDiagnostic =\n | (SharedDiagnostic & {\n kind: \"contextual\";\n primary: {\n nodeId: string;\n fieldId: string;\n label?: string;\n refKind: \"single\" | \"multi\";\n service_id?: ServiceIdRef;\n rate: number;\n };\n offender: {\n nodeId: string;\n fieldId: string;\n label?: string;\n refKind: \"single\" | \"multi\";\n service_id?: ServiceIdRef;\n rate: number;\n };\n policy: RatePolicy[\"kind\"];\n policyPct?: number;\n })\n | (SharedDiagnostic & {\n kind: \"internal_field\";\n fieldId: string;\n });\n\nexport function validateRateCoherenceDeep(params: {\n builder: Builder;\n services: DgpServiceMap;\n tagId: string;\n ratePolicy?: RatePolicy;\n invalidFieldIds?: Iterable<string>;\n}): RateCoherenceDiagnostic[] {\n const { builder, services, tagId } = params;\n const ratePolicy = normalizeRatePolicy(params.ratePolicy);\n const props = builder.getProps() as ServiceProps;\n const invalidFieldIds = new Set(params.invalidFieldIds ?? []);\n\n const fields = props.fields ?? [];\n const fieldById = new Map(fields.map((f) => [f.id, f]));\n const tagById = new Map((props.filters ?? []).map((t) => [t.id, t]));\n const tag = tagById.get(tagId);\n\n const baselineFieldIds = builder.visibleFields(tagId, []);\n const baselineFields = baselineFieldIds\n .map((fid) => fieldById.get(fid))\n .filter(Boolean) as Field[];\n\n const anchors = collectAnchors(baselineFields);\n const diagnostics: RateCoherenceDiagnostic[] = [];\n const seen = new Set<string>();\n\n for (const anchor of anchors) {\n const selectedKeys =\n anchor.kind === \"option\"\n ? [`${anchor.fieldId}::${anchor.id}`]\n : [anchor.fieldId];\n\n const visibleFields = builder\n .visibleFields(tagId, selectedKeys)\n .map((fid) => fieldById.get(fid))\n .filter(Boolean) as Field[];\n\n const visibleInvalidFieldIds = visibleFields\n .map((field) => field.id)\n .filter((fieldId) => invalidFieldIds.has(fieldId));\n\n for (const fieldId of visibleInvalidFieldIds) {\n const key = `internal|${tagId}|${fieldId}`;\n if (seen.has(key)) continue;\n seen.add(key);\n diagnostics.push({\n kind: \"internal_field\",\n scope: \"visible_group\",\n tagId,\n fieldId,\n nodeId: fieldId,\n message: `Field \"${fieldId}\" is internally invalid under rate policy \"${ratePolicy.kind}\".`,\n simulationAnchor: {\n kind: anchor.kind,\n id: anchor.id,\n fieldId: anchor.fieldId,\n label: anchor.label,\n },\n invalidFieldIds: [fieldId],\n });\n }\n\n const references = visibleFields.flatMap((field) =>\n collectFieldReferences(field, services),\n );\n if (references.length <= 1) continue;\n\n const primary = references.reduce((best, current) => {\n if (current.rate !== best.rate) {\n return current.rate > best.rate ? current : best;\n }\n const bestKey = `${best.fieldId}|${best.nodeId}`;\n const currentKey = `${current.fieldId}|${current.nodeId}`;\n return currentKey < bestKey ? current : best;\n });\n\n for (const candidate of references) {\n if (candidate.nodeId === primary.nodeId) continue;\n if (candidate.fieldId === primary.fieldId) continue;\n if (passesRatePolicy(ratePolicy, primary.rate, candidate.rate)) {\n continue;\n }\n\n const key = contextualKey(tagId, primary, candidate, ratePolicy);\n if (seen.has(key)) continue;\n seen.add(key);\n\n diagnostics.push({\n kind: \"contextual\",\n scope: \"visible_group\",\n tagId,\n nodeId: candidate.nodeId,\n primary: toDiagnosticRef(primary),\n offender: toDiagnosticRef(candidate),\n policy: ratePolicy.kind,\n policyPct: \"pct\" in ratePolicy ? ratePolicy.pct : undefined,\n message: explainRateMismatch(\n ratePolicy,\n primary,\n candidate,\n describeLabel(tag),\n ),\n simulationAnchor: {\n kind: anchor.kind,\n id: anchor.id,\n fieldId: anchor.fieldId,\n label: anchor.label,\n },\n invalidFieldIds: visibleInvalidFieldIds,\n });\n }\n }\n\n return diagnostics;\n}\n\nfunction collectAnchors(fields: Field[]): Anchor[] {\n const anchors: Anchor[] = [];\n\n for (const field of fields) {\n if (!isButton(field)) continue;\n\n if (Array.isArray(field.options) && field.options.length > 0) {\n for (const option of field.options) {\n anchors.push({\n kind: \"option\",\n id: option.id,\n fieldId: field.id,\n label: option.label ?? option.id,\n });\n }\n continue;\n }\n\n anchors.push({\n kind: \"field\",\n id: field.id,\n fieldId: field.id,\n label: field.label ?? field.id,\n });\n }\n\n return anchors;\n}\n\nfunction collectFieldReferences(\n field: Field,\n services: DgpServiceMap,\n): FieldReference[] {\n const members = collectBaseMembers(field, services);\n if (members.length === 0) return [];\n\n if (isMultiField(field)) {\n const averageRate =\n members.reduce((sum, member) => sum + member.rate, 0) /\n members.length;\n return [\n {\n refKind: \"multi\",\n nodeId: field.id,\n fieldId: field.id,\n label: field.label ?? field.id,\n rate: averageRate,\n members,\n },\n ];\n }\n\n return members.map((member) => ({\n refKind: \"single\",\n nodeId: member.id,\n fieldId: field.id,\n label: member.label,\n rate: member.rate,\n service_id: member.service_id,\n members: [member],\n }));\n}\n\nfunction collectBaseMembers(\n field: Field,\n services: DgpServiceMap,\n): BaseMember[] {\n const members: BaseMember[] = [];\n\n if (Array.isArray(field.options) && field.options.length > 0) {\n for (const option of field.options) {\n const role = normalizeRole(option.pricing_role ?? field.pricing_role, \"base\");\n if (role !== \"base\") continue;\n if (option.service_id === undefined || option.service_id === null) {\n continue;\n }\n const cap = getServiceCapability(services, option.service_id);\n if (!cap || typeof cap.rate !== \"number\" || !Number.isFinite(cap.rate)) {\n continue;\n }\n members.push({\n kind: \"option\",\n id: option.id,\n fieldId: field.id,\n label: option.label ?? option.id,\n service_id: option.service_id,\n rate: cap.rate,\n });\n }\n return members;\n }\n\n const role = normalizeRole(field.pricing_role, \"base\");\n if (role !== \"base\") return members;\n if (field.service_id === undefined || field.service_id === null) return members;\n\n const cap = getServiceCapability(services, field.service_id);\n if (!cap || typeof cap.rate !== \"number\" || !Number.isFinite(cap.rate)) {\n return members;\n }\n\n members.push({\n kind: \"field\",\n id: field.id,\n fieldId: field.id,\n label: field.label ?? field.id,\n service_id: field.service_id,\n rate: cap.rate,\n });\n return members;\n}\n\nfunction isButton(field: Field): boolean {\n if ((field as any).button === true) return true;\n return Array.isArray(field.options) && field.options.length > 0;\n}\n\nfunction normalizeRole(\n role: PricingRole | undefined,\n fallback: PricingRole,\n): PricingRole {\n return role === \"base\" || role === \"utility\" ? role : fallback;\n}\n\nfunction toDiagnosticRef(reference: FieldReference) {\n return {\n nodeId: reference.nodeId,\n fieldId: reference.fieldId,\n label: reference.label,\n refKind: reference.refKind,\n service_id: reference.service_id,\n rate: reference.rate,\n };\n}\n\nfunction contextualKey(\n tagId: string,\n primary: FieldReference,\n candidate: FieldReference,\n ratePolicy: RatePolicy,\n): string {\n const pctKey = \"pct\" in ratePolicy ? `:${ratePolicy.pct}` : \"\";\n return [\n \"contextual\",\n tagId,\n primary.fieldId,\n primary.nodeId,\n candidate.fieldId,\n candidate.nodeId,\n `${ratePolicy.kind}${pctKey}`,\n ].join(\"|\");\n}\n\nfunction describeLabel(tag?: Tag): string {\n return tag?.label ?? tag?.id ?? \"tag\";\n}\n\nfunction explainRateMismatch(\n policy: RatePolicy,\n primary: FieldReference,\n candidate: FieldReference,\n where: string,\n): string {\n const primaryLabel = `${primary.label ?? primary.nodeId} (${primary.rate})`;\n const candidateLabel = `${candidate.label ?? candidate.nodeId} (${candidate.rate})`;\n\n switch (policy.kind) {\n case \"eq_primary\":\n return `Rate coherence failed (${where}): ${candidateLabel} must exactly match ${primaryLabel}.`;\n case \"lte_primary\":\n return `Rate coherence failed (${where}): ${candidateLabel} must stay within ${policy.pct}% below and never above ${primaryLabel}.`;\n case \"within_pct\":\n return `Rate coherence failed (${where}): ${candidateLabel} must be within ${policy.pct}% of ${primaryLabel}.`;\n case \"at_least_pct_lower\":\n return `Rate coherence failed (${where}): ${candidateLabel} must be at least ${policy.pct}% lower than ${primaryLabel}.`;\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\";\nimport { createBuilder } from \"@/core/builder\";\nimport { validateRateCoherenceDeep } from \"@/core/rate-coherence\";\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 invalidRateFieldIds: new Set<string>(),\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 if (Object.keys(serviceMap).length > 0 && tags.length > 0) {\n const builder = createBuilder({ serviceMap });\n builder.load(props);\n\n for (const tag of tags) {\n const diags = validateRateCoherenceDeep({\n builder,\n services: serviceMap,\n tagId: tag.id,\n ratePolicy: ctx.fallbackSettings?.ratePolicy,\n invalidFieldIds: v.invalidRateFieldIds,\n });\n\n for (const diag of diags) {\n if (diag.kind !== \"contextual\") continue;\n errors.push({\n code: \"rate_coherence_violation\",\n severity: \"error\",\n message: diag.message,\n nodeId: diag.nodeId,\n details: {\n tagId: diag.tagId,\n simulationAnchor: diag.simulationAnchor,\n primary: diag.primary,\n offender: diag.offender,\n policy: diag.policy,\n policyPct: diag.policyPct,\n invalidFieldIds: diag.invalidFieldIds,\n },\n });\n }\n }\n }\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/utils/fallback.ts\r\nimport type {\r\n ServiceProps,\r\n ServiceFallback,\r\n ServiceIdRef,\r\n NodeIdRef,\r\n} from \"@/schema\";\r\nimport type { DgpServiceCapability, DgpServiceMap } from \"@/schema/provider\";\nimport type { FallbackSettings } from \"@/schema/validation\";\nimport {\n getServiceCapability,\n normalizeRatePolicy,\n passesRatePolicy,\n} from \"@/utils/util\";\n\r\nexport type FailedFallbackContext = {\r\n scope: \"node\" | \"global\";\r\n nodeId?: string; // when scope='node'\r\n primary: ServiceIdRef;\r\n candidate: ServiceIdRef;\r\n tagContext?: string; // tag.id when evaluating constraints\r\n reason:\r\n | \"unknown_service\"\r\n | \"no_primary\"\r\n | \"rate_violation\"\r\n | \"constraint_mismatch\"\r\n | \"cycle\"\r\n | \"no_tag_context\";\r\n details?: Record<string, unknown>;\r\n};\r\n\r\nconst DEFAULT_SETTINGS: Required<FallbackSettings> = {\n requireConstraintFit: true,\n ratePolicy: { kind: \"lte_primary\", pct: 5 },\n selectionStrategy: \"priority\",\n mode: \"strict\",\n};\n\r\nexport function resolveServiceFallback(params: {\r\n primary: ServiceIdRef;\r\n nodeId?: NodeIdRef; // prefer node-scoped first if provided\r\n tagId?: string; // constraints context (if known)\r\n services: DgpServiceMap;\r\n fallbacks?: ServiceFallback;\r\n settings?: FallbackSettings;\r\n props: ServiceProps;\r\n}): ServiceIdRef | null {\r\n const s = { ...DEFAULT_SETTINGS, ...(params.settings ?? {}) };\r\n const { primary, nodeId, tagId, services } = params;\r\n const fb = params.fallbacks ?? {};\r\n const tried: ServiceIdRef[] = [];\r\n\r\n const lists: ServiceIdRef[][] = [];\r\n if (nodeId && fb.nodes?.[nodeId]) lists.push(fb.nodes[nodeId]);\r\n if (fb.global?.[primary]) lists.push(fb.global[primary]);\r\n\r\n const primaryRate = rateOf(services, primary);\r\n\r\n for (const list of lists) {\r\n for (const cand of list) {\r\n if (tried.includes(cand)) continue;\r\n tried.push(cand);\r\n\r\n const candCap = services[Number(cand)] ?? services[cand as any];\r\n if (!candCap) continue;\r\n\r\n if (!passesRate(s.ratePolicy, primaryRate, candCap.rate)) continue;\r\n if (s.requireConstraintFit && tagId) {\r\n const ok = satisfiesTagConstraints(tagId, params, candCap);\r\n if (!ok) continue;\r\n }\r\n return cand;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nexport function collectFailedFallbacks(\r\n props: ServiceProps,\r\n services: DgpServiceMap,\r\n settings?: FallbackSettings,\r\n): FailedFallbackContext[] {\r\n const s = { ...DEFAULT_SETTINGS, ...(settings ?? {}) };\r\n const out: FailedFallbackContext[] = [];\r\n const fb = props.fallbacks ?? {};\r\n const primaryRate = (p: ServiceIdRef) => rateOf(services, p);\r\n\r\n // Node-scoped (tags or options)\r\n for (const [nodeId, list] of Object.entries(fb.nodes ?? {})) {\r\n const { primary, tagContexts } = primaryForNode(props, nodeId);\r\n if (!primary) {\r\n out.push({\r\n scope: \"node\",\r\n nodeId,\r\n primary: \"\" as any,\r\n candidate: \"\" as any,\r\n reason: \"no_primary\",\r\n });\r\n continue;\r\n }\r\n for (const cand of list) {\r\n const cap = getCap(services, cand);\r\n if (!cap) {\r\n out.push({\r\n scope: \"node\",\r\n nodeId,\r\n primary,\r\n candidate: cand,\r\n reason: \"unknown_service\",\r\n });\r\n continue;\r\n }\r\n if (String(cand) === String(primary)) {\r\n out.push({\r\n scope: \"node\",\r\n nodeId,\r\n primary,\r\n candidate: cand,\r\n reason: \"cycle\",\r\n });\r\n continue;\r\n }\r\n if (!passesRate(s.ratePolicy, primaryRate(primary), cap.rate)) {\r\n out.push({\r\n scope: \"node\",\r\n nodeId,\r\n primary,\r\n candidate: cand,\r\n reason: \"rate_violation\",\r\n });\r\n continue;\r\n }\r\n // Tag contexts\r\n if (tagContexts.length === 0) {\r\n out.push({\r\n scope: \"node\",\r\n nodeId,\r\n primary,\r\n candidate: cand,\r\n reason: \"no_tag_context\",\r\n });\r\n continue;\r\n }\r\n let anyPass = false;\r\n let anyFail = false;\r\n for (const tagId of tagContexts) {\r\n const ok = s.requireConstraintFit\r\n ? satisfiesTagConstraints(tagId, { services, props }, cap)\r\n : true;\r\n if (ok) anyPass = true;\r\n else {\r\n anyFail = true;\r\n out.push({\r\n scope: \"node\",\r\n nodeId,\r\n primary,\r\n candidate: cand,\r\n tagContext: tagId,\r\n reason: \"constraint_mismatch\",\r\n });\r\n }\r\n }\r\n // If none passed, we already added per-context mismatches above\r\n void anyPass;\r\n void anyFail;\r\n }\r\n }\r\n\r\n // Global (soft; no tag context)\r\n for (const [primary, list] of Object.entries(fb.global ?? {})) {\r\n for (const cand of list) {\r\n const cap = getCap(services, cand);\r\n if (!cap) {\r\n out.push({\r\n scope: \"global\",\r\n primary,\r\n candidate: cand,\r\n reason: \"unknown_service\",\r\n });\r\n continue;\r\n }\r\n if (String(cand) === String(primary)) {\r\n out.push({\r\n scope: \"global\",\r\n primary,\r\n candidate: cand,\r\n reason: \"cycle\",\r\n });\r\n continue;\r\n }\r\n if (!passesRate(s.ratePolicy, primaryRate(primary), cap.rate)) {\r\n out.push({\r\n scope: \"global\",\r\n primary,\r\n candidate: cand,\r\n reason: \"rate_violation\",\r\n });\r\n }\r\n }\r\n }\r\n return out;\r\n}\r\n\r\n/* ───────────────────────── helpers ───────────────────────── */\r\n\r\nfunction rateOf(\r\n map: DgpServiceMap,\r\n id: ServiceIdRef | undefined,\r\n): number | undefined {\r\n if (id === undefined || id === null) return undefined;\r\n const c = getCap(map, id);\r\n return c?.rate ?? undefined;\r\n}\r\n\r\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 return passesRatePolicy(normalizeRatePolicy(policy), primaryRate, candRate);\n}\n\nfunction getCap(\n map: DgpServiceMap,\n id: ServiceIdRef,\n): DgpServiceCapability | undefined {\n return getServiceCapability(map, id);\n}\n\r\nfunction isCapFlagEnabled(cap: DgpServiceCapability, flagId: string): boolean {\r\n // New structure: flags[flagId].enabled\r\n const fromFlags: boolean | undefined = cap.flags?.[flagId]?.enabled;\r\n if (fromFlags === true) return true;\r\n if (fromFlags === false) return false;\r\n\r\n // Soft-compat during migration: if legacy boolean exists on cap, respect it.\r\n const legacy: unknown = (cap as any)[flagId];\r\n return legacy === true;\r\n}\r\n\r\nfunction satisfiesTagConstraints(\r\n tagId: string,\r\n ctx: Readonly<{ props: ServiceProps; services: DgpServiceMap }>,\r\n cap: DgpServiceCapability,\r\n): boolean {\r\n const tag = ctx.props.filters.find((t) => t.id === tagId);\r\n const eff: Record<string, unknown> | undefined = tag?.constraints as any; // effective constraints (propagated)\r\n if (!eff) return true;\r\n\r\n // Enforce only keys explicitly set TRUE at the tag; false/undefined => no requirement.\r\n for (const [key, value] of Object.entries(eff)) {\r\n if (value === true && !isCapFlagEnabled(cap, key)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nfunction primaryForNode(\r\n props: ServiceProps,\r\n nodeId: string,\r\n): {\r\n primary?: ServiceIdRef;\r\n tagContexts: string[];\r\n reasonNoPrimary?: string;\r\n} {\r\n // Tag node?\r\n const tag = props.filters.find((t) => t.id === nodeId);\r\n if (tag) {\r\n return { primary: tag.service_id as any, tagContexts: [tag.id] };\r\n }\r\n // Option node: locate its parent field\r\n const field = props.fields.find(\r\n (f) =>\r\n Array.isArray(f.options) && f.options.some((o) => o.id === nodeId),\r\n );\r\n if (!field) return { tagContexts: [], reasonNoPrimary: \"no_parent_field\" };\r\n const opt = field.options!.find((o) => o.id === nodeId)!;\r\n const contexts = bindIdsToArray(field.bind_id);\r\n return { primary: opt.service_id as any, tagContexts: contexts };\r\n}\r\n\r\nfunction bindIdsToArray(bind: string | string[] | undefined): string[] {\r\n if (!bind) return [];\r\n return Array.isArray(bind) ? bind.slice() : [bind];\r\n}\r\n\r\n/**\r\n * Return all fallback candidates that are eligible for the given primary,\r\n * respecting:\r\n * - node-scoped list first (if nodeId provided), then global list for `primary`\r\n * - rate policy vs. primary\r\n * - (optional) tag constraint fit, only when tagId is provided and requireConstraintFit=true\r\n * - excludes (including primary automatically)\r\n * - selectionStrategy: 'priority' keeps list order, 'cheapest' sorts by rate asc\r\n * - unique (dedupe) and optional limit\r\n */\r\nexport function getEligibleFallbacks(params: {\r\n primary: ServiceIdRef;\r\n nodeId?: NodeIdRef; // prefer node-scoped list first\r\n tagId?: string; // constraints context (if known)\r\n services: DgpServiceMap;\r\n fallbacks?: ServiceFallback;\r\n settings?: FallbackSettings;\r\n props: ServiceProps;\r\n exclude?: Array<ServiceIdRef>; // additional ids to ignore\r\n unique?: boolean; // default true\r\n limit?: number; // optional cap\r\n}): ServiceIdRef[] {\r\n const s = { ...DEFAULT_SETTINGS, ...(params.settings ?? {}) };\r\n const { primary, nodeId, tagId, services } = params;\r\n const fb = params.fallbacks ?? {};\r\n const excludes = new Set<string>((params.exclude ?? []).map(String));\r\n excludes.add(String(primary)); // never return the primary itself\r\n const unique = params.unique ?? true;\r\n\r\n // Gather source lists: node → global\r\n const lists: ServiceIdRef[][] = [];\r\n if (nodeId && fb.nodes?.[nodeId]) lists.push(fb.nodes[nodeId]);\r\n if (fb.global?.[primary]) lists.push(fb.global[primary]);\r\n\r\n if (!lists.length) return [];\r\n\r\n const primaryRate = rateOf(services, primary);\r\n const seen = new Set<string>();\r\n const eligible: ServiceIdRef[] = [];\r\n\r\n for (const list of lists) {\r\n for (const cand of list) {\r\n const key = String(cand);\r\n if (excludes.has(key)) continue;\r\n if (unique && seen.has(key)) continue;\r\n seen.add(key);\r\n\r\n const cap = getCap(services, cand);\r\n if (!cap) continue;\r\n\r\n // Rate policy must pass\r\n if (!passesRate(s.ratePolicy, primaryRate, cap.rate)) continue;\r\n\r\n // Tag constraint fit is only enforced if we know tagId and setting requires it\r\n if (s.requireConstraintFit && tagId) {\r\n const ok = satisfiesTagConstraints(\r\n tagId,\r\n { props: params.props, services },\r\n cap,\r\n );\r\n if (!ok) continue;\r\n }\r\n\r\n eligible.push(cand);\r\n }\r\n }\r\n\r\n // Selection strategy\r\n if (s.selectionStrategy === \"cheapest\") {\r\n eligible.sort((a, b) => {\r\n const ra = rateOf(services, a) ?? Infinity;\r\n const rb = rateOf(services, b) ?? Infinity;\r\n return ra - rb;\r\n });\r\n }\r\n // 'priority' keeps original order\r\n\r\n // Optional limit\r\n if (typeof params.limit === \"number\" && params.limit >= 0) {\r\n return eligible.slice(0, params.limit);\r\n }\r\n return eligible;\r\n}\r\n\r\nexport function getFallbackRegistrationInfo(\r\n props: ServiceProps,\r\n nodeId: NodeIdRef,\r\n): {\r\n primary?: ServiceIdRef;\r\n tagContexts: string[];\r\n} {\r\n const { primary, tagContexts } = primaryForNode(props, nodeId);\r\n return { primary, tagContexts };\r\n}\n","import type { Field, FieldOption, Tag } from \"@/schema\";\nimport { Builder } from \"@/core/builder\";\n\nexport type NodeKind = \"tag\" | \"field\" | \"option\" | \"unknown\";\n\nexport type RelKind = \"self\" | \"ancestor\" | \"descendant\" | \"unrelated\";\n\nexport interface AncestryHit {\n kind: RelKind;\n node: TagNode;\n index: number;\n direct: boolean;\n path: string[];\n}\n\nexport interface WithAncestry {\n ancestry(baseTag: string | TagNode): readonly AncestryHit[];\n isAncestorOf(baseTag: string | TagNode): boolean;\n isDescendantOf(baseTag: string | TagNode): boolean;\n isWithin(baseTag: string | TagNode): boolean;\n}\n\nexport interface TagNode extends WithAncestry {\n kind: \"tag\";\n id: string;\n raw: Tag;\n\n includes: ReadonlySet<string>;\n excludes: ReadonlySet<string>;\n isInherited?: boolean;\n\n parent(): TagNode | undefined;\n children(): readonly TagNode[];\n ancestors(): readonly {\n node: TagNode;\n direct: boolean;\n index: number;\n path: string[];\n }[];\n pathTo(descendant: string | TagNode): string[] | null;\n isBoundTo(tagId: string | TagNode): boolean;\n getDescendant(id: string): FieldNode | undefined;\n getDescendants(): readonly FieldNode[];\n}\n\nexport interface FieldNode extends WithAncestry {\n kind: \"field\";\n id: string;\n raw: Field;\n\n includes: ReadonlySet<string>;\n excludes: ReadonlySet<string>;\n isInherited?: boolean;\n\n bindIds(): readonly string[];\n ownerTags(): readonly TagNode[];\n isBoundTo(tagId: string | TagNode): boolean;\n getDescendant(id: string, contextId?: string): FieldNode | undefined;\n getDescendants(tagId?: string): readonly FieldNode[];\n}\n\nexport interface OptionNode extends WithAncestry {\n kind: \"option\";\n id: string;\n raw: FieldOption;\n\n includes: ReadonlySet<string>;\n excludes: ReadonlySet<string>;\n isInherited?: boolean;\n\n field(): FieldNode;\n ownerTags(): readonly TagNode[];\n isBoundTo(tagId: string | TagNode): boolean;\n getDescendant(id: string, contextId?: string): FieldNode | undefined;\n getDescendants(tagId?: string): readonly FieldNode[];\n}\n\nexport interface UnknownNode extends WithAncestry {\n kind: \"unknown\";\n id: string;\n\n includes: ReadonlySet<string>;\n excludes: ReadonlySet<string>;\n isInherited?: boolean;\n}\n\nexport type AnyNode = TagNode | FieldNode | OptionNode | UnknownNode;\n\nexport interface NodeIndex {\n getNode(input: string | Tag | Field | FieldOption): AnyNode;\n getTag(id: string): TagNode | undefined;\n getField(id: string): FieldNode | undefined;\n getOption(id: string): OptionNode | undefined;\n}\n\nconst toId = (x: string | { id: string }) => (typeof x === \"string\" ? x : x.id);\n\nconst toBindList = (b: Field[\"bind_id\"]): string[] => {\n if (!b) return [];\n return typeof b === \"string\" ? [b] : [...b];\n};\n\nexport function createNodeIndex(builder: Builder): NodeIndex {\n const props = builder.getProps();\n const nodeMap = builder.getNodeMap();\n //---\n const tags = props.filters ?? [];\n const fields = props.fields ?? [];\n\n const tagById = new Map<string, Tag>(tags.map((t) => [t.id, t]));\n const fieldById = new Map<string, Field>(fields.map((f) => [f.id, f]));\n\n const optionById = new Map<string, FieldOption>();\n const optionOwnerFieldId = new Map<string, string>();\n for (const f of fields) {\n for (const o of f.options ?? []) {\n optionById.set(o.id, o);\n optionOwnerFieldId.set(o.id, f.id);\n }\n }\n\n const parentById = new Map<string, string | undefined>();\n const childrenById = new Map<string, string[]>();\n for (const t of tags) {\n parentById.set(t.id, t.bind_id);\n if (t.bind_id) {\n const arr = childrenById.get(t.bind_id) ?? [];\n arr.push(t.id);\n childrenById.set(t.bind_id, arr);\n }\n }\n\n // --- caches\n const nodeCache = new Map<string, AnyNode>();\n const tagNodeCache = new Map<string, TagNode>();\n const fieldNodeCache = new Map<string, FieldNode>();\n const optionNodeCache = new Map<string, OptionNode>();\n\n const tagAncestorsCache = new Map<\n string,\n readonly {\n node: TagNode;\n direct: boolean;\n index: number;\n path: string[];\n }[]\n >();\n const tagChildrenCache = new Map<string, readonly TagNode[]>();\n const lineageIdsCache = new Map<string, ReadonlySet<string>>();\n\n const fieldBindIdsCache = new Map<string, readonly string[]>();\n const fieldOwnerTagsCache = new Map<string, readonly TagNode[]>();\n\n const emptySet = Object.freeze(new Set<string>());\n\n const isFieldBoundDirectToTag = (\n fieldId: string,\n tagId: string,\n ): boolean => {\n const field = fieldById.get(fieldId);\n if (!field) return false;\n const bind = field.bind_id;\n if (!bind) return false;\n if (typeof bind === \"string\") return bind === tagId;\n return bind.includes(tagId);\n };\n\n const resolveDescendants = (\n id: string,\n includes: ReadonlySet<string>,\n tagId?: string,\n forceSimple?: boolean,\n ): readonly FieldNode[] => {\n if (!tagId || forceSimple) {\n const results: FieldNode[] = [];\n for (const incId of includes) {\n const node = getField(incId);\n if (node) results.push(node);\n }\n return Object.freeze(results);\n }\n\n const results: FieldNode[] = [];\n const visible = builder.visibleFields(tagId, [id]);\n\n for (const fieldId of visible) {\n const node = getField(fieldId);\n if (!node) continue;\n const explicit =\n includes.has(fieldId) ||\n isFieldBoundDirectToTag(fieldId, tagId);\n results.push(explicit ? node : { ...node, isInherited: true });\n }\n\n return Object.freeze(results);\n };\n\n // ---- core graph helpers\n const lineageIds = (tagId: string): ReadonlySet<string> => {\n const cached = lineageIdsCache.get(tagId);\n if (cached) return cached;\n\n const out = new Set<string>();\n const guard = new Set<string>();\n let cur: string | undefined = tagId;\n\n while (cur && !guard.has(cur)) {\n out.add(cur);\n guard.add(cur);\n cur = parentById.get(cur);\n }\n\n lineageIdsCache.set(tagId, out);\n return out;\n };\n\n const pathBetween = (fromId: string, toId: string): string[] | null => {\n if (fromId === toId) return [fromId];\n\n const guard = new Set<string>();\n const stack: string[] = [];\n let cur: string | undefined = toId;\n\n while (cur && !guard.has(cur)) {\n stack.push(cur);\n if (cur === fromId) return stack.reverse(); // from -> ... -> to\n guard.add(cur);\n cur = parentById.get(cur);\n }\n return null;\n };\n\n const relationBetween = (\n baseId: string,\n otherId: string,\n ): { kind: RelKind; path: string[]; index: number; direct: boolean } => {\n if (baseId === otherId)\n return { kind: \"self\", path: [baseId], index: 0, direct: false };\n\n // base -> other ? => descendant\n const down = pathBetween(baseId, otherId);\n if (down)\n return {\n kind: \"descendant\",\n path: down,\n index: down.length - 1,\n direct: down.length === 2,\n };\n\n // other -> base ? => ancestor\n const up = pathBetween(otherId, baseId);\n if (up) {\n // want base -> other path; we can just reverse \"up\"\n const p = up.slice().reverse();\n return {\n kind: \"ancestor\",\n path: p,\n index: p.length - 1,\n direct: p.length === 2,\n };\n }\n\n return { kind: \"unrelated\", path: [], index: -1, direct: false };\n };\n\n // ---- shared ancestry impl builder\n const makeAncestry = (selfOwnerTagIds: readonly string[]) => {\n return (baseTag: string | TagNode): readonly AncestryHit[] => {\n const baseId = toId(baseTag);\n const hits: AncestryHit[] = [];\n\n for (const ownerId of selfOwnerTagIds) {\n const owner = getTag(ownerId);\n if (!owner) continue;\n\n const rel = relationBetween(baseId, ownerId);\n hits.push({\n kind: rel.kind,\n node: owner,\n index: rel.index,\n direct: rel.direct,\n path: rel.path,\n });\n }\n\n return hits;\n };\n };\n\n const makeAncestryFns = (\n ancestryFn: (baseTag: string | TagNode) => readonly AncestryHit[],\n ) => ({\n ancestry: ancestryFn,\n\n isAncestorOf(baseTag: string | TagNode): boolean {\n return ancestryFn(baseTag).some((h) => h.kind === \"ancestor\");\n },\n\n isDescendantOf(baseTag: string | TagNode): boolean {\n return ancestryFn(baseTag).some((h) => h.kind === \"descendant\");\n },\n\n isWithin(baseTag: string | TagNode): boolean {\n return ancestryFn(baseTag).some(\n (h) => h.kind === \"self\" || h.kind === \"descendant\",\n );\n },\n });\n\n // ---- node factories\n const getTag = (id: string): TagNode | undefined => {\n const cached = tagNodeCache.get(id);\n if (cached) return cached;\n\n const raw = tagById.get(id);\n if (!raw) return undefined;\n\n const includes = Object.freeze(new Set(raw.includes ?? []));\n const excludes = Object.freeze(new Set(raw.excludes ?? []));\n\n const ancestryFn = makeAncestry([id]);\n\n const node: TagNode = {\n kind: \"tag\",\n id,\n raw,\n\n includes,\n excludes,\n\n ...makeAncestryFns(ancestryFn),\n\n parent() {\n const pid = parentById.get(id);\n return pid ? getTag(pid) : undefined;\n },\n\n children() {\n const cachedChildren = tagChildrenCache.get(id);\n if (cachedChildren) return cachedChildren;\n\n const childIds = childrenById.get(id) ?? [];\n const arr = childIds\n .map((cid) => getTag(cid))\n .filter(Boolean) as TagNode[];\n const frozen = Object.freeze(arr);\n tagChildrenCache.set(id, frozen);\n return frozen;\n },\n\n ancestors() {\n const cachedAnc = tagAncestorsCache.get(id);\n if (cachedAnc) return cachedAnc;\n\n const rows: Array<{\n node: TagNode;\n direct: boolean;\n index: number;\n path: string[];\n }> = [];\n const guard = new Set<string>();\n let cur = parentById.get(id);\n let index = 1;\n\n while (cur && !guard.has(cur)) {\n const n = getTag(cur);\n if (!n) break;\n const p = pathBetween(id, cur) ?? [id, cur];\n\n rows.push({ node: n, direct: index === 1, index, path: p });\n\n guard.add(cur);\n cur = parentById.get(cur);\n index++;\n }\n\n const frozen = Object.freeze(rows);\n tagAncestorsCache.set(id, frozen);\n return frozen;\n },\n\n pathTo(descendant) {\n const to = toId(descendant);\n return pathBetween(id, to);\n },\n\n isBoundTo(tagId) {\n const tid = toId(tagId);\n if (tid === id) return true;\n // A tag is bound to tagId if tagId is its DIRECT parent.\n return parentById.get(id) === tid;\n },\n\n getDescendant(descendantId) {\n return this.getDescendants().find(\n (item) => item.id == descendantId,\n );\n },\n\n getDescendants() {\n const results: FieldNode[] = [];\n const visible = builder.visibleFields(id);\n\n for (const fieldId of visible) {\n const node = getField(fieldId);\n if (!node) continue;\n const explicit =\n includes.has(fieldId) ||\n isFieldBoundDirectToTag(fieldId, id);\n results.push(\n explicit ? node : { ...node, isInherited: true },\n );\n }\n\n return Object.freeze(results);\n },\n };\n\n tagNodeCache.set(id, node);\n nodeCache.set(id, node);\n return node;\n };\n\n const getField = (id: string): FieldNode | undefined => {\n const cached = fieldNodeCache.get(id);\n if (cached) return cached;\n\n const raw = fieldById.get(id);\n if (!raw) return undefined;\n\n const isButton = (raw as any).button === true;\n const includes = isButton\n ? Object.freeze(new Set(props.includes_for_buttons?.[id] ?? []))\n : emptySet;\n const excludes = isButton\n ? Object.freeze(new Set(props.excludes_for_buttons?.[id] ?? []))\n : emptySet;\n\n const bindIds = (): readonly string[] => {\n const cachedBind = fieldBindIdsCache.get(id);\n if (cachedBind) return cachedBind;\n const res = Object.freeze(toBindList(raw.bind_id));\n fieldBindIdsCache.set(id, res);\n return res;\n };\n\n const ancestryFn = makeAncestry(bindIds());\n\n const node: FieldNode = {\n kind: \"field\",\n id,\n raw,\n\n includes,\n excludes,\n\n ...makeAncestryFns(ancestryFn),\n\n bindIds,\n\n ownerTags() {\n const cachedOwners = fieldOwnerTagsCache.get(id);\n if (cachedOwners) return cachedOwners;\n\n const owners = bindIds()\n .map((tid) => getTag(tid))\n .filter(Boolean) as TagNode[];\n\n const frozen = Object.freeze(owners);\n fieldOwnerTagsCache.set(id, frozen);\n return frozen;\n },\n\n isBoundTo(tagId) {\n const tid = toId(tagId);\n const lin = lineageIds(tid); // self + ancestors\n for (const b of bindIds()) if (lin.has(b)) return true;\n return false;\n },\n\n getDescendant(descendantId, context) {\n return this.getDescendants(context).find(\n (item) => item.id == descendantId,\n );\n },\n\n getDescendants(tagId?: string) {\n return resolveDescendants(id, includes, tagId, !isButton);\n },\n };\n\n fieldNodeCache.set(id, node);\n nodeCache.set(id, node);\n return node;\n };\n\n const getOption = (id: string): OptionNode | undefined => {\n const cached = optionNodeCache.get(id);\n if (cached) return cached;\n\n const raw = optionById.get(id);\n const ownerFieldId = optionOwnerFieldId.get(id);\n if (!raw || !ownerFieldId) return undefined;\n\n const owner = getField(ownerFieldId);\n if (!owner) return undefined;\n\n const includes = Object.freeze(\n new Set(props.includes_for_buttons?.[id] ?? []),\n );\n const excludes = Object.freeze(\n new Set(props.excludes_for_buttons?.[id] ?? []),\n );\n\n // option shares ancestry with its owning field\n const node: OptionNode = {\n kind: \"option\",\n id,\n raw,\n\n includes,\n excludes,\n\n ...makeAncestryFns((baseTag) => owner.ancestry(baseTag)),\n\n field() {\n return owner;\n },\n\n ownerTags() {\n return owner.ownerTags();\n },\n\n isBoundTo(tagId) {\n return owner.isBoundTo(tagId);\n },\n\n getDescendant(descendantId, context) {\n return this.getDescendants(context).find(\n (item) => item.id == descendantId,\n );\n },\n\n getDescendants(tagId?: string) {\n return resolveDescendants(id, includes, tagId);\n },\n };\n\n optionNodeCache.set(id, node);\n nodeCache.set(id, node);\n return node;\n };\n\n const getNode = (input: string | Tag | Field | FieldOption): AnyNode => {\n const id = typeof input === \"object\" ? input.id : input;\n\n const cached = nodeCache.get(id);\n if (cached) return cached;\n\n const node = nodeMap.get(id);\n\n if (!node) return mkUnknown(id);\n\n if (node.kind === \"tag\") return getTag(id) ?? mkUnknown(id);\n if (node.kind == \"field\") return getField(id) ?? mkUnknown(id);\n if (node.kind == \"option\") return getOption(id) ?? mkUnknown(id);\n\n return mkUnknown(id);\n };\n\n const mkUnknown = (id: string): UnknownNode => {\n const u: UnknownNode = {\n kind: \"unknown\",\n id,\n includes: emptySet,\n excludes: emptySet,\n ...makeAncestryFns(() => []),\n };\n nodeCache.set(id, u);\n return u;\n };\n\n return {\n getNode,\n getTag,\n getField,\n getOption,\n };\n}\n","import type { Builder } from \"@/core/builder\";\nimport { compilePolicies, type PolicyDiagnostic } from \"@/core/policy\";\nimport type {\n DgpServiceCapability,\n DgpServiceMap,\n DynamicRule,\n FallbackSettings,\n ServiceIdRef,\n} from \"@/schema\";\nimport {\n constraintFitOk,\n getServiceCapability,\n rateOk,\n toFiniteNumber,\n} from \"@/utils/util\";\n\nexport type ServiceCheck = {\n id: ServiceIdRef;\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\nexport type FilterServicesForVisibleGroupInput = {\n candidates: ServiceIdRef[];\n context: {\n tagId: string;\n selectedButtons?: string[];\n usedServiceIds: ServiceIdRef[];\n effectiveConstraints?: Partial<\n Record<\"refill\" | \"cancel\" | \"dripfeed\", boolean>\n >;\n policies?: unknown;\n fallback?: FallbackSettings;\n strictSafety?: boolean;\n enforcePolicies?: boolean;\n };\n};\n\nexport type FilterServicesForVisibleGroupResult = {\n checks: ServiceCheck[];\n diagnostics?: PolicyDiagnostic[];\n};\n\nexport function filterServicesForVisibleGroup(\n input: FilterServicesForVisibleGroupInput,\n deps: {\n builder: Builder;\n },\n): FilterServicesForVisibleGroupResult {\n const svcMap: DgpServiceMap = deps.builder.getServiceMap?.() ?? {};\n const { context } = input;\n\n const usedSet = new Set(context.usedServiceIds.map(String));\n const primary = context.usedServiceIds[0];\n\n const fb: FallbackSettings = {\n requireConstraintFit: true,\n ratePolicy: { kind: \"lte_primary\", pct: 5 },\n selectionStrategy: \"priority\",\n mode: \"strict\",\n ...(context.fallback ?? {}),\n };\n\n const visibleServiceIds =\n context.selectedButtons === undefined\n ? undefined\n : collectVisibleServiceIds(\n deps.builder,\n context.tagId,\n context.selectedButtons,\n );\n\n const checks: ServiceCheck[] = [];\n let lastDiagnostics: PolicyDiagnostic[] | undefined = undefined;\n\n for (const id of input.candidates) {\n if (usedSet.has(String(id))) continue;\n\n const cap = getServiceCapability(svcMap, id);\n if (!cap) {\n checks.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 const fitsConstraints = constraintFitOk(\n svcMap,\n cap.id,\n context.effectiveConstraints ?? {},\n );\n\n const passesRate =\n primary == null ? true : rateOk(svcMap, id, primary, fb);\n\n const polRes = evaluatePoliciesRaw(\n context.policies ?? [],\n [...context.usedServiceIds, id],\n svcMap,\n context.tagId,\n visibleServiceIds,\n );\n const passesPolicies = polRes.ok;\n lastDiagnostics = polRes.diagnostics;\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 checks.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 ? polRes.warnings : undefined,\n reasons,\n cap,\n rate: toFiniteNumber(cap.rate),\n });\n }\n\n return {\n checks,\n diagnostics:\n lastDiagnostics && lastDiagnostics.length\n ? lastDiagnostics\n : undefined,\n };\n}\n\nfunction evaluatePoliciesRaw(\n raw: unknown,\n serviceIds: ServiceIdRef[],\n svcMap: DgpServiceMap,\n tagId: string,\n visibleServiceIds?: Set<string>,\n) {\n const compiled = compilePolicies(raw);\n const evaluated = evaluateServicePolicies(\n compiled.policies,\n serviceIds,\n svcMap,\n tagId,\n visibleServiceIds,\n );\n return {\n ...evaluated,\n diagnostics: compiled.diagnostics,\n };\n}\n\nfunction evaluateServicePolicies(\n rules: DynamicRule[] | undefined,\n svcIds: ServiceIdRef[],\n svcMap: DgpServiceMap,\n tagId: string,\n visibleServiceIds?: Set<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 scoped = scopeServiceIdsForRule(svcIds, r, visibleServiceIds);\n const ids = scoped.filter((id) =>\n matchesRuleFilter(getServiceCapability(svcMap, id), r, tagId),\n );\n const projection = r.projection || \"service.id\";\n const values = ids.map((id) =>\n policyProjectValue(getServiceCapability(svcMap, 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 {\n warnings.push(r.id ?? \"policy_warning\");\n }\n }\n }\n\n return { ok: errors.length === 0, errors, warnings };\n}\n\nfunction scopeServiceIdsForRule(\n serviceIds: (string | number)[],\n rule: DynamicRule,\n visibleServiceIds?: Set<string>,\n): ServiceIdRef[] {\n if (rule.scope !== \"visible_group\" || !visibleServiceIds) return serviceIds;\n return serviceIds.filter((id) => visibleServiceIds.has(String(id)));\n}\n\nfunction collectVisibleServiceIds(\n builder: Builder,\n tagId: string,\n selectedButtons: string[],\n): Set<string> {\n const out = new Set<string>();\n const props = builder.getProps();\n const tags = props.filters ?? [];\n const fields = props.fields ?? [];\n\n const tag = tags.find((t) => t.id === tagId);\n if (tag?.service_id != null) out.add(String(tag.service_id));\n\n const visibleFieldIds = new Set(builder.visibleFields(tagId, selectedButtons));\n for (const field of fields) {\n if (!visibleFieldIds.has(field.id)) continue;\n\n if ((field as any).service_id != null) {\n out.add(String((field as any).service_id));\n }\n for (const option of field.options ?? []) {\n if ((option as any).service_id != null) {\n out.add(String((option as any).service_id));\n }\n }\n }\n\n return out;\n}\n\nfunction policyProjectValue(\n cap: DgpServiceCapability | undefined,\n projection: string,\n) {\n if (!cap) return undefined;\n const key = projection.startsWith(\"service.\") ? projection.slice(8) : 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 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","import type { EditorModuleContext } from \"./editor-types\";\r\n\r\nexport function uniqueId(ctx: EditorModuleContext, base: string): string {\r\n const props = ctx.getProps();\r\n const taken = new Set<string>([\r\n ...(props.filters ?? []).map((t) => t.id),\r\n ...(props.fields ?? []).map((f) => f.id),\r\n ]);\r\n let candidate = nextCopyId(base);\r\n while (taken.has(candidate)) candidate = bumpSuffix(candidate);\r\n return candidate;\r\n}\r\n\r\nexport function uniqueOptionId(\r\n ctx: EditorModuleContext,\r\n fieldId: string,\r\n base: string,\r\n): string {\r\n const props = ctx.getProps();\r\n const fld = (props.fields ?? []).find((f) => f.id === fieldId);\r\n const taken = new Set((fld?.options ?? []).map((o) => o.id));\r\n let candidate = base;\r\n if (taken.has(candidate)) candidate = nextCopyId(candidate);\r\n while (taken.has(candidate)) candidate = bumpSuffix(candidate);\r\n return candidate;\r\n}\r\n\r\nexport function genId(\r\n ctx: EditorModuleContext,\r\n prefix: \"t\" | \"f\" | \"o\",\r\n): string {\r\n const props = ctx.getProps();\r\n const taken = new Set<string>([\r\n ...(props.filters ?? []).map((t) => t.id),\r\n ...(props.fields ?? []).map((f) => f.id),\r\n ...(props.fields ?? []).flatMap((f) => f.options?.map((o) => o.id) ?? []),\r\n ]);\r\n for (let i = 1; i < 10_000; i++) {\r\n const id = `${prefix}:${i}`;\r\n if (!taken.has(id)) return id;\r\n }\r\n throw new Error(\"Unable to generate id\");\r\n}\r\n\r\nexport function nextCopyLabel(old: string): string {\r\n const m = old.match(/^(.*?)(?:\\s*\\(copy(?:\\s+(\\d+))?\\))$/i);\r\n if (!m) return `${old} (copy)`;\r\n const stem = m[1].trim();\r\n const n = m[2] ? parseInt(m[2], 10) + 1 : 2;\r\n return `${stem} (copy ${n})`;\r\n}\r\n\r\nexport function nextCopyName(old?: string): string | undefined {\r\n if (!old) return undefined;\r\n const m = old.match(/^(.*?)(_copy(\\d+)?)$/i);\r\n if (!m) return `${old}_copy`;\r\n const stem = m[1];\r\n const n = m[3] ? parseInt(m[3], 10) + 1 : 2;\r\n return `${stem}_copy${n}`;\r\n}\r\n\r\nexport function defaultOptionIdStrategy(old: string): string {\r\n return nextCopyId(old);\r\n}\r\n\r\nexport function nextCopyId(old: string): string {\r\n const m = old.match(/^(.*?)(?:_copy(\\d+)?)$/i);\r\n if (!m) return `${old}_copy`;\r\n const stem = m[1];\r\n const n = m[2] ? parseInt(m[2], 10) + 1 : 2;\r\n return `${stem}_copy${n}`;\r\n}\r\n\r\nexport function bumpSuffix(old: string): string {\r\n const m = old.match(/^(.*?)(\\d+)$/);\r\n if (!m) return `${old}2`;\r\n const stem = m[1];\r\n return `${stem}${parseInt(m[2], 10) + 1}`;\r\n}\r\n","import type { ServiceProps, Tag } from \"@/schema\";\r\nimport type {\r\n DuplicateOptions,\r\n EditorModuleContext,\r\n NodeRef,\r\n} from \"./editor-types\";\r\nimport {\r\n defaultOptionIdStrategy,\r\n nextCopyLabel,\r\n nextCopyName,\r\n} from \"./editor-ids\";\r\n\r\nexport function duplicate(\r\n ctx: EditorModuleContext,\r\n ref: NodeRef,\r\n opts: DuplicateOptions = {},\r\n): string {\r\n const snapBefore = ctx.makeSnapshot(\"duplicate:before\");\r\n try {\r\n let newId = \"\";\r\n ctx.transact(\"duplicate\", () => {\r\n if (ref.kind === \"tag\") {\r\n newId = duplicateTag(ctx, ref.id, opts);\r\n } else if (ref.kind === \"field\") {\r\n newId = duplicateField(ctx, ref.id, opts);\r\n } else {\r\n newId = duplicateOption(ctx, ref.fieldId, ref.id, opts);\r\n }\r\n });\r\n return newId;\r\n } catch (err) {\r\n ctx.loadSnapshot(snapBefore, \"undo\");\r\n throw err;\r\n }\r\n}\r\n\r\nexport function duplicateTag(\r\n ctx: EditorModuleContext,\r\n tagId: string,\r\n opts: DuplicateOptions,\r\n): string {\r\n const props = ctx.getProps();\r\n const tags = props.filters ?? [];\r\n const src = tags.find((t) => t.id === tagId);\r\n if (!src) throw new Error(`Tag not found: ${tagId}`);\r\n\r\n const id = opts.id ?? ctx.uniqueId(src.id);\r\n const label = (opts.labelStrategy ?? nextCopyLabel)(src.label ?? id);\r\n\r\n if (!opts.withChildren) {\r\n ctx.patchProps((p) => {\r\n const clone = { ...src, id, label };\r\n clone.bind_id = src.bind_id;\r\n clone.constraints_overrides = undefined;\r\n clone.constraints_origin = undefined;\r\n const arr = p.filters ?? [];\r\n const idx = arr.findIndex((t) => t.id === tagId);\r\n arr.splice(idx + 1, 0, clone);\r\n p.filters = arr;\r\n });\r\n return id;\r\n }\r\n\r\n const idMap = new Map<string, string>();\r\n const collect = (t: typeof src, acc: (typeof src)[]) => {\r\n acc.push(t);\r\n for (const child of tags.filter((x) => x.bind_id === t.id)) {\r\n collect(child as any, acc);\r\n }\r\n };\r\n const subtree: (typeof src)[] = [];\r\n collect(src, subtree);\r\n\r\n for (const n of subtree) {\r\n idMap.set(n.id, n.id === src.id ? id : ctx.uniqueId(n.id));\r\n }\r\n\r\n const clones = subtree.map((n) => {\r\n const cloned = { ...n };\r\n cloned.id = idMap.get(n.id)!;\r\n cloned.label =\r\n n.id === src.id\r\n ? label\r\n : (opts.labelStrategy ?? nextCopyLabel)(n.label ?? n.id);\r\n cloned.bind_id = n.bind_id ? (idMap.get(n.bind_id) ?? n.bind_id) : undefined;\r\n cloned.constraints_origin = undefined;\r\n cloned.constraints_overrides = undefined;\r\n return cloned;\r\n });\r\n\r\n ctx.patchProps((p) => {\r\n const arr = p.filters ?? [];\r\n const rootIdx = arr.findIndex((t) => t.id === tagId);\r\n arr.splice(rootIdx + 1, 0, clones[0] as any);\r\n for (const c of clones.slice(1)) arr.push(c as any);\r\n p.filters = arr;\r\n });\r\n\r\n return id;\r\n}\r\n\r\nexport function duplicateField(\r\n ctx: EditorModuleContext,\r\n fieldId: string,\r\n opts: DuplicateOptions,\r\n): string {\r\n const props = ctx.getProps();\r\n const fields = props.fields ?? [];\r\n const src = fields.find((f) => f.id === fieldId);\r\n if (!src) throw new Error(`Field not found: ${fieldId}`);\r\n\r\n const id = opts.id ?? ctx.uniqueId(src.id);\r\n const label = (opts.labelStrategy ?? nextCopyLabel)(src.label ?? id);\r\n const name = opts.nameStrategy\r\n ? opts.nameStrategy(src.name)\r\n : nextCopyName(src.name);\r\n\r\n const optId = (old: string) =>\r\n ctx.uniqueOptionId(\r\n id,\r\n (opts.optionIdStrategy ?? defaultOptionIdStrategy)(old),\r\n );\r\n\r\n const clonedOptions = (src.options ?? []).map((o) => ({\r\n ...o,\r\n id: optId(o.id),\r\n label: (opts.labelStrategy ?? nextCopyLabel)(o.label ?? o.id),\r\n }));\r\n\r\n const cloned = {\r\n ...src,\r\n id,\r\n label,\r\n name,\r\n bind_id: (opts.copyBindings ?? true) ? src.bind_id : undefined,\r\n options: clonedOptions,\r\n } as typeof src;\r\n\r\n const optionIdMap = new Map<string, string>();\r\n (src.options ?? []).forEach((o, i) => {\r\n const newOptId = clonedOptions[i]?.id ?? o.id;\r\n optionIdMap.set(o.id, newOptId);\r\n });\r\n\r\n ctx.patchProps((p) => {\r\n const arr = p.fields ?? [];\r\n const idx = arr.findIndex((f) => f.id === fieldId);\r\n arr.splice(idx + 1, 0, cloned as any);\r\n p.fields = arr;\r\n\r\n if (opts.copyIncludesExcludes) {\r\n for (const t of p.filters ?? []) {\r\n if (t.includes?.includes(fieldId)) {\r\n const s = new Set(t.includes);\r\n s.add(id);\r\n t.includes = Array.from(s);\r\n }\r\n if (t.excludes?.includes(fieldId)) {\r\n const s = new Set(t.excludes);\r\n s.add(id);\r\n t.excludes = Array.from(s);\r\n }\r\n }\r\n }\r\n\r\n if (opts.copyOptionMaps) {\r\n const maps: Array<\"includes_for_buttons\" | \"excludes_for_buttons\"> = [\r\n \"includes_for_buttons\",\r\n \"excludes_for_buttons\",\r\n ];\r\n\r\n for (const mapKey of maps) {\r\n const srcMap = (p as any)[mapKey] ?? {};\r\n const nextMap: Record<string, string[]> = { ...srcMap };\r\n\r\n for (const [key, targets] of Object.entries(\r\n srcMap as Record<string, string[]>,\r\n )) {\r\n if (key === fieldId) {\r\n const newKey = id;\r\n const merged = new Set([...(nextMap[newKey] ?? []), ...targets]);\r\n nextMap[newKey] = Array.from(merged);\r\n continue;\r\n }\r\n\r\n if (optionIdMap.has(key)) {\r\n const newKey = optionIdMap.get(key)!;\r\n const merged = new Set([...(nextMap[newKey] ?? []), ...targets]);\r\n nextMap[newKey] = Array.from(merged);\r\n }\r\n }\r\n\r\n (p as any)[mapKey] = nextMap;\r\n }\r\n }\r\n });\r\n\r\n return id;\r\n}\r\n\r\nexport function duplicateOption(\r\n ctx: EditorModuleContext,\r\n fieldId: string,\r\n optionId: string,\r\n opts: DuplicateOptions,\r\n): string {\r\n const props = ctx.getProps();\r\n const fields = props.fields ?? [];\r\n const f = fields.find((x) => x.id === fieldId);\r\n if (!f) throw new Error(`Field not found: ${fieldId}`);\r\n const optIdx = (f.options ?? []).findIndex((o) => o.id === optionId);\r\n if (optIdx < 0) {\r\n throw new Error(`Option not found: ${fieldId}::${optionId}`);\r\n }\r\n const src = (f.options ?? [])[optIdx];\r\n\r\n const newId = ctx.uniqueOptionId(\r\n fieldId,\r\n (opts.optionIdStrategy ?? defaultOptionIdStrategy)(src.id),\r\n );\r\n const newLabel = (opts.labelStrategy ?? nextCopyLabel)(src.label ?? src.id);\r\n\r\n ctx.patchProps((p) => {\r\n const fld = (p.fields ?? []).find((x) => x.id === fieldId)!;\r\n const arr = fld.options ?? [];\r\n const clone = { ...src, id: newId, label: newLabel };\r\n arr.splice(optIdx + 1, 0, clone);\r\n fld.options = arr;\r\n\r\n if (opts.copyOptionMaps) {\r\n const oldKey = `${fieldId}::${optionId}`;\r\n const newKey = `${fieldId}::${newId}`;\r\n for (const mapKey of [\r\n \"includes_for_buttons\",\r\n \"excludes_for_buttons\",\r\n ] as const) {\r\n const m = p[mapKey] ?? {};\r\n if (m[oldKey]) {\r\n m[newKey] = Array.from(new Set(m[oldKey]));\r\n p[mapKey] = m as any;\r\n }\r\n }\r\n }\r\n });\r\n\r\n return newId;\r\n}\r\n","import type { ServicePropsNotice } from \"@/schema\";\r\nimport type { EditorModuleContext } from \"./editor-types\";\r\n\r\nfunction genNoticeId(ctx: EditorModuleContext): string {\r\n const taken = new Set((ctx.getProps().notices ?? []).map((n) => n.id));\r\n for (let i = 1; i < 10_000; i++) {\r\n const id = `n:${i}`;\r\n if (!taken.has(id)) return id;\r\n }\r\n throw new Error(\"Unable to generate notice id\");\r\n}\r\n\r\nexport function addNotice(\r\n ctx: EditorModuleContext,\r\n input: Omit<ServicePropsNotice, \"id\"> & { id?: string },\r\n): string {\r\n const id = input.id ?? genNoticeId(ctx);\r\n\r\n ctx.exec({\r\n name: \"addNotice\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const notices = (p.notices ??= []);\r\n if (notices.some((n) => n.id === id)) {\r\n throw new Error(`Notice id '${id}' already exists`);\r\n }\r\n notices.push({ ...input, id });\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n\r\n return id;\r\n}\r\n\r\nexport function updateNotice(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n patch: Partial<ServicePropsNotice>,\r\n): void {\r\n const { id: _ignored, ...rest } = patch;\r\n ctx.exec({\r\n name: \"updateNotice\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const notices = p.notices;\r\n if (!notices?.length) return;\r\n\r\n const target = notices.find((n) => n.id === id);\r\n if (!target) return;\r\n Object.assign(target, rest);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function removeNotice(ctx: EditorModuleContext, id: string): void {\r\n ctx.exec({\r\n name: \"removeNotice\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n if (!p.notices?.length) return;\r\n p.notices = p.notices.filter((n) => n.id !== id);\r\n if (!p.notices.length) delete p.notices;\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n","import { cloneDeep } from \"lodash-es\";\nimport type { Field, ServiceIdRef, ServiceProps, Tag } from \"@/schema\";\nimport type {\r\n EditorModuleContext,\r\n EditorNodeLookup,\r\n} from \"./editor-types\";\r\nimport { clearFieldButtonReceiverMaps, isActualButtonField, ownerOfOption } from \"./editor-utils\";\r\n\r\nexport function reLabel(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n nextLabel: string,\r\n): void {\r\n const label = String(nextLabel ?? \"\").trim();\r\n\r\n ctx.exec({\r\n name: \"reLabel\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n if (ctx.isTagId(id)) {\r\n const t = (p.filters ?? []).find((x) => x.id === id);\r\n if (!t) return;\r\n if ((t.label ?? \"\") === label) return;\r\n t.label = label;\r\n ctx.api.refreshGraph();\r\n return;\r\n }\r\n\r\n if (ctx.isOptionId(id)) {\r\n const own = ownerOfOption(p, id);\r\n if (!own) return;\r\n const f = (p.fields ?? []).find((x) => x.id === own.fieldId);\r\n const o = f?.options?.find((x) => x.id === id);\r\n if (!o) return;\r\n if ((o.label ?? \"\") === label) return;\r\n o.label = label;\r\n ctx.api.refreshGraph();\r\n return;\r\n }\r\n\r\n const fld = (p.fields ?? []).find((x) => x.id === id);\r\n if (!fld) return;\r\n if ((fld.label ?? \"\") === label) return;\r\n fld.label = label;\r\n ctx.api.refreshGraph();\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function setFieldName(\r\n ctx: EditorModuleContext,\r\n fieldId: string,\r\n nextName: string | null | undefined,\r\n): void {\r\n const raw = typeof nextName === \"string\" ? nextName : \"\";\r\n const name = raw.trim();\r\n\r\n ctx.exec({\r\n name: \"setFieldName\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const fields = p.fields ?? [];\r\n const f = fields.find((x) => x.id === fieldId);\r\n if (!f) {\r\n ctx.api.emit(\"error\", {\r\n code: \"field_not_found\",\r\n message: `Field not found: ${fieldId}`,\r\n meta: { fieldId },\r\n });\r\n return;\r\n }\r\n\r\n const fieldHasService =\n (typeof (f as any).service_id === \"number\" &&\n Number.isFinite((f as any).service_id)) ||\n (typeof (f as any).service_id === \"string\" &&\n (f as any).service_id.trim().length > 0);\n const optionHasService = Array.isArray(f.options)\n ? f.options.some(\n (o) =>\n (typeof (o as any).service_id === \"number\" &&\n Number.isFinite((o as any).service_id)) ||\n (typeof (o as any).service_id === \"string\" &&\n (o as any).service_id.trim().length > 0),\n )\n : false;\n\r\n if (fieldHasService || optionHasService) {\r\n ctx.api.emit(\"error\", {\r\n code: \"field_has_service_mapping\",\r\n message:\r\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).\",\r\n meta: {\r\n fieldId,\r\n fieldHasService,\r\n optionHasService,\r\n },\r\n });\r\n return;\r\n }\r\n\r\n if (name.length === 0) {\r\n if (\"name\" in f) delete (f as any).name;\r\n return;\r\n }\r\n\r\n const collision = fields.find(\r\n (x) => x.id !== fieldId && (x.name ?? \"\") === name,\r\n );\r\n if (collision) {\r\n ctx.api.emit(\"error\", {\r\n code: \"field_name_collision\",\r\n message: `Another field already uses the name \"${name}\".`,\r\n meta: { fieldId, otherFieldId: collision.id },\r\n });\r\n return;\r\n }\r\n\r\n (f as any).name = name;\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function addOption(\r\n ctx: EditorModuleContext,\r\n fieldId: string,\r\n input: {\r\n id?: string;\n label: string;\n service_id?: ServiceIdRef;\n pricing_role?: \"base\" | \"utility\" | \"addon\";\n [k: string]: any;\n },\r\n): string {\r\n const id = input.id ?? ctx.genId(\"o\");\r\n\r\n ctx.exec({\r\n name: \"addOption\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const f = (p.fields ?? []).find((x) => x.id === fieldId);\r\n if (!f) throw new Error(`addOption: field '${fieldId}' not found`);\r\n const list = (f.options ??= []);\r\n if (list.some((o) => o.id === id)) {\r\n throw new Error(`Option id '${id}' already exists`);\r\n }\r\n list.push({ ...input, id } as any);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n\r\n return id;\r\n}\r\n\r\nexport function updateOption(\r\n ctx: EditorModuleContext,\r\n optionId: string,\r\n patch: Partial<\r\n {\n label: string;\n service_id: ServiceIdRef;\n pricing_role: \"base\" | \"utility\" | \"addon\";\n } & Record<string, any>\n >,\n) {\r\n if (!ctx.isOptionId(optionId)) {\r\n throw new Error('updateOption: optionId must start with \"o:\"');\r\n }\r\n ctx.exec({\r\n name: \"updateOption\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const owner = ownerOfOption(p, optionId);\r\n if (!owner) return;\r\n const f = (p.fields ?? []).find((x) => x.id === owner.fieldId);\r\n if (!f?.options) return;\r\n const o = f.options.find((x) => x.id === optionId);\r\n if (o) Object.assign(o, patch);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function removeOption(ctx: EditorModuleContext, optionId: string) {\r\n if (!ctx.isOptionId(optionId)) {\r\n throw new Error('removeOption: optionId must start with \"o:\"');\r\n }\r\n ctx.exec({\r\n name: \"removeOption\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const owner = ownerOfOption(p, optionId);\r\n if (!owner) return;\r\n const f = (p.fields ?? []).find((x) => x.id === owner.fieldId);\r\n if (!f?.options) return;\r\n f.options = f.options.filter((o) => o.id !== optionId);\r\n\r\n const maps: Array<\"includes_for_options\" | \"excludes_for_options\"> = [\r\n \"includes_for_options\",\r\n \"excludes_for_options\",\r\n ];\r\n for (const m of maps) {\r\n const map = (p as any)[m] as Record<string, string[]> | undefined;\r\n if (!map) continue;\r\n if (map[optionId]) delete map[optionId];\r\n if (!Object.keys(map).length) delete (p as any)[m];\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function editLabel(ctx: EditorModuleContext, id: string, label: string): void {\r\n const next = (label ?? \"\").trim();\r\n if (!next) throw new Error(\"Label cannot be empty\");\r\n\r\n ctx.exec({\r\n name: \"editLabel\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n if (ctx.isTagId(id)) {\r\n const t = (p.filters ?? []).find((x) => x.id === id);\r\n if (t) t.label = next;\r\n return;\r\n }\r\n if (ctx.isFieldId(id)) {\r\n const f = (p.fields ?? []).find((x) => x.id === id);\r\n if (f) f.label = next;\r\n return;\r\n }\r\n if (ctx.isOptionId(id)) {\r\n const own = ownerOfOption(p, id);\r\n if (!own) return;\r\n const f = (p.fields ?? []).find((x) => x.id === own.fieldId);\r\n const o = f?.options?.find((x) => x.id === id);\r\n if (o) o.label = next;\r\n return;\r\n }\r\n throw new Error(\"editLabel: unsupported id\");\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function editName(\r\n ctx: EditorModuleContext,\r\n fieldId: string,\r\n name: string | undefined,\r\n) {\r\n ctx.exec({\r\n name: \"editName\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const f = (p.fields ?? []).find((x) => x.id === fieldId);\r\n if (!f) return;\r\n f.name = name;\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function setService(\n ctx: EditorModuleContext,\n id: string,\n input: { service_id?: ServiceIdRef; pricing_role?: \"base\" | \"utility\" },\n): void {\n ctx.exec({\r\n name: \"setService\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\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 (typeof input.service_id === \"string\" &&\n input.service_id.trim().length > 0));\n const sid: ServiceIdRef | undefined = validId\n ? typeof input.service_id === \"string\"\n ? input.service_id.trim()\n : Number(input.service_id)\n : undefined;\n const nextRole = input.pricing_role;\r\n\r\n if (ctx.isTagId(id)) {\r\n const t = (p.filters ?? []).find((x) => x.id === id);\r\n if (!t) return;\r\n if (hasSidKey) {\r\n if (sid === undefined) delete (t as any).service_id;\r\n else t.service_id = sid;\r\n }\r\n return;\r\n }\r\n\r\n if (ctx.isOptionId(id)) {\r\n const own = ownerOfOption(p, id);\r\n if (!own) return;\r\n const f = (p.fields ?? []).find((x) => x.id === own.fieldId);\r\n const o = f?.options?.find((x) => x.id === id);\r\n if (!o) return;\r\n\r\n const currentRole = (o.pricing_role ?? \"base\") as\r\n | \"base\"\r\n | \"utility\";\r\n const role = nextRole ?? currentRole;\r\n\r\n if (role === \"utility\") {\r\n if (hasSidKey && sid !== undefined) {\r\n ctx.api.emit(\"error\", {\r\n message: \"Utilities cannot have service_id (option).\",\r\n code: \"utility_service_conflict\",\r\n meta: { id, service_id: sid },\r\n });\r\n }\r\n o.pricing_role = \"utility\";\r\n if (\"service_id\" in o) delete (o as any).service_id;\r\n return;\r\n }\r\n\r\n if (nextRole) o.pricing_role = \"base\";\r\n if (hasSidKey) {\r\n if (sid === undefined) delete (o as any).service_id;\r\n else o.service_id = sid;\r\n }\r\n return;\r\n }\r\n\r\n const f = (p.fields ?? []).find((x) => x.id === id);\r\n if (!f) {\r\n throw new Error(\r\n 'setService only supports tag (\"t:*\"), option (\"o:*\"), or field (\"f:*\") ids',\r\n );\r\n }\r\n\r\n const isOptionBased = Array.isArray(f.options) && f.options.length > 0;\r\n const isButton = !!(f as any).button;\r\n\r\n if (nextRole) {\r\n f.pricing_role = nextRole;\r\n }\r\n const effectiveRole = (f.pricing_role ?? \"base\") as\r\n | \"base\"\r\n | \"utility\";\r\n\r\n if (isOptionBased) {\r\n if (hasSidKey) {\r\n ctx.api.emit(\"error\", {\r\n message:\r\n \"Cannot set service_id on an option-based field. Assign service_id on its options instead.\",\r\n code: \"field_option_based_service_forbidden\",\r\n meta: { id, service_id: sid },\r\n });\r\n }\r\n if (\"service_id\" in (f as any)) delete (f as any).service_id;\r\n return;\r\n }\r\n\r\n if (!isButton) {\r\n if (hasSidKey) {\r\n ctx.api.emit(\"error\", {\r\n message:\r\n \"Only button fields (without options) can have a service_id.\",\r\n code: \"non_button_field_service_forbidden\",\r\n meta: { id, service_id: sid },\r\n });\r\n }\r\n if (\"service_id\" in (f as any)) delete (f as any).service_id;\r\n return;\r\n }\r\n\r\n if (effectiveRole === \"utility\") {\r\n if (hasSidKey && sid !== undefined) {\r\n ctx.api.emit(\"error\", {\r\n message: \"Utilities cannot have service_id (field).\",\r\n code: \"utility_service_conflict\",\r\n meta: { id, service_id: sid },\r\n });\r\n }\r\n if (\"service_id\" in (f as any)) delete (f as any).service_id;\r\n return;\r\n }\r\n\r\n if (hasSidKey) {\r\n if (sid === undefined) delete (f as any).service_id;\r\n else (f as any).service_id = sid;\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function addTag(\r\n ctx: EditorModuleContext,\r\n partial: Omit<Tag, \"id\" | \"label\"> & { id?: string; label: string },\r\n) {\r\n const id = partial.id ?? ctx.genId(\"t\");\r\n const payload = { ...partial, id };\r\n ctx.exec({\r\n name: \"addTag\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n p.filters = [...(p.filters ?? []), payload];\r\n }),\r\n undo: () =>\r\n ctx.patchProps((p) => {\r\n p.filters = (p.filters ?? []).filter((t) => t.id !== id);\r\n }),\r\n });\r\n}\r\n\r\nexport function updateTag(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n patch: Partial<Tag>,\r\n) {\r\n let prev: Tag | undefined;\r\n ctx.exec({\r\n name: \"updateTag\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n p.filters = (p.filters ?? []).map((t) => {\r\n if (t.id !== id) return t;\r\n prev = t;\r\n return { ...t, ...patch };\r\n });\r\n }),\r\n undo: () =>\r\n ctx.patchProps((p) => {\r\n p.filters = (p.filters ?? []).map((t) =>\r\n t.id === id && prev ? prev : t,\r\n );\r\n }),\r\n });\r\n}\r\n\r\nexport function removeTag(ctx: EditorModuleContext, id: string) {\r\n let prevSlice!: ServiceProps;\r\n ctx.exec({\r\n name: \"removeTag\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n prevSlice = cloneDeep(p);\r\n p.filters = (p.filters ?? []).filter((t) => t.id !== id);\r\n for (const t of p.filters ?? []) {\r\n if (t.bind_id === id) delete t.bind_id;\r\n t.includes = (t.includes ?? []).filter((x) => x !== id);\r\n t.excludes = (t.excludes ?? []).filter((x) => x !== id);\r\n }\r\n for (const f of p.fields ?? []) {\r\n if (Array.isArray(f.bind_id)) {\r\n f.bind_id = f.bind_id.filter((x) => x !== id);\r\n } else if (f.bind_id === id) {\r\n delete f.bind_id;\r\n }\r\n }\r\n }),\r\n undo: () => ctx.replaceProps(prevSlice),\r\n });\r\n}\r\n\r\nexport function addField(\r\n ctx: EditorModuleContext,\r\n partial: Omit<Field, \"id\" | \"label\" | \"type\"> & {\r\n id?: string;\r\n label: string;\r\n type: Field[\"type\"];\r\n },\r\n) {\r\n const id = partial.id ?? ctx.genId(\"f\");\r\n const payload = { ...partial, id };\r\n ctx.exec({\r\n name: \"addField\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n p.fields = [...(p.fields ?? []), payload as Field];\r\n }),\r\n undo: () =>\r\n ctx.patchProps((p) => {\r\n p.fields = (p.fields ?? []).filter((f) => f.id !== id);\r\n }),\r\n });\r\n}\r\n\r\nexport function updateField(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n patch: Partial<Field>,\r\n) {\r\n let prev: Field | undefined;\r\n let prevIncludesForButton: string[] | undefined;\r\n let prevExcludesForButton: string[] | undefined;\r\n ctx.exec({\r\n name: \"updateField\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n prevIncludesForButton = p.includes_for_buttons?.[id]\r\n ? [...(p.includes_for_buttons?.[id] ?? [])]\r\n : undefined;\r\n prevExcludesForButton = p.excludes_for_buttons?.[id]\r\n ? [...(p.excludes_for_buttons?.[id] ?? [])]\r\n : undefined;\r\n\r\n p.fields = (p.fields ?? []).map((f) => {\r\n if (f.id !== id) return f;\r\n prev = cloneDeep(f);\r\n const nextField = { ...f, ...patch } as Field;\r\n if (!isActualButtonField(nextField)) {\r\n clearFieldButtonReceiverMaps(p, id);\r\n }\r\n return nextField;\r\n });\r\n }),\r\n undo: () =>\r\n ctx.patchProps((p) => {\r\n p.fields = (p.fields ?? []).map((f) =>\r\n f.id === id && prev ? prev : f,\r\n );\r\n if (prevIncludesForButton) {\r\n p.includes_for_buttons = {\r\n ...(p.includes_for_buttons ?? {}),\r\n [id]: [...prevIncludesForButton],\r\n };\r\n } else {\r\n clearFieldButtonReceiverMaps(p, id);\r\n }\r\n if (prevExcludesForButton) {\r\n p.excludes_for_buttons = {\r\n ...(p.excludes_for_buttons ?? {}),\r\n [id]: [...prevExcludesForButton],\r\n };\r\n }\r\n }),\r\n });\r\n}\r\n\r\nexport function removeField(ctx: EditorModuleContext, id: string) {\r\n let prevSlice!: ServiceProps;\r\n ctx.exec({\r\n name: \"removeField\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n prevSlice = cloneDeep(p);\r\n p.fields = (p.fields ?? []).filter((f) => f.id !== id);\r\n clearFieldButtonReceiverMaps(p, id);\r\n for (const mapKey of [\r\n \"includes_for_buttons\",\r\n \"excludes_for_buttons\",\r\n ] as const) {\r\n const m = p[mapKey];\r\n if (!m) continue;\r\n for (const k of Object.keys(m)) {\r\n m[k] = (m[k] ?? []).filter((fid) => fid !== id);\r\n if (!m[k]?.length) delete m[k];\r\n }\r\n }\r\n for (const t of p.filters ?? []) {\r\n t.includes = (t.includes ?? []).filter((x) => x !== id);\r\n t.excludes = (t.excludes ?? []).filter((x) => x !== id);\r\n }\r\n }),\r\n undo: () => ctx.replaceProps(prevSlice),\r\n });\r\n}\r\n\r\nexport function remove(ctx: EditorModuleContext, id: string) {\r\n if (ctx.isTagId(id)) {\r\n ctx.exec({\r\n name: \"removeTag\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n p.filters = (p.filters ?? []).filter((t) => t.id !== id);\r\n\r\n for (const t of p.filters ?? []) {\r\n if (t.bind_id === id) delete t.bind_id;\r\n t.includes = (t.includes ?? []).filter((x) => x !== id);\r\n t.excludes = (t.excludes ?? []).filter((x) => x !== id);\r\n }\r\n\r\n for (const f of p.fields ?? []) {\r\n if (Array.isArray(f.bind_id)) {\r\n f.bind_id = f.bind_id.filter((x) => x !== id) as any;\r\n } else if (f.bind_id === id) {\r\n delete f.bind_id;\r\n }\r\n }\r\n\r\n if (p.order_for_tags?.[id]) delete p.order_for_tags[id];\r\n for (const k of Object.keys(p.order_for_tags ?? {})) {\r\n p.order_for_tags![k] = (p.order_for_tags![k] ?? []).filter(\r\n (fid) => (p.fields ?? []).some((f) => f.id === fid),\r\n );\r\n if (!p.order_for_tags![k].length) delete p.order_for_tags![k];\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n if (ctx.isFieldId(id)) {\r\n ctx.exec({\r\n name: \"removeField\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n p.fields = (p.fields ?? []).filter((f) => f.id !== id);\r\n\r\n for (const t of p.filters ?? []) {\r\n t.includes = (t.includes ?? []).filter((x) => x !== id);\r\n t.excludes = (t.excludes ?? []).filter((x) => x !== id);\r\n }\r\n\r\n for (const k of Object.keys(p.order_for_tags ?? {})) {\r\n p.order_for_tags![k] = (p.order_for_tags![k] ?? []).filter(\r\n (fid) => fid !== id,\r\n );\r\n if (!p.order_for_tags![k].length) delete p.order_for_tags![k];\r\n }\r\n\r\n const maps: Array<\"includes_for_options\" | \"excludes_for_options\"> = [\r\n \"includes_for_options\",\r\n \"excludes_for_options\",\r\n ];\r\n for (const m of maps) {\r\n const map = (p as any)[m] as Record<string, string[]> | undefined;\r\n if (!map) continue;\r\n for (const key of Object.keys(map)) {\r\n map[key] = (map[key] ?? []).filter((fid) => fid !== id);\r\n if (!map[key]?.length) delete map[key];\r\n }\r\n if (!Object.keys(map).length) delete (p as any)[m];\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n if (ctx.isOptionId(id)) {\r\n removeOption(ctx, id);\r\n return;\r\n }\r\n\r\n throw new Error(\"remove: unknown id prefix\");\r\n}\r\n\r\nexport function getNode(ctx: EditorModuleContext, id: string): EditorNodeLookup {\r\n const props = ctx.getProps();\r\n if (ctx.isTagId(id)) {\r\n const t = (props.filters ?? []).find((x) => x.id === id);\r\n return {\r\n kind: \"tag\",\r\n data: t,\r\n owners: { parentTagId: t?.bind_id },\r\n };\r\n }\r\n if (ctx.isFieldId(id)) {\r\n const f = (props.fields ?? []).find((x) => x.id === id);\r\n const bind = Array.isArray(f?.bind_id)\r\n ? (f!.bind_id as string[])\r\n : f?.bind_id\r\n ? [f.bind_id]\r\n : [];\r\n return { kind: \"field\", data: f, owners: { bindTagIds: bind } };\r\n }\r\n if (ctx.isOptionId(id)) {\r\n const own = ownerOfOption(props, id);\r\n const f = own ? (props.fields ?? []).find((x) => x.id === own.fieldId) : undefined;\r\n const o = f?.options?.find((x) => x.id === id);\r\n return {\r\n kind: \"option\",\r\n data: o,\r\n owners: { fieldId: own?.fieldId },\r\n };\r\n }\r\n return { kind: \"option\", data: undefined, owners: {} };\r\n}\r\n","import type { EditorOptions, Field, ServiceProps } from \"@/schema\";\r\n\r\nexport function ownerOfOption(\r\n props: ServiceProps,\r\n optionId: string,\r\n): { fieldId: string; index: number } | null {\r\n for (const f of props.fields ?? []) {\r\n const idx = (f.options ?? []).findIndex((o) => o.id === optionId);\r\n if (idx >= 0) return { fieldId: f.id, index: idx };\r\n }\r\n return null;\r\n}\r\n\r\nexport function hasFieldOptions(field: Partial<Field> | undefined): boolean {\r\n return Array.isArray(field?.options) && field.options.length > 0;\r\n}\r\n\r\nexport function isActualButtonField(field: Partial<Field> | undefined): boolean {\r\n return field?.button === true && !hasFieldOptions(field);\r\n}\r\n\r\nexport function clearFieldButtonReceiverMaps(\r\n props: ServiceProps,\r\n fieldId: string,\r\n): void {\r\n if (props.includes_for_buttons?.[fieldId]) {\r\n delete props.includes_for_buttons[fieldId];\r\n }\r\n if (props.excludes_for_buttons?.[fieldId]) {\r\n delete props.excludes_for_buttons[fieldId];\r\n }\r\n if (\r\n props.includes_for_buttons &&\r\n Object.keys(props.includes_for_buttons).length === 0\r\n ) {\r\n delete props.includes_for_buttons;\r\n }\r\n if (\r\n props.excludes_for_buttons &&\r\n Object.keys(props.excludes_for_buttons).length === 0\r\n ) {\r\n delete props.excludes_for_buttons;\r\n }\r\n}\r\n\r\nexport function ensureServiceExists(opts: EditorOptions, id: any) {\r\n if (typeof opts.serviceExists === \"function\") {\r\n if (!opts.serviceExists(id)) {\r\n throw new Error(`service_not_found:${String(id)}`);\r\n }\r\n return;\r\n }\r\n if (opts.serviceMap) {\r\n if (!Object.prototype.hasOwnProperty.call(opts.serviceMap, id as any)) {\r\n throw new Error(`service_not_found:${String(id)}`);\r\n }\r\n return;\r\n }\r\n throw new Error(\"service_checker_missing\");\r\n}\r\n","import type { EditorModuleContext } from \"./editor-types\";\r\n\r\nexport function setConstraint(\r\n ctx: EditorModuleContext,\r\n tagId: string,\r\n flag: string,\r\n value: boolean | undefined,\r\n) {\r\n let prev: boolean | undefined;\r\n ctx.exec({\r\n name: \"setConstraint\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const t = (p.filters ?? []).find((x) => x.id === tagId);\r\n if (!t) return;\r\n prev = t.constraints?.[flag];\r\n if (!t.constraints) t.constraints = {};\r\n if (value === undefined) delete t.constraints[flag];\r\n else t.constraints[flag] = value;\r\n }),\r\n undo: () =>\r\n ctx.patchProps((p) => {\r\n const t = (p.filters ?? []).find((x) => x.id === tagId);\r\n if (!t) return;\r\n if (!t.constraints) t.constraints = {};\r\n if (prev === undefined) delete t.constraints[flag];\r\n else t.constraints[flag] = prev;\r\n }),\r\n });\r\n}\r\n\r\nexport function clearConstraintOverride(\r\n ctx: EditorModuleContext,\r\n tagId: string,\r\n flag: string,\r\n) {\r\n let prev: boolean | undefined;\r\n let prevOverride: any;\r\n ctx.exec({\r\n name: \"clearConstraintOverride\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const t = (p.filters ?? []).find((x) => x.id === tagId);\r\n if (!t) return;\r\n prev = t.constraints?.[flag];\r\n prevOverride = t.constraints_overrides?.[flag];\r\n\r\n if (t.constraints) delete t.constraints[flag];\r\n if (t.constraints_overrides) delete t.constraints_overrides[flag];\r\n }),\r\n undo: () =>\r\n ctx.patchProps((p) => {\r\n const t = (p.filters ?? []).find((x) => x.id === tagId);\r\n if (!t) return;\r\n if (prev !== undefined) {\r\n if (!t.constraints) t.constraints = {};\r\n t.constraints[flag] = prev;\r\n }\r\n if (prevOverride !== undefined) {\r\n if (!t.constraints_overrides) t.constraints_overrides = {};\r\n t.constraints_overrides[flag] = prevOverride;\r\n }\r\n }),\r\n });\r\n}\r\n\r\nexport function clearConstraint(\r\n ctx: EditorModuleContext,\r\n tagId: string,\r\n flag: string,\r\n) {\r\n ctx.exec({\r\n name: \"clearConstraint\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const tags = p.filters ?? [];\r\n const byId = new Map(tags.map((t) => [t.id, t]));\r\n const children = new Map<string, string[]>();\r\n for (const t of tags) {\r\n if (t.bind_id) {\r\n if (!children.has(t.bind_id)) children.set(t.bind_id, []);\r\n children.get(t.bind_id)!.push(t.id);\r\n }\r\n }\r\n\r\n const process = (id: string) => {\r\n const t = byId.get(id);\r\n if (!t) return;\r\n\r\n const override = t.constraints_overrides?.[flag];\r\n if (override) {\r\n if (!t.constraints) t.constraints = {};\r\n t.constraints[flag] = override.from;\r\n delete t.constraints_overrides![flag];\r\n if (Object.keys(t.constraints_overrides ?? {}).length === 0) {\r\n delete t.constraints_overrides;\r\n }\r\n } else if (t.constraints) {\r\n delete t.constraints[flag];\r\n if (Object.keys(t.constraints).length === 0) {\r\n delete t.constraints;\r\n }\r\n }\r\n\r\n for (const childId of children.get(id) ?? []) {\r\n process(childId);\r\n }\r\n };\r\n\r\n process(tagId);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n","import { normalizeFieldValidation } from \"@/core\";\r\nimport type { FieldValidationRule } from \"@/schema\";\r\nimport type { EditorModuleContext, QuantityRule } from \"./editor-types\";\r\n\r\nexport function getFieldQuantityRule(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n): QuantityRule | undefined {\r\n const props = ctx.getProps();\r\n const f = (props.fields ?? []).find((x) => x.id === id);\r\n if (!f) return undefined;\r\n return normalizeQuantityRule((f as any).meta?.quantity);\r\n}\r\n\r\nexport function setFieldQuantityRule(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n rule: unknown,\r\n): void {\r\n ctx.exec({\r\n name: \"setFieldQuantityRule\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const f = (p.fields ?? []).find((x) => x.id === id);\r\n if (!f) return;\r\n\r\n const normalized = normalizeQuantityRule(rule);\r\n\r\n if (!normalized) {\r\n if ((f as any).meta?.quantity !== undefined) {\r\n delete (f as any).meta.quantity;\r\n if ((f as any).meta && Object.keys((f as any).meta).length === 0) {\r\n delete (f as any).meta;\r\n }\r\n }\r\n return;\r\n }\r\n\r\n (f as any).meta = {\r\n ...(f as any).meta,\r\n quantity: normalized,\r\n };\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function clearFieldQuantityRule(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n): void {\r\n ctx.exec({\r\n name: \"clearFieldQuantityRule\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const f = (p.fields ?? []).find((x) => x.id === id);\r\n if (!f || !(f as any).meta?.quantity) return;\r\n delete (f as any).meta.quantity;\r\n if ((f as any).meta && Object.keys((f as any).meta).length === 0) {\r\n delete (f as any).meta;\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function getFieldValidation(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n): FieldValidationRule[] | undefined {\r\n const props = ctx.getProps();\r\n const f = (props.fields ?? []).find((x) => x.id === id);\r\n if (!f) return undefined;\r\n return normalizeFieldValidation((f as any).validation);\r\n}\r\n\r\nexport function setFieldValidation(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n rules: unknown,\r\n): void {\r\n ctx.exec({\r\n name: \"setFieldValidation\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const f = (p.fields ?? []).find((x) => x.id === id);\r\n if (!f) return;\r\n\r\n const normalized = normalizeFieldValidation(rules);\r\n\r\n if (!normalized) {\r\n if (\"validation\" in f) delete (f as any).validation;\r\n return;\r\n }\r\n\r\n (f as any).validation = normalized;\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function clearFieldValidation(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n): void {\r\n ctx.exec({\r\n name: \"clearFieldValidation\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const f = (p.fields ?? []).find((x) => x.id === id);\r\n if (!f || !(f as any).validation) return;\r\n delete (f as any).validation;\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function normalizeQuantityRule(input: unknown): QuantityRule | undefined {\r\n if (!input || typeof input !== \"object\") return undefined;\r\n const v = input as any;\r\n const vb = v.valueBy;\r\n if (vb !== \"value\" && vb !== \"length\" && vb !== \"eval\") return undefined;\r\n\r\n const out: QuantityRule = { valueBy: vb };\r\n if (vb === \"eval\" && typeof v.code === \"string\" && v.code.trim()) {\r\n out.code = v.code;\r\n }\r\n if (typeof v.multiply === \"number\" && Number.isFinite(v.multiply)) {\r\n out.multiply = v.multiply;\r\n }\r\n if (typeof v.fallback === \"number\" && Number.isFinite(v.fallback)) {\r\n out.fallback = v.fallback;\r\n }\r\n if (v.clamp && typeof v.clamp === \"object\") {\r\n const min =\r\n typeof v.clamp.min === \"number\" && Number.isFinite(v.clamp.min)\r\n ? v.clamp.min\r\n : undefined;\r\n const max =\r\n typeof v.clamp.max === \"number\" && Number.isFinite(v.clamp.max)\r\n ? v.clamp.max\r\n : undefined;\r\n if (min !== undefined || max !== undefined) {\r\n out.clamp = {\r\n ...(min !== undefined ? { min } : {}),\r\n ...(max !== undefined ? { max } : {}),\r\n };\r\n }\r\n }\r\n return out;\r\n}\r\n","import type { ServiceProps } from \"@/schema\";\r\nimport type { EditorModuleContext, WireKind } from \"./editor-types\";\r\nimport { ensureServiceExists, isActualButtonField } from \"./editor-utils\";\r\n\r\nexport function wouldCreateTagCycle(\r\n _ctx: EditorModuleContext,\r\n p: ServiceProps,\r\n parentId: string,\r\n childId: string,\r\n): boolean {\r\n if (parentId === childId) return true;\r\n const tagById = new Map((p.filters ?? []).map((t) => [t.id, t]));\r\n let cur: string | undefined = parentId;\r\n const guard = new Set<string>();\r\n while (cur) {\r\n if (cur === childId) return true;\r\n if (guard.has(cur)) break;\r\n guard.add(cur);\r\n cur = tagById.get(cur)?.bind_id;\r\n }\r\n return false;\r\n}\r\n\r\nexport function wouldCreateIncludeExcludeCycle(\r\n ctx: EditorModuleContext,\r\n p: ServiceProps,\r\n receiverId: string,\r\n targetId: string,\r\n): boolean {\r\n if (receiverId === targetId) return true;\r\n\r\n const getDirectRelations = (id: string): string[] => {\r\n if (ctx.isTagId(id)) {\r\n const t = (p.filters ?? []).find((x) => x.id === id);\r\n return [...(t?.includes ?? []), ...(t?.excludes ?? [])];\r\n }\r\n const inc = p.includes_for_buttons?.[id] ?? [];\r\n const exc = p.excludes_for_buttons?.[id] ?? [];\r\n return [...inc, ...exc];\r\n };\r\n\r\n const visited = new Set<string>();\r\n const stack = [targetId];\r\n\r\n while (stack.length > 0) {\r\n const curr = stack.pop()!;\r\n if (curr === receiverId) return true;\r\n if (visited.has(curr)) continue;\r\n visited.add(curr);\r\n stack.push(...getDirectRelations(curr));\r\n }\r\n\r\n return false;\r\n}\r\n\r\nexport function include(\r\n ctx: EditorModuleContext,\r\n receiverId: string,\r\n idOrIds: string | string[],\r\n) {\r\n ctx.exec({\r\n name: \"include\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const receiver = ctx.getNode(receiverId);\r\n const ids = Array.isArray(idOrIds) ? idOrIds : [idOrIds];\r\n if (\r\n receiver.kind === \"tag\" ||\r\n (receiver.kind === \"field\" && isActualButtonField(receiver.data)) ||\r\n receiver.kind === \"option\"\r\n ) {\r\n if (receiver.kind === \"tag\") {\r\n const t = (p.filters ?? []).find((x) => x.id === receiverId);\r\n if (t) {\r\n const accepted: string[] = [];\r\n const next = new Set(t.includes ?? []);\r\n for (const id of ids) {\r\n if (\r\n wouldCreateIncludeExcludeCycle(\r\n ctx,\r\n p,\r\n receiverId,\r\n id,\r\n )\r\n ) {\r\n ctx.emit(\"editor:error\", {\r\n message: `Cycle detected: ${receiverId} including ${id} would create a cycle.`,\r\n code: \"cycle_detected\",\r\n meta: {\r\n receiverId,\r\n targetId: id,\r\n type: \"include\",\r\n },\r\n });\r\n continue;\r\n }\r\n next.add(id);\r\n accepted.push(id);\r\n }\r\n if (accepted.length > 0 || (t.includes?.length ?? 0) > 0) {\r\n t.includes = Array.from(next);\r\n }\r\n\r\n if (t.excludes) {\r\n t.excludes = t.excludes.filter(\r\n (x) => !accepted.includes(x),\r\n );\r\n if (t.excludes.length === 0) {\r\n delete t.excludes;\r\n }\r\n }\r\n }\r\n } else {\r\n const accepted: string[] = [];\r\n const current = p.includes_for_buttons?.[receiverId] ?? [];\r\n const next = new Set(current);\r\n for (const id of ids) {\r\n if (\r\n wouldCreateIncludeExcludeCycle(ctx, p, receiverId, id)\r\n ) {\r\n ctx.emit(\"editor:error\", {\r\n message: `Cycle detected: ${receiverId} including ${id} would create a cycle.`,\r\n code: \"cycle_detected\",\r\n meta: {\r\n receiverId,\r\n targetId: id,\r\n type: \"include\",\r\n },\r\n });\r\n continue;\r\n }\r\n next.add(id);\r\n accepted.push(id);\r\n }\r\n if (accepted.length > 0 || current.length > 0) {\r\n if (!p.includes_for_buttons) p.includes_for_buttons = {};\r\n p.includes_for_buttons[receiverId] = Array.from(next);\r\n }\r\n\r\n if (p.excludes_for_buttons?.[receiverId]) {\r\n p.excludes_for_buttons[receiverId] =\r\n p.excludes_for_buttons[receiverId].filter(\r\n (x) => !accepted.includes(x),\r\n );\r\n if (p.excludes_for_buttons[receiverId].length === 0) {\r\n delete p.excludes_for_buttons[receiverId];\r\n }\r\n }\r\n }\r\n\r\n if (!p.fields) p.fields = [];\r\n if (!p.filters) p.filters = [];\r\n } else {\r\n throw new Error(\"Receiver must be a tag, button field, or option\");\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function exclude(\r\n ctx: EditorModuleContext,\r\n receiverId: string,\r\n idOrIds: string | string[],\r\n) {\r\n ctx.exec({\r\n name: \"exclude\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const receiver = ctx.getNode(receiverId);\r\n const ids = Array.isArray(idOrIds) ? idOrIds : [idOrIds];\r\n if (\r\n receiver.kind === \"tag\" ||\r\n (receiver.kind === \"field\" && isActualButtonField(receiver.data)) ||\r\n receiver.kind === \"option\"\r\n ) {\r\n if (receiver.kind === \"tag\") {\r\n const t = (p.filters ?? []).find((x) => x.id === receiverId);\r\n if (t) {\r\n const accepted: string[] = [];\r\n const next = new Set(t.excludes ?? []);\r\n for (const id of ids) {\r\n if (\r\n wouldCreateIncludeExcludeCycle(\r\n ctx,\r\n p,\r\n receiverId,\r\n id,\r\n )\r\n ) {\r\n ctx.emit(\"editor:error\", {\r\n message: `Cycle detected: ${receiverId} excluding ${id} would create a cycle.`,\r\n code: \"cycle_detected\",\r\n meta: {\r\n receiverId,\r\n targetId: id,\r\n type: \"exclude\",\r\n },\r\n });\r\n continue;\r\n }\r\n next.add(id);\r\n accepted.push(id);\r\n }\r\n if (accepted.length > 0 || (t.excludes?.length ?? 0) > 0) {\r\n t.excludes = Array.from(next);\r\n }\r\n\r\n if (t.includes) {\r\n t.includes = t.includes.filter(\r\n (x) => !accepted.includes(x),\r\n );\r\n if (t.includes.length === 0) {\r\n delete t.includes;\r\n }\r\n }\r\n }\r\n } else {\r\n const accepted: string[] = [];\r\n const current = p.excludes_for_buttons?.[receiverId] ?? [];\r\n const next = new Set(current);\r\n for (const id of ids) {\r\n if (\r\n wouldCreateIncludeExcludeCycle(ctx, p, receiverId, id)\r\n ) {\r\n ctx.emit(\"editor:error\", {\r\n message: `Cycle detected: ${receiverId} excluding ${id} would create a cycle.`,\r\n code: \"cycle_detected\",\r\n meta: {\r\n receiverId,\r\n targetId: id,\r\n type: \"exclude\",\r\n },\r\n });\r\n continue;\r\n }\r\n next.add(id);\r\n accepted.push(id);\r\n }\r\n if (accepted.length > 0 || current.length > 0) {\r\n if (!p.excludes_for_buttons) p.excludes_for_buttons = {};\r\n p.excludes_for_buttons[receiverId] = Array.from(next);\r\n }\r\n\r\n if (p.includes_for_buttons?.[receiverId]) {\r\n p.includes_for_buttons[receiverId] =\r\n p.includes_for_buttons[receiverId].filter(\r\n (x) => !accepted.includes(x),\r\n );\r\n if (p.includes_for_buttons[receiverId].length === 0) {\r\n delete p.includes_for_buttons[receiverId];\r\n }\r\n }\r\n }\r\n\r\n if (!p.fields) p.fields = [];\r\n if (!p.filters) p.filters = [];\r\n } else {\r\n throw new Error(\"Receiver must be a tag, button field, or option\");\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function connect(\r\n ctx: EditorModuleContext,\r\n kind: WireKind,\r\n fromId: string,\r\n toId: string,\r\n): void {\r\n ctx.exec({\r\n name: `connect:${kind}`,\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n if (kind === \"bind\") {\r\n if (ctx.isTagId(fromId) && ctx.isTagId(toId)) {\r\n if (wouldCreateTagCycle(ctx, p, fromId, toId)) {\r\n throw new Error(`bind would create a cycle: ${fromId} ? ${toId}`);\r\n }\r\n const child = (p.filters ?? []).find((t) => t.id === toId);\r\n if (child) child.bind_id = fromId;\r\n return;\r\n }\r\n if (\r\n (ctx.isTagId(fromId) && ctx.isFieldId(toId)) ||\r\n (ctx.isFieldId(fromId) && ctx.isTagId(toId))\r\n ) {\r\n const fieldId = ctx.isFieldId(toId) ? toId : fromId;\r\n const tagId = ctx.isTagId(fromId) ? fromId : toId;\r\n const f = (p.fields ?? []).find((x) => x.id === fieldId);\r\n if (!f) return;\r\n if (!f.bind_id) {\r\n f.bind_id = tagId;\r\n return;\r\n }\r\n if (typeof f.bind_id === \"string\") {\r\n if (f.bind_id !== tagId) f.bind_id = [f.bind_id, tagId];\r\n return;\r\n }\r\n if (!f.bind_id.includes(tagId)) f.bind_id.push(tagId);\r\n return;\r\n }\r\n throw new Error(`bind: unsupported route ${fromId} ? ${toId}`);\r\n }\r\n\r\n if (kind === \"include\" || kind === \"exclude\") {\r\n const key = kind === \"include\" ? \"includes\" : \"excludes\";\r\n\r\n if (ctx.isTagId(fromId) && ctx.isFieldId(toId)) {\r\n const t = (p.filters ?? []).find((x) => x.id === fromId);\r\n if (!t) return;\r\n const arr = (t[key] ??= []);\r\n if (!arr.includes(toId)) arr.push(toId);\r\n return;\r\n }\r\n\r\n if (ctx.isOptionId(fromId) && ctx.isFieldId(toId)) {\r\n const mapKey =\r\n kind === \"include\"\r\n ? \"includes_for_options\"\r\n : \"excludes_for_options\";\r\n const maps = (p as any)[mapKey] as\r\n | Record<string, string[]>\r\n | undefined;\r\n const next = { ...(maps ?? {}) };\r\n const arr = next[fromId] ?? [];\r\n if (!arr.includes(toId)) arr.push(toId);\r\n next[fromId] = arr;\r\n (p as any)[mapKey] = next;\r\n return;\r\n }\r\n\r\n throw new Error(`${kind}: unsupported route ${fromId} ? ${toId}`);\r\n }\r\n\r\n if (kind === \"service\") {\r\n ensureServiceExists(ctx.opts, fromId);\r\n\r\n if (toId.startsWith(\"t:\")) {\r\n ctx.exec({\r\n name: \"connect:service?tag\",\r\n do: () =>\r\n ctx.patchProps((next) => {\r\n const t = (next.filters ?? []).find((x) => x.id === toId);\r\n if (t) (t as any).service_id = fromId;\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n if (toId.startsWith(\"o:\")) {\r\n ctx.exec({\r\n name: \"connect:service?option\",\r\n do: () =>\r\n ctx.patchProps((next) => {\r\n for (const f of next.fields ?? []) {\r\n const o = f.options?.find((x) => x.id === toId);\r\n if (o) {\r\n (o as any).service_id = fromId;\r\n return;\r\n }\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n throw new Error('service: to must be a tag (\"t:*\") or option (\"o:*\")');\r\n }\r\n\r\n throw new Error(`Unknown connect kind: ${kind}`);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function disconnect(\r\n ctx: EditorModuleContext,\r\n kind: WireKind,\r\n fromId: string,\r\n toId: string,\r\n): void {\r\n ctx.exec({\r\n name: `disconnect:${kind}`,\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n if (kind === \"bind\") {\r\n if (ctx.isTagId(fromId) && ctx.isTagId(toId)) {\r\n const child = (p.filters ?? []).find((t) => t.id === toId);\r\n if (child?.bind_id === fromId) delete child.bind_id;\r\n return;\r\n }\r\n if (\r\n (ctx.isTagId(fromId) && ctx.isFieldId(toId)) ||\r\n (ctx.isFieldId(fromId) && ctx.isTagId(toId))\r\n ) {\r\n const fieldId = ctx.isFieldId(toId) ? toId : fromId;\r\n const tagId = ctx.isTagId(fromId) ? fromId : toId;\r\n const f = (p.fields ?? []).find((x) => x.id === fieldId);\r\n if (!f?.bind_id) return;\r\n if (typeof f.bind_id === \"string\") {\r\n if (f.bind_id === tagId) delete f.bind_id;\r\n return;\r\n }\r\n f.bind_id = f.bind_id.filter((x) => x !== tagId) as any;\r\n if (f.bind_id?.length === 0) delete f.bind_id;\r\n return;\r\n }\r\n throw new Error(`unbind: unsupported route ${fromId} ? ${toId}`);\r\n }\r\n\r\n if (kind === \"include\" || kind === \"exclude\") {\r\n const key = kind === \"include\" ? \"includes\" : \"excludes\";\r\n\r\n if (ctx.isTagId(fromId) && ctx.isFieldId(toId)) {\r\n const t = (p.filters ?? []).find((x) => x.id === fromId);\r\n if (!t) return;\r\n t[key] = (t[key] ?? []).filter((x) => x !== toId);\r\n if (!t[key]?.length) delete (t as any)[key];\r\n return;\r\n }\r\n\r\n if (ctx.isOptionId(fromId) && ctx.isFieldId(toId)) {\r\n const mapKey =\r\n kind === \"include\"\r\n ? \"includes_for_options\"\r\n : \"excludes_for_options\";\r\n const maps = (p as any)[mapKey] as\r\n | Record<string, string[]>\r\n | undefined;\r\n if (!maps) return;\r\n if (maps[fromId]) {\r\n maps[fromId] = (maps[fromId] ?? []).filter(\r\n (fid) => fid !== toId,\r\n );\r\n if (!maps[fromId]?.length) delete maps[fromId];\r\n }\r\n if (!Object.keys(maps).length) delete (p as any)[mapKey];\r\n return;\r\n }\r\n\r\n throw new Error(`${kind}: unsupported route ${fromId} ? ${toId}`);\r\n }\r\n\r\n if (kind === \"service\") {\r\n ensureServiceExists(ctx.opts, fromId);\r\n\r\n if (toId.startsWith(\"t:\")) {\r\n ctx.exec({\r\n name: \"disconnect:service?tag\",\r\n do: () =>\r\n ctx.patchProps((next) => {\r\n const t = (next.filters ?? []).find((x) => x.id === toId);\r\n if (t) delete (t as any).service_id;\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n if (toId.startsWith(\"o:\")) {\r\n ctx.exec({\r\n name: \"disconnect:service?option\",\r\n do: () =>\r\n ctx.patchProps((next) => {\r\n for (const f of next.fields ?? []) {\r\n const o = f.options?.find((x) => x.id === toId);\r\n if (o) {\r\n delete (o as any).service_id;\r\n return;\r\n }\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n throw new Error('service: to must be a tag (\"t:*\") or option (\"o:*\")');\r\n }\r\n\r\n throw new Error(`Unknown disconnect kind: ${kind}`);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n","import {\r\n filterServicesForVisibleGroup as filterServicesForVisibleGroupCore,\r\n type FilterServicesForVisibleGroupInput,\r\n} from \"@/core\";\r\nimport type { FallbackSettings } from \"@/schema\";\r\nimport type { EditorModuleContext, ServiceCheck } from \"./editor-types\";\r\n\r\nexport function filterServicesForVisibleGroup(\r\n ctx: EditorModuleContext,\r\n candidates: Array<number | string>,\r\n input: {\r\n tagId: string;\r\n selectedButtons?: string[];\r\n usedServiceIds: Array<number | string>;\r\n effectiveConstraints?: Partial<Record<\"refill\" | \"cancel\" | \"dripfeed\", boolean>>;\r\n policies?: unknown;\r\n fallback?: FallbackSettings;\r\n },\r\n): ServiceCheck[] {\r\n const coreInput: FilterServicesForVisibleGroupInput = {\r\n candidates,\r\n context: {\r\n tagId: input.tagId,\r\n selectedButtons: input.selectedButtons,\r\n usedServiceIds: input.usedServiceIds,\r\n effectiveConstraints: input.effectiveConstraints,\r\n policies: input.policies,\r\n fallback: input.fallback,\r\n },\r\n };\r\n const result = filterServicesForVisibleGroupCore(coreInput, {\r\n builder: ctx.builder,\r\n });\r\n ctx.setLastPolicyDiagnostics(result.diagnostics);\r\n return result.checks;\r\n}\r\n","import type { Tag } from \"@/schema\";\r\nimport type { EditorModuleContext } from \"./editor-types\";\r\nimport { ownerOfOption } from \"./editor-utils\";\r\n\r\nexport function placeNode(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n opts: {\r\n scopeTagId?: string;\r\n beforeId?: string;\r\n afterId?: string;\r\n index?: number;\r\n },\r\n) {\r\n if (ctx.isTagId(id)) {\r\n ctx.exec({\r\n name: \"placeTag\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const all = p.filters ?? [];\r\n const cur = all.find((t) => t.id === id);\r\n if (!cur) return;\r\n const groupKey = cur.bind_id ?? \"__root__\";\r\n const siblings = all.filter(\r\n (t) => (t.bind_id ?? \"__root__\") === groupKey,\r\n );\r\n\r\n const curIdx = siblings.findIndex((t) => t.id === id);\r\n if (curIdx < 0) return;\r\n const pulled = siblings.splice(curIdx, 1)[0];\r\n\r\n let dest = typeof opts.index === \"number\" ? opts.index : undefined;\r\n if (opts.beforeId) {\r\n dest = Math.max(\r\n 0,\r\n siblings.findIndex((t) => t.id === opts.beforeId),\r\n );\r\n }\r\n if (opts.afterId) {\r\n dest = Math.min(\r\n siblings.length,\r\n siblings.findIndex((t) => t.id === opts.afterId) + 1,\r\n );\r\n }\r\n if (dest === undefined || Number.isNaN(dest)) {\r\n dest = siblings.length;\r\n }\r\n\r\n const out: Tag[] = [];\r\n for (const t of all) {\r\n const sameGroup = (t.bind_id ?? \"__root__\") === groupKey;\r\n if (!sameGroup) {\r\n out.push(t);\r\n }\r\n }\r\n siblings.splice(dest, 0, pulled);\r\n p.filters = [...out, ...siblings];\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n if (ctx.isFieldId(id)) {\r\n if (!opts.scopeTagId) {\r\n throw new Error(\"placeNode(field): scopeTagId is required\");\r\n }\r\n const fieldId = id;\r\n const tagId = opts.scopeTagId;\r\n\r\n ctx.exec({\r\n name: \"placeField\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const map = (p.order_for_tags ??= {});\r\n const arr = (map[tagId] ??= []);\r\n const curIdx = arr.indexOf(fieldId);\r\n if (curIdx >= 0) arr.splice(curIdx, 1);\r\n\r\n let dest = typeof opts.index === \"number\" ? opts.index : undefined;\r\n if (opts.beforeId) dest = Math.max(0, arr.indexOf(opts.beforeId));\r\n if (opts.afterId) {\r\n dest = Math.min(arr.length, arr.indexOf(opts.afterId) + 1);\r\n }\r\n if (dest === undefined || Number.isNaN(dest)) dest = arr.length;\r\n\r\n arr.splice(dest, 0, fieldId);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n if (ctx.isOptionId(id)) {\r\n placeOption(ctx, id, opts);\r\n return;\r\n }\r\n\r\n throw new Error(\"placeNode: unknown id prefix\");\r\n}\r\n\r\nexport function placeOption(\r\n ctx: EditorModuleContext,\r\n optionId: string,\r\n opts: { beforeId?: string; afterId?: string; index?: number },\r\n) {\r\n if (!ctx.isOptionId(optionId)) {\r\n throw new Error('placeOption: optionId must start with \"o:\"');\r\n }\r\n\r\n ctx.exec({\r\n name: \"placeOption\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const owner = ownerOfOption(p, optionId);\r\n if (!owner) return;\r\n const f = (p.fields ?? []).find((x) => x.id === owner.fieldId);\r\n if (!f?.options) return;\r\n\r\n const curIdx = f.options.findIndex((o) => o.id === optionId);\r\n if (curIdx < 0) return;\r\n\r\n const pulled = f.options.splice(curIdx, 1)[0];\r\n\r\n let dest = typeof opts.index === \"number\" ? opts.index : undefined;\r\n if (opts.beforeId) {\r\n dest = Math.max(\r\n 0,\r\n f.options.findIndex((o) => o.id === opts.beforeId),\r\n );\r\n }\r\n if (opts.afterId) {\r\n dest = Math.min(\r\n f.options.length,\r\n f.options.findIndex((o) => o.id === opts.afterId) + 1,\r\n );\r\n }\r\n if (dest === undefined || Number.isNaN(dest)) {\r\n dest = f.options.length;\r\n }\r\n\r\n f.options.splice(dest, 0, pulled);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n","// src/react/canvas/editor/editor-catalog.ts\n\nimport type {\n CatalogId,\n CatalogNode,\n CatalogServiceId,\n CatalogSmartRule,\n ServiceCatalogState,\n} from \"@/schema\";\n\nfunction clone<T>(value: T): T {\n return JSON.parse(JSON.stringify(value));\n}\n\nfunction normalizeServiceIds(\n ids: Array<CatalogServiceId> | undefined,\n): Array<CatalogServiceId> {\n if (!ids?.length) return [];\n const seen = new Set<string>();\n const out: Array<CatalogServiceId> = [];\n\n for (const id of ids) {\n const key = String(id);\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(id);\n }\n\n return out;\n}\n\nfunction sortNodes(nodes: CatalogNode[]): CatalogNode[] {\n return [...nodes].sort((a, b) => {\n const ao = a.order ?? 0;\n const bo = b.order ?? 0;\n if (ao !== bo) return ao - bo;\n return a.label.localeCompare(b.label);\n });\n}\n\nexport function createEmptyCatalog(): ServiceCatalogState {\n return {\n version: 1,\n nodes: [],\n activeNodeId: undefined,\n expandedIds: [],\n pinnedNodeIds: [],\n selectedServiceId: undefined,\n viewMode: \"all\",\n };\n}\n\nexport function ensureCatalog(\n catalog?: ServiceCatalogState,\n): ServiceCatalogState {\n return clone(catalog ?? createEmptyCatalog());\n}\n\nexport function getCatalogNode(\n catalog: ServiceCatalogState | undefined,\n id: CatalogId,\n): CatalogNode | undefined {\n return (catalog?.nodes ?? []).find((x) => x.id === id);\n}\n\nexport function getCatalogChildren(\n catalog: ServiceCatalogState | undefined,\n parentId?: CatalogId,\n): CatalogNode[] {\n return sortNodes(\n (catalog?.nodes ?? []).filter((x) => x.parentId === parentId),\n );\n}\n\nexport function hasCatalogNode(\n catalog: ServiceCatalogState | undefined,\n id: CatalogId,\n): boolean {\n return !!getCatalogNode(catalog, id);\n}\n\nexport function createCatalogId(\n catalog: ServiceCatalogState | undefined,\n prefix = \"cg\",\n): string {\n const taken = new Set((catalog?.nodes ?? []).map((x) => x.id));\n for (let i = 1; i < 10000; i++) {\n const id = `${prefix}:${i}`;\n if (!taken.has(id)) return id;\n }\n throw new Error(\"Unable to generate catalog id\");\n}\n\nexport function addCatalogGroup(\n catalog: ServiceCatalogState | undefined,\n input: {\n id?: string;\n label: string;\n parentId?: string;\n description?: string;\n serviceIds?: Array<CatalogServiceId>;\n collapsed?: boolean;\n order?: number;\n color?: string;\n icon?: string;\n },\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n const id = input.id ?? createCatalogId(next, \"cg\");\n\n next.nodes.push({\n id,\n kind: \"group\",\n label: input.label,\n parentId: input.parentId,\n description: input.description,\n serviceIds: normalizeServiceIds(input.serviceIds),\n collapsed: input.collapsed,\n order: input.order,\n color: input.color,\n icon: input.icon,\n });\n\n next.activeNodeId = id;\n return next;\n}\n\nexport function addSmartCatalogGroup(\n catalog: ServiceCatalogState | undefined,\n input: {\n id?: string;\n label: string;\n parentId?: string;\n description?: string;\n rules: CatalogSmartRule[];\n match?: \"all\" | \"any\";\n collapsed?: boolean;\n order?: number;\n color?: string;\n icon?: string;\n },\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n const id = input.id ?? createCatalogId(next, \"csg\");\n\n next.nodes.push({\n id,\n kind: \"smart-group\",\n label: input.label,\n parentId: input.parentId,\n description: input.description,\n rules: clone(input.rules ?? []),\n match: input.match ?? \"all\",\n collapsed: input.collapsed,\n order: input.order,\n color: input.color,\n icon: input.icon,\n });\n\n next.activeNodeId = id;\n return next;\n}\n\nexport function updateCatalogNode(\n catalog: ServiceCatalogState | undefined,\n id: CatalogId,\n patch: Partial<Omit<CatalogNode, \"id\" | \"kind\">>,\n): ServiceCatalogState | undefined {\n if (!catalog) return catalog;\n\n const next = ensureCatalog(catalog);\n const idx = next.nodes.findIndex((x) => x.id === id);\n if (idx < 0) return next;\n\n const current = next.nodes[idx]!;\n next.nodes[idx] = {\n ...current,\n ...patch,\n } as CatalogNode;\n\n if (next.nodes[idx]?.kind === \"group\") {\n next.nodes[idx] = {\n ...next.nodes[idx],\n serviceIds: normalizeServiceIds(\n (next.nodes[idx] as Extract<CatalogNode, { kind: \"group\" }>)\n .serviceIds,\n ),\n } as CatalogNode;\n }\n\n return next;\n}\n\nexport function setActiveCatalogNode(\n catalog: ServiceCatalogState | undefined,\n id?: CatalogId,\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n next.activeNodeId = id;\n return next;\n}\n\nexport function setCatalogViewMode(\n catalog: ServiceCatalogState | undefined,\n mode: ServiceCatalogState[\"viewMode\"],\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n next.viewMode = mode;\n return next;\n}\n\nexport function setSelectedCatalogService(\n catalog: ServiceCatalogState | undefined,\n serviceId?: CatalogServiceId,\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n next.selectedServiceId = serviceId;\n return next;\n}\n\nexport function toggleCatalogExpanded(\n catalog: ServiceCatalogState | undefined,\n id: CatalogId,\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n const expanded = new Set(next.expandedIds ?? []);\n\n if (expanded.has(id)) expanded.delete(id);\n else expanded.add(id);\n\n next.expandedIds = Array.from(expanded);\n return next;\n}\n\nexport function setCatalogExpanded(\n catalog: ServiceCatalogState | undefined,\n id: CatalogId,\n expanded: boolean,\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n const set = new Set(next.expandedIds ?? []);\n\n if (expanded) set.add(id);\n else set.delete(id);\n\n next.expandedIds = Array.from(set);\n return next;\n}\n\nexport function toggleCatalogPinned(\n catalog: ServiceCatalogState | undefined,\n id: CatalogId,\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n const pinned = new Set(next.pinnedNodeIds ?? []);\n\n if (pinned.has(id)) pinned.delete(id);\n else pinned.add(id);\n\n next.pinnedNodeIds = Array.from(pinned);\n return next;\n}\n\nexport function assignServicesToCatalogGroup(\n catalog: ServiceCatalogState | undefined,\n nodeId: CatalogId,\n serviceIds: Array<CatalogServiceId>,\n mode: \"append\" | \"replace\" | \"remove\" = \"append\",\n): ServiceCatalogState | undefined {\n if (!catalog) return catalog;\n\n const next = ensureCatalog(catalog);\n const node = next.nodes.find(\n (x) => x.id === nodeId && x.kind === \"group\",\n ) as Extract<CatalogNode, { kind: \"group\" }> | undefined;\n\n if (!node) return next;\n\n const incoming = normalizeServiceIds(serviceIds);\n const current = normalizeServiceIds(node.serviceIds);\n\n if (mode === \"replace\") {\n node.serviceIds = incoming;\n return next;\n }\n\n if (mode === \"append\") {\n node.serviceIds = normalizeServiceIds([...current, ...incoming]);\n return next;\n }\n\n node.serviceIds = current.filter(\n (id) => !incoming.some((x) => String(x) === String(id)),\n );\n return next;\n}\n\nexport function clearCatalog(): ServiceCatalogState {\n return createEmptyCatalog();\n}\n\nexport function removeCatalogNode(\n catalog: ServiceCatalogState | undefined,\n id: CatalogId,\n opts?: { cascade?: boolean },\n): ServiceCatalogState | undefined {\n if (!catalog) return catalog;\n\n const next = ensureCatalog(catalog);\n\n const ids = new Set<string>([id]);\n\n if (opts?.cascade) {\n const queue = [id];\n while (queue.length) {\n const current = queue.shift()!;\n for (const child of next.nodes.filter(\n (x) => x.parentId === current,\n )) {\n if (!ids.has(child.id)) {\n ids.add(child.id);\n queue.push(child.id);\n }\n }\n }\n }\n\n next.nodes = next.nodes.filter((x) => !ids.has(x.id));\n\n if (next.activeNodeId && ids.has(next.activeNodeId)) {\n next.activeNodeId = undefined;\n }\n\n next.expandedIds = (next.expandedIds ?? []).filter((x) => !ids.has(x));\n next.pinnedNodeIds = (next.pinnedNodeIds ?? []).filter((x) => !ids.has(x));\n\n return next;\n}\n\nexport function moveCatalogNode(\n catalog: ServiceCatalogState | undefined,\n nodeId: CatalogId,\n opts: {\n parentId?: CatalogId;\n beforeId?: CatalogId;\n afterId?: CatalogId;\n index?: number;\n },\n): ServiceCatalogState | undefined {\n if (!catalog) return catalog;\n\n const next = ensureCatalog(catalog);\n const node = next.nodes.find((x) => x.id === nodeId);\n if (!node) return next;\n\n node.parentId = opts.parentId;\n\n const siblings = next.nodes\n .filter((x) => x.parentId === opts.parentId && x.id !== nodeId)\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n\n let dest = typeof opts.index === \"number\" ? opts.index : siblings.length;\n\n if (opts.beforeId) {\n const idx = siblings.findIndex((x) => x.id === opts.beforeId);\n if (idx >= 0) dest = idx;\n }\n\n if (opts.afterId) {\n const idx = siblings.findIndex((x) => x.id === opts.afterId);\n if (idx >= 0) dest = idx + 1;\n }\n\n const ordered = [...siblings];\n ordered.splice(dest, 0, node);\n\n ordered.forEach((item, i) => {\n item.order = i;\n });\n\n return next;\n}\n\nexport function resolveSmartCatalogGroup(\n catalog: ServiceCatalogState | undefined,\n nodeId: CatalogId,\n candidates: Array<CatalogServiceId>,\n matchers: {\n serviceField?: (\n candidate: CatalogServiceId,\n rule: Extract<CatalogSmartRule, { type: \"service-field\" }>,\n ) => boolean;\n policyFamily?: (\n candidate: CatalogServiceId,\n rule: Extract<CatalogSmartRule, { type: \"policy-family\" }>,\n ) => boolean;\n compatibility?: (\n candidate: CatalogServiceId,\n rule: Extract<CatalogSmartRule, { type: \"compatibility\" }>,\n ) => boolean;\n },\n): ServiceCatalogState | undefined {\n if (!catalog) return catalog;\n\n const next = ensureCatalog(catalog);\n const node = next.nodes.find(\n (x) => x.id === nodeId && x.kind === \"smart-group\",\n ) as Extract<CatalogNode, { kind: \"smart-group\" }> | undefined;\n\n if (!node) return next;\n\n const rules = node.rules ?? [];\n const mode = node.match ?? \"all\";\n\n const resolved = candidates.filter((candidate) => {\n const results = rules.map((rule) => {\n if (rule.type === \"service-field\") {\n return matchers.serviceField?.(candidate, rule) ?? false;\n }\n if (rule.type === \"policy-family\") {\n return matchers.policyFamily?.(candidate, rule) ?? false;\n }\n return matchers.compatibility?.(candidate, rule) ?? false;\n });\n\n return mode === \"all\" ? results.every(Boolean) : results.some(Boolean);\n });\n\n node.resolvedServiceIds = normalizeServiceIds(resolved);\n node.resolvedAt = Date.now();\n\n return next;\n}\n","// src/react/canvas/selection.ts\r\nimport { createNodeIndex, type Builder } from \"@/core\";\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) {\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\n const firstBindId = (field?: Field): string | undefined => {\n if (!field?.bind_id) return undefined;\n return Array.isArray(field.bind_id)\n ? field.bind_id[0]\n : field.bind_id;\n };\n\n const resolveField = (): Field | undefined => {\n const direct = fields.find((x) => x.id === id);\n if (direct) return direct;\n\n if (this.builder.isOptionId(id)) {\n return fields.find((x) =>\n (x.options ?? []).some((o) => o.id === id),\n );\n }\n\n if (id.includes(\"::\")) {\n const [fieldId] = id.split(\"::\");\n if (!fieldId) return undefined;\n return fields.find((x) => x.id === fieldId);\n }\n\n return undefined;\n };\n\n const field = resolveField();\n if (!field) return;\n\n const currentTagId = this.currentTag();\n if (currentTagId) {\n const currentTagNode = createNodeIndex(this.builder).getTag(\n currentTagId,\n );\n if (currentTagNode?.getDescendant(field.id)) {\n this.currentTagId = currentTagId;\n return;\n }\n }\n\n const fallbackTagId = firstBindId(field);\n if (fallbackTagId) this.currentTagId = fallbackTagId;\n }\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>, primary?: string): void {\n this.selection.many(ids, primary);\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 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/workspace/context/use-canvas.ts\n\nimport * as React from \"react\";\nimport { useMemo } from \"react\";\n\nimport type { CanvasAPI } from \"@/react\";\nimport type { CanvasState } from \"@/schema/canvas-types\";\nimport type { GraphSnapshot } from \"@/schema/graph\";\nimport type { Field, FieldOption, ServiceProps, Tag } from \"@/schema\";\n\nimport { useCanvasAPI } from \"../context\";\nimport type { VisibleGroupResult } from \"@/react/canvas/selection\";\nimport { createNodeIndex, NodeIndex } from \"@/core\";\nimport { NodeMap } from \"@/core/node-map\";\n\n/** Tree node */\nexport interface TreeNode<T = unknown> {\n id: string | number;\n title: string;\n children?:\n | Array<TreeNode<T>>\n | (() => Array<TreeNode<T>> | Promise<Array<TreeNode<T>>>);\n data?: T;\n}\n\nexport type CanvasSelection = {\n /** raw ids from CanvasState.selection */\n ids: readonly string[];\n tagIds: readonly string[];\n fieldIds: readonly string[];\n optionIds: readonly string[];\n};\n\nexport interface UseCanvasReturn {\n layers: {\n tags: Array<TreeNode<Tag & { active: boolean }>>;\n fields: Array<TreeNode<Field | FieldOption>>; // visible fields (+ option children)\n };\n\n selector: NodeIndex;\n\n /** selection (stateful, raw) */\n selection: readonly string[];\n\n /** selection (stateful, derived) */\n selectionInfo: CanvasSelection;\n\n /** active (last-selected / focused) id (stateful) */\n activeId: string | null;\n\n /** imperative active setter (does NOT select; just “preference”) */\n setActive: (id: string | null) => void;\n\n graph: GraphSnapshot;\n api: CanvasAPI;\n props?: ServiceProps;\n}\n\n/** ---------------- helpers ---------------- */\nfunction deriveSelectionInfo(\n props: NodeMap,\n ids: readonly string[],\n): CanvasSelection {\n const tags: string[] = [];\n const fields: string[] = [];\n const options: string[] = [];\n\n for (const id of ids) {\n const node = props.get(id);\n if (!node) continue;\n\n if (node.kind == \"tag\") {\n tags.push(id);\n continue;\n }\n\n if (node.kind == \"option\") {\n options.push(id);\n continue;\n }\n\n if (node.kind == \"field\") {\n fields.push(id);\n }\n }\n\n // de-dupe while keeping order\n const uniq = (arr: string[]) => {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const x of arr) if (!seen.has(x)) (seen.add(x), out.push(x));\n return out;\n };\n\n return {\n ids,\n tagIds: uniq(tags),\n fieldIds: uniq(fields),\n optionIds: uniq(options),\n };\n}\n\nfunction tagBindIds(tag: Tag): string[] {\n const bind = (tag as any).bind_id as undefined | string | string[];\n if (!bind) return [];\n return Array.isArray(bind) ? bind : [bind];\n}\n\nfunction buildTagTree(\n tags: readonly Tag[],\n isActive: (tagId: string) => boolean,\n): Array<TreeNode<Tag & { active: boolean }>> {\n const nodeById = new Map<string, TreeNode<Tag & { active: boolean }>>();\n const childrenByParent = new Map<\n string,\n Array<TreeNode<Tag & { active: boolean }>>\n >();\n\n for (const t of tags) {\n nodeById.set(t.id, {\n id: t.id,\n title: t.label,\n data: { ...t, active: isActive(t.id) },\n });\n }\n\n for (const t of tags) {\n const child = nodeById.get(t.id);\n if (!child) continue;\n\n for (const parentId of tagBindIds(t)) {\n if (!nodeById.has(parentId)) continue;\n const list = childrenByParent.get(parentId) ?? [];\n list.push(child);\n childrenByParent.set(parentId, list);\n }\n }\n\n for (const [parentId, kids] of childrenByParent) {\n const parent = nodeById.get(parentId);\n if (parent) parent.children = kids;\n }\n\n const roots: Array<TreeNode<Tag & { active: boolean }>> = [];\n for (const t of tags) {\n const parents = tagBindIds(t).filter((pid) => nodeById.has(pid));\n if (parents.length === 0) roots.push(nodeById.get(t.id)!);\n }\n\n return roots;\n}\n\nfunction buildFieldTree(fields: Field[]): Array<TreeNode<Field | FieldOption>> {\n return fields.map((f) => {\n const node: TreeNode<Field | FieldOption> = {\n id: f.id,\n title: f.label,\n data: f,\n };\n\n // children must exist if field supports options (options prop exists), even if []\n if (\"options\" in f) {\n const opts = Array.isArray(f.options) ? f.options : [];\n node.children = opts.map((opt) => ({\n id: opt.id,\n title: opt.label,\n data: opt,\n }));\n }\n\n return node;\n });\n}\n\nfunction computeLayersFromVisibleGroup(\n props: ServiceProps,\n vg: VisibleGroupResult,\n): UseCanvasReturn[\"layers\"] {\n const activeTagIds = new Set<string>();\n let fields: Field[];\n\n if (vg.kind === \"single\") {\n if (vg.group.tagId) activeTagIds.add(vg.group.tagId);\n fields = vg.group.fields ?? [];\n } else {\n for (const id of vg.groups) {\n if (typeof id === \"string\" && id.startsWith(\"t:\"))\n activeTagIds.add(id);\n }\n fields = [];\n }\n\n return {\n tags: buildTagTree(props.filters ?? [], (id) => activeTagIds.has(id)),\n fields: buildFieldTree(fields),\n };\n}\n\n/** active id resolution */\nfunction findNewId(\n prev: readonly string[],\n next: readonly string[],\n): string | undefined {\n const prevSet = new Set(prev);\n for (const id of next) if (!prevSet.has(id)) return id;\n return undefined;\n}\n\nfunction resolveActiveId(\n desiredActive: string | null,\n prevSel: readonly string[],\n nextSel: readonly string[],\n): string | null {\n // 1) keep desired if it’s still selected\n if (desiredActive && nextSel.includes(desiredActive)) return desiredActive;\n\n // 2) prefer the “new guy” (first id that wasn’t in prev)\n const added = findNewId(prevSel, nextSel);\n if (added) return added;\n\n // 3) fallback: last selection\n if (nextSel.length) return nextSel[nextSel.length - 1] ?? null;\n\n return null;\n}\n\n/** ---------------- hook ---------------- */\n\nexport function useCanvas(): UseCanvasReturn {\n const api = useCanvasAPI();\n\n const snap0 = api.snapshot();\n const props0 = api.editor.getProps() as ServiceProps;\n\n const initialSelection = Array.from(snap0.selection as ReadonlySet<string>);\n\n const [graph, setGraph] = React.useState<GraphSnapshot>(snap0.graph);\n const [props, setProps] = React.useState<ServiceProps>(props0);\n\n const [selection, setSelection] =\n React.useState<readonly string[]>(initialSelection);\n\n const [selectionInfo, setSelectionInfo] = React.useState<CanvasSelection>(\n () => deriveSelectionInfo(api.builder.getNodeMap(), initialSelection),\n );\n\n const [layers, setLayers] = React.useState<UseCanvasReturn[\"layers\"]>(() =>\n computeLayersFromVisibleGroup(props0, api.selection.visibleGroup()),\n );\n\n // --- imperative active controller\n const desiredActiveRef = React.useRef<string | null>(null);\n const prevSelectionRef = React.useRef<readonly string[]>(initialSelection);\n\n const [activeId, setActiveId] = React.useState<string | null>(() => {\n return initialSelection.length\n ? initialSelection[initialSelection.length - 1]\n : null;\n });\n\n const setActive = React.useCallback(\n (id: string | null) => {\n desiredActiveRef.current = id;\n\n // if already selected, reflect immediately\n if (id && selection.includes(id)) setActiveId(id);\n if (id === null) setActiveId(null);\n },\n [selection],\n );\n\n React.useEffect(() => {\n const off = api.on(\"state:change\", (snap: CanvasState) => {\n setGraph(snap.graph);\n\n const nextProps = api.editor.getProps() as ServiceProps;\n setProps(nextProps);\n\n const nextSelection = Array.from(\n snap.selection as ReadonlySet<string>,\n ) as readonly string[];\n\n setSelection(nextSelection);\n const nodemap = api.builder.getNodeMap();\n setSelectionInfo(deriveSelectionInfo(nodemap, nextSelection));\n\n setLayers(\n computeLayersFromVisibleGroup(\n nextProps,\n api.selection.visibleGroup(),\n ),\n );\n\n // reconcile active\n const prevSel = prevSelectionRef.current;\n const desired = desiredActiveRef.current;\n const nextActive = resolveActiveId(desired, prevSel, nextSelection);\n\n prevSelectionRef.current = nextSelection;\n setActiveId(nextActive);\n });\n\n return off;\n }, [api]);\n\n const selector = useMemo(() => createNodeIndex(api.builder), [props]);\n\n return React.useMemo(\n () => ({\n api,\n graph,\n layers,\n props,\n selection,\n selectionInfo,\n selector,\n activeId,\n setActive,\n }),\n [\n api,\n graph,\n layers,\n props,\n selection,\n selectionInfo,\n selector,\n activeId,\n setActive,\n ],\n );\n}\n","// src/react/workspace/context/use-errors.ts\n\nimport * as React from \"react\";\n\nimport { validate } from \"@/core/validate\"; // engine-only\nimport type {\n ServiceProps,\n ValidationError as CoreValidationError,\n} from \"@/schema\";\n\nimport { useCanvasAPI } from \"../context\";\n\n/** ---------------- Types ---------------- */\n\nexport type ErrorKind = \"validation\" | \"log\";\n\nexport type ValidationRow = CoreValidationError & {\n id: string; // stable key\n kind: \"validation\";\n};\n\nexport type ErrorLog = {\n id: string;\n kind: \"log\";\n message: string;\n code?: string;\n createdAt: number;\n meta?: any;\n};\n\nexport interface MergedErrors {\n validation: readonly ValidationRow[];\n logs: readonly ErrorLog[];\n\n counts: {\n validation: number;\n logs: number;\n total: number;\n };\n\n groups: Array<\n | { kind: \"validation\"; title: string; rows: readonly ValidationRow[] }\n | { kind: \"log\"; title: string; rows: readonly ErrorLog[] }\n >;\n\n forEach(\n fn: (row: ValidationRow | ErrorLog, kind: \"validation\" | \"log\") => void,\n ): void;\n}\n\nexport type ClearTarget = \"logs\" | \"merged\";\n\nexport interface UseErrorsReturn {\n /** Unclearable (until validate() returns clean) */\n validation: readonly ValidationRow[];\n\n /** Clearable log stream (editor/runtime events) */\n logs: readonly ErrorLog[];\n\n /** Organised merged view */\n merged: MergedErrors;\n\n /** True while a validation run is pending/in-flight */\n validating: boolean;\n\n /** Clear logs; clearing merged clears logs too */\n clear(target: ClearTarget): void;\n\n /** Remove a single log row */\n removeLog(id: string): void;\n}\n\nexport type UseErrorsOptions = {\n /** Keep last N logs */\n logLimit?: number;\n\n /** Dedupe identical consecutive logs within this window */\n logDedupeWindowMs?: number;\n\n /** Debounce validation triggered by state:change */\n debounceMs?: number;\n\n /**\n * Prefer idle-time validation to avoid UI hitching.\n * If requestIdleCallback isn't available, falls back to setTimeout(0).\n */\n useIdle?: boolean;\n\n /** requestIdleCallback timeout */\n idleTimeoutMs?: number;\n};\n\n/** ---------------- Helpers ---------------- */\n\nfunction makeId(prefix: string): string {\n return `${prefix}:${Date.now()}:${Math.random().toString(16).slice(2)}`;\n}\n\nfunction stableKey(parts: Array<string | undefined | null>): string {\n return parts.filter(Boolean).join(\"|\");\n}\n\nfunction toValidationRows(list: CoreValidationError[]): ValidationRow[] {\n return (list ?? []).map((e) => ({\n ...e,\n kind: \"validation\" as const,\n id:\n stableKey([\n \"v\",\n String((e as any).code ?? \"\"),\n String((e as any).severity ?? \"\"),\n String((e as any).nodeId ?? \"\"),\n String((e as any).message ?? \"\"),\n ]) || makeId(\"v\"),\n }));\n}\n\nfunction normalizeLog(e: any): Omit<ErrorLog, \"id\" | \"createdAt\" | \"kind\"> {\n return {\n message: e?.message ?? String(e),\n code: e?.code,\n meta: e?.meta ?? e,\n };\n}\n\nfunction sameLog(\n a: ErrorLog,\n b: Omit<ErrorLog, \"id\" | \"createdAt\" | \"kind\">,\n): boolean {\n return a.message === b.message && (a.code ?? \"\") === (b.code ?? \"\");\n}\n\nfunction schedule(fn: () => void, useIdle: boolean, idleTimeoutMs: number) {\n if (useIdle && typeof (window as any).requestIdleCallback === \"function\") {\n (window as any).requestIdleCallback(fn, { timeout: idleTimeoutMs });\n return;\n }\n window.setTimeout(fn, 0);\n}\n\n/** ---------------- Hook ---------------- */\n\nexport function useErrors(opts: UseErrorsOptions = {}): UseErrorsReturn {\n const api = useCanvasAPI();\n\n const logLimit = Math.max(1, Math.min(opts.logLimit ?? 200, 2000));\n const dedupeWindowMs = Math.max(0, opts.logDedupeWindowMs ?? 400);\n const debounceMs = Math.max(0, opts.debounceMs ?? 120);\n const useIdle = opts.useIdle ?? true;\n const idleTimeoutMs = Math.max(0, opts.idleTimeoutMs ?? 250);\n\n const [validation, setValidation] = React.useState<ValidationRow[]>([]);\n const [validating, setValidating] = React.useState(false);\n\n const [logs, setLogs] = React.useState<ErrorLog[]>([]);\n\n // ---- logs (clearable)\n const pushLog = React.useCallback(\n (entry: Omit<ErrorLog, \"id\" | \"createdAt\" | \"kind\">) => {\n setLogs((prev) => {\n const now = Date.now();\n const last = prev[prev.length - 1];\n\n if (\n last &&\n sameLog(last, entry) &&\n now - last.createdAt <= dedupeWindowMs\n ) {\n const copy = prev.slice();\n copy[copy.length - 1] = { ...last, createdAt: now };\n return copy;\n }\n\n const next: ErrorLog = {\n id: makeId(\"log\"),\n kind: \"log\",\n createdAt: now,\n ...entry,\n };\n\n const out = prev.concat(next);\n return out.length > logLimit\n ? out.slice(out.length - logLimit)\n : out;\n });\n },\n [dedupeWindowMs, logLimit],\n );\n\n React.useEffect(() => {\n // editor emitted “logs”\n const offEditorError = api.on(\"error\", (e: any) => {\n pushLog(normalizeLog(e));\n });\n\n // runtime emitted errors (optional but useful)\n const offRuntimeError = api.on(\"error\", (e: any) => {\n pushLog(normalizeLog(e));\n });\n\n return () => {\n offEditorError?.();\n offRuntimeError?.();\n };\n }, [api, pushLog]);\n\n // ---- validation (unclearable, derived via core/validate)\n const runTokenRef = React.useRef(0);\n const debounceTimerRef = React.useRef<number | null>(null);\n\n const runValidation = React.useCallback(() => {\n const token = ++runTokenRef.current;\n\n setValidating(true);\n\n schedule(\n () => {\n // if another run was queued, drop this one\n if (token !== runTokenRef.current) return;\n\n try {\n const props = api.editor.getProps() as ServiceProps;\n const res = validate(props); // sync engine\n if (token !== runTokenRef.current) return;\n\n setValidation(toValidationRows(res ?? []));\n } catch (err: any) {\n if (token !== runTokenRef.current) return;\n\n // validator crash becomes a log, not a validation row\n pushLog({\n message: err?.message ?? \"validate() threw\",\n code: err?.code ?? \"validate_throw\",\n meta: err,\n });\n\n setValidation([]);\n } finally {\n if (token == runTokenRef.current) setValidating(false);\n }\n },\n useIdle,\n idleTimeoutMs,\n );\n }, [api, pushLog, useIdle, idleTimeoutMs]);\n\n const triggerValidation = React.useCallback(() => {\n if (debounceTimerRef.current) {\n window.clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = null;\n }\n\n // bump token so any scheduled run knows it’s obsolete\n runTokenRef.current++;\n\n if (debounceMs === 0) {\n runValidation();\n return;\n }\n\n debounceTimerRef.current = window.setTimeout(() => {\n runValidation();\n }, debounceMs);\n }, [debounceMs, runValidation]);\n\n React.useEffect(() => {\n // initial validate\n triggerValidation();\n\n const off = api.on(\"state:change\", () => {\n triggerValidation();\n });\n\n return () => {\n off?.();\n if (debounceTimerRef.current) {\n window.clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = null;\n }\n runTokenRef.current++; // invalidate any scheduled work\n };\n }, [api, triggerValidation]);\n\n // ---- merged (organised)\n const merged = React.useMemo<MergedErrors>(() => {\n const v = validation;\n const l = logs;\n\n return {\n validation: v,\n logs: l,\n\n counts: {\n validation: v.length,\n logs: l.length,\n total: v.length + l.length,\n },\n\n groups: [\n { kind: \"validation\", title: \"Validation\", rows: v },\n { kind: \"log\", title: \"Logs\", rows: l },\n ],\n\n forEach(fn) {\n for (const row of v) fn(row, \"validation\");\n for (const row of l) fn(row, \"log\");\n },\n };\n }, [validation, logs]);\n\n const clear = React.useCallback((target: ClearTarget) => {\n // validation is unclearable by design\n if (target === \"logs\" || target === \"merged\") setLogs([]);\n }, []);\n\n const removeLog = React.useCallback((id: string) => {\n setLogs((prev) => prev.filter((x) => x.id !== id));\n }, []);\n\n return React.useMemo(\n () => ({\n validation,\n logs,\n merged,\n validating,\n clear,\n removeLog,\n }),\n [validation, logs, merged, validating, clear, removeLog],\n );\n}\n","// src/react/workspace/context/provider/live/adapters/poll.ts\nimport type { LiveOptions } from \"../../../backend\";\nimport type {\n WorkspaceLiveAdapter,\n WorkspaceLiveAdapterContext,\n WorkspaceLiveAdapterHandlers,\n WorkspaceLiveStatus,\n WorkspaceLiveTick,\n} from \"../types\";\n\nexport interface PollAdapterOptions {\n readonly defaultIntervalMs: number; // e.g. 15000\n}\n\nexport function createPollAdapter(\n opts?: Partial<PollAdapterOptions>,\n): WorkspaceLiveAdapter {\n const defaultIntervalMs: number = opts?.defaultIntervalMs ?? 15000;\n\n let intervalId: number | undefined;\n let connected: boolean = false;\n\n const disconnect = (): void => {\n if (typeof intervalId === \"number\") {\n window.clearInterval(intervalId);\n }\n intervalId = undefined;\n connected = false;\n };\n\n const connect = async (\n ctx: WorkspaceLiveAdapterContext,\n handlers: WorkspaceLiveAdapterHandlers,\n ): Promise<void> => {\n disconnect();\n\n const live: LiveOptions = ctx.live;\n\n if (live.mode !== \"poll\") {\n handlers.onStatus({ connected: false } as WorkspaceLiveStatus);\n return;\n }\n\n const intervalMs: number = live.intervalMs ?? defaultIntervalMs;\n\n connected = true;\n handlers.onStatus({ connected: true } as WorkspaceLiveStatus);\n\n const tickOnce = async (\n reason: WorkspaceLiveTick[\"reason\"],\n ): Promise<void> => {\n const tick: WorkspaceLiveTick = {\n at: Date.now(),\n reason,\n };\n handlers.onTick(tick);\n };\n\n // immediate tick\n await tickOnce(\"init\");\n\n intervalId = window.setInterval(() => {\n void tickOnce(\"timer\");\n }, intervalMs) as unknown as number;\n };\n\n return {\n id: \"poll\",\n connect,\n disconnect,\n };\n}\n","// src/react/workspace/context/backend/memory/ids.ts\n\nlet __seq: number = 0;\n\nfunction nextSeq(): number {\n __seq += 1;\n return __seq;\n}\n\nexport function newId(prefix: string): string {\n // stable-enough for memory usage; predictable in tests if you reset module state\n const t: string = Date.now().toString(36);\n const s: string = nextSeq().toString(36);\n return `${prefix}_${t}_${s}`;\n}\n\nexport function newBranchId(): string {\n return newId(\"br\");\n}\n\nexport function newAuthorId(): string {\n return newId(\"au\");\n}\n\nexport function newTemplateId(): string {\n return newId(\"tpl\");\n}\n\nexport function newTemplateKey(): string {\n return `tpl_${Date.now().toString(36)}_${nextSeq().toString(36)}`;\n}\n\nexport function newDraftId(): string {\n return newId(\"dr\");\n}\n\nexport function newCommitId(): string {\n return newId(\"cm\");\n}\n\nexport function newThreadId(): string {\n return newId(\"th\");\n}\n\nexport function newMessageId(): string {\n return newId(\"msg\");\n}\n\nexport function bumpEtag(prev?: string): string {\n const n: number = (prev ? parseInt(prev, 10) : 0) + 1;\n return String(Number.isFinite(n) ? n : 1);\n}\n","// src/react/workspace/context/backend/memory/errors.ts\n\nimport type { BackendError, BackendResult } from \"../backend\";\n\nexport function ok<T>(value: T): BackendResult<T> {\n return { ok: true, value };\n}\n\nexport function fail<T = never>(\n code: string,\n message: string,\n opts?: Readonly<{\n status?: number;\n hint?: string;\n meta?: unknown;\n cause?: unknown;\n }>,\n): BackendResult<T> {\n const err: BackendError = {\n code,\n message,\n status: opts?.status,\n hint: opts?.hint,\n meta: opts?.meta as any,\n cause: opts?.cause,\n };\n return { ok: false, error: err };\n}\n\nexport function asError(e: unknown): BackendError {\n if (\n typeof e === \"object\" &&\n e !== null &&\n \"code\" in (e as Record<string, unknown>) &&\n \"message\" in (e as Record<string, unknown>)\n ) {\n return e as BackendError;\n }\n return {\n code: \"unknown_error\",\n message: String(e ?? \"Unknown error\"),\n meta: e as any,\n };\n}\n","// src/react/workspace/context/backend/memory/time.ts\n\nexport function nowMs(): number {\n return Date.now();\n}\n\nexport function isoNow(): string {\n return new Date().toISOString();\n}\n\nexport function toIso(input?: string | number | Date): string {\n if (!input) return isoNow();\n if (typeof input === \"string\") return input;\n if (typeof input === \"number\") return new Date(input).toISOString();\n return input.toISOString();\n}\n","// src/react/workspace/context/backend/memory/store.ts\n\nimport type {\n Author,\n Branch,\n BranchParticipant,\n Commit,\n Draft,\n FieldTemplate,\n PermissionsMap,\n ServiceSnapshot,\n ServicesInput,\n WorkspaceInfo,\n} from \"../backend\";\n\nimport type {\n CommentAnchor,\n CommentId,\n CommentMessage,\n CommentThread,\n ThreadId,\n} from \"@/schema/comments\";\n\nexport interface BranchSnapshotState {\n head?: Commit;\n headSnapshot?: ServiceSnapshot;\n\n /** drafts keyed by actorId */\n drafts: Map<string, { draft: Draft; snapshot: ServiceSnapshot }>;\n\n /** commits keyed by commitId (versionId) */\n commits: Map<string, { commit: Commit; snapshot: ServiceSnapshot }>;\n}\n\nexport interface CommentsBranchState {\n threads: Map<ThreadId, CommentThread>;\n // message index is derived; no separate store needed\n}\n\nexport interface PolicyState {\n raw: unknown;\n updatedAt?: string;\n etag?: string;\n}\n\nexport interface MemoryWorkspaceStore {\n info: WorkspaceInfo;\n\n authors: Map<string, Author>;\n\n /** permissions by actorId */\n permissionsByActor: Map<string, PermissionsMap>;\n\n branches: Map<string, Branch>;\n participantsByBranch: Map<string, readonly BranchParticipant[]>;\n\n services: ServicesInput | null;\n\n templates: Map<string, FieldTemplate>;\n\n snapshotsByBranch: Map<string, BranchSnapshotState>;\n\n commentsByBranch: Map<string, CommentsBranchState>;\n\n /** workspace-scoped policies */\n policies: PolicyState | null;\n\n /** branch-scoped policies */\n policiesByBranch: Map<string, PolicyState>;\n}\n\nexport function newBranchSnapshotState(): BranchSnapshotState {\n return {\n drafts: new Map<string, { draft: Draft; snapshot: ServiceSnapshot }>(),\n commits: new Map<\n string,\n { commit: Commit; snapshot: ServiceSnapshot }\n >(),\n };\n}\n\nexport function newCommentsBranchState(): CommentsBranchState {\n return {\n threads: new Map<ThreadId, CommentThread>(),\n };\n}\n\n// helpers that don’t need to know about backend.ts shapes beyond comment schemas\nexport function findMessageIndex(\n thread: CommentThread,\n messageId: CommentId,\n): number {\n const msgs: readonly CommentMessage[] = (thread.messages ??\n []) as readonly CommentMessage[];\n for (let i: number = 0; i < msgs.length; i += 1) {\n if (msgs[i].id === messageId) return i;\n }\n return -1;\n}\n\nexport function ensureThread(\n state: CommentsBranchState,\n threadId: ThreadId,\n): CommentThread {\n const th: CommentThread | undefined = state.threads.get(threadId);\n if (!th) {\n throw new Error(`Comment thread not found: ${String(threadId)}`);\n }\n return th;\n}\n\nexport function setThreadAnchor(\n thread: CommentThread,\n anchor: CommentAnchor,\n): CommentThread {\n return { ...(thread as object), anchor } as CommentThread;\n}\n","import type {\n Author,\n Branch,\n BranchParticipant,\n Commit,\n Draft,\n FieldTemplate,\n PermissionsMap,\n ServiceSnapshot,\n ServicesInput,\n WorkspaceInfo,\n} from \"../backend\";\nimport type {\n BranchSnapshotState,\n CommentsBranchState,\n MemoryWorkspaceStore,\n PolicyState,\n} from \"./store\";\nimport { newBranchSnapshotState, newCommentsBranchState } from \"./store\";\nimport type { CommentThread, ThreadId } from \"@/schema/comments\";\n\ninterface SerializedBranchSnapshotState {\n readonly head?: Commit;\n readonly headSnapshot?: ServiceSnapshot;\n readonly drafts: ReadonlyArray<\n readonly [string, { draft: Draft; snapshot: ServiceSnapshot }]\n >;\n readonly commits: ReadonlyArray<\n readonly [string, { commit: Commit; snapshot: ServiceSnapshot }]\n >;\n}\n\ninterface SerializedCommentsBranchState {\n readonly threads: ReadonlyArray<readonly [ThreadId, CommentThread]>;\n}\n\nexport interface PersistedMemoryWorkspaceStore {\n readonly version: 1;\n readonly info: WorkspaceInfo;\n readonly authors: ReadonlyArray<readonly [string, Author]>;\n readonly permissionsByActor: ReadonlyArray<\n readonly [string, PermissionsMap]\n >;\n readonly branches: ReadonlyArray<readonly [string, Branch]>;\n readonly participantsByBranch: ReadonlyArray<\n readonly [string, readonly BranchParticipant[]]\n >;\n readonly services: ServicesInput | null;\n readonly templates: ReadonlyArray<readonly [string, FieldTemplate]>;\n readonly snapshotsByBranch: ReadonlyArray<\n readonly [string, SerializedBranchSnapshotState]\n >;\n readonly commentsByBranch: ReadonlyArray<\n readonly [string, SerializedCommentsBranchState]\n >;\n readonly policies: PolicyState | null;\n readonly policiesByBranch: ReadonlyArray<readonly [string, PolicyState]>;\n}\n\ninterface PersistedWorkspaceRecord {\n readonly workspaceId: string;\n readonly store: PersistedMemoryWorkspaceStore;\n}\n\nexport interface MemoryPersistence {\n load(workspaceId: string): Promise<PersistedMemoryWorkspaceStore | null>;\n save(workspaceId: string, store: MemoryWorkspaceStore): Promise<void>;\n}\n\nconst DB_NAME = \"digital-service-ui-builder-memory\";\nconst DB_VERSION = 1;\nconst STORE_NAME = \"workspace-backends\";\n\nfunction cloneMapEntries<K, V>(map: ReadonlyMap<K, V>): Array<readonly [K, V]> {\n return Array.from(map.entries());\n}\n\nfunction serializeBranchSnapshotState(\n state: BranchSnapshotState,\n): SerializedBranchSnapshotState {\n return {\n head: state.head,\n headSnapshot: state.headSnapshot,\n drafts: cloneMapEntries(state.drafts),\n commits: cloneMapEntries(state.commits),\n };\n}\n\nfunction serializeCommentsBranchState(\n state: CommentsBranchState,\n): SerializedCommentsBranchState {\n return {\n threads: cloneMapEntries(state.threads),\n };\n}\n\nexport function serializeMemoryWorkspaceStore(\n store: MemoryWorkspaceStore,\n): PersistedMemoryWorkspaceStore {\n return {\n version: 1,\n info: store.info,\n authors: cloneMapEntries(store.authors),\n permissionsByActor: cloneMapEntries(store.permissionsByActor),\n branches: cloneMapEntries(store.branches),\n participantsByBranch: cloneMapEntries(store.participantsByBranch),\n services: store.services,\n templates: cloneMapEntries(store.templates),\n snapshotsByBranch: Array.from(store.snapshotsByBranch.entries()).map(\n ([branchId, state]) =>\n [branchId, serializeBranchSnapshotState(state)] as const,\n ),\n commentsByBranch: Array.from(store.commentsByBranch.entries()).map(\n ([branchId, state]) =>\n [branchId, serializeCommentsBranchState(state)] as const,\n ),\n policies: store.policies,\n policiesByBranch: cloneMapEntries(store.policiesByBranch),\n };\n}\n\nfunction deserializeBranchSnapshotState(\n state: SerializedBranchSnapshotState,\n): BranchSnapshotState {\n const next: BranchSnapshotState = newBranchSnapshotState();\n next.head = state.head;\n next.headSnapshot = state.headSnapshot;\n next.drafts = new Map(state.drafts);\n next.commits = new Map(state.commits);\n return next;\n}\n\nfunction deserializeCommentsBranchState(\n state: SerializedCommentsBranchState,\n): CommentsBranchState {\n const next: CommentsBranchState = newCommentsBranchState();\n next.threads = new Map(state.threads);\n return next;\n}\n\nexport function deserializeMemoryWorkspaceStore(\n store: PersistedMemoryWorkspaceStore,\n): MemoryWorkspaceStore {\n return {\n info: { ...store.info },\n authors: new Map(store.authors),\n permissionsByActor: new Map(store.permissionsByActor),\n branches: new Map(store.branches),\n participantsByBranch: new Map(store.participantsByBranch),\n services: store.services,\n templates: new Map(store.templates),\n snapshotsByBranch: new Map(\n store.snapshotsByBranch.map(([branchId, state]) => [\n branchId,\n deserializeBranchSnapshotState(state),\n ]),\n ),\n commentsByBranch: new Map(\n store.commentsByBranch.map(([branchId, state]) => [\n branchId,\n deserializeCommentsBranchState(state),\n ]),\n ),\n policies: store.policies ? { ...store.policies } : null,\n policiesByBranch: new Map(\n store.policiesByBranch.map(([branchId, state]) => [\n branchId,\n { ...state },\n ]),\n ),\n };\n}\n\nexport function applyPersistedMemoryWorkspaceStore(\n target: MemoryWorkspaceStore,\n source: PersistedMemoryWorkspaceStore,\n): void {\n const next: MemoryWorkspaceStore = deserializeMemoryWorkspaceStore(source);\n\n Object.assign(target.info, next.info);\n\n target.authors.clear();\n next.authors.forEach((value, key) => target.authors.set(key, value));\n\n target.permissionsByActor.clear();\n next.permissionsByActor.forEach((value, key) =>\n target.permissionsByActor.set(key, value),\n );\n\n target.branches.clear();\n next.branches.forEach((value, key) => target.branches.set(key, value));\n\n target.participantsByBranch.clear();\n next.participantsByBranch.forEach((value, key) =>\n target.participantsByBranch.set(key, value),\n );\n\n target.services = next.services;\n\n target.templates.clear();\n next.templates.forEach((value, key) => target.templates.set(key, value));\n\n target.snapshotsByBranch.clear();\n next.snapshotsByBranch.forEach((value, key) =>\n target.snapshotsByBranch.set(key, value),\n );\n\n target.commentsByBranch.clear();\n next.commentsByBranch.forEach((value, key) =>\n target.commentsByBranch.set(key, value),\n );\n\n target.policies = next.policies;\n\n target.policiesByBranch.clear();\n next.policiesByBranch.forEach((value, key) =>\n target.policiesByBranch.set(key, value),\n );\n}\n\nfunction supportsIndexedDb(): boolean {\n return typeof indexedDB !== \"undefined\";\n}\n\nfunction requestToPromise<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n request.onerror = () =>\n reject(request.error ?? new Error(\"IndexedDB request failed.\"));\n });\n}\n\nfunction openDatabase(): Promise<IDBDatabase> {\n return new Promise<IDBDatabase>((resolve, reject) => {\n const request: IDBOpenDBRequest = indexedDB.open(DB_NAME, DB_VERSION);\n\n request.onupgradeneeded = () => {\n const db: IDBDatabase = request.result;\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n db.createObjectStore(STORE_NAME, { keyPath: \"workspaceId\" });\n }\n };\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () =>\n reject(request.error ?? new Error(\"Failed to open IndexedDB.\"));\n });\n}\n\nexport function createIndexedDbMemoryPersistence(): MemoryPersistence | null {\n if (!supportsIndexedDb()) {\n return null;\n }\n\n let dbPromise: Promise<IDBDatabase> | null = null;\n let disabled = false;\n\n const getDb = async (): Promise<IDBDatabase> => {\n if (!dbPromise) {\n dbPromise = openDatabase();\n }\n return dbPromise;\n };\n\n const disable = (error: unknown): void => {\n disabled = true;\n dbPromise = null;\n console.warn(\n \"[memory-backend] IndexedDB persistence disabled for this session.\",\n error,\n );\n };\n\n return {\n load: async (workspaceId: string) => {\n if (disabled) return null;\n try {\n const db: IDBDatabase = await getDb();\n const tx = db.transaction(STORE_NAME, \"readonly\");\n const store = tx.objectStore(STORE_NAME);\n const record = await requestToPromise<\n PersistedWorkspaceRecord | undefined\n >(store.get(workspaceId));\n return record?.store ?? null;\n } catch (error) {\n disable(error);\n return null;\n }\n },\n save: async (workspaceId: string, store: MemoryWorkspaceStore) => {\n if (disabled) return;\n try {\n const db: IDBDatabase = await getDb();\n const tx = db.transaction(STORE_NAME, \"readwrite\");\n const objectStore = tx.objectStore(STORE_NAME);\n const record: PersistedWorkspaceRecord = {\n workspaceId,\n store: serializeMemoryWorkspaceStore(store),\n };\n await requestToPromise(objectStore.put(record));\n } catch (error) {\n disable(error);\n }\n },\n };\n}\n","// src/react/workspace/context/backend/memory/memory-backend.ts\n\nimport type {\n Actor,\n Author,\n AuthorsBackend,\n BackendScope,\n Branch,\n BranchAccessBackend,\n BranchesBackend,\n BranchParticipant,\n CommentsBackend,\n Commit,\n Draft,\n FieldTemplate,\n MergeResult,\n PermissionsBackend,\n PermissionsMap,\n PoliciesBackend,\n PoliciesLoadResult,\n PolicyScope,\n ServicesBackend,\n ServicesInput,\n ServiceSnapshot,\n SnapshotsBackend,\n SnapshotsLoadResult,\n TemplateCreateInput,\n TemplatesBackend,\n TemplatesListParams,\n TemplateUpdatePatch,\n WorkspaceBackend,\n WorkspaceInfo,\n} from \"../backend\";\n\nimport type {\n CommentAnchor,\n CommentId,\n CommentMessage,\n CommentThread,\n ThreadId,\n} from \"@/schema/comments\";\n\nimport {\n bumpEtag,\n newBranchId,\n newCommitId,\n newDraftId,\n newMessageId,\n newTemplateId,\n newTemplateKey,\n newThreadId,\n} from \"./ids\";\nimport { fail, ok } from \"./errors\";\nimport { isoNow } from \"./time\";\nimport type {\n CreateMemoryWorkspaceBackendOptions,\n MemoryBackendSeed,\n} from \"./seed\";\nimport {\n ensureThread,\n findMessageIndex,\n type MemoryWorkspaceStore,\n newBranchSnapshotState,\n newCommentsBranchState,\n} from \"./store\";\nimport {\n applyPersistedMemoryWorkspaceStore,\n createIndexedDbMemoryPersistence,\n type PersistedMemoryWorkspaceStore,\n serializeMemoryWorkspaceStore,\n} from \"./persistence\";\n\nconst workspaceBootstrapPromises = new Map<\n string,\n Promise<PersistedMemoryWorkspaceStore | null>\n>();\n\nfunction emptySnapshot(): ServiceSnapshot {\n // EditorSnapshot shape is host-defined; keep memory backend generic.\n return {\n schema_version: \"1\",\n data: {} as unknown as any,\n };\n}\n\nfunction permissivePermissions(): PermissionsMap {\n const handler: ProxyHandler<Record<string, boolean>> = {\n get: (\n _target: Record<string, boolean>,\n prop: string | symbol,\n ): boolean => {\n if (typeof prop === \"symbol\") return true;\n return true;\n },\n has: (): boolean => true,\n ownKeys: (): ArrayLike<string | symbol> => [],\n getOwnPropertyDescriptor: (): PropertyDescriptor | undefined =>\n undefined,\n };\n\n const p: PermissionsMap = new Proxy<Record<string, boolean>>(\n {},\n handler,\n ) as unknown as PermissionsMap;\n return p;\n}\n\nfunction normalizeInfo(\n workspaceId: string,\n seed?: Partial<WorkspaceInfo>,\n): WorkspaceInfo {\n return {\n id: seed?.id ?? workspaceId,\n name: seed?.name ?? \"Memory Workspace\",\n description: seed?.description,\n createdAt: seed?.createdAt ?? isoNow(),\n updatedAt: seed?.updatedAt ?? isoNow(),\n meta: seed?.meta,\n };\n}\n\nfunction normalizeBranch(\n input: Partial<Branch> & Pick<Branch, \"id\" | \"name\">,\n): Branch {\n const createdAt: string = input.createdAt ?? isoNow();\n const updatedAt: string = input.updatedAt ?? createdAt;\n\n return {\n id: input.id,\n name: input.name,\n isMain: Boolean(input.isMain),\n headVersionId: input.headVersionId,\n createdAt,\n updatedAt,\n };\n}\n\nfunction normalizeAuthor(\n input: Partial<Author> & Pick<Author, \"id\" | \"name\">,\n): Author {\n return {\n id: input.id,\n name: input.name,\n handle: input.handle,\n avatarUrl: input.avatarUrl,\n meta: input.meta,\n createdAt: input.createdAt ?? isoNow(),\n updatedAt: input.updatedAt ?? isoNow(),\n };\n}\n\nfunction normalizeTemplate(input: any): FieldTemplate {\n const now: string = isoNow();\n\n const id: string = String(input?.id ?? newTemplateId());\n const key: string = String(input?.key ?? newTemplateKey());\n\n return {\n id,\n key,\n name: String(input?.name ?? \"Template\"),\n kind: String(input?.kind ?? \"text\"),\n branchId: input?.branchId ?? undefined,\n definition: (input?.definition ?? {}) as Readonly<\n Record<string, unknown>\n >,\n defaults: (input?.defaults ?? undefined) as\n | Readonly<Record<string, unknown>>\n | undefined,\n ui: (input?.ui ?? undefined) as\n | Readonly<Record<string, unknown>>\n | undefined,\n validators: (input?.validators ?? undefined) as\n | readonly any[]\n | undefined,\n tags: (input?.tags ?? undefined) as readonly string[] | undefined,\n category: (input?.category ?? undefined) as string | undefined,\n published: Boolean(input?.published ?? true),\n version: Number.isFinite(Number(input?.version))\n ? Number(input.version)\n : 1,\n createdAt: String(input?.createdAt ?? now),\n updatedAt: String(input?.updatedAt ?? now),\n };\n}\n\nfunction matchesSince(\n updatedAt: string | undefined,\n since?: string | number,\n): boolean {\n if (!since) return true;\n if (!updatedAt) return false;\n\n const t: number = Date.parse(updatedAt);\n const s: number =\n typeof since === \"number\" ? since : Date.parse(String(since));\n if (!Number.isFinite(t) || !Number.isFinite(s)) return true;\n return t >= s;\n}\n\nfunction templateVisibleForBranch(\n tpl: FieldTemplate,\n branchId?: string,\n): boolean {\n const tplBid: string | undefined = tpl.branchId ?? undefined;\n if (!branchId) return !tplBid;\n return !tplBid || tplBid === branchId;\n}\n\nfunction seedStore(\n opts: CreateMemoryWorkspaceBackendOptions,\n): MemoryWorkspaceStore {\n const seed: MemoryBackendSeed | undefined = opts.seed;\n\n const store: MemoryWorkspaceStore = {\n info: normalizeInfo(opts.workspaceId, seed?.info),\n\n authors: new Map<string, Author>(),\n permissionsByActor: new Map<string, PermissionsMap>(),\n\n branches: new Map<string, Branch>(),\n participantsByBranch: new Map<string, readonly BranchParticipant[]>(),\n\n services: (seed?.services ?? null) as ServicesInput | null,\n\n templates: new Map<string, FieldTemplate>(),\n\n snapshotsByBranch: new Map<string, any>(),\n\n commentsByBranch: new Map<string, any>(),\n\n policies: seed?.policies\n ? { raw: seed.policies, updatedAt: isoNow() }\n : null,\n policiesByBranch: new Map<string, any>(),\n };\n\n if (seed?.policiesByBranch) {\n for (const [bid, raw] of Object.entries(seed.policiesByBranch)) {\n store.policiesByBranch.set(bid, { raw, updatedAt: isoNow() });\n }\n }\n\n // authors\n if (seed?.authors) {\n for (const a of seed.authors) {\n const na: Author = normalizeAuthor({ ...a });\n store.authors.set(na.id, na);\n }\n }\n\n // ensure actor-author\n const ensureActorAuthor: boolean = opts.ensureActorAuthor ?? true;\n const actorId: string | undefined = opts.actorId;\n if (ensureActorAuthor && actorId && !store.authors.has(actorId)) {\n store.authors.set(\n actorId,\n normalizeAuthor({\n id: actorId,\n name: seed?.actor?.name ?? \"Actor\",\n handle: seed?.actor?.meta ? undefined : undefined,\n }),\n );\n }\n\n // permissions\n if (seed?.permissions) {\n const p: unknown = seed.permissions as unknown;\n if (\n typeof p === \"object\" &&\n p !== null &&\n !Array.isArray(p) &&\n Object.values(p as Record<string, unknown>).every(\n (v: unknown) => typeof v === \"object\" && v !== null,\n )\n ) {\n const perActor: Record<string, PermissionsMap> = p as Record<\n string,\n PermissionsMap\n >;\n for (const [k, v] of Object.entries(perActor)) {\n store.permissionsByActor.set(k, v);\n }\n } else {\n store.permissionsByActor.set(\n \"*\",\n seed.permissions as PermissionsMap,\n );\n }\n }\n\n // branches\n if (seed?.branches) {\n for (const b of seed.branches) {\n const nb: Branch = normalizeBranch({ ...b });\n store.branches.set(nb.id, nb);\n }\n }\n\n const ensureMain: boolean = opts.ensureMain ?? true;\n if (ensureMain) {\n if (store.branches.size === 0) {\n const id: string = newBranchId();\n store.branches.set(\n id,\n normalizeBranch({\n id,\n name: \"main\",\n isMain: true,\n }),\n );\n } else {\n const branches: Branch[] = Array.from(store.branches.values());\n const hasMain: boolean = branches.some((b: Branch) => b.isMain);\n if (!hasMain) {\n const first: Branch = branches[0];\n store.branches.set(first.id, { ...first, isMain: true });\n }\n }\n }\n\n // participants\n if (seed?.participants) {\n for (const [branchId, list] of Object.entries(seed.participants)) {\n store.participantsByBranch.set(branchId, list);\n }\n }\n\n // templates\n if (seed?.templates) {\n for (const t of seed.templates) {\n const nt: FieldTemplate = normalizeTemplate(t);\n store.templates.set(nt.id, nt);\n }\n }\n\n // snapshots\n for (const b of store.branches.values()) {\n store.snapshotsByBranch.set(b.id, newBranchSnapshotState());\n }\n if (seed?.snapshots) {\n for (const [branchId, snapSeed] of Object.entries(seed.snapshots)) {\n const state =\n store.snapshotsByBranch.get(branchId) ??\n newBranchSnapshotState();\n\n if (snapSeed.head) {\n state.head = { ...snapSeed.head };\n state.commits.set(snapSeed.head.id, {\n commit: { ...snapSeed.head },\n snapshot: snapSeed.snapshot ?? emptySnapshot(),\n });\n state.headSnapshot = snapSeed.snapshot ?? emptySnapshot();\n } else if (snapSeed.snapshot) {\n state.headSnapshot = snapSeed.snapshot;\n }\n\n if (snapSeed.draft) {\n const aId: string = opts.actorId ?? \"actor\";\n state.drafts.set(aId, {\n draft: { ...snapSeed.draft },\n snapshot: snapSeed.snapshot ?? emptySnapshot(),\n });\n }\n\n store.snapshotsByBranch.set(branchId, state);\n }\n }\n\n // comments\n for (const b of store.branches.values()) {\n store.commentsByBranch.set(b.id, newCommentsBranchState());\n }\n if (seed?.comments) {\n for (const [branchId, threads] of Object.entries(seed.comments)) {\n const st =\n store.commentsByBranch.get(branchId) ??\n newCommentsBranchState();\n st.threads.clear();\n for (const th of threads) {\n st.threads.set(th.id as ThreadId, th);\n }\n store.commentsByBranch.set(branchId, st);\n }\n }\n\n return store;\n}\n\ntype AsyncBackendMethod = (...args: readonly unknown[]) => Promise<unknown>;\n\nfunction wrapBackendMethods<T extends object>(\n backend: T,\n initStore: () => Promise<void>,\n persistStore: () => Promise<void>,\n mutatingKeys: readonly (keyof T)[],\n): T {\n const wrapped: Partial<T> = {};\n const mutating = new Set<PropertyKey>(\n mutatingKeys as readonly PropertyKey[],\n );\n\n for (const key of Object.keys(backend) as Array<keyof T>) {\n const method = backend[key] as AsyncBackendMethod;\n wrapped[key] = (async (...args: readonly unknown[]) => {\n await initStore();\n const result = await method(...args);\n if (\n mutating.has(key as PropertyKey) &&\n typeof result === \"object\" &&\n result !== null &&\n \"ok\" in result &&\n result.ok\n ) {\n await persistStore();\n }\n return result;\n }) as T[keyof T];\n }\n\n return wrapped as T;\n}\n\nexport function createMemoryWorkspaceBackend(\n opts: CreateMemoryWorkspaceBackendOptions,\n): WorkspaceBackend {\n const store: MemoryWorkspaceStore = seedStore(opts);\n const info: WorkspaceInfo = store.info;\n const persistence = createIndexedDbMemoryPersistence();\n\n let initPromise: Promise<void> | null = null;\n const initStore = async (): Promise<void> => {\n if (!initPromise) {\n initPromise = (async () => {\n if (!persistence) return;\n let bootstrap = workspaceBootstrapPromises.get(opts.workspaceId);\n if (!bootstrap) {\n bootstrap = (async () => {\n try {\n const persisted = await persistence.load(\n opts.workspaceId,\n );\n if (persisted) {\n return persisted;\n }\n\n await persistence.save(opts.workspaceId, store);\n return serializeMemoryWorkspaceStore(store);\n } finally {\n workspaceBootstrapPromises.delete(opts.workspaceId);\n }\n })();\n workspaceBootstrapPromises.set(opts.workspaceId, bootstrap);\n }\n\n const persisted = await bootstrap;\n if (persisted) {\n applyPersistedMemoryWorkspaceStore(store, persisted);\n }\n })();\n }\n await initPromise;\n };\n\n const persistStore = async (): Promise<void> => {\n if (!persistence) return;\n await persistence.save(opts.workspaceId, store);\n };\n\n void initStore();\n\n const authorsBase: AuthorsBackend = {\n list: async (workspaceId: string) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n return ok(Array.from(store.authors.values()));\n },\n get: async (authorId: string) => {\n const a: Author | undefined = store.authors.get(authorId);\n return ok(a ?? null);\n },\n refresh: async (workspaceId: string) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n return ok(Array.from(store.authors.values()));\n },\n };\n const authors: AuthorsBackend = wrapBackendMethods(\n authorsBase,\n initStore,\n persistStore,\n [],\n );\n\n const permissionsBase: PermissionsBackend = {\n get: async (workspaceId: string, actor: Actor) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n const seeded: PermissionsMap | undefined =\n store.permissionsByActor.get(actor.id) ??\n store.permissionsByActor.get(\"*\") ??\n undefined;\n\n return ok(seeded ?? permissivePermissions());\n },\n refresh: async (workspaceId: string, actor: Actor) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n const seeded: PermissionsMap | undefined =\n store.permissionsByActor.get(actor.id) ??\n store.permissionsByActor.get(\"*\") ??\n undefined;\n\n return ok(seeded ?? permissivePermissions());\n },\n };\n const permissions: PermissionsBackend = wrapBackendMethods(\n permissionsBase,\n initStore,\n persistStore,\n [],\n );\n\n const branchesBase: BranchesBackend = {\n list: async (workspaceId: string) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n return ok(Array.from(store.branches.values()));\n },\n\n create: async (\n workspaceId: string,\n name: string,\n opts2?: Readonly<{ fromId?: string }>,\n ) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n\n const id: string = newBranchId();\n const b: Branch = normalizeBranch({\n id,\n name,\n isMain: false,\n });\n\n store.branches.set(id, b);\n store.snapshotsByBranch.set(id, newBranchSnapshotState());\n store.commentsByBranch.set(id, newCommentsBranchState());\n\n // optional: copy snapshot from fromId\n if (opts2?.fromId) {\n const from = store.snapshotsByBranch.get(opts2.fromId);\n const to = store.snapshotsByBranch.get(id);\n if (from && to) {\n const snap: ServiceSnapshot =\n from.headSnapshot ??\n (from.head\n ? from.commits.get(from.head.id)?.snapshot\n : undefined) ??\n emptySnapshot();\n\n to.headSnapshot = snap;\n const cmId: string = newCommitId();\n const commit: Commit = {\n id: cmId,\n branchId: id,\n createdAt: isoNow(),\n versionId: cmId,\n };\n to.head = commit;\n to.commits.set(cmId, { commit, snapshot: snap });\n store.branches.set(id, {\n ...b,\n headVersionId: cmId,\n updatedAt: isoNow(),\n });\n }\n }\n\n return ok(store.branches.get(id)!);\n },\n\n setMain: async (workspaceId: string, branchId: string) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n const b: Branch | undefined = store.branches.get(branchId);\n if (!b) return fail(\"not_found\", \"Branch not found.\");\n\n for (const br of store.branches.values()) {\n if (br.isMain && br.id !== branchId) {\n store.branches.set(br.id, {\n ...br,\n isMain: false,\n updatedAt: isoNow(),\n });\n }\n }\n const next: Branch = { ...b, isMain: true, updatedAt: isoNow() };\n store.branches.set(branchId, next);\n return ok(next);\n },\n\n merge: async (\n workspaceId: string,\n sourceId: string,\n targetId: string,\n ) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n const src: Branch | undefined = store.branches.get(sourceId);\n const tgt: Branch | undefined = store.branches.get(targetId);\n if (!src || !tgt) return fail(\"not_found\", \"Branch not found.\");\n\n const srcState = store.snapshotsByBranch.get(sourceId);\n const tgtState = store.snapshotsByBranch.get(targetId);\n\n if (srcState && tgtState) {\n const snap: ServiceSnapshot =\n srcState.headSnapshot ??\n (srcState.head\n ? srcState.commits.get(srcState.head.id)?.snapshot\n : undefined) ??\n emptySnapshot();\n\n const cmId: string = newCommitId();\n const commit: Commit = {\n id: cmId,\n branchId: targetId,\n createdAt: isoNow(),\n versionId: cmId,\n message: `Merged ${sourceId} → ${targetId}`,\n };\n\n tgtState.head = commit;\n tgtState.headSnapshot = snap;\n tgtState.commits.set(cmId, { commit, snapshot: snap });\n\n const updated: Branch = {\n ...tgt,\n headVersionId: cmId,\n updatedAt: isoNow(),\n };\n store.branches.set(targetId, updated);\n }\n\n const res: MergeResult = {\n sourceId,\n targetId,\n conflicts: 0,\n message: \"Merged in memory\",\n };\n return ok(res);\n },\n\n delete: async (workspaceId: string, branchId: string) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n store.branches.delete(branchId);\n store.participantsByBranch.delete(branchId);\n store.snapshotsByBranch.delete(branchId);\n store.commentsByBranch.delete(branchId);\n store.policiesByBranch.delete(branchId);\n return ok(undefined);\n },\n\n refresh: async (workspaceId: string) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n return ok(Array.from(store.branches.values()));\n },\n };\n const branches: BranchesBackend = wrapBackendMethods(\n branchesBase,\n initStore,\n persistStore,\n [\"create\", \"setMain\", \"merge\", \"delete\"],\n );\n\n const accessBase: BranchAccessBackend = {\n listParticipants: async (workspaceId: string, branchId: string) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n const list: readonly BranchParticipant[] =\n store.participantsByBranch.get(branchId) ?? [];\n return ok(list);\n },\n refreshParticipants: async (workspaceId: string, branchId: string) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n const list: readonly BranchParticipant[] =\n store.participantsByBranch.get(branchId) ?? [];\n return ok(list);\n },\n };\n const access: BranchAccessBackend = wrapBackendMethods(\n accessBase,\n initStore,\n persistStore,\n [],\n );\n\n const servicesBase: ServicesBackend = {\n get: async (workspaceId: string) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n if (!store.services) return ok([] as ServicesInput);\n return ok(store.services);\n },\n refresh: async (workspaceId: string) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n if (!store.services) return ok([] as ServicesInput);\n return ok(store.services);\n },\n };\n const services: ServicesBackend = wrapBackendMethods(\n servicesBase,\n initStore,\n persistStore,\n [],\n );\n\n const templatesBase: TemplatesBackend = {\n list: async (params: TemplatesListParams) => {\n if (params.workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n\n const all: FieldTemplate[] = Array.from(store.templates.values());\n const filtered: FieldTemplate[] = all.filter((t: FieldTemplate) => {\n if (!templateVisibleForBranch(t, params.branchId)) return false;\n if (params.q) {\n const q: string = params.q.toLowerCase();\n if (\n !t.name.toLowerCase().includes(q) &&\n !t.key.toLowerCase().includes(q)\n ) {\n return false;\n }\n }\n if (params.category && t.category !== params.category)\n return false;\n if (params.tags && params.tags.length) {\n const tset: Set<string> = new Set(t.tags ?? []);\n for (const tag of params.tags) {\n if (!tset.has(tag)) return false;\n }\n }\n return !(\n params.since && !matchesSince(t.updatedAt, params.since)\n );\n });\n\n return ok(filtered);\n },\n\n get: async (id: string) => {\n const t: FieldTemplate | undefined = store.templates.get(id);\n return ok(t ?? null);\n },\n\n getByKey: async (\n workspaceId: string,\n key: string,\n branchId?: string,\n ) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n\n for (const t of store.templates.values()) {\n if (t.key !== key) continue;\n if (!templateVisibleForBranch(t, branchId)) continue;\n return ok(t);\n }\n return ok(null);\n },\n\n create: async (workspaceId: string, input: TemplateCreateInput) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n\n const now: string = isoNow();\n const id: string = newTemplateId();\n const key: string = input.key ?? newTemplateKey();\n\n const tpl: FieldTemplate = {\n id,\n key,\n name: input.name,\n kind: input.kind,\n branchId: input.branchId ?? undefined,\n definition: input.definition,\n defaults: input.defaults,\n ui: input.ui,\n validators: input.validators,\n tags: input.tags,\n category: input.category,\n published: Boolean(input.published ?? true),\n version: 1,\n createdAt: now,\n updatedAt: now,\n };\n\n store.templates.set(id, tpl);\n return ok(tpl);\n },\n\n update: async (id: string, patch: TemplateUpdatePatch) => {\n const prev: FieldTemplate | undefined = store.templates.get(id);\n if (!prev) return fail(\"not_found\", \"Template not found.\");\n\n const now: string = isoNow();\n\n const next: FieldTemplate = {\n ...prev,\n name: patch.name ?? prev.name,\n kind: patch.kind ?? prev.kind,\n branchId:\n patch.branchId === null\n ? undefined\n : (patch.branchId ?? prev.branchId),\n definition: patch.definition ?? prev.definition,\n defaults:\n patch.defaults === null\n ? undefined\n : (patch.defaults ?? prev.defaults),\n ui: patch.ui === null ? undefined : (patch.ui ?? prev.ui),\n validators:\n patch.validators === null\n ? undefined\n : (patch.validators ?? prev.validators),\n tags:\n patch.tags === null ? undefined : (patch.tags ?? prev.tags),\n category:\n patch.category === null\n ? undefined\n : (patch.category ?? prev.category),\n published: patch.published ?? prev.published,\n version: prev.version + 1,\n updatedAt: now,\n };\n\n store.templates.set(id, next);\n return ok(next);\n },\n\n clone: async (\n source: Readonly<{ id?: string; key?: string }>,\n opts2?: Readonly<{\n newKey?: string;\n name?: string;\n branchId?: string;\n asDraft?: boolean;\n }>,\n ) => {\n const src: FieldTemplate | undefined = source.id\n ? store.templates.get(source.id)\n : undefined;\n\n let byKey: FieldTemplate | undefined = undefined;\n if (!src && source.key) {\n for (const t of store.templates.values()) {\n if (t.key === source.key) {\n byKey = t;\n break;\n }\n }\n }\n\n const base: FieldTemplate | undefined = src ?? byKey;\n if (!base) return fail(\"not_found\", \"Template source not found.\");\n\n const now: string = isoNow();\n const id: string = newTemplateId();\n const key: string = opts2?.newKey ?? newTemplateKey();\n\n const next: FieldTemplate = {\n ...base,\n id,\n key,\n name: opts2?.name ?? `${base.name} (copy)`,\n branchId: opts2?.branchId ?? base.branchId,\n version: 1,\n createdAt: now,\n updatedAt: now,\n published: opts2?.asDraft ? false : base.published,\n };\n\n store.templates.set(id, next);\n return ok(next);\n },\n\n publish: async (id: string) => {\n const t: FieldTemplate | undefined = store.templates.get(id);\n if (!t) return fail(\"not_found\", \"Template not found.\");\n const next: FieldTemplate = {\n ...t,\n published: true,\n updatedAt: isoNow(),\n };\n store.templates.set(id, next);\n return ok(next);\n },\n\n unpublish: async (id: string) => {\n const t: FieldTemplate | undefined = store.templates.get(id);\n if (!t) return fail(\"not_found\", \"Template not found.\");\n const next: FieldTemplate = {\n ...t,\n published: false,\n updatedAt: isoNow(),\n };\n store.templates.set(id, next);\n return ok(next);\n },\n\n delete: async (id: string) => {\n store.templates.delete(id);\n return ok(undefined);\n },\n\n refresh: async (\n params: Omit<TemplatesListParams, \"q\" | \"tags\" | \"category\">,\n ) => {\n return templatesBase.list({ ...params });\n },\n };\n const templates: TemplatesBackend = wrapBackendMethods(\n templatesBase,\n initStore,\n persistStore,\n [\"create\", \"update\", \"clone\", \"publish\", \"unpublish\", \"delete\"],\n );\n\n const snapshotsBase: SnapshotsBackend = {\n load: async (params) => {\n if (params.workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n\n const st = store.snapshotsByBranch.get(params.branchId);\n if (!st) return fail(\"not_found\", \"Branch not found.\");\n\n const draftEntry = st.drafts.get(params.actorId);\n const headEntry = st.head ? st.commits.get(st.head.id) : undefined;\n\n // if versionId requested, try commit map\n if (params.versionId) {\n const v = st.commits.get(params.versionId);\n if (v) {\n const out: SnapshotsLoadResult = {\n head: st.head,\n draft: draftEntry?.draft,\n snapshot: v.snapshot,\n };\n return ok(out);\n }\n }\n\n const snapshot: ServiceSnapshot = (draftEntry?.snapshot ??\n headEntry?.snapshot ??\n st.headSnapshot ??\n emptySnapshot()) as ServiceSnapshot;\n\n const out: SnapshotsLoadResult = {\n head: st.head,\n draft: draftEntry?.draft,\n snapshot,\n };\n return ok(out);\n },\n\n autosave: async (params) => {\n if (params.workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n\n const st = store.snapshotsByBranch.get(params.branchId);\n if (!st) return fail(\"not_found\", \"Branch not found.\");\n\n const prev = st.drafts.get(params.actorId);\n if (\n params.etag &&\n prev?.draft.etag &&\n params.etag !== prev.draft.etag\n ) {\n return fail(\"etag_mismatch\", \"Draft etag mismatch.\", {\n meta: { expected: prev.draft.etag, got: params.etag },\n });\n }\n\n const now: string = isoNow();\n const draftId: string = prev?.draft.id ?? newDraftId();\n const nextEtag: string = bumpEtag(prev?.draft.etag);\n\n const draft: Draft = {\n id: draftId,\n branchId: params.branchId,\n status: \"uncommitted\",\n etag: nextEtag,\n meta: prev?.draft.meta,\n createdAt: prev?.draft.createdAt ?? now,\n updatedAt: now,\n };\n\n st.drafts.set(params.actorId, { draft, snapshot: params.snapshot });\n\n return ok({ draft });\n },\n\n save: async (params) => {\n if (params.workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n\n const st = store.snapshotsByBranch.get(params.branchId);\n if (!st) return fail(\"not_found\", \"Branch not found.\");\n\n // optional etag check against draft if draftId provided\n if (params.draftId) {\n const entry = st.drafts.get(params.actorId);\n if (entry && entry.draft.id === params.draftId) {\n if (\n params.etag &&\n entry.draft.etag &&\n params.etag !== entry.draft.etag\n ) {\n return fail(\"etag_mismatch\", \"Draft etag mismatch.\", {\n meta: {\n expected: entry.draft.etag,\n got: params.etag,\n },\n });\n }\n }\n }\n\n const id: string = newCommitId();\n const commit: Commit = {\n id,\n branchId: params.branchId,\n message: params.message,\n versionId: id,\n etag: bumpEtag(undefined),\n createdAt: isoNow(),\n };\n\n st.commits.set(id, { commit, snapshot: params.snapshot });\n st.head = commit;\n st.headSnapshot = params.snapshot;\n\n // update branch head pointer\n const b: Branch | undefined = store.branches.get(params.branchId);\n if (b) {\n store.branches.set(params.branchId, {\n ...b,\n headVersionId: id,\n updatedAt: isoNow(),\n });\n }\n\n // if saving from a draft, keep draft (user may still publish) unless you want to clear:\n // We keep it for now to avoid surprise data loss.\n\n return ok({ commit });\n },\n\n publish: async (params) => {\n if (params.workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n\n // locate draft by id across branches for this actor\n let foundBranchId: string | null = null;\n let foundEntry: { draft: Draft; snapshot: ServiceSnapshot } | null =\n null;\n\n for (const [bid, st] of store.snapshotsByBranch.entries()) {\n const entry = st.drafts.get(params.actorId);\n if (entry && entry.draft.id === params.draftId) {\n foundBranchId = bid;\n foundEntry = entry;\n break;\n }\n }\n\n if (!foundBranchId || !foundEntry) {\n return fail(\"not_found\", \"Draft not found.\");\n }\n\n const st = store.snapshotsByBranch.get(foundBranchId)!;\n\n const id: string = newCommitId();\n const commit: Commit = {\n id,\n branchId: foundBranchId,\n message: params.message,\n versionId: id,\n etag: bumpEtag(undefined),\n createdAt: isoNow(),\n };\n\n st.commits.set(id, { commit, snapshot: foundEntry.snapshot });\n st.head = commit;\n st.headSnapshot = foundEntry.snapshot;\n\n // clear that draft\n st.drafts.delete(params.actorId);\n\n // update branch\n const b: Branch | undefined = store.branches.get(foundBranchId);\n if (b) {\n store.branches.set(foundBranchId, {\n ...b,\n headVersionId: id,\n updatedAt: isoNow(),\n });\n }\n\n return ok({ commit });\n },\n\n discard: async (params) => {\n if (params.workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n\n // find branch containing the draft\n for (const st of store.snapshotsByBranch.values()) {\n const entry = st.drafts.get(params.actorId);\n if (entry && entry.draft.id === params.draftId) {\n st.drafts.delete(params.actorId);\n return ok(undefined);\n }\n }\n\n return fail(\"not_found\", \"Draft not found.\");\n },\n\n refresh: async (params) => {\n if (params.workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n\n const st = store.snapshotsByBranch.get(params.branchId);\n if (!st) return fail(\"not_found\", \"Branch not found.\");\n\n const draft = st.drafts.get(params.actorId)?.draft;\n const head = st.head;\n\n return ok({ head, draft });\n },\n };\n const snapshots: SnapshotsBackend = wrapBackendMethods(\n snapshotsBase,\n initStore,\n persistStore,\n [\"autosave\", \"save\", \"publish\", \"discard\"],\n );\n\n function ensureThreadContext(ctx: BackendScope, threadId: string) {\n if (ctx.workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n const st =\n store.commentsByBranch.get(ctx.branchId) ??\n newCommentsBranchState();\n store.commentsByBranch.set(ctx.branchId, st);\n\n const th: CommentThread = ensureThread(st, threadId as ThreadId);\n const nowN: number = Date.now();\n return ok({ st, th, nowN });\n }\n\n const commentsImplBase: CommentsBackend<\n CommentThread,\n CommentMessage,\n CommentAnchor\n > = {\n listThreads: async (ctx: BackendScope) => {\n if (ctx.workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n const st =\n store.commentsByBranch.get(ctx.branchId) ??\n newCommentsBranchState();\n store.commentsByBranch.set(ctx.branchId, st);\n\n const list: readonly CommentThread[] = Array.from(\n st.threads.values(),\n );\n return ok(list);\n },\n\n createThread: async (ctx: BackendScope, input) => {\n if (ctx.workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n const st =\n store.commentsByBranch.get(ctx.branchId) ??\n newCommentsBranchState();\n store.commentsByBranch.set(ctx.branchId, st);\n\n const nowN: number = Date.now();\n const threadId: ThreadId = newThreadId() as ThreadId;\n const msgId: CommentId = newMessageId() as CommentId;\n\n const th: CommentThread = {\n id: threadId,\n anchor: input.anchor,\n resolved: false,\n createdAt: nowN as any,\n updatedAt: nowN as any,\n messages: [\n {\n id: msgId,\n body: input.body,\n createdAt: nowN as any,\n meta: input.meta,\n } as CommentMessage,\n ],\n meta: input.meta,\n } as CommentThread;\n\n st.threads.set(threadId, th);\n return ok(th);\n },\n\n addMessage: async (ctx: BackendScope, input) => {\n const res = ensureThreadContext(ctx, input.threadId);\n if (!res.ok) return res;\n const { st, th, nowN } = res.value;\n\n const msg: CommentMessage = {\n id: newMessageId() as CommentId,\n body: input.body,\n createdAt: nowN as any,\n meta: input.meta,\n } as CommentMessage;\n\n const msgs: CommentMessage[] = [\n ...((th.messages ?? []) as CommentMessage[]),\n msg,\n ];\n const next: CommentThread = {\n ...(th as object),\n messages: msgs,\n updatedAt: nowN as any,\n } as CommentThread;\n\n st.threads.set(th.id as ThreadId, next);\n return ok(msg);\n },\n\n editMessage: async (ctx: BackendScope, input) => {\n const res = ensureThreadContext(ctx, input.threadId);\n if (!res.ok) return res;\n const { st, th, nowN } = res.value;\n\n const idx: number = findMessageIndex(\n th,\n input.messageId as CommentId,\n );\n if (idx < 0) return fail(\"not_found\", \"Message not found.\");\n\n const msgs: CommentMessage[] = [\n ...((th.messages ?? []) as CommentMessage[]),\n ];\n const prev: CommentMessage = msgs[idx] as CommentMessage;\n\n const nextMsg: CommentMessage = {\n ...(prev as object),\n body: input.body,\n editedAt: nowN as any,\n } as CommentMessage;\n\n msgs[idx] = nextMsg;\n\n const next: CommentThread = {\n ...(th as object),\n messages: msgs,\n updatedAt: nowN as any,\n } as CommentThread;\n\n st.threads.set(th.id as ThreadId, next);\n return ok(nextMsg);\n },\n\n deleteMessage: async (ctx: BackendScope, input) => {\n const res = ensureThreadContext(ctx, input.threadId);\n if (!res.ok) return res;\n const { st, th, nowN } = res.value;\n\n const msgs: CommentMessage[] = (\n (th.messages ?? []) as CommentMessage[]\n ).filter(\n (m: CommentMessage) => m.id !== (input.messageId as CommentId),\n );\n\n const next: CommentThread = {\n ...(th as object),\n messages: msgs,\n updatedAt: nowN as any,\n } as CommentThread;\n\n st.threads.set(th.id as ThreadId, next);\n return ok(undefined);\n },\n\n moveThread: async (ctx: BackendScope, input) => {\n const res = ensureThreadContext(ctx, input.threadId);\n if (!res.ok) return res;\n const { st, th, nowN } = res.value;\n\n const next: CommentThread = {\n ...(th as object),\n anchor: input.anchor,\n updatedAt: nowN as any,\n } as CommentThread;\n\n st.threads.set(th.id as ThreadId, next);\n return ok(next);\n },\n\n resolveThread: async (ctx: BackendScope, input) => {\n const res = ensureThreadContext(ctx, input.threadId);\n if (!res.ok) return res;\n const { st, th, nowN } = res.value;\n\n const next: CommentThread = {\n ...(th as object),\n resolved: input.resolved,\n updatedAt: nowN as any,\n } as CommentThread;\n\n st.threads.set(th.id as ThreadId, next);\n return ok(next);\n },\n\n deleteThread: async (ctx: BackendScope, input) => {\n if (ctx.workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n const st =\n store.commentsByBranch.get(ctx.branchId) ??\n newCommentsBranchState();\n store.commentsByBranch.set(ctx.branchId, st);\n\n st.threads.delete(input.threadId as ThreadId);\n return ok(undefined);\n },\n };\n\n // WorkspaceBackend.comments expects CommentsBackend (default unknown generics);\n // we return a structurally compatible implementation.\n const comments: WorkspaceBackend[\"comments\"] = wrapBackendMethods(\n commentsImplBase,\n initStore,\n persistStore,\n [\n \"createThread\",\n \"addMessage\",\n \"editMessage\",\n \"deleteMessage\",\n \"moveThread\",\n \"resolveThread\",\n \"deleteThread\",\n ],\n );\n\n const policiesBase: PoliciesBackend = {\n load: async (ctx: PolicyScope) => {\n if (ctx.workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n\n const state = ctx.branchId\n ? store.policiesByBranch.get(ctx.branchId)\n : store.policies;\n\n if (!state) return ok(null);\n\n const out: PoliciesLoadResult = {\n raw: state.raw,\n updatedAt: state.updatedAt,\n etag: state.etag,\n };\n return ok(out);\n },\n\n save: async (ctx: PolicyScope, input) => {\n if (ctx.workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n\n const prev = ctx.branchId\n ? store.policiesByBranch.get(ctx.branchId)\n : store.policies;\n\n if (input.etag && prev?.etag && input.etag !== prev.etag) {\n return fail(\"etag_mismatch\", \"Policy etag mismatch.\");\n }\n\n const updatedAt = isoNow();\n const etag = bumpEtag(prev?.etag);\n const next = { raw: input.raw, updatedAt, etag };\n\n if (ctx.branchId) {\n store.policiesByBranch.set(ctx.branchId, next);\n } else {\n store.policies = next;\n }\n\n return ok({ updatedAt, etag });\n },\n\n clear: async (ctx: PolicyScope) => {\n if (ctx.workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n\n const updatedAt = isoNow();\n if (ctx.branchId) {\n store.policiesByBranch.delete(ctx.branchId);\n } else {\n store.policies = null;\n }\n\n return ok({ updatedAt });\n },\n };\n const policies: PoliciesBackend = wrapBackendMethods(\n policiesBase,\n initStore,\n persistStore,\n [\"save\", \"clear\"],\n );\n\n const backend: WorkspaceBackend = {\n info,\n authors,\n permissions,\n branches,\n access,\n services,\n templates,\n snapshots,\n policies,\n comments,\n };\n\n return backend;\n}\n","// src/react/workspace/app.tsx\nimport * as React from \"react\";\n\nimport { WorkspaceProvider } from \"./context\";\nimport type { WorkspaceProviderProps } from \"./context\";\nimport type { Actor, WorkspaceBackend } from \"./context/backend\";\n\nimport type { ToolsConfig } from \"./components\";\nimport { CanvasProvider } from \"./context/context\";\n\n/**\n * Props for the Workspace wrapper. Mirrors WorkspaceProvider options.\n */\nexport interface WorkspaceProps {\n readonly backend: WorkspaceBackend;\n readonly actor: Actor;\n\n /** Optional pre-hydration to avoid blank first paint */\n readonly initial?: WorkspaceProviderProps[\"initial\"];\n\n /** Ensure a 'main' branch exists; otherwise first branch is used (default true) */\n readonly ensureMain?: WorkspaceProviderProps[\"ensureMain\"];\n\n /** Live refresh mode (poll/SSE/WS/off). Defaults to off. */\n readonly live?: WorkspaceProviderProps[\"live\"];\n\n /** Optional live adapter registry (ws/sse/custom). */\n readonly liveAdapters?: WorkspaceProviderProps[\"liveAdapters\"];\n\n /** Debounce refresh ticks (WS bursts etc). */\n readonly liveDebounceMs?: WorkspaceProviderProps[\"liveDebounceMs\"];\n\n /** Autosave debounce window in ms (default 9000) */\n readonly autosaveMs?: WorkspaceProviderProps[\"autosaveMs\"];\n\n /** Auto-run autosave when dirty (default true) */\n readonly autoAutosave?: WorkspaceProviderProps[\"autoAutosave\"];\n\n readonly tools?: ToolsConfig;\n readonly children: (tools?: ToolsConfig) => React.ReactNode;\n}\n\n/**\n * Workspace: wraps app panels with WorkspaceProvider.\n * Accepts the same inputs as WorkspaceProvider and passes them through.\n */\nexport function Workspace(props: WorkspaceProps): React.JSX.Element {\n const {\n backend,\n actor,\n initial,\n ensureMain,\n live,\n liveAdapters,\n liveDebounceMs,\n autosaveMs,\n autoAutosave,\n tools,\n children,\n } = props;\n\n return (\n <WorkspaceProvider\n backend={backend}\n actor={actor}\n initial={initial}\n ensureMain={ensureMain}\n live={live}\n liveAdapters={liveAdapters}\n liveDebounceMs={liveDebounceMs}\n autosaveMs={autosaveMs}\n autoAutosave={autoAutosave}\n >\n <CanvasProvider>{children(tools)}</CanvasProvider>\n </WorkspaceProvider>\n );\n}\n\nexport default Workspace;\n","// src/react/adapters/reactflow/ReactFlowCanvas.tsx\nimport React, { useMemo, useState } from \"react\";\nimport { Background, ConnectionMode, MiniMap, ReactFlow } from \"@xyflow/react\";\nimport \"@xyflow/react/dist/style.css\";\n\nimport {\n type AdapterOptions,\n useReactFlowAdapter,\n} from \"../adapters/reactflow/adapter\";\nimport type { CanvasAPI } from \"@/react\";\nimport { Toolbar } from \"../adapters/reactflow/toolbar\";\nimport type { LabelPlacement, ToolsConfig } from \"./index\";\nimport { edgeTypes, nodeTypes } from \"./reactflow\";\n\nexport type ReactFlowCanvasProps = {\n api: CanvasAPI;\n options?: AdapterOptions;\n\n showToolbar?: boolean;\n tools?: ToolsConfig;\n labelPlacement?: LabelPlacement;\n renderTool?: Parameters<typeof Toolbar>[0][\"renderButton\"];\n\n initialShowGrid?: boolean;\n initialShowMiniMap?: boolean;\n\n /** absolute position classes relative to the ReactFlow canvas */\n toolbarPositionClassName?: string; // e.g. \"left-2 top-2\"\n children?: React.ReactNode;\n};\n\nexport function Canvas({\n api,\n options,\n showToolbar = true,\n tools,\n labelPlacement = \"tooltip\",\n renderTool,\n initialShowGrid = true,\n initialShowMiniMap = false,\n toolbarPositionClassName = \"left-2 top-2\",\n children,\n}: ReactFlowCanvasProps) {\n const [showGrid, setShowGrid] = useState(initialShowGrid);\n const [showMiniMap, setShowMiniMap] = useState(initialShowMiniMap);\n\n const {\n nodes,\n edges,\n onNodesChange,\n onEdgesChange,\n onConnect,\n onConnectStart,\n onConnectEnd,\n onMoveEnd,\n onSelectionChange,\n isValidConnection,\n snapVector,\n } = useReactFlowAdapter(api, options);\n\n const snapToGrid = useMemo(\n () => !!options?.snapToGrid,\n [options?.snapToGrid],\n );\n const snapGrid = useMemo<[number, number] | undefined>(\n () => snapVector,\n [snapVector],\n );\n\n return (\n <div className=\"relative h-full w-full bg-gray-50\">\n <ReactFlow\n nodes={nodes}\n edges={edges}\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n connectionMode={ConnectionMode.Loose}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onConnectStart={onConnectStart}\n onConnectEnd={onConnectEnd}\n onConnect={onConnect}\n onMoveEnd={onMoveEnd}\n onSelectionChange={onSelectionChange}\n isValidConnection={isValidConnection}\n fitView\n snapToGrid={snapToGrid}\n snapGrid={snapGrid}\n >\n {/* toolbar inside ReactFlow so useReactFlow() works */}\n {showToolbar && (\n <div\n className={`pointer-events-none absolute z-10 ${toolbarPositionClassName}`}\n >\n <Toolbar\n api={api}\n mode=\"dev\"\n showGrid={showGrid}\n setShowGrid={setShowGrid}\n showMiniMap={showMiniMap}\n setShowMiniMap={setShowMiniMap}\n tools={tools}\n labelPlacement={labelPlacement}\n renderButton={renderTool}\n />\n </div>\n )}\n\n {showMiniMap && <MiniMap />}\n {showGrid && <Background />}\n {children}\n </ReactFlow>\n </div>\n );\n}\n","// src/react/adapters/reactflow/adapter.ts\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type {\n Node,\n Edge,\n OnConnect,\n OnEdgesChange,\n OnNodesChange,\n Viewport as RFViewport,\n IsValidConnection,\n Connection,\n OnConnectStart,\n OnConnectEnd,\n} from \"@xyflow/react\";\nimport { applyNodeChanges, applyEdgeChanges } from \"@xyflow/react\";\nimport type { CanvasAPI } from \"@/react\";\nimport type { CanvasState } from \"@/schema/canvas-types\";\nimport type { EdgeKind } from \"@/schema/graph\";\nimport { CommentThread } from \"@/schema/comments\";\n\n/* ───────────────────────────── Types & options ───────────────────────────── */\n\nexport type AdapterOptions = {\n // validation & policy\n beforeConnect?: (arg: {\n from: string;\n to: string;\n kind: EdgeKind;\n api: CanvasAPI;\n }) => { ok: boolean; reason?: string };\n afterConnect?: (arg: {\n from: string;\n to: string;\n kind: EdgeKind;\n created: boolean;\n api: CanvasAPI;\n }) => void;\n\n // behavior\n allowEdgeDelete?: boolean; // reserved\n enableShortcuts?: boolean; // reserved\n\n // snapping & perf\n snapToGrid?: boolean | { x: number; y: number };\n throttleMs?: number; // default 80ms\n\n // mapping/decoration\n nodeDecorators?: (nodeId: string) => Partial<Node>;\n edgeDecorators?: (edgeId: string) => Partial<Edge>;\n};\n\ntype RFModel = { nodes: Node[]; edges: Edge[] };\n\n/* ───────────────────────────── Utilities ───────────────────────────── */\n\nfunction rafThrottle<T extends (...args: any[]) => void>(fn: T, minMs = 80): T {\n let frame = 0;\n let last = 0;\n let queuedArgs: any[] | null = null;\n\n const run = (now: number) => {\n frame = 0;\n last = now;\n const args = queuedArgs!;\n queuedArgs = null;\n fn(...(args as Parameters<T>));\n };\n\n return ((...args: any[]) => {\n queuedArgs = args;\n const now = performance.now();\n if (!frame) {\n if (now - last >= minMs) {\n run(now);\n } else {\n frame = requestAnimationFrame(run);\n }\n }\n }) as T;\n}\n\nconst isCommentId = (id: string) => id.startsWith(\"c::\");\n\nfunction sameIdSet(a: string[], b: string[]): boolean {\n if (a.length !== b.length) return false;\n const s = new Set(a);\n for (const id of b) if (!s.has(id)) return false;\n return true;\n}\n\n/* ───────────────────────────── Mapping helpers ───────────────────────────── */\n\nfunction commentPosition(\n th: CommentThread,\n state: CanvasState,\n): { x: number; y: number } {\n const a = th.anchor!;\n if (a.type === \"free\") return { x: a.position.x, y: a.position.y };\n if (a.type === \"node\") {\n const base = state.positions[a.nodeId] ?? { x: 0, y: 0 };\n const dx = a.offset?.dx ?? 32;\n const dy = a.offset?.dy ?? -16;\n return { x: base.x + dx, y: base.y + dy };\n }\n // edge-anchored: simple fallback (edge geometry not available here)\n return { x: 0, y: 0 };\n}\n\nfunction commentNodes(state: CanvasState, api: CanvasAPI): Node[] {\n return api.comments\n .list()\n .filter((item) => !!item.anchor)\n .map((th) => ({\n id: `c::${th.id}`,\n type: \"comment\",\n position: commentPosition(th, state),\n draggable: true,\n selectable: true,\n data: { thread: th },\n }));\n}\n\nfunction toRF(\n state: CanvasState,\n api: CanvasAPI,\n opts?: Pick<AdapterOptions, \"nodeDecorators\" | \"edgeDecorators\">,\n): RFModel {\n const nodes: Node[] = state.graph.nodes.map((n) => {\n const base: Node = {\n id: n.id,\n type: n.kind,\n data: { node: n },\n position: state.positions[n.id] ?? { x: 0, y: 0 },\n selected: state.selection.has(n.id),\n };\n return opts?.nodeDecorators\n ? { ...base, ...(opts.nodeDecorators(n.id) ?? {}) }\n : base;\n });\n\n const edges: Edge[] = state.graph.edges.map((e) => {\n const id = `${e.kind}:${e.from}->${e.to}`;\n const base: Edge = {\n id,\n source: e.from,\n target: e.to,\n type: e.kind,\n data: { edge: e },\n // @ts-ignore\n selectable: true,\n };\n return opts?.edgeDecorators\n ? { ...base, ...(opts.edgeDecorators(id) ?? {}) }\n : base;\n });\n\n nodes.push(...commentNodes(state, api));\n return { nodes, edges };\n}\n\n// Parse \"kind:from->to\"\nconst parseEdgeId = (\n id: string,\n): { kind: EdgeKind; from: string; to: string } | null => {\n const [k, rest] = id.split(\":\");\n if (!k || !rest) return null;\n const [from, to] = rest.split(\"->\");\n if (!from || !to) return null;\n return { kind: k as EdgeKind, from, to };\n};\n\n/* ───────────────────────────── Hook ───────────────────────────── */\n\nexport function useReactFlowAdapter(\n api: CanvasAPI,\n options: AdapterOptions = {},\n) {\n // derive, don’t mutate incoming options\n const throttleMs = options.throttleMs ?? 80;\n const snapToGridOpt = options.snapToGrid;\n const nodeDecorators = options.nodeDecorators;\n const edgeDecorators = options.edgeDecorators;\n\n // Stable refs for validation callbacks\n const beforeConnectRef = useRef(options.beforeConnect);\n const afterConnectRef = useRef(options.afterConnect);\n useEffect(() => {\n beforeConnectRef.current = options.beforeConnect;\n }, [options.beforeConnect]);\n useEffect(() => {\n afterConnectRef.current = options.afterConnect;\n }, [options.afterConnect]);\n\n const [rf, setRF] = useState<RFModel>(() =>\n toRF(api.snapshot(), api, { nodeDecorators, edgeDecorators }),\n );\n\n const relRef = useRef<EdgeKind>(api.getEdgeRel());\n const dragStartRef = useRef<{ from?: string } | null>(null);\n const lastViewportRef = useRef<RFViewport | null>(null);\n\n // snap grid tuple\n const snapVector = useMemo<[number, number] | undefined>(() => {\n if (!snapToGridOpt) return undefined;\n if (snapToGridOpt === true) return [8, 8];\n return [snapToGridOpt.x || 8, snapToGridOpt.y || 8];\n }, [snapToGridOpt]);\n\n // Subscribe to API *structural* changes only.\n // Avoid re-mapping during drag/viewport churn (positions live update locally).\n useEffect(() => {\n const toModel = () =>\n setRF(\n toRF(api.snapshot(), api, { nodeDecorators, edgeDecorators }),\n );\n\n const offGraph = api.on(\"graph:update\", toModel);\n const offC1 = api.on(\"comment:thread:create\", toModel);\n const offC2 = api.on(\"comment:thread:update\", toModel);\n const offC3 = api.on(\"comment:thread:delete\", toModel);\n const offC4 = api.on(\"comment:move\", toModel);\n const offC5 = api.on(\"comment:resolve\", toModel);\n\n return () => {\n offGraph();\n offC1();\n offC2();\n offC3();\n offC4();\n offC5();\n };\n }, [api, nodeDecorators, edgeDecorators]);\n\n /* ── handlers ── */\n\n const applySnap = useCallback(\n (p: { x: number; y: number }) => {\n if (!snapVector) return p;\n const [gx, gy] = snapVector;\n return {\n x: Math.round(p.x / gx) * gx,\n y: Math.round(p.y / gy) * gy,\n };\n },\n [snapVector],\n );\n\n const setPositionsThrottled = useMemo(\n () =>\n rafThrottle(\n (pos: Record<string, { x: number; y: number }>) =>\n api.setPositions(pos),\n throttleMs,\n ),\n [api, throttleMs],\n );\n\n const setViewportThrottled = useMemo(\n () =>\n rafThrottle(\n (v: RFViewport) =>\n api.setViewport({ x: v.x, y: v.y, zoom: v.zoom }),\n throttleMs,\n ),\n [api, throttleMs],\n );\n\n const onNodesChange: OnNodesChange = useCallback(\n async (changes) => {\n // 1) Update RF locally for buttery dragging\n setRF((prev) => ({\n nodes: applyNodeChanges(changes, prev.nodes),\n edges: prev.edges,\n }));\n\n // 2) Collect batched position + selection updates for API\n const posUpdates: Record<string, { x: number; y: number }> = {};\n let selectionDirty = false;\n const keep = new Set<string>(\n Array.isArray(api.getSelection())\n ? (api.getSelection() as string[])\n : Array.from(api.getSelection() as unknown as Set<string>),\n );\n\n for (const c of changes) {\n if (c.type === \"position\" && c.position) {\n // Comment dragging → move comment anchor in API\n if (isCommentId(c.id)) {\n const threadId = c.id.slice(3);\n const th = api.comments.get(threadId);\n if (!th || !th.anchor) continue;\n const a = th.anchor;\n if (a.type === \"free\") {\n await api.comments.move(threadId, {\n type: \"free\",\n position: c.position,\n });\n } else if (a.type === \"node\") {\n const nodePos = api.snapshot().positions[\n a.nodeId\n ] ?? { x: 0, y: 0 };\n await api.comments.move(threadId, {\n type: \"node\",\n nodeId: a.nodeId,\n offset: {\n dx: c.position.x - nodePos.x,\n dy: c.position.y - nodePos.y,\n },\n });\n }\n continue;\n }\n posUpdates[c.id] = applySnap(c.position);\n } else if (c.type === \"select\") {\n if (!isCommentId(c.id)) {\n selectionDirty = true;\n if (c.selected) keep.add(c.id);\n else keep.delete(c.id);\n } else {\n api.selectComments(\n c.selected ? c.id.slice(3) : undefined,\n );\n }\n }\n }\n\n if (Object.keys(posUpdates).length)\n setPositionsThrottled(posUpdates);\n\n if (selectionDirty) {\n const next = Array.from(keep);\n const currRaw = api.getSelection();\n const curr = Array.isArray(currRaw)\n ? (currRaw as string[])\n : Array.from(currRaw as Set<string>);\n if (!sameIdSet(next, curr)) {\n api.select(keep);\n }\n }\n },\n [api, applySnap, setPositionsThrottled],\n );\n\n const onEdgesChange: OnEdgesChange = useCallback(\n (changes) => {\n // 1) Update RF locally\n setRF((prev) => ({\n nodes: prev.nodes,\n edges: applyEdgeChanges(changes, prev.edges),\n }));\n\n // 2) Highlight + deletions to API\n const selectedEdgeIds: string[] = [];\n const deletions: Array<{\n kind: EdgeKind;\n from: string;\n to: string;\n }> = [];\n\n for (const c of changes) {\n if (c.type === \"select\") {\n if (c.selected) selectedEdgeIds.push(c.id);\n } else if (c.type === \"remove\") {\n const parsed = parseEdgeId(c.id);\n if (parsed) deletions.push(parsed);\n }\n }\n\n if (selectedEdgeIds.length) {\n const endpointIds = new Set<string>();\n for (const id of selectedEdgeIds) {\n const p = parseEdgeId(id);\n if (!p) continue;\n endpointIds.add(p.from);\n endpointIds.add(p.to);\n }\n api.setHighlighted(endpointIds);\n } else {\n api.setHighlighted([]);\n }\n\n for (const d of deletions) {\n api.emit(\"wire:delete\" as any, d);\n }\n },\n [api],\n );\n\n const currentRel = useCallback(() => {\n const k = api.getEdgeRel();\n relRef.current = k;\n return k;\n }, [api]);\n\n const isValidConnection: IsValidConnection = useCallback(\n (conn: Connection | Edge) => {\n const kind = currentRel();\n const from = conn.source ?? \"\";\n const to = conn.target ?? \"\";\n if (!from || !to) return false;\n if (from === to) return false;\n if (isCommentId(from) || isCommentId(to)) return false;\n\n const check = beforeConnectRef.current;\n if (check) {\n try {\n return !!check({ from, to, kind, api }).ok;\n } catch {\n return false;\n }\n }\n return true;\n },\n [api, currentRel],\n );\n\n const onConnectStart: OnConnectStart = useCallback(\n (_, { nodeId }) => {\n if (!nodeId) return;\n dragStartRef.current = { from: nodeId };\n const kind = currentRel();\n api.startWire(nodeId, kind);\n },\n [api, currentRel],\n );\n\n const onConnectEnd: OnConnectEnd = useCallback(() => {\n dragStartRef.current = null;\n api.cancelWire();\n }, [api]);\n\n const onConnect: OnConnect = useCallback(\n (params) => {\n const from = params.source!;\n const to = params.target!;\n const kind = currentRel();\n\n const check = beforeConnectRef.current;\n if (check) {\n const res = check({ from, to, kind, api });\n if (!res.ok) {\n api.cancelWire();\n return;\n }\n }\n\n api.startWire(from, kind);\n api.commitWire(to);\n afterConnectRef.current?.({ from, to, kind, created: true, api });\n dragStartRef.current = null;\n },\n [api, currentRel],\n );\n\n const onMoveEnd = useCallback(\n (_evt: any, viewport: RFViewport) => {\n const prev = lastViewportRef.current;\n const changed =\n !prev ||\n Math.abs(prev.x - viewport.x) > 0.5 ||\n Math.abs(prev.y - viewport.y) > 0.5 ||\n Math.abs(prev.zoom - viewport.zoom) > 1e-4;\n\n if (changed) {\n lastViewportRef.current = viewport;\n setViewportThrottled(viewport);\n }\n },\n [setViewportThrottled],\n );\n\n const onSelectionChange = useCallback(\n ({ nodes }: { nodes: Node[]; edges: Edge[] }) => {\n console.log(\"onSelectionChange\", nodes);\n const next = nodes.map((n) => n.id);\n const currRaw = api.getSelection();\n const curr = Array.isArray(currRaw)\n ? (currRaw as string[])\n : Array.from(currRaw as Set<string>);\n if (sameIdSet(next, curr)) return;\n api.select(next);\n },\n [api],\n );\n\n return {\n nodes: rf.nodes,\n edges: rf.edges,\n onNodesChange,\n onEdgesChange,\n onConnect,\n onConnectStart,\n onConnectEnd,\n onMoveEnd,\n onSelectionChange,\n isValidConnection,\n snapVector,\n };\n}\n","import React, { useMemo, useState, useCallback } from \"react\";\nimport { useReactFlow } from \"@xyflow/react\";\nimport type { CanvasAPI } from \"@/react\";\nimport { resolveTools } from \"./toolbar/merge\";\nimport type {\n ResolvedTools,\n ToolContext,\n ToolsConfig,\n LabelPlacement,\n ToolDescriptor,\n} from \"./toolbar/types\";\nimport { Icons } from \"./toolbar/icons\";\n\nexport type ToolbarProps = {\n api: CanvasAPI;\n mode?: \"dev\" | \"prod\";\n showGrid: boolean;\n setShowGrid: (v: boolean) => void;\n showMiniMap: boolean;\n setShowMiniMap: (v: boolean) => void;\n\n tools?: ToolsConfig;\n /** Default: 'tooltip' (hidden label, shown as native tooltip) */\n labelPlacement?: LabelPlacement;\n /** Optional custom button renderer */\n renderButton?: (t: ToolRender, key: string) => React.ReactNode;\n};\n\nexport type ToolRender = {\n id: string;\n label?: string;\n icon?: React.ReactNode;\n active: boolean;\n disabled: boolean;\n disabledReason?: string;\n onClick: () => void;\n group?: string;\n hasMenu?: boolean;\n open?: boolean;\n onToggleMenu?: () => void;\n children?: ToolRender[];\n};\n\nexport function Toolbar({\n api,\n mode = \"dev\",\n showGrid,\n setShowGrid,\n showMiniMap,\n setShowMiniMap,\n tools,\n labelPlacement = \"tooltip\",\n renderButton,\n}: ToolbarProps) {\n const rf = useReactFlow();\n const [openMenuId, setOpenMenuId] = useState<string | null>(null);\n\n const selectionCount = api.getSelection().length;\n const relation = api.getEdgeRel();\n const canUndo = true;\n const canRedo = true;\n\n const ctx: ToolContext = useMemo(\n () => ({\n api,\n env: { mode },\n state: {\n relation,\n selectionCount,\n canUndo,\n canRedo,\n showGrid,\n showMiniMap,\n },\n flow: {\n zoomIn: () => rf.zoomIn?.(),\n zoomOut: () => rf.zoomOut?.(),\n fitView: () => rf.fitView?.(),\n },\n setRelation: (rel) => api.setEdgeRel(rel),\n toggleGrid: () => setShowGrid(!showGrid),\n toggleMiniMap: () => setShowMiniMap(!showMiniMap),\n }),\n [\n api,\n mode,\n relation,\n selectionCount,\n showGrid,\n showMiniMap,\n rf,\n setShowGrid,\n setShowMiniMap,\n ],\n );\n\n const descriptors: ResolvedTools = useMemo(\n () => resolveTools({ base: defaultTools(), ...(tools ?? {}) }),\n [tools],\n );\n\n const buildRenderable = useCallback(\n (defs: ToolDescriptor[]): ToolRender[] => {\n return defs\n .filter((t) => (t.when ? !!t.when(ctx) : true))\n .map((t) => {\n const en = t.enabled ? t.enabled(ctx) : true;\n const enabledOk =\n typeof en === \"boolean\" ? en : en.ok !== false;\n const reason =\n typeof en === \"boolean\" ? undefined : en.reason;\n const active = t.active ? !!t.active(ctx) : false;\n\n let iconNode: React.ReactNode | undefined;\n if (typeof t.icon === \"function\")\n iconNode = t.icon(active, !enabledOk);\n else if (typeof t.icon === \"string\")\n iconNode = mapIcon(t.icon, active);\n\n const onClick = async () => {\n if (!enabledOk || !t.action) return;\n try {\n t.onBefore?.(ctx);\n await t.action(ctx);\n t.onAfter?.(ctx);\n } catch (err) {\n t.onError?.(ctx, err);\n api.emit(\"error\", {\n message:\n (err as any)?.message ??\n \"Tool action failed\",\n meta: { tool: t.id },\n });\n }\n };\n\n const hasMenu = !!(t.children && t.children.length);\n const children = hasMenu\n ? buildRenderable(t.children!)\n : undefined;\n\n return {\n id: t.id,\n label: t.label,\n icon: iconNode,\n active,\n disabled: !enabledOk,\n disabledReason: reason,\n onClick,\n group: t.group,\n hasMenu,\n open: hasMenu && openMenuId === t.id,\n onToggleMenu: hasMenu\n ? () =>\n setOpenMenuId(\n openMenuId === t.id ? null : t.id,\n )\n : undefined,\n children,\n } as ToolRender;\n });\n },\n [ctx, api, openMenuId],\n );\n\n const items: ToolRender[] = buildRenderable(descriptors);\n const groups = groupBy(items, (i) => i.group ?? \"view\");\n\n return (\n <div className=\"dsb-toolbar pointer-events-none absolute left-2 top-2 z-10 grid gap-2\">\n {Object.entries(groups).map(([g, arr]) => (\n <div\n key={g}\n className=\"dsb-toolbar__group pointer-events-auto flex gap-1 rounded-lg border border-border bg-card/90 p-1 shadow-sm\"\n >\n {arr.map((btn) =>\n renderButton ? (\n renderButton(btn, btn.id)\n ) : (\n <DefaultTool\n key={btn.id}\n {...btn}\n labelPlacement={labelPlacement}\n />\n ),\n )}\n </div>\n ))}\n </div>\n );\n}\n\n/* ------------------- Built-in tools (with Tailwind icons) ------------------- */\n\nfunction defaultTools(): ToolDescriptor[] {\n return [\n {\n id: \"mode:bind\",\n kind: \"mode\",\n group: \"relation\",\n order: 10,\n label: \"Bind\",\n icon: (active) => Icons.bind(active),\n active: (ctx) => ctx.state.relation === \"bind\",\n action: (ctx) => ctx.setRelation(\"bind\"),\n },\n {\n id: \"mode:include\",\n kind: \"mode\",\n group: \"relation\",\n order: 20,\n label: \"Include\",\n icon: (active) => Icons.include(active),\n active: (ctx) => ctx.state.relation === \"include\",\n action: (ctx) => ctx.setRelation(\"include\"),\n },\n {\n id: \"mode:exclude\",\n kind: \"mode\",\n group: \"relation\",\n order: 30,\n label: \"Exclude\",\n icon: (active) => Icons.exclude(active),\n active: (ctx) => ctx.state.relation === \"exclude\",\n action: (ctx) => ctx.setRelation(\"exclude\"),\n },\n\n {\n id: \"view:grid\",\n kind: \"toggle\",\n group: \"view\",\n order: 10,\n label: \"Grid\",\n icon: (a) => Icons.grid(a),\n active: (ctx) => ctx.state.showGrid,\n action: (ctx) => ctx.toggleGrid(),\n },\n {\n id: \"view:minimap\",\n kind: \"toggle\",\n group: \"view\",\n order: 20,\n label: \"Minimap\",\n icon: (a) => Icons.minimap(a),\n active: (ctx) => ctx.state.showMiniMap,\n action: (ctx) => ctx.toggleMiniMap(),\n },\n\n // Example dropdown (menu) with viewport controls\n {\n id: \"zoom:menu\",\n kind: \"menu\",\n group: \"viewport\",\n order: 5,\n label: \"Viewport\",\n icon: () => Icons.fit(),\n children: [\n {\n id: \"zoom:in\",\n kind: \"command\",\n label: \"Zoom In\",\n icon: () => Icons.zoomIn(),\n action: (ctx) => ctx.flow.zoomIn(),\n },\n {\n id: \"zoom:out\",\n kind: \"command\",\n label: \"Zoom Out\",\n icon: () => Icons.zoomOut(),\n action: (ctx) => ctx.flow.zoomOut(),\n },\n {\n id: \"zoom:fit\",\n kind: \"command\",\n label: \"Fit\",\n icon: () => Icons.fit(),\n action: (ctx) => ctx.flow.fitView(),\n },\n ],\n },\n ];\n}\n\n/* ------------------- Renderers ------------------- */\n\nfunction DefaultTool({\n id,\n label,\n icon,\n active,\n disabled,\n disabledReason,\n onClick,\n hasMenu,\n open,\n onToggleMenu,\n children,\n group,\n labelPlacement,\n}: ToolRender & { labelPlacement: LabelPlacement }) {\n const baseBtn =\n \"dsb-tool inline-flex items-center justify-center rounded-md border border-border bg-card px-2 py-1 text-xs text-muted-foreground hover:bg-accent hover:text-accent-foreground aria-pressed:bg-accent aria-pressed:text-accent-foreground \" +\n (active ? \"ring-1 ring-ring bg-accent text-accent-foreground\" : \"\") +\n (disabled ? \" opacity-50 cursor-not-allowed\" : \"\");\n\n const title =\n labelPlacement === \"tooltip\"\n ? disabled\n ? (disabledReason ?? label)\n : label\n : undefined;\n\n const content = (\n <>\n {icon ?? null}\n {labelPlacement === \"inline\" && label && (\n <span className=\"ml-1\">{label}</span>\n )}\n {labelPlacement === \"below\" && label && (\n <span className=\"mt-0.5 block text-[10px] leading-3 text-muted-foreground\">\n {label}\n </span>\n )}\n {hasMenu && <span className=\"ml-1\">{Icons.chevronDown()}</span>}\n </>\n );\n\n if (!hasMenu) {\n return (\n <button\n type=\"button\"\n title={title}\n aria-pressed={active}\n disabled={disabled}\n onClick={onClick}\n className={\n baseBtn +\n \" h-8 w-8 \" +\n (labelPlacement === \"below\" ? \"flex-col\" : \"\")\n }\n >\n {content}\n </button>\n );\n }\n\n // Menu root\n return (\n <div className=\"relative\">\n <button\n type=\"button\"\n title={title}\n aria-expanded={open ? \"true\" : \"false\"}\n disabled={disabled}\n onClick={onToggleMenu}\n className={\n baseBtn +\n \" h-8 w-8 \" +\n (labelPlacement === \"below\" ? \"flex-col\" : \"\")\n }\n >\n {content}\n </button>\n\n {open && (\n <div\n className=\"absolute left-0 z-20 mt-1 min-w-[10rem] overflow-hidden rounded-md border border-border bg-popover shadow-lg\"\n role=\"menu\"\n >\n <ul className=\"divide-y divide-border\">\n {children?.map((ch) => (\n <li key={ch.id} className=\"p-0\">\n <button\n type=\"button\"\n role=\"menuitem\"\n title={\n labelPlacement === \"tooltip\"\n ? ch.disabled\n ? (ch.disabledReason ??\n ch.label)\n : ch.label\n : undefined\n }\n disabled={ch.disabled}\n onClick={ch.onClick}\n className={\n \"flex w-full items-center gap-2 px-3 py-2 text-sm hover:bg-accent hover:text-accent-foreground \" +\n (ch.disabled\n ? \"opacity-50 cursor-not-allowed\"\n : \"\")\n }\n >\n {ch.icon ?? null}\n {labelText(ch.label, \"inline\")}\n </button>\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n );\n}\n\nfunction labelText(label?: string, placement: LabelPlacement = \"tooltip\") {\n if (!label || placement === \"none\" || placement === \"tooltip\") return null;\n if (placement === \"inline\") return <span>{label}</span>;\n if (placement === \"below\")\n return (\n <span className=\"block text-[10px] leading-3 text-muted-foreground\">\n {label}\n </span>\n );\n return null;\n}\n\nfunction mapIcon(token: string, active: boolean): React.ReactNode {\n switch (token) {\n case \"bind\":\n return Icons.bind(active);\n case \"include\":\n return Icons.include(active);\n case \"exclude\":\n return Icons.exclude(active);\n case \"zoom-in\":\n return Icons.zoomIn();\n case \"zoom-out\":\n return Icons.zoomOut();\n case \"fit\":\n return Icons.fit();\n case \"grid\":\n return Icons.grid(active);\n case \"minimap\":\n return Icons.minimap(active);\n default:\n return (\n <span className=\"text-xs text-muted-foreground\">{token}</span>\n );\n }\n}\n\nfunction groupBy<T>(arr: T[], key: (t: T) => string): Record<string, T[]> {\n const out: Record<string, T[]> = {};\n for (const x of arr) {\n const k = key(x);\n if (!out[k]) out[k] = [];\n out[k].push(x);\n }\n return out;\n}\n","import type {ResolvedTools, ToolDescriptor, ToolsConfig} from './types';\r\n\r\nexport function resolveTools(config: ToolsConfig): ResolvedTools {\r\n const base = dedupeById(config.base ?? []);\r\n const extended = dedupeById(config.extend ?? []);\r\n const hidden = new Set(config.hidden ?? []);\r\n\r\n const byId = new Map<string, ToolDescriptor>();\r\n for (const t of base) byId.set(t.id, t);\r\n for (const t of extended) byId.set(t.id, t);\r\n\r\n let arr = Array.from(byId.values()).filter(t => !hidden.has(t.id));\r\n arr = sortWithAnchors(arr);\r\n arr.sort((a, b) => {\r\n const ga = a.group ?? 'view';\r\n const gb = b.group ?? 'view';\r\n if (ga !== gb) return ga < gb ? -1 : 1;\r\n const oa = a.order ?? 0;\r\n const ob = b.order ?? 0;\r\n return oa - ob;\r\n });\r\n\r\n return arr;\r\n}\r\n\r\nfunction dedupeById(list: ToolDescriptor[]): ToolDescriptor[] {\r\n const seen = new Set<string>();\r\n const out: ToolDescriptor[] = [];\r\n for (const t of list) {\r\n if (seen.has(t.id)) continue;\r\n seen.add(t.id);\r\n out.push(t);\r\n }\r\n return out;\r\n}\r\n\r\nfunction sortWithAnchors(list: ToolDescriptor[]): ToolDescriptor[] {\r\n const byId = new Map(list.map(t => [t.id, t]));\r\n const out: ToolDescriptor[] = [];\r\n const placed = new Set<string>();\r\n\r\n const place = (t: ToolDescriptor) => {\r\n if (placed.has(t.id)) return;\r\n if (t.insertBefore && byId.has(t.insertBefore)) {\r\n const anchor = byId.get(t.insertBefore)!;\r\n place(anchor);\r\n const idx = out.findIndex(x => x.id === anchor.id);\r\n out.splice(idx, 0, t);\r\n placed.add(t.id);\r\n return;\r\n }\r\n if (t.insertAfter && byId.has(t.insertAfter)) {\r\n place(byId.get(t.insertAfter)!);\r\n const idx = out.findIndex(x => x.id === t.insertAfter);\r\n out.splice(idx + 1, 0, t);\r\n placed.add(t.id);\r\n return;\r\n }\r\n out.push(t);\r\n placed.add(t.id);\r\n };\r\n\r\n for (const t of list) place(t);\r\n return out;\r\n}","import React from 'react';\r\n\r\nexport const Icons = {\r\n bind: (active = false) => (\r\n <svg className={`h-4 w-4 ${active ? 'text-primary' : 'text-muted-foreground'}`} viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M6 8a4 4 0 014-4h2a4 4 0 110 8H9\" stroke=\"currentColor\" strokeWidth=\"2\"/>\r\n <path d=\"M14 12a4 4 0 01-4 4H8a4 4 0 110-8h3\" stroke=\"currentColor\" strokeWidth=\"2\"/>\r\n </svg>\r\n ),\r\n include: (active = false) => (\r\n <svg className={`h-4 w-4 ${active ? 'text-primary' : 'text-muted-foreground'}`} viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M8 10h8M8 14h8M8 6h8M4 6h.01M4 10h.01M4 14h.01\" stroke=\"currentColor\" strokeWidth=\"2\"/>\r\n </svg>\r\n ),\r\n exclude: (active = false) => (\r\n <svg className={`h-4 w-4 ${active ? 'text-primary' : 'text-muted-foreground'}`} viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M5 5l10 10M15 5L5 15\" stroke=\"currentColor\" strokeWidth=\"2\"/>\r\n </svg>\r\n ),\r\n zoomIn: () => (\r\n <svg className=\"h-4 w-4 text-muted-foreground\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M9 9V5m0 4H5m4 0h4m-4 0v4\" stroke=\"currentColor\" strokeWidth=\"2\"/>\r\n <circle cx=\"9\" cy=\"9\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"2\"/>\r\n <path d=\"M13.5 13.5L18 18\" stroke=\"currentColor\" strokeWidth=\"2\"/>\r\n </svg>\r\n ),\r\n zoomOut: () => (\r\n <svg className=\"h-4 w-4 text-muted-foreground\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M5 9h8\" stroke=\"currentColor\" strokeWidth=\"2\"/>\r\n <circle cx=\"9\" cy=\"9\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"2\"/>\r\n <path d=\"M13.5 13.5L18 18\" stroke=\"currentColor\" strokeWidth=\"2\"/>\r\n </svg>\r\n ),\r\n fit: () => (\r\n <svg className=\"h-4 w-4 text-muted-foreground\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M3 7V3h4M17 7V3h-4M3 13v4h4M17 13v4h-4\" stroke=\"currentColor\" strokeWidth=\"2\"/>\r\n </svg>\r\n ),\r\n grid: (active = false) => (\r\n <svg className={`h-4 w-4 ${active ? 'text-primary' : 'text-muted-foreground'}`} viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M3 7h14M3 13h14M7 3v14M13 3v14\" stroke=\"currentColor\" strokeWidth=\"2\"/>\r\n </svg>\r\n ),\r\n minimap: (active = false) => (\r\n <svg className={`h-4 w-4 ${active ? 'text-primary' : 'text-muted-foreground'}`} viewBox=\"0 0 20 20\" fill=\"none\">\r\n <rect x=\"3\" y=\"4\" width=\"14\" height=\"12\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"2\"/>\r\n <rect x=\"6\" y=\"7\" width=\"6\" height=\"6\" rx=\"1\" fill=\"currentColor\"/>\r\n </svg>\r\n ),\r\n chevronDown: () => (\r\n <svg className=\"h-3 w-3 text-muted-foreground\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M6 8l4 4 4-4\" stroke=\"currentColor\" strokeWidth=\"2\"/>\r\n </svg>\r\n ),\r\n};","import React, { ReactNode, useEffect, useRef } from \"react\";\nimport { LiaTagsSolid } from \"react-icons/lia\";\nimport { RxInput } from \"react-icons/rx\";\nimport { TbHandClick } from \"react-icons/tb\";\nimport { LuTextSelect } from \"react-icons/lu\";\nimport { TfiComments } from \"react-icons/tfi\";\nimport { Handle, Position } from \"@xyflow/react\";\nimport { useCanvasAPI } from \"@/react/workspace/context/context\";\nimport { clsx } from \"clsx\";\n\ninterface Errors {\n title?: string;\n description: string;\n meta?: Record<string, unknown>;\n}\ninterface NodeProps {\n children?: (\n label: ReactNode,\n icon: ReactNode,\n errors?: Errors[],\n ) => React.ReactNode;\n description?: string;\n label: string;\n id: string;\n type: \"tag\" | \"field\" | \"option\" | \"button\" | \"comment\";\n errors?: Errors[];\n meta?: Record<string, unknown>;\n}\n\nfunction getIcon(\n type: NodeProps[\"type\"],\n): React.FC<React.SVGProps<SVGSVGElement>> {\n switch (type) {\n case \"tag\":\n return LiaTagsSolid;\n case \"field\":\n return RxInput;\n case \"option\":\n return LuTextSelect;\n case \"button\":\n return TbHandClick;\n case \"comment\":\n return TfiComments;\n }\n}\nconst Node: React.FC<NodeProps> = ({\n children,\n label,\n errors,\n id,\n type,\n description,\n}) => {\n const labelRef = useRef<HTMLDivElement>(null);\n const descRef = useRef<HTMLDivElement>(null);\n const { editor } = useCanvasAPI();\n\n useEffect(() => {\n if (labelRef.current && labelRef.current.innerText !== label) {\n labelRef.current.innerText = label;\n }\n if (\n descRef.current &&\n descRef.current.innerText !== (description ?? \"\")\n ) {\n descRef.current.innerText = description ?? \"\";\n }\n }, [label, description]);\n const Icon = getIcon(type);\n const Label = (\n <div\n contentEditable\n suppressContentEditableWarning\n tabIndex={0} // make it focusable\n onPointerDown={(e) => e.stopPropagation()}\n onMouseDown={(e) => e.stopPropagation()}\n onContextMenu={(e) => {\n e.preventDefault(); // prevent default context menu\n labelRef.current?.focus(); // focus the editable div\n }}\n onDoubleClick={(e) => {\n e.stopPropagation();\n labelRef.current?.focus();\n }}\n onBlur={() => {\n const newText = labelRef.current?.innerText.trim() || \"\";\n if (newText && newText !== label) {\n editor.reLabel(id, newText);\n }\n }}\n className=\"text-[12px] outline-none w-full cursor-text text-center\"\n >\n {label}\n </div>\n );\n return (\n <div\n className={clsx(\n \"px-4 items-center gap-2 relative min-h-[40px] flex h-fit bg-card ring ring-grey-100 rounded-md shadow text-card-foreground font-black\",\n )}\n >\n {children ? (\n children(Label, <Icon />, errors)\n ) : (\n <span className={\"flex gap-2 items-center\"}>\n <Icon /> {Label}\n </span>\n )}\n\n <Handle\n id=\"mid-top\"\n type=\"target\"\n position={Position.Top}\n style={{\n top: 0,\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n zIndex: 10,\n }}\n />\n <Handle\n id=\"mid-top\"\n type=\"source\"\n position={Position.Top}\n style={{\n top: 0,\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n zIndex: 10,\n }}\n />\n\n {/* mid-bottom: target + source */}\n <Handle\n id=\"mid-bottom\"\n type=\"target\"\n position={Position.Bottom}\n style={{\n bottom: 0,\n left: \"50%\",\n transform: \"translate(-50%, 50%)\",\n zIndex: 10,\n }}\n />\n <Handle\n id=\"mid-bottom\"\n type=\"source\"\n position={Position.Bottom}\n style={{\n bottom: 0,\n left: \"50%\",\n transform: \"translate(-50%, 50%)\",\n zIndex: 10,\n }}\n />\n </div>\n );\n};\n\nexport default Node;\n","import Node from \"./node\";\nimport type { FlowNode } from \"@/schema/graph\";\n\nfunction Tag({\n id,\n data: {\n node: { label },\n },\n}: FlowNode) {\n return <Node type={\"tag\"} label={label} id={id} />;\n}\n\nexport default Tag;\n","import Node from \"./node\";\nimport { FlowNode } from \"@/schema/graph\";\n\nfunction Field(props: FlowNode) {\n const {\n id,\n data: {\n node: { label },\n },\n } = props;\n return (\n <Node label={label} id={id} type={\"field\"}>\n {(label, icon) => {\n return (\n <span className=\"flex gap-2 items-center\">\n {icon}\n {label}\n </span>\n );\n }}\n </Node>\n );\n}\n\nexport default Field;\n","import Node from \"./node\";\nimport type { Node as RFNode, NodeProps } from \"@xyflow/react\";\n\ntype OptionNode = RFNode<{ label: string }, \"option\">;\n\nfunction Options({ id, data: { label } }: NodeProps<OptionNode>) {\n return <Node label={label} id={id} type={\"option\"} />;\n}\n\nexport default Options;\n","import Tag from \"./nodes/tags\";\nimport Field from \"./nodes/field\";\nimport Options from \"./nodes/options\";\n\nconst nodeTypes = {\n tag: Tag,\n field: Field,\n option: Options,\n};\n\nconst edgeTypes = {};\n\nexport { nodeTypes, edgeTypes };\n","// src/react/adapters/reactflow/index.tsx\nimport React from \"react\";\nimport type { AdapterOptions } from \"../adapters/reactflow/adapter\";\nimport type {\n LabelPlacement,\n ToolsConfig,\n} from \"../adapters/reactflow/toolbar/types\";\nimport { useCanvasAPI } from \"@/react/workspace/context/context\";\nimport { Canvas } from \"@/react/workspace/components/canvas\";\n\nexport type FlowCanvasProps = {\n tools?: ToolsConfig;\n /** 'dev' enables richer UX; 'prod' can hide some helpers */\n mode?: \"dev\" | \"prod\";\n /** Show/position the toolbar (inside the ReactFlow surface) */\n showToolbar?: boolean;\n toolbarPositionClassName?: string; // e.g. \"left-2 top-2\"\n\n /** How labels render on buttons: tooltip | inline | below | none */\n labelPlacement?: LabelPlacement;\n\n /** Pass custom renderer for individual tool buttons */\n renderTool?: React.ComponentProps<typeof Canvas>[\"renderTool\"];\n\n /** Initial layer toggles */\n initialShowGrid?: boolean;\n initialShowMiniMap?: boolean;\n\n /** Adapter options (snapping etc.) */\n options?: AdapterOptions;\n children?: React.ReactNode;\n};\n\nconst FlowCanvas: React.FC<FlowCanvasProps> = ({\n tools,\n showToolbar = true,\n toolbarPositionClassName,\n labelPlacement = \"tooltip\",\n renderTool,\n initialShowGrid = true,\n initialShowMiniMap = false,\n options,\n children,\n}) => {\n const api = useCanvasAPI();\n\n return (\n <Canvas\n api={api}\n tools={tools}\n showToolbar={showToolbar}\n toolbarPositionClassName={toolbarPositionClassName}\n labelPlacement={labelPlacement}\n renderTool={renderTool}\n initialShowGrid={initialShowGrid}\n initialShowMiniMap={initialShowMiniMap}\n options={options}\n children={children}\n />\n );\n};\n\nexport default FlowCanvas;\n\n// Optional convenience re-exports\nexport { Canvas };\nexport type { ToolsConfig, LabelPlacement, AdapterOptions };\n"],"mappings":"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","names":["React","React","toBackendError","runTasks","React","React","setLoadableError","React","setLoadableError","_a","params","React","setLoadableError","params","React","setLoadableError","React","params","_a","_b","_c","_d","React","setLoadableError","React","hasSnapshotProps","React","disconnect","connect","React","_a","React","useWorkspaceBoot","useWorkspaceBoot","_a","createContext","useContext","useEffect","useMemo","useRef","_a","_b","ok","cloneDeep","isButton","isServiceIdRef","cloneDeep","_a","out","role","cap","ok","results","toId","_a","_b","node","_c","_d","isButton","getNode","passesRate","ok","uniq","_a","_b","newId","_a","clone","_b","_c","_d","_e","_f","_g","_a","cloneDeep","_a","f","isButton","cloneDeep","_a","toId","_a","_b","filterServicesForVisibleGroup","_a","_a","_b","ok","toId","cloneDeep","filterServicesForVisibleGroup","_a","field","jsx","createContext","useRef","useMemo","useContext","useEffect","_a","React","useMemo","uniq","useMemo","React","_a","_b","disconnect","connect","_a","__seq","DB_NAME","STORE_NAME","persisted","out","st","jsx","useMemo","useState","useCallback","useEffect","useMemo","useRef","useState","_a","useMemo","useState","useCallback","_a","_b","_c","jsx","jsxs","Fragment","jsx","jsxs","useState","useMemo","useCallback","useEffect","useRef","jsx","jsxs","useRef","useEffect","jsx","jsx","jsxs","label","jsx","jsx","jsxs","useState","useMemo","jsx"]}
|
|
1
|
+
{"version":3,"sources":["../../src/react/workspace/context/provider/context.ts","../../src/react/workspace/context/provider/provider.tsx","../../src/react/workspace/context/provider/helpers.ts","../../src/react/workspace/context/provider/runtime/use-backend-runtime.ts","../../src/react/workspace/context/provider/slices/use-authors-slice.ts","../../src/react/workspace/context/provider/slices/use-permissions-slice.ts","../../src/react/workspace/context/provider/slices/use-branches-slice.ts","../../src/react/workspace/context/provider/slices/use-templates-slice.ts","../../src/react/workspace/context/provider/slices/use-services-slice.ts","../../src/react/workspace/context/provider/slices/use-snapshots-slice.ts","../../src/react/workspace/context/provider/slices/use-comments-slice.ts","../../src/react/workspace/context/provider/compose/use-branch-cache.ts","../../src/react/workspace/context/provider/compose/use-live-polling.ts","../../src/react/workspace/context/provider/slices/use-policies-slice.ts","../../src/core/policy.ts","../../src/react/workspace/context/provider/compose/use-workspace-boot.ts","../../src/react/workspace/context/context.tsx","../../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/utils/util.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/builder.ts","../../src/core/rate-coherence.ts","../../src/core/validate/index.ts","../../src/core/fallback.ts","../../src/core/tag-relations.ts","../../src/core/service-filter.ts","../../src/react/canvas/editor/editor-ids.ts","../../src/react/canvas/editor/editor-duplicate.ts","../../src/react/canvas/editor/editor-notices.ts","../../src/react/canvas/editor/editor-nodes.ts","../../src/react/canvas/editor/editor-utils.ts","../../src/react/canvas/editor/editor-constraints.ts","../../src/react/canvas/editor/editor-field-rules.ts","../../src/react/canvas/editor/editor-relations.ts","../../src/react/canvas/editor/editor-service-filter.ts","../../src/react/canvas/editor/editor-placement.ts","../../src/react/canvas/editor/editor-catalog.ts","../../src/react/canvas/selection.ts","../../src/react/canvas/api.ts","../../src/react/workspace/context/hooks/use-canvas.ts","../../src/react/workspace/context/hooks/use-errors.ts","../../src/react/workspace/context/provider/live/adapters/poll.ts","../../src/react/workspace/context/memory/ids.ts","../../src/react/workspace/context/memory/errors.ts","../../src/react/workspace/context/memory/time.ts","../../src/react/workspace/context/memory/store.ts","../../src/react/workspace/context/memory/persistence.ts","../../src/react/workspace/context/memory/memory-backend.ts","../../src/react/workspace/app.tsx","../../src/react/workspace/components/canvas.tsx","../../src/react/workspace/adapters/reactflow/adapter.ts","../../src/react/workspace/adapters/reactflow/toolbar.tsx","../../src/react/workspace/adapters/reactflow/toolbar/merge.ts","../../src/react/workspace/adapters/reactflow/toolbar/icons.tsx","../../src/react/workspace/components/reactflow/nodes/node.tsx","../../src/react/workspace/components/reactflow/nodes/tags.tsx","../../src/react/workspace/components/reactflow/nodes/field.tsx","../../src/react/workspace/components/reactflow/nodes/options.tsx","../../src/react/workspace/components/reactflow/index.tsx","../../src/react/workspace/components/index.tsx"],"sourcesContent":["// src/react/workspace/context/provider/context.ts\nimport * as React from \"react\";\nimport type { WorkspaceAPI, WorkspaceBootState } from \"./types\";\n\nexport const WorkspaceContext = React.createContext<WorkspaceAPI | null>(null);\n\nexport function useWorkspace(): WorkspaceAPI {\n const ctx = React.useContext(WorkspaceContext);\n if (!ctx) {\n throw new Error(\n \"useWorkspace() must be used under <WorkspaceProvider/>\",\n );\n }\n return ctx;\n}\n\nexport function useWorkspaceMaybe(): WorkspaceAPI | null {\n return React.useContext(WorkspaceContext);\n}\n\nexport function useWorkspaceBoot(): WorkspaceBootState {\n return useWorkspace().boot;\n}\n","// src/react/workspace/context/provider/provider.tsx\nimport * as React from \"react\";\nimport type {\n LiveOptions,\n MergeResult,\n Result,\n TemplatesListParams,\n} from \"@/react/workspace\";\nimport type { DgpServiceMap } from \"@/schema/provider\";\n\nimport { WorkspaceContext } from \"@/react/workspace\";\nimport type { WorkspaceAPI, WorkspaceProviderProps } from \"./types\";\nimport { LIVE_OFF } from \"./helpers\";\n\nimport { useBackendRuntime } from \"./runtime/use-backend-runtime\";\n\nimport { useAuthorsSlice } from \"./slices/use-authors-slice\";\nimport { usePermissionsSlice } from \"./slices/use-permissions-slice\";\nimport { useBranchesSlice } from \"./slices/use-branches-slice\";\nimport { useTemplatesSlice } from \"./slices/use-templates-slice\";\nimport { useServicesSlice } from \"./slices/use-services-slice\";\nimport { useSnapshotsSlice } from \"./slices/use-snapshots-slice\";\nimport { useCommentsSlice } from \"./slices/use-comments-slice\";\nimport { useBranchCache } from \"./compose/use-branch-cache\";\nimport { useLivePolling } from \"./compose/use-live-polling\";\nimport { usePoliciesSlice } from \"@/react/workspace/context/provider/slices/use-policies-slice\";\nimport { useWorkspaceBoot } from \"./compose/use-workspace-boot\";\n\n/* ---------------- provider (thin composition root) ---------------- */\n\nexport function WorkspaceProvider(\n props: WorkspaceProviderProps,\n): React.JSX.Element {\n const {\n backend,\n actor,\n initial,\n ensureMain = true,\n live: liveProp,\n autosaveMs = 9000,\n autoAutosave = true,\n children,\n liveAdapters,\n liveDebounceMs = 250,\n } = props;\n\n const runtime = useBackendRuntime();\n\n const workspaceId: string = backend.info.id;\n const live: LiveOptions = liveProp ?? LIVE_OFF;\n\n const authorsSlice = useAuthorsSlice({\n backend,\n workspaceId,\n initialAuthors: initial?.authors ?? null,\n runtime,\n });\n\n const permissionsSlice = usePermissionsSlice({\n backend,\n workspaceId,\n actor,\n initialPermissions: initial?.permissions ?? null,\n runtime,\n });\n\n const branchesSlice = useBranchesSlice({\n backend,\n workspaceId,\n ensureMain,\n initialBranches: initial?.branches ?? [],\n initialMainId: initial?.mainId,\n initialCurrentId: initial?.currentBranchId ?? initial?.mainId,\n initialParticipants: initial?.participants ?? null,\n runtime,\n });\n\n const getCurrentBranchId = React.useCallback(\n (): string | undefined => branchesSlice.branches.currentId,\n [branchesSlice.branches.currentId],\n );\n\n const templatesSlice = useTemplatesSlice({\n backend,\n workspaceId,\n getCurrentBranchId,\n initialTemplates: initial?.templates ?? null,\n runtime,\n });\n\n const servicesSlice = useServicesSlice({\n backend,\n workspaceId,\n initialServices: (initial?.services as DgpServiceMap | null) ?? null,\n runtime,\n });\n\n const snapshotsSlice = useSnapshotsSlice({\n backend,\n workspaceId,\n actor,\n getCurrentBranchId,\n initialSnapshot: initial?.snapshot\n ? {\n schema_version: initial.snapshot.schema_version,\n data: initial.snapshot.data as any,\n }\n : null,\n initialHead: initial?.head,\n initialDraft: initial?.draft,\n autosaveMs,\n autoAutosave,\n runtime,\n });\n\n const branchCache = useBranchCache(workspaceId);\n\n const comments = useCommentsSlice({\n backend: backend.comments,\n workspaceId,\n actorId: actor.id,\n getCurrentBranchId,\n initialThreads: initial?.comments,\n });\n\n const policiesSlice = usePoliciesSlice({\n backend,\n workspaceId,\n actorId: actor.id,\n getCurrentBranchId,\n initialPolicies: initial?.policies ?? null,\n runtime,\n });\n\n const bootCtl = useWorkspaceBoot({\n workspaceId,\n actorId: actor.id,\n preferredBranchId: initial?.currentBranchId ?? initial?.mainId,\n hasInitialData: Boolean(\n initial?.authors ||\n initial?.permissions ||\n initial?.branches ||\n initial?.templates ||\n initial?.participants ||\n initial?.services ||\n initial?.snapshot ||\n initial?.policies ||\n initial?.comments,\n ),\n runtime,\n getBranchesState: () => branchesSlice.branches.data,\n getCurrentBranchId,\n setCurrentBranchId: branchesSlice.setCurrentBranchId,\n refreshAuthors: authorsSlice.refreshAuthors,\n refreshPermissions: permissionsSlice.refreshPermissions,\n refreshBranches: branchesSlice.refreshBranches,\n refreshServices: servicesSlice.refreshServices as () => Promise<any>,\n refreshParticipants: (branchId: string) =>\n branchesSlice.refreshParticipants({ branchId }),\n refreshTemplates: (branchId: string) =>\n templatesSlice.refreshTemplates({ branchId }),\n refreshSnapshotPointers: (branchId: string) =>\n snapshotsSlice.refreshSnapshotPointersForBranch(branchId) as any,\n loadSnapshotBody: async (branchId: string) => {\n const res = await snapshotsSlice.loadSnapshotForBranch(branchId);\n if (!res.ok) {\n return res;\n }\n return { ok: true, value: undefined };\n },\n refreshPolicies: (branchId: string) =>\n policiesSlice.refreshPolicies({ branchId }),\n refreshComments: (branchId: string) =>\n comments.refreshThreads({ branchId }),\n });\n\n const hasAnyData: boolean = Boolean(\n (authorsSlice.authors.data && authorsSlice.authors.data.length) ||\n (branchesSlice.branches.data &&\n branchesSlice.branches.data.length) ||\n (templatesSlice.templates.data &&\n templatesSlice.templates.data.length) ||\n (branchesSlice.participants.data &&\n branchesSlice.participants.data.length) ||\n snapshotsSlice.snapshot.data,\n );\n\n const liveCtl = useLivePolling({\n live,\n workspaceId,\n actor,\n hasAnyData,\n getCurrentBranchId: () => branchesSlice.branches.currentId,\n refreshAll: bootCtl.refreshAll,\n refreshBranchContext: bootCtl.refreshBranchContext,\n refreshSnapshotPointers: bootCtl.refreshSnapshotPointers,\n adapters: liveAdapters,\n debounceMs: liveDebounceMs,\n });\n\n const currentBranchIdRef = React.useRef<string | undefined>(\n branchesSlice.branches.currentId,\n );\n const currentSnapshotRef = React.useRef(snapshotsSlice.snapshot);\n\n React.useEffect(() => {\n currentBranchIdRef.current = branchesSlice.branches.currentId;\n }, [branchesSlice.branches.currentId]);\n\n React.useEffect(() => {\n currentSnapshotRef.current = snapshotsSlice.snapshot;\n }, [snapshotsSlice.snapshot]);\n\n /* ---------------- branch ops ---------------- */\n\n const setCurrentBranch = React.useCallback(\n (id: string): void => {\n const prevId: string | undefined = branchesSlice.branches.currentId;\n\n branchCache.switchBranch({\n workspaceId,\n nextId: id,\n prevId,\n templates: templatesSlice.templates,\n participants: branchesSlice.participants,\n snapshot: snapshotsSlice.snapshot,\n setTemplates: templatesSlice.__setTemplatesState,\n setParticipants: branchesSlice.__setParticipantsState,\n setSnapshot: snapshotsSlice.__setSnapshotState,\n resetTemplates: templatesSlice.resetTemplatesForBranch,\n resetParticipants: () => {\n branchesSlice.__setParticipantsState((state) => ({\n ...state,\n data: null,\n error: undefined,\n }));\n },\n resetSnapshot: snapshotsSlice.resetSnapshotForBranch,\n setCurrentBranchId: branchesSlice.setCurrentBranchId,\n getCurrentBranchId: () => currentBranchIdRef.current,\n getCurrentSnapshot: () => currentSnapshotRef.current,\n });\n\n void bootCtl.refreshBranchContext({\n branchId: id,\n includeWorkspaceData: false,\n });\n },\n [\n branchesSlice.branches.currentId,\n branchesSlice.participants,\n branchesSlice.setCurrentBranchId,\n branchesSlice.__setParticipantsState,\n branchCache,\n bootCtl,\n snapshotsSlice.__setSnapshotState,\n snapshotsSlice.resetSnapshotForBranch,\n snapshotsSlice.snapshot,\n templatesSlice.__setTemplatesState,\n templatesSlice.resetTemplatesForBranch,\n templatesSlice.templates,\n workspaceId,\n ],\n );\n\n const createBranch = React.useCallback<WorkspaceAPI[\"createBranch\"]>(\n async (name: string, opts?: Readonly<{ fromId?: string }>) => {\n const res = await backend.branches.create(workspaceId, name, opts);\n if (res.ok) {\n await branchesSlice.refreshBranches();\n setCurrentBranch(res.value.id);\n }\n return res;\n },\n [backend.branches, branchesSlice, setCurrentBranch, workspaceId],\n );\n\n const setMain = React.useCallback<WorkspaceAPI[\"setMain\"]>(\n async (branchId: string) => {\n const res = await backend.branches.setMain(workspaceId, branchId);\n if (res.ok) {\n await branchesSlice.refreshBranches();\n }\n return res;\n },\n [backend.branches, branchesSlice, workspaceId],\n );\n\n const mergeBranch = React.useCallback<WorkspaceAPI[\"mergeBranch\"]>(\n async (sourceId: string, targetId: string): Result<MergeResult> => {\n const res = await backend.branches.merge(\n workspaceId,\n sourceId,\n targetId,\n );\n\n if (res.ok) {\n await runtime.runTasks(\n [\n async () => {\n await branchesSlice.refreshBranches();\n },\n async () => {\n await bootCtl.refreshBranchContext();\n },\n ],\n true,\n );\n }\n\n return res;\n },\n [backend.branches, bootCtl, branchesSlice, runtime, workspaceId],\n );\n\n const deleteBranch = React.useCallback<WorkspaceAPI[\"deleteBranch\"]>(\n async (branchId: string) => {\n const res = await backend.branches.delete(workspaceId, branchId);\n if (res.ok) {\n const refreshed = await branchesSlice.refreshBranches();\n\n if (\n refreshed.ok &&\n branchesSlice.branches.currentId === branchId\n ) {\n const fallback = refreshed.value.find(\n (branch) => branch.id !== branchId,\n )?.id;\n\n if (fallback) {\n setCurrentBranch(fallback);\n }\n }\n }\n return res;\n },\n [backend.branches, branchesSlice, setCurrentBranch, workspaceId],\n );\n\n /* ---------------- cache invalidation ---------------- */\n\n const invalidate = React.useCallback<WorkspaceAPI[\"invalidate\"]>(\n (keys) => {\n const setAll: boolean = !keys || keys.length === 0;\n\n if (setAll || keys?.includes(\"authors\")) {\n authorsSlice.invalidateAuthors();\n }\n if (setAll || keys?.includes(\"permissions\")) {\n permissionsSlice.invalidatePermissions();\n }\n if (setAll || keys?.includes(\"branches\")) {\n branchesSlice.invalidateBranches();\n }\n if (setAll || keys?.includes(\"services\")) {\n servicesSlice.invalidateServices();\n }\n\n if (setAll || keys?.includes(\"templates\")) {\n templatesSlice.invalidateTemplates();\n }\n if (setAll || keys?.includes(\"participants\")) {\n branchesSlice.invalidateParticipants();\n }\n\n if (\n setAll ||\n keys?.includes(\"templates\") ||\n keys?.includes(\"participants\") ||\n keys?.includes(\"snapshot\")\n ) {\n branchCache.clear();\n }\n\n if (setAll || keys?.includes(\"policies\")) {\n policiesSlice.invalidatePolicies();\n }\n },\n [\n authorsSlice,\n branchCache,\n branchesSlice,\n permissionsSlice,\n policiesSlice,\n servicesSlice,\n templatesSlice,\n ],\n );\n\n /* ---------------- memo API ---------------- */\n\n const api: WorkspaceAPI = React.useMemo<WorkspaceAPI>(\n () => ({\n info: backend.info,\n actor,\n boot: bootCtl.boot,\n\n authors: authorsSlice.authors,\n permissions: permissionsSlice.permissions,\n branches: branchesSlice.branches,\n\n templates: templatesSlice.templates,\n participants: branchesSlice.participants,\n services: servicesSlice.services,\n\n refresh: {\n all: bootCtl.refreshAll,\n authors: async () => {\n await authorsSlice.refreshAuthors();\n },\n permissions: async () => {\n await permissionsSlice.refreshPermissions();\n },\n branches: async () => {\n await branchesSlice.refreshBranches();\n },\n services: async () => {\n await servicesSlice.refreshServices();\n },\n branchContext: bootCtl.refreshBranchContext,\n templates: async (\n params?: Partial<\n Pick<TemplatesListParams, \"branchId\" | \"since\">\n >,\n ) => {\n await templatesSlice.refreshTemplates(params);\n },\n participants: async (\n params?: Partial<{\n branchId: string;\n since?: number | string;\n }>,\n ) => {\n await branchesSlice.refreshParticipants(params);\n },\n snapshotPointers: bootCtl.refreshSnapshotPointers,\n policies: async () => {\n await policiesSlice.refreshPolicies();\n },\n },\n\n setCurrentBranch,\n\n createBranch,\n setMain,\n mergeBranch,\n deleteBranch,\n\n createTemplate: templatesSlice.createTemplate,\n updateTemplate: templatesSlice.updateTemplate,\n cloneTemplate: templatesSlice.cloneTemplate,\n publishTemplate: templatesSlice.publishTemplate,\n unpublishTemplate: templatesSlice.unpublishTemplate,\n deleteTemplate: templatesSlice.deleteTemplate,\n\n invalidate,\n\n live: {\n connected: liveCtl.connected,\n lastEventAt: liveCtl.lastEventAt,\n connect: liveCtl.connect,\n disconnect: liveCtl.disconnect,\n },\n\n snapshot: {\n state: snapshotsSlice.snapshot.state,\n saving: snapshotsSlice.snapshot.saving,\n dirty: snapshotsSlice.snapshot.dirty,\n head: snapshotsSlice.snapshot.head,\n draft: snapshotsSlice.snapshot.draft,\n schemaVersion: snapshotsSlice.snapshot.schemaVersion,\n data: snapshotsSlice.snapshot.data,\n lastSavedAt: snapshotsSlice.snapshot.lastSavedAt,\n lastDraftAt: snapshotsSlice.snapshot.lastDraftAt,\n\n set: snapshotsSlice.setSnapshotData,\n load: snapshotsSlice.loadSnapshot,\n refresh: async () => {\n await snapshotsSlice.refreshSnapshotPointers();\n },\n\n autosave: snapshotsSlice.autosave,\n save: snapshotsSlice.save,\n publish: snapshotsSlice.publish,\n discardDraft: snapshotsSlice.discardDraft,\n },\n comments: {\n threads: comments.threads,\n refreshThreads: comments.refreshThreads,\n createThread: comments.createThread,\n addMessage: comments.addMessage,\n editMessage: comments.editMessage,\n deleteMessage: comments.deleteMessage,\n moveThread: comments.moveThread,\n resolveThread: comments.resolveThread,\n deleteThread: comments.deleteThread,\n },\n policies: policiesSlice,\n }),\n [\n actor,\n authorsSlice.authors,\n authorsSlice.refreshAuthors,\n backend.info,\n bootCtl,\n branchesSlice.branches,\n branchesSlice.participants,\n branchesSlice.refreshBranches,\n branchesSlice.refreshParticipants,\n comments,\n createBranch,\n deleteBranch,\n invalidate,\n liveCtl.connected,\n liveCtl.lastEventAt,\n mergeBranch,\n permissionsSlice.permissions,\n permissionsSlice.refreshPermissions,\n policiesSlice,\n servicesSlice.refreshServices,\n servicesSlice.services,\n setCurrentBranch,\n setMain,\n snapshotsSlice.autosave,\n snapshotsSlice.discardDraft,\n snapshotsSlice.loadSnapshot,\n snapshotsSlice.publish,\n snapshotsSlice.refreshSnapshotPointers,\n snapshotsSlice.save,\n snapshotsSlice.setSnapshotData,\n snapshotsSlice.snapshot,\n templatesSlice.createTemplate,\n templatesSlice.deleteTemplate,\n templatesSlice.publishTemplate,\n templatesSlice.refreshTemplates,\n templatesSlice.templates,\n templatesSlice.cloneTemplate,\n templatesSlice.unpublishTemplate,\n templatesSlice.updateTemplate,\n ],\n );\n\n return (\n <WorkspaceContext.Provider value={api}>\n {children}\n </WorkspaceContext.Provider>\n );\n}\n","// src/react/workspace/context/provider/helpers.ts\nimport type { BackendError, LiveOptions } from \"../backend\";\nimport type { DgpServiceCapability, DgpServiceMap } from \"@/schema/provider\";\nimport type { RunResult } from \"./types\";\n\n// Stable default — avoids a new object per render\nexport const LIVE_OFF: LiveOptions = Object.freeze({ mode: \"off\" as const });\n\nfunction isBackendErrorLike(e: unknown): e is BackendError {\n if (!e || typeof e !== \"object\") return false;\n const obj: Record<string, unknown> = e as Record<string, unknown>;\n return typeof obj.code === \"string\" && typeof obj.message === \"string\";\n}\n\nexport function toBackendError(e: unknown): BackendError {\n if (isBackendErrorLike(e)) return e;\n\n // Preserve real Error information (without assuming BackendError supports extra fields)\n if (e instanceof Error) {\n const name: string = e.name || \"Error\";\n const msg: string = e.message || String(e);\n return {\n code: \"runtime_error\",\n message: `${name}: ${msg}`,\n };\n }\n\n if (typeof e === \"string\") {\n return { code: \"unknown_error\", message: e };\n }\n\n try {\n return { code: \"unknown_error\", message: JSON.stringify(e) };\n } catch {\n return { code: \"unknown_error\", message: String(e ?? \"Unknown error\") };\n }\n}\n\n/**\n * Sequential task runner (ordering preserved).\n * - tolerant=true: collects errors and continues\n * - tolerant=false: throws on first failure\n */\nexport async function runTasks(\n tasks: Array<() => Promise<unknown>>,\n tolerant: boolean,\n): Promise<RunResult> {\n const errors: BackendError[] = [];\n for (const t of tasks) {\n try {\n await t();\n } catch (e) {\n if (!tolerant) throw e;\n errors.push(toBackendError(e));\n }\n }\n return errors.length ? { ok: false, errors } : { ok: true };\n}\n\n/**\n * Parallel task runner (ordering not guaranteed).\n * Kept separate so callers can choose intentionally.\n */\nexport async function runTasksParallel(\n tasks: Array<() => Promise<unknown>>,\n tolerant: boolean,\n): Promise<RunResult> {\n if (tasks.length === 0) return { ok: true };\n\n const results: Array<{ ok: true } | { ok: false; error: BackendError }> =\n await Promise.all(\n tasks.map(async (t) => {\n try {\n await t();\n return { ok: true } as const;\n } catch (e) {\n if (!tolerant) throw e;\n return { ok: false, error: toBackendError(e) } as const;\n }\n }),\n );\n\n const errors: BackendError[] = results\n .filter((r) => !r.ok)\n .map((r) => (r as { ok: false; error: BackendError }).error);\n\n return errors.length ? { ok: false, errors } : { ok: true };\n}\n\nexport function toServiceMap(\n input?: readonly DgpServiceCapability[] | DgpServiceMap | null,\n): DgpServiceMap | null {\n if (!input) return null;\n\n if (Array.isArray(input)) {\n const out: Record<string, DgpServiceCapability> = Object.create(null);\n for (const s of input) out[s.id] = s;\n return out as unknown as DgpServiceMap;\n }\n\n return input as DgpServiceMap;\n}\n","// src/react/workspace/context/provider/runtime/use-backend-runtime.ts\nimport * as React from \"react\";\nimport type { BackendError } from \"@/react/workspace\";\nimport type { RunResult } from \"../types\";\nimport {\n runTasks as runTasksBase,\n toBackendError as toBackendErrorBase,\n} from \"../helpers\";\n\nexport interface BackendRuntime {\n readonly now: () => number;\n readonly toBackendError: (e: unknown) => BackendError;\n readonly runTasks: (\n tasks: Array<() => Promise<unknown>>,\n tolerant: boolean,\n ) => Promise<RunResult>;\n}\n\nexport function useBackendRuntime(): BackendRuntime {\n const now = React.useCallback((): number => Date.now(), []);\n\n const toBackendError = React.useCallback(\n (e: unknown): BackendError => toBackendErrorBase(e),\n [],\n );\n\n const runTasks = React.useCallback(\n async (\n tasks: Array<() => Promise<unknown>>,\n tolerant: boolean,\n ): Promise<RunResult> => runTasksBase(tasks, tolerant),\n [],\n );\n\n return React.useMemo<BackendRuntime>(\n () => ({ now, toBackendError, runTasks }),\n [now, toBackendError, runTasks],\n );\n}\n","// src/react/workspace/context/provider/slices/use-authors-slice.ts\nimport * as React from \"react\";\nimport type {\n Author,\n BackendError,\n BackendResult,\n WorkspaceBackend,\n} from \"../../backend\";\nimport type { Loadable } from \"@/react/workspace\";\nimport type { BackendRuntime } from \"../runtime/use-backend-runtime\";\n\nexport interface AuthorsSliceApi {\n readonly authors: Loadable<readonly Author[]>;\n readonly refreshAuthors: () => Promise<BackendResult<readonly Author[]>>;\n readonly invalidateAuthors: () => void;\n}\n\nfunction setLoadableError<T>(\n updater: React.Dispatch<React.SetStateAction<Loadable<T>>>,\n error: BackendError,\n): void {\n updater((s) => ({ ...s, loading: false, error }));\n}\n\nexport interface UseAuthorsSliceParams {\n readonly backend: WorkspaceBackend;\n readonly workspaceId: string;\n readonly initialAuthors?: readonly Author[] | null;\n readonly runtime: BackendRuntime;\n}\n\nexport function useAuthorsSlice(\n params: UseAuthorsSliceParams,\n): AuthorsSliceApi {\n const { backend, workspaceId, initialAuthors, runtime } = params;\n\n const [authors, setAuthors] = React.useState<Loadable<readonly Author[]>>({\n data: initialAuthors ?? null,\n loading: false,\n updatedAt: initialAuthors ? runtime.now() : undefined,\n });\n\n const refreshAuthors = React.useCallback(async (): Promise<\n BackendResult<readonly Author[]>\n > => {\n setAuthors((s) => ({ ...s, loading: true }));\n const res = await backend.authors.refresh(workspaceId);\n\n if (res.ok) {\n setAuthors({\n data: res.value,\n loading: false,\n updatedAt: runtime.now(),\n });\n return res;\n } else {\n setLoadableError(setAuthors, res.error);\n return res;\n }\n }, [backend.authors, workspaceId, runtime]);\n\n const invalidateAuthors = React.useCallback((): void => {\n setAuthors((s) => ({ ...s, updatedAt: undefined }));\n }, []);\n\n return React.useMemo<AuthorsSliceApi>(\n () => ({ authors, refreshAuthors, invalidateAuthors }),\n [authors, refreshAuthors, invalidateAuthors],\n );\n}\n","// src/react/workspace/context/provider/slices/use-permissions-slice.ts\nimport * as React from \"react\";\nimport type {\n Actor,\n BackendError,\n BackendResult,\n PermissionsMap,\n WorkspaceBackend,\n} from \"../../backend\";\nimport type { Loadable } from \"@/react/workspace\";\nimport type { BackendRuntime } from \"../runtime/use-backend-runtime\";\n\nexport interface PermissionsSliceApi {\n readonly permissions: Loadable<PermissionsMap>;\n readonly refreshPermissions: () => Promise<BackendResult<PermissionsMap>>;\n readonly invalidatePermissions: () => void;\n}\n\nfunction setLoadableError<T>(\n updater: React.Dispatch<React.SetStateAction<Loadable<T>>>,\n error: BackendError,\n): void {\n updater((s) => ({ ...s, loading: false, error }));\n}\n\nexport interface UsePermissionsSliceParams {\n readonly backend: WorkspaceBackend;\n readonly workspaceId: string;\n readonly actor: Actor;\n readonly initialPermissions?: PermissionsMap | null;\n readonly runtime: BackendRuntime;\n}\n\nexport function usePermissionsSlice(\n params: UsePermissionsSliceParams,\n): PermissionsSliceApi {\n const { backend, workspaceId, actor, initialPermissions, runtime } = params;\n\n const [permissions, setPermissions] = React.useState<\n Loadable<PermissionsMap>\n >({\n data: initialPermissions ?? null,\n loading: false,\n updatedAt: initialPermissions ? runtime.now() : undefined,\n });\n\n const refreshPermissions = React.useCallback(async (): Promise<\n BackendResult<PermissionsMap>\n > => {\n setPermissions((s) => ({ ...s, loading: true }));\n const res = await backend.permissions.refresh(workspaceId, actor);\n\n if (res.ok) {\n setPermissions({\n data: res.value,\n loading: false,\n updatedAt: runtime.now(),\n });\n return res;\n } else {\n setLoadableError(setPermissions, res.error);\n return res;\n }\n }, [backend.permissions, workspaceId, actor, runtime]);\n\n const invalidatePermissions = React.useCallback((): void => {\n setPermissions((s) => ({ ...s, updatedAt: undefined }));\n }, []);\n\n return React.useMemo<PermissionsSliceApi>(\n () => ({ permissions, refreshPermissions, invalidatePermissions }),\n [permissions, refreshPermissions, invalidatePermissions],\n );\n}\n","// src/react/workspace/context/provider/slices/use-branches-slice.ts\nimport * as React from \"react\";\nimport type {\n BackendError,\n BackendResult,\n Branch,\n BranchParticipant,\n WorkspaceBackend,\n} from \"../../backend\";\nimport type { BranchesSlice, Loadable } from \"@/react/workspace\";\nimport type { BackendRuntime } from \"../runtime/use-backend-runtime\";\n\nexport interface BranchesSliceApi {\n readonly branches: BranchesSlice;\n readonly participants: Loadable<readonly BranchParticipant[]>;\n\n readonly setCurrentBranchId: (id: string) => void;\n\n readonly refreshBranches: () => Promise<BackendResult<readonly Branch[]>>;\n readonly refreshParticipants: (\n params?: Partial<{ branchId: string; since?: number | string }>,\n ) => Promise<BackendResult<readonly BranchParticipant[]>>;\n\n readonly invalidateBranches: () => void;\n readonly invalidateParticipants: () => void;\n\n /** internal setters for branch-cache composition */\n readonly __setParticipantsState: React.Dispatch<\n React.SetStateAction<Loadable<readonly BranchParticipant[]>>\n >;\n}\n\nfunction setLoadableError<T>(\n updater: React.Dispatch<React.SetStateAction<Loadable<T>>>,\n error: BackendError,\n): void {\n updater((s) => ({ ...s, loading: false, error }));\n}\n\nexport interface UseBranchesSliceParams {\n readonly backend: WorkspaceBackend;\n readonly workspaceId: string;\n\n readonly ensureMain: boolean;\n\n readonly initialBranches?: readonly Branch[];\n readonly initialMainId?: string;\n readonly initialCurrentId?: string;\n readonly initialParticipants?: readonly BranchParticipant[] | null;\n\n readonly runtime: BackendRuntime;\n}\n\nexport function useBranchesSlice(\n params: UseBranchesSliceParams,\n): BranchesSliceApi {\n const {\n backend,\n workspaceId,\n ensureMain,\n initialBranches,\n initialMainId,\n initialCurrentId,\n initialParticipants,\n runtime,\n } = params;\n\n const [branches, setBranches] = React.useState<BranchesSlice>({\n data: initialBranches ?? [],\n mainId: initialMainId,\n currentId: initialCurrentId ?? initialMainId,\n loading: false,\n updatedAt: initialBranches ? runtime.now() : undefined,\n });\n\n const [participants, setParticipants] = React.useState<\n Loadable<readonly BranchParticipant[]>\n >({\n data: initialParticipants ?? null,\n loading: false,\n updatedAt: initialParticipants ? runtime.now() : undefined,\n });\n\n // Ensure main branch pointer is stable (same behavior as old provider)\n React.useEffect((): void => {\n if (!ensureMain) return;\n if (branches.data.length === 0) return;\n\n const existingMain: string | undefined = branches.data.find(\n (b) => b.isMain,\n )?.id;\n\n if (existingMain && branches.mainId !== existingMain) {\n setBranches((s) => ({\n ...s,\n mainId: existingMain,\n currentId: s.currentId ?? existingMain,\n }));\n return;\n }\n\n if (!existingMain) {\n const first: string | undefined = branches.data[0]?.id;\n if (first && !branches.currentId) {\n setBranches((s) => ({ ...s, currentId: first }));\n }\n }\n }, [branches.data, branches.mainId, branches.currentId, ensureMain]);\n\n const setCurrentBranchId = React.useCallback((id: string): void => {\n setBranches((s) => ({ ...s, currentId: id }));\n }, []);\n\n const refreshBranches = React.useCallback(async (): Promise<\n BackendResult<readonly Branch[]>\n > => {\n setBranches((s) => ({ ...s, loading: true }));\n const res = await backend.branches.refresh(workspaceId);\n\n if (!res.ok) {\n setBranches((s) => ({ ...s, loading: false, error: res.error }));\n return res;\n }\n\n const data: readonly Branch[] = res.value;\n const main: string | undefined = data.find((b) => b.isMain)?.id;\n\n setBranches((s) => {\n const currentStillExists: boolean =\n Boolean(s.currentId) && data.some((b) => b.id === s.currentId);\n\n const nextCurrent: string | undefined = currentStillExists\n ? s.currentId\n : (main ?? data[0]?.id);\n\n return {\n data,\n mainId: main ?? s.mainId,\n currentId: nextCurrent,\n loading: false,\n updatedAt: runtime.now(),\n };\n });\n return res;\n }, [backend.branches, workspaceId, runtime]);\n\n const refreshParticipants = React.useCallback(\n async (\n params?: Partial<{ branchId: string; since?: number | string }>,\n ): Promise<BackendResult<readonly BranchParticipant[]>> => {\n const branchId: string | undefined =\n params?.branchId ?? branches.currentId;\n if (!branchId) {\n return {\n ok: false,\n error: {\n code: \"no_branch\",\n message: \"No current branch to load participants for.\",\n },\n };\n }\n\n setParticipants((s) => ({ ...s, loading: true }));\n\n const res = await backend.access.refreshParticipants(\n workspaceId,\n branchId,\n { since: params?.since ?? participants.updatedAt },\n );\n\n if (res.ok) {\n setParticipants({\n data: res.value,\n loading: false,\n updatedAt: runtime.now(),\n });\n return res;\n } else {\n setLoadableError(setParticipants, res.error);\n return res;\n }\n },\n [\n backend.access,\n workspaceId,\n branches.currentId,\n participants.updatedAt,\n runtime,\n ],\n );\n\n const invalidateBranches = React.useCallback((): void => {\n setBranches((s) => ({ ...s, updatedAt: undefined }));\n }, []);\n\n const invalidateParticipants = React.useCallback((): void => {\n setParticipants((s) => ({ ...s, updatedAt: undefined }));\n }, []);\n\n return React.useMemo<BranchesSliceApi>(\n () => ({\n branches,\n participants,\n setCurrentBranchId,\n refreshBranches,\n refreshParticipants,\n invalidateBranches,\n invalidateParticipants,\n __setParticipantsState: setParticipants,\n }),\n [\n branches,\n participants,\n setCurrentBranchId,\n refreshBranches,\n refreshParticipants,\n invalidateBranches,\n invalidateParticipants,\n ],\n );\n}\n","// src/react/workspace/context/provider/slices/use-templates-slice.ts\nimport * as React from \"react\";\nimport type {\n BackendError,\n BackendResult,\n FieldTemplate,\n TemplateCreateInput,\n TemplateUpdatePatch,\n TemplatesListParams,\n WorkspaceBackend,\n} from \"../../backend\";\nimport type { Loadable, WorkspaceAPI } from \"@/react/workspace\";\nimport type { BackendRuntime } from \"../runtime/use-backend-runtime\";\n\nexport interface TemplatesSliceApi {\n readonly templates: Loadable<readonly FieldTemplate[]>;\n\n readonly refreshTemplates: (\n params?: Partial<Pick<TemplatesListParams, \"branchId\" | \"since\">>,\n ) => Promise<BackendResult<readonly FieldTemplate[]>>;\n\n readonly createTemplate: WorkspaceAPI[\"createTemplate\"];\n readonly updateTemplate: WorkspaceAPI[\"updateTemplate\"];\n readonly cloneTemplate: WorkspaceAPI[\"cloneTemplate\"];\n readonly publishTemplate: WorkspaceAPI[\"publishTemplate\"];\n readonly unpublishTemplate: WorkspaceAPI[\"unpublishTemplate\"];\n readonly deleteTemplate: WorkspaceAPI[\"deleteTemplate\"];\n\n readonly invalidateTemplates: () => void;\n\n /** internal setters for branch-cache composition */\n readonly __setTemplatesState: React.Dispatch<\n React.SetStateAction<Loadable<readonly FieldTemplate[]>>\n >;\n\n readonly resetTemplatesForBranch: () => void;\n}\n\nfunction setLoadableError<T>(\n updater: React.Dispatch<React.SetStateAction<Loadable<T>>>,\n error: BackendError,\n): void {\n updater((s) => ({ ...s, loading: false, error }));\n}\n\nexport interface UseTemplatesSliceParams {\n readonly backend: WorkspaceBackend;\n readonly workspaceId: string;\n\n readonly getCurrentBranchId: () => string | undefined;\n\n readonly initialTemplates?: readonly FieldTemplate[] | null;\n\n readonly runtime: BackendRuntime;\n}\n\nexport function useTemplatesSlice(\n params: UseTemplatesSliceParams,\n): TemplatesSliceApi {\n const {\n backend,\n workspaceId,\n getCurrentBranchId,\n initialTemplates,\n runtime,\n } = params;\n\n const [templates, setTemplates] = React.useState<\n Loadable<readonly FieldTemplate[]>\n >({\n data: initialTemplates ?? null,\n loading: false,\n updatedAt: initialTemplates ? runtime.now() : undefined,\n });\n\n const refreshTemplates = React.useCallback(\n async (\n params?: Partial<Pick<TemplatesListParams, \"branchId\" | \"since\">>,\n ): Promise<BackendResult<readonly FieldTemplate[]>> => {\n const branchId: string | undefined =\n params?.branchId ?? getCurrentBranchId();\n if (!branchId) {\n return {\n ok: false,\n error: {\n code: \"no_branch\",\n message: \"No current branch to load templates for.\",\n },\n };\n }\n\n setTemplates((s) => ({ ...s, loading: true }));\n\n const res = await backend.templates.refresh({\n workspaceId,\n branchId,\n since: params?.since ?? templates.updatedAt,\n });\n\n if (res.ok) {\n setTemplates({\n data: res.value,\n loading: false,\n updatedAt: runtime.now(),\n });\n return res;\n } else {\n setLoadableError(setTemplates, res.error);\n return res;\n }\n },\n [\n backend.templates,\n workspaceId,\n getCurrentBranchId,\n templates.updatedAt,\n runtime,\n ],\n );\n\n const createTemplate = React.useCallback<WorkspaceAPI[\"createTemplate\"]>(\n async (input: TemplateCreateInput) => {\n const res = await backend.templates.create(workspaceId, {\n ...input,\n branchId: input.branchId ?? getCurrentBranchId(),\n });\n\n if (res.ok) {\n await refreshTemplates({\n branchId: res.value.branchId ?? getCurrentBranchId(),\n });\n }\n\n return res;\n },\n [backend.templates, workspaceId, getCurrentBranchId, refreshTemplates],\n );\n\n const updateTemplate = React.useCallback<WorkspaceAPI[\"updateTemplate\"]>(\n async (id: string, patch: TemplateUpdatePatch) => {\n const res = await backend.templates.update(id, patch);\n\n if (res.ok) {\n await refreshTemplates({\n branchId: res.value.branchId ?? getCurrentBranchId(),\n });\n }\n\n return res;\n },\n [backend.templates, getCurrentBranchId, refreshTemplates],\n );\n\n const cloneTemplate = React.useCallback<WorkspaceAPI[\"cloneTemplate\"]>(\n async (source, opts) => {\n const res = await backend.templates.clone(\n source,\n opts ?? { branchId: getCurrentBranchId() ?? undefined },\n );\n\n if (res.ok) {\n await refreshTemplates({\n branchId: res.value.branchId ?? getCurrentBranchId(),\n });\n }\n\n return res;\n },\n [backend.templates, getCurrentBranchId, refreshTemplates],\n );\n\n const publishTemplate = React.useCallback<WorkspaceAPI[\"publishTemplate\"]>(\n async (id: string) => {\n const res = await backend.templates.publish(id);\n if (res.ok) {\n await refreshTemplates({ branchId: getCurrentBranchId() });\n }\n return res;\n },\n [backend.templates, getCurrentBranchId, refreshTemplates],\n );\n\n const unpublishTemplate = React.useCallback<\n WorkspaceAPI[\"unpublishTemplate\"]\n >(\n async (id: string) => {\n const res = await backend.templates.unpublish(id);\n if (res.ok) {\n await refreshTemplates({ branchId: getCurrentBranchId() });\n }\n return res;\n },\n [backend.templates, getCurrentBranchId, refreshTemplates],\n );\n\n const deleteTemplate = React.useCallback<WorkspaceAPI[\"deleteTemplate\"]>(\n async (id: string) => {\n const res = await backend.templates.delete(id);\n if (res.ok) {\n await refreshTemplates({ branchId: getCurrentBranchId() });\n }\n return res;\n },\n [backend.templates, getCurrentBranchId, refreshTemplates],\n );\n\n const invalidateTemplates = React.useCallback((): void => {\n setTemplates((s) => ({ ...s, updatedAt: undefined }));\n }, []);\n\n const resetTemplatesForBranch = React.useCallback((): void => {\n setTemplates((s) => ({ ...s, data: null, error: undefined }));\n }, []);\n\n return React.useMemo<TemplatesSliceApi>(\n () => ({\n templates,\n refreshTemplates,\n createTemplate,\n updateTemplate,\n cloneTemplate,\n publishTemplate,\n unpublishTemplate,\n deleteTemplate,\n invalidateTemplates,\n __setTemplatesState: setTemplates,\n resetTemplatesForBranch,\n }),\n [\n templates,\n refreshTemplates,\n createTemplate,\n updateTemplate,\n cloneTemplate,\n publishTemplate,\n unpublishTemplate,\n deleteTemplate,\n invalidateTemplates,\n resetTemplatesForBranch,\n ],\n );\n}\n","// src/react/workspace/context/provider/slices/use-services-slice.ts\nimport * as React from \"react\";\nimport type {\n BackendError,\n BackendResult,\n WorkspaceBackend,\n} from \"../../backend\";\nimport type { DgpServiceMap } from \"@/schema\";\nimport type { Loadable } from \"@/react/workspace\";\nimport type { BackendRuntime } from \"../runtime/use-backend-runtime\";\nimport { toServiceMap } from \"../helpers\";\n\nexport interface ServicesSliceApi {\n readonly services: Loadable<DgpServiceMap>;\n readonly refreshServices: () => Promise<BackendResult<DgpServiceMap>>;\n readonly invalidateServices: () => void;\n}\n\nfunction setLoadableError<T>(\n updater: React.Dispatch<React.SetStateAction<Loadable<T>>>,\n error: BackendError,\n): void {\n updater((s) => ({ ...s, loading: false, error }));\n}\n\nexport interface UseServicesSliceParams {\n readonly backend: WorkspaceBackend;\n readonly workspaceId: string;\n readonly initialServices?: DgpServiceMap | null;\n readonly runtime: BackendRuntime;\n}\n\nexport function useServicesSlice(\n params: UseServicesSliceParams,\n): ServicesSliceApi {\n const { backend, workspaceId, initialServices, runtime } = params;\n\n const [services, setServices] = React.useState<Loadable<DgpServiceMap>>({\n data: initialServices ?? null,\n loading: false,\n updatedAt: initialServices ? runtime.now() : undefined,\n });\n\n const refreshServices = React.useCallback(async (): Promise<\n BackendResult<DgpServiceMap>\n > => {\n setServices((s) => ({ ...s, loading: true }));\n\n const res = await backend.services.refresh(workspaceId, {\n since: services.updatedAt,\n });\n\n if (!res.ok) {\n setLoadableError(setServices, res.error);\n return res;\n }\n\n const map: DgpServiceMap | null = toServiceMap(res.value);\n setServices({\n data: map ?? ({} as DgpServiceMap),\n loading: false,\n updatedAt: runtime.now(),\n });\n return { ok: true, value: map ?? ({} as DgpServiceMap) };\n }, [backend.services, workspaceId, services.updatedAt, runtime]);\n\n const invalidateServices = React.useCallback((): void => {\n setServices((s) => ({ ...s, updatedAt: undefined }));\n }, []);\n\n return React.useMemo<ServicesSliceApi>(\n () => ({ services, refreshServices, invalidateServices }),\n [services, refreshServices, invalidateServices],\n );\n}\n","// src/react/workspace/context/provider/slices/use-snapshots-slice.ts\nimport * as React from \"react\";\nimport type {\n Actor,\n BackendError,\n BackendResult,\n Commit,\n Draft,\n Result,\n SnapshotsLoadResult,\n WorkspaceBackend,\n} from \"../../backend\";\nimport type { EditorSnapshot } from \"@/schema\";\nimport type { SnapshotSlice, WorkspaceAPI } from \"@/react/workspace\";\nimport type { BackendRuntime } from \"../runtime/use-backend-runtime\";\n\nexport interface SnapshotsSliceApi {\n readonly snapshot: SnapshotSlice;\n\n readonly loadSnapshotForBranch: (\n branchId: string,\n params?: Readonly<{ versionId?: string }>,\n ) => Result<SnapshotsLoadResult>;\n\n readonly loadSnapshot: WorkspaceAPI[\"snapshot\"][\"load\"];\n readonly refreshSnapshotPointersForBranch: (\n branchId: string,\n ) => Promise<BackendResult<Readonly<{ head?: Commit; draft?: Draft }>>>;\n readonly refreshSnapshotPointers: () => Promise<\n BackendResult<Readonly<{ head?: Commit; draft?: Draft }>>\n >;\n\n readonly setSnapshotData: WorkspaceAPI[\"snapshot\"][\"set\"];\n readonly autosave: WorkspaceAPI[\"snapshot\"][\"autosave\"];\n readonly save: WorkspaceAPI[\"snapshot\"][\"save\"];\n readonly publish: WorkspaceAPI[\"snapshot\"][\"publish\"];\n readonly discardDraft: WorkspaceAPI[\"snapshot\"][\"discardDraft\"];\n\n /** internal setters for branch-cache composition */\n readonly __setSnapshotState: React.Dispatch<\n React.SetStateAction<SnapshotSlice>\n >;\n\n readonly resetSnapshotForBranch: () => void;\n}\n\nfunction setSnapshotError(error: BackendError): {\n ok: false;\n error: BackendError;\n} {\n return { ok: false, error };\n}\n\nfunction hasSnapshotProps(data: unknown): data is EditorSnapshot {\n if (!data || typeof data !== \"object\") return false;\n const props = (data as { props?: unknown }).props;\n return Boolean(props && typeof props === \"object\");\n}\n\nfunction hasUsableSnapshotPayload(input: {\n schemaVersion?: string;\n data?: unknown;\n}): boolean {\n return (\n typeof input.schemaVersion === \"string\" &&\n input.schemaVersion.length > 0 &&\n hasSnapshotProps(input.data)\n );\n}\n\nfunction createClearedSnapshotState(): SnapshotSlice {\n return {\n schemaVersion: undefined,\n data: undefined,\n head: undefined,\n draft: undefined,\n state: \"clean\",\n saving: false,\n dirty: false,\n lastSavedAt: undefined,\n lastDraftAt: undefined,\n };\n}\n\nfunction normalizeSnapshotState(input: {\n schemaVersion?: string;\n data?: unknown;\n head?: Commit;\n draft?: Draft;\n state?: SnapshotSlice[\"state\"];\n saving?: boolean;\n dirty?: boolean;\n lastSavedAt?: number;\n lastDraftAt?: number;\n}): SnapshotSlice {\n if (!hasUsableSnapshotPayload(input)) {\n return createClearedSnapshotState();\n }\n\n return {\n schemaVersion: input.schemaVersion,\n data: input.data as EditorSnapshot,\n head: input.head,\n draft: input.draft,\n state: input.state ?? (input.draft ? \"uncommitted\" : \"clean\"),\n saving: input.saving ?? false,\n dirty: input.dirty ?? false,\n lastSavedAt: input.lastSavedAt,\n lastDraftAt: input.lastDraftAt,\n };\n}\n\nexport interface UseSnapshotsSliceParams {\n readonly backend: WorkspaceBackend;\n readonly workspaceId: string;\n readonly actor: Actor;\n\n readonly getCurrentBranchId: () => string | undefined;\n\n readonly initialSnapshot?: {\n schema_version: string;\n data: EditorSnapshot;\n } | null;\n readonly initialHead?: Commit;\n readonly initialDraft?: Draft;\n\n readonly autosaveMs: number;\n readonly autoAutosave: boolean;\n\n readonly runtime: BackendRuntime;\n}\n\nexport function useSnapshotsSlice(\n params: UseSnapshotsSliceParams,\n): SnapshotsSliceApi {\n const {\n backend,\n workspaceId,\n actor,\n getCurrentBranchId,\n initialSnapshot,\n initialHead,\n initialDraft,\n autosaveMs,\n autoAutosave,\n runtime,\n } = params;\n\n const [snapshot, setSnapshot] = React.useState<SnapshotSlice>(() =>\n normalizeSnapshotState({\n schemaVersion: initialSnapshot?.schema_version,\n data: initialSnapshot?.data,\n head: initialHead,\n draft: initialDraft,\n state: initialDraft ? \"uncommitted\" : \"clean\",\n saving: false,\n dirty: false,\n }),\n );\n\n const autosaveTimerRef = React.useRef<number | null>(null);\n\n const loadSnapshotForBranch = React.useCallback(\n async (\n branchId: string,\n params?: Readonly<{ versionId?: string }>,\n ): Result<SnapshotsLoadResult> => {\n const res = await backend.snapshots.load({\n workspaceId,\n branchId,\n actorId: actor.id,\n versionId: params?.versionId,\n });\n\n if (res.ok) {\n const { head, draft, snapshot: snap } = res.value;\n setSnapshot(\n normalizeSnapshotState({\n schemaVersion: snap.schema_version,\n data: snap.data,\n head,\n draft,\n state: draft ? \"uncommitted\" : \"clean\",\n saving: false,\n dirty: false,\n lastSavedAt: undefined,\n lastDraftAt: undefined,\n }),\n );\n }\n\n return res;\n },\n [backend.snapshots, workspaceId, actor.id],\n );\n\n const loadSnapshot = React.useCallback<WorkspaceAPI[\"snapshot\"][\"load\"]>(\n async (params?: Readonly<{ versionId?: string }>) => {\n const branchId = getCurrentBranchId();\n if (!branchId) {\n return setSnapshotError({\n code: \"no_branch\",\n message: \"No current branch to load snapshot from.\",\n }) as unknown as Result<SnapshotsLoadResult>;\n }\n return loadSnapshotForBranch(branchId, params);\n },\n [getCurrentBranchId, loadSnapshotForBranch],\n );\n\n const setSnapshotData = React.useCallback<WorkspaceAPI[\"snapshot\"][\"set\"]>(\n (\n updater: (curr: EditorSnapshot | undefined) => EditorSnapshot,\n ): void => {\n setSnapshot((s) => ({\n ...s,\n data: updater(s.data),\n state: s.draft ? \"uncommitted\" : \"dirty\",\n dirty: true,\n }));\n },\n [],\n );\n\n const refreshSnapshotPointersForBranch = React.useCallback(\n async (\n branchId: string,\n ): Promise<\n BackendResult<Readonly<{ head?: Commit; draft?: Draft }>>\n > => {\n const res = await backend.snapshots.refresh({\n workspaceId,\n branchId,\n actorId: actor.id,\n since: snapshot.lastSavedAt ?? snapshot.lastDraftAt,\n });\n\n if (!res.ok) return res;\n\n setSnapshot((s) => ({\n ...s,\n head: res.value.head ?? s.head,\n draft: res.value.draft,\n state: res.value.draft\n ? \"uncommitted\"\n : s.dirty\n ? \"dirty\"\n : \"clean\",\n }));\n return res;\n },\n [\n backend.snapshots,\n workspaceId,\n actor.id,\n snapshot.lastSavedAt,\n snapshot.lastDraftAt,\n ],\n );\n\n const refreshSnapshotPointers = React.useCallback(async (): Promise<\n BackendResult<Readonly<{ head?: Commit; draft?: Draft }>>\n > => {\n const branchId = getCurrentBranchId();\n if (!branchId) {\n return {\n ok: false,\n error: {\n code: \"no_branch\",\n message:\n \"No current branch to refresh snapshot pointers for.\",\n },\n };\n }\n return refreshSnapshotPointersForBranch(branchId);\n }, [getCurrentBranchId, refreshSnapshotPointersForBranch]);\n\n const autosave = React.useCallback<\n WorkspaceAPI[\"snapshot\"][\"autosave\"]\n >(async () => {\n const branchId = getCurrentBranchId();\n if (!branchId) {\n return setSnapshotError({\n code: \"no_branch\",\n message: \"No current branch to autosave.\",\n }) as any;\n }\n\n if (!hasUsableSnapshotPayload(snapshot)) {\n return setSnapshotError({\n code: \"no_snapshot\",\n message: \"Nothing to autosave.\",\n }) as any;\n }\n const schemaVersion = snapshot.schemaVersion as string;\n const data = snapshot.data as EditorSnapshot;\n\n const res = await backend.snapshots.autosave({\n workspaceId,\n branchId,\n actorId: actor.id,\n snapshot: {\n schema_version: schemaVersion,\n data,\n },\n etag: snapshot.draft?.etag,\n });\n\n if (res.ok) {\n setSnapshot((s) => ({\n ...s,\n draft: res.value.draft,\n state: \"uncommitted\",\n dirty: false,\n lastDraftAt: runtime.now(),\n }));\n }\n\n return res;\n }, [\n backend.snapshots,\n workspaceId,\n actor.id,\n getCurrentBranchId,\n snapshot.data,\n snapshot.schemaVersion,\n snapshot.draft?.etag,\n runtime,\n ]);\n\n const save = React.useCallback<WorkspaceAPI[\"snapshot\"][\"save\"]>(\n async (message?: string) => {\n const branchId = getCurrentBranchId();\n if (!branchId) {\n return setSnapshotError({\n code: \"no_branch\",\n message: \"No current branch to save.\",\n }) as any;\n }\n\n if (!hasUsableSnapshotPayload(snapshot)) {\n return setSnapshotError({\n code: \"no_snapshot\",\n message: \"Nothing to save.\",\n }) as any;\n }\n const schemaVersion = snapshot.schemaVersion as string;\n const data = snapshot.data as EditorSnapshot;\n\n setSnapshot((s) => ({ ...s, state: \"saving\", saving: true }));\n\n const res = await backend.snapshots.save({\n workspaceId,\n branchId,\n actorId: actor.id,\n snapshot: {\n schema_version: schemaVersion,\n data,\n },\n message,\n draftId: snapshot.draft?.id,\n etag: snapshot.draft?.id\n ? snapshot.draft?.etag\n : snapshot.head?.etag,\n });\n\n if (res.ok) {\n const commit = res.value.commit;\n setSnapshot((s) => ({\n ...s,\n head: commit,\n draft: undefined,\n state: \"clean\",\n saving: false,\n dirty: false,\n lastSavedAt: runtime.now(),\n }));\n } else {\n setSnapshot((s) => ({\n ...s,\n state: s.draft ? \"uncommitted\" : \"dirty\",\n saving: false,\n }));\n }\n\n return res;\n },\n [\n backend.snapshots,\n workspaceId,\n actor.id,\n getCurrentBranchId,\n snapshot.data,\n snapshot.schemaVersion,\n snapshot.draft?.id,\n snapshot.head?.etag,\n runtime,\n ],\n );\n\n const publish = React.useCallback<WorkspaceAPI[\"snapshot\"][\"publish\"]>(\n async (message?: string) => {\n const draftId = snapshot.draft?.id;\n if (!draftId) return save(message);\n\n const res = await backend.snapshots.publish({\n workspaceId,\n actorId: actor.id,\n draftId,\n message,\n });\n\n if (res.ok) {\n const commit = res.value.commit;\n setSnapshot((s) => ({\n ...s,\n head: commit,\n draft: undefined,\n state: \"clean\",\n saving: false,\n dirty: false,\n lastSavedAt: runtime.now(),\n }));\n }\n\n return res;\n },\n [\n backend.snapshots,\n workspaceId,\n actor.id,\n snapshot.draft?.id,\n save,\n runtime,\n ],\n );\n\n const discardDraft = React.useCallback<\n WorkspaceAPI[\"snapshot\"][\"discardDraft\"]\n >(async () => {\n const draftId = snapshot.draft?.id;\n if (!draftId) return { ok: true, value: undefined } as const;\n\n const res = await backend.snapshots.discard({\n workspaceId,\n actorId: actor.id,\n draftId,\n });\n\n if (res.ok) {\n setSnapshot((s) => ({\n ...s,\n draft: undefined,\n state: s.dirty ? \"dirty\" : \"clean\",\n }));\n }\n\n return res;\n }, [backend.snapshots, workspaceId, actor.id, snapshot.draft?.id]);\n\n // Autosave effect (same behavior as old provider)\n React.useEffect((): (() => void) | void => {\n if (!autoAutosave || !snapshot.dirty) return;\n\n if (autosaveTimerRef.current) {\n window.clearTimeout(autosaveTimerRef.current);\n autosaveTimerRef.current = null;\n }\n\n autosaveTimerRef.current = window.setTimeout(() => {\n void autosave();\n autosaveTimerRef.current = null;\n }, autosaveMs) as unknown as number;\n\n return (): void => {\n if (autosaveTimerRef.current) {\n window.clearTimeout(autosaveTimerRef.current);\n autosaveTimerRef.current = null;\n }\n };\n }, [snapshot.dirty, autosaveMs, autoAutosave, autosave]);\n\n const resetSnapshotForBranch = React.useCallback((): void => {\n setSnapshot(createClearedSnapshotState());\n }, []);\n\n const setSnapshotStateSafe = React.useCallback<\n React.Dispatch<React.SetStateAction<SnapshotSlice>>\n >((updater) => {\n setSnapshot((current) => {\n const next =\n typeof updater === \"function\"\n ? (updater as (prev: SnapshotSlice) => SnapshotSlice)(\n current,\n )\n : updater;\n\n return normalizeSnapshotState({\n schemaVersion: next.schemaVersion,\n data: next.data,\n head: next.head,\n draft: next.draft,\n state: next.state,\n saving: next.saving,\n dirty: next.dirty,\n lastSavedAt: next.lastSavedAt,\n lastDraftAt: next.lastDraftAt,\n });\n });\n }, []);\n\n return React.useMemo<SnapshotsSliceApi>(\n () => ({\n snapshot,\n loadSnapshotForBranch,\n loadSnapshot,\n refreshSnapshotPointersForBranch,\n refreshSnapshotPointers,\n setSnapshotData,\n autosave,\n save,\n publish,\n discardDraft,\n __setSnapshotState: setSnapshotStateSafe,\n resetSnapshotForBranch,\n }),\n [\n snapshot,\n loadSnapshotForBranch,\n loadSnapshot,\n refreshSnapshotPointersForBranch,\n refreshSnapshotPointers,\n setSnapshotData,\n autosave,\n save,\n publish,\n discardDraft,\n resetSnapshotForBranch,\n setSnapshotStateSafe,\n ],\n );\n}\n","// src/react/workspace/context/provider/slices/use-comments-slice.ts\n\nimport * as React from \"react\";\n\nimport type {\n BackendError,\n BackendResult,\n BackendScope,\n Result,\n WorkspaceBackend,\n} from \"../../backend\";\nimport type { Loadable } from \"@/react/workspace\";\n\nimport type {\n CommentAnchor,\n CommentMessage,\n CommentThread,\n} from \"@/schema/comments\";\n\nexport interface CommentsSliceApi {\n readonly threads: Loadable<readonly CommentThread[]>;\n\n readonly refreshThreads: (\n params?: Readonly<{ branchId?: string }>,\n ) => Promise<BackendResult<readonly CommentThread[]>>;\n\n readonly createThread: (\n input: Readonly<{\n anchor?: CommentAnchor;\n body: string;\n meta?: Readonly<Record<string, unknown>>;\n branchId?: string;\n }>,\n ) => Result<CommentThread>;\n\n readonly addMessage: (\n input: Readonly<{\n threadId: string;\n body: string;\n meta?: Readonly<Record<string, unknown>>;\n branchId?: string;\n }>,\n ) => Result<CommentMessage>;\n\n readonly editMessage: (\n input: Readonly<{\n threadId: string;\n messageId: string;\n body: string;\n branchId?: string;\n }>,\n ) => Result<CommentMessage>;\n\n readonly deleteMessage: (\n input: Readonly<{\n threadId: string;\n messageId: string;\n branchId?: string;\n }>,\n ) => Result<void>;\n\n readonly moveThread: (\n input: Readonly<{\n threadId: string;\n anchor: CommentAnchor;\n branchId?: string;\n }>,\n ) => Result<CommentThread>;\n\n readonly resolveThread: (\n input: Readonly<{\n threadId: string;\n resolved: boolean;\n branchId?: string;\n }>,\n ) => Result<CommentThread>;\n\n readonly deleteThread: (\n input: Readonly<{\n threadId: string;\n branchId?: string;\n }>,\n ) => Result<void>;\n}\n\nexport interface UseCommentsSliceParams {\n readonly actorId: string;\n readonly workspaceId: string;\n\n /** backend.comments */\n readonly backend: WorkspaceBackend[\"comments\"];\n\n /** Current branch resolver (provider owns currentId) */\n readonly getCurrentBranchId: () => string | undefined;\n\n /** Optional initial preload */\n readonly initialThreads?: readonly CommentThread[] | null;\n}\n\nfunction missingScopeError<T>(): Result<T> {\n return Promise.resolve({\n ok: false,\n error: {\n code: \"missing_scope\",\n message:\n \"Workspace comments require workspaceId, actorId, and branchId.\",\n },\n });\n}\n\nfunction setLoadableError<T>(\n set: React.Dispatch<React.SetStateAction<Loadable<T>>>,\n err: BackendError,\n): void {\n set((s: Loadable<T>) => ({ ...s, loading: false, error: err }));\n}\n\nexport function useCommentsSlice(\n params: UseCommentsSliceParams,\n): CommentsSliceApi {\n const {\n backend,\n workspaceId,\n actorId,\n getCurrentBranchId,\n initialThreads,\n } = params;\n\n const now = (): number => Date.now();\n\n const [threads, setThreads] = React.useState<\n Loadable<readonly CommentThread[]>\n >({\n data: initialThreads ?? null,\n loading: false,\n updatedAt: initialThreads ? now() : undefined,\n });\n\n const resolveScope = React.useCallback(\n (branchId?: string): BackendScope | null => {\n const bid: string | undefined = branchId ?? getCurrentBranchId();\n if (!workspaceId || !actorId || !bid) return null;\n return { workspaceId, actorId, branchId: bid };\n },\n [workspaceId, actorId, getCurrentBranchId],\n );\n\n const refreshThreads = React.useCallback(\n async (\n p?: Readonly<{ branchId?: string }>,\n ): Promise<BackendResult<readonly CommentThread[]>> => {\n const scope: BackendScope | null = resolveScope(p?.branchId);\n if (!scope) {\n return {\n ok: false,\n error: {\n code: \"missing_scope\",\n message:\n \"Workspace comments require workspaceId, actorId, and branchId.\",\n },\n };\n }\n\n setThreads((s) => ({ ...s, loading: true }));\n const res = await backend.listThreads(scope);\n\n if (res.ok) {\n setThreads({\n data: res.value as readonly CommentThread[],\n loading: false,\n updatedAt: now(),\n });\n return res as BackendResult<readonly CommentThread[]>;\n } else {\n setLoadableError(setThreads, res.error);\n return res as BackendResult<readonly CommentThread[]>;\n }\n },\n [backend, resolveScope],\n );\n\n const createThread = React.useCallback(\n async (\n input: Readonly<{\n anchor?: CommentAnchor;\n body: string;\n meta?: Readonly<Record<string, unknown>>;\n branchId?: string;\n }>,\n ): Result<CommentThread> => {\n const scope: BackendScope | null = resolveScope(input.branchId);\n if (!scope) return missingScopeError<CommentThread>();\n\n const res = await backend.createThread(scope, {\n anchor: input.anchor,\n body: input.body,\n meta: input.meta ? { ...input.meta } : undefined,\n });\n\n if (res.ok) {\n setThreads((s) => {\n const prev: readonly CommentThread[] = s.data ?? [];\n return {\n ...s,\n data: [res.value as CommentThread, ...prev],\n loading: false,\n updatedAt: now(),\n };\n });\n }\n\n return res as unknown as Result<CommentThread>;\n },\n [backend, resolveScope],\n );\n\n const addMessage = React.useCallback(\n async (\n input: Readonly<{\n threadId: string;\n body: string;\n meta?: Readonly<Record<string, unknown>>;\n branchId?: string;\n }>,\n ): Result<CommentMessage> => {\n const scope: BackendScope | null = resolveScope(input.branchId);\n if (!scope) return missingScopeError<CommentMessage>();\n\n const res = await backend.addMessage(scope, {\n threadId: input.threadId,\n body: input.body,\n meta: input.meta ? { ...input.meta } : undefined,\n });\n\n if (res.ok) {\n const msg: CommentMessage = res.value as CommentMessage;\n\n setThreads((s) => {\n if (!s.data) return s;\n\n const next: readonly CommentThread[] = s.data.map((t) => {\n if (t.id !== input.threadId) return t;\n const msgs: readonly CommentMessage[] = (t.messages ??\n []) as readonly CommentMessage[];\n return { ...t, messages: [...msgs, msg] };\n });\n\n return { ...s, data: next, updatedAt: now() };\n });\n }\n\n return res as unknown as Result<CommentMessage>;\n },\n [backend, resolveScope],\n );\n\n const editMessage = React.useCallback(\n async (\n input: Readonly<{\n threadId: string;\n messageId: string;\n body: string;\n branchId?: string;\n }>,\n ): Result<CommentMessage> => {\n const scope: BackendScope | null = resolveScope(input.branchId);\n if (!scope) return missingScopeError<CommentMessage>();\n\n const res = await backend.editMessage(scope, {\n threadId: input.threadId,\n messageId: input.messageId,\n body: input.body,\n });\n\n if (res.ok) {\n const msg: CommentMessage = res.value as CommentMessage;\n\n setThreads((s) => {\n if (!s.data) return s;\n const next: readonly CommentThread[] = s.data.map((t) => {\n if (t.id !== input.threadId) return t;\n const msgs: readonly CommentMessage[] = (t.messages ??\n []) as readonly CommentMessage[];\n const updated: readonly CommentMessage[] = msgs.map(\n (m) => (m.id === input.messageId ? msg : m),\n );\n return { ...t, messages: updated } as CommentThread;\n });\n\n return { ...s, data: next, updatedAt: now() };\n });\n }\n\n return res as unknown as Result<CommentMessage>;\n },\n [backend, resolveScope],\n );\n\n const deleteMessage = React.useCallback(\n async (\n input: Readonly<{\n threadId: string;\n messageId: string;\n branchId?: string;\n }>,\n ): Result<void> => {\n const scope: BackendScope | null = resolveScope(input.branchId);\n if (!scope) return missingScopeError<void>();\n\n const res = await backend.deleteMessage(scope, {\n threadId: input.threadId,\n messageId: input.messageId,\n });\n\n if (res.ok) {\n setThreads((s) => {\n if (!s.data) return s;\n\n const next: readonly CommentThread[] = s.data.map((t) => {\n if (t.id !== input.threadId) return t;\n const msgs: readonly CommentMessage[] = (t.messages ??\n []) as readonly CommentMessage[];\n return {\n ...t,\n messages: msgs.filter(\n (m) => m.id !== input.messageId,\n ),\n };\n });\n\n return { ...s, data: next, updatedAt: now() };\n });\n }\n\n return res as unknown as Result<void>;\n },\n [backend, resolveScope],\n );\n\n const updateThread = React.useCallback((thread: CommentThread) => {\n setThreads((s) => {\n if (!s.data) return s;\n return {\n ...s,\n data: s.data.map((t) => (t.id === thread.id ? thread : t)),\n updatedAt: now(),\n };\n });\n }, []);\n\n const moveThread = React.useCallback(\n async (\n input: Readonly<{\n threadId: string;\n anchor: CommentAnchor;\n branchId?: string;\n }>,\n ): Result<CommentThread> => {\n const scope: BackendScope | null = resolveScope(input.branchId);\n if (!scope) return missingScopeError<CommentThread>();\n\n const res = await backend.moveThread(scope, {\n threadId: input.threadId,\n anchor: input.anchor,\n });\n\n if (res.ok) {\n updateThread(res.value as CommentThread);\n }\n\n return res as unknown as Result<CommentThread>;\n },\n [backend, resolveScope, updateThread],\n );\n\n const resolveThread = React.useCallback(\n async (\n input: Readonly<{\n threadId: string;\n resolved: boolean;\n branchId?: string;\n }>,\n ): Result<CommentThread> => {\n const scope: BackendScope | null = resolveScope(input.branchId);\n if (!scope) return missingScopeError<CommentThread>();\n\n const res = await backend.resolveThread(scope, {\n threadId: input.threadId,\n resolved: input.resolved,\n });\n\n if (res.ok) {\n updateThread(res.value as CommentThread);\n }\n\n return res as unknown as Result<CommentThread>;\n },\n [backend, resolveScope, updateThread],\n );\n\n const deleteThread = React.useCallback(\n async (\n input: Readonly<{\n threadId: string;\n branchId?: string;\n }>,\n ): Result<void> => {\n const scope: BackendScope | null = resolveScope(input.branchId);\n if (!scope) return missingScopeError<void>();\n\n const res = await backend.deleteThread(scope, {\n threadId: input.threadId,\n });\n\n if (res.ok) {\n setThreads((s) => {\n if (!s.data) return s;\n return {\n ...s,\n data: s.data.filter((t) => t.id !== input.threadId),\n updatedAt: now(),\n };\n });\n }\n\n return res as unknown as Result<void>;\n },\n [backend, resolveScope],\n );\n\n return React.useMemo(\n () => ({\n threads,\n refreshThreads,\n createThread,\n addMessage,\n editMessage,\n deleteMessage,\n moveThread,\n resolveThread,\n deleteThread,\n }),\n [\n threads,\n refreshThreads,\n createThread,\n addMessage,\n editMessage,\n deleteMessage,\n moveThread,\n resolveThread,\n deleteThread,\n ],\n );\n}\n","// src/react/workspace/context/provider/compose/use-branch-cache.ts\nimport * as React from \"react\";\nimport type { BranchCacheEntry, Loadable, SnapshotSlice } from \"../types\";\nimport type { FieldTemplate, BranchParticipant } from \"../../backend\";\n\nimport { createCache, createIndexedDBDriver } from \"@timeax/cache-store\";\nimport type { CacheStore } from \"@timeax/cache-store\";\n\nexport interface BranchCacheApi {\n /**\n * Clear cached branch scopes for THIS workspace.\n */\n readonly clear: () => void;\n\n readonly switchBranch: (\n args: Readonly<{\n /**\n * Redundant on purpose: call-sites must pass workspaceId explicitly,\n * and the hook is also workspace-scoped.\n *\n * This allows us to detect wiring bugs (mismatched workspace scopes).\n */\n workspaceId: string;\n\n nextId: string;\n prevId?: string;\n\n templates: Loadable<readonly FieldTemplate[]>;\n participants: Loadable<readonly BranchParticipant[]>;\n snapshot: SnapshotSlice;\n\n setTemplates: React.Dispatch<\n React.SetStateAction<Loadable<readonly FieldTemplate[]>>\n >;\n setParticipants: React.Dispatch<\n React.SetStateAction<Loadable<readonly BranchParticipant[]>>\n >;\n setSnapshot: React.Dispatch<React.SetStateAction<SnapshotSlice>>;\n\n resetTemplates: () => void;\n resetParticipants: () => void;\n resetSnapshot: () => void;\n\n setCurrentBranchId: (id: string) => void;\n getCurrentBranchId: () => string | undefined;\n getCurrentSnapshot: () => SnapshotSlice;\n }>,\n ) => void;\n}\n\nconst DB_NAME = \"dgp-cache\";\nconst STORE_NAME = \"kv\";\nconst NS = \"workspace\";\n\n// Key scheme (per workspace):\n// ws:<workspaceId>:branch:<branchId>\nconst WS_PREFIX = \"ws:\";\nconst keyOf = (workspaceId: string, branchId: string): string =>\n `${WS_PREFIX}${workspaceId}:branch:${branchId}`;\n\nconst branchPrefixOf = (workspaceId: string): string =>\n `${WS_PREFIX}${workspaceId}:branch:`;\n\ntype PendingSwitch = Readonly<{\n token: number;\n workspaceId: string;\n nextId: string;\n\n getCurrentBranchId: () => string | undefined;\n getCurrentSnapshot: () => SnapshotSlice;\n\n setTemplates: React.Dispatch<\n React.SetStateAction<Loadable<readonly FieldTemplate[]>>\n >;\n setParticipants: React.Dispatch<\n React.SetStateAction<Loadable<readonly BranchParticipant[]>>\n >;\n setSnapshot: React.Dispatch<React.SetStateAction<SnapshotSlice>>;\n}>;\n\nfunction hasSnapshotProps(data: unknown): boolean {\n if (!data || typeof data !== \"object\") return false;\n const props = (data as { props?: unknown }).props;\n return Boolean(props && typeof props === \"object\");\n}\n\nfunction hasUsableSnapshot(slice?: SnapshotSlice): boolean {\n return Boolean(\n slice &&\n typeof slice.schemaVersion === \"string\" &&\n slice.schemaVersion.length > 0 &&\n hasSnapshotProps(slice.data),\n );\n}\n\nexport function useBranchCache(workspaceId: string): BranchCacheApi {\n // IndexedDB-backed cache instance (scoped by ns + key prefixing).\n const cache: CacheStore = React.useMemo(() => {\n return createCache({\n driver: createIndexedDBDriver({\n dbName: DB_NAME,\n storeName: STORE_NAME,\n ns: NS,\n }),\n hydrate: true,\n cleanupExpiredOnHydrate: true,\n });\n }, []);\n\n const wsIdRef = React.useRef<string>(workspaceId);\n React.useEffect(() => {\n wsIdRef.current = workspaceId;\n }, [workspaceId]);\n\n // IDB hydration is async. We keep it internal to preserve the hook API.\n const readyRef = React.useRef<boolean>(cache.isReady());\n const switchTokenRef = React.useRef(0);\n\n // If switchBranch runs before hydration completes, defer the cache-apply decision.\n const pendingRef = React.useRef<PendingSwitch | null>(null);\n\n const applyPendingCacheIfSafe = React.useCallback(\n (p: PendingSwitch): void => {\n if (p.token !== switchTokenRef.current) return;\n if (p.getCurrentBranchId() !== p.nextId) return;\n if (hasUsableSnapshot(p.getCurrentSnapshot())) return;\n\n const cached = cache.get<BranchCacheEntry>(\n keyOf(p.workspaceId, p.nextId),\n );\n if (!cached) return;\n\n p.setTemplates(cached.templates);\n p.setParticipants(cached.participants);\n\n if (hasUsableSnapshot(cached.snapshot)) {\n p.setSnapshot(cached.snapshot);\n }\n },\n [cache],\n );\n\n React.useEffect(() => {\n if (cache.isReady()) {\n readyRef.current = true;\n return;\n }\n\n const unsub = cache.subscribeReady(() => {\n readyRef.current = true;\n\n const p = pendingRef.current;\n if (!p) return;\n\n applyPendingCacheIfSafe(p);\n pendingRef.current = null;\n });\n\n return () => unsub();\n }, [cache, applyPendingCacheIfSafe]);\n\n const clear = React.useCallback((): void => {\n switchTokenRef.current += 1;\n pendingRef.current = null;\n\n // Clear ONLY this workspace scope.\n cache.clear(branchPrefixOf(wsIdRef.current));\n }, [cache]);\n\n const switchBranch = React.useCallback(\n (\n args: Readonly<{\n workspaceId: string;\n\n nextId: string;\n prevId?: string;\n\n templates: Loadable<readonly FieldTemplate[]>;\n participants: Loadable<readonly BranchParticipant[]>;\n snapshot: SnapshotSlice;\n\n setTemplates: React.Dispatch<\n React.SetStateAction<Loadable<readonly FieldTemplate[]>>\n >;\n setParticipants: React.Dispatch<\n React.SetStateAction<Loadable<readonly BranchParticipant[]>>\n >;\n setSnapshot: React.Dispatch<\n React.SetStateAction<SnapshotSlice>\n >;\n\n resetTemplates: () => void;\n resetParticipants: () => void;\n resetSnapshot: () => void;\n\n setCurrentBranchId: (id: string) => void;\n getCurrentBranchId: () => string | undefined;\n getCurrentSnapshot: () => SnapshotSlice;\n }>,\n ): void => {\n const token = switchTokenRef.current + 1;\n switchTokenRef.current = token;\n\n const hookWsId: string = wsIdRef.current;\n const callWsId: string = args.workspaceId;\n\n // Redundant-by-design safety check (catch wiring mistakes).\n if (callWsId !== hookWsId) {\n // Keep it non-fatal (warn) to avoid breaking UX in production.\n // eslint-disable-next-line no-console\n console.warn(\n `[useBranchCache] workspaceId mismatch: hook=\"${hookWsId}\" vs switchBranch=\"${callWsId}\". Using switchBranch workspaceId.`,\n );\n }\n\n const wsId: string = callWsId;\n const prevId: string | undefined = args.prevId;\n\n // Cache previous branch scope (per workspace).\n if (prevId && prevId !== args.nextId) {\n cache.set<BranchCacheEntry>(keyOf(wsId, prevId), {\n templates: args.templates,\n participants: args.participants,\n snapshot: args.snapshot,\n });\n }\n\n // Try to read cached next branch from mirror (may be empty before hydration).\n const cached = cache.get<BranchCacheEntry>(\n keyOf(wsId, args.nextId),\n );\n const cachedSnapshot = hasUsableSnapshot(cached?.snapshot)\n ? cached!.snapshot\n : undefined;\n\n if (cached) {\n args.setTemplates(cached.templates);\n args.setParticipants(cached.participants);\n } else {\n args.resetTemplates();\n args.resetParticipants();\n }\n\n if (cachedSnapshot) {\n args.setSnapshot(cachedSnapshot);\n } else {\n args.resetSnapshot();\n }\n\n args.setCurrentBranchId(args.nextId);\n\n // If not hydrated yet, defer the no-cache => load decision because hydration\n // might still reveal a valid cached snapshot for this workspace+branch.\n if (!readyRef.current && !cachedSnapshot) {\n pendingRef.current = {\n token,\n workspaceId: wsId,\n nextId: args.nextId,\n getCurrentBranchId: args.getCurrentBranchId,\n getCurrentSnapshot: args.getCurrentSnapshot,\n setTemplates: args.setTemplates,\n setParticipants: args.setParticipants,\n setSnapshot: args.setSnapshot,\n };\n return;\n }\n\n pendingRef.current = null;\n },\n [cache],\n );\n\n return React.useMemo<BranchCacheApi>(\n () => ({ clear, switchBranch }),\n [clear, switchBranch],\n );\n}\n","// src/react/workspace/context/provider/compose/use-live-polling.ts\nimport * as React from \"react\";\nimport type { Actor, BackendError, LiveOptions } from \"../../backend\";\nimport type { RunResult } from \"../types\";\nimport type {\n WorkspaceLiveAdapter,\n WorkspaceLiveAdapterContext,\n WorkspaceLiveAdapterRegistry,\n WorkspaceLiveStatus,\n WorkspaceLiveTick,\n} from \"../live/types\";\nimport { createPollAdapter } from \"@/react/workspace\";\n\nexport interface LiveControl {\n readonly connected: boolean;\n readonly lastEventAt?: number;\n readonly lastError?: BackendError;\n readonly connect: () => void;\n readonly disconnect: () => void;\n}\n\nexport interface UseLivePollingParams {\n readonly live: LiveOptions;\n readonly workspaceId: string;\n readonly actor: Actor;\n\n readonly hasAnyData: boolean;\n\n readonly getCurrentBranchId: () => string | undefined;\n\n readonly refreshAll: (opts?: { strict?: boolean }) => Promise<RunResult>;\n readonly refreshBranchContext?: () => Promise<void>;\n readonly refreshSnapshotPointers?: () => Promise<void>;\n\n /**\n * Host can provide adapters for modes like \"ws\" / \"sse\"\n * (and even custom strings later).\n */\n readonly adapters?: WorkspaceLiveAdapterRegistry;\n\n /**\n * Simple debounce to avoid refresh storms (WS bursts etc).\n * Default: 250ms\n */\n readonly debounceMs?: number;\n}\n\nfunction toError(e: unknown): BackendError {\n if (\n typeof e === \"object\" &&\n e &&\n \"code\" in (e as Record<string, unknown>) &&\n \"message\" in (e as Record<string, unknown>)\n ) {\n return e as BackendError;\n }\n if (e instanceof Error) {\n return { code: \"runtime_error\", message: `${e.name}: ${e.message}` };\n }\n return { code: \"unknown_error\", message: String(e ?? \"Unknown error\") };\n}\n\nexport function useLivePolling(params: UseLivePollingParams): LiveControl {\n const {\n live,\n workspaceId,\n actor,\n getCurrentBranchId,\n refreshAll,\n refreshBranchContext,\n refreshSnapshotPointers,\n adapters,\n debounceMs,\n } = params;\n\n const [status, setStatus] = React.useState<WorkspaceLiveStatus>(() => ({\n connected: false,\n }));\n\n const adapterRef = React.useRef<WorkspaceLiveAdapter | null>(null);\n const inflightRef = React.useRef<boolean>(false);\n const debounceTimerRef = React.useRef<number | null>(null);\n const lastTickRef = React.useRef<WorkspaceLiveTick | null>(null);\n\n const debounceWindowMs: number = debounceMs ?? 250;\n\n const disconnect = React.useCallback((): void => {\n if (debounceTimerRef.current != null) {\n window.clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = null;\n }\n adapterRef.current?.disconnect();\n adapterRef.current = null;\n inflightRef.current = false;\n lastTickRef.current = null;\n setStatus({ connected: false });\n }, []);\n\n const resolveAdapter =\n React.useCallback((): WorkspaceLiveAdapter | null => {\n if (live.mode === \"off\") return null;\n\n if (live.mode === \"poll\") {\n return createPollAdapter({ defaultIntervalMs: 15000 });\n }\n\n // ws/sse (or future modes) must be provided by host registry\n const reg: WorkspaceLiveAdapterRegistry | undefined = adapters;\n const factory = reg ? reg[live.mode] : undefined;\n\n return factory ? factory() : null;\n }, [live.mode, adapters]);\n\n const ctx = React.useMemo<WorkspaceLiveAdapterContext>(\n () => ({\n workspaceId,\n actorId: actor.id,\n live,\n getCurrentBranchId,\n refreshAll,\n refreshBranchContext,\n refreshSnapshotPointers,\n }),\n [\n workspaceId,\n actor.id,\n live,\n getCurrentBranchId,\n refreshAll,\n refreshBranchContext,\n refreshSnapshotPointers,\n ],\n );\n\n const scheduleRefresh = React.useCallback(\n (tick: WorkspaceLiveTick): void => {\n lastTickRef.current = tick;\n\n if (debounceTimerRef.current != null) {\n window.clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = null;\n }\n\n debounceTimerRef.current = window.setTimeout(() => {\n debounceTimerRef.current = null;\n\n if (inflightRef.current) return;\n inflightRef.current = true;\n\n void (async () => {\n try {\n const res: RunResult = await refreshAll({\n strict: false,\n });\n\n if (!res.ok) {\n setStatus((s) => ({\n ...s,\n connected: true,\n lastEventAt: tick.at,\n lastError: res.errors[0],\n }));\n } else {\n setStatus((s) => ({\n ...s,\n connected: true,\n lastEventAt: tick.at,\n lastError: undefined,\n }));\n }\n } catch (e: unknown) {\n setStatus((s) => ({\n ...s,\n connected: true,\n lastEventAt: tick.at,\n lastError: toError(e),\n }));\n } finally {\n inflightRef.current = false;\n }\n })();\n }, debounceWindowMs) as unknown as number;\n },\n [refreshAll, debounceWindowMs],\n );\n\n const connect = React.useCallback((): void => {\n // idempotent: disconnect current first\n disconnect();\n\n if (live.mode === \"off\") {\n setStatus({ connected: false });\n return;\n }\n\n const adapter: WorkspaceLiveAdapter | null = resolveAdapter();\n\n if (!adapter) {\n setStatus({\n connected: false,\n lastError: {\n code: \"live_adapter_missing\",\n message: `No live adapter registered for mode \"${live.mode}\".`,\n },\n });\n return;\n }\n\n adapterRef.current = adapter;\n\n void Promise.resolve(\n adapter.connect(ctx, {\n onTick: (tick: WorkspaceLiveTick) => {\n // treat any tick as “refresh now”\n scheduleRefresh(tick);\n },\n onStatus: (s: WorkspaceLiveStatus) => {\n setStatus((prev) => ({\n ...prev,\n ...s,\n }));\n },\n }),\n ).catch((e: unknown) => {\n setStatus({\n connected: false,\n lastError: toError(e),\n });\n });\n }, [\n disconnect,\n live.mode,\n refreshAll,\n resolveAdapter,\n ctx,\n scheduleRefresh,\n ]);\n\n // Auto-connect/disconnect based on (workspaceId + live.mode + key options)\n const liveKey: string = React.useMemo(() => {\n if (live.mode === \"poll\") return `poll:${live.intervalMs ?? 15000}`;\n if (live.mode === \"ws\") return `ws:${live.url}`;\n if (live.mode === \"sse\") return `sse:${live.url}`;\n return String(live.mode);\n }, [live]);\n\n React.useEffect(() => {\n connect();\n return () => disconnect();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [workspaceId, liveKey]);\n\n return React.useMemo<LiveControl>(\n () => ({\n connected: status.connected,\n lastEventAt: status.lastEventAt,\n lastError: status.lastError,\n connect,\n disconnect,\n }),\n [\n status.connected,\n status.lastEventAt,\n status.lastError,\n connect,\n disconnect,\n ],\n );\n}\n","// src/react/workspace/context/provider/slices/use-policies-slice.ts\nimport * as React from \"react\";\n\nimport type {\n WorkspaceBackend,\n Result,\n BackendError,\n BackendResult,\n} from \"../../backend\";\nimport type { Loadable } from \"@/react/workspace\";\n\nimport type { DynamicRule } from \"@/schema\";\nimport { compilePolicies, type PolicyDiagnostic } from \"@/core/policy\";\n\n/* ---------------- helpers ---------------- */\n\nfunction idle<T>(data: T | null = null): Loadable<T> {\n return { state: \"idle\", data } as any;\n}\nfunction loading<T>(prev: Loadable<T>): Loadable<T> {\n return { ...prev, state: \"loading\", error: undefined } as any;\n}\nfunction ready<T>(data: T): Loadable<T> {\n return { state: \"ready\", data, error: undefined } as any;\n}\nfunction failed<T>(prev: Loadable<T>, error: BackendError): Loadable<T> {\n return { ...prev, state: \"error\", error } as any;\n}\n\nfunction missingBackendError(key: string): BackendError {\n return {\n code: \"backend_missing\",\n message: `WorkspaceBackend.policies.${key} is not implemented.`,\n };\n}\n\n/* ---------------- slice ---------------- */\n\nexport type PoliciesSlice = {\n readonly policies: Loadable<readonly DynamicRule[]>;\n readonly policyDiagnostics: Loadable<readonly PolicyDiagnostic[]>;\n\n /** internal state setters (for cache switching parity) */\n readonly __setPoliciesState: React.Dispatch<\n React.SetStateAction<Loadable<readonly DynamicRule[]>>\n >;\n readonly __setPolicyDiagnosticsState: React.Dispatch<\n React.SetStateAction<Loadable<readonly PolicyDiagnostic[]>>\n >;\n\n readonly invalidatePolicies: () => void;\n\n readonly refreshPolicies: (\n params?: Readonly<{ since?: number | string; branchId?: string }>,\n ) => Promise<BackendResult<readonly DynamicRule[]>>;\n\n readonly savePolicies: (\n rules: readonly DynamicRule[],\n params?: Readonly<{ branchId?: string }>,\n ) => Result<Readonly<{ policies: readonly DynamicRule[] }>>;\n\n /** local-only compile helper for editor UIs */\n readonly compilePoliciesFromRaw: (raw: unknown) => Readonly<{\n policies: DynamicRule[];\n diagnostics: PolicyDiagnostic[];\n }>;\n};\n\nexport function usePoliciesSlice(\n args: Readonly<{\n backend: WorkspaceBackend;\n workspaceId: string;\n actorId: string;\n getCurrentBranchId: () => string | undefined;\n\n /** optional hydration */\n initialPolicies?: readonly DynamicRule[] | null;\n\n /** runtime is accepted for parity with other slices (not required here) */\n runtime?: unknown;\n }>,\n): PoliciesSlice {\n const {\n backend,\n workspaceId,\n actorId,\n getCurrentBranchId,\n initialPolicies = null,\n } = args;\n\n const [policies, __setPoliciesState] = React.useState<\n Loadable<readonly DynamicRule[]>\n >(() => (initialPolicies ? ready(initialPolicies) : idle(null)) as any);\n\n const [policyDiagnostics, __setPolicyDiagnosticsState] = React.useState<\n Loadable<readonly PolicyDiagnostic[]>\n >(() => idle([]));\n\n const invalidatePolicies = React.useCallback((): void => {\n __setPoliciesState((s) => idle(s.data ?? null));\n __setPolicyDiagnosticsState(() => idle([]));\n }, []);\n\n const refreshPolicies = React.useCallback(\n async (\n params?: Readonly<{ since?: number | string; branchId?: string }>,\n ): Promise<BackendResult<readonly DynamicRule[]>> => {\n const branchId: string | undefined =\n params?.branchId ?? getCurrentBranchId();\n\n const api: any = (backend as any).policies;\n\n // Prefer refresh(); fallback to get(); backend contract exposes load().\n const fn: any = api?.refresh ?? api?.get ?? api?.load;\n const fnKey: string = api?.refresh\n ? \"refresh\"\n : api?.get\n ? \"get\"\n : \"load\";\n\n if (!fn) {\n const error = missingBackendError(fnKey);\n __setPoliciesState((s) => failed(s, error));\n return { ok: false, error };\n }\n\n __setPoliciesState((s) => loading(s));\n\n const res = await fn({\n workspaceId,\n branchId,\n actorId,\n since: params?.since,\n });\n\n if (!res?.ok) {\n const error = res?.error ?? missingBackendError(fnKey);\n __setPoliciesState((s) => failed(s, error));\n return { ok: false, error };\n }\n\n const loaded = res.value;\n const raw = loaded?.raw;\n const compiled =\n loaded?.compiled ??\n (raw != null ? compilePolicies(raw).policies : []);\n const diagnostics =\n loaded?.diagnostics ??\n (raw != null ? compilePolicies(raw).diagnostics : []);\n\n __setPoliciesState(() => ready(compiled));\n __setPolicyDiagnosticsState(() => ready(diagnostics));\n return { ok: true, value: compiled };\n },\n [backend, workspaceId, actorId, getCurrentBranchId],\n );\n\n const savePolicies = React.useCallback<PoliciesSlice[\"savePolicies\"]>(\n async (rules, params) => {\n const branchId: string | undefined =\n params?.branchId ?? getCurrentBranchId();\n\n const api: any = (backend as any).policies;\n if (!api?.save) {\n const err = missingBackendError(\"save\");\n __setPoliciesState((s) => failed(s, err));\n return { ok: false, error: err };\n }\n\n __setPoliciesState((s) => loading(s));\n\n const res = await api.save({\n workspaceId,\n branchId,\n actorId,\n policies: rules,\n });\n\n if (!res?.ok) {\n __setPoliciesState((s) =>\n failed(s, res?.error ?? missingBackendError(\"save\")),\n );\n return res;\n }\n\n const list: readonly DynamicRule[] = (res.value?.policies ??\n res.value ??\n rules) as readonly DynamicRule[];\n\n __setPoliciesState(() => ready(list));\n\n return {\n ok: true,\n value: { policies: list },\n };\n },\n [backend, workspaceId, actorId, getCurrentBranchId],\n );\n\n const compilePoliciesFromRaw = React.useCallback((raw: unknown) => {\n const { policies: compiled, diagnostics } = compilePolicies(raw);\n\n __setPoliciesState(() => ready(compiled));\n __setPolicyDiagnosticsState(() => ready(diagnostics));\n\n return { policies: compiled, diagnostics };\n }, []);\n\n return {\n policies,\n policyDiagnostics,\n\n __setPoliciesState,\n __setPolicyDiagnosticsState,\n\n invalidatePolicies,\n refreshPolicies,\n savePolicies,\n\n compilePoliciesFromRaw,\n };\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","import * as React from \"react\";\n\nimport type {\n BackendError,\n BackendResult,\n Branch,\n Commit,\n Draft,\n} from \"../../backend\";\nimport type {\n RunResult,\n WorkspaceBootSection,\n WorkspaceBootSectionState,\n WorkspaceBootState,\n} from \"../types\";\nimport type { BackendRuntime } from \"../runtime/use-backend-runtime\";\n\nconst ALL_SECTIONS: readonly WorkspaceBootSection[] = [\n \"authors\",\n \"permissions\",\n \"branches\",\n \"services\",\n \"participants\",\n \"templates\",\n \"snapshotPointers\",\n \"snapshotBody\",\n \"policies\",\n \"comments\",\n];\n\nconst BLOCKING_SECTIONS: readonly WorkspaceBootSection[] = [\n \"authors\",\n \"permissions\",\n \"branches\",\n \"services\",\n \"participants\",\n \"templates\",\n \"snapshotPointers\",\n \"snapshotBody\",\n \"policies\",\n];\n\nfunction createInitialSections(): Record<\n WorkspaceBootSection,\n WorkspaceBootSectionState\n> {\n return {\n authors: { status: \"idle\" },\n permissions: { status: \"idle\" },\n branches: { status: \"idle\" },\n services: { status: \"idle\" },\n participants: { status: \"idle\" },\n templates: { status: \"idle\" },\n snapshotPointers: { status: \"idle\" },\n snapshotBody: { status: \"idle\" },\n policies: { status: \"idle\" },\n comments: { status: \"idle\" },\n };\n}\n\nfunction createNoBranchError(section: WorkspaceBootSection): BackendError {\n return {\n code: \"no_branch\",\n message: `No current branch available to load ${section}.`,\n };\n}\n\nfunction collectErrors(\n sections: Readonly<Record<WorkspaceBootSection, WorkspaceBootSectionState>>,\n): Partial<Record<WorkspaceBootSection, BackendError>> {\n const errors: Partial<Record<WorkspaceBootSection, BackendError>> = {};\n for (const section of ALL_SECTIONS) {\n const error = sections[section].error;\n if (error) {\n errors[section] = error;\n }\n }\n return errors;\n}\n\nfunction getRunErrors(result: RunResult): BackendError[] {\n return result.ok ? [] : result.errors;\n}\n\nfunction resolveBranchId(\n branches: readonly Branch[],\n preferredId?: string,\n): string | undefined {\n if (preferredId && branches.some((branch) => branch.id === preferredId)) {\n return preferredId;\n }\n return branches.find((branch) => branch.isMain)?.id ?? branches[0]?.id;\n}\n\nasync function toVoidResult<T>(\n result: Promise<BackendResult<T>>,\n): Promise<BackendResult<void>> {\n const res = await result;\n if (!res.ok) {\n return res;\n }\n return { ok: true, value: undefined };\n}\n\nexport interface UseWorkspaceBootParams {\n readonly workspaceId: string;\n readonly actorId: string;\n readonly preferredBranchId?: string;\n readonly hasInitialData: boolean;\n readonly runtime: BackendRuntime;\n readonly getBranchesState: () => readonly Branch[];\n readonly getCurrentBranchId: () => string | undefined;\n readonly setCurrentBranchId: (id: string) => void;\n readonly refreshAuthors: () => Promise<BackendResult<readonly unknown[]>>;\n readonly refreshPermissions: () => Promise<\n BackendResult<Readonly<Record<string, boolean>>>\n >;\n readonly refreshBranches: () => Promise<BackendResult<readonly Branch[]>>;\n readonly refreshServices: () => Promise<\n BackendResult<Readonly<Record<string, unknown>>>\n >;\n readonly refreshParticipants: (\n branchId: string,\n ) => Promise<BackendResult<readonly unknown[]>>;\n readonly refreshTemplates: (\n branchId: string,\n ) => Promise<BackendResult<readonly unknown[]>>;\n readonly refreshSnapshotPointers: (\n branchId: string,\n ) => Promise<BackendResult<Readonly<{ head?: Commit; draft?: Draft }>>>;\n readonly loadSnapshotBody: (\n branchId: string,\n ) => Promise<BackendResult<void>>;\n readonly refreshPolicies: (\n branchId: string,\n ) => Promise<BackendResult<readonly unknown[]>>;\n readonly refreshComments: (\n branchId: string,\n ) => Promise<BackendResult<readonly unknown[]>>;\n}\n\nexport interface WorkspaceBootController {\n readonly boot: WorkspaceBootState;\n readonly refreshAll: (opts?: { strict?: boolean }) => Promise<RunResult>;\n readonly refreshBranchContext: (\n opts?: Readonly<{\n branchId?: string;\n strict?: boolean;\n includeWorkspaceData?: boolean;\n }>,\n ) => Promise<void>;\n readonly refreshSnapshotPointers: (\n opts?: Readonly<{ branchId?: string; strict?: boolean }>,\n ) => Promise<void>;\n}\n\nexport function useWorkspaceBoot(\n params: UseWorkspaceBootParams,\n): WorkspaceBootController {\n const {\n workspaceId,\n actorId,\n preferredBranchId,\n hasInitialData,\n runtime,\n getBranchesState,\n getCurrentBranchId,\n setCurrentBranchId,\n refreshAuthors,\n refreshPermissions,\n refreshBranches,\n refreshServices,\n refreshParticipants,\n refreshTemplates,\n refreshSnapshotPointers,\n loadSnapshotBody,\n refreshPolicies,\n refreshComments,\n } = params;\n\n const [sections, setSections] = React.useState(createInitialSections);\n const [lastError, setLastError] = React.useState<BackendError | undefined>(\n undefined,\n );\n const runIdRef = React.useRef(0);\n const refreshAllRef = React.useRef<\n ((opts?: { strict?: boolean }) => Promise<RunResult>) | null\n >(null);\n\n const markLoading = React.useCallback(\n (section: WorkspaceBootSection): void => {\n setSections((prev) => ({\n ...prev,\n [section]: {\n status: \"loading\",\n updatedAt: runtime.now(),\n },\n }));\n },\n [runtime],\n );\n\n const markResult = React.useCallback(\n (section: WorkspaceBootSection, result: BackendResult<unknown>): void => {\n if (result.ok) {\n setSections((prev) => ({\n ...prev,\n [section]: {\n status: \"success\",\n updatedAt: runtime.now(),\n },\n }));\n return;\n }\n\n setLastError(result.error);\n setSections((prev) => ({\n ...prev,\n [section]: {\n status: \"error\",\n error: result.error,\n updatedAt: runtime.now(),\n },\n }));\n },\n [runtime],\n );\n\n const runSection = React.useCallback(\n async <T,>(\n section: WorkspaceBootSection,\n task: () => Promise<BackendResult<T>>,\n ): Promise<BackendResult<T>> => {\n markLoading(section);\n try {\n const result = await task();\n markResult(section, result as BackendResult<unknown>);\n return result;\n } catch (error) {\n const backendError = runtime.toBackendError(error);\n setLastError(backendError);\n setSections((prev) => ({\n ...prev,\n [section]: {\n status: \"error\",\n error: backendError,\n updatedAt: runtime.now(),\n },\n }));\n return { ok: false, error: backendError };\n }\n },\n [markLoading, markResult, runtime],\n );\n\n const runGroup = React.useCallback(\n async (\n tasks: ReadonlyArray<\n readonly [WorkspaceBootSection, () => Promise<BackendResult<unknown>>]\n >,\n strict: boolean,\n ): Promise<RunResult> => {\n const errors: BackendError[] = [];\n\n for (const [section, task] of tasks) {\n const result = await runSection(section, task);\n if (!result.ok) {\n errors.push(result.error);\n if (strict) {\n break;\n }\n }\n }\n\n return errors.length > 0 ? { ok: false, errors } : { ok: true };\n },\n [runSection],\n );\n\n const resolveActiveBranch = React.useCallback(\n (candidateId?: string): string | undefined => {\n const branches = getBranchesState();\n const branchId = resolveBranchId(\n branches,\n candidateId ?? getCurrentBranchId() ?? preferredBranchId,\n );\n if (branchId) {\n setCurrentBranchId(branchId);\n }\n return branchId;\n },\n [\n getBranchesState,\n getCurrentBranchId,\n preferredBranchId,\n setCurrentBranchId,\n ],\n );\n\n const markBranchScopedNoBranch = React.useCallback((): RunResult => {\n const errors: BackendError[] = [];\n for (const section of BLOCKING_SECTIONS) {\n if (![\"participants\", \"templates\", \"snapshotPointers\", \"snapshotBody\", \"policies\"].includes(section)) {\n continue;\n }\n const error = createNoBranchError(section);\n errors.push(error);\n setLastError(error);\n setSections((prev) => ({\n ...prev,\n [section]: {\n status: \"error\",\n error,\n updatedAt: runtime.now(),\n },\n }));\n }\n return { ok: false, errors };\n }, [runtime]);\n\n const refreshBranchContext = React.useCallback(\n async (\n opts?: Readonly<{\n branchId?: string;\n strict?: boolean;\n includeWorkspaceData?: boolean;\n }>,\n ): Promise<void> => {\n const strict = opts?.strict ?? false;\n const tasks: Array<\n readonly [WorkspaceBootSection, () => Promise<BackendResult<unknown>>]\n > = [];\n const branchId =\n resolveActiveBranch(opts?.branchId) ?? opts?.branchId;\n\n if (opts?.includeWorkspaceData ?? true) {\n tasks.push([\"authors\", refreshAuthors]);\n tasks.push([\"permissions\", refreshPermissions]);\n tasks.push([\"services\", refreshServices]);\n }\n\n if (!branchId) {\n markBranchScopedNoBranch();\n return;\n }\n\n tasks.push([\n \"participants\",\n () => refreshParticipants(branchId),\n ]);\n tasks.push([\"templates\", () => refreshTemplates(branchId)]);\n tasks.push([\n \"snapshotPointers\",\n () => refreshSnapshotPointers(branchId),\n ]);\n tasks.push([\"policies\", () => refreshPolicies(branchId)]);\n tasks.push([\"snapshotBody\", () => loadSnapshotBody(branchId)]);\n\n await runGroup(tasks, strict);\n void runSection(\"comments\", () => refreshComments(branchId));\n },\n [\n loadSnapshotBody,\n markBranchScopedNoBranch,\n refreshAuthors,\n refreshComments,\n refreshParticipants,\n refreshPermissions,\n refreshPolicies,\n refreshServices,\n refreshSnapshotPointers,\n refreshTemplates,\n resolveActiveBranch,\n runGroup,\n runSection,\n ],\n );\n\n const refreshAll = React.useCallback(\n async (opts?: { strict?: boolean }): Promise<RunResult> => {\n const runId = ++runIdRef.current;\n const strict = opts?.strict ?? false;\n const workspaceErrors: BackendError[] = [];\n\n const authorsResult = await runSection(\"authors\", refreshAuthors);\n if (!authorsResult.ok) {\n workspaceErrors.push(authorsResult.error);\n if (strict) {\n return { ok: false, errors: workspaceErrors };\n }\n }\n\n const permissionsResult = await runSection(\n \"permissions\",\n refreshPermissions,\n );\n if (!permissionsResult.ok) {\n workspaceErrors.push(permissionsResult.error);\n if (strict) {\n return { ok: false, errors: workspaceErrors };\n }\n }\n\n const branchesResult = await runSection(\"branches\", refreshBranches);\n if (!branchesResult.ok) {\n workspaceErrors.push(branchesResult.error);\n if (strict) {\n return { ok: false, errors: workspaceErrors };\n }\n }\n\n const servicesResult = await runSection(\"services\", refreshServices);\n if (!servicesResult.ok) {\n workspaceErrors.push(servicesResult.error);\n if (strict) {\n return { ok: false, errors: workspaceErrors };\n }\n }\n\n if (runIdRef.current !== runId) {\n return workspaceErrors.length > 0\n ? { ok: false, errors: workspaceErrors }\n : { ok: true };\n }\n\n const resolvedBranches =\n branchesResult.ok && branchesResult.value\n ? (branchesResult.value as readonly Branch[])\n : getBranchesState();\n const branchId = resolveBranchId(\n resolvedBranches,\n preferredBranchId ?? getCurrentBranchId(),\n );\n if (branchId) {\n setCurrentBranchId(branchId);\n }\n if (!branchId) {\n const noBranchResult = markBranchScopedNoBranch();\n if (workspaceErrors.length > 0) {\n return {\n ok: false,\n errors: [\n ...workspaceErrors,\n ...getRunErrors(noBranchResult),\n ],\n };\n }\n return noBranchResult;\n }\n\n const branchResult = await runGroup(\n [\n [\"participants\", () => refreshParticipants(branchId)],\n [\"templates\", () => refreshTemplates(branchId)],\n [\n \"snapshotPointers\",\n () => refreshSnapshotPointers(branchId),\n ],\n [\"policies\", () => refreshPolicies(branchId)],\n [\"snapshotBody\", () => loadSnapshotBody(branchId)],\n ],\n strict,\n );\n\n if (runIdRef.current === runId) {\n void runSection(\"comments\", () => refreshComments(branchId));\n }\n\n if (workspaceErrors.length > 0 || !branchResult.ok) {\n const branchErrors = !branchResult.ok ? branchResult.errors : [];\n return {\n ok: false,\n errors: [...workspaceErrors, ...branchErrors],\n };\n }\n\n return { ok: true };\n },\n [\n loadSnapshotBody,\n markBranchScopedNoBranch,\n preferredBranchId,\n refreshAuthors,\n refreshBranches,\n refreshComments,\n refreshParticipants,\n refreshPermissions,\n refreshPolicies,\n refreshServices,\n refreshSnapshotPointers,\n refreshTemplates,\n getBranchesState,\n getCurrentBranchId,\n runGroup,\n runSection,\n setCurrentBranchId,\n ],\n );\n\n const retrySection = React.useCallback(\n async (\n section: WorkspaceBootSection,\n ): Promise<BackendResult<void>> => {\n const branchId = resolveActiveBranch();\n\n switch (section) {\n case \"authors\":\n return toVoidResult(refreshAuthors());\n case \"permissions\":\n return toVoidResult(refreshPermissions());\n case \"branches\":\n return toVoidResult(refreshBranches());\n case \"services\":\n return toVoidResult(refreshServices());\n case \"participants\":\n return branchId\n ? toVoidResult(\n runSection(section, () =>\n refreshParticipants(branchId),\n ),\n )\n : { ok: false, error: createNoBranchError(section) };\n case \"templates\":\n return branchId\n ? toVoidResult(\n runSection(section, () =>\n refreshTemplates(branchId),\n ),\n )\n : { ok: false, error: createNoBranchError(section) };\n case \"snapshotPointers\":\n return branchId\n ? toVoidResult(\n runSection(section, () =>\n refreshSnapshotPointers(branchId),\n ),\n )\n : { ok: false, error: createNoBranchError(section) };\n case \"snapshotBody\":\n return branchId\n ? toVoidResult(\n runSection(section, () =>\n loadSnapshotBody(branchId),\n ),\n )\n : { ok: false, error: createNoBranchError(section) };\n case \"policies\":\n return branchId\n ? toVoidResult(\n runSection(section, () =>\n refreshPolicies(branchId),\n ),\n )\n : { ok: false, error: createNoBranchError(section) };\n case \"comments\":\n return branchId\n ? toVoidResult(\n runSection(section, () =>\n refreshComments(branchId),\n ),\n )\n : { ok: false, error: createNoBranchError(section) };\n default:\n return {\n ok: false,\n error: {\n code: \"invalid_section\",\n message: `Unknown boot section: ${String(section)}.`,\n },\n };\n }\n },\n [\n loadSnapshotBody,\n refreshAuthors,\n refreshBranches,\n refreshComments,\n refreshParticipants,\n refreshPermissions,\n refreshPolicies,\n refreshServices,\n refreshSnapshotPointers,\n refreshTemplates,\n resolveActiveBranch,\n runSection,\n ],\n );\n\n const refreshSnapshotPointersOnly = React.useCallback(\n async (\n opts?: Readonly<{ branchId?: string; strict?: boolean }>,\n ): Promise<void> => {\n const branchId = resolveActiveBranch(opts?.branchId);\n if (!branchId) {\n markBranchScopedNoBranch();\n return;\n }\n await runGroup(\n [[\"snapshotPointers\", () => refreshSnapshotPointers(branchId)]],\n opts?.strict ?? false,\n );\n },\n [markBranchScopedNoBranch, refreshSnapshotPointers, resolveActiveBranch, runGroup],\n );\n\n React.useEffect(() => {\n refreshAllRef.current = refreshAll;\n }, [refreshAll]);\n\n React.useEffect(() => {\n setSections(createInitialSections());\n setLastError(undefined);\n void refreshAllRef.current?.();\n }, [actorId, workspaceId]);\n\n const boot = React.useMemo<WorkspaceBootState>(() => {\n const errorsBySection = collectErrors(sections);\n const statuses = ALL_SECTIONS.map((section) => sections[section].status);\n const completedSections = statuses.filter((status) => status !== \"idle\" && status !== \"loading\").length;\n const succeededSections = statuses.filter((status) => status === \"success\").length;\n const failedSections = statuses.filter((status) => status === \"error\").length;\n const isBooting = statuses.some((status) => status === \"loading\");\n const isReady = BLOCKING_SECTIONS.every(\n (section) => sections[section].status === \"success\",\n );\n const hasErrors = failedSections > 0;\n const hasPartialFailure = succeededSections > 0 && failedSections > 0;\n const isLiveConfirmed = isReady;\n\n return {\n sections,\n isBooting,\n isReady,\n hasErrors,\n hasPartialFailure,\n lastError,\n errorsBySection,\n isSeededView: hasInitialData && !isLiveConfirmed,\n isLiveConfirmed,\n completedSections,\n succeededSections,\n failedSections,\n totalSections: ALL_SECTIONS.length,\n retryAll: refreshAll,\n retrySection,\n };\n }, [hasInitialData, lastError, refreshAll, retrySection, sections]);\n\n return React.useMemo(\n () => ({\n boot,\n refreshAll,\n refreshBranchContext,\n refreshSnapshotPointers: refreshSnapshotPointersOnly,\n }),\n [boot, refreshAll, refreshBranchContext, refreshSnapshotPointersOnly],\n );\n}\n","import React, {\n createContext,\n type ReactNode,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { CanvasAPI } from \"@/react\";\nimport { Builder, BuilderOptions, createBuilder } from \"@/core\";\nimport type { CanvasOptions, CanvasState } from \"@/schema/canvas-types\";\nimport type { CanvasBackendOptions } from \"../../canvas/backend\";\nimport type { EditorSnapshot, ServiceProps } from \"@/schema\";\nimport { useWorkspaceMaybe } from \".\";\n\nconst Ctx = createContext<CanvasAPI | null>(null);\n\ntype CanvasProviderManagedProps = {\n api: CanvasAPI;\n children: ReactNode;\n};\n\ntype CanvasProviderWorkspaceProps = {\n children: ReactNode;\n builderOpts?: BuilderOptions;\n canvasOpts?: CanvasOptions & CanvasBackendOptions;\n attachToWorkspace?: boolean;\n};\n\ntype CanvasProviderProps =\n | CanvasProviderManagedProps\n | CanvasProviderWorkspaceProps;\n\ntype BootSectionStatus = \"idle\" | \"loading\" | \"success\" | \"error\";\n\nexport function CanvasProvider(props: CanvasProviderProps) {\n if (\"api\" in props) {\n return <Ctx.Provider value={props.api}>{props.children}</Ctx.Provider>;\n }\n\n return <CanvasProviderWorkspaceRuntime {...props} />;\n}\n\nfunction CanvasProviderWorkspaceRuntime({\n children,\n builderOpts,\n canvasOpts,\n attachToWorkspace = true,\n}: CanvasProviderWorkspaceProps) {\n const ws = useWorkspaceMaybe();\n\n if (!attachToWorkspace || !ws) {\n throw new Error(\n \"CanvasProvider: no `api` provided and no Workspace context available. \" +\n \"Either pass an `api` prop or render within <WorkspaceProvider>.\",\n );\n }\n\n const snapshotSection = ws.boot.sections.snapshotBody;\n const currentBranchId = ws.branches.currentId;\n const snapshotData = ws.snapshot.data as EditorSnapshot | undefined;\n const initialProps = snapshotData?.props as ServiceProps | undefined;\n\n const hasMountedOnceRef = useRef(false);\n\n const canMountCanvas =\n ws.boot.isBooting === false &&\n snapshotSection.status === \"success\" &&\n initialProps != null;\n\n const debug = \"\";\n\n const resolvedBuilderOpts: BuilderOptions | undefined = useMemo(() => {\n const svc = ws.services.data as unknown;\n const hasMap =\n svc != null &&\n typeof svc === \"object\" &&\n !Array.isArray(svc as unknown[]);\n\n return hasMap\n ? {\n ...(builderOpts ?? {}),\n serviceMap: svc as BuilderOptions[\"serviceMap\"],\n }\n : builderOpts;\n }, [builderOpts, ws.services.data]);\n\n if (canMountCanvas) {\n hasMountedOnceRef.current = true;\n }\n\n if (!canMountCanvas && !hasMountedOnceRef.current) {\n return (\n <>\n {debug}\n <WorkspaceBootScreen boot={ws.boot} />\n </>\n );\n }\n\n if (!canMountCanvas) {\n return (\n <>\n {debug}\n <WorkspaceBootOverlay boot={ws.boot} />\n <CanvasShellPlaceholder />\n </>\n );\n }\n\n const mountKey = currentBranchId ?? \"workspace-canvas\";\n\n return (\n <>\n {debug}\n <CanvasProviderOwned\n key={mountKey}\n initialSnapshot={snapshotData!}\n canvasOpts={canvasOpts}\n builderOpts={resolvedBuilderOpts}\n >\n {children}\n </CanvasProviderOwned>\n </>\n );\n}\n\nfunction CanvasProviderOwned({\n children,\n initialSnapshot,\n canvasOpts,\n builderOpts,\n}: {\n children: ReactNode;\n initialSnapshot: EditorSnapshot;\n canvasOpts?: CanvasOptions & CanvasBackendOptions;\n builderOpts?: BuilderOptions;\n}) {\n const { api } = useCanvasOwned(\n initialSnapshot.props,\n canvasOpts,\n builderOpts,\n );\n\n const hydrationReady = useHydrateEditorSnapshot(api, initialSnapshot);\n\n return (\n <Ctx.Provider value={api}>\n {hydrationReady ? children : null}\n </Ctx.Provider>\n );\n}\n\nexport function useCanvasAPI(): CanvasAPI {\n const api = useContext(Ctx);\n if (!api) {\n throw new Error(\"useCanvasAPI must be used within <CanvasProvider>\");\n }\n return api;\n}\n\nexport function useCanvasFromBuilder(\n builder: Builder,\n opts?: CanvasOptions & CanvasBackendOptions,\n): CanvasAPI {\n useDevWarnOnOptsChurn(opts);\n\n const lastOptsRef = useRef<\n (CanvasOptions & CanvasBackendOptions) | undefined\n >(undefined);\n\n const stableOpts =\n opts &&\n lastOptsRef.current &&\n shallowEqualOpts(lastOptsRef.current, opts)\n ? lastOptsRef.current\n : (lastOptsRef.current = opts);\n\n const api = useMemo(\n () => new CanvasAPI(builder, stableOpts),\n [builder, stableOpts],\n );\n\n useEffect(() => {\n return () => {\n api.dispose?.();\n };\n }, [api]);\n\n return api;\n}\n\nexport function useCanvasFromExisting(api: CanvasAPI): CanvasAPI {\n return api;\n}\n\nconst NO_SNAPSHOT_HYDRATION_KEY = \"__no_snapshot__\";\n\nfunction useHydrateEditorSnapshot(\n api: CanvasAPI,\n snapshot?: EditorSnapshot,\n): boolean {\n const fallbackIdentityRef = useRef(\n `snapshot:fallback:${Math.random().toString(36).slice(2)}`,\n );\n const hydratedIdentityRef = useRef<string>(NO_SNAPSHOT_HYDRATION_KEY);\n const [hydrationReady, setHydrationReady] = useState(false);\n const targetHydrationIdentity = useMemo(() => {\n if (!snapshot?.props) return NO_SNAPSHOT_HYDRATION_KEY;\n return getSnapshotHydrationIdentity(snapshot, fallbackIdentityRef.current);\n }, [snapshot]);\n\n useLayoutEffect(() => {\n if (snapshot?.props) {\n const shouldHydrate =\n hydratedIdentityRef.current !== targetHydrationIdentity;\n if (shouldHydrate) {\n hydrateEditorFromSnapshot(api, snapshot);\n hydratedIdentityRef.current = targetHydrationIdentity;\n }\n }\n\n if (!hydrationReady) {\n // Gate children only until the first hydration pass completes.\n // Do not flip this back to false on later snapshot updates.\n setHydrationReady(true);\n }\n }, [api, hydrationReady, snapshot, targetHydrationIdentity]);\n\n return hydrationReady;\n}\n\nfunction getSnapshotHydrationIdentity(\n snapshot: EditorSnapshot,\n fallbackIdentity: string,\n): string {\n const meta = snapshot.meta as Record<string, unknown> | undefined;\n const snapshotId = meta?.snapshot_id ?? meta?.snapshotId;\n const versionId = meta?.version_id ?? meta?.versionId;\n const branchId = meta?.branch_id ?? meta?.branchId;\n\n if (\n snapshotId != null ||\n versionId != null ||\n branchId != null\n ) {\n return [\n String(snapshotId ?? \"\"),\n String(versionId ?? \"\"),\n String(branchId ?? \"\"),\n ].join(\"|\");\n }\n\n return fallbackIdentity;\n}\n\nfunction hydrateEditorFromSnapshot(api: CanvasAPI, snapshot: EditorSnapshot) {\n api.refreshGraph();\n\n hydrateCatalog(api, snapshot);\n hydrateCanvasLayout(api, snapshot.layout?.canvas);\n}\n\nfunction hydrateCatalog(api: CanvasAPI, snapshot: EditorSnapshot) {\n if (snapshot.catalog) {\n api.editor.setCatalog(snapshot.catalog);\n return;\n }\n\n api.editor.clearCatalog();\n}\n\nfunction hydrateCanvasLayout(api: CanvasAPI, canvas?: CanvasState) {\n if (!canvas) return;\n const current = api.snapshot();\n\n if (\n canvas.positions &&\n hasPositionDelta(canvas.positions, current.positions)\n ) {\n api.setPositions(canvas.positions);\n }\n\n if (canvas.viewport && !sameViewport(canvas.viewport, current.viewport)) {\n api.setViewport(canvas.viewport);\n }\n\n const currentSelection = api.getSelection().map(String);\n if (canvas.selection) {\n const ids = Array.isArray(canvas.selection)\n ? canvas.selection\n : Array.from(canvas.selection);\n\n if (ids.length > 0) {\n if (!sameIdSet(ids.map(String), currentSelection)) {\n api.select(ids.map(String));\n }\n } else if (currentSelection.length > 0) {\n api.clearSelection();\n }\n } else if (currentSelection.length > 0) {\n api.clearSelection();\n }\n\n if (\"highlighted\" in (canvas as any)) {\n const highlighted = (canvas as any).highlighted;\n const ids = highlighted\n ? Array.isArray(highlighted)\n ? highlighted\n : Array.from(highlighted)\n : [];\n const currentIds = Array.from(current.highlighted ?? []).map(String);\n const nextIds = ids.map(String);\n if (!sameIdSet(nextIds, currentIds)) {\n api.setHighlighted(nextIds);\n }\n }\n\n if (\"hoverId\" in canvas) {\n const nextHoverId = (canvas as any).hoverId;\n if ((current as any).hoverId !== nextHoverId) {\n api.setHover(nextHoverId);\n }\n }\n}\n\nfunction hasPositionDelta(\n next: Record<string, { x: number; y: number }>,\n current: Record<string, { x: number; y: number }>,\n): boolean {\n for (const id of Object.keys(next)) {\n const nextPos = next[id];\n const currentPos = current[id];\n if (\n !currentPos ||\n currentPos.x !== nextPos.x ||\n currentPos.y !== nextPos.y\n ) {\n return true;\n }\n }\n return false;\n}\n\nfunction sameViewport(\n a?: { x?: number; y?: number; zoom?: number },\n b?: { x?: number; y?: number; zoom?: number },\n): boolean {\n if (!a && !b) return true;\n if (!a || !b) return false;\n return a.x === b.x && a.y === b.y && a.zoom === b.zoom;\n}\n\nfunction sameIdSet(a: readonly string[], b: readonly string[]): boolean {\n if (a.length !== b.length) return false;\n const set = new Set(a);\n for (const id of b) {\n if (!set.has(id)) return false;\n }\n return true;\n}\n\nfunction WorkspaceBootScreen({\n boot,\n}: {\n boot: {\n isBooting: boolean;\n totalSections: number;\n completedSections: number;\n sections: Record<\n string,\n {\n status: BootSectionStatus;\n error?: { message?: string } | null;\n }\n >;\n };\n}) {\n const sections = getOrderedBootSections(boot.sections);\n const percent =\n boot.totalSections > 0\n ? (boot.completedSections / boot.totalSections) * 100\n : 0;\n\n return (\n <div className=\"flex min-h-screen items-center justify-center bg-white px-6 py-10 dark:bg-slate-950\">\n <div className=\"w-full max-w-2xl rounded-2xl border border-slate-200 bg-white p-6 shadow-sm dark:border-slate-800 dark:bg-slate-900\">\n <div className=\"mb-5\">\n <div className=\"text-[11px] uppercase tracking-[0.22em] text-slate-400 dark:text-slate-500\">\n Workspace boot\n </div>\n <h2 className=\"mt-1 text-lg font-semibold text-slate-900 dark:text-slate-100\">\n Loading Service Builder\n </h2>\n <p className=\"mt-1 text-sm text-slate-500 dark:text-slate-400\">\n {boot.completedSections} of {boot.totalSections}{\" \"}\n sections completed\n </p>\n </div>\n\n <div className=\"mb-5 h-2 overflow-hidden rounded-full bg-slate-100 dark:bg-slate-800\">\n <div\n className=\"h-full rounded-full bg-blue-600 transition-all\"\n style={{ width: `${percent}%` }}\n />\n </div>\n\n <div className=\"grid gap-2\">\n {sections.map(({ key, status, error }) => (\n <div\n key={key}\n className=\"flex items-center justify-between rounded-xl border border-slate-200 px-3 py-2 dark:border-slate-800\"\n >\n <div className=\"text-sm font-medium text-slate-700 dark:text-slate-200\">\n {formatBootSection(key)}\n </div>\n\n <div className=\"flex items-center gap-2\">\n {error?.message ? (\n <span className=\"max-w-[18rem] truncate text-xs text-rose-500\">\n {error.message}\n </span>\n ) : null}\n <BootStatusBadge status={status} />\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n}\n\nfunction WorkspaceBootOverlay({\n boot,\n}: {\n boot: {\n isBooting: boolean;\n totalSections: number;\n completedSections: number;\n };\n}) {\n if (!boot.isBooting) return null;\n\n return (\n <div className=\"pointer-events-none fixed inset-x-0 top-0 z-50 flex justify-center px-4 pt-3\">\n <div className=\"pointer-events-auto inline-flex items-center gap-3 rounded-full border border-slate-200 bg-white/95 px-4 py-2 text-sm shadow-sm backdrop-blur dark:border-slate-800 dark:bg-slate-900/95\">\n <span className=\"inline-block h-2 w-2 animate-pulse rounded-full bg-blue-600\" />\n <span className=\"text-slate-700 dark:text-slate-200\">\n Refreshing workspace… {boot.completedSections}/\n {boot.totalSections}\n </span>\n </div>\n </div>\n );\n}\n\nfunction CanvasShellPlaceholder() {\n return <div className=\"min-h-screen bg-white dark:bg-slate-950\" />;\n}\n\nfunction BootStatusBadge({ status }: { status: BootSectionStatus }) {\n if (status === \"success\") {\n return (\n <span className=\"rounded-full bg-emerald-50 px-2 py-0.5 text-xs font-medium text-emerald-700 dark:bg-emerald-500/10 dark:text-emerald-300\">\n Loaded\n </span>\n );\n }\n\n if (status === \"error\") {\n return (\n <span className=\"rounded-full bg-rose-50 px-2 py-0.5 text-xs font-medium text-rose-700 dark:bg-rose-500/10 dark:text-rose-300\">\n Failed\n </span>\n );\n }\n\n if (status === \"loading\") {\n return (\n <span className=\"rounded-full bg-blue-50 px-2 py-0.5 text-xs font-medium text-blue-700 dark:bg-blue-500/10 dark:text-blue-300\">\n Loading\n </span>\n );\n }\n\n return (\n <span className=\"rounded-full bg-slate-100 px-2 py-0.5 text-xs font-medium text-slate-600 dark:bg-slate-800 dark:text-slate-300\">\n Pending\n </span>\n );\n}\n\nfunction getOrderedBootSections(\n sections: Record<\n string,\n {\n status: BootSectionStatus;\n error?: { message?: string } | null;\n }\n >,\n) {\n const order = [\n \"authors\",\n \"permissions\",\n \"branches\",\n \"services\",\n \"participants\",\n \"templates\",\n \"snapshotPointers\",\n \"snapshotBody\",\n \"policies\",\n \"comments\",\n ];\n\n return order\n .filter((key) => key in sections)\n .map((key) => ({\n key,\n status: sections[key]?.status ?? \"idle\",\n error: sections[key]?.error ?? null,\n }));\n}\n\nfunction formatBootSection(section: string) {\n switch (section) {\n case \"snapshotPointers\":\n return \"Snapshot pointers\";\n case \"snapshotBody\":\n return \"Snapshot body\";\n default:\n return section.charAt(0).toUpperCase() + section.slice(1);\n }\n}\n\nfunction shallowEqualOpts(\n a?: CanvasOptions & CanvasBackendOptions,\n b?: CanvasOptions & CanvasBackendOptions,\n) {\n if (a === b) return true;\n if (!a || !b) return false;\n\n const aKeys = Object.keys(a) as (keyof (CanvasOptions &\n CanvasBackendOptions))[];\n const bKeys = Object.keys(b) as (keyof (CanvasOptions &\n CanvasBackendOptions))[];\n\n if (aKeys.length !== bKeys.length) return false;\n\n for (const k of aKeys) {\n if ((a as any)[k] !== (b as any)[k]) return false;\n }\n\n return true;\n}\n\nfunction useDevWarnOnOptsChurn(opts?: CanvasOptions & CanvasBackendOptions) {\n const rawRef = useRef<typeof opts>(undefined);\n const churnCountRef = useRef(0);\n const lastWindowStartRef = useRef<number>(Date.now());\n const warnedRef = useRef(false);\n\n useEffect(() => {\n // @ts-ignore\n if (window.SITE?.env === \"production\") return;\n\n const now = Date.now();\n\n if (now - lastWindowStartRef.current > 2000) {\n lastWindowStartRef.current = now;\n churnCountRef.current = 0;\n }\n\n if (rawRef.current !== opts) {\n churnCountRef.current += 1;\n rawRef.current = opts;\n }\n\n if (!warnedRef.current && churnCountRef.current >= 5) {\n warnedRef.current = true;\n console.warn(\n \"[digital-service-ui-builder] useCanvasFromBuilder: `opts` is changing identity frequently. \" +\n \"Wrap your options in useMemo to avoid unnecessary API re-instantiation.\",\n );\n }\n });\n}\n\ntype UseCanvasOwnedReturn = {\n api: CanvasAPI;\n builder: Builder;\n};\n\nexport function useCanvasOwned(\n initialProps?: ServiceProps,\n canvasOpts?: CanvasOptions & CanvasBackendOptions,\n builderOpts?: BuilderOptions,\n): UseCanvasOwnedReturn {\n const builderRef = useRef<Builder>();\n const builderOptsRef = useRef<BuilderOptions | undefined>(builderOpts);\n const loadedOnceRef = useRef<boolean>(false);\n\n if (!builderRef.current) {\n builderRef.current = createBuilder(builderOptsRef.current);\n\n if (initialProps) {\n builderRef.current.load(initialProps);\n loadedOnceRef.current = true;\n }\n // @ts-ignore\n } else if (window.SITE?.env !== \"production\") {\n if (builderOptsRef.current !== builderOpts) {\n console.warn(\n \"[useCanvasOwned] builderOpts changed after init; new values are ignored. \" +\n \"If you need to recreate the builder, remount the hook (e.g. change a React key).\",\n );\n builderOptsRef.current = builderOpts;\n }\n }\n\n const builder = builderRef.current!;\n\n useEffect(() => {\n if (!loadedOnceRef.current && initialProps) {\n builderRef.current!.load(initialProps);\n loadedOnceRef.current = true;\n }\n }, [initialProps]);\n\n const lastCanvasOptsRef = useRef<typeof canvasOpts>();\n\n const stableCanvasOpts = useMemo(() => {\n if (!lastCanvasOptsRef.current) {\n lastCanvasOptsRef.current = canvasOpts;\n return canvasOpts;\n }\n\n const a = canvasOpts ?? {};\n const b = lastCanvasOptsRef.current ?? {};\n const same = Object.keys({ ...a, ...b }).every(\n (k) => (a as any)[k] === (b as any)[k],\n );\n\n if (same) return lastCanvasOptsRef.current;\n\n lastCanvasOptsRef.current = canvasOpts;\n return canvasOpts;\n }, [canvasOpts]);\n\n const api = useMemo(\n () => new CanvasAPI(builder, stableCanvasOpts),\n [builder, stableCanvasOpts],\n );\n\n useEffect(() => {\n return () => {\n api.dispose?.();\n };\n }, [api]);\n\n return { api, builder };\n}\n","// 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 { Builder, normalise } from \"@/core\";\nimport type {\n CatalogId,\n CatalogNode,\n CatalogServiceId,\n CatalogSmartRule,\n Command,\n EditorEvents,\n EditorOptions,\n EditorSnapshot,\n FallbackSettings,\n Field,\n FieldValidationRule,\n ServiceIdRef,\n ServiceCatalogState,\n ServiceProps,\n ServicePropsNotice,\n Tag,\n} from \"@/schema\";\nimport type { CanvasAPI } from \"./api\";\nimport type { PolicyDiagnostic } from \"@/core/policy\";\nimport type {\n DuplicateOptions,\n EditorModuleContext,\n FieldRef,\n NodeRef,\n OptionRef,\n QuantityRule,\n ServiceCheck,\n TagRef,\n WireKind,\n} from \"./editor/editor-types\";\nimport { duplicate } from \"./editor/editor-duplicate\";\nimport { addNotice, removeNotice, updateNotice } from \"./editor/editor-notices\";\nimport {\n addField,\n addOption,\n addTag,\n editLabel,\n editName,\n getNode,\n reLabel,\n remove,\n removeField,\n removeOption,\n removeTag,\n setFieldName,\n setService,\n updateField,\n updateOption,\n updateTag,\n} from \"./editor/editor-nodes\";\nimport {\n clearConstraint,\n clearConstraintOverride,\n setConstraint,\n} from \"./editor/editor-constraints\";\nimport {\n clearFieldQuantityRule,\n clearFieldValidation,\n getFieldQuantityRule,\n getFieldValidation,\n setFieldQuantityRule,\n setFieldValidation,\n} from \"./editor/editor-field-rules\";\nimport {\n connect,\n disconnect,\n exclude,\n include,\n} from \"./editor/editor-relations\";\nimport { filterServicesForVisibleGroup } from \"./editor/editor-service-filter\";\nimport { genId, uniqueId, uniqueOptionId } from \"./editor/editor-ids\";\nimport { placeNode, placeOption } from \"./editor/editor-placement\";\nimport {\n addCatalogGroup,\n addSmartCatalogGroup,\n assignServicesToCatalogGroup,\n createEmptyCatalog,\n moveCatalogNode as moveCatalogNodeState,\n removeCatalogNode as removeCatalogNodeState,\n resolveSmartCatalogGroup,\n setActiveCatalogNode as setActiveCatalogNodeState,\n setCatalogExpanded,\n setCatalogViewMode,\n setSelectedCatalogService,\n toggleCatalogExpanded,\n toggleCatalogPinned,\n updateCatalogNode as updateCatalogNodeState,\n} from \"./editor/editor-catalog\";\n\nconst MAX_LIMIT = 100;\n\nexport type { TagRef, FieldRef, OptionRef, NodeRef, DuplicateOptions };\n\nexport class Editor {\n private readonly builder: Builder;\n private readonly api: CanvasAPI;\n private readonly opts: Required<EditorOptions>;\n private history: EditorSnapshot[] = [];\n private index = -1;\n private txnDepth = 0;\n private txnLabel?: string;\n private stagedBefore?: EditorSnapshot;\n private _lastPolicyDiagnostics?: PolicyDiagnostic[];\n private catalog?: ServiceCatalogState;\n\n constructor(builder: Builder, api: CanvasAPI, opts: EditorOptions = {}) {\n this.builder = builder;\n this.api = api;\n // @ts-ignore\n this.opts = {\n ...opts,\n historyLimit: Math.max(\n 1,\n Math.min(opts.historyLimit ?? MAX_LIMIT, 1000),\n ),\n validateAfterEach: opts.validateAfterEach ?? false,\n };\n this.pushHistory(this.makeSnapshot(\"init\"));\n }\n\n isTagId(id: string) {\n return this.builder.isTagId(id);\n }\n\n isFieldId(id: string) {\n return this.builder.isFieldId(id);\n }\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);\n } else if (this.stagedBefore) {\n this.loadSnapshot(this.stagedBefore, \"undo\");\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 duplicate(ref: NodeRef, opts: DuplicateOptions = {}): string {\n return duplicate(this.moduleCtx(), ref, opts);\n }\n\n reLabel(id: string, nextLabel: string): void {\n return reLabel(this.moduleCtx(), id, nextLabel);\n }\n\n setFieldName(fieldId: string, nextName: string | null | undefined): void {\n return setFieldName(this.moduleCtx(), fieldId, nextName);\n }\n\n getLastPolicyDiagnostics(): PolicyDiagnostic[] | undefined {\n return this._lastPolicyDiagnostics;\n }\n\n placeNode(\n id: string,\n opts: {\n scopeTagId?: string;\n beforeId?: string;\n afterId?: string;\n index?: number;\n },\n ) {\n return placeNode(this.moduleCtx(), id, opts);\n }\n\n placeOption(\n optionId: string,\n opts: { beforeId?: string; afterId?: string; index?: number },\n ) {\n return placeOption(this.moduleCtx(), optionId, opts);\n }\n\n addOption(\n fieldId: string,\n input: {\n id?: string;\n label: string;\n service_id?: ServiceIdRef;\n pricing_role?: \"base\" | \"utility\" | \"addon\";\n [k: string]: any;\n },\n ): string {\n return addOption(this.moduleCtx(), fieldId, input);\n }\n\n updateOption(\n optionId: string,\n patch: Partial<\n {\n label: string;\n service_id: ServiceIdRef;\n pricing_role: \"base\" | \"utility\" | \"addon\";\n } & Record<string, any>\n >,\n ) {\n return updateOption(this.moduleCtx(), optionId, patch);\n }\n\n removeOption(optionId: string) {\n return removeOption(this.moduleCtx(), optionId);\n }\n\n editLabel(id: string, label: string): void {\n return editLabel(this.moduleCtx(), id, label);\n }\n\n editName(fieldId: string, name: string | undefined) {\n return editName(this.moduleCtx(), fieldId, name);\n }\n\n setService(\n id: string,\n input: { service_id?: ServiceIdRef; pricing_role?: \"base\" | \"utility\" },\n ): void {\n return setService(this.moduleCtx(), id, input);\n }\n\n addTag(\n partial: Omit<Tag, \"id\" | \"label\"> & { id?: string; label: string },\n ) {\n return addTag(this.moduleCtx(), partial);\n }\n\n updateTag(id: string, patch: Partial<Tag>) {\n return updateTag(this.moduleCtx(), id, patch);\n }\n\n removeTag(id: string) {\n return removeTag(this.moduleCtx(), id);\n }\n\n addNotice(input: Omit<ServicePropsNotice, \"id\"> & { id?: string }): string {\n return addNotice(this.moduleCtx(), input);\n }\n\n updateNotice(id: string, patch: Partial<ServicePropsNotice>): void {\n return updateNotice(this.moduleCtx(), id, patch);\n }\n\n removeNotice(id: string): void {\n return removeNotice(this.moduleCtx(), id);\n }\n\n addField(\n partial: Omit<Field, \"id\" | \"label\" | \"type\"> & {\n id?: string;\n label: string;\n type: Field[\"type\"];\n },\n ) {\n return addField(this.moduleCtx(), partial);\n }\n\n updateField(id: string, patch: Partial<Field>) {\n return updateField(this.moduleCtx(), id, patch);\n }\n\n removeField(id: string) {\n return removeField(this.moduleCtx(), id);\n }\n\n remove(id: string) {\n return remove(this.moduleCtx(), id);\n }\n\n getNode(id: string) {\n return getNode(this.moduleCtx(), id);\n }\n\n getFieldQuantityRule(id: string): QuantityRule | undefined {\n return getFieldQuantityRule(this.moduleCtx(), id);\n }\n\n setFieldQuantityRule(id: string, rule: unknown): void {\n return setFieldQuantityRule(this.moduleCtx(), id, rule);\n }\n\n clearFieldQuantityRule(id: string): void {\n return clearFieldQuantityRule(this.moduleCtx(), id);\n }\n\n include(receiverId: string, idOrIds: string | string[]) {\n return include(this.moduleCtx(), receiverId, idOrIds);\n }\n\n exclude(receiverId: string, idOrIds: string | string[]) {\n return exclude(this.moduleCtx(), receiverId, idOrIds);\n }\n\n connect(kind: WireKind, fromId: string, toId: string): void {\n return connect(this.moduleCtx(), kind, fromId, toId);\n }\n\n disconnect(kind: WireKind, fromId: string, toId: string): void {\n return disconnect(this.moduleCtx(), kind, fromId, toId);\n }\n\n setConstraint(tagId: string, flag: string, value: boolean | undefined) {\n return setConstraint(this.moduleCtx(), tagId, flag, value);\n }\n\n clearConstraintOverride(tagId: string, flag: string) {\n return clearConstraintOverride(this.moduleCtx(), tagId, flag);\n }\n\n clearConstraint(tagId: string, flag: string) {\n return clearConstraint(this.moduleCtx(), tagId, flag);\n }\n\n getFieldValidation(id: string): FieldValidationRule[] | undefined {\n return getFieldValidation(this.moduleCtx(), id);\n }\n\n setFieldValidation(id: string, rules: unknown): void {\n return setFieldValidation(this.moduleCtx(), id, rules);\n }\n\n clearFieldValidation(id: string): void {\n return clearFieldValidation(this.moduleCtx(), id);\n }\n\n getCatalog(): ServiceCatalogState | undefined {\n return cloneDeep(this.catalog);\n }\n\n setCatalog(next?: ServiceCatalogState): void {\n this.replaceCatalog(next, \"catalog:set\");\n }\n\n clearCatalog(): void {\n this.replaceCatalog(undefined, \"catalog:clear\");\n }\n\n ensureCatalog(): ServiceCatalogState {\n const next = this.catalog\n ? cloneDeep(this.catalog)\n : createEmptyCatalog();\n this.catalog = cloneDeep(next);\n return next;\n }\n\n createCatalogGroup(input: {\n id?: string;\n label: string;\n parentId?: string;\n description?: string;\n serviceIds?: CatalogServiceId[];\n collapsed?: boolean;\n order?: number;\n color?: string;\n icon?: string;\n }): string {\n const next = addCatalogGroup(this.catalog, input);\n this.replaceCatalog(next, \"catalog:create-group\");\n return next.activeNodeId!;\n }\n\n createSmartCatalogGroup(input: {\n id?: string;\n label: string;\n parentId?: string;\n description?: string;\n rules: CatalogSmartRule[];\n match?: \"all\" | \"any\";\n collapsed?: boolean;\n order?: number;\n color?: string;\n icon?: string;\n }): string {\n const next = addSmartCatalogGroup(this.catalog, input);\n this.replaceCatalog(next, \"catalog:create-smart-group\");\n return next.activeNodeId!;\n }\n\n updateCatalogNode(\n id: CatalogId,\n patch: Partial<Omit<CatalogNode, \"id\" | \"kind\">>,\n ): void {\n this.replaceCatalog(\n updateCatalogNodeState(this.catalog, id, patch),\n \"catalog:update-node\",\n );\n }\n\n removeCatalogNode(id: CatalogId, opts?: { cascade?: boolean }): void {\n this.replaceCatalog(\n removeCatalogNodeState(this.catalog, id, opts),\n \"catalog:remove-node\",\n );\n }\n\n moveCatalogNode(\n nodeId: CatalogId,\n opts: {\n parentId?: CatalogId;\n beforeId?: CatalogId;\n afterId?: CatalogId;\n index?: number;\n },\n ): void {\n this.replaceCatalog(\n moveCatalogNodeState(this.catalog, nodeId, opts),\n \"catalog:move-node\",\n );\n }\n\n assignServicesToCatalogGroup(\n nodeId: CatalogId,\n serviceIds: CatalogServiceId[],\n mode: \"append\" | \"replace\" | \"remove\" = \"append\",\n ): void {\n this.replaceCatalog(\n assignServicesToCatalogGroup(\n this.catalog,\n nodeId,\n serviceIds,\n mode,\n ),\n \"catalog:assign-services\",\n );\n }\n\n setActiveCatalogNode(id?: CatalogId): void {\n const next = setActiveCatalogNodeState(this.catalog, id);\n this.catalog = cloneDeep(next);\n\n this.emit(\n \"catalog:active-change\" as any,\n {\n activeNodeId: id,\n } as any,\n );\n\n this.emit(\n \"catalog:change\" as any,\n {\n catalog: cloneDeep(this.catalog),\n reason: \"catalog:set-active\",\n } as any,\n );\n }\n\n setCatalogViewMode(mode: ServiceCatalogState[\"viewMode\"]): void {\n this.replaceCatalog(\n setCatalogViewMode(this.catalog, mode),\n \"catalog:set-view-mode\",\n );\n }\n\n setSelectedCatalogService(serviceId?: CatalogServiceId): void {\n this.replaceCatalog(\n setSelectedCatalogService(this.catalog, serviceId),\n \"catalog:set-selected-service\",\n );\n }\n\n toggleCatalogExpanded(id: CatalogId): void {\n this.replaceCatalog(\n toggleCatalogExpanded(this.catalog, id),\n \"catalog:toggle-expanded\",\n );\n }\n\n setCatalogExpanded(id: CatalogId, expanded: boolean): void {\n this.replaceCatalog(\n setCatalogExpanded(this.catalog, id, expanded),\n \"catalog:set-expanded\",\n );\n }\n\n toggleCatalogPinned(id: CatalogId): void {\n this.replaceCatalog(\n toggleCatalogPinned(this.catalog, id),\n \"catalog:toggle-pinned\",\n );\n }\n\n resolveSmartCatalogGroup(\n nodeId: CatalogId,\n candidates: CatalogServiceId[],\n matchers: {\n serviceField?: (\n candidate: CatalogServiceId,\n rule: Extract<CatalogSmartRule, { type: \"service-field\" }>,\n ) => boolean;\n policyFamily?: (\n candidate: CatalogServiceId,\n rule: Extract<CatalogSmartRule, { type: \"policy-family\" }>,\n ) => boolean;\n compatibility?: (\n candidate: CatalogServiceId,\n rule: Extract<CatalogSmartRule, { type: \"compatibility\" }>,\n ) => boolean;\n },\n ): CatalogServiceId[] {\n const next = resolveSmartCatalogGroup(\n this.catalog,\n nodeId,\n candidates,\n matchers,\n );\n\n this.replaceCatalog(next, \"catalog:resolve-smart-group\");\n\n const node = next?.nodes.find(\n (x) => x.id === nodeId && x.kind === \"smart-group\",\n ) as Extract<CatalogNode, { kind: \"smart-group\" }> | undefined;\n\n return node?.resolvedServiceIds?.slice() ?? [];\n }\n\n private replaceCatalog(\n next: ServiceCatalogState | undefined,\n reason = \"catalog:set\",\n ) {\n this.catalog = cloneDeep(next);\n this.emit(\n \"catalog:change\" as any,\n {\n catalog: cloneDeep(this.catalog),\n snapshot: this.makeSnapshot(reason),\n reason,\n } as any,\n );\n }\n private replaceProps(next: ServiceProps): void {\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;\n const snap = this.makeSnapshot(command);\n this.pushHistory(snap);\n this.emit(\"editor:command\", { name: command });\n if (this.opts.validateAfterEach) {\n this.emit(\"editor:change\", {\n props: snap.props,\n reason: \"validate\",\n command,\n snapshot: snap,\n });\n } else {\n this.emit(\"editor:change\", {\n props: snap.props,\n reason: \"mutation\",\n command,\n snapshot: snap,\n });\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 snapshot: snap,\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 catalog: cloneDeep(this.catalog),\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 }\n } else {\n this.api.refreshGraph();\n }\n this.emit(\"editor:change\", { props: s.props, reason, snapshot: s });\n }\n\n private pushHistory(snap: EditorSnapshot) {\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 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 private emit<K extends keyof (EditorEvents & any)>(\n event: K,\n payload: (EditorEvents & any)[K],\n ) {\n this.api.emit(event as any, payload as any);\n }\n\n public filterServicesForVisibleGroup(\n candidates: Array<number | string>,\n ctx: {\n tagId: string;\n selectedButtons?: 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 return filterServicesForVisibleGroup(this.moduleCtx(), candidates, ctx);\n }\n\n private moduleCtx(): EditorModuleContext {\n return {\n builder: this.builder,\n api: this.api,\n opts: this.opts,\n getProps: () => this.builder.getProps(),\n isTagId: (id) => this.isTagId(id),\n isFieldId: (id) => this.isFieldId(id),\n isOptionId: (id) => this.isOptionId(id),\n transact: (label, fn) => this.transact(label, fn),\n exec: (cmd) => this.exec(cmd),\n undo: () => this.undo(),\n patchProps: (mut) => this.patchProps(mut),\n replaceProps: (next) => this.replaceProps(next),\n emit: (event, payload) => this.emit(event, payload),\n makeSnapshot: (why) => this.makeSnapshot(why),\n loadSnapshot: (s, reason) => this.loadSnapshot(s, reason),\n getNode: (id) => getNode(this.moduleCtx(), id),\n uniqueId: (base) => uniqueId(this.moduleCtx(), base),\n uniqueOptionId: (fieldId, base) =>\n uniqueOptionId(this.moduleCtx(), fieldId, base),\n genId: (prefix) => genId(this.moduleCtx(), prefix as any),\n setLastPolicyDiagnostics: (value) => {\n this._lastPolicyDiagnostics = value;\n },\n };\n }\n}\n","// src/core/normalise.ts\n\nimport { cloneDeep } from \"lodash-es\";\nimport type {\n Field,\n FieldOption,\n FieldValidationRule,\n PricingRole,\n ServiceFallback,\n ServiceIdRef,\n ServiceProps,\n ServicePropsNotice,\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 const notices = toNoticeArray((obj as any).notices);\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 ...(notices.length > 0 && { notices }),\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 = toServiceIdOrUndefined(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 const validation = normalizeFieldValidation(src.validation);\n\n // field-level service_id is allowed only for *buttons* with base role\n const field_service_id_raw = toServiceIdOrUndefined(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 ...(validation && { validation }),\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 = toServiceIdOrUndefined(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 toNoticeArray(v: any): ServicePropsNotice[] {\n if (!Array.isArray(v)) return [];\n return v\n .filter((item) => item && typeof item === \"object\")\n .map((item) => cloneDeep(item as ServicePropsNotice));\n}\n\nfunction toServiceIdOrUndefined(v: any): ServiceIdRef | undefined {\n if (v === null || v === undefined) return undefined;\n if (typeof v === \"number\") {\n return Number.isFinite(v) ? v : undefined;\n }\n if (typeof v === \"string\") {\n const trimmed = v.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n return 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\n\nfunction normalizeFieldValidationRule(\n input: unknown,\n): FieldValidationRule | undefined {\n if (!input || typeof input !== \"object\") return undefined;\n const v = input as any;\n\n const op = v.op;\n if (\n op !== \"eq\" &&\n op !== \"neq\" &&\n op !== \"gt\" &&\n op !== \"gte\" &&\n op !== \"lt\" &&\n op !== \"lte\" &&\n op !== \"between\" &&\n op !== \"in\" &&\n op !== \"nin\" &&\n op !== \"truthy\" &&\n op !== \"falsy\" &&\n op !== \"match\"\n ) {\n return undefined;\n }\n\n const valueBy =\n v.valueBy === \"value\" || v.valueBy === \"length\" || v.valueBy === \"eval\"\n ? v.valueBy\n : undefined;\n\n const out: FieldValidationRule = {\n op,\n ...(valueBy ? { valueBy } : {}),\n };\n\n if (\"value\" in v) out.value = v.value;\n if (typeof v.min === \"number\" && Number.isFinite(v.min)) out.min = v.min;\n if (typeof v.max === \"number\" && Number.isFinite(v.max)) out.max = v.max;\n if (Array.isArray(v.values)) out.values = [...v.values];\n if (typeof v.pattern === \"string\" && v.pattern.trim()) out.pattern = v.pattern;\n if (typeof v.flags === \"string\") out.flags = v.flags;\n if (typeof v.message === \"string\" && v.message.trim()) out.message = v.message;\n\n if (valueBy === \"eval\" && typeof v.code === \"string\" && v.code.trim()) {\n out.code = v.code;\n }\n\n return out;\n}\n\nexport function normalizeFieldValidation(\n input: unknown,\n): FieldValidationRule[] | undefined {\n if (Array.isArray(input)) {\n const rules = input\n .map(normalizeFieldValidationRule)\n .filter(Boolean) as FieldValidationRule[];\n return rules.length ? rules : undefined;\n }\n\n const one = normalizeFieldValidationRule(input);\n return one ? [one] : undefined;\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 invalidRateFieldIds: Set<string>;\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 isServiceIdRef(v: unknown): v is import(\"@/schema\").ServiceIdRef {\n return (\n (typeof v === \"string\" && v.trim().length > 0) ||\n (typeof v === \"number\" && Number.isFinite(v))\n );\n}\n\nexport function hasAnyServiceOption(f: Field): boolean {\n return (f.options ?? []).some((o) => isServiceIdRef(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 { isServiceIdRef, 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 (!isServiceIdRef(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, isServiceIdRef, 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 = isServiceIdRef(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","import type {\n DgpServiceCapability,\n DgpServiceMap,\n ServiceIdRef,\n} from \"@/schema\";\nimport type { FallbackSettings, RatePolicy } from \"@/schema/validation\";\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(\n svcMap: DgpServiceMap,\n candidate: ServiceIdRef,\n constraints: Partial<Record<\"refill\" | \"cancel\" | \"dripfeed\", boolean>>,\n): boolean {\n const cap = getServiceCapability(svcMap, candidate);\n if (!cap) return false;\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}\n\nexport function getServiceCapability(\n svcMap: DgpServiceMap,\n candidate: ServiceIdRef | undefined,\n): DgpServiceCapability | undefined {\n if (candidate === undefined || candidate === null) return undefined;\n\n const direct = (svcMap as any)[candidate] as DgpServiceCapability | undefined;\n if (direct) return direct;\n\n const byString = (svcMap as any)[String(candidate)] as\n | DgpServiceCapability\n | undefined;\n if (byString) return byString;\n\n if (typeof candidate === \"string\") {\n const maybeNumber = Number(candidate);\n if (Number.isFinite(maybeNumber)) {\n return (svcMap as any)[maybeNumber] as DgpServiceCapability | undefined;\n }\n }\n\n return undefined;\n}\n\nexport function normalizeRatePolicy(policy: RatePolicy | undefined): RatePolicy {\n if (!policy) return { kind: \"lte_primary\", pct: 5 };\n if (policy.kind === \"eq_primary\") return policy;\n const pct = Math.max(0, Number(policy.pct ?? 0));\n return { ...policy, pct };\n}\n\nexport function passesRatePolicy(\n policy: RatePolicy | undefined,\n primaryRate: number,\n candidateRate: number,\n): boolean {\n if (!Number.isFinite(primaryRate) || !Number.isFinite(candidateRate)) {\n return false;\n }\n\n const rp = normalizeRatePolicy(policy);\n switch (rp.kind) {\n case \"eq_primary\":\n return candidateRate === primaryRate;\n case \"lte_primary\": {\n const floor = primaryRate * (1 - rp.pct / 100);\n return candidateRate <= primaryRate && candidateRate >= floor;\n }\n case \"within_pct\":\n return candidateRate <= primaryRate * (1 + rp.pct / 100);\n case \"at_least_pct_lower\":\n return candidateRate <= primaryRate * (1 - rp.pct / 100);\n }\n}\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(\n svcMap: DgpServiceMap,\n candidate: ServiceIdRef,\n primary: ServiceIdRef,\n policy: FallbackSettings,\n): boolean {\n const cand = getServiceCapability(svcMap, candidate);\n const prim = getServiceCapability(svcMap, primary);\n if (!cand || !prim) return false;\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 return passesRatePolicy(policy.ratePolicy, pRate, cRate);\n}\n","// src/core/validate/steps/rates.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { isServiceIdRef, withAffected } from \"../shared\";\nimport { isMultiField } from \"@/utils\";\nimport {\n getServiceCapability,\n normalizeRatePolicy,\n passesRatePolicy,\n} from \"@/utils/util\";\n\nexport function validateRates(v: ValidationCtx): void {\n const ratePolicy = normalizeRatePolicy(\n v.options.fallbackSettings?.ratePolicy,\n );\n\n for (const f of v.fields) {\n if (!isMultiField(f)) continue;\n\n const baseRates: Array<{ optionId: string; serviceId: string; rate: number }> =\n [];\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 (!isServiceIdRef(sid)) continue;\n\n const cap = getServiceCapability(v.serviceMap, sid);\n const rate = cap?.rate;\n if (typeof rate === \"number\" && Number.isFinite(rate)) {\n baseRates.push({\n optionId: o.id,\n serviceId: String(sid),\n rate,\n });\n }\n }\n\n if (baseRates.length <= 1) continue;\n\n const primary = baseRates.reduce((best, current) =>\n current.rate > best.rate ? current : best,\n );\n\n const offenders = baseRates.filter(\n (candidate) =>\n candidate.optionId !== primary.optionId &&\n !passesRatePolicy(ratePolicy, primary.rate, candidate.rate),\n );\n\n if (offenders.length > 0) {\n v.invalidRateFieldIds.add(f.id);\n const affectedIds: string[] = [\n f.id,\n ...baseRates.map((entry) => entry.optionId),\n ];\n\n v.errors.push({\n code: \"rate_mismatch_across_base\",\n severity: \"error\",\n message: `Base options under field \"${f.id}\" violate rate policy \"${ratePolicy.kind}\".`,\n nodeId: f.id,\n details: withAffected(\n {\n fieldId: f.id,\n policy: ratePolicy.kind,\n policyPct: \"pct\" in ratePolicy ? ratePolicy.pct : undefined,\n primaryOptionId: primary.optionId,\n primaryRate: primary.rate,\n rates: baseRates.map((entry) => entry.rate),\n optionIds: baseRates.map((entry) => entry.optionId),\n offenderOptionIds: offenders.map((entry) => entry.optionId),\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 isServiceIdRef,\n isServiceFlagEnabled,\n withAffected, // <-- your helper (adjust name/import if you named it differently)\n} from \"../shared\";\nimport { getServiceCapability } from \"@/utils/util\";\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 (!isServiceIdRef(o.service_id)) continue;\n\n const svc: unknown = getServiceCapability(v.serviceMap, 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 (!isServiceIdRef(sid)) continue;\n\n const svc: unknown = getServiceCapability(v.serviceMap, 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 { isServiceIdRef } 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 (!isServiceIdRef(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/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\";\nimport {cloneDeep} from \"lodash-es\";\n\n/** Options you can set on the builder (used for validation/visibility) */\nexport type BuilderOptions = Omit<ValidatorOptions, \"serviceMap\"> & {\n serviceMap?: DgpServiceMap;\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 /** 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 _nodemap: NodeMap | null = null;\n\n constructor(opts: BuilderOptions = {}) {\n this.options = { ...opts };\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.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 getOptions() {\n return cloneDeep(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 /* ───── 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\n/* ───────────────────────── helpers ───────────────────────── */\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","import type {\n DgpServiceMap,\n Field,\n PricingRole,\n ServiceIdRef,\n ServiceProps,\n Tag,\n} from \"@/schema\";\nimport type { RatePolicy } from \"@/schema/validation\";\nimport { Builder } from \"./builder\";\nimport {\n getServiceCapability,\n normalizeRatePolicy,\n passesRatePolicy,\n} from \"@/utils/util\";\nimport { isMultiField } from \"@/utils\";\n\ntype BaseMember = {\n kind: \"field\" | \"option\";\n id: string;\n fieldId: string;\n label?: string;\n service_id: ServiceIdRef;\n rate: number;\n};\n\ntype FieldReference = {\n refKind: \"single\" | \"multi\";\n nodeId: string;\n fieldId: string;\n label?: string;\n rate: number;\n service_id?: ServiceIdRef;\n members: BaseMember[];\n};\n\ntype Anchor = {\n kind: \"field\" | \"option\";\n id: string;\n fieldId: string;\n label?: string;\n};\n\ntype SimulationAnchor = {\n kind: \"field\" | \"option\";\n id: string;\n fieldId: string;\n label?: string;\n};\n\ntype SharedDiagnostic = {\n scope: \"visible_group\";\n tagId: string;\n nodeId: string;\n message: string;\n simulationAnchor?: SimulationAnchor;\n invalidFieldIds: string[];\n};\n\nexport type RateCoherenceDiagnostic =\n | (SharedDiagnostic & {\n kind: \"contextual\";\n primary: {\n nodeId: string;\n fieldId: string;\n label?: string;\n refKind: \"single\" | \"multi\";\n service_id?: ServiceIdRef;\n rate: number;\n };\n offender: {\n nodeId: string;\n fieldId: string;\n label?: string;\n refKind: \"single\" | \"multi\";\n service_id?: ServiceIdRef;\n rate: number;\n };\n policy: RatePolicy[\"kind\"];\n policyPct?: number;\n })\n | (SharedDiagnostic & {\n kind: \"internal_field\";\n fieldId: string;\n });\n\nexport function validateRateCoherenceDeep(params: {\n builder: Builder;\n services: DgpServiceMap;\n tagId: string;\n ratePolicy?: RatePolicy;\n invalidFieldIds?: Iterable<string>;\n}): RateCoherenceDiagnostic[] {\n const { builder, services, tagId } = params;\n const ratePolicy = normalizeRatePolicy(params.ratePolicy);\n const props = builder.getProps() as ServiceProps;\n const invalidFieldIds = new Set(params.invalidFieldIds ?? []);\n\n const fields = props.fields ?? [];\n const fieldById = new Map(fields.map((f) => [f.id, f]));\n const tagById = new Map((props.filters ?? []).map((t) => [t.id, t]));\n const tag = tagById.get(tagId);\n\n const baselineFieldIds = builder.visibleFields(tagId, []);\n const baselineFields = baselineFieldIds\n .map((fid) => fieldById.get(fid))\n .filter(Boolean) as Field[];\n\n const anchors = collectAnchors(baselineFields);\n const diagnostics: RateCoherenceDiagnostic[] = [];\n const seen = new Set<string>();\n\n for (const anchor of anchors) {\n const selectedKeys =\n anchor.kind === \"option\"\n ? [`${anchor.fieldId}::${anchor.id}`]\n : [anchor.fieldId];\n\n const visibleFields = builder\n .visibleFields(tagId, selectedKeys)\n .map((fid) => fieldById.get(fid))\n .filter(Boolean) as Field[];\n\n const visibleInvalidFieldIds = visibleFields\n .map((field) => field.id)\n .filter((fieldId) => invalidFieldIds.has(fieldId));\n\n for (const fieldId of visibleInvalidFieldIds) {\n const key = `internal|${tagId}|${fieldId}`;\n if (seen.has(key)) continue;\n seen.add(key);\n diagnostics.push({\n kind: \"internal_field\",\n scope: \"visible_group\",\n tagId,\n fieldId,\n nodeId: fieldId,\n message: `Field \"${fieldId}\" is internally invalid under rate policy \"${ratePolicy.kind}\".`,\n simulationAnchor: {\n kind: anchor.kind,\n id: anchor.id,\n fieldId: anchor.fieldId,\n label: anchor.label,\n },\n invalidFieldIds: [fieldId],\n });\n }\n\n const references = visibleFields.flatMap((field) =>\n collectFieldReferences(field, services),\n );\n if (references.length <= 1) continue;\n\n const primary = references.reduce((best, current) => {\n if (current.rate !== best.rate) {\n return current.rate > best.rate ? current : best;\n }\n const bestKey = `${best.fieldId}|${best.nodeId}`;\n const currentKey = `${current.fieldId}|${current.nodeId}`;\n return currentKey < bestKey ? current : best;\n });\n\n for (const candidate of references) {\n if (candidate.nodeId === primary.nodeId) continue;\n if (candidate.fieldId === primary.fieldId) continue;\n if (passesRatePolicy(ratePolicy, primary.rate, candidate.rate)) {\n continue;\n }\n\n const key = contextualKey(tagId, primary, candidate, ratePolicy);\n if (seen.has(key)) continue;\n seen.add(key);\n\n diagnostics.push({\n kind: \"contextual\",\n scope: \"visible_group\",\n tagId,\n nodeId: candidate.nodeId,\n primary: toDiagnosticRef(primary),\n offender: toDiagnosticRef(candidate),\n policy: ratePolicy.kind,\n policyPct: \"pct\" in ratePolicy ? ratePolicy.pct : undefined,\n message: explainRateMismatch(\n ratePolicy,\n primary,\n candidate,\n describeLabel(tag),\n ),\n simulationAnchor: {\n kind: anchor.kind,\n id: anchor.id,\n fieldId: anchor.fieldId,\n label: anchor.label,\n },\n invalidFieldIds: visibleInvalidFieldIds,\n });\n }\n }\n\n return diagnostics;\n}\n\nfunction collectAnchors(fields: Field[]): Anchor[] {\n const anchors: Anchor[] = [];\n\n for (const field of fields) {\n if (!isButton(field)) continue;\n\n if (Array.isArray(field.options) && field.options.length > 0) {\n for (const option of field.options) {\n anchors.push({\n kind: \"option\",\n id: option.id,\n fieldId: field.id,\n label: option.label ?? option.id,\n });\n }\n continue;\n }\n\n anchors.push({\n kind: \"field\",\n id: field.id,\n fieldId: field.id,\n label: field.label ?? field.id,\n });\n }\n\n return anchors;\n}\n\nfunction collectFieldReferences(\n field: Field,\n services: DgpServiceMap,\n): FieldReference[] {\n const members = collectBaseMembers(field, services);\n if (members.length === 0) return [];\n\n if (isMultiField(field)) {\n const averageRate =\n members.reduce((sum, member) => sum + member.rate, 0) /\n members.length;\n return [\n {\n refKind: \"multi\",\n nodeId: field.id,\n fieldId: field.id,\n label: field.label ?? field.id,\n rate: averageRate,\n members,\n },\n ];\n }\n\n return members.map((member) => ({\n refKind: \"single\",\n nodeId: member.id,\n fieldId: field.id,\n label: member.label,\n rate: member.rate,\n service_id: member.service_id,\n members: [member],\n }));\n}\n\nfunction collectBaseMembers(\n field: Field,\n services: DgpServiceMap,\n): BaseMember[] {\n const members: BaseMember[] = [];\n\n if (Array.isArray(field.options) && field.options.length > 0) {\n for (const option of field.options) {\n const role = normalizeRole(option.pricing_role ?? field.pricing_role, \"base\");\n if (role !== \"base\") continue;\n if (option.service_id === undefined || option.service_id === null) {\n continue;\n }\n const cap = getServiceCapability(services, option.service_id);\n if (!cap || typeof cap.rate !== \"number\" || !Number.isFinite(cap.rate)) {\n continue;\n }\n members.push({\n kind: \"option\",\n id: option.id,\n fieldId: field.id,\n label: option.label ?? option.id,\n service_id: option.service_id,\n rate: cap.rate,\n });\n }\n return members;\n }\n\n const role = normalizeRole(field.pricing_role, \"base\");\n if (role !== \"base\") return members;\n if (field.service_id === undefined || field.service_id === null) return members;\n\n const cap = getServiceCapability(services, field.service_id);\n if (!cap || typeof cap.rate !== \"number\" || !Number.isFinite(cap.rate)) {\n return members;\n }\n\n members.push({\n kind: \"field\",\n id: field.id,\n fieldId: field.id,\n label: field.label ?? field.id,\n service_id: field.service_id,\n rate: cap.rate,\n });\n return members;\n}\n\nfunction isButton(field: Field): boolean {\n if ((field as any).button === true) return true;\n return Array.isArray(field.options) && field.options.length > 0;\n}\n\nfunction normalizeRole(\n role: PricingRole | undefined,\n fallback: PricingRole,\n): PricingRole {\n return role === \"base\" || role === \"utility\" ? role : fallback;\n}\n\nfunction toDiagnosticRef(reference: FieldReference) {\n return {\n nodeId: reference.nodeId,\n fieldId: reference.fieldId,\n label: reference.label,\n refKind: reference.refKind,\n service_id: reference.service_id,\n rate: reference.rate,\n };\n}\n\nfunction contextualKey(\n tagId: string,\n primary: FieldReference,\n candidate: FieldReference,\n ratePolicy: RatePolicy,\n): string {\n const pctKey = \"pct\" in ratePolicy ? `:${ratePolicy.pct}` : \"\";\n return [\n \"contextual\",\n tagId,\n primary.fieldId,\n primary.nodeId,\n candidate.fieldId,\n candidate.nodeId,\n `${ratePolicy.kind}${pctKey}`,\n ].join(\"|\");\n}\n\nfunction describeLabel(tag?: Tag): string {\n return tag?.label ?? tag?.id ?? \"tag\";\n}\n\nfunction explainRateMismatch(\n policy: RatePolicy,\n primary: FieldReference,\n candidate: FieldReference,\n where: string,\n): string {\n const primaryLabel = `${primary.label ?? primary.nodeId} (${primary.rate})`;\n const candidateLabel = `${candidate.label ?? candidate.nodeId} (${candidate.rate})`;\n\n switch (policy.kind) {\n case \"eq_primary\":\n return `Rate coherence failed (${where}): ${candidateLabel} must exactly match ${primaryLabel}.`;\n case \"lte_primary\":\n return `Rate coherence failed (${where}): ${candidateLabel} must stay within ${policy.pct}% below and never above ${primaryLabel}.`;\n case \"within_pct\":\n return `Rate coherence failed (${where}): ${candidateLabel} must be within ${policy.pct}% of ${primaryLabel}.`;\n case \"at_least_pct_lower\":\n return `Rate coherence failed (${where}): ${candidateLabel} must be at least ${policy.pct}% lower than ${primaryLabel}.`;\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\";\nimport { createBuilder } from \"@/core/builder\";\nimport { validateRateCoherenceDeep } from \"@/core/rate-coherence\";\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 invalidRateFieldIds: new Set<string>(),\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 if (Object.keys(serviceMap).length > 0 && tags.length > 0) {\n const builder = createBuilder({ serviceMap });\n builder.load(props);\n\n for (const tag of tags) {\n const diags = validateRateCoherenceDeep({\n builder,\n services: serviceMap,\n tagId: tag.id,\n ratePolicy: ctx.fallbackSettings?.ratePolicy,\n invalidFieldIds: v.invalidRateFieldIds,\n });\n\n for (const diag of diags) {\n if (diag.kind !== \"contextual\") continue;\n errors.push({\n code: \"rate_coherence_violation\",\n severity: \"error\",\n message: diag.message,\n nodeId: diag.nodeId,\n details: {\n tagId: diag.tagId,\n simulationAnchor: diag.simulationAnchor,\n primary: diag.primary,\n offender: diag.offender,\n policy: diag.policy,\n policyPct: diag.policyPct,\n invalidFieldIds: diag.invalidFieldIds,\n },\n });\n }\n }\n }\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/utils/fallback.ts\r\nimport type {\r\n ServiceProps,\r\n ServiceFallback,\r\n ServiceIdRef,\r\n NodeIdRef,\r\n} from \"@/schema\";\r\nimport type { DgpServiceCapability, DgpServiceMap } from \"@/schema/provider\";\nimport type { FallbackSettings } from \"@/schema/validation\";\nimport {\n getServiceCapability,\n normalizeRatePolicy,\n passesRatePolicy,\n} from \"@/utils/util\";\n\r\nexport type FailedFallbackContext = {\r\n scope: \"node\" | \"global\";\r\n nodeId?: string; // when scope='node'\r\n primary: ServiceIdRef;\r\n candidate: ServiceIdRef;\r\n tagContext?: string; // tag.id when evaluating constraints\r\n reason:\r\n | \"unknown_service\"\r\n | \"no_primary\"\r\n | \"rate_violation\"\r\n | \"constraint_mismatch\"\r\n | \"cycle\"\r\n | \"no_tag_context\";\r\n details?: Record<string, unknown>;\r\n};\r\n\r\nconst DEFAULT_SETTINGS: Required<FallbackSettings> = {\n requireConstraintFit: true,\n ratePolicy: { kind: \"lte_primary\", pct: 5 },\n selectionStrategy: \"priority\",\n mode: \"strict\",\n};\n\r\nexport function resolveServiceFallback(params: {\r\n primary: ServiceIdRef;\r\n nodeId?: NodeIdRef; // prefer node-scoped first if provided\r\n tagId?: string; // constraints context (if known)\r\n services: DgpServiceMap;\r\n fallbacks?: ServiceFallback;\r\n settings?: FallbackSettings;\r\n props: ServiceProps;\r\n}): ServiceIdRef | null {\r\n const s = { ...DEFAULT_SETTINGS, ...(params.settings ?? {}) };\r\n const { primary, nodeId, tagId, services } = params;\r\n const fb = params.fallbacks ?? {};\r\n const tried: ServiceIdRef[] = [];\r\n\r\n const lists: ServiceIdRef[][] = [];\r\n if (nodeId && fb.nodes?.[nodeId]) lists.push(fb.nodes[nodeId]);\r\n if (fb.global?.[primary]) lists.push(fb.global[primary]);\r\n\r\n const primaryRate = rateOf(services, primary);\r\n\r\n for (const list of lists) {\r\n for (const cand of list) {\r\n if (tried.includes(cand)) continue;\r\n tried.push(cand);\r\n\r\n const candCap = services[Number(cand)] ?? services[cand as any];\r\n if (!candCap) continue;\r\n\r\n if (!passesRate(s.ratePolicy, primaryRate, candCap.rate)) continue;\r\n if (s.requireConstraintFit && tagId) {\r\n const ok = satisfiesTagConstraints(tagId, params, candCap);\r\n if (!ok) continue;\r\n }\r\n return cand;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nexport function collectFailedFallbacks(\r\n props: ServiceProps,\r\n services: DgpServiceMap,\r\n settings?: FallbackSettings,\r\n): FailedFallbackContext[] {\r\n const s = { ...DEFAULT_SETTINGS, ...(settings ?? {}) };\r\n const out: FailedFallbackContext[] = [];\r\n const fb = props.fallbacks ?? {};\r\n const primaryRate = (p: ServiceIdRef) => rateOf(services, p);\r\n\r\n // Node-scoped (tags or options)\r\n for (const [nodeId, list] of Object.entries(fb.nodes ?? {})) {\r\n const { primary, tagContexts } = primaryForNode(props, nodeId);\r\n if (!primary) {\r\n out.push({\r\n scope: \"node\",\r\n nodeId,\r\n primary: \"\" as any,\r\n candidate: \"\" as any,\r\n reason: \"no_primary\",\r\n });\r\n continue;\r\n }\r\n for (const cand of list) {\r\n const cap = getCap(services, cand);\r\n if (!cap) {\r\n out.push({\r\n scope: \"node\",\r\n nodeId,\r\n primary,\r\n candidate: cand,\r\n reason: \"unknown_service\",\r\n });\r\n continue;\r\n }\r\n if (String(cand) === String(primary)) {\r\n out.push({\r\n scope: \"node\",\r\n nodeId,\r\n primary,\r\n candidate: cand,\r\n reason: \"cycle\",\r\n });\r\n continue;\r\n }\r\n if (!passesRate(s.ratePolicy, primaryRate(primary), cap.rate)) {\r\n out.push({\r\n scope: \"node\",\r\n nodeId,\r\n primary,\r\n candidate: cand,\r\n reason: \"rate_violation\",\r\n });\r\n continue;\r\n }\r\n // Tag contexts\r\n if (tagContexts.length === 0) {\r\n out.push({\r\n scope: \"node\",\r\n nodeId,\r\n primary,\r\n candidate: cand,\r\n reason: \"no_tag_context\",\r\n });\r\n continue;\r\n }\r\n let anyPass = false;\r\n let anyFail = false;\r\n for (const tagId of tagContexts) {\r\n const ok = s.requireConstraintFit\r\n ? satisfiesTagConstraints(tagId, { services, props }, cap)\r\n : true;\r\n if (ok) anyPass = true;\r\n else {\r\n anyFail = true;\r\n out.push({\r\n scope: \"node\",\r\n nodeId,\r\n primary,\r\n candidate: cand,\r\n tagContext: tagId,\r\n reason: \"constraint_mismatch\",\r\n });\r\n }\r\n }\r\n // If none passed, we already added per-context mismatches above\r\n void anyPass;\r\n void anyFail;\r\n }\r\n }\r\n\r\n // Global (soft; no tag context)\r\n for (const [primary, list] of Object.entries(fb.global ?? {})) {\r\n for (const cand of list) {\r\n const cap = getCap(services, cand);\r\n if (!cap) {\r\n out.push({\r\n scope: \"global\",\r\n primary,\r\n candidate: cand,\r\n reason: \"unknown_service\",\r\n });\r\n continue;\r\n }\r\n if (String(cand) === String(primary)) {\r\n out.push({\r\n scope: \"global\",\r\n primary,\r\n candidate: cand,\r\n reason: \"cycle\",\r\n });\r\n continue;\r\n }\r\n if (!passesRate(s.ratePolicy, primaryRate(primary), cap.rate)) {\r\n out.push({\r\n scope: \"global\",\r\n primary,\r\n candidate: cand,\r\n reason: \"rate_violation\",\r\n });\r\n }\r\n }\r\n }\r\n return out;\r\n}\r\n\r\n/* ───────────────────────── helpers ───────────────────────── */\r\n\r\nfunction rateOf(\r\n map: DgpServiceMap,\r\n id: ServiceIdRef | undefined,\r\n): number | undefined {\r\n if (id === undefined || id === null) return undefined;\r\n const c = getCap(map, id);\r\n return c?.rate ?? undefined;\r\n}\r\n\r\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 return passesRatePolicy(normalizeRatePolicy(policy), primaryRate, candRate);\n}\n\nfunction getCap(\n map: DgpServiceMap,\n id: ServiceIdRef,\n): DgpServiceCapability | undefined {\n return getServiceCapability(map, id);\n}\n\r\nfunction isCapFlagEnabled(cap: DgpServiceCapability, flagId: string): boolean {\r\n // New structure: flags[flagId].enabled\r\n const fromFlags: boolean | undefined = cap.flags?.[flagId]?.enabled;\r\n if (fromFlags === true) return true;\r\n if (fromFlags === false) return false;\r\n\r\n // Soft-compat during migration: if legacy boolean exists on cap, respect it.\r\n const legacy: unknown = (cap as any)[flagId];\r\n return legacy === true;\r\n}\r\n\r\nfunction satisfiesTagConstraints(\r\n tagId: string,\r\n ctx: Readonly<{ props: ServiceProps; services: DgpServiceMap }>,\r\n cap: DgpServiceCapability,\r\n): boolean {\r\n const tag = ctx.props.filters.find((t) => t.id === tagId);\r\n const eff: Record<string, unknown> | undefined = tag?.constraints as any; // effective constraints (propagated)\r\n if (!eff) return true;\r\n\r\n // Enforce only keys explicitly set TRUE at the tag; false/undefined => no requirement.\r\n for (const [key, value] of Object.entries(eff)) {\r\n if (value === true && !isCapFlagEnabled(cap, key)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nfunction primaryForNode(\r\n props: ServiceProps,\r\n nodeId: string,\r\n): {\r\n primary?: ServiceIdRef;\r\n tagContexts: string[];\r\n reasonNoPrimary?: string;\r\n} {\r\n // Tag node?\r\n const tag = props.filters.find((t) => t.id === nodeId);\r\n if (tag) {\r\n return { primary: tag.service_id as any, tagContexts: [tag.id] };\r\n }\r\n // Option node: locate its parent field\r\n const field = props.fields.find(\r\n (f) =>\r\n Array.isArray(f.options) && f.options.some((o) => o.id === nodeId),\r\n );\r\n if (!field) return { tagContexts: [], reasonNoPrimary: \"no_parent_field\" };\r\n const opt = field.options!.find((o) => o.id === nodeId)!;\r\n const contexts = bindIdsToArray(field.bind_id);\r\n return { primary: opt.service_id as any, tagContexts: contexts };\r\n}\r\n\r\nfunction bindIdsToArray(bind: string | string[] | undefined): string[] {\r\n if (!bind) return [];\r\n return Array.isArray(bind) ? bind.slice() : [bind];\r\n}\r\n\r\n/**\r\n * Return all fallback candidates that are eligible for the given primary,\r\n * respecting:\r\n * - node-scoped list first (if nodeId provided), then global list for `primary`\r\n * - rate policy vs. primary\r\n * - (optional) tag constraint fit, only when tagId is provided and requireConstraintFit=true\r\n * - excludes (including primary automatically)\r\n * - selectionStrategy: 'priority' keeps list order, 'cheapest' sorts by rate asc\r\n * - unique (dedupe) and optional limit\r\n */\r\nexport function getEligibleFallbacks(params: {\r\n primary: ServiceIdRef;\r\n nodeId?: NodeIdRef; // prefer node-scoped list first\r\n tagId?: string; // constraints context (if known)\r\n services: DgpServiceMap;\r\n fallbacks?: ServiceFallback;\r\n settings?: FallbackSettings;\r\n props: ServiceProps;\r\n exclude?: Array<ServiceIdRef>; // additional ids to ignore\r\n unique?: boolean; // default true\r\n limit?: number; // optional cap\r\n}): ServiceIdRef[] {\r\n const s = { ...DEFAULT_SETTINGS, ...(params.settings ?? {}) };\r\n const { primary, nodeId, tagId, services } = params;\r\n const fb = params.fallbacks ?? {};\r\n const excludes = new Set<string>((params.exclude ?? []).map(String));\r\n excludes.add(String(primary)); // never return the primary itself\r\n const unique = params.unique ?? true;\r\n\r\n // Gather source lists: node → global\r\n const lists: ServiceIdRef[][] = [];\r\n if (nodeId && fb.nodes?.[nodeId]) lists.push(fb.nodes[nodeId]);\r\n if (fb.global?.[primary]) lists.push(fb.global[primary]);\r\n\r\n if (!lists.length) return [];\r\n\r\n const primaryRate = rateOf(services, primary);\r\n const seen = new Set<string>();\r\n const eligible: ServiceIdRef[] = [];\r\n\r\n for (const list of lists) {\r\n for (const cand of list) {\r\n const key = String(cand);\r\n if (excludes.has(key)) continue;\r\n if (unique && seen.has(key)) continue;\r\n seen.add(key);\r\n\r\n const cap = getCap(services, cand);\r\n if (!cap) continue;\r\n\r\n // Rate policy must pass\r\n if (!passesRate(s.ratePolicy, primaryRate, cap.rate)) continue;\r\n\r\n // Tag constraint fit is only enforced if we know tagId and setting requires it\r\n if (s.requireConstraintFit && tagId) {\r\n const ok = satisfiesTagConstraints(\r\n tagId,\r\n { props: params.props, services },\r\n cap,\r\n );\r\n if (!ok) continue;\r\n }\r\n\r\n eligible.push(cand);\r\n }\r\n }\r\n\r\n // Selection strategy\r\n if (s.selectionStrategy === \"cheapest\") {\r\n eligible.sort((a, b) => {\r\n const ra = rateOf(services, a) ?? Infinity;\r\n const rb = rateOf(services, b) ?? Infinity;\r\n return ra - rb;\r\n });\r\n }\r\n // 'priority' keeps original order\r\n\r\n // Optional limit\r\n if (typeof params.limit === \"number\" && params.limit >= 0) {\r\n return eligible.slice(0, params.limit);\r\n }\r\n return eligible;\r\n}\r\n\r\nexport function getFallbackRegistrationInfo(\r\n props: ServiceProps,\r\n nodeId: NodeIdRef,\r\n): {\r\n primary?: ServiceIdRef;\r\n tagContexts: string[];\r\n} {\r\n const { primary, tagContexts } = primaryForNode(props, nodeId);\r\n return { primary, tagContexts };\r\n}\n","import type { Field, FieldOption, Tag } from \"@/schema\";\nimport { Builder } from \"@/core/builder\";\n\nexport type NodeKind = \"tag\" | \"field\" | \"option\" | \"unknown\";\n\nexport type RelKind = \"self\" | \"ancestor\" | \"descendant\" | \"unrelated\";\n\nexport interface AncestryHit {\n kind: RelKind;\n node: TagNode;\n index: number;\n direct: boolean;\n path: string[];\n}\n\nexport interface WithAncestry {\n ancestry(baseTag: string | TagNode): readonly AncestryHit[];\n isAncestorOf(baseTag: string | TagNode): boolean;\n isDescendantOf(baseTag: string | TagNode): boolean;\n isWithin(baseTag: string | TagNode): boolean;\n}\n\nexport interface TagNode extends WithAncestry {\n kind: \"tag\";\n id: string;\n raw: Tag;\n\n includes: ReadonlySet<string>;\n excludes: ReadonlySet<string>;\n isInherited?: boolean;\n\n parent(): TagNode | undefined;\n children(): readonly TagNode[];\n ancestors(): readonly {\n node: TagNode;\n direct: boolean;\n index: number;\n path: string[];\n }[];\n pathTo(descendant: string | TagNode): string[] | null;\n isBoundTo(tagId: string | TagNode): boolean;\n getDescendant(id: string): FieldNode | undefined;\n getDescendants(): readonly FieldNode[];\n}\n\nexport interface FieldNode extends WithAncestry {\n kind: \"field\";\n id: string;\n raw: Field;\n\n includes: ReadonlySet<string>;\n excludes: ReadonlySet<string>;\n isInherited?: boolean;\n\n bindIds(): readonly string[];\n ownerTags(): readonly TagNode[];\n isBoundTo(tagId: string | TagNode): boolean;\n getDescendant(id: string, contextId?: string): FieldNode | undefined;\n getDescendants(tagId?: string): readonly FieldNode[];\n}\n\nexport interface OptionNode extends WithAncestry {\n kind: \"option\";\n id: string;\n raw: FieldOption;\n\n includes: ReadonlySet<string>;\n excludes: ReadonlySet<string>;\n isInherited?: boolean;\n\n field(): FieldNode;\n ownerTags(): readonly TagNode[];\n isBoundTo(tagId: string | TagNode): boolean;\n getDescendant(id: string, contextId?: string): FieldNode | undefined;\n getDescendants(tagId?: string): readonly FieldNode[];\n}\n\nexport interface UnknownNode extends WithAncestry {\n kind: \"unknown\";\n id: string;\n\n includes: ReadonlySet<string>;\n excludes: ReadonlySet<string>;\n isInherited?: boolean;\n}\n\nexport type AnyNode = TagNode | FieldNode | OptionNode | UnknownNode;\n\nexport interface NodeIndex {\n getNode(input: string | Tag | Field | FieldOption): AnyNode;\n getTag(id: string): TagNode | undefined;\n getField(id: string): FieldNode | undefined;\n getOption(id: string): OptionNode | undefined;\n}\n\nconst toId = (x: string | { id: string }) => (typeof x === \"string\" ? x : x.id);\n\nconst toBindList = (b: Field[\"bind_id\"]): string[] => {\n if (!b) return [];\n return typeof b === \"string\" ? [b] : [...b];\n};\n\nexport function createNodeIndex(builder: Builder): NodeIndex {\n const props = builder.getProps();\n const nodeMap = builder.getNodeMap();\n //---\n const tags = props.filters ?? [];\n const fields = props.fields ?? [];\n\n const tagById = new Map<string, Tag>(tags.map((t) => [t.id, t]));\n const fieldById = new Map<string, Field>(fields.map((f) => [f.id, f]));\n\n const optionById = new Map<string, FieldOption>();\n const optionOwnerFieldId = new Map<string, string>();\n for (const f of fields) {\n for (const o of f.options ?? []) {\n optionById.set(o.id, o);\n optionOwnerFieldId.set(o.id, f.id);\n }\n }\n\n const parentById = new Map<string, string | undefined>();\n const childrenById = new Map<string, string[]>();\n for (const t of tags) {\n parentById.set(t.id, t.bind_id);\n if (t.bind_id) {\n const arr = childrenById.get(t.bind_id) ?? [];\n arr.push(t.id);\n childrenById.set(t.bind_id, arr);\n }\n }\n\n // --- caches\n const nodeCache = new Map<string, AnyNode>();\n const tagNodeCache = new Map<string, TagNode>();\n const fieldNodeCache = new Map<string, FieldNode>();\n const optionNodeCache = new Map<string, OptionNode>();\n\n const tagAncestorsCache = new Map<\n string,\n readonly {\n node: TagNode;\n direct: boolean;\n index: number;\n path: string[];\n }[]\n >();\n const tagChildrenCache = new Map<string, readonly TagNode[]>();\n const lineageIdsCache = new Map<string, ReadonlySet<string>>();\n\n const fieldBindIdsCache = new Map<string, readonly string[]>();\n const fieldOwnerTagsCache = new Map<string, readonly TagNode[]>();\n\n const emptySet = Object.freeze(new Set<string>());\n\n const isFieldBoundDirectToTag = (\n fieldId: string,\n tagId: string,\n ): boolean => {\n const field = fieldById.get(fieldId);\n if (!field) return false;\n const bind = field.bind_id;\n if (!bind) return false;\n if (typeof bind === \"string\") return bind === tagId;\n return bind.includes(tagId);\n };\n\n const resolveDescendants = (\n id: string,\n includes: ReadonlySet<string>,\n tagId?: string,\n forceSimple?: boolean,\n ): readonly FieldNode[] => {\n if (!tagId || forceSimple) {\n const results: FieldNode[] = [];\n for (const incId of includes) {\n const node = getField(incId);\n if (node) results.push(node);\n }\n return Object.freeze(results);\n }\n\n const results: FieldNode[] = [];\n const visible = builder.visibleFields(tagId, [id]);\n\n for (const fieldId of visible) {\n const node = getField(fieldId);\n if (!node) continue;\n const explicit =\n includes.has(fieldId) ||\n isFieldBoundDirectToTag(fieldId, tagId);\n results.push(explicit ? node : { ...node, isInherited: true });\n }\n\n return Object.freeze(results);\n };\n\n // ---- core graph helpers\n const lineageIds = (tagId: string): ReadonlySet<string> => {\n const cached = lineageIdsCache.get(tagId);\n if (cached) return cached;\n\n const out = new Set<string>();\n const guard = new Set<string>();\n let cur: string | undefined = tagId;\n\n while (cur && !guard.has(cur)) {\n out.add(cur);\n guard.add(cur);\n cur = parentById.get(cur);\n }\n\n lineageIdsCache.set(tagId, out);\n return out;\n };\n\n const pathBetween = (fromId: string, toId: string): string[] | null => {\n if (fromId === toId) return [fromId];\n\n const guard = new Set<string>();\n const stack: string[] = [];\n let cur: string | undefined = toId;\n\n while (cur && !guard.has(cur)) {\n stack.push(cur);\n if (cur === fromId) return stack.reverse(); // from -> ... -> to\n guard.add(cur);\n cur = parentById.get(cur);\n }\n return null;\n };\n\n const relationBetween = (\n baseId: string,\n otherId: string,\n ): { kind: RelKind; path: string[]; index: number; direct: boolean } => {\n if (baseId === otherId)\n return { kind: \"self\", path: [baseId], index: 0, direct: false };\n\n // base -> other ? => descendant\n const down = pathBetween(baseId, otherId);\n if (down)\n return {\n kind: \"descendant\",\n path: down,\n index: down.length - 1,\n direct: down.length === 2,\n };\n\n // other -> base ? => ancestor\n const up = pathBetween(otherId, baseId);\n if (up) {\n // want base -> other path; we can just reverse \"up\"\n const p = up.slice().reverse();\n return {\n kind: \"ancestor\",\n path: p,\n index: p.length - 1,\n direct: p.length === 2,\n };\n }\n\n return { kind: \"unrelated\", path: [], index: -1, direct: false };\n };\n\n // ---- shared ancestry impl builder\n const makeAncestry = (selfOwnerTagIds: readonly string[]) => {\n return (baseTag: string | TagNode): readonly AncestryHit[] => {\n const baseId = toId(baseTag);\n const hits: AncestryHit[] = [];\n\n for (const ownerId of selfOwnerTagIds) {\n const owner = getTag(ownerId);\n if (!owner) continue;\n\n const rel = relationBetween(baseId, ownerId);\n hits.push({\n kind: rel.kind,\n node: owner,\n index: rel.index,\n direct: rel.direct,\n path: rel.path,\n });\n }\n\n return hits;\n };\n };\n\n const makeAncestryFns = (\n ancestryFn: (baseTag: string | TagNode) => readonly AncestryHit[],\n ) => ({\n ancestry: ancestryFn,\n\n isAncestorOf(baseTag: string | TagNode): boolean {\n return ancestryFn(baseTag).some((h) => h.kind === \"ancestor\");\n },\n\n isDescendantOf(baseTag: string | TagNode): boolean {\n return ancestryFn(baseTag).some((h) => h.kind === \"descendant\");\n },\n\n isWithin(baseTag: string | TagNode): boolean {\n return ancestryFn(baseTag).some(\n (h) => h.kind === \"self\" || h.kind === \"descendant\",\n );\n },\n });\n\n // ---- node factories\n const getTag = (id: string): TagNode | undefined => {\n const cached = tagNodeCache.get(id);\n if (cached) return cached;\n\n const raw = tagById.get(id);\n if (!raw) return undefined;\n\n const includes = Object.freeze(new Set(raw.includes ?? []));\n const excludes = Object.freeze(new Set(raw.excludes ?? []));\n\n const ancestryFn = makeAncestry([id]);\n\n const node: TagNode = {\n kind: \"tag\",\n id,\n raw,\n\n includes,\n excludes,\n\n ...makeAncestryFns(ancestryFn),\n\n parent() {\n const pid = parentById.get(id);\n return pid ? getTag(pid) : undefined;\n },\n\n children() {\n const cachedChildren = tagChildrenCache.get(id);\n if (cachedChildren) return cachedChildren;\n\n const childIds = childrenById.get(id) ?? [];\n const arr = childIds\n .map((cid) => getTag(cid))\n .filter(Boolean) as TagNode[];\n const frozen = Object.freeze(arr);\n tagChildrenCache.set(id, frozen);\n return frozen;\n },\n\n ancestors() {\n const cachedAnc = tagAncestorsCache.get(id);\n if (cachedAnc) return cachedAnc;\n\n const rows: Array<{\n node: TagNode;\n direct: boolean;\n index: number;\n path: string[];\n }> = [];\n const guard = new Set<string>();\n let cur = parentById.get(id);\n let index = 1;\n\n while (cur && !guard.has(cur)) {\n const n = getTag(cur);\n if (!n) break;\n const p = pathBetween(id, cur) ?? [id, cur];\n\n rows.push({ node: n, direct: index === 1, index, path: p });\n\n guard.add(cur);\n cur = parentById.get(cur);\n index++;\n }\n\n const frozen = Object.freeze(rows);\n tagAncestorsCache.set(id, frozen);\n return frozen;\n },\n\n pathTo(descendant) {\n const to = toId(descendant);\n return pathBetween(id, to);\n },\n\n isBoundTo(tagId) {\n const tid = toId(tagId);\n if (tid === id) return true;\n // A tag is bound to tagId if tagId is its DIRECT parent.\n return parentById.get(id) === tid;\n },\n\n getDescendant(descendantId) {\n return this.getDescendants().find(\n (item) => item.id == descendantId,\n );\n },\n\n getDescendants() {\n const results: FieldNode[] = [];\n const visible = builder.visibleFields(id);\n\n for (const fieldId of visible) {\n const node = getField(fieldId);\n if (!node) continue;\n const explicit =\n includes.has(fieldId) ||\n isFieldBoundDirectToTag(fieldId, id);\n results.push(\n explicit ? node : { ...node, isInherited: true },\n );\n }\n\n return Object.freeze(results);\n },\n };\n\n tagNodeCache.set(id, node);\n nodeCache.set(id, node);\n return node;\n };\n\n const getField = (id: string): FieldNode | undefined => {\n const cached = fieldNodeCache.get(id);\n if (cached) return cached;\n\n const raw = fieldById.get(id);\n if (!raw) return undefined;\n\n const isButton = (raw as any).button === true;\n const includes = isButton\n ? Object.freeze(new Set(props.includes_for_buttons?.[id] ?? []))\n : emptySet;\n const excludes = isButton\n ? Object.freeze(new Set(props.excludes_for_buttons?.[id] ?? []))\n : emptySet;\n\n const bindIds = (): readonly string[] => {\n const cachedBind = fieldBindIdsCache.get(id);\n if (cachedBind) return cachedBind;\n const res = Object.freeze(toBindList(raw.bind_id));\n fieldBindIdsCache.set(id, res);\n return res;\n };\n\n const ancestryFn = makeAncestry(bindIds());\n\n const node: FieldNode = {\n kind: \"field\",\n id,\n raw,\n\n includes,\n excludes,\n\n ...makeAncestryFns(ancestryFn),\n\n bindIds,\n\n ownerTags() {\n const cachedOwners = fieldOwnerTagsCache.get(id);\n if (cachedOwners) return cachedOwners;\n\n const owners = bindIds()\n .map((tid) => getTag(tid))\n .filter(Boolean) as TagNode[];\n\n const frozen = Object.freeze(owners);\n fieldOwnerTagsCache.set(id, frozen);\n return frozen;\n },\n\n isBoundTo(tagId) {\n const tid = toId(tagId);\n const lin = lineageIds(tid); // self + ancestors\n for (const b of bindIds()) if (lin.has(b)) return true;\n return false;\n },\n\n getDescendant(descendantId, context) {\n return this.getDescendants(context).find(\n (item) => item.id == descendantId,\n );\n },\n\n getDescendants(tagId?: string) {\n return resolveDescendants(id, includes, tagId, !isButton);\n },\n };\n\n fieldNodeCache.set(id, node);\n nodeCache.set(id, node);\n return node;\n };\n\n const getOption = (id: string): OptionNode | undefined => {\n const cached = optionNodeCache.get(id);\n if (cached) return cached;\n\n const raw = optionById.get(id);\n const ownerFieldId = optionOwnerFieldId.get(id);\n if (!raw || !ownerFieldId) return undefined;\n\n const owner = getField(ownerFieldId);\n if (!owner) return undefined;\n\n const includes = Object.freeze(\n new Set(props.includes_for_buttons?.[id] ?? []),\n );\n const excludes = Object.freeze(\n new Set(props.excludes_for_buttons?.[id] ?? []),\n );\n\n // option shares ancestry with its owning field\n const node: OptionNode = {\n kind: \"option\",\n id,\n raw,\n\n includes,\n excludes,\n\n ...makeAncestryFns((baseTag) => owner.ancestry(baseTag)),\n\n field() {\n return owner;\n },\n\n ownerTags() {\n return owner.ownerTags();\n },\n\n isBoundTo(tagId) {\n return owner.isBoundTo(tagId);\n },\n\n getDescendant(descendantId, context) {\n return this.getDescendants(context).find(\n (item) => item.id == descendantId,\n );\n },\n\n getDescendants(tagId?: string) {\n return resolveDescendants(id, includes, tagId);\n },\n };\n\n optionNodeCache.set(id, node);\n nodeCache.set(id, node);\n return node;\n };\n\n const getNode = (input: string | Tag | Field | FieldOption): AnyNode => {\n const id = typeof input === \"object\" ? input.id : input;\n\n const cached = nodeCache.get(id);\n if (cached) return cached;\n\n const node = nodeMap.get(id);\n\n if (!node) return mkUnknown(id);\n\n if (node.kind === \"tag\") return getTag(id) ?? mkUnknown(id);\n if (node.kind == \"field\") return getField(id) ?? mkUnknown(id);\n if (node.kind == \"option\") return getOption(id) ?? mkUnknown(id);\n\n return mkUnknown(id);\n };\n\n const mkUnknown = (id: string): UnknownNode => {\n const u: UnknownNode = {\n kind: \"unknown\",\n id,\n includes: emptySet,\n excludes: emptySet,\n ...makeAncestryFns(() => []),\n };\n nodeCache.set(id, u);\n return u;\n };\n\n return {\n getNode,\n getTag,\n getField,\n getOption,\n };\n}\n","import type { Builder } from \"@/core/builder\";\nimport { compilePolicies, type PolicyDiagnostic } from \"@/core/policy\";\nimport type {\n DgpServiceCapability,\n DgpServiceMap,\n DynamicRule,\n FallbackSettings,\n ServiceIdRef,\n} from \"@/schema\";\nimport {\n constraintFitOk,\n getServiceCapability,\n rateOk,\n toFiniteNumber,\n} from \"@/utils/util\";\n\nexport type ServiceCheck = {\n id: ServiceIdRef;\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\nexport type FilterServicesForVisibleGroupInput = {\n candidates: ServiceIdRef[];\n context: {\n tagId: string;\n selectedButtons?: string[];\n usedServiceIds: ServiceIdRef[];\n effectiveConstraints?: Partial<\n Record<\"refill\" | \"cancel\" | \"dripfeed\", boolean>\n >;\n policies?: unknown;\n fallback?: FallbackSettings;\n strictSafety?: boolean;\n enforcePolicies?: boolean;\n };\n};\n\nexport type FilterServicesForVisibleGroupResult = {\n checks: ServiceCheck[];\n diagnostics?: PolicyDiagnostic[];\n};\n\nexport function filterServicesForVisibleGroup(\n input: FilterServicesForVisibleGroupInput,\n deps: {\n builder: Builder;\n },\n): FilterServicesForVisibleGroupResult {\n const svcMap: DgpServiceMap = deps.builder.getServiceMap?.() ?? {};\n const { context } = input;\n\n const usedSet = new Set(context.usedServiceIds.map(String));\n const primary = context.usedServiceIds[0];\n\n const fb: FallbackSettings = {\n requireConstraintFit: true,\n ratePolicy: { kind: \"lte_primary\", pct: 5 },\n selectionStrategy: \"priority\",\n mode: \"strict\",\n ...(context.fallback ?? {}),\n };\n\n const visibleServiceIds =\n context.selectedButtons === undefined\n ? undefined\n : collectVisibleServiceIds(\n deps.builder,\n context.tagId,\n context.selectedButtons,\n );\n\n const checks: ServiceCheck[] = [];\n let lastDiagnostics: PolicyDiagnostic[] | undefined = undefined;\n\n for (const id of input.candidates) {\n if (usedSet.has(String(id))) continue;\n\n const cap = getServiceCapability(svcMap, id);\n if (!cap) {\n checks.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 const fitsConstraints = constraintFitOk(\n svcMap,\n cap.id,\n context.effectiveConstraints ?? {},\n );\n\n const passesRate =\n primary == null ? true : rateOk(svcMap, id, primary, fb);\n\n const polRes = evaluatePoliciesRaw(\n context.policies ?? [],\n [...context.usedServiceIds, id],\n svcMap,\n context.tagId,\n visibleServiceIds,\n );\n const passesPolicies = polRes.ok;\n lastDiagnostics = polRes.diagnostics;\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 checks.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 ? polRes.warnings : undefined,\n reasons,\n cap,\n rate: toFiniteNumber(cap.rate),\n });\n }\n\n return {\n checks,\n diagnostics:\n lastDiagnostics && lastDiagnostics.length\n ? lastDiagnostics\n : undefined,\n };\n}\n\nfunction evaluatePoliciesRaw(\n raw: unknown,\n serviceIds: ServiceIdRef[],\n svcMap: DgpServiceMap,\n tagId: string,\n visibleServiceIds?: Set<string>,\n) {\n const compiled = compilePolicies(raw);\n const evaluated = evaluateServicePolicies(\n compiled.policies,\n serviceIds,\n svcMap,\n tagId,\n visibleServiceIds,\n );\n return {\n ...evaluated,\n diagnostics: compiled.diagnostics,\n };\n}\n\nfunction evaluateServicePolicies(\n rules: DynamicRule[] | undefined,\n svcIds: ServiceIdRef[],\n svcMap: DgpServiceMap,\n tagId: string,\n visibleServiceIds?: Set<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 scoped = scopeServiceIdsForRule(svcIds, r, visibleServiceIds);\n const ids = scoped.filter((id) =>\n matchesRuleFilter(getServiceCapability(svcMap, id), r, tagId),\n );\n const projection = r.projection || \"service.id\";\n const values = ids.map((id) =>\n policyProjectValue(getServiceCapability(svcMap, 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 {\n warnings.push(r.id ?? \"policy_warning\");\n }\n }\n }\n\n return { ok: errors.length === 0, errors, warnings };\n}\n\nfunction scopeServiceIdsForRule(\n serviceIds: (string | number)[],\n rule: DynamicRule,\n visibleServiceIds?: Set<string>,\n): ServiceIdRef[] {\n if (rule.scope !== \"visible_group\" || !visibleServiceIds) return serviceIds;\n return serviceIds.filter((id) => visibleServiceIds.has(String(id)));\n}\n\nfunction collectVisibleServiceIds(\n builder: Builder,\n tagId: string,\n selectedButtons: string[],\n): Set<string> {\n const out = new Set<string>();\n const props = builder.getProps();\n const tags = props.filters ?? [];\n const fields = props.fields ?? [];\n\n const tag = tags.find((t) => t.id === tagId);\n if (tag?.service_id != null) out.add(String(tag.service_id));\n\n const visibleFieldIds = new Set(builder.visibleFields(tagId, selectedButtons));\n for (const field of fields) {\n if (!visibleFieldIds.has(field.id)) continue;\n\n if ((field as any).service_id != null) {\n out.add(String((field as any).service_id));\n }\n for (const option of field.options ?? []) {\n if ((option as any).service_id != null) {\n out.add(String((option as any).service_id));\n }\n }\n }\n\n return out;\n}\n\nfunction policyProjectValue(\n cap: DgpServiceCapability | undefined,\n projection: string,\n) {\n if (!cap) return undefined;\n const key = projection.startsWith(\"service.\") ? projection.slice(8) : 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 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","import type { EditorModuleContext } from \"./editor-types\";\r\n\r\nexport function uniqueId(ctx: EditorModuleContext, base: string): string {\r\n const props = ctx.getProps();\r\n const taken = new Set<string>([\r\n ...(props.filters ?? []).map((t) => t.id),\r\n ...(props.fields ?? []).map((f) => f.id),\r\n ]);\r\n let candidate = nextCopyId(base);\r\n while (taken.has(candidate)) candidate = bumpSuffix(candidate);\r\n return candidate;\r\n}\r\n\r\nexport function uniqueOptionId(\r\n ctx: EditorModuleContext,\r\n fieldId: string,\r\n base: string,\r\n): string {\r\n const props = ctx.getProps();\r\n const fld = (props.fields ?? []).find((f) => f.id === fieldId);\r\n const taken = new Set((fld?.options ?? []).map((o) => o.id));\r\n let candidate = base;\r\n if (taken.has(candidate)) candidate = nextCopyId(candidate);\r\n while (taken.has(candidate)) candidate = bumpSuffix(candidate);\r\n return candidate;\r\n}\r\n\r\nexport function genId(\r\n ctx: EditorModuleContext,\r\n prefix: \"t\" | \"f\" | \"o\",\r\n): string {\r\n const props = ctx.getProps();\r\n const taken = new Set<string>([\r\n ...(props.filters ?? []).map((t) => t.id),\r\n ...(props.fields ?? []).map((f) => f.id),\r\n ...(props.fields ?? []).flatMap((f) => f.options?.map((o) => o.id) ?? []),\r\n ]);\r\n for (let i = 1; i < 10_000; i++) {\r\n const id = `${prefix}:${i}`;\r\n if (!taken.has(id)) return id;\r\n }\r\n throw new Error(\"Unable to generate id\");\r\n}\r\n\r\nexport function nextCopyLabel(old: string): string {\r\n const m = old.match(/^(.*?)(?:\\s*\\(copy(?:\\s+(\\d+))?\\))$/i);\r\n if (!m) return `${old} (copy)`;\r\n const stem = m[1].trim();\r\n const n = m[2] ? parseInt(m[2], 10) + 1 : 2;\r\n return `${stem} (copy ${n})`;\r\n}\r\n\r\nexport function nextCopyName(old?: string): string | undefined {\r\n if (!old) return undefined;\r\n const m = old.match(/^(.*?)(_copy(\\d+)?)$/i);\r\n if (!m) return `${old}_copy`;\r\n const stem = m[1];\r\n const n = m[3] ? parseInt(m[3], 10) + 1 : 2;\r\n return `${stem}_copy${n}`;\r\n}\r\n\r\nexport function defaultOptionIdStrategy(old: string): string {\r\n return nextCopyId(old);\r\n}\r\n\r\nexport function nextCopyId(old: string): string {\r\n const m = old.match(/^(.*?)(?:_copy(\\d+)?)$/i);\r\n if (!m) return `${old}_copy`;\r\n const stem = m[1];\r\n const n = m[2] ? parseInt(m[2], 10) + 1 : 2;\r\n return `${stem}_copy${n}`;\r\n}\r\n\r\nexport function bumpSuffix(old: string): string {\r\n const m = old.match(/^(.*?)(\\d+)$/);\r\n if (!m) return `${old}2`;\r\n const stem = m[1];\r\n return `${stem}${parseInt(m[2], 10) + 1}`;\r\n}\r\n","import type { ServiceProps, Tag } from \"@/schema\";\r\nimport type {\r\n DuplicateOptions,\r\n EditorModuleContext,\r\n NodeRef,\r\n} from \"./editor-types\";\r\nimport {\r\n defaultOptionIdStrategy,\r\n nextCopyLabel,\r\n nextCopyName,\r\n} from \"./editor-ids\";\r\n\r\nexport function duplicate(\r\n ctx: EditorModuleContext,\r\n ref: NodeRef,\r\n opts: DuplicateOptions = {},\r\n): string {\r\n const snapBefore = ctx.makeSnapshot(\"duplicate:before\");\r\n try {\r\n let newId = \"\";\r\n ctx.transact(\"duplicate\", () => {\r\n if (ref.kind === \"tag\") {\r\n newId = duplicateTag(ctx, ref.id, opts);\r\n } else if (ref.kind === \"field\") {\r\n newId = duplicateField(ctx, ref.id, opts);\r\n } else {\r\n newId = duplicateOption(ctx, ref.fieldId, ref.id, opts);\r\n }\r\n });\r\n return newId;\r\n } catch (err) {\r\n ctx.loadSnapshot(snapBefore, \"undo\");\r\n throw err;\r\n }\r\n}\r\n\r\nexport function duplicateTag(\r\n ctx: EditorModuleContext,\r\n tagId: string,\r\n opts: DuplicateOptions,\r\n): string {\r\n const props = ctx.getProps();\r\n const tags = props.filters ?? [];\r\n const src = tags.find((t) => t.id === tagId);\r\n if (!src) throw new Error(`Tag not found: ${tagId}`);\r\n\r\n const id = opts.id ?? ctx.uniqueId(src.id);\r\n const label = (opts.labelStrategy ?? nextCopyLabel)(src.label ?? id);\r\n\r\n if (!opts.withChildren) {\r\n ctx.patchProps((p) => {\r\n const clone = { ...src, id, label };\r\n clone.bind_id = src.bind_id;\r\n clone.constraints_overrides = undefined;\r\n clone.constraints_origin = undefined;\r\n const arr = p.filters ?? [];\r\n const idx = arr.findIndex((t) => t.id === tagId);\r\n arr.splice(idx + 1, 0, clone);\r\n p.filters = arr;\r\n });\r\n return id;\r\n }\r\n\r\n const idMap = new Map<string, string>();\r\n const collect = (t: typeof src, acc: (typeof src)[]) => {\r\n acc.push(t);\r\n for (const child of tags.filter((x) => x.bind_id === t.id)) {\r\n collect(child as any, acc);\r\n }\r\n };\r\n const subtree: (typeof src)[] = [];\r\n collect(src, subtree);\r\n\r\n for (const n of subtree) {\r\n idMap.set(n.id, n.id === src.id ? id : ctx.uniqueId(n.id));\r\n }\r\n\r\n const clones = subtree.map((n) => {\r\n const cloned = { ...n };\r\n cloned.id = idMap.get(n.id)!;\r\n cloned.label =\r\n n.id === src.id\r\n ? label\r\n : (opts.labelStrategy ?? nextCopyLabel)(n.label ?? n.id);\r\n cloned.bind_id = n.bind_id ? (idMap.get(n.bind_id) ?? n.bind_id) : undefined;\r\n cloned.constraints_origin = undefined;\r\n cloned.constraints_overrides = undefined;\r\n return cloned;\r\n });\r\n\r\n ctx.patchProps((p) => {\r\n const arr = p.filters ?? [];\r\n const rootIdx = arr.findIndex((t) => t.id === tagId);\r\n arr.splice(rootIdx + 1, 0, clones[0] as any);\r\n for (const c of clones.slice(1)) arr.push(c as any);\r\n p.filters = arr;\r\n });\r\n\r\n return id;\r\n}\r\n\r\nexport function duplicateField(\r\n ctx: EditorModuleContext,\r\n fieldId: string,\r\n opts: DuplicateOptions,\r\n): string {\r\n const props = ctx.getProps();\r\n const fields = props.fields ?? [];\r\n const src = fields.find((f) => f.id === fieldId);\r\n if (!src) throw new Error(`Field not found: ${fieldId}`);\r\n\r\n const id = opts.id ?? ctx.uniqueId(src.id);\r\n const label = (opts.labelStrategy ?? nextCopyLabel)(src.label ?? id);\r\n const name = opts.nameStrategy\r\n ? opts.nameStrategy(src.name)\r\n : nextCopyName(src.name);\r\n\r\n const optId = (old: string) =>\r\n ctx.uniqueOptionId(\r\n id,\r\n (opts.optionIdStrategy ?? defaultOptionIdStrategy)(old),\r\n );\r\n\r\n const clonedOptions = (src.options ?? []).map((o) => ({\r\n ...o,\r\n id: optId(o.id),\r\n label: (opts.labelStrategy ?? nextCopyLabel)(o.label ?? o.id),\r\n }));\r\n\r\n const cloned = {\r\n ...src,\r\n id,\r\n label,\r\n name,\r\n bind_id: (opts.copyBindings ?? true) ? src.bind_id : undefined,\r\n options: clonedOptions,\r\n } as typeof src;\r\n\r\n const optionIdMap = new Map<string, string>();\r\n (src.options ?? []).forEach((o, i) => {\r\n const newOptId = clonedOptions[i]?.id ?? o.id;\r\n optionIdMap.set(o.id, newOptId);\r\n });\r\n\r\n ctx.patchProps((p) => {\r\n const arr = p.fields ?? [];\r\n const idx = arr.findIndex((f) => f.id === fieldId);\r\n arr.splice(idx + 1, 0, cloned as any);\r\n p.fields = arr;\r\n\r\n if (opts.copyIncludesExcludes) {\r\n for (const t of p.filters ?? []) {\r\n if (t.includes?.includes(fieldId)) {\r\n const s = new Set(t.includes);\r\n s.add(id);\r\n t.includes = Array.from(s);\r\n }\r\n if (t.excludes?.includes(fieldId)) {\r\n const s = new Set(t.excludes);\r\n s.add(id);\r\n t.excludes = Array.from(s);\r\n }\r\n }\r\n }\r\n\r\n if (opts.copyOptionMaps) {\r\n const maps: Array<\"includes_for_buttons\" | \"excludes_for_buttons\"> = [\r\n \"includes_for_buttons\",\r\n \"excludes_for_buttons\",\r\n ];\r\n\r\n for (const mapKey of maps) {\r\n const srcMap = (p as any)[mapKey] ?? {};\r\n const nextMap: Record<string, string[]> = { ...srcMap };\r\n\r\n for (const [key, targets] of Object.entries(\r\n srcMap as Record<string, string[]>,\r\n )) {\r\n if (key === fieldId) {\r\n const newKey = id;\r\n const merged = new Set([...(nextMap[newKey] ?? []), ...targets]);\r\n nextMap[newKey] = Array.from(merged);\r\n continue;\r\n }\r\n\r\n if (optionIdMap.has(key)) {\r\n const newKey = optionIdMap.get(key)!;\r\n const merged = new Set([...(nextMap[newKey] ?? []), ...targets]);\r\n nextMap[newKey] = Array.from(merged);\r\n }\r\n }\r\n\r\n (p as any)[mapKey] = nextMap;\r\n }\r\n }\r\n });\r\n\r\n return id;\r\n}\r\n\r\nexport function duplicateOption(\r\n ctx: EditorModuleContext,\r\n fieldId: string,\r\n optionId: string,\r\n opts: DuplicateOptions,\r\n): string {\r\n const props = ctx.getProps();\r\n const fields = props.fields ?? [];\r\n const f = fields.find((x) => x.id === fieldId);\r\n if (!f) throw new Error(`Field not found: ${fieldId}`);\r\n const optIdx = (f.options ?? []).findIndex((o) => o.id === optionId);\r\n if (optIdx < 0) {\r\n throw new Error(`Option not found: ${fieldId}::${optionId}`);\r\n }\r\n const src = (f.options ?? [])[optIdx];\r\n\r\n const newId = ctx.uniqueOptionId(\r\n fieldId,\r\n (opts.optionIdStrategy ?? defaultOptionIdStrategy)(src.id),\r\n );\r\n const newLabel = (opts.labelStrategy ?? nextCopyLabel)(src.label ?? src.id);\r\n\r\n ctx.patchProps((p) => {\r\n const fld = (p.fields ?? []).find((x) => x.id === fieldId)!;\r\n const arr = fld.options ?? [];\r\n const clone = { ...src, id: newId, label: newLabel };\r\n arr.splice(optIdx + 1, 0, clone);\r\n fld.options = arr;\r\n\r\n if (opts.copyOptionMaps) {\r\n const oldKey = `${fieldId}::${optionId}`;\r\n const newKey = `${fieldId}::${newId}`;\r\n for (const mapKey of [\r\n \"includes_for_buttons\",\r\n \"excludes_for_buttons\",\r\n ] as const) {\r\n const m = p[mapKey] ?? {};\r\n if (m[oldKey]) {\r\n m[newKey] = Array.from(new Set(m[oldKey]));\r\n p[mapKey] = m as any;\r\n }\r\n }\r\n }\r\n });\r\n\r\n return newId;\r\n}\r\n","import type { ServicePropsNotice } from \"@/schema\";\r\nimport type { EditorModuleContext } from \"./editor-types\";\r\n\r\nfunction genNoticeId(ctx: EditorModuleContext): string {\r\n const taken = new Set((ctx.getProps().notices ?? []).map((n) => n.id));\r\n for (let i = 1; i < 10_000; i++) {\r\n const id = `n:${i}`;\r\n if (!taken.has(id)) return id;\r\n }\r\n throw new Error(\"Unable to generate notice id\");\r\n}\r\n\r\nexport function addNotice(\r\n ctx: EditorModuleContext,\r\n input: Omit<ServicePropsNotice, \"id\"> & { id?: string },\r\n): string {\r\n const id = input.id ?? genNoticeId(ctx);\r\n\r\n ctx.exec({\r\n name: \"addNotice\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const notices = (p.notices ??= []);\r\n if (notices.some((n) => n.id === id)) {\r\n throw new Error(`Notice id '${id}' already exists`);\r\n }\r\n notices.push({ ...input, id });\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n\r\n return id;\r\n}\r\n\r\nexport function updateNotice(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n patch: Partial<ServicePropsNotice>,\r\n): void {\r\n const { id: _ignored, ...rest } = patch;\r\n ctx.exec({\r\n name: \"updateNotice\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const notices = p.notices;\r\n if (!notices?.length) return;\r\n\r\n const target = notices.find((n) => n.id === id);\r\n if (!target) return;\r\n Object.assign(target, rest);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function removeNotice(ctx: EditorModuleContext, id: string): void {\r\n ctx.exec({\r\n name: \"removeNotice\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n if (!p.notices?.length) return;\r\n p.notices = p.notices.filter((n) => n.id !== id);\r\n if (!p.notices.length) delete p.notices;\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n","import { cloneDeep } from \"lodash-es\";\nimport type { Field, ServiceIdRef, ServiceProps, Tag } from \"@/schema\";\nimport type {\r\n EditorModuleContext,\r\n EditorNodeLookup,\r\n} from \"./editor-types\";\r\nimport { clearFieldButtonReceiverMaps, isActualButtonField, ownerOfOption } from \"./editor-utils\";\r\n\r\nexport function reLabel(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n nextLabel: string,\r\n): void {\r\n const label = String(nextLabel ?? \"\").trim();\r\n\r\n ctx.exec({\r\n name: \"reLabel\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n if (ctx.isTagId(id)) {\r\n const t = (p.filters ?? []).find((x) => x.id === id);\r\n if (!t) return;\r\n if ((t.label ?? \"\") === label) return;\r\n t.label = label;\r\n ctx.api.refreshGraph();\r\n return;\r\n }\r\n\r\n if (ctx.isOptionId(id)) {\r\n const own = ownerOfOption(p, id);\r\n if (!own) return;\r\n const f = (p.fields ?? []).find((x) => x.id === own.fieldId);\r\n const o = f?.options?.find((x) => x.id === id);\r\n if (!o) return;\r\n if ((o.label ?? \"\") === label) return;\r\n o.label = label;\r\n ctx.api.refreshGraph();\r\n return;\r\n }\r\n\r\n const fld = (p.fields ?? []).find((x) => x.id === id);\r\n if (!fld) return;\r\n if ((fld.label ?? \"\") === label) return;\r\n fld.label = label;\r\n ctx.api.refreshGraph();\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function setFieldName(\r\n ctx: EditorModuleContext,\r\n fieldId: string,\r\n nextName: string | null | undefined,\r\n): void {\r\n const raw = typeof nextName === \"string\" ? nextName : \"\";\r\n const name = raw.trim();\r\n\r\n ctx.exec({\r\n name: \"setFieldName\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const fields = p.fields ?? [];\r\n const f = fields.find((x) => x.id === fieldId);\r\n if (!f) {\r\n ctx.api.emit(\"error\", {\r\n code: \"field_not_found\",\r\n message: `Field not found: ${fieldId}`,\r\n meta: { fieldId },\r\n });\r\n return;\r\n }\r\n\r\n const fieldHasService =\n (typeof (f as any).service_id === \"number\" &&\n Number.isFinite((f as any).service_id)) ||\n (typeof (f as any).service_id === \"string\" &&\n (f as any).service_id.trim().length > 0);\n const optionHasService = Array.isArray(f.options)\n ? f.options.some(\n (o) =>\n (typeof (o as any).service_id === \"number\" &&\n Number.isFinite((o as any).service_id)) ||\n (typeof (o as any).service_id === \"string\" &&\n (o as any).service_id.trim().length > 0),\n )\n : false;\n\r\n if (fieldHasService || optionHasService) {\r\n ctx.api.emit(\"error\", {\r\n code: \"field_has_service_mapping\",\r\n message:\r\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).\",\r\n meta: {\r\n fieldId,\r\n fieldHasService,\r\n optionHasService,\r\n },\r\n });\r\n return;\r\n }\r\n\r\n if (name.length === 0) {\r\n if (\"name\" in f) delete (f as any).name;\r\n return;\r\n }\r\n\r\n const collision = fields.find(\r\n (x) => x.id !== fieldId && (x.name ?? \"\") === name,\r\n );\r\n if (collision) {\r\n ctx.api.emit(\"error\", {\r\n code: \"field_name_collision\",\r\n message: `Another field already uses the name \"${name}\".`,\r\n meta: { fieldId, otherFieldId: collision.id },\r\n });\r\n return;\r\n }\r\n\r\n (f as any).name = name;\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function addOption(\r\n ctx: EditorModuleContext,\r\n fieldId: string,\r\n input: {\r\n id?: string;\n label: string;\n service_id?: ServiceIdRef;\n pricing_role?: \"base\" | \"utility\" | \"addon\";\n [k: string]: any;\n },\r\n): string {\r\n const id = input.id ?? ctx.genId(\"o\");\r\n\r\n ctx.exec({\r\n name: \"addOption\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const f = (p.fields ?? []).find((x) => x.id === fieldId);\r\n if (!f) throw new Error(`addOption: field '${fieldId}' not found`);\r\n const list = (f.options ??= []);\r\n if (list.some((o) => o.id === id)) {\r\n throw new Error(`Option id '${id}' already exists`);\r\n }\r\n list.push({ ...input, id } as any);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n\r\n return id;\r\n}\r\n\r\nexport function updateOption(\r\n ctx: EditorModuleContext,\r\n optionId: string,\r\n patch: Partial<\r\n {\n label: string;\n service_id: ServiceIdRef;\n pricing_role: \"base\" | \"utility\" | \"addon\";\n } & Record<string, any>\n >,\n) {\r\n if (!ctx.isOptionId(optionId)) {\r\n throw new Error('updateOption: optionId must start with \"o:\"');\r\n }\r\n ctx.exec({\r\n name: \"updateOption\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const owner = ownerOfOption(p, optionId);\r\n if (!owner) return;\r\n const f = (p.fields ?? []).find((x) => x.id === owner.fieldId);\r\n if (!f?.options) return;\r\n const o = f.options.find((x) => x.id === optionId);\r\n if (o) Object.assign(o, patch);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function removeOption(ctx: EditorModuleContext, optionId: string) {\r\n if (!ctx.isOptionId(optionId)) {\r\n throw new Error('removeOption: optionId must start with \"o:\"');\r\n }\r\n ctx.exec({\r\n name: \"removeOption\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const owner = ownerOfOption(p, optionId);\r\n if (!owner) return;\r\n const f = (p.fields ?? []).find((x) => x.id === owner.fieldId);\r\n if (!f?.options) return;\r\n f.options = f.options.filter((o) => o.id !== optionId);\r\n\r\n const maps: Array<\"includes_for_options\" | \"excludes_for_options\"> = [\r\n \"includes_for_options\",\r\n \"excludes_for_options\",\r\n ];\r\n for (const m of maps) {\r\n const map = (p as any)[m] as Record<string, string[]> | undefined;\r\n if (!map) continue;\r\n if (map[optionId]) delete map[optionId];\r\n if (!Object.keys(map).length) delete (p as any)[m];\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function editLabel(ctx: EditorModuleContext, id: string, label: string): void {\r\n const next = (label ?? \"\").trim();\r\n if (!next) throw new Error(\"Label cannot be empty\");\r\n\r\n ctx.exec({\r\n name: \"editLabel\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n if (ctx.isTagId(id)) {\r\n const t = (p.filters ?? []).find((x) => x.id === id);\r\n if (t) t.label = next;\r\n return;\r\n }\r\n if (ctx.isFieldId(id)) {\r\n const f = (p.fields ?? []).find((x) => x.id === id);\r\n if (f) f.label = next;\r\n return;\r\n }\r\n if (ctx.isOptionId(id)) {\r\n const own = ownerOfOption(p, id);\r\n if (!own) return;\r\n const f = (p.fields ?? []).find((x) => x.id === own.fieldId);\r\n const o = f?.options?.find((x) => x.id === id);\r\n if (o) o.label = next;\r\n return;\r\n }\r\n throw new Error(\"editLabel: unsupported id\");\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function editName(\r\n ctx: EditorModuleContext,\r\n fieldId: string,\r\n name: string | undefined,\r\n) {\r\n ctx.exec({\r\n name: \"editName\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const f = (p.fields ?? []).find((x) => x.id === fieldId);\r\n if (!f) return;\r\n f.name = name;\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function setService(\n ctx: EditorModuleContext,\n id: string,\n input: { service_id?: ServiceIdRef; pricing_role?: \"base\" | \"utility\" },\n): void {\n ctx.exec({\r\n name: \"setService\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\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 (typeof input.service_id === \"string\" &&\n input.service_id.trim().length > 0));\n const sid: ServiceIdRef | undefined = validId\n ? typeof input.service_id === \"string\"\n ? input.service_id.trim()\n : Number(input.service_id)\n : undefined;\n const nextRole = input.pricing_role;\r\n\r\n if (ctx.isTagId(id)) {\r\n const t = (p.filters ?? []).find((x) => x.id === id);\r\n if (!t) return;\r\n if (hasSidKey) {\r\n if (sid === undefined) delete (t as any).service_id;\r\n else t.service_id = sid;\r\n }\r\n return;\r\n }\r\n\r\n if (ctx.isOptionId(id)) {\r\n const own = ownerOfOption(p, id);\r\n if (!own) return;\r\n const f = (p.fields ?? []).find((x) => x.id === own.fieldId);\r\n const o = f?.options?.find((x) => x.id === id);\r\n if (!o) return;\r\n\r\n const currentRole = (o.pricing_role ?? \"base\") as\r\n | \"base\"\r\n | \"utility\";\r\n const role = nextRole ?? currentRole;\r\n\r\n if (role === \"utility\") {\r\n if (hasSidKey && sid !== undefined) {\r\n ctx.api.emit(\"error\", {\r\n message: \"Utilities cannot have service_id (option).\",\r\n code: \"utility_service_conflict\",\r\n meta: { id, service_id: sid },\r\n });\r\n }\r\n o.pricing_role = \"utility\";\r\n if (\"service_id\" in o) delete (o as any).service_id;\r\n return;\r\n }\r\n\r\n if (nextRole) o.pricing_role = \"base\";\r\n if (hasSidKey) {\r\n if (sid === undefined) delete (o as any).service_id;\r\n else o.service_id = sid;\r\n }\r\n return;\r\n }\r\n\r\n const f = (p.fields ?? []).find((x) => x.id === id);\r\n if (!f) {\r\n throw new Error(\r\n 'setService only supports tag (\"t:*\"), option (\"o:*\"), or field (\"f:*\") ids',\r\n );\r\n }\r\n\r\n const isOptionBased = Array.isArray(f.options) && f.options.length > 0;\r\n const isButton = !!(f as any).button;\r\n\r\n if (nextRole) {\r\n f.pricing_role = nextRole;\r\n }\r\n const effectiveRole = (f.pricing_role ?? \"base\") as\r\n | \"base\"\r\n | \"utility\";\r\n\r\n if (isOptionBased) {\r\n if (hasSidKey) {\r\n ctx.api.emit(\"error\", {\r\n message:\r\n \"Cannot set service_id on an option-based field. Assign service_id on its options instead.\",\r\n code: \"field_option_based_service_forbidden\",\r\n meta: { id, service_id: sid },\r\n });\r\n }\r\n if (\"service_id\" in (f as any)) delete (f as any).service_id;\r\n return;\r\n }\r\n\r\n if (!isButton) {\r\n if (hasSidKey) {\r\n ctx.api.emit(\"error\", {\r\n message:\r\n \"Only button fields (without options) can have a service_id.\",\r\n code: \"non_button_field_service_forbidden\",\r\n meta: { id, service_id: sid },\r\n });\r\n }\r\n if (\"service_id\" in (f as any)) delete (f as any).service_id;\r\n return;\r\n }\r\n\r\n if (effectiveRole === \"utility\") {\r\n if (hasSidKey && sid !== undefined) {\r\n ctx.api.emit(\"error\", {\r\n message: \"Utilities cannot have service_id (field).\",\r\n code: \"utility_service_conflict\",\r\n meta: { id, service_id: sid },\r\n });\r\n }\r\n if (\"service_id\" in (f as any)) delete (f as any).service_id;\r\n return;\r\n }\r\n\r\n if (hasSidKey) {\r\n if (sid === undefined) delete (f as any).service_id;\r\n else (f as any).service_id = sid;\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function addTag(\r\n ctx: EditorModuleContext,\r\n partial: Omit<Tag, \"id\" | \"label\"> & { id?: string; label: string },\r\n) {\r\n const id = partial.id ?? ctx.genId(\"t\");\r\n const payload = { ...partial, id };\r\n ctx.exec({\r\n name: \"addTag\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n p.filters = [...(p.filters ?? []), payload];\r\n }),\r\n undo: () =>\r\n ctx.patchProps((p) => {\r\n p.filters = (p.filters ?? []).filter((t) => t.id !== id);\r\n }),\r\n });\r\n}\r\n\r\nexport function updateTag(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n patch: Partial<Tag>,\r\n) {\r\n let prev: Tag | undefined;\r\n ctx.exec({\r\n name: \"updateTag\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n p.filters = (p.filters ?? []).map((t) => {\r\n if (t.id !== id) return t;\r\n prev = t;\r\n return { ...t, ...patch };\r\n });\r\n }),\r\n undo: () =>\r\n ctx.patchProps((p) => {\r\n p.filters = (p.filters ?? []).map((t) =>\r\n t.id === id && prev ? prev : t,\r\n );\r\n }),\r\n });\r\n}\r\n\r\nexport function removeTag(ctx: EditorModuleContext, id: string) {\r\n let prevSlice!: ServiceProps;\r\n ctx.exec({\r\n name: \"removeTag\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n prevSlice = cloneDeep(p);\r\n p.filters = (p.filters ?? []).filter((t) => t.id !== id);\r\n for (const t of p.filters ?? []) {\r\n if (t.bind_id === id) delete t.bind_id;\r\n t.includes = (t.includes ?? []).filter((x) => x !== id);\r\n t.excludes = (t.excludes ?? []).filter((x) => x !== id);\r\n }\r\n for (const f of p.fields ?? []) {\r\n if (Array.isArray(f.bind_id)) {\r\n f.bind_id = f.bind_id.filter((x) => x !== id);\r\n } else if (f.bind_id === id) {\r\n delete f.bind_id;\r\n }\r\n }\r\n }),\r\n undo: () => ctx.replaceProps(prevSlice),\r\n });\r\n}\r\n\r\nexport function addField(\r\n ctx: EditorModuleContext,\r\n partial: Omit<Field, \"id\" | \"label\" | \"type\"> & {\r\n id?: string;\r\n label: string;\r\n type: Field[\"type\"];\r\n },\r\n) {\r\n const id = partial.id ?? ctx.genId(\"f\");\r\n const payload = { ...partial, id };\r\n ctx.exec({\r\n name: \"addField\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n p.fields = [...(p.fields ?? []), payload as Field];\r\n }),\r\n undo: () =>\r\n ctx.patchProps((p) => {\r\n p.fields = (p.fields ?? []).filter((f) => f.id !== id);\r\n }),\r\n });\r\n}\r\n\r\nexport function updateField(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n patch: Partial<Field>,\r\n) {\r\n let prev: Field | undefined;\r\n let prevIncludesForButton: string[] | undefined;\r\n let prevExcludesForButton: string[] | undefined;\r\n ctx.exec({\r\n name: \"updateField\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n prevIncludesForButton = p.includes_for_buttons?.[id]\r\n ? [...(p.includes_for_buttons?.[id] ?? [])]\r\n : undefined;\r\n prevExcludesForButton = p.excludes_for_buttons?.[id]\r\n ? [...(p.excludes_for_buttons?.[id] ?? [])]\r\n : undefined;\r\n\r\n p.fields = (p.fields ?? []).map((f) => {\r\n if (f.id !== id) return f;\r\n prev = cloneDeep(f);\r\n const nextField = { ...f, ...patch } as Field;\r\n if (!isActualButtonField(nextField)) {\r\n clearFieldButtonReceiverMaps(p, id);\r\n }\r\n return nextField;\r\n });\r\n }),\r\n undo: () =>\r\n ctx.patchProps((p) => {\r\n p.fields = (p.fields ?? []).map((f) =>\r\n f.id === id && prev ? prev : f,\r\n );\r\n if (prevIncludesForButton) {\r\n p.includes_for_buttons = {\r\n ...(p.includes_for_buttons ?? {}),\r\n [id]: [...prevIncludesForButton],\r\n };\r\n } else {\r\n clearFieldButtonReceiverMaps(p, id);\r\n }\r\n if (prevExcludesForButton) {\r\n p.excludes_for_buttons = {\r\n ...(p.excludes_for_buttons ?? {}),\r\n [id]: [...prevExcludesForButton],\r\n };\r\n }\r\n }),\r\n });\r\n}\r\n\r\nexport function removeField(ctx: EditorModuleContext, id: string) {\r\n let prevSlice!: ServiceProps;\r\n ctx.exec({\r\n name: \"removeField\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n prevSlice = cloneDeep(p);\r\n p.fields = (p.fields ?? []).filter((f) => f.id !== id);\r\n clearFieldButtonReceiverMaps(p, id);\r\n for (const mapKey of [\r\n \"includes_for_buttons\",\r\n \"excludes_for_buttons\",\r\n ] as const) {\r\n const m = p[mapKey];\r\n if (!m) continue;\r\n for (const k of Object.keys(m)) {\r\n m[k] = (m[k] ?? []).filter((fid) => fid !== id);\r\n if (!m[k]?.length) delete m[k];\r\n }\r\n }\r\n for (const t of p.filters ?? []) {\r\n t.includes = (t.includes ?? []).filter((x) => x !== id);\r\n t.excludes = (t.excludes ?? []).filter((x) => x !== id);\r\n }\r\n }),\r\n undo: () => ctx.replaceProps(prevSlice),\r\n });\r\n}\r\n\r\nexport function remove(ctx: EditorModuleContext, id: string) {\r\n if (ctx.isTagId(id)) {\r\n ctx.exec({\r\n name: \"removeTag\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n p.filters = (p.filters ?? []).filter((t) => t.id !== id);\r\n\r\n for (const t of p.filters ?? []) {\r\n if (t.bind_id === id) delete t.bind_id;\r\n t.includes = (t.includes ?? []).filter((x) => x !== id);\r\n t.excludes = (t.excludes ?? []).filter((x) => x !== id);\r\n }\r\n\r\n for (const f of p.fields ?? []) {\r\n if (Array.isArray(f.bind_id)) {\r\n f.bind_id = f.bind_id.filter((x) => x !== id) as any;\r\n } else if (f.bind_id === id) {\r\n delete f.bind_id;\r\n }\r\n }\r\n\r\n if (p.order_for_tags?.[id]) delete p.order_for_tags[id];\r\n for (const k of Object.keys(p.order_for_tags ?? {})) {\r\n p.order_for_tags![k] = (p.order_for_tags![k] ?? []).filter(\r\n (fid) => (p.fields ?? []).some((f) => f.id === fid),\r\n );\r\n if (!p.order_for_tags![k].length) delete p.order_for_tags![k];\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n if (ctx.isFieldId(id)) {\r\n ctx.exec({\r\n name: \"removeField\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n p.fields = (p.fields ?? []).filter((f) => f.id !== id);\r\n\r\n for (const t of p.filters ?? []) {\r\n t.includes = (t.includes ?? []).filter((x) => x !== id);\r\n t.excludes = (t.excludes ?? []).filter((x) => x !== id);\r\n }\r\n\r\n for (const k of Object.keys(p.order_for_tags ?? {})) {\r\n p.order_for_tags![k] = (p.order_for_tags![k] ?? []).filter(\r\n (fid) => fid !== id,\r\n );\r\n if (!p.order_for_tags![k].length) delete p.order_for_tags![k];\r\n }\r\n\r\n const maps: Array<\"includes_for_options\" | \"excludes_for_options\"> = [\r\n \"includes_for_options\",\r\n \"excludes_for_options\",\r\n ];\r\n for (const m of maps) {\r\n const map = (p as any)[m] as Record<string, string[]> | undefined;\r\n if (!map) continue;\r\n for (const key of Object.keys(map)) {\r\n map[key] = (map[key] ?? []).filter((fid) => fid !== id);\r\n if (!map[key]?.length) delete map[key];\r\n }\r\n if (!Object.keys(map).length) delete (p as any)[m];\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n if (ctx.isOptionId(id)) {\r\n removeOption(ctx, id);\r\n return;\r\n }\r\n\r\n throw new Error(\"remove: unknown id prefix\");\r\n}\r\n\r\nexport function getNode(ctx: EditorModuleContext, id: string): EditorNodeLookup {\r\n const props = ctx.getProps();\r\n if (ctx.isTagId(id)) {\r\n const t = (props.filters ?? []).find((x) => x.id === id);\r\n return {\r\n kind: \"tag\",\r\n data: t,\r\n owners: { parentTagId: t?.bind_id },\r\n };\r\n }\r\n if (ctx.isFieldId(id)) {\r\n const f = (props.fields ?? []).find((x) => x.id === id);\r\n const bind = Array.isArray(f?.bind_id)\r\n ? (f!.bind_id as string[])\r\n : f?.bind_id\r\n ? [f.bind_id]\r\n : [];\r\n return { kind: \"field\", data: f, owners: { bindTagIds: bind } };\r\n }\r\n if (ctx.isOptionId(id)) {\r\n const own = ownerOfOption(props, id);\r\n const f = own ? (props.fields ?? []).find((x) => x.id === own.fieldId) : undefined;\r\n const o = f?.options?.find((x) => x.id === id);\r\n return {\r\n kind: \"option\",\r\n data: o,\r\n owners: { fieldId: own?.fieldId },\r\n };\r\n }\r\n return { kind: \"option\", data: undefined, owners: {} };\r\n}\r\n","import type { EditorOptions, Field, ServiceProps } from \"@/schema\";\r\n\r\nexport function ownerOfOption(\r\n props: ServiceProps,\r\n optionId: string,\r\n): { fieldId: string; index: number } | null {\r\n for (const f of props.fields ?? []) {\r\n const idx = (f.options ?? []).findIndex((o) => o.id === optionId);\r\n if (idx >= 0) return { fieldId: f.id, index: idx };\r\n }\r\n return null;\r\n}\r\n\r\nexport function hasFieldOptions(field: Partial<Field> | undefined): boolean {\r\n return Array.isArray(field?.options) && field.options.length > 0;\r\n}\r\n\r\nexport function isActualButtonField(field: Partial<Field> | undefined): boolean {\r\n return field?.button === true && !hasFieldOptions(field);\r\n}\r\n\r\nexport function clearFieldButtonReceiverMaps(\r\n props: ServiceProps,\r\n fieldId: string,\r\n): void {\r\n if (props.includes_for_buttons?.[fieldId]) {\r\n delete props.includes_for_buttons[fieldId];\r\n }\r\n if (props.excludes_for_buttons?.[fieldId]) {\r\n delete props.excludes_for_buttons[fieldId];\r\n }\r\n if (\r\n props.includes_for_buttons &&\r\n Object.keys(props.includes_for_buttons).length === 0\r\n ) {\r\n delete props.includes_for_buttons;\r\n }\r\n if (\r\n props.excludes_for_buttons &&\r\n Object.keys(props.excludes_for_buttons).length === 0\r\n ) {\r\n delete props.excludes_for_buttons;\r\n }\r\n}\r\n\r\nexport function ensureServiceExists(opts: EditorOptions, id: any) {\r\n if (typeof opts.serviceExists === \"function\") {\r\n if (!opts.serviceExists(id)) {\r\n throw new Error(`service_not_found:${String(id)}`);\r\n }\r\n return;\r\n }\r\n if (opts.serviceMap) {\r\n if (!Object.prototype.hasOwnProperty.call(opts.serviceMap, id as any)) {\r\n throw new Error(`service_not_found:${String(id)}`);\r\n }\r\n return;\r\n }\r\n throw new Error(\"service_checker_missing\");\r\n}\r\n","import type { EditorModuleContext } from \"./editor-types\";\r\n\r\nexport function setConstraint(\r\n ctx: EditorModuleContext,\r\n tagId: string,\r\n flag: string,\r\n value: boolean | undefined,\r\n) {\r\n let prev: boolean | undefined;\r\n ctx.exec({\r\n name: \"setConstraint\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const t = (p.filters ?? []).find((x) => x.id === tagId);\r\n if (!t) return;\r\n prev = t.constraints?.[flag];\r\n if (!t.constraints) t.constraints = {};\r\n if (value === undefined) delete t.constraints[flag];\r\n else t.constraints[flag] = value;\r\n }),\r\n undo: () =>\r\n ctx.patchProps((p) => {\r\n const t = (p.filters ?? []).find((x) => x.id === tagId);\r\n if (!t) return;\r\n if (!t.constraints) t.constraints = {};\r\n if (prev === undefined) delete t.constraints[flag];\r\n else t.constraints[flag] = prev;\r\n }),\r\n });\r\n}\r\n\r\nexport function clearConstraintOverride(\r\n ctx: EditorModuleContext,\r\n tagId: string,\r\n flag: string,\r\n) {\r\n let prev: boolean | undefined;\r\n let prevOverride: any;\r\n ctx.exec({\r\n name: \"clearConstraintOverride\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const t = (p.filters ?? []).find((x) => x.id === tagId);\r\n if (!t) return;\r\n prev = t.constraints?.[flag];\r\n prevOverride = t.constraints_overrides?.[flag];\r\n\r\n if (t.constraints) delete t.constraints[flag];\r\n if (t.constraints_overrides) delete t.constraints_overrides[flag];\r\n }),\r\n undo: () =>\r\n ctx.patchProps((p) => {\r\n const t = (p.filters ?? []).find((x) => x.id === tagId);\r\n if (!t) return;\r\n if (prev !== undefined) {\r\n if (!t.constraints) t.constraints = {};\r\n t.constraints[flag] = prev;\r\n }\r\n if (prevOverride !== undefined) {\r\n if (!t.constraints_overrides) t.constraints_overrides = {};\r\n t.constraints_overrides[flag] = prevOverride;\r\n }\r\n }),\r\n });\r\n}\r\n\r\nexport function clearConstraint(\r\n ctx: EditorModuleContext,\r\n tagId: string,\r\n flag: string,\r\n) {\r\n ctx.exec({\r\n name: \"clearConstraint\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const tags = p.filters ?? [];\r\n const byId = new Map(tags.map((t) => [t.id, t]));\r\n const children = new Map<string, string[]>();\r\n for (const t of tags) {\r\n if (t.bind_id) {\r\n if (!children.has(t.bind_id)) children.set(t.bind_id, []);\r\n children.get(t.bind_id)!.push(t.id);\r\n }\r\n }\r\n\r\n const process = (id: string) => {\r\n const t = byId.get(id);\r\n if (!t) return;\r\n\r\n const override = t.constraints_overrides?.[flag];\r\n if (override) {\r\n if (!t.constraints) t.constraints = {};\r\n t.constraints[flag] = override.from;\r\n delete t.constraints_overrides![flag];\r\n if (Object.keys(t.constraints_overrides ?? {}).length === 0) {\r\n delete t.constraints_overrides;\r\n }\r\n } else if (t.constraints) {\r\n delete t.constraints[flag];\r\n if (Object.keys(t.constraints).length === 0) {\r\n delete t.constraints;\r\n }\r\n }\r\n\r\n for (const childId of children.get(id) ?? []) {\r\n process(childId);\r\n }\r\n };\r\n\r\n process(tagId);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n","import { normalizeFieldValidation } from \"@/core\";\r\nimport type { FieldValidationRule } from \"@/schema\";\r\nimport type { EditorModuleContext, QuantityRule } from \"./editor-types\";\r\n\r\nexport function getFieldQuantityRule(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n): QuantityRule | undefined {\r\n const props = ctx.getProps();\r\n const f = (props.fields ?? []).find((x) => x.id === id);\r\n if (!f) return undefined;\r\n return normalizeQuantityRule((f as any).meta?.quantity);\r\n}\r\n\r\nexport function setFieldQuantityRule(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n rule: unknown,\r\n): void {\r\n ctx.exec({\r\n name: \"setFieldQuantityRule\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const f = (p.fields ?? []).find((x) => x.id === id);\r\n if (!f) return;\r\n\r\n const normalized = normalizeQuantityRule(rule);\r\n\r\n if (!normalized) {\r\n if ((f as any).meta?.quantity !== undefined) {\r\n delete (f as any).meta.quantity;\r\n if ((f as any).meta && Object.keys((f as any).meta).length === 0) {\r\n delete (f as any).meta;\r\n }\r\n }\r\n return;\r\n }\r\n\r\n (f as any).meta = {\r\n ...(f as any).meta,\r\n quantity: normalized,\r\n };\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function clearFieldQuantityRule(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n): void {\r\n ctx.exec({\r\n name: \"clearFieldQuantityRule\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const f = (p.fields ?? []).find((x) => x.id === id);\r\n if (!f || !(f as any).meta?.quantity) return;\r\n delete (f as any).meta.quantity;\r\n if ((f as any).meta && Object.keys((f as any).meta).length === 0) {\r\n delete (f as any).meta;\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function getFieldValidation(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n): FieldValidationRule[] | undefined {\r\n const props = ctx.getProps();\r\n const f = (props.fields ?? []).find((x) => x.id === id);\r\n if (!f) return undefined;\r\n return normalizeFieldValidation((f as any).validation);\r\n}\r\n\r\nexport function setFieldValidation(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n rules: unknown,\r\n): void {\r\n ctx.exec({\r\n name: \"setFieldValidation\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const f = (p.fields ?? []).find((x) => x.id === id);\r\n if (!f) return;\r\n\r\n const normalized = normalizeFieldValidation(rules);\r\n\r\n if (!normalized) {\r\n if (\"validation\" in f) delete (f as any).validation;\r\n return;\r\n }\r\n\r\n (f as any).validation = normalized;\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function clearFieldValidation(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n): void {\r\n ctx.exec({\r\n name: \"clearFieldValidation\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const f = (p.fields ?? []).find((x) => x.id === id);\r\n if (!f || !(f as any).validation) return;\r\n delete (f as any).validation;\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function normalizeQuantityRule(input: unknown): QuantityRule | undefined {\r\n if (!input || typeof input !== \"object\") return undefined;\r\n const v = input as any;\r\n const vb = v.valueBy;\r\n if (vb !== \"value\" && vb !== \"length\" && vb !== \"eval\") return undefined;\r\n\r\n const out: QuantityRule = { valueBy: vb };\r\n if (vb === \"eval\" && typeof v.code === \"string\" && v.code.trim()) {\r\n out.code = v.code;\r\n }\r\n if (typeof v.multiply === \"number\" && Number.isFinite(v.multiply)) {\r\n out.multiply = v.multiply;\r\n }\r\n if (typeof v.fallback === \"number\" && Number.isFinite(v.fallback)) {\r\n out.fallback = v.fallback;\r\n }\r\n if (v.clamp && typeof v.clamp === \"object\") {\r\n const min =\r\n typeof v.clamp.min === \"number\" && Number.isFinite(v.clamp.min)\r\n ? v.clamp.min\r\n : undefined;\r\n const max =\r\n typeof v.clamp.max === \"number\" && Number.isFinite(v.clamp.max)\r\n ? v.clamp.max\r\n : undefined;\r\n if (min !== undefined || max !== undefined) {\r\n out.clamp = {\r\n ...(min !== undefined ? { min } : {}),\r\n ...(max !== undefined ? { max } : {}),\r\n };\r\n }\r\n }\r\n return out;\r\n}\r\n","import type { ServiceProps } from \"@/schema\";\r\nimport type { EditorModuleContext, WireKind } from \"./editor-types\";\r\nimport { ensureServiceExists, isActualButtonField } from \"./editor-utils\";\r\n\r\nexport function wouldCreateTagCycle(\r\n _ctx: EditorModuleContext,\r\n p: ServiceProps,\r\n parentId: string,\r\n childId: string,\r\n): boolean {\r\n if (parentId === childId) return true;\r\n const tagById = new Map((p.filters ?? []).map((t) => [t.id, t]));\r\n let cur: string | undefined = parentId;\r\n const guard = new Set<string>();\r\n while (cur) {\r\n if (cur === childId) return true;\r\n if (guard.has(cur)) break;\r\n guard.add(cur);\r\n cur = tagById.get(cur)?.bind_id;\r\n }\r\n return false;\r\n}\r\n\r\nexport function wouldCreateIncludeExcludeCycle(\r\n ctx: EditorModuleContext,\r\n p: ServiceProps,\r\n receiverId: string,\r\n targetId: string,\r\n): boolean {\r\n if (receiverId === targetId) return true;\r\n\r\n const getDirectRelations = (id: string): string[] => {\r\n if (ctx.isTagId(id)) {\r\n const t = (p.filters ?? []).find((x) => x.id === id);\r\n return [...(t?.includes ?? []), ...(t?.excludes ?? [])];\r\n }\r\n const inc = p.includes_for_buttons?.[id] ?? [];\r\n const exc = p.excludes_for_buttons?.[id] ?? [];\r\n return [...inc, ...exc];\r\n };\r\n\r\n const visited = new Set<string>();\r\n const stack = [targetId];\r\n\r\n while (stack.length > 0) {\r\n const curr = stack.pop()!;\r\n if (curr === receiverId) return true;\r\n if (visited.has(curr)) continue;\r\n visited.add(curr);\r\n stack.push(...getDirectRelations(curr));\r\n }\r\n\r\n return false;\r\n}\r\n\r\nexport function include(\r\n ctx: EditorModuleContext,\r\n receiverId: string,\r\n idOrIds: string | string[],\r\n) {\r\n ctx.exec({\r\n name: \"include\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const receiver = ctx.getNode(receiverId);\r\n const ids = Array.isArray(idOrIds) ? idOrIds : [idOrIds];\r\n if (\r\n receiver.kind === \"tag\" ||\r\n (receiver.kind === \"field\" && isActualButtonField(receiver.data)) ||\r\n receiver.kind === \"option\"\r\n ) {\r\n if (receiver.kind === \"tag\") {\r\n const t = (p.filters ?? []).find((x) => x.id === receiverId);\r\n if (t) {\r\n const accepted: string[] = [];\r\n const next = new Set(t.includes ?? []);\r\n for (const id of ids) {\r\n if (\r\n wouldCreateIncludeExcludeCycle(\r\n ctx,\r\n p,\r\n receiverId,\r\n id,\r\n )\r\n ) {\r\n ctx.emit(\"editor:error\", {\r\n message: `Cycle detected: ${receiverId} including ${id} would create a cycle.`,\r\n code: \"cycle_detected\",\r\n meta: {\r\n receiverId,\r\n targetId: id,\r\n type: \"include\",\r\n },\r\n });\r\n continue;\r\n }\r\n next.add(id);\r\n accepted.push(id);\r\n }\r\n if (accepted.length > 0 || (t.includes?.length ?? 0) > 0) {\r\n t.includes = Array.from(next);\r\n }\r\n\r\n if (t.excludes) {\r\n t.excludes = t.excludes.filter(\r\n (x) => !accepted.includes(x),\r\n );\r\n if (t.excludes.length === 0) {\r\n delete t.excludes;\r\n }\r\n }\r\n }\r\n } else {\r\n const accepted: string[] = [];\r\n const current = p.includes_for_buttons?.[receiverId] ?? [];\r\n const next = new Set(current);\r\n for (const id of ids) {\r\n if (\r\n wouldCreateIncludeExcludeCycle(ctx, p, receiverId, id)\r\n ) {\r\n ctx.emit(\"editor:error\", {\r\n message: `Cycle detected: ${receiverId} including ${id} would create a cycle.`,\r\n code: \"cycle_detected\",\r\n meta: {\r\n receiverId,\r\n targetId: id,\r\n type: \"include\",\r\n },\r\n });\r\n continue;\r\n }\r\n next.add(id);\r\n accepted.push(id);\r\n }\r\n if (accepted.length > 0 || current.length > 0) {\r\n if (!p.includes_for_buttons) p.includes_for_buttons = {};\r\n p.includes_for_buttons[receiverId] = Array.from(next);\r\n }\r\n\r\n if (p.excludes_for_buttons?.[receiverId]) {\r\n p.excludes_for_buttons[receiverId] =\r\n p.excludes_for_buttons[receiverId].filter(\r\n (x) => !accepted.includes(x),\r\n );\r\n if (p.excludes_for_buttons[receiverId].length === 0) {\r\n delete p.excludes_for_buttons[receiverId];\r\n }\r\n }\r\n }\r\n\r\n if (!p.fields) p.fields = [];\r\n if (!p.filters) p.filters = [];\r\n } else {\r\n throw new Error(\"Receiver must be a tag, button field, or option\");\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function exclude(\r\n ctx: EditorModuleContext,\r\n receiverId: string,\r\n idOrIds: string | string[],\r\n) {\r\n ctx.exec({\r\n name: \"exclude\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const receiver = ctx.getNode(receiverId);\r\n const ids = Array.isArray(idOrIds) ? idOrIds : [idOrIds];\r\n if (\r\n receiver.kind === \"tag\" ||\r\n (receiver.kind === \"field\" && isActualButtonField(receiver.data)) ||\r\n receiver.kind === \"option\"\r\n ) {\r\n if (receiver.kind === \"tag\") {\r\n const t = (p.filters ?? []).find((x) => x.id === receiverId);\r\n if (t) {\r\n const accepted: string[] = [];\r\n const next = new Set(t.excludes ?? []);\r\n for (const id of ids) {\r\n if (\r\n wouldCreateIncludeExcludeCycle(\r\n ctx,\r\n p,\r\n receiverId,\r\n id,\r\n )\r\n ) {\r\n ctx.emit(\"editor:error\", {\r\n message: `Cycle detected: ${receiverId} excluding ${id} would create a cycle.`,\r\n code: \"cycle_detected\",\r\n meta: {\r\n receiverId,\r\n targetId: id,\r\n type: \"exclude\",\r\n },\r\n });\r\n continue;\r\n }\r\n next.add(id);\r\n accepted.push(id);\r\n }\r\n if (accepted.length > 0 || (t.excludes?.length ?? 0) > 0) {\r\n t.excludes = Array.from(next);\r\n }\r\n\r\n if (t.includes) {\r\n t.includes = t.includes.filter(\r\n (x) => !accepted.includes(x),\r\n );\r\n if (t.includes.length === 0) {\r\n delete t.includes;\r\n }\r\n }\r\n }\r\n } else {\r\n const accepted: string[] = [];\r\n const current = p.excludes_for_buttons?.[receiverId] ?? [];\r\n const next = new Set(current);\r\n for (const id of ids) {\r\n if (\r\n wouldCreateIncludeExcludeCycle(ctx, p, receiverId, id)\r\n ) {\r\n ctx.emit(\"editor:error\", {\r\n message: `Cycle detected: ${receiverId} excluding ${id} would create a cycle.`,\r\n code: \"cycle_detected\",\r\n meta: {\r\n receiverId,\r\n targetId: id,\r\n type: \"exclude\",\r\n },\r\n });\r\n continue;\r\n }\r\n next.add(id);\r\n accepted.push(id);\r\n }\r\n if (accepted.length > 0 || current.length > 0) {\r\n if (!p.excludes_for_buttons) p.excludes_for_buttons = {};\r\n p.excludes_for_buttons[receiverId] = Array.from(next);\r\n }\r\n\r\n if (p.includes_for_buttons?.[receiverId]) {\r\n p.includes_for_buttons[receiverId] =\r\n p.includes_for_buttons[receiverId].filter(\r\n (x) => !accepted.includes(x),\r\n );\r\n if (p.includes_for_buttons[receiverId].length === 0) {\r\n delete p.includes_for_buttons[receiverId];\r\n }\r\n }\r\n }\r\n\r\n if (!p.fields) p.fields = [];\r\n if (!p.filters) p.filters = [];\r\n } else {\r\n throw new Error(\"Receiver must be a tag, button field, or option\");\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function connect(\r\n ctx: EditorModuleContext,\r\n kind: WireKind,\r\n fromId: string,\r\n toId: string,\r\n): void {\r\n ctx.exec({\r\n name: `connect:${kind}`,\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n if (kind === \"bind\") {\r\n if (ctx.isTagId(fromId) && ctx.isTagId(toId)) {\r\n if (wouldCreateTagCycle(ctx, p, fromId, toId)) {\r\n throw new Error(`bind would create a cycle: ${fromId} ? ${toId}`);\r\n }\r\n const child = (p.filters ?? []).find((t) => t.id === toId);\r\n if (child) child.bind_id = fromId;\r\n return;\r\n }\r\n if (\r\n (ctx.isTagId(fromId) && ctx.isFieldId(toId)) ||\r\n (ctx.isFieldId(fromId) && ctx.isTagId(toId))\r\n ) {\r\n const fieldId = ctx.isFieldId(toId) ? toId : fromId;\r\n const tagId = ctx.isTagId(fromId) ? fromId : toId;\r\n const f = (p.fields ?? []).find((x) => x.id === fieldId);\r\n if (!f) return;\r\n if (!f.bind_id) {\r\n f.bind_id = tagId;\r\n return;\r\n }\r\n if (typeof f.bind_id === \"string\") {\r\n if (f.bind_id !== tagId) f.bind_id = [f.bind_id, tagId];\r\n return;\r\n }\r\n if (!f.bind_id.includes(tagId)) f.bind_id.push(tagId);\r\n return;\r\n }\r\n throw new Error(`bind: unsupported route ${fromId} ? ${toId}`);\r\n }\r\n\r\n if (kind === \"include\" || kind === \"exclude\") {\r\n const key = kind === \"include\" ? \"includes\" : \"excludes\";\r\n\r\n if (ctx.isTagId(fromId) && ctx.isFieldId(toId)) {\r\n const t = (p.filters ?? []).find((x) => x.id === fromId);\r\n if (!t) return;\r\n const arr = (t[key] ??= []);\r\n if (!arr.includes(toId)) arr.push(toId);\r\n return;\r\n }\r\n\r\n if (ctx.isOptionId(fromId) && ctx.isFieldId(toId)) {\r\n const mapKey =\r\n kind === \"include\"\r\n ? \"includes_for_options\"\r\n : \"excludes_for_options\";\r\n const maps = (p as any)[mapKey] as\r\n | Record<string, string[]>\r\n | undefined;\r\n const next = { ...(maps ?? {}) };\r\n const arr = next[fromId] ?? [];\r\n if (!arr.includes(toId)) arr.push(toId);\r\n next[fromId] = arr;\r\n (p as any)[mapKey] = next;\r\n return;\r\n }\r\n\r\n throw new Error(`${kind}: unsupported route ${fromId} ? ${toId}`);\r\n }\r\n\r\n if (kind === \"service\") {\r\n ensureServiceExists(ctx.opts, fromId);\r\n\r\n if (toId.startsWith(\"t:\")) {\r\n ctx.exec({\r\n name: \"connect:service?tag\",\r\n do: () =>\r\n ctx.patchProps((next) => {\r\n const t = (next.filters ?? []).find((x) => x.id === toId);\r\n if (t) (t as any).service_id = fromId;\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n if (toId.startsWith(\"o:\")) {\r\n ctx.exec({\r\n name: \"connect:service?option\",\r\n do: () =>\r\n ctx.patchProps((next) => {\r\n for (const f of next.fields ?? []) {\r\n const o = f.options?.find((x) => x.id === toId);\r\n if (o) {\r\n (o as any).service_id = fromId;\r\n return;\r\n }\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n throw new Error('service: to must be a tag (\"t:*\") or option (\"o:*\")');\r\n }\r\n\r\n throw new Error(`Unknown connect kind: ${kind}`);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n\r\nexport function disconnect(\r\n ctx: EditorModuleContext,\r\n kind: WireKind,\r\n fromId: string,\r\n toId: string,\r\n): void {\r\n ctx.exec({\r\n name: `disconnect:${kind}`,\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n if (kind === \"bind\") {\r\n if (ctx.isTagId(fromId) && ctx.isTagId(toId)) {\r\n const child = (p.filters ?? []).find((t) => t.id === toId);\r\n if (child?.bind_id === fromId) delete child.bind_id;\r\n return;\r\n }\r\n if (\r\n (ctx.isTagId(fromId) && ctx.isFieldId(toId)) ||\r\n (ctx.isFieldId(fromId) && ctx.isTagId(toId))\r\n ) {\r\n const fieldId = ctx.isFieldId(toId) ? toId : fromId;\r\n const tagId = ctx.isTagId(fromId) ? fromId : toId;\r\n const f = (p.fields ?? []).find((x) => x.id === fieldId);\r\n if (!f?.bind_id) return;\r\n if (typeof f.bind_id === \"string\") {\r\n if (f.bind_id === tagId) delete f.bind_id;\r\n return;\r\n }\r\n f.bind_id = f.bind_id.filter((x) => x !== tagId) as any;\r\n if (f.bind_id?.length === 0) delete f.bind_id;\r\n return;\r\n }\r\n throw new Error(`unbind: unsupported route ${fromId} ? ${toId}`);\r\n }\r\n\r\n if (kind === \"include\" || kind === \"exclude\") {\r\n const key = kind === \"include\" ? \"includes\" : \"excludes\";\r\n\r\n if (ctx.isTagId(fromId) && ctx.isFieldId(toId)) {\r\n const t = (p.filters ?? []).find((x) => x.id === fromId);\r\n if (!t) return;\r\n t[key] = (t[key] ?? []).filter((x) => x !== toId);\r\n if (!t[key]?.length) delete (t as any)[key];\r\n return;\r\n }\r\n\r\n if (ctx.isOptionId(fromId) && ctx.isFieldId(toId)) {\r\n const mapKey =\r\n kind === \"include\"\r\n ? \"includes_for_options\"\r\n : \"excludes_for_options\";\r\n const maps = (p as any)[mapKey] as\r\n | Record<string, string[]>\r\n | undefined;\r\n if (!maps) return;\r\n if (maps[fromId]) {\r\n maps[fromId] = (maps[fromId] ?? []).filter(\r\n (fid) => fid !== toId,\r\n );\r\n if (!maps[fromId]?.length) delete maps[fromId];\r\n }\r\n if (!Object.keys(maps).length) delete (p as any)[mapKey];\r\n return;\r\n }\r\n\r\n throw new Error(`${kind}: unsupported route ${fromId} ? ${toId}`);\r\n }\r\n\r\n if (kind === \"service\") {\r\n ensureServiceExists(ctx.opts, fromId);\r\n\r\n if (toId.startsWith(\"t:\")) {\r\n ctx.exec({\r\n name: \"disconnect:service?tag\",\r\n do: () =>\r\n ctx.patchProps((next) => {\r\n const t = (next.filters ?? []).find((x) => x.id === toId);\r\n if (t) delete (t as any).service_id;\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n if (toId.startsWith(\"o:\")) {\r\n ctx.exec({\r\n name: \"disconnect:service?option\",\r\n do: () =>\r\n ctx.patchProps((next) => {\r\n for (const f of next.fields ?? []) {\r\n const o = f.options?.find((x) => x.id === toId);\r\n if (o) {\r\n delete (o as any).service_id;\r\n return;\r\n }\r\n }\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n throw new Error('service: to must be a tag (\"t:*\") or option (\"o:*\")');\r\n }\r\n\r\n throw new Error(`Unknown disconnect kind: ${kind}`);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n","import {\r\n filterServicesForVisibleGroup as filterServicesForVisibleGroupCore,\r\n type FilterServicesForVisibleGroupInput,\r\n} from \"@/core\";\r\nimport type { FallbackSettings } from \"@/schema\";\r\nimport type { EditorModuleContext, ServiceCheck } from \"./editor-types\";\r\n\r\nexport function filterServicesForVisibleGroup(\r\n ctx: EditorModuleContext,\r\n candidates: Array<number | string>,\r\n input: {\r\n tagId: string;\r\n selectedButtons?: string[];\r\n usedServiceIds: Array<number | string>;\r\n effectiveConstraints?: Partial<Record<\"refill\" | \"cancel\" | \"dripfeed\", boolean>>;\r\n policies?: unknown;\r\n fallback?: FallbackSettings;\r\n },\r\n): ServiceCheck[] {\r\n const coreInput: FilterServicesForVisibleGroupInput = {\r\n candidates,\r\n context: {\r\n tagId: input.tagId,\r\n selectedButtons: input.selectedButtons,\r\n usedServiceIds: input.usedServiceIds,\r\n effectiveConstraints: input.effectiveConstraints,\r\n policies: input.policies,\r\n fallback: input.fallback,\r\n },\r\n };\r\n const result = filterServicesForVisibleGroupCore(coreInput, {\r\n builder: ctx.builder,\r\n });\r\n ctx.setLastPolicyDiagnostics(result.diagnostics);\r\n return result.checks;\r\n}\r\n","import type { Tag } from \"@/schema\";\r\nimport type { EditorModuleContext } from \"./editor-types\";\r\nimport { ownerOfOption } from \"./editor-utils\";\r\n\r\nexport function placeNode(\r\n ctx: EditorModuleContext,\r\n id: string,\r\n opts: {\r\n scopeTagId?: string;\r\n beforeId?: string;\r\n afterId?: string;\r\n index?: number;\r\n },\r\n) {\r\n if (ctx.isTagId(id)) {\r\n ctx.exec({\r\n name: \"placeTag\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const all = p.filters ?? [];\r\n const cur = all.find((t) => t.id === id);\r\n if (!cur) return;\r\n const groupKey = cur.bind_id ?? \"__root__\";\r\n const siblings = all.filter(\r\n (t) => (t.bind_id ?? \"__root__\") === groupKey,\r\n );\r\n\r\n const curIdx = siblings.findIndex((t) => t.id === id);\r\n if (curIdx < 0) return;\r\n const pulled = siblings.splice(curIdx, 1)[0];\r\n\r\n let dest = typeof opts.index === \"number\" ? opts.index : undefined;\r\n if (opts.beforeId) {\r\n dest = Math.max(\r\n 0,\r\n siblings.findIndex((t) => t.id === opts.beforeId),\r\n );\r\n }\r\n if (opts.afterId) {\r\n dest = Math.min(\r\n siblings.length,\r\n siblings.findIndex((t) => t.id === opts.afterId) + 1,\r\n );\r\n }\r\n if (dest === undefined || Number.isNaN(dest)) {\r\n dest = siblings.length;\r\n }\r\n\r\n const out: Tag[] = [];\r\n for (const t of all) {\r\n const sameGroup = (t.bind_id ?? \"__root__\") === groupKey;\r\n if (!sameGroup) {\r\n out.push(t);\r\n }\r\n }\r\n siblings.splice(dest, 0, pulled);\r\n p.filters = [...out, ...siblings];\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n if (ctx.isFieldId(id)) {\r\n if (!opts.scopeTagId) {\r\n throw new Error(\"placeNode(field): scopeTagId is required\");\r\n }\r\n const fieldId = id;\r\n const tagId = opts.scopeTagId;\r\n\r\n ctx.exec({\r\n name: \"placeField\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const map = (p.order_for_tags ??= {});\r\n const arr = (map[tagId] ??= []);\r\n const curIdx = arr.indexOf(fieldId);\r\n if (curIdx >= 0) arr.splice(curIdx, 1);\r\n\r\n let dest = typeof opts.index === \"number\" ? opts.index : undefined;\r\n if (opts.beforeId) dest = Math.max(0, arr.indexOf(opts.beforeId));\r\n if (opts.afterId) {\r\n dest = Math.min(arr.length, arr.indexOf(opts.afterId) + 1);\r\n }\r\n if (dest === undefined || Number.isNaN(dest)) dest = arr.length;\r\n\r\n arr.splice(dest, 0, fieldId);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n return;\r\n }\r\n\r\n if (ctx.isOptionId(id)) {\r\n placeOption(ctx, id, opts);\r\n return;\r\n }\r\n\r\n throw new Error(\"placeNode: unknown id prefix\");\r\n}\r\n\r\nexport function placeOption(\r\n ctx: EditorModuleContext,\r\n optionId: string,\r\n opts: { beforeId?: string; afterId?: string; index?: number },\r\n) {\r\n if (!ctx.isOptionId(optionId)) {\r\n throw new Error('placeOption: optionId must start with \"o:\"');\r\n }\r\n\r\n ctx.exec({\r\n name: \"placeOption\",\r\n do: () =>\r\n ctx.patchProps((p) => {\r\n const owner = ownerOfOption(p, optionId);\r\n if (!owner) return;\r\n const f = (p.fields ?? []).find((x) => x.id === owner.fieldId);\r\n if (!f?.options) return;\r\n\r\n const curIdx = f.options.findIndex((o) => o.id === optionId);\r\n if (curIdx < 0) return;\r\n\r\n const pulled = f.options.splice(curIdx, 1)[0];\r\n\r\n let dest = typeof opts.index === \"number\" ? opts.index : undefined;\r\n if (opts.beforeId) {\r\n dest = Math.max(\r\n 0,\r\n f.options.findIndex((o) => o.id === opts.beforeId),\r\n );\r\n }\r\n if (opts.afterId) {\r\n dest = Math.min(\r\n f.options.length,\r\n f.options.findIndex((o) => o.id === opts.afterId) + 1,\r\n );\r\n }\r\n if (dest === undefined || Number.isNaN(dest)) {\r\n dest = f.options.length;\r\n }\r\n\r\n f.options.splice(dest, 0, pulled);\r\n }),\r\n undo: () => ctx.undo(),\r\n });\r\n}\r\n","// src/react/canvas/editor/editor-catalog.ts\n\nimport type {\n CatalogId,\n CatalogNode,\n CatalogServiceId,\n CatalogSmartRule,\n ServiceCatalogState,\n} from \"@/schema\";\n\nfunction clone<T>(value: T): T {\n return JSON.parse(JSON.stringify(value));\n}\n\nfunction normalizeServiceIds(\n ids: Array<CatalogServiceId> | undefined,\n): Array<CatalogServiceId> {\n if (!ids?.length) return [];\n const seen = new Set<string>();\n const out: Array<CatalogServiceId> = [];\n\n for (const id of ids) {\n const key = String(id);\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(id);\n }\n\n return out;\n}\n\nfunction sortNodes(nodes: CatalogNode[]): CatalogNode[] {\n return [...nodes].sort((a, b) => {\n const ao = a.order ?? 0;\n const bo = b.order ?? 0;\n if (ao !== bo) return ao - bo;\n return a.label.localeCompare(b.label);\n });\n}\n\nexport function createEmptyCatalog(): ServiceCatalogState {\n return {\n version: 1,\n nodes: [],\n activeNodeId: undefined,\n expandedIds: [],\n pinnedNodeIds: [],\n selectedServiceId: undefined,\n viewMode: \"all\",\n };\n}\n\nexport function ensureCatalog(\n catalog?: ServiceCatalogState,\n): ServiceCatalogState {\n return clone(catalog ?? createEmptyCatalog());\n}\n\nexport function getCatalogNode(\n catalog: ServiceCatalogState | undefined,\n id: CatalogId,\n): CatalogNode | undefined {\n return (catalog?.nodes ?? []).find((x) => x.id === id);\n}\n\nexport function getCatalogChildren(\n catalog: ServiceCatalogState | undefined,\n parentId?: CatalogId,\n): CatalogNode[] {\n return sortNodes(\n (catalog?.nodes ?? []).filter((x) => x.parentId === parentId),\n );\n}\n\nexport function hasCatalogNode(\n catalog: ServiceCatalogState | undefined,\n id: CatalogId,\n): boolean {\n return !!getCatalogNode(catalog, id);\n}\n\nexport function createCatalogId(\n catalog: ServiceCatalogState | undefined,\n prefix = \"cg\",\n): string {\n const taken = new Set((catalog?.nodes ?? []).map((x) => x.id));\n for (let i = 1; i < 10000; i++) {\n const id = `${prefix}:${i}`;\n if (!taken.has(id)) return id;\n }\n throw new Error(\"Unable to generate catalog id\");\n}\n\nexport function addCatalogGroup(\n catalog: ServiceCatalogState | undefined,\n input: {\n id?: string;\n label: string;\n parentId?: string;\n description?: string;\n serviceIds?: Array<CatalogServiceId>;\n collapsed?: boolean;\n order?: number;\n color?: string;\n icon?: string;\n },\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n const id = input.id ?? createCatalogId(next, \"cg\");\n\n next.nodes.push({\n id,\n kind: \"group\",\n label: input.label,\n parentId: input.parentId,\n description: input.description,\n serviceIds: normalizeServiceIds(input.serviceIds),\n collapsed: input.collapsed,\n order: input.order,\n color: input.color,\n icon: input.icon,\n });\n\n next.activeNodeId = id;\n return next;\n}\n\nexport function addSmartCatalogGroup(\n catalog: ServiceCatalogState | undefined,\n input: {\n id?: string;\n label: string;\n parentId?: string;\n description?: string;\n rules: CatalogSmartRule[];\n match?: \"all\" | \"any\";\n collapsed?: boolean;\n order?: number;\n color?: string;\n icon?: string;\n },\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n const id = input.id ?? createCatalogId(next, \"csg\");\n\n next.nodes.push({\n id,\n kind: \"smart-group\",\n label: input.label,\n parentId: input.parentId,\n description: input.description,\n rules: clone(input.rules ?? []),\n match: input.match ?? \"all\",\n collapsed: input.collapsed,\n order: input.order,\n color: input.color,\n icon: input.icon,\n });\n\n next.activeNodeId = id;\n return next;\n}\n\nexport function updateCatalogNode(\n catalog: ServiceCatalogState | undefined,\n id: CatalogId,\n patch: Partial<Omit<CatalogNode, \"id\" | \"kind\">>,\n): ServiceCatalogState | undefined {\n if (!catalog) return catalog;\n\n const next = ensureCatalog(catalog);\n const idx = next.nodes.findIndex((x) => x.id === id);\n if (idx < 0) return next;\n\n const current = next.nodes[idx]!;\n next.nodes[idx] = {\n ...current,\n ...patch,\n } as CatalogNode;\n\n if (next.nodes[idx]?.kind === \"group\") {\n next.nodes[idx] = {\n ...next.nodes[idx],\n serviceIds: normalizeServiceIds(\n (next.nodes[idx] as Extract<CatalogNode, { kind: \"group\" }>)\n .serviceIds,\n ),\n } as CatalogNode;\n }\n\n return next;\n}\n\nexport function setActiveCatalogNode(\n catalog: ServiceCatalogState | undefined,\n id?: CatalogId,\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n next.activeNodeId = id;\n return next;\n}\n\nexport function setCatalogViewMode(\n catalog: ServiceCatalogState | undefined,\n mode: ServiceCatalogState[\"viewMode\"],\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n next.viewMode = mode;\n return next;\n}\n\nexport function setSelectedCatalogService(\n catalog: ServiceCatalogState | undefined,\n serviceId?: CatalogServiceId,\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n next.selectedServiceId = serviceId;\n return next;\n}\n\nexport function toggleCatalogExpanded(\n catalog: ServiceCatalogState | undefined,\n id: CatalogId,\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n const expanded = new Set(next.expandedIds ?? []);\n\n if (expanded.has(id)) expanded.delete(id);\n else expanded.add(id);\n\n next.expandedIds = Array.from(expanded);\n return next;\n}\n\nexport function setCatalogExpanded(\n catalog: ServiceCatalogState | undefined,\n id: CatalogId,\n expanded: boolean,\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n const set = new Set(next.expandedIds ?? []);\n\n if (expanded) set.add(id);\n else set.delete(id);\n\n next.expandedIds = Array.from(set);\n return next;\n}\n\nexport function toggleCatalogPinned(\n catalog: ServiceCatalogState | undefined,\n id: CatalogId,\n): ServiceCatalogState {\n const next = ensureCatalog(catalog);\n const pinned = new Set(next.pinnedNodeIds ?? []);\n\n if (pinned.has(id)) pinned.delete(id);\n else pinned.add(id);\n\n next.pinnedNodeIds = Array.from(pinned);\n return next;\n}\n\nexport function assignServicesToCatalogGroup(\n catalog: ServiceCatalogState | undefined,\n nodeId: CatalogId,\n serviceIds: Array<CatalogServiceId>,\n mode: \"append\" | \"replace\" | \"remove\" = \"append\",\n): ServiceCatalogState | undefined {\n if (!catalog) return catalog;\n\n const next = ensureCatalog(catalog);\n const node = next.nodes.find(\n (x) => x.id === nodeId && x.kind === \"group\",\n ) as Extract<CatalogNode, { kind: \"group\" }> | undefined;\n\n if (!node) return next;\n\n const incoming = normalizeServiceIds(serviceIds);\n const current = normalizeServiceIds(node.serviceIds);\n\n if (mode === \"replace\") {\n node.serviceIds = incoming;\n return next;\n }\n\n if (mode === \"append\") {\n node.serviceIds = normalizeServiceIds([...current, ...incoming]);\n return next;\n }\n\n node.serviceIds = current.filter(\n (id) => !incoming.some((x) => String(x) === String(id)),\n );\n return next;\n}\n\nexport function clearCatalog(): ServiceCatalogState {\n return createEmptyCatalog();\n}\n\nexport function removeCatalogNode(\n catalog: ServiceCatalogState | undefined,\n id: CatalogId,\n opts?: { cascade?: boolean },\n): ServiceCatalogState | undefined {\n if (!catalog) return catalog;\n\n const next = ensureCatalog(catalog);\n\n const ids = new Set<string>([id]);\n\n if (opts?.cascade) {\n const queue = [id];\n while (queue.length) {\n const current = queue.shift()!;\n for (const child of next.nodes.filter(\n (x) => x.parentId === current,\n )) {\n if (!ids.has(child.id)) {\n ids.add(child.id);\n queue.push(child.id);\n }\n }\n }\n }\n\n next.nodes = next.nodes.filter((x) => !ids.has(x.id));\n\n if (next.activeNodeId && ids.has(next.activeNodeId)) {\n next.activeNodeId = undefined;\n }\n\n next.expandedIds = (next.expandedIds ?? []).filter((x) => !ids.has(x));\n next.pinnedNodeIds = (next.pinnedNodeIds ?? []).filter((x) => !ids.has(x));\n\n return next;\n}\n\nexport function moveCatalogNode(\n catalog: ServiceCatalogState | undefined,\n nodeId: CatalogId,\n opts: {\n parentId?: CatalogId;\n beforeId?: CatalogId;\n afterId?: CatalogId;\n index?: number;\n },\n): ServiceCatalogState | undefined {\n if (!catalog) return catalog;\n\n const next = ensureCatalog(catalog);\n const node = next.nodes.find((x) => x.id === nodeId);\n if (!node) return next;\n\n node.parentId = opts.parentId;\n\n const siblings = next.nodes\n .filter((x) => x.parentId === opts.parentId && x.id !== nodeId)\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n\n let dest = typeof opts.index === \"number\" ? opts.index : siblings.length;\n\n if (opts.beforeId) {\n const idx = siblings.findIndex((x) => x.id === opts.beforeId);\n if (idx >= 0) dest = idx;\n }\n\n if (opts.afterId) {\n const idx = siblings.findIndex((x) => x.id === opts.afterId);\n if (idx >= 0) dest = idx + 1;\n }\n\n const ordered = [...siblings];\n ordered.splice(dest, 0, node);\n\n ordered.forEach((item, i) => {\n item.order = i;\n });\n\n return next;\n}\n\nexport function resolveSmartCatalogGroup(\n catalog: ServiceCatalogState | undefined,\n nodeId: CatalogId,\n candidates: Array<CatalogServiceId>,\n matchers: {\n serviceField?: (\n candidate: CatalogServiceId,\n rule: Extract<CatalogSmartRule, { type: \"service-field\" }>,\n ) => boolean;\n policyFamily?: (\n candidate: CatalogServiceId,\n rule: Extract<CatalogSmartRule, { type: \"policy-family\" }>,\n ) => boolean;\n compatibility?: (\n candidate: CatalogServiceId,\n rule: Extract<CatalogSmartRule, { type: \"compatibility\" }>,\n ) => boolean;\n },\n): ServiceCatalogState | undefined {\n if (!catalog) return catalog;\n\n const next = ensureCatalog(catalog);\n const node = next.nodes.find(\n (x) => x.id === nodeId && x.kind === \"smart-group\",\n ) as Extract<CatalogNode, { kind: \"smart-group\" }> | undefined;\n\n if (!node) return next;\n\n const rules = node.rules ?? [];\n const mode = node.match ?? \"all\";\n\n const resolved = candidates.filter((candidate) => {\n const results = rules.map((rule) => {\n if (rule.type === \"service-field\") {\n return matchers.serviceField?.(candidate, rule) ?? false;\n }\n if (rule.type === \"policy-family\") {\n return matchers.policyFamily?.(candidate, rule) ?? false;\n }\n return matchers.compatibility?.(candidate, rule) ?? false;\n });\n\n return mode === \"all\" ? results.every(Boolean) : results.some(Boolean);\n });\n\n node.resolvedServiceIds = normalizeServiceIds(resolved);\n node.resolvedAt = Date.now();\n\n return next;\n}\n","// src/react/canvas/selection.ts\r\nimport { createNodeIndex, type Builder } from \"@/core\";\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) {\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\n const firstBindId = (field?: Field): string | undefined => {\n if (!field?.bind_id) return undefined;\n return Array.isArray(field.bind_id)\n ? field.bind_id[0]\n : field.bind_id;\n };\n\n const resolveField = (): Field | undefined => {\n const direct = fields.find((x) => x.id === id);\n if (direct) return direct;\n\n if (this.builder.isOptionId(id)) {\n return fields.find((x) =>\n (x.options ?? []).some((o) => o.id === id),\n );\n }\n\n if (id.includes(\"::\")) {\n const [fieldId] = id.split(\"::\");\n if (!fieldId) return undefined;\n return fields.find((x) => x.id === fieldId);\n }\n\n return undefined;\n };\n\n const field = resolveField();\n if (!field) return;\n\n const currentTagId = this.currentTag();\n if (currentTagId) {\n const currentTagNode = createNodeIndex(this.builder).getTag(\n currentTagId,\n );\n if (currentTagNode?.getDescendant(field.id)) {\n this.currentTagId = currentTagId;\n return;\n }\n }\n\n const fallbackTagId = firstBindId(field);\n if (fallbackTagId) this.currentTagId = fallbackTagId;\n }\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>, primary?: string): void {\n this.selection.many(ids, primary);\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 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/workspace/context/use-canvas.ts\n\nimport * as React from \"react\";\nimport { useMemo } from \"react\";\n\nimport type { CanvasAPI } from \"@/react\";\nimport type { CanvasState } from \"@/schema/canvas-types\";\nimport type { GraphSnapshot } from \"@/schema/graph\";\nimport type { Field, FieldOption, ServiceProps, Tag } from \"@/schema\";\n\nimport { useCanvasAPI } from \"../context\";\nimport type { VisibleGroupResult } from \"@/react/canvas/selection\";\nimport { createNodeIndex, NodeIndex } from \"@/core\";\nimport { NodeMap } from \"@/core/node-map\";\n\n/** Tree node */\nexport interface TreeNode<T = unknown> {\n id: string | number;\n title: string;\n children?:\n | Array<TreeNode<T>>\n | (() => Array<TreeNode<T>> | Promise<Array<TreeNode<T>>>);\n data?: T;\n}\n\nexport type CanvasSelection = {\n /** raw ids from CanvasState.selection */\n ids: readonly string[];\n tagIds: readonly string[];\n fieldIds: readonly string[];\n optionIds: readonly string[];\n};\n\nexport interface UseCanvasReturn {\n layers: {\n tags: Array<TreeNode<Tag & { active: boolean }>>;\n fields: Array<TreeNode<Field | FieldOption>>; // visible fields (+ option children)\n };\n\n selector: NodeIndex;\n\n /** selection (stateful, raw) */\n selection: readonly string[];\n\n /** selection (stateful, derived) */\n selectionInfo: CanvasSelection;\n\n /** active (last-selected / focused) id (stateful) */\n activeId: string | null;\n\n /** imperative active setter (does NOT select; just “preference”) */\n setActive: (id: string | null) => void;\n\n graph: GraphSnapshot;\n api: CanvasAPI;\n props?: ServiceProps;\n}\n\n/** ---------------- helpers ---------------- */\nfunction deriveSelectionInfo(\n props: NodeMap,\n ids: readonly string[],\n): CanvasSelection {\n const tags: string[] = [];\n const fields: string[] = [];\n const options: string[] = [];\n\n for (const id of ids) {\n const node = props.get(id);\n if (!node) continue;\n\n if (node.kind == \"tag\") {\n tags.push(id);\n continue;\n }\n\n if (node.kind == \"option\") {\n options.push(id);\n continue;\n }\n\n if (node.kind == \"field\") {\n fields.push(id);\n }\n }\n\n // de-dupe while keeping order\n const uniq = (arr: string[]) => {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const x of arr) if (!seen.has(x)) (seen.add(x), out.push(x));\n return out;\n };\n\n return {\n ids,\n tagIds: uniq(tags),\n fieldIds: uniq(fields),\n optionIds: uniq(options),\n };\n}\n\nfunction tagBindIds(tag: Tag): string[] {\n const bind = (tag as any).bind_id as undefined | string | string[];\n if (!bind) return [];\n return Array.isArray(bind) ? bind : [bind];\n}\n\nfunction buildTagTree(\n tags: readonly Tag[],\n isActive: (tagId: string) => boolean,\n): Array<TreeNode<Tag & { active: boolean }>> {\n const nodeById = new Map<string, TreeNode<Tag & { active: boolean }>>();\n const childrenByParent = new Map<\n string,\n Array<TreeNode<Tag & { active: boolean }>>\n >();\n\n for (const t of tags) {\n nodeById.set(t.id, {\n id: t.id,\n title: t.label,\n data: { ...t, active: isActive(t.id) },\n });\n }\n\n for (const t of tags) {\n const child = nodeById.get(t.id);\n if (!child) continue;\n\n for (const parentId of tagBindIds(t)) {\n if (!nodeById.has(parentId)) continue;\n const list = childrenByParent.get(parentId) ?? [];\n list.push(child);\n childrenByParent.set(parentId, list);\n }\n }\n\n for (const [parentId, kids] of childrenByParent) {\n const parent = nodeById.get(parentId);\n if (parent) parent.children = kids;\n }\n\n const roots: Array<TreeNode<Tag & { active: boolean }>> = [];\n for (const t of tags) {\n const parents = tagBindIds(t).filter((pid) => nodeById.has(pid));\n if (parents.length === 0) roots.push(nodeById.get(t.id)!);\n }\n\n return roots;\n}\n\nfunction buildFieldTree(fields: Field[]): Array<TreeNode<Field | FieldOption>> {\n return fields.map((f) => {\n const node: TreeNode<Field | FieldOption> = {\n id: f.id,\n title: f.label,\n data: f,\n };\n\n // children must exist if field supports options (options prop exists), even if []\n if (\"options\" in f) {\n const opts = Array.isArray(f.options) ? f.options : [];\n node.children = opts.map((opt) => ({\n id: opt.id,\n title: opt.label,\n data: opt,\n }));\n }\n\n return node;\n });\n}\n\nfunction computeLayersFromVisibleGroup(\n props: ServiceProps,\n vg: VisibleGroupResult,\n): UseCanvasReturn[\"layers\"] {\n const activeTagIds = new Set<string>();\n let fields: Field[];\n\n if (vg.kind === \"single\") {\n if (vg.group.tagId) activeTagIds.add(vg.group.tagId);\n fields = vg.group.fields ?? [];\n } else {\n for (const id of vg.groups) {\n if (typeof id === \"string\" && id.startsWith(\"t:\"))\n activeTagIds.add(id);\n }\n fields = [];\n }\n\n return {\n tags: buildTagTree(props.filters ?? [], (id) => activeTagIds.has(id)),\n fields: buildFieldTree(fields),\n };\n}\n\n/** active id resolution */\nfunction findNewId(\n prev: readonly string[],\n next: readonly string[],\n): string | undefined {\n const prevSet = new Set(prev);\n for (const id of next) if (!prevSet.has(id)) return id;\n return undefined;\n}\n\nfunction resolveActiveId(\n desiredActive: string | null,\n prevSel: readonly string[],\n nextSel: readonly string[],\n): string | null {\n // 1) keep desired if it’s still selected\n if (desiredActive && nextSel.includes(desiredActive)) return desiredActive;\n\n // 2) prefer the “new guy” (first id that wasn’t in prev)\n const added = findNewId(prevSel, nextSel);\n if (added) return added;\n\n // 3) fallback: last selection\n if (nextSel.length) return nextSel[nextSel.length - 1] ?? null;\n\n return null;\n}\n\n/** ---------------- hook ---------------- */\n\nexport function useCanvas(): UseCanvasReturn {\n const api = useCanvasAPI();\n\n const snap0 = api.snapshot();\n const props0 = api.editor.getProps() as ServiceProps;\n\n const initialSelection = Array.from(snap0.selection as ReadonlySet<string>);\n\n const [graph, setGraph] = React.useState<GraphSnapshot>(snap0.graph);\n const [props, setProps] = React.useState<ServiceProps>(props0);\n\n const [selection, setSelection] =\n React.useState<readonly string[]>(initialSelection);\n\n const [selectionInfo, setSelectionInfo] = React.useState<CanvasSelection>(\n () => deriveSelectionInfo(api.builder.getNodeMap(), initialSelection),\n );\n\n const [layers, setLayers] = React.useState<UseCanvasReturn[\"layers\"]>(() =>\n computeLayersFromVisibleGroup(props0, api.selection.visibleGroup()),\n );\n\n // --- imperative active controller\n const desiredActiveRef = React.useRef<string | null>(null);\n const prevSelectionRef = React.useRef<readonly string[]>(initialSelection);\n\n const [activeId, setActiveId] = React.useState<string | null>(() => {\n return initialSelection.length\n ? initialSelection[initialSelection.length - 1]\n : null;\n });\n\n const setActive = React.useCallback(\n (id: string | null) => {\n desiredActiveRef.current = id;\n\n // if already selected, reflect immediately\n if (id && selection.includes(id)) setActiveId(id);\n if (id === null) setActiveId(null);\n },\n [selection],\n );\n\n React.useEffect(() => {\n const off = api.on(\"state:change\", (snap: CanvasState) => {\n setGraph(snap.graph);\n\n const nextProps = api.editor.getProps() as ServiceProps;\n setProps(nextProps);\n\n const nextSelection = Array.from(\n snap.selection as ReadonlySet<string>,\n ) as readonly string[];\n\n setSelection(nextSelection);\n const nodemap = api.builder.getNodeMap();\n setSelectionInfo(deriveSelectionInfo(nodemap, nextSelection));\n\n setLayers(\n computeLayersFromVisibleGroup(\n nextProps,\n api.selection.visibleGroup(),\n ),\n );\n\n // reconcile active\n const prevSel = prevSelectionRef.current;\n const desired = desiredActiveRef.current;\n const nextActive = resolveActiveId(desired, prevSel, nextSelection);\n\n prevSelectionRef.current = nextSelection;\n setActiveId(nextActive);\n });\n\n return off;\n }, [api]);\n\n const selector = useMemo(() => createNodeIndex(api.builder), [props]);\n\n return React.useMemo(\n () => ({\n api,\n graph,\n layers,\n props,\n selection,\n selectionInfo,\n selector,\n activeId,\n setActive,\n }),\n [\n api,\n graph,\n layers,\n props,\n selection,\n selectionInfo,\n selector,\n activeId,\n setActive,\n ],\n );\n}\n","// src/react/workspace/context/use-errors.ts\n\nimport * as React from \"react\";\n\nimport { validate } from \"@/core/validate\"; // engine-only\nimport type {\n ServiceProps,\n ValidationError as CoreValidationError,\n} from \"@/schema\";\n\nimport { useCanvasAPI } from \"../context\";\n\n/** ---------------- Types ---------------- */\n\nexport type ErrorKind = \"validation\" | \"log\";\n\nexport type ValidationRow = CoreValidationError & {\n id: string; // stable key\n kind: \"validation\";\n};\n\nexport type ErrorLog = {\n id: string;\n kind: \"log\";\n message: string;\n code?: string;\n createdAt: number;\n meta?: any;\n};\n\nexport interface MergedErrors {\n validation: readonly ValidationRow[];\n logs: readonly ErrorLog[];\n\n counts: {\n validation: number;\n logs: number;\n total: number;\n };\n\n groups: Array<\n | { kind: \"validation\"; title: string; rows: readonly ValidationRow[] }\n | { kind: \"log\"; title: string; rows: readonly ErrorLog[] }\n >;\n\n forEach(\n fn: (row: ValidationRow | ErrorLog, kind: \"validation\" | \"log\") => void,\n ): void;\n}\n\nexport type ClearTarget = \"logs\" | \"merged\";\n\nexport interface UseErrorsReturn {\n /** Unclearable (until validate() returns clean) */\n validation: readonly ValidationRow[];\n\n /** Clearable log stream (editor/runtime events) */\n logs: readonly ErrorLog[];\n\n /** Organised merged view */\n merged: MergedErrors;\n\n /** True while a validation run is pending/in-flight */\n validating: boolean;\n\n /** Clear logs; clearing merged clears logs too */\n clear(target: ClearTarget): void;\n\n /** Remove a single log row */\n removeLog(id: string): void;\n}\n\nexport type UseErrorsOptions = {\n /** Keep last N logs */\n logLimit?: number;\n\n /** Dedupe identical consecutive logs within this window */\n logDedupeWindowMs?: number;\n\n /** Debounce validation triggered by state:change */\n debounceMs?: number;\n\n /**\n * Prefer idle-time validation to avoid UI hitching.\n * If requestIdleCallback isn't available, falls back to setTimeout(0).\n */\n useIdle?: boolean;\n\n /** requestIdleCallback timeout */\n idleTimeoutMs?: number;\n};\n\n/** ---------------- Helpers ---------------- */\n\nfunction makeId(prefix: string): string {\n return `${prefix}:${Date.now()}:${Math.random().toString(16).slice(2)}`;\n}\n\nfunction stableKey(parts: Array<string | undefined | null>): string {\n return parts.filter(Boolean).join(\"|\");\n}\n\nfunction toValidationRows(list: CoreValidationError[]): ValidationRow[] {\n return (list ?? []).map((e) => ({\n ...e,\n kind: \"validation\" as const,\n id:\n stableKey([\n \"v\",\n String((e as any).code ?? \"\"),\n String((e as any).severity ?? \"\"),\n String((e as any).nodeId ?? \"\"),\n String((e as any).message ?? \"\"),\n ]) || makeId(\"v\"),\n }));\n}\n\nfunction normalizeLog(e: any): Omit<ErrorLog, \"id\" | \"createdAt\" | \"kind\"> {\n return {\n message: e?.message ?? String(e),\n code: e?.code,\n meta: e?.meta ?? e,\n };\n}\n\nfunction sameLog(\n a: ErrorLog,\n b: Omit<ErrorLog, \"id\" | \"createdAt\" | \"kind\">,\n): boolean {\n return a.message === b.message && (a.code ?? \"\") === (b.code ?? \"\");\n}\n\nfunction schedule(fn: () => void, useIdle: boolean, idleTimeoutMs: number) {\n if (useIdle && typeof (window as any).requestIdleCallback === \"function\") {\n (window as any).requestIdleCallback(fn, { timeout: idleTimeoutMs });\n return;\n }\n window.setTimeout(fn, 0);\n}\n\n/** ---------------- Hook ---------------- */\n\nexport function useErrors(opts: UseErrorsOptions = {}): UseErrorsReturn {\n const api = useCanvasAPI();\n\n const logLimit = Math.max(1, Math.min(opts.logLimit ?? 200, 2000));\n const dedupeWindowMs = Math.max(0, opts.logDedupeWindowMs ?? 400);\n const debounceMs = Math.max(0, opts.debounceMs ?? 120);\n const useIdle = opts.useIdle ?? true;\n const idleTimeoutMs = Math.max(0, opts.idleTimeoutMs ?? 250);\n\n const [validation, setValidation] = React.useState<ValidationRow[]>([]);\n const [validating, setValidating] = React.useState(false);\n\n const [logs, setLogs] = React.useState<ErrorLog[]>([]);\n\n // ---- logs (clearable)\n const pushLog = React.useCallback(\n (entry: Omit<ErrorLog, \"id\" | \"createdAt\" | \"kind\">) => {\n setLogs((prev) => {\n const now = Date.now();\n const last = prev[prev.length - 1];\n\n if (\n last &&\n sameLog(last, entry) &&\n now - last.createdAt <= dedupeWindowMs\n ) {\n const copy = prev.slice();\n copy[copy.length - 1] = { ...last, createdAt: now };\n return copy;\n }\n\n const next: ErrorLog = {\n id: makeId(\"log\"),\n kind: \"log\",\n createdAt: now,\n ...entry,\n };\n\n const out = prev.concat(next);\n return out.length > logLimit\n ? out.slice(out.length - logLimit)\n : out;\n });\n },\n [dedupeWindowMs, logLimit],\n );\n\n React.useEffect(() => {\n // editor emitted “logs”\n const offEditorError = api.on(\"error\", (e: any) => {\n pushLog(normalizeLog(e));\n });\n\n // runtime emitted errors (optional but useful)\n const offRuntimeError = api.on(\"error\", (e: any) => {\n pushLog(normalizeLog(e));\n });\n\n return () => {\n offEditorError?.();\n offRuntimeError?.();\n };\n }, [api, pushLog]);\n\n // ---- validation (unclearable, derived via core/validate)\n const runTokenRef = React.useRef(0);\n const debounceTimerRef = React.useRef<number | null>(null);\n\n const runValidation = React.useCallback(() => {\n const token = ++runTokenRef.current;\n\n setValidating(true);\n\n schedule(\n () => {\n // if another run was queued, drop this one\n if (token !== runTokenRef.current) return;\n\n try {\n const props = api.editor.getProps() as ServiceProps;\n const res = validate(props); // sync engine\n if (token !== runTokenRef.current) return;\n\n setValidation(toValidationRows(res ?? []));\n } catch (err: any) {\n if (token !== runTokenRef.current) return;\n\n // validator crash becomes a log, not a validation row\n pushLog({\n message: err?.message ?? \"validate() threw\",\n code: err?.code ?? \"validate_throw\",\n meta: err,\n });\n\n setValidation([]);\n } finally {\n if (token == runTokenRef.current) setValidating(false);\n }\n },\n useIdle,\n idleTimeoutMs,\n );\n }, [api, pushLog, useIdle, idleTimeoutMs]);\n\n const triggerValidation = React.useCallback(() => {\n if (debounceTimerRef.current) {\n window.clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = null;\n }\n\n // bump token so any scheduled run knows it’s obsolete\n runTokenRef.current++;\n\n if (debounceMs === 0) {\n runValidation();\n return;\n }\n\n debounceTimerRef.current = window.setTimeout(() => {\n runValidation();\n }, debounceMs);\n }, [debounceMs, runValidation]);\n\n React.useEffect(() => {\n // initial validate\n triggerValidation();\n\n const off = api.on(\"state:change\", () => {\n triggerValidation();\n });\n\n return () => {\n off?.();\n if (debounceTimerRef.current) {\n window.clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = null;\n }\n runTokenRef.current++; // invalidate any scheduled work\n };\n }, [api, triggerValidation]);\n\n // ---- merged (organised)\n const merged = React.useMemo<MergedErrors>(() => {\n const v = validation;\n const l = logs;\n\n return {\n validation: v,\n logs: l,\n\n counts: {\n validation: v.length,\n logs: l.length,\n total: v.length + l.length,\n },\n\n groups: [\n { kind: \"validation\", title: \"Validation\", rows: v },\n { kind: \"log\", title: \"Logs\", rows: l },\n ],\n\n forEach(fn) {\n for (const row of v) fn(row, \"validation\");\n for (const row of l) fn(row, \"log\");\n },\n };\n }, [validation, logs]);\n\n const clear = React.useCallback((target: ClearTarget) => {\n // validation is unclearable by design\n if (target === \"logs\" || target === \"merged\") setLogs([]);\n }, []);\n\n const removeLog = React.useCallback((id: string) => {\n setLogs((prev) => prev.filter((x) => x.id !== id));\n }, []);\n\n return React.useMemo(\n () => ({\n validation,\n logs,\n merged,\n validating,\n clear,\n removeLog,\n }),\n [validation, logs, merged, validating, clear, removeLog],\n );\n}\n","// src/react/workspace/context/provider/live/adapters/poll.ts\nimport type { LiveOptions } from \"../../../backend\";\nimport type {\n WorkspaceLiveAdapter,\n WorkspaceLiveAdapterContext,\n WorkspaceLiveAdapterHandlers,\n WorkspaceLiveStatus,\n WorkspaceLiveTick,\n} from \"../types\";\n\nexport interface PollAdapterOptions {\n readonly defaultIntervalMs: number; // e.g. 15000\n}\n\nexport function createPollAdapter(\n opts?: Partial<PollAdapterOptions>,\n): WorkspaceLiveAdapter {\n const defaultIntervalMs: number = opts?.defaultIntervalMs ?? 15000;\n\n let intervalId: number | undefined;\n let connected: boolean = false;\n\n const disconnect = (): void => {\n if (typeof intervalId === \"number\") {\n window.clearInterval(intervalId);\n }\n intervalId = undefined;\n connected = false;\n };\n\n const connect = async (\n ctx: WorkspaceLiveAdapterContext,\n handlers: WorkspaceLiveAdapterHandlers,\n ): Promise<void> => {\n disconnect();\n\n const live: LiveOptions = ctx.live;\n\n if (live.mode !== \"poll\") {\n handlers.onStatus({ connected: false } as WorkspaceLiveStatus);\n return;\n }\n\n const intervalMs: number = live.intervalMs ?? defaultIntervalMs;\n\n connected = true;\n handlers.onStatus({ connected: true } as WorkspaceLiveStatus);\n\n const tickOnce = async (\n reason: WorkspaceLiveTick[\"reason\"],\n ): Promise<void> => {\n const tick: WorkspaceLiveTick = {\n at: Date.now(),\n reason,\n };\n handlers.onTick(tick);\n };\n\n // immediate tick\n await tickOnce(\"init\");\n\n intervalId = window.setInterval(() => {\n void tickOnce(\"timer\");\n }, intervalMs) as unknown as number;\n };\n\n return {\n id: \"poll\",\n connect,\n disconnect,\n };\n}\n","// src/react/workspace/context/backend/memory/ids.ts\n\nlet __seq: number = 0;\n\nfunction nextSeq(): number {\n __seq += 1;\n return __seq;\n}\n\nexport function newId(prefix: string): string {\n // stable-enough for memory usage; predictable in tests if you reset module state\n const t: string = Date.now().toString(36);\n const s: string = nextSeq().toString(36);\n return `${prefix}_${t}_${s}`;\n}\n\nexport function newBranchId(): string {\n return newId(\"br\");\n}\n\nexport function newAuthorId(): string {\n return newId(\"au\");\n}\n\nexport function newTemplateId(): string {\n return newId(\"tpl\");\n}\n\nexport function newTemplateKey(): string {\n return `tpl_${Date.now().toString(36)}_${nextSeq().toString(36)}`;\n}\n\nexport function newDraftId(): string {\n return newId(\"dr\");\n}\n\nexport function newCommitId(): string {\n return newId(\"cm\");\n}\n\nexport function newThreadId(): string {\n return newId(\"th\");\n}\n\nexport function newMessageId(): string {\n return newId(\"msg\");\n}\n\nexport function bumpEtag(prev?: string): string {\n const n: number = (prev ? parseInt(prev, 10) : 0) + 1;\n return String(Number.isFinite(n) ? n : 1);\n}\n","// src/react/workspace/context/backend/memory/errors.ts\n\nimport type { BackendError, BackendResult } from \"../backend\";\n\nexport function ok<T>(value: T): BackendResult<T> {\n return { ok: true, value };\n}\n\nexport function fail<T = never>(\n code: string,\n message: string,\n opts?: Readonly<{\n status?: number;\n hint?: string;\n meta?: unknown;\n cause?: unknown;\n }>,\n): BackendResult<T> {\n const err: BackendError = {\n code,\n message,\n status: opts?.status,\n hint: opts?.hint,\n meta: opts?.meta as any,\n cause: opts?.cause,\n };\n return { ok: false, error: err };\n}\n\nexport function asError(e: unknown): BackendError {\n if (\n typeof e === \"object\" &&\n e !== null &&\n \"code\" in (e as Record<string, unknown>) &&\n \"message\" in (e as Record<string, unknown>)\n ) {\n return e as BackendError;\n }\n return {\n code: \"unknown_error\",\n message: String(e ?? \"Unknown error\"),\n meta: e as any,\n };\n}\n","// src/react/workspace/context/backend/memory/time.ts\n\nexport function nowMs(): number {\n return Date.now();\n}\n\nexport function isoNow(): string {\n return new Date().toISOString();\n}\n\nexport function toIso(input?: string | number | Date): string {\n if (!input) return isoNow();\n if (typeof input === \"string\") return input;\n if (typeof input === \"number\") return new Date(input).toISOString();\n return input.toISOString();\n}\n","// src/react/workspace/context/backend/memory/store.ts\n\nimport type {\n Author,\n Branch,\n BranchParticipant,\n Commit,\n Draft,\n FieldTemplate,\n PermissionsMap,\n ServiceSnapshot,\n ServicesInput,\n WorkspaceInfo,\n} from \"../backend\";\n\nimport type {\n CommentAnchor,\n CommentId,\n CommentMessage,\n CommentThread,\n ThreadId,\n} from \"@/schema/comments\";\n\nexport interface BranchSnapshotState {\n head?: Commit;\n headSnapshot?: ServiceSnapshot;\n\n /** drafts keyed by actorId */\n drafts: Map<string, { draft: Draft; snapshot: ServiceSnapshot }>;\n\n /** commits keyed by commitId (versionId) */\n commits: Map<string, { commit: Commit; snapshot: ServiceSnapshot }>;\n}\n\nexport interface CommentsBranchState {\n threads: Map<ThreadId, CommentThread>;\n // message index is derived; no separate store needed\n}\n\nexport interface PolicyState {\n raw: unknown;\n updatedAt?: string;\n etag?: string;\n}\n\nexport interface MemoryWorkspaceStore {\n info: WorkspaceInfo;\n\n authors: Map<string, Author>;\n\n /** permissions by actorId */\n permissionsByActor: Map<string, PermissionsMap>;\n\n branches: Map<string, Branch>;\n participantsByBranch: Map<string, readonly BranchParticipant[]>;\n\n services: ServicesInput | null;\n\n templates: Map<string, FieldTemplate>;\n\n snapshotsByBranch: Map<string, BranchSnapshotState>;\n\n commentsByBranch: Map<string, CommentsBranchState>;\n\n /** workspace-scoped policies */\n policies: PolicyState | null;\n\n /** branch-scoped policies */\n policiesByBranch: Map<string, PolicyState>;\n}\n\nexport function newBranchSnapshotState(): BranchSnapshotState {\n return {\n drafts: new Map<string, { draft: Draft; snapshot: ServiceSnapshot }>(),\n commits: new Map<\n string,\n { commit: Commit; snapshot: ServiceSnapshot }\n >(),\n };\n}\n\nexport function newCommentsBranchState(): CommentsBranchState {\n return {\n threads: new Map<ThreadId, CommentThread>(),\n };\n}\n\n// helpers that don’t need to know about backend.ts shapes beyond comment schemas\nexport function findMessageIndex(\n thread: CommentThread,\n messageId: CommentId,\n): number {\n const msgs: readonly CommentMessage[] = (thread.messages ??\n []) as readonly CommentMessage[];\n for (let i: number = 0; i < msgs.length; i += 1) {\n if (msgs[i].id === messageId) return i;\n }\n return -1;\n}\n\nexport function ensureThread(\n state: CommentsBranchState,\n threadId: ThreadId,\n): CommentThread {\n const th: CommentThread | undefined = state.threads.get(threadId);\n if (!th) {\n throw new Error(`Comment thread not found: ${String(threadId)}`);\n }\n return th;\n}\n\nexport function setThreadAnchor(\n thread: CommentThread,\n anchor: CommentAnchor,\n): CommentThread {\n return { ...(thread as object), anchor } as CommentThread;\n}\n","import type {\n Author,\n Branch,\n BranchParticipant,\n Commit,\n Draft,\n FieldTemplate,\n PermissionsMap,\n ServiceSnapshot,\n ServicesInput,\n WorkspaceInfo,\n} from \"../backend\";\nimport type {\n BranchSnapshotState,\n CommentsBranchState,\n MemoryWorkspaceStore,\n PolicyState,\n} from \"./store\";\nimport { newBranchSnapshotState, newCommentsBranchState } from \"./store\";\nimport type { CommentThread, ThreadId } from \"@/schema/comments\";\n\ninterface SerializedBranchSnapshotState {\n readonly head?: Commit;\n readonly headSnapshot?: ServiceSnapshot;\n readonly drafts: ReadonlyArray<\n readonly [string, { draft: Draft; snapshot: ServiceSnapshot }]\n >;\n readonly commits: ReadonlyArray<\n readonly [string, { commit: Commit; snapshot: ServiceSnapshot }]\n >;\n}\n\ninterface SerializedCommentsBranchState {\n readonly threads: ReadonlyArray<readonly [ThreadId, CommentThread]>;\n}\n\nexport interface PersistedMemoryWorkspaceStore {\n readonly version: 1;\n readonly info: WorkspaceInfo;\n readonly authors: ReadonlyArray<readonly [string, Author]>;\n readonly permissionsByActor: ReadonlyArray<\n readonly [string, PermissionsMap]\n >;\n readonly branches: ReadonlyArray<readonly [string, Branch]>;\n readonly participantsByBranch: ReadonlyArray<\n readonly [string, readonly BranchParticipant[]]\n >;\n readonly services: ServicesInput | null;\n readonly templates: ReadonlyArray<readonly [string, FieldTemplate]>;\n readonly snapshotsByBranch: ReadonlyArray<\n readonly [string, SerializedBranchSnapshotState]\n >;\n readonly commentsByBranch: ReadonlyArray<\n readonly [string, SerializedCommentsBranchState]\n >;\n readonly policies: PolicyState | null;\n readonly policiesByBranch: ReadonlyArray<readonly [string, PolicyState]>;\n}\n\ninterface PersistedWorkspaceRecord {\n readonly workspaceId: string;\n readonly store: PersistedMemoryWorkspaceStore;\n}\n\nexport interface MemoryPersistence {\n load(workspaceId: string): Promise<PersistedMemoryWorkspaceStore | null>;\n save(workspaceId: string, store: MemoryWorkspaceStore): Promise<void>;\n}\n\nconst DB_NAME = \"digital-service-ui-builder-memory\";\nconst DB_VERSION = 1;\nconst STORE_NAME = \"workspace-backends\";\n\nfunction cloneMapEntries<K, V>(map: ReadonlyMap<K, V>): Array<readonly [K, V]> {\n return Array.from(map.entries());\n}\n\nfunction serializeBranchSnapshotState(\n state: BranchSnapshotState,\n): SerializedBranchSnapshotState {\n return {\n head: state.head,\n headSnapshot: state.headSnapshot,\n drafts: cloneMapEntries(state.drafts),\n commits: cloneMapEntries(state.commits),\n };\n}\n\nfunction serializeCommentsBranchState(\n state: CommentsBranchState,\n): SerializedCommentsBranchState {\n return {\n threads: cloneMapEntries(state.threads),\n };\n}\n\nexport function serializeMemoryWorkspaceStore(\n store: MemoryWorkspaceStore,\n): PersistedMemoryWorkspaceStore {\n return {\n version: 1,\n info: store.info,\n authors: cloneMapEntries(store.authors),\n permissionsByActor: cloneMapEntries(store.permissionsByActor),\n branches: cloneMapEntries(store.branches),\n participantsByBranch: cloneMapEntries(store.participantsByBranch),\n services: store.services,\n templates: cloneMapEntries(store.templates),\n snapshotsByBranch: Array.from(store.snapshotsByBranch.entries()).map(\n ([branchId, state]) =>\n [branchId, serializeBranchSnapshotState(state)] as const,\n ),\n commentsByBranch: Array.from(store.commentsByBranch.entries()).map(\n ([branchId, state]) =>\n [branchId, serializeCommentsBranchState(state)] as const,\n ),\n policies: store.policies,\n policiesByBranch: cloneMapEntries(store.policiesByBranch),\n };\n}\n\nfunction deserializeBranchSnapshotState(\n state: SerializedBranchSnapshotState,\n): BranchSnapshotState {\n const next: BranchSnapshotState = newBranchSnapshotState();\n next.head = state.head;\n next.headSnapshot = state.headSnapshot;\n next.drafts = new Map(state.drafts);\n next.commits = new Map(state.commits);\n return next;\n}\n\nfunction deserializeCommentsBranchState(\n state: SerializedCommentsBranchState,\n): CommentsBranchState {\n const next: CommentsBranchState = newCommentsBranchState();\n next.threads = new Map(state.threads);\n return next;\n}\n\nexport function deserializeMemoryWorkspaceStore(\n store: PersistedMemoryWorkspaceStore,\n): MemoryWorkspaceStore {\n return {\n info: { ...store.info },\n authors: new Map(store.authors),\n permissionsByActor: new Map(store.permissionsByActor),\n branches: new Map(store.branches),\n participantsByBranch: new Map(store.participantsByBranch),\n services: store.services,\n templates: new Map(store.templates),\n snapshotsByBranch: new Map(\n store.snapshotsByBranch.map(([branchId, state]) => [\n branchId,\n deserializeBranchSnapshotState(state),\n ]),\n ),\n commentsByBranch: new Map(\n store.commentsByBranch.map(([branchId, state]) => [\n branchId,\n deserializeCommentsBranchState(state),\n ]),\n ),\n policies: store.policies ? { ...store.policies } : null,\n policiesByBranch: new Map(\n store.policiesByBranch.map(([branchId, state]) => [\n branchId,\n { ...state },\n ]),\n ),\n };\n}\n\nexport function applyPersistedMemoryWorkspaceStore(\n target: MemoryWorkspaceStore,\n source: PersistedMemoryWorkspaceStore,\n): void {\n const next: MemoryWorkspaceStore = deserializeMemoryWorkspaceStore(source);\n\n Object.assign(target.info, next.info);\n\n target.authors.clear();\n next.authors.forEach((value, key) => target.authors.set(key, value));\n\n target.permissionsByActor.clear();\n next.permissionsByActor.forEach((value, key) =>\n target.permissionsByActor.set(key, value),\n );\n\n target.branches.clear();\n next.branches.forEach((value, key) => target.branches.set(key, value));\n\n target.participantsByBranch.clear();\n next.participantsByBranch.forEach((value, key) =>\n target.participantsByBranch.set(key, value),\n );\n\n target.services = next.services;\n\n target.templates.clear();\n next.templates.forEach((value, key) => target.templates.set(key, value));\n\n target.snapshotsByBranch.clear();\n next.snapshotsByBranch.forEach((value, key) =>\n target.snapshotsByBranch.set(key, value),\n );\n\n target.commentsByBranch.clear();\n next.commentsByBranch.forEach((value, key) =>\n target.commentsByBranch.set(key, value),\n );\n\n target.policies = next.policies;\n\n target.policiesByBranch.clear();\n next.policiesByBranch.forEach((value, key) =>\n target.policiesByBranch.set(key, value),\n );\n}\n\nfunction supportsIndexedDb(): boolean {\n return typeof indexedDB !== \"undefined\";\n}\n\nfunction requestToPromise<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n request.onerror = () =>\n reject(request.error ?? new Error(\"IndexedDB request failed.\"));\n });\n}\n\nfunction openDatabase(): Promise<IDBDatabase> {\n return new Promise<IDBDatabase>((resolve, reject) => {\n const request: IDBOpenDBRequest = indexedDB.open(DB_NAME, DB_VERSION);\n\n request.onupgradeneeded = () => {\n const db: IDBDatabase = request.result;\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n db.createObjectStore(STORE_NAME, { keyPath: \"workspaceId\" });\n }\n };\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () =>\n reject(request.error ?? new Error(\"Failed to open IndexedDB.\"));\n });\n}\n\nexport function createIndexedDbMemoryPersistence(): MemoryPersistence | null {\n if (!supportsIndexedDb()) {\n return null;\n }\n\n let dbPromise: Promise<IDBDatabase> | null = null;\n let disabled = false;\n\n const getDb = async (): Promise<IDBDatabase> => {\n if (!dbPromise) {\n dbPromise = openDatabase();\n }\n return dbPromise;\n };\n\n const disable = (error: unknown): void => {\n disabled = true;\n dbPromise = null;\n console.warn(\n \"[memory-backend] IndexedDB persistence disabled for this session.\",\n error,\n );\n };\n\n return {\n load: async (workspaceId: string) => {\n if (disabled) return null;\n try {\n const db: IDBDatabase = await getDb();\n const tx = db.transaction(STORE_NAME, \"readonly\");\n const store = tx.objectStore(STORE_NAME);\n const record = await requestToPromise<\n PersistedWorkspaceRecord | undefined\n >(store.get(workspaceId));\n return record?.store ?? null;\n } catch (error) {\n disable(error);\n return null;\n }\n },\n save: async (workspaceId: string, store: MemoryWorkspaceStore) => {\n if (disabled) return;\n try {\n const db: IDBDatabase = await getDb();\n const tx = db.transaction(STORE_NAME, \"readwrite\");\n const objectStore = tx.objectStore(STORE_NAME);\n const record: PersistedWorkspaceRecord = {\n workspaceId,\n store: serializeMemoryWorkspaceStore(store),\n };\n await requestToPromise(objectStore.put(record));\n } catch (error) {\n disable(error);\n }\n },\n };\n}\n","// src/react/workspace/context/backend/memory/memory-backend.ts\n\nimport type {\n Actor,\n Author,\n AuthorsBackend,\n BackendScope,\n Branch,\n BranchAccessBackend,\n BranchesBackend,\n BranchParticipant,\n CommentsBackend,\n Commit,\n Draft,\n FieldTemplate,\n MergeResult,\n PermissionsBackend,\n PermissionsMap,\n PoliciesBackend,\n PoliciesLoadResult,\n PolicyScope,\n ServicesBackend,\n ServicesInput,\n ServiceSnapshot,\n SnapshotsBackend,\n SnapshotsLoadResult,\n TemplateCreateInput,\n TemplatesBackend,\n TemplatesListParams,\n TemplateUpdatePatch,\n WorkspaceBackend,\n WorkspaceInfo,\n} from \"../backend\";\n\nimport type {\n CommentAnchor,\n CommentId,\n CommentMessage,\n CommentThread,\n ThreadId,\n} from \"@/schema/comments\";\n\nimport {\n bumpEtag,\n newBranchId,\n newCommitId,\n newDraftId,\n newMessageId,\n newTemplateId,\n newTemplateKey,\n newThreadId,\n} from \"./ids\";\nimport { fail, ok } from \"./errors\";\nimport { isoNow } from \"./time\";\nimport type {\n CreateMemoryWorkspaceBackendOptions,\n MemoryBackendSeed,\n} from \"./seed\";\nimport {\n ensureThread,\n findMessageIndex,\n type MemoryWorkspaceStore,\n newBranchSnapshotState,\n newCommentsBranchState,\n} from \"./store\";\nimport {\n applyPersistedMemoryWorkspaceStore,\n createIndexedDbMemoryPersistence,\n type PersistedMemoryWorkspaceStore,\n serializeMemoryWorkspaceStore,\n} from \"./persistence\";\n\nconst workspaceBootstrapPromises = new Map<\n string,\n Promise<PersistedMemoryWorkspaceStore | null>\n>();\n\nfunction emptySnapshot(): ServiceSnapshot {\n // EditorSnapshot shape is host-defined; keep memory backend generic.\n return {\n schema_version: \"1\",\n data: {} as unknown as any,\n };\n}\n\nfunction permissivePermissions(): PermissionsMap {\n const handler: ProxyHandler<Record<string, boolean>> = {\n get: (\n _target: Record<string, boolean>,\n prop: string | symbol,\n ): boolean => {\n if (typeof prop === \"symbol\") return true;\n return true;\n },\n has: (): boolean => true,\n ownKeys: (): ArrayLike<string | symbol> => [],\n getOwnPropertyDescriptor: (): PropertyDescriptor | undefined =>\n undefined,\n };\n\n const p: PermissionsMap = new Proxy<Record<string, boolean>>(\n {},\n handler,\n ) as unknown as PermissionsMap;\n return p;\n}\n\nfunction normalizeInfo(\n workspaceId: string,\n seed?: Partial<WorkspaceInfo>,\n): WorkspaceInfo {\n return {\n id: seed?.id ?? workspaceId,\n name: seed?.name ?? \"Memory Workspace\",\n description: seed?.description,\n createdAt: seed?.createdAt ?? isoNow(),\n updatedAt: seed?.updatedAt ?? isoNow(),\n meta: seed?.meta,\n };\n}\n\nfunction normalizeBranch(\n input: Partial<Branch> & Pick<Branch, \"id\" | \"name\">,\n): Branch {\n const createdAt: string = input.createdAt ?? isoNow();\n const updatedAt: string = input.updatedAt ?? createdAt;\n\n return {\n id: input.id,\n name: input.name,\n isMain: Boolean(input.isMain),\n headVersionId: input.headVersionId,\n createdAt,\n updatedAt,\n };\n}\n\nfunction normalizeAuthor(\n input: Partial<Author> & Pick<Author, \"id\" | \"name\">,\n): Author {\n return {\n id: input.id,\n name: input.name,\n handle: input.handle,\n avatarUrl: input.avatarUrl,\n meta: input.meta,\n createdAt: input.createdAt ?? isoNow(),\n updatedAt: input.updatedAt ?? isoNow(),\n };\n}\n\nfunction normalizeTemplate(input: any): FieldTemplate {\n const now: string = isoNow();\n\n const id: string = String(input?.id ?? newTemplateId());\n const key: string = String(input?.key ?? newTemplateKey());\n\n return {\n id,\n key,\n name: String(input?.name ?? \"Template\"),\n kind: String(input?.kind ?? \"text\"),\n branchId: input?.branchId ?? undefined,\n definition: (input?.definition ?? {}) as Readonly<\n Record<string, unknown>\n >,\n defaults: (input?.defaults ?? undefined) as\n | Readonly<Record<string, unknown>>\n | undefined,\n ui: (input?.ui ?? undefined) as\n | Readonly<Record<string, unknown>>\n | undefined,\n validators: (input?.validators ?? undefined) as\n | readonly any[]\n | undefined,\n tags: (input?.tags ?? undefined) as readonly string[] | undefined,\n category: (input?.category ?? undefined) as string | undefined,\n published: Boolean(input?.published ?? true),\n version: Number.isFinite(Number(input?.version))\n ? Number(input.version)\n : 1,\n createdAt: String(input?.createdAt ?? now),\n updatedAt: String(input?.updatedAt ?? now),\n };\n}\n\nfunction matchesSince(\n updatedAt: string | undefined,\n since?: string | number,\n): boolean {\n if (!since) return true;\n if (!updatedAt) return false;\n\n const t: number = Date.parse(updatedAt);\n const s: number =\n typeof since === \"number\" ? since : Date.parse(String(since));\n if (!Number.isFinite(t) || !Number.isFinite(s)) return true;\n return t >= s;\n}\n\nfunction templateVisibleForBranch(\n tpl: FieldTemplate,\n branchId?: string,\n): boolean {\n const tplBid: string | undefined = tpl.branchId ?? undefined;\n if (!branchId) return !tplBid;\n return !tplBid || tplBid === branchId;\n}\n\nfunction seedStore(\n opts: CreateMemoryWorkspaceBackendOptions,\n): MemoryWorkspaceStore {\n const seed: MemoryBackendSeed | undefined = opts.seed;\n\n const store: MemoryWorkspaceStore = {\n info: normalizeInfo(opts.workspaceId, seed?.info),\n\n authors: new Map<string, Author>(),\n permissionsByActor: new Map<string, PermissionsMap>(),\n\n branches: new Map<string, Branch>(),\n participantsByBranch: new Map<string, readonly BranchParticipant[]>(),\n\n services: (seed?.services ?? null) as ServicesInput | null,\n\n templates: new Map<string, FieldTemplate>(),\n\n snapshotsByBranch: new Map<string, any>(),\n\n commentsByBranch: new Map<string, any>(),\n\n policies: seed?.policies\n ? { raw: seed.policies, updatedAt: isoNow() }\n : null,\n policiesByBranch: new Map<string, any>(),\n };\n\n if (seed?.policiesByBranch) {\n for (const [bid, raw] of Object.entries(seed.policiesByBranch)) {\n store.policiesByBranch.set(bid, { raw, updatedAt: isoNow() });\n }\n }\n\n // authors\n if (seed?.authors) {\n for (const a of seed.authors) {\n const na: Author = normalizeAuthor({ ...a });\n store.authors.set(na.id, na);\n }\n }\n\n // ensure actor-author\n const ensureActorAuthor: boolean = opts.ensureActorAuthor ?? true;\n const actorId: string | undefined = opts.actorId;\n if (ensureActorAuthor && actorId && !store.authors.has(actorId)) {\n store.authors.set(\n actorId,\n normalizeAuthor({\n id: actorId,\n name: seed?.actor?.name ?? \"Actor\",\n handle: seed?.actor?.meta ? undefined : undefined,\n }),\n );\n }\n\n // permissions\n if (seed?.permissions) {\n const p: unknown = seed.permissions as unknown;\n if (\n typeof p === \"object\" &&\n p !== null &&\n !Array.isArray(p) &&\n Object.values(p as Record<string, unknown>).every(\n (v: unknown) => typeof v === \"object\" && v !== null,\n )\n ) {\n const perActor: Record<string, PermissionsMap> = p as Record<\n string,\n PermissionsMap\n >;\n for (const [k, v] of Object.entries(perActor)) {\n store.permissionsByActor.set(k, v);\n }\n } else {\n store.permissionsByActor.set(\n \"*\",\n seed.permissions as PermissionsMap,\n );\n }\n }\n\n // branches\n if (seed?.branches) {\n for (const b of seed.branches) {\n const nb: Branch = normalizeBranch({ ...b });\n store.branches.set(nb.id, nb);\n }\n }\n\n const ensureMain: boolean = opts.ensureMain ?? true;\n if (ensureMain) {\n if (store.branches.size === 0) {\n const id: string = newBranchId();\n store.branches.set(\n id,\n normalizeBranch({\n id,\n name: \"main\",\n isMain: true,\n }),\n );\n } else {\n const branches: Branch[] = Array.from(store.branches.values());\n const hasMain: boolean = branches.some((b: Branch) => b.isMain);\n if (!hasMain) {\n const first: Branch = branches[0];\n store.branches.set(first.id, { ...first, isMain: true });\n }\n }\n }\n\n // participants\n if (seed?.participants) {\n for (const [branchId, list] of Object.entries(seed.participants)) {\n store.participantsByBranch.set(branchId, list);\n }\n }\n\n // templates\n if (seed?.templates) {\n for (const t of seed.templates) {\n const nt: FieldTemplate = normalizeTemplate(t);\n store.templates.set(nt.id, nt);\n }\n }\n\n // snapshots\n for (const b of store.branches.values()) {\n store.snapshotsByBranch.set(b.id, newBranchSnapshotState());\n }\n if (seed?.snapshots) {\n for (const [branchId, snapSeed] of Object.entries(seed.snapshots)) {\n const state =\n store.snapshotsByBranch.get(branchId) ??\n newBranchSnapshotState();\n\n if (snapSeed.head) {\n state.head = { ...snapSeed.head };\n state.commits.set(snapSeed.head.id, {\n commit: { ...snapSeed.head },\n snapshot: snapSeed.snapshot ?? emptySnapshot(),\n });\n state.headSnapshot = snapSeed.snapshot ?? emptySnapshot();\n } else if (snapSeed.snapshot) {\n state.headSnapshot = snapSeed.snapshot;\n }\n\n if (snapSeed.draft) {\n const aId: string = opts.actorId ?? \"actor\";\n state.drafts.set(aId, {\n draft: { ...snapSeed.draft },\n snapshot: snapSeed.snapshot ?? emptySnapshot(),\n });\n }\n\n store.snapshotsByBranch.set(branchId, state);\n }\n }\n\n // comments\n for (const b of store.branches.values()) {\n store.commentsByBranch.set(b.id, newCommentsBranchState());\n }\n if (seed?.comments) {\n for (const [branchId, threads] of Object.entries(seed.comments)) {\n const st =\n store.commentsByBranch.get(branchId) ??\n newCommentsBranchState();\n st.threads.clear();\n for (const th of threads) {\n st.threads.set(th.id as ThreadId, th);\n }\n store.commentsByBranch.set(branchId, st);\n }\n }\n\n return store;\n}\n\ntype AsyncBackendMethod = (...args: readonly unknown[]) => Promise<unknown>;\n\nfunction wrapBackendMethods<T extends object>(\n backend: T,\n initStore: () => Promise<void>,\n persistStore: () => Promise<void>,\n mutatingKeys: readonly (keyof T)[],\n): T {\n const wrapped: Partial<T> = {};\n const mutating = new Set<PropertyKey>(\n mutatingKeys as readonly PropertyKey[],\n );\n\n for (const key of Object.keys(backend) as Array<keyof T>) {\n const method = backend[key] as AsyncBackendMethod;\n wrapped[key] = (async (...args: readonly unknown[]) => {\n await initStore();\n const result = await method(...args);\n if (\n mutating.has(key as PropertyKey) &&\n typeof result === \"object\" &&\n result !== null &&\n \"ok\" in result &&\n result.ok\n ) {\n await persistStore();\n }\n return result;\n }) as T[keyof T];\n }\n\n return wrapped as T;\n}\n\nexport function createMemoryWorkspaceBackend(\n opts: CreateMemoryWorkspaceBackendOptions,\n): WorkspaceBackend {\n const store: MemoryWorkspaceStore = seedStore(opts);\n const info: WorkspaceInfo = store.info;\n const persistence = createIndexedDbMemoryPersistence();\n\n let initPromise: Promise<void> | null = null;\n const initStore = async (): Promise<void> => {\n if (!initPromise) {\n initPromise = (async () => {\n if (!persistence) return;\n let bootstrap = workspaceBootstrapPromises.get(opts.workspaceId);\n if (!bootstrap) {\n bootstrap = (async () => {\n try {\n const persisted = await persistence.load(\n opts.workspaceId,\n );\n if (persisted) {\n return persisted;\n }\n\n await persistence.save(opts.workspaceId, store);\n return serializeMemoryWorkspaceStore(store);\n } finally {\n workspaceBootstrapPromises.delete(opts.workspaceId);\n }\n })();\n workspaceBootstrapPromises.set(opts.workspaceId, bootstrap);\n }\n\n const persisted = await bootstrap;\n if (persisted) {\n applyPersistedMemoryWorkspaceStore(store, persisted);\n }\n })();\n }\n await initPromise;\n };\n\n const persistStore = async (): Promise<void> => {\n if (!persistence) return;\n await persistence.save(opts.workspaceId, store);\n };\n\n void initStore();\n\n const authorsBase: AuthorsBackend = {\n list: async (workspaceId: string) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n return ok(Array.from(store.authors.values()));\n },\n get: async (authorId: string) => {\n const a: Author | undefined = store.authors.get(authorId);\n return ok(a ?? null);\n },\n refresh: async (workspaceId: string) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n return ok(Array.from(store.authors.values()));\n },\n };\n const authors: AuthorsBackend = wrapBackendMethods(\n authorsBase,\n initStore,\n persistStore,\n [],\n );\n\n const permissionsBase: PermissionsBackend = {\n get: async (workspaceId: string, actor: Actor) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n const seeded: PermissionsMap | undefined =\n store.permissionsByActor.get(actor.id) ??\n store.permissionsByActor.get(\"*\") ??\n undefined;\n\n return ok(seeded ?? permissivePermissions());\n },\n refresh: async (workspaceId: string, actor: Actor) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n const seeded: PermissionsMap | undefined =\n store.permissionsByActor.get(actor.id) ??\n store.permissionsByActor.get(\"*\") ??\n undefined;\n\n return ok(seeded ?? permissivePermissions());\n },\n };\n const permissions: PermissionsBackend = wrapBackendMethods(\n permissionsBase,\n initStore,\n persistStore,\n [],\n );\n\n const branchesBase: BranchesBackend = {\n list: async (workspaceId: string) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n return ok(Array.from(store.branches.values()));\n },\n\n create: async (\n workspaceId: string,\n name: string,\n opts2?: Readonly<{ fromId?: string }>,\n ) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n\n const id: string = newBranchId();\n const b: Branch = normalizeBranch({\n id,\n name,\n isMain: false,\n });\n\n store.branches.set(id, b);\n store.snapshotsByBranch.set(id, newBranchSnapshotState());\n store.commentsByBranch.set(id, newCommentsBranchState());\n\n // optional: copy snapshot from fromId\n if (opts2?.fromId) {\n const from = store.snapshotsByBranch.get(opts2.fromId);\n const to = store.snapshotsByBranch.get(id);\n if (from && to) {\n const snap: ServiceSnapshot =\n from.headSnapshot ??\n (from.head\n ? from.commits.get(from.head.id)?.snapshot\n : undefined) ??\n emptySnapshot();\n\n to.headSnapshot = snap;\n const cmId: string = newCommitId();\n const commit: Commit = {\n id: cmId,\n branchId: id,\n createdAt: isoNow(),\n versionId: cmId,\n };\n to.head = commit;\n to.commits.set(cmId, { commit, snapshot: snap });\n store.branches.set(id, {\n ...b,\n headVersionId: cmId,\n updatedAt: isoNow(),\n });\n }\n }\n\n return ok(store.branches.get(id)!);\n },\n\n setMain: async (workspaceId: string, branchId: string) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n const b: Branch | undefined = store.branches.get(branchId);\n if (!b) return fail(\"not_found\", \"Branch not found.\");\n\n for (const br of store.branches.values()) {\n if (br.isMain && br.id !== branchId) {\n store.branches.set(br.id, {\n ...br,\n isMain: false,\n updatedAt: isoNow(),\n });\n }\n }\n const next: Branch = { ...b, isMain: true, updatedAt: isoNow() };\n store.branches.set(branchId, next);\n return ok(next);\n },\n\n merge: async (\n workspaceId: string,\n sourceId: string,\n targetId: string,\n ) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n const src: Branch | undefined = store.branches.get(sourceId);\n const tgt: Branch | undefined = store.branches.get(targetId);\n if (!src || !tgt) return fail(\"not_found\", \"Branch not found.\");\n\n const srcState = store.snapshotsByBranch.get(sourceId);\n const tgtState = store.snapshotsByBranch.get(targetId);\n\n if (srcState && tgtState) {\n const snap: ServiceSnapshot =\n srcState.headSnapshot ??\n (srcState.head\n ? srcState.commits.get(srcState.head.id)?.snapshot\n : undefined) ??\n emptySnapshot();\n\n const cmId: string = newCommitId();\n const commit: Commit = {\n id: cmId,\n branchId: targetId,\n createdAt: isoNow(),\n versionId: cmId,\n message: `Merged ${sourceId} → ${targetId}`,\n };\n\n tgtState.head = commit;\n tgtState.headSnapshot = snap;\n tgtState.commits.set(cmId, { commit, snapshot: snap });\n\n const updated: Branch = {\n ...tgt,\n headVersionId: cmId,\n updatedAt: isoNow(),\n };\n store.branches.set(targetId, updated);\n }\n\n const res: MergeResult = {\n sourceId,\n targetId,\n conflicts: 0,\n message: \"Merged in memory\",\n };\n return ok(res);\n },\n\n delete: async (workspaceId: string, branchId: string) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n store.branches.delete(branchId);\n store.participantsByBranch.delete(branchId);\n store.snapshotsByBranch.delete(branchId);\n store.commentsByBranch.delete(branchId);\n store.policiesByBranch.delete(branchId);\n return ok(undefined);\n },\n\n refresh: async (workspaceId: string) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n return ok(Array.from(store.branches.values()));\n },\n };\n const branches: BranchesBackend = wrapBackendMethods(\n branchesBase,\n initStore,\n persistStore,\n [\"create\", \"setMain\", \"merge\", \"delete\"],\n );\n\n const accessBase: BranchAccessBackend = {\n listParticipants: async (workspaceId: string, branchId: string) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n const list: readonly BranchParticipant[] =\n store.participantsByBranch.get(branchId) ?? [];\n return ok(list);\n },\n refreshParticipants: async (workspaceId: string, branchId: string) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n const list: readonly BranchParticipant[] =\n store.participantsByBranch.get(branchId) ?? [];\n return ok(list);\n },\n };\n const access: BranchAccessBackend = wrapBackendMethods(\n accessBase,\n initStore,\n persistStore,\n [],\n );\n\n const servicesBase: ServicesBackend = {\n get: async (workspaceId: string) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n if (!store.services) return ok([] as ServicesInput);\n return ok(store.services);\n },\n refresh: async (workspaceId: string) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n if (!store.services) return ok([] as ServicesInput);\n return ok(store.services);\n },\n };\n const services: ServicesBackend = wrapBackendMethods(\n servicesBase,\n initStore,\n persistStore,\n [],\n );\n\n const templatesBase: TemplatesBackend = {\n list: async (params: TemplatesListParams) => {\n if (params.workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n\n const all: FieldTemplate[] = Array.from(store.templates.values());\n const filtered: FieldTemplate[] = all.filter((t: FieldTemplate) => {\n if (!templateVisibleForBranch(t, params.branchId)) return false;\n if (params.q) {\n const q: string = params.q.toLowerCase();\n if (\n !t.name.toLowerCase().includes(q) &&\n !t.key.toLowerCase().includes(q)\n ) {\n return false;\n }\n }\n if (params.category && t.category !== params.category)\n return false;\n if (params.tags && params.tags.length) {\n const tset: Set<string> = new Set(t.tags ?? []);\n for (const tag of params.tags) {\n if (!tset.has(tag)) return false;\n }\n }\n return !(\n params.since && !matchesSince(t.updatedAt, params.since)\n );\n });\n\n return ok(filtered);\n },\n\n get: async (id: string) => {\n const t: FieldTemplate | undefined = store.templates.get(id);\n return ok(t ?? null);\n },\n\n getByKey: async (\n workspaceId: string,\n key: string,\n branchId?: string,\n ) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n\n for (const t of store.templates.values()) {\n if (t.key !== key) continue;\n if (!templateVisibleForBranch(t, branchId)) continue;\n return ok(t);\n }\n return ok(null);\n },\n\n create: async (workspaceId: string, input: TemplateCreateInput) => {\n if (workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n\n const now: string = isoNow();\n const id: string = newTemplateId();\n const key: string = input.key ?? newTemplateKey();\n\n const tpl: FieldTemplate = {\n id,\n key,\n name: input.name,\n kind: input.kind,\n branchId: input.branchId ?? undefined,\n definition: input.definition,\n defaults: input.defaults,\n ui: input.ui,\n validators: input.validators,\n tags: input.tags,\n category: input.category,\n published: Boolean(input.published ?? true),\n version: 1,\n createdAt: now,\n updatedAt: now,\n };\n\n store.templates.set(id, tpl);\n return ok(tpl);\n },\n\n update: async (id: string, patch: TemplateUpdatePatch) => {\n const prev: FieldTemplate | undefined = store.templates.get(id);\n if (!prev) return fail(\"not_found\", \"Template not found.\");\n\n const now: string = isoNow();\n\n const next: FieldTemplate = {\n ...prev,\n name: patch.name ?? prev.name,\n kind: patch.kind ?? prev.kind,\n branchId:\n patch.branchId === null\n ? undefined\n : (patch.branchId ?? prev.branchId),\n definition: patch.definition ?? prev.definition,\n defaults:\n patch.defaults === null\n ? undefined\n : (patch.defaults ?? prev.defaults),\n ui: patch.ui === null ? undefined : (patch.ui ?? prev.ui),\n validators:\n patch.validators === null\n ? undefined\n : (patch.validators ?? prev.validators),\n tags:\n patch.tags === null ? undefined : (patch.tags ?? prev.tags),\n category:\n patch.category === null\n ? undefined\n : (patch.category ?? prev.category),\n published: patch.published ?? prev.published,\n version: prev.version + 1,\n updatedAt: now,\n };\n\n store.templates.set(id, next);\n return ok(next);\n },\n\n clone: async (\n source: Readonly<{ id?: string; key?: string }>,\n opts2?: Readonly<{\n newKey?: string;\n name?: string;\n branchId?: string;\n asDraft?: boolean;\n }>,\n ) => {\n const src: FieldTemplate | undefined = source.id\n ? store.templates.get(source.id)\n : undefined;\n\n let byKey: FieldTemplate | undefined = undefined;\n if (!src && source.key) {\n for (const t of store.templates.values()) {\n if (t.key === source.key) {\n byKey = t;\n break;\n }\n }\n }\n\n const base: FieldTemplate | undefined = src ?? byKey;\n if (!base) return fail(\"not_found\", \"Template source not found.\");\n\n const now: string = isoNow();\n const id: string = newTemplateId();\n const key: string = opts2?.newKey ?? newTemplateKey();\n\n const next: FieldTemplate = {\n ...base,\n id,\n key,\n name: opts2?.name ?? `${base.name} (copy)`,\n branchId: opts2?.branchId ?? base.branchId,\n version: 1,\n createdAt: now,\n updatedAt: now,\n published: opts2?.asDraft ? false : base.published,\n };\n\n store.templates.set(id, next);\n return ok(next);\n },\n\n publish: async (id: string) => {\n const t: FieldTemplate | undefined = store.templates.get(id);\n if (!t) return fail(\"not_found\", \"Template not found.\");\n const next: FieldTemplate = {\n ...t,\n published: true,\n updatedAt: isoNow(),\n };\n store.templates.set(id, next);\n return ok(next);\n },\n\n unpublish: async (id: string) => {\n const t: FieldTemplate | undefined = store.templates.get(id);\n if (!t) return fail(\"not_found\", \"Template not found.\");\n const next: FieldTemplate = {\n ...t,\n published: false,\n updatedAt: isoNow(),\n };\n store.templates.set(id, next);\n return ok(next);\n },\n\n delete: async (id: string) => {\n store.templates.delete(id);\n return ok(undefined);\n },\n\n refresh: async (\n params: Omit<TemplatesListParams, \"q\" | \"tags\" | \"category\">,\n ) => {\n return templatesBase.list({ ...params });\n },\n };\n const templates: TemplatesBackend = wrapBackendMethods(\n templatesBase,\n initStore,\n persistStore,\n [\"create\", \"update\", \"clone\", \"publish\", \"unpublish\", \"delete\"],\n );\n\n const snapshotsBase: SnapshotsBackend = {\n load: async (params) => {\n if (params.workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n\n const st = store.snapshotsByBranch.get(params.branchId);\n if (!st) return fail(\"not_found\", \"Branch not found.\");\n\n const draftEntry = st.drafts.get(params.actorId);\n const headEntry = st.head ? st.commits.get(st.head.id) : undefined;\n\n // if versionId requested, try commit map\n if (params.versionId) {\n const v = st.commits.get(params.versionId);\n if (v) {\n const out: SnapshotsLoadResult = {\n head: st.head,\n draft: draftEntry?.draft,\n snapshot: v.snapshot,\n };\n return ok(out);\n }\n }\n\n const snapshot: ServiceSnapshot = (draftEntry?.snapshot ??\n headEntry?.snapshot ??\n st.headSnapshot ??\n emptySnapshot()) as ServiceSnapshot;\n\n const out: SnapshotsLoadResult = {\n head: st.head,\n draft: draftEntry?.draft,\n snapshot,\n };\n return ok(out);\n },\n\n autosave: async (params) => {\n if (params.workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n\n const st = store.snapshotsByBranch.get(params.branchId);\n if (!st) return fail(\"not_found\", \"Branch not found.\");\n\n const prev = st.drafts.get(params.actorId);\n if (\n params.etag &&\n prev?.draft.etag &&\n params.etag !== prev.draft.etag\n ) {\n return fail(\"etag_mismatch\", \"Draft etag mismatch.\", {\n meta: { expected: prev.draft.etag, got: params.etag },\n });\n }\n\n const now: string = isoNow();\n const draftId: string = prev?.draft.id ?? newDraftId();\n const nextEtag: string = bumpEtag(prev?.draft.etag);\n\n const draft: Draft = {\n id: draftId,\n branchId: params.branchId,\n status: \"uncommitted\",\n etag: nextEtag,\n meta: prev?.draft.meta,\n createdAt: prev?.draft.createdAt ?? now,\n updatedAt: now,\n };\n\n st.drafts.set(params.actorId, { draft, snapshot: params.snapshot });\n\n return ok({ draft });\n },\n\n save: async (params) => {\n if (params.workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n\n const st = store.snapshotsByBranch.get(params.branchId);\n if (!st) return fail(\"not_found\", \"Branch not found.\");\n\n // optional etag check against draft if draftId provided\n if (params.draftId) {\n const entry = st.drafts.get(params.actorId);\n if (entry && entry.draft.id === params.draftId) {\n if (\n params.etag &&\n entry.draft.etag &&\n params.etag !== entry.draft.etag\n ) {\n return fail(\"etag_mismatch\", \"Draft etag mismatch.\", {\n meta: {\n expected: entry.draft.etag,\n got: params.etag,\n },\n });\n }\n }\n }\n\n const id: string = newCommitId();\n const commit: Commit = {\n id,\n branchId: params.branchId,\n message: params.message,\n versionId: id,\n etag: bumpEtag(undefined),\n createdAt: isoNow(),\n };\n\n st.commits.set(id, { commit, snapshot: params.snapshot });\n st.head = commit;\n st.headSnapshot = params.snapshot;\n\n // update branch head pointer\n const b: Branch | undefined = store.branches.get(params.branchId);\n if (b) {\n store.branches.set(params.branchId, {\n ...b,\n headVersionId: id,\n updatedAt: isoNow(),\n });\n }\n\n // if saving from a draft, keep draft (user may still publish) unless you want to clear:\n // We keep it for now to avoid surprise data loss.\n\n return ok({ commit });\n },\n\n publish: async (params) => {\n if (params.workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n\n // locate draft by id across branches for this actor\n let foundBranchId: string | null = null;\n let foundEntry: { draft: Draft; snapshot: ServiceSnapshot } | null =\n null;\n\n for (const [bid, st] of store.snapshotsByBranch.entries()) {\n const entry = st.drafts.get(params.actorId);\n if (entry && entry.draft.id === params.draftId) {\n foundBranchId = bid;\n foundEntry = entry;\n break;\n }\n }\n\n if (!foundBranchId || !foundEntry) {\n return fail(\"not_found\", \"Draft not found.\");\n }\n\n const st = store.snapshotsByBranch.get(foundBranchId)!;\n\n const id: string = newCommitId();\n const commit: Commit = {\n id,\n branchId: foundBranchId,\n message: params.message,\n versionId: id,\n etag: bumpEtag(undefined),\n createdAt: isoNow(),\n };\n\n st.commits.set(id, { commit, snapshot: foundEntry.snapshot });\n st.head = commit;\n st.headSnapshot = foundEntry.snapshot;\n\n // clear that draft\n st.drafts.delete(params.actorId);\n\n // update branch\n const b: Branch | undefined = store.branches.get(foundBranchId);\n if (b) {\n store.branches.set(foundBranchId, {\n ...b,\n headVersionId: id,\n updatedAt: isoNow(),\n });\n }\n\n return ok({ commit });\n },\n\n discard: async (params) => {\n if (params.workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n\n // find branch containing the draft\n for (const st of store.snapshotsByBranch.values()) {\n const entry = st.drafts.get(params.actorId);\n if (entry && entry.draft.id === params.draftId) {\n st.drafts.delete(params.actorId);\n return ok(undefined);\n }\n }\n\n return fail(\"not_found\", \"Draft not found.\");\n },\n\n refresh: async (params) => {\n if (params.workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n\n const st = store.snapshotsByBranch.get(params.branchId);\n if (!st) return fail(\"not_found\", \"Branch not found.\");\n\n const draft = st.drafts.get(params.actorId)?.draft;\n const head = st.head;\n\n return ok({ head, draft });\n },\n };\n const snapshots: SnapshotsBackend = wrapBackendMethods(\n snapshotsBase,\n initStore,\n persistStore,\n [\"autosave\", \"save\", \"publish\", \"discard\"],\n );\n\n function ensureThreadContext(ctx: BackendScope, threadId: string) {\n if (ctx.workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n const st =\n store.commentsByBranch.get(ctx.branchId) ??\n newCommentsBranchState();\n store.commentsByBranch.set(ctx.branchId, st);\n\n const th: CommentThread = ensureThread(st, threadId as ThreadId);\n const nowN: number = Date.now();\n return ok({ st, th, nowN });\n }\n\n const commentsImplBase: CommentsBackend<\n CommentThread,\n CommentMessage,\n CommentAnchor\n > = {\n listThreads: async (ctx: BackendScope) => {\n if (ctx.workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n const st =\n store.commentsByBranch.get(ctx.branchId) ??\n newCommentsBranchState();\n store.commentsByBranch.set(ctx.branchId, st);\n\n const list: readonly CommentThread[] = Array.from(\n st.threads.values(),\n );\n return ok(list);\n },\n\n createThread: async (ctx: BackendScope, input) => {\n if (ctx.workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n const st =\n store.commentsByBranch.get(ctx.branchId) ??\n newCommentsBranchState();\n store.commentsByBranch.set(ctx.branchId, st);\n\n const nowN: number = Date.now();\n const threadId: ThreadId = newThreadId() as ThreadId;\n const msgId: CommentId = newMessageId() as CommentId;\n\n const th: CommentThread = {\n id: threadId,\n anchor: input.anchor,\n resolved: false,\n createdAt: nowN as any,\n updatedAt: nowN as any,\n messages: [\n {\n id: msgId,\n body: input.body,\n createdAt: nowN as any,\n meta: input.meta,\n } as CommentMessage,\n ],\n meta: input.meta,\n } as CommentThread;\n\n st.threads.set(threadId, th);\n return ok(th);\n },\n\n addMessage: async (ctx: BackendScope, input) => {\n const res = ensureThreadContext(ctx, input.threadId);\n if (!res.ok) return res;\n const { st, th, nowN } = res.value;\n\n const msg: CommentMessage = {\n id: newMessageId() as CommentId,\n body: input.body,\n createdAt: nowN as any,\n meta: input.meta,\n } as CommentMessage;\n\n const msgs: CommentMessage[] = [\n ...((th.messages ?? []) as CommentMessage[]),\n msg,\n ];\n const next: CommentThread = {\n ...(th as object),\n messages: msgs,\n updatedAt: nowN as any,\n } as CommentThread;\n\n st.threads.set(th.id as ThreadId, next);\n return ok(msg);\n },\n\n editMessage: async (ctx: BackendScope, input) => {\n const res = ensureThreadContext(ctx, input.threadId);\n if (!res.ok) return res;\n const { st, th, nowN } = res.value;\n\n const idx: number = findMessageIndex(\n th,\n input.messageId as CommentId,\n );\n if (idx < 0) return fail(\"not_found\", \"Message not found.\");\n\n const msgs: CommentMessage[] = [\n ...((th.messages ?? []) as CommentMessage[]),\n ];\n const prev: CommentMessage = msgs[idx] as CommentMessage;\n\n const nextMsg: CommentMessage = {\n ...(prev as object),\n body: input.body,\n editedAt: nowN as any,\n } as CommentMessage;\n\n msgs[idx] = nextMsg;\n\n const next: CommentThread = {\n ...(th as object),\n messages: msgs,\n updatedAt: nowN as any,\n } as CommentThread;\n\n st.threads.set(th.id as ThreadId, next);\n return ok(nextMsg);\n },\n\n deleteMessage: async (ctx: BackendScope, input) => {\n const res = ensureThreadContext(ctx, input.threadId);\n if (!res.ok) return res;\n const { st, th, nowN } = res.value;\n\n const msgs: CommentMessage[] = (\n (th.messages ?? []) as CommentMessage[]\n ).filter(\n (m: CommentMessage) => m.id !== (input.messageId as CommentId),\n );\n\n const next: CommentThread = {\n ...(th as object),\n messages: msgs,\n updatedAt: nowN as any,\n } as CommentThread;\n\n st.threads.set(th.id as ThreadId, next);\n return ok(undefined);\n },\n\n moveThread: async (ctx: BackendScope, input) => {\n const res = ensureThreadContext(ctx, input.threadId);\n if (!res.ok) return res;\n const { st, th, nowN } = res.value;\n\n const next: CommentThread = {\n ...(th as object),\n anchor: input.anchor,\n updatedAt: nowN as any,\n } as CommentThread;\n\n st.threads.set(th.id as ThreadId, next);\n return ok(next);\n },\n\n resolveThread: async (ctx: BackendScope, input) => {\n const res = ensureThreadContext(ctx, input.threadId);\n if (!res.ok) return res;\n const { st, th, nowN } = res.value;\n\n const next: CommentThread = {\n ...(th as object),\n resolved: input.resolved,\n updatedAt: nowN as any,\n } as CommentThread;\n\n st.threads.set(th.id as ThreadId, next);\n return ok(next);\n },\n\n deleteThread: async (ctx: BackendScope, input) => {\n if (ctx.workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n const st =\n store.commentsByBranch.get(ctx.branchId) ??\n newCommentsBranchState();\n store.commentsByBranch.set(ctx.branchId, st);\n\n st.threads.delete(input.threadId as ThreadId);\n return ok(undefined);\n },\n };\n\n // WorkspaceBackend.comments expects CommentsBackend (default unknown generics);\n // we return a structurally compatible implementation.\n const comments: WorkspaceBackend[\"comments\"] = wrapBackendMethods(\n commentsImplBase,\n initStore,\n persistStore,\n [\n \"createThread\",\n \"addMessage\",\n \"editMessage\",\n \"deleteMessage\",\n \"moveThread\",\n \"resolveThread\",\n \"deleteThread\",\n ],\n );\n\n const policiesBase: PoliciesBackend = {\n load: async (ctx: PolicyScope) => {\n if (ctx.workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n\n const state = ctx.branchId\n ? store.policiesByBranch.get(ctx.branchId)\n : store.policies;\n\n if (!state) return ok(null);\n\n const out: PoliciesLoadResult = {\n raw: state.raw,\n updatedAt: state.updatedAt,\n etag: state.etag,\n };\n return ok(out);\n },\n\n save: async (ctx: PolicyScope, input) => {\n if (ctx.workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n\n const prev = ctx.branchId\n ? store.policiesByBranch.get(ctx.branchId)\n : store.policies;\n\n if (input.etag && prev?.etag && input.etag !== prev.etag) {\n return fail(\"etag_mismatch\", \"Policy etag mismatch.\");\n }\n\n const updatedAt = isoNow();\n const etag = bumpEtag(prev?.etag);\n const next = { raw: input.raw, updatedAt, etag };\n\n if (ctx.branchId) {\n store.policiesByBranch.set(ctx.branchId, next);\n } else {\n store.policies = next;\n }\n\n return ok({ updatedAt, etag });\n },\n\n clear: async (ctx: PolicyScope) => {\n if (ctx.workspaceId !== info.id)\n return fail(\"not_found\", \"Workspace not found.\");\n\n const updatedAt = isoNow();\n if (ctx.branchId) {\n store.policiesByBranch.delete(ctx.branchId);\n } else {\n store.policies = null;\n }\n\n return ok({ updatedAt });\n },\n };\n const policies: PoliciesBackend = wrapBackendMethods(\n policiesBase,\n initStore,\n persistStore,\n [\"save\", \"clear\"],\n );\n\n const backend: WorkspaceBackend = {\n info,\n authors,\n permissions,\n branches,\n access,\n services,\n templates,\n snapshots,\n policies,\n comments,\n };\n\n return backend;\n}\n","// src/react/workspace/app.tsx\nimport * as React from \"react\";\n\nimport { WorkspaceProvider } from \"./context\";\nimport type { WorkspaceProviderProps } from \"./context\";\nimport type { Actor, WorkspaceBackend } from \"./context/backend\";\n\nimport type { ToolsConfig } from \"./components\";\nimport { CanvasProvider } from \"./context/context\";\n\n/**\n * Props for the Workspace wrapper. Mirrors WorkspaceProvider options.\n */\nexport interface WorkspaceProps {\n readonly backend: WorkspaceBackend;\n readonly actor: Actor;\n\n /** Optional pre-hydration to avoid blank first paint */\n readonly initial?: WorkspaceProviderProps[\"initial\"];\n\n /** Ensure a 'main' branch exists; otherwise first branch is used (default true) */\n readonly ensureMain?: WorkspaceProviderProps[\"ensureMain\"];\n\n /** Live refresh mode (poll/SSE/WS/off). Defaults to off. */\n readonly live?: WorkspaceProviderProps[\"live\"];\n\n /** Optional live adapter registry (ws/sse/custom). */\n readonly liveAdapters?: WorkspaceProviderProps[\"liveAdapters\"];\n\n /** Debounce refresh ticks (WS bursts etc). */\n readonly liveDebounceMs?: WorkspaceProviderProps[\"liveDebounceMs\"];\n\n /** Autosave debounce window in ms (default 9000) */\n readonly autosaveMs?: WorkspaceProviderProps[\"autosaveMs\"];\n\n /** Auto-run autosave when dirty (default true) */\n readonly autoAutosave?: WorkspaceProviderProps[\"autoAutosave\"];\n\n readonly tools?: ToolsConfig;\n readonly children: (tools?: ToolsConfig) => React.ReactNode;\n}\n\n/**\n * Workspace: wraps app panels with WorkspaceProvider.\n * Accepts the same inputs as WorkspaceProvider and passes them through.\n */\nexport function Workspace(props: WorkspaceProps): React.JSX.Element {\n const {\n backend,\n actor,\n initial,\n ensureMain,\n live,\n liveAdapters,\n liveDebounceMs,\n autosaveMs,\n autoAutosave,\n tools,\n children,\n } = props;\n\n return (\n <WorkspaceProvider\n backend={backend}\n actor={actor}\n initial={initial}\n ensureMain={ensureMain}\n live={live}\n liveAdapters={liveAdapters}\n liveDebounceMs={liveDebounceMs}\n autosaveMs={autosaveMs}\n autoAutosave={autoAutosave}\n >\n <CanvasProvider>{children(tools)}</CanvasProvider>\n </WorkspaceProvider>\n );\n}\n\nexport default Workspace;\n","// src/react/adapters/reactflow/ReactFlowCanvas.tsx\nimport React, { useMemo, useState } from \"react\";\nimport { Background, ConnectionMode, MiniMap, ReactFlow } from \"@xyflow/react\";\nimport \"@xyflow/react/dist/style.css\";\n\nimport {\n type AdapterOptions,\n useReactFlowAdapter,\n} from \"../adapters/reactflow/adapter\";\nimport type { CanvasAPI } from \"@/react\";\nimport { Toolbar } from \"../adapters/reactflow/toolbar\";\nimport type { LabelPlacement, ToolsConfig } from \"./index\";\nimport { edgeTypes, nodeTypes } from \"./reactflow\";\n\nexport type ReactFlowCanvasProps = {\n api: CanvasAPI;\n options?: AdapterOptions;\n\n showToolbar?: boolean;\n tools?: ToolsConfig;\n labelPlacement?: LabelPlacement;\n renderTool?: Parameters<typeof Toolbar>[0][\"renderButton\"];\n\n initialShowGrid?: boolean;\n initialShowMiniMap?: boolean;\n\n /** absolute position classes relative to the ReactFlow canvas */\n toolbarPositionClassName?: string; // e.g. \"left-2 top-2\"\n children?: React.ReactNode;\n};\n\nexport function Canvas({\n api,\n options,\n showToolbar = true,\n tools,\n labelPlacement = \"tooltip\",\n renderTool,\n initialShowGrid = true,\n initialShowMiniMap = false,\n toolbarPositionClassName = \"left-2 top-2\",\n children,\n}: ReactFlowCanvasProps) {\n const [showGrid, setShowGrid] = useState(initialShowGrid);\n const [showMiniMap, setShowMiniMap] = useState(initialShowMiniMap);\n\n const {\n nodes,\n edges,\n onNodesChange,\n onEdgesChange,\n onConnect,\n onConnectStart,\n onConnectEnd,\n onMoveEnd,\n onSelectionChange,\n isValidConnection,\n snapVector,\n } = useReactFlowAdapter(api, options);\n\n const snapToGrid = useMemo(\n () => !!options?.snapToGrid,\n [options?.snapToGrid],\n );\n const snapGrid = useMemo<[number, number] | undefined>(\n () => snapVector,\n [snapVector],\n );\n\n return (\n <div className=\"relative h-full w-full bg-gray-50\">\n <ReactFlow\n nodes={nodes}\n edges={edges}\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n connectionMode={ConnectionMode.Loose}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onConnectStart={onConnectStart}\n onConnectEnd={onConnectEnd}\n onConnect={onConnect}\n onMoveEnd={onMoveEnd}\n onSelectionChange={onSelectionChange}\n isValidConnection={isValidConnection}\n fitView\n snapToGrid={snapToGrid}\n snapGrid={snapGrid}\n >\n {/* toolbar inside ReactFlow so useReactFlow() works */}\n {showToolbar && (\n <div\n className={`pointer-events-none absolute z-10 ${toolbarPositionClassName}`}\n >\n <Toolbar\n api={api}\n mode=\"dev\"\n showGrid={showGrid}\n setShowGrid={setShowGrid}\n showMiniMap={showMiniMap}\n setShowMiniMap={setShowMiniMap}\n tools={tools}\n labelPlacement={labelPlacement}\n renderButton={renderTool}\n />\n </div>\n )}\n\n {showMiniMap && <MiniMap />}\n {showGrid && <Background />}\n {children}\n </ReactFlow>\n </div>\n );\n}\n","// src/react/adapters/reactflow/adapter.ts\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type {\n Node,\n Edge,\n OnConnect,\n OnEdgesChange,\n OnNodesChange,\n Viewport as RFViewport,\n IsValidConnection,\n Connection,\n OnConnectStart,\n OnConnectEnd,\n} from \"@xyflow/react\";\nimport { applyNodeChanges, applyEdgeChanges } from \"@xyflow/react\";\nimport type { CanvasAPI } from \"@/react\";\nimport type { CanvasState } from \"@/schema/canvas-types\";\nimport type { EdgeKind } from \"@/schema/graph\";\nimport { CommentThread } from \"@/schema/comments\";\n\n/* ───────────────────────────── Types & options ───────────────────────────── */\n\nexport type AdapterOptions = {\n // validation & policy\n beforeConnect?: (arg: {\n from: string;\n to: string;\n kind: EdgeKind;\n api: CanvasAPI;\n }) => { ok: boolean; reason?: string };\n afterConnect?: (arg: {\n from: string;\n to: string;\n kind: EdgeKind;\n created: boolean;\n api: CanvasAPI;\n }) => void;\n\n // behavior\n allowEdgeDelete?: boolean; // reserved\n enableShortcuts?: boolean; // reserved\n\n // snapping & perf\n snapToGrid?: boolean | { x: number; y: number };\n throttleMs?: number; // default 80ms\n\n // mapping/decoration\n nodeDecorators?: (nodeId: string) => Partial<Node>;\n edgeDecorators?: (edgeId: string) => Partial<Edge>;\n};\n\ntype RFModel = { nodes: Node[]; edges: Edge[] };\n\n/* ───────────────────────────── Utilities ───────────────────────────── */\n\nfunction rafThrottle<T extends (...args: any[]) => void>(fn: T, minMs = 80): T {\n let frame = 0;\n let last = 0;\n let queuedArgs: any[] | null = null;\n\n const run = (now: number) => {\n frame = 0;\n last = now;\n const args = queuedArgs!;\n queuedArgs = null;\n fn(...(args as Parameters<T>));\n };\n\n return ((...args: any[]) => {\n queuedArgs = args;\n const now = performance.now();\n if (!frame) {\n if (now - last >= minMs) {\n run(now);\n } else {\n frame = requestAnimationFrame(run);\n }\n }\n }) as T;\n}\n\nconst isCommentId = (id: string) => id.startsWith(\"c::\");\n\nfunction sameIdSet(a: string[], b: string[]): boolean {\n if (a.length !== b.length) return false;\n const s = new Set(a);\n for (const id of b) if (!s.has(id)) return false;\n return true;\n}\n\n/* ───────────────────────────── Mapping helpers ───────────────────────────── */\n\nfunction commentPosition(\n th: CommentThread,\n state: CanvasState,\n): { x: number; y: number } {\n const a = th.anchor!;\n if (a.type === \"free\") return { x: a.position.x, y: a.position.y };\n if (a.type === \"node\") {\n const base = state.positions[a.nodeId] ?? { x: 0, y: 0 };\n const dx = a.offset?.dx ?? 32;\n const dy = a.offset?.dy ?? -16;\n return { x: base.x + dx, y: base.y + dy };\n }\n // edge-anchored: simple fallback (edge geometry not available here)\n return { x: 0, y: 0 };\n}\n\nfunction commentNodes(state: CanvasState, api: CanvasAPI): Node[] {\n return api.comments\n .list()\n .filter((item) => !!item.anchor)\n .map((th) => ({\n id: `c::${th.id}`,\n type: \"comment\",\n position: commentPosition(th, state),\n draggable: true,\n selectable: true,\n data: { thread: th },\n }));\n}\n\nfunction toRF(\n state: CanvasState,\n api: CanvasAPI,\n opts?: Pick<AdapterOptions, \"nodeDecorators\" | \"edgeDecorators\">,\n): RFModel {\n const nodes: Node[] = state.graph.nodes.map((n) => {\n const base: Node = {\n id: n.id,\n type: n.kind,\n data: { node: n },\n position: state.positions[n.id] ?? { x: 0, y: 0 },\n selected: state.selection.has(n.id),\n };\n return opts?.nodeDecorators\n ? { ...base, ...(opts.nodeDecorators(n.id) ?? {}) }\n : base;\n });\n\n const edges: Edge[] = state.graph.edges.map((e) => {\n const id = `${e.kind}:${e.from}->${e.to}`;\n const base: Edge = {\n id,\n source: e.from,\n target: e.to,\n type: e.kind,\n data: { edge: e },\n // @ts-ignore\n selectable: true,\n };\n return opts?.edgeDecorators\n ? { ...base, ...(opts.edgeDecorators(id) ?? {}) }\n : base;\n });\n\n nodes.push(...commentNodes(state, api));\n return { nodes, edges };\n}\n\n// Parse \"kind:from->to\"\nconst parseEdgeId = (\n id: string,\n): { kind: EdgeKind; from: string; to: string } | null => {\n const [k, rest] = id.split(\":\");\n if (!k || !rest) return null;\n const [from, to] = rest.split(\"->\");\n if (!from || !to) return null;\n return { kind: k as EdgeKind, from, to };\n};\n\n/* ───────────────────────────── Hook ───────────────────────────── */\n\nexport function useReactFlowAdapter(\n api: CanvasAPI,\n options: AdapterOptions = {},\n) {\n // derive, don’t mutate incoming options\n const throttleMs = options.throttleMs ?? 80;\n const snapToGridOpt = options.snapToGrid;\n const nodeDecorators = options.nodeDecorators;\n const edgeDecorators = options.edgeDecorators;\n\n // Stable refs for validation callbacks\n const beforeConnectRef = useRef(options.beforeConnect);\n const afterConnectRef = useRef(options.afterConnect);\n useEffect(() => {\n beforeConnectRef.current = options.beforeConnect;\n }, [options.beforeConnect]);\n useEffect(() => {\n afterConnectRef.current = options.afterConnect;\n }, [options.afterConnect]);\n\n const [rf, setRF] = useState<RFModel>(() =>\n toRF(api.snapshot(), api, { nodeDecorators, edgeDecorators }),\n );\n\n const relRef = useRef<EdgeKind>(api.getEdgeRel());\n const dragStartRef = useRef<{ from?: string } | null>(null);\n const lastViewportRef = useRef<RFViewport | null>(null);\n\n // snap grid tuple\n const snapVector = useMemo<[number, number] | undefined>(() => {\n if (!snapToGridOpt) return undefined;\n if (snapToGridOpt === true) return [8, 8];\n return [snapToGridOpt.x || 8, snapToGridOpt.y || 8];\n }, [snapToGridOpt]);\n\n // Subscribe to API *structural* changes only.\n // Avoid re-mapping during drag/viewport churn (positions live update locally).\n useEffect(() => {\n const toModel = () =>\n setRF(\n toRF(api.snapshot(), api, { nodeDecorators, edgeDecorators }),\n );\n\n const offGraph = api.on(\"graph:update\", toModel);\n const offC1 = api.on(\"comment:thread:create\", toModel);\n const offC2 = api.on(\"comment:thread:update\", toModel);\n const offC3 = api.on(\"comment:thread:delete\", toModel);\n const offC4 = api.on(\"comment:move\", toModel);\n const offC5 = api.on(\"comment:resolve\", toModel);\n\n return () => {\n offGraph();\n offC1();\n offC2();\n offC3();\n offC4();\n offC5();\n };\n }, [api, nodeDecorators, edgeDecorators]);\n\n /* ── handlers ── */\n\n const applySnap = useCallback(\n (p: { x: number; y: number }) => {\n if (!snapVector) return p;\n const [gx, gy] = snapVector;\n return {\n x: Math.round(p.x / gx) * gx,\n y: Math.round(p.y / gy) * gy,\n };\n },\n [snapVector],\n );\n\n const setPositionsThrottled = useMemo(\n () =>\n rafThrottle(\n (pos: Record<string, { x: number; y: number }>) =>\n api.setPositions(pos),\n throttleMs,\n ),\n [api, throttleMs],\n );\n\n const setViewportThrottled = useMemo(\n () =>\n rafThrottle(\n (v: RFViewport) =>\n api.setViewport({ x: v.x, y: v.y, zoom: v.zoom }),\n throttleMs,\n ),\n [api, throttleMs],\n );\n\n const onNodesChange: OnNodesChange = useCallback(\n async (changes) => {\n // 1) Update RF locally for buttery dragging\n setRF((prev) => ({\n nodes: applyNodeChanges(changes, prev.nodes),\n edges: prev.edges,\n }));\n\n // 2) Collect batched position + selection updates for API\n const posUpdates: Record<string, { x: number; y: number }> = {};\n let selectionDirty = false;\n const keep = new Set<string>(\n Array.isArray(api.getSelection())\n ? (api.getSelection() as string[])\n : Array.from(api.getSelection() as unknown as Set<string>),\n );\n\n for (const c of changes) {\n if (c.type === \"position\" && c.position) {\n // Comment dragging → move comment anchor in API\n if (isCommentId(c.id)) {\n const threadId = c.id.slice(3);\n const th = api.comments.get(threadId);\n if (!th || !th.anchor) continue;\n const a = th.anchor;\n if (a.type === \"free\") {\n await api.comments.move(threadId, {\n type: \"free\",\n position: c.position,\n });\n } else if (a.type === \"node\") {\n const nodePos = api.snapshot().positions[\n a.nodeId\n ] ?? { x: 0, y: 0 };\n await api.comments.move(threadId, {\n type: \"node\",\n nodeId: a.nodeId,\n offset: {\n dx: c.position.x - nodePos.x,\n dy: c.position.y - nodePos.y,\n },\n });\n }\n continue;\n }\n posUpdates[c.id] = applySnap(c.position);\n } else if (c.type === \"select\") {\n if (!isCommentId(c.id)) {\n selectionDirty = true;\n if (c.selected) keep.add(c.id);\n else keep.delete(c.id);\n } else {\n api.selectComments(\n c.selected ? c.id.slice(3) : undefined,\n );\n }\n }\n }\n\n if (Object.keys(posUpdates).length)\n setPositionsThrottled(posUpdates);\n\n if (selectionDirty) {\n const next = Array.from(keep);\n const currRaw = api.getSelection();\n const curr = Array.isArray(currRaw)\n ? (currRaw as string[])\n : Array.from(currRaw as Set<string>);\n if (!sameIdSet(next, curr)) {\n api.select(keep);\n }\n }\n },\n [api, applySnap, setPositionsThrottled],\n );\n\n const onEdgesChange: OnEdgesChange = useCallback(\n (changes) => {\n // 1) Update RF locally\n setRF((prev) => ({\n nodes: prev.nodes,\n edges: applyEdgeChanges(changes, prev.edges),\n }));\n\n // 2) Highlight + deletions to API\n const selectedEdgeIds: string[] = [];\n const deletions: Array<{\n kind: EdgeKind;\n from: string;\n to: string;\n }> = [];\n\n for (const c of changes) {\n if (c.type === \"select\") {\n if (c.selected) selectedEdgeIds.push(c.id);\n } else if (c.type === \"remove\") {\n const parsed = parseEdgeId(c.id);\n if (parsed) deletions.push(parsed);\n }\n }\n\n if (selectedEdgeIds.length) {\n const endpointIds = new Set<string>();\n for (const id of selectedEdgeIds) {\n const p = parseEdgeId(id);\n if (!p) continue;\n endpointIds.add(p.from);\n endpointIds.add(p.to);\n }\n api.setHighlighted(endpointIds);\n } else {\n api.setHighlighted([]);\n }\n\n for (const d of deletions) {\n api.emit(\"wire:delete\" as any, d);\n }\n },\n [api],\n );\n\n const currentRel = useCallback(() => {\n const k = api.getEdgeRel();\n relRef.current = k;\n return k;\n }, [api]);\n\n const isValidConnection: IsValidConnection = useCallback(\n (conn: Connection | Edge) => {\n const kind = currentRel();\n const from = conn.source ?? \"\";\n const to = conn.target ?? \"\";\n if (!from || !to) return false;\n if (from === to) return false;\n if (isCommentId(from) || isCommentId(to)) return false;\n\n const check = beforeConnectRef.current;\n if (check) {\n try {\n return !!check({ from, to, kind, api }).ok;\n } catch {\n return false;\n }\n }\n return true;\n },\n [api, currentRel],\n );\n\n const onConnectStart: OnConnectStart = useCallback(\n (_, { nodeId }) => {\n if (!nodeId) return;\n dragStartRef.current = { from: nodeId };\n const kind = currentRel();\n api.startWire(nodeId, kind);\n },\n [api, currentRel],\n );\n\n const onConnectEnd: OnConnectEnd = useCallback(() => {\n dragStartRef.current = null;\n api.cancelWire();\n }, [api]);\n\n const onConnect: OnConnect = useCallback(\n (params) => {\n const from = params.source!;\n const to = params.target!;\n const kind = currentRel();\n\n const check = beforeConnectRef.current;\n if (check) {\n const res = check({ from, to, kind, api });\n if (!res.ok) {\n api.cancelWire();\n return;\n }\n }\n\n api.startWire(from, kind);\n api.commitWire(to);\n afterConnectRef.current?.({ from, to, kind, created: true, api });\n dragStartRef.current = null;\n },\n [api, currentRel],\n );\n\n const onMoveEnd = useCallback(\n (_evt: any, viewport: RFViewport) => {\n const prev = lastViewportRef.current;\n const changed =\n !prev ||\n Math.abs(prev.x - viewport.x) > 0.5 ||\n Math.abs(prev.y - viewport.y) > 0.5 ||\n Math.abs(prev.zoom - viewport.zoom) > 1e-4;\n\n if (changed) {\n lastViewportRef.current = viewport;\n setViewportThrottled(viewport);\n }\n },\n [setViewportThrottled],\n );\n\n const onSelectionChange = useCallback(\n ({ nodes }: { nodes: Node[]; edges: Edge[] }) => {\n console.log(\"onSelectionChange\", nodes);\n const next = nodes.map((n) => n.id);\n const currRaw = api.getSelection();\n const curr = Array.isArray(currRaw)\n ? (currRaw as string[])\n : Array.from(currRaw as Set<string>);\n if (sameIdSet(next, curr)) return;\n api.select(next);\n },\n [api],\n );\n\n return {\n nodes: rf.nodes,\n edges: rf.edges,\n onNodesChange,\n onEdgesChange,\n onConnect,\n onConnectStart,\n onConnectEnd,\n onMoveEnd,\n onSelectionChange,\n isValidConnection,\n snapVector,\n };\n}\n","import React, { useMemo, useState, useCallback } from \"react\";\nimport { useReactFlow } from \"@xyflow/react\";\nimport type { CanvasAPI } from \"@/react\";\nimport { resolveTools } from \"./toolbar/merge\";\nimport type {\n ResolvedTools,\n ToolContext,\n ToolsConfig,\n LabelPlacement,\n ToolDescriptor,\n} from \"./toolbar/types\";\nimport { Icons } from \"./toolbar/icons\";\n\nexport type ToolbarProps = {\n api: CanvasAPI;\n mode?: \"dev\" | \"prod\";\n showGrid: boolean;\n setShowGrid: (v: boolean) => void;\n showMiniMap: boolean;\n setShowMiniMap: (v: boolean) => void;\n\n tools?: ToolsConfig;\n /** Default: 'tooltip' (hidden label, shown as native tooltip) */\n labelPlacement?: LabelPlacement;\n /** Optional custom button renderer */\n renderButton?: (t: ToolRender, key: string) => React.ReactNode;\n};\n\nexport type ToolRender = {\n id: string;\n label?: string;\n icon?: React.ReactNode;\n active: boolean;\n disabled: boolean;\n disabledReason?: string;\n onClick: () => void;\n group?: string;\n hasMenu?: boolean;\n open?: boolean;\n onToggleMenu?: () => void;\n children?: ToolRender[];\n};\n\nexport function Toolbar({\n api,\n mode = \"dev\",\n showGrid,\n setShowGrid,\n showMiniMap,\n setShowMiniMap,\n tools,\n labelPlacement = \"tooltip\",\n renderButton,\n}: ToolbarProps) {\n const rf = useReactFlow();\n const [openMenuId, setOpenMenuId] = useState<string | null>(null);\n\n const selectionCount = api.getSelection().length;\n const relation = api.getEdgeRel();\n const canUndo = true;\n const canRedo = true;\n\n const ctx: ToolContext = useMemo(\n () => ({\n api,\n env: { mode },\n state: {\n relation,\n selectionCount,\n canUndo,\n canRedo,\n showGrid,\n showMiniMap,\n },\n flow: {\n zoomIn: () => rf.zoomIn?.(),\n zoomOut: () => rf.zoomOut?.(),\n fitView: () => rf.fitView?.(),\n },\n setRelation: (rel) => api.setEdgeRel(rel),\n toggleGrid: () => setShowGrid(!showGrid),\n toggleMiniMap: () => setShowMiniMap(!showMiniMap),\n }),\n [\n api,\n mode,\n relation,\n selectionCount,\n showGrid,\n showMiniMap,\n rf,\n setShowGrid,\n setShowMiniMap,\n ],\n );\n\n const descriptors: ResolvedTools = useMemo(\n () => resolveTools({ base: defaultTools(), ...(tools ?? {}) }),\n [tools],\n );\n\n const buildRenderable = useCallback(\n (defs: ToolDescriptor[]): ToolRender[] => {\n return defs\n .filter((t) => (t.when ? !!t.when(ctx) : true))\n .map((t) => {\n const en = t.enabled ? t.enabled(ctx) : true;\n const enabledOk =\n typeof en === \"boolean\" ? en : en.ok !== false;\n const reason =\n typeof en === \"boolean\" ? undefined : en.reason;\n const active = t.active ? !!t.active(ctx) : false;\n\n let iconNode: React.ReactNode | undefined;\n if (typeof t.icon === \"function\")\n iconNode = t.icon(active, !enabledOk);\n else if (typeof t.icon === \"string\")\n iconNode = mapIcon(t.icon, active);\n\n const onClick = async () => {\n if (!enabledOk || !t.action) return;\n try {\n t.onBefore?.(ctx);\n await t.action(ctx);\n t.onAfter?.(ctx);\n } catch (err) {\n t.onError?.(ctx, err);\n api.emit(\"error\", {\n message:\n (err as any)?.message ??\n \"Tool action failed\",\n meta: { tool: t.id },\n });\n }\n };\n\n const hasMenu = !!(t.children && t.children.length);\n const children = hasMenu\n ? buildRenderable(t.children!)\n : undefined;\n\n return {\n id: t.id,\n label: t.label,\n icon: iconNode,\n active,\n disabled: !enabledOk,\n disabledReason: reason,\n onClick,\n group: t.group,\n hasMenu,\n open: hasMenu && openMenuId === t.id,\n onToggleMenu: hasMenu\n ? () =>\n setOpenMenuId(\n openMenuId === t.id ? null : t.id,\n )\n : undefined,\n children,\n } as ToolRender;\n });\n },\n [ctx, api, openMenuId],\n );\n\n const items: ToolRender[] = buildRenderable(descriptors);\n const groups = groupBy(items, (i) => i.group ?? \"view\");\n\n return (\n <div className=\"dsb-toolbar pointer-events-none absolute left-2 top-2 z-10 grid gap-2\">\n {Object.entries(groups).map(([g, arr]) => (\n <div\n key={g}\n className=\"dsb-toolbar__group pointer-events-auto flex gap-1 rounded-lg border border-border bg-card/90 p-1 shadow-sm\"\n >\n {arr.map((btn) =>\n renderButton ? (\n renderButton(btn, btn.id)\n ) : (\n <DefaultTool\n key={btn.id}\n {...btn}\n labelPlacement={labelPlacement}\n />\n ),\n )}\n </div>\n ))}\n </div>\n );\n}\n\n/* ------------------- Built-in tools (with Tailwind icons) ------------------- */\n\nfunction defaultTools(): ToolDescriptor[] {\n return [\n {\n id: \"mode:bind\",\n kind: \"mode\",\n group: \"relation\",\n order: 10,\n label: \"Bind\",\n icon: (active) => Icons.bind(active),\n active: (ctx) => ctx.state.relation === \"bind\",\n action: (ctx) => ctx.setRelation(\"bind\"),\n },\n {\n id: \"mode:include\",\n kind: \"mode\",\n group: \"relation\",\n order: 20,\n label: \"Include\",\n icon: (active) => Icons.include(active),\n active: (ctx) => ctx.state.relation === \"include\",\n action: (ctx) => ctx.setRelation(\"include\"),\n },\n {\n id: \"mode:exclude\",\n kind: \"mode\",\n group: \"relation\",\n order: 30,\n label: \"Exclude\",\n icon: (active) => Icons.exclude(active),\n active: (ctx) => ctx.state.relation === \"exclude\",\n action: (ctx) => ctx.setRelation(\"exclude\"),\n },\n\n {\n id: \"view:grid\",\n kind: \"toggle\",\n group: \"view\",\n order: 10,\n label: \"Grid\",\n icon: (a) => Icons.grid(a),\n active: (ctx) => ctx.state.showGrid,\n action: (ctx) => ctx.toggleGrid(),\n },\n {\n id: \"view:minimap\",\n kind: \"toggle\",\n group: \"view\",\n order: 20,\n label: \"Minimap\",\n icon: (a) => Icons.minimap(a),\n active: (ctx) => ctx.state.showMiniMap,\n action: (ctx) => ctx.toggleMiniMap(),\n },\n\n // Example dropdown (menu) with viewport controls\n {\n id: \"zoom:menu\",\n kind: \"menu\",\n group: \"viewport\",\n order: 5,\n label: \"Viewport\",\n icon: () => Icons.fit(),\n children: [\n {\n id: \"zoom:in\",\n kind: \"command\",\n label: \"Zoom In\",\n icon: () => Icons.zoomIn(),\n action: (ctx) => ctx.flow.zoomIn(),\n },\n {\n id: \"zoom:out\",\n kind: \"command\",\n label: \"Zoom Out\",\n icon: () => Icons.zoomOut(),\n action: (ctx) => ctx.flow.zoomOut(),\n },\n {\n id: \"zoom:fit\",\n kind: \"command\",\n label: \"Fit\",\n icon: () => Icons.fit(),\n action: (ctx) => ctx.flow.fitView(),\n },\n ],\n },\n ];\n}\n\n/* ------------------- Renderers ------------------- */\n\nfunction DefaultTool({\n id,\n label,\n icon,\n active,\n disabled,\n disabledReason,\n onClick,\n hasMenu,\n open,\n onToggleMenu,\n children,\n group,\n labelPlacement,\n}: ToolRender & { labelPlacement: LabelPlacement }) {\n const baseBtn =\n \"dsb-tool inline-flex items-center justify-center rounded-md border border-border bg-card px-2 py-1 text-xs text-muted-foreground hover:bg-accent hover:text-accent-foreground aria-pressed:bg-accent aria-pressed:text-accent-foreground \" +\n (active ? \"ring-1 ring-ring bg-accent text-accent-foreground\" : \"\") +\n (disabled ? \" opacity-50 cursor-not-allowed\" : \"\");\n\n const title =\n labelPlacement === \"tooltip\"\n ? disabled\n ? (disabledReason ?? label)\n : label\n : undefined;\n\n const content = (\n <>\n {icon ?? null}\n {labelPlacement === \"inline\" && label && (\n <span className=\"ml-1\">{label}</span>\n )}\n {labelPlacement === \"below\" && label && (\n <span className=\"mt-0.5 block text-[10px] leading-3 text-muted-foreground\">\n {label}\n </span>\n )}\n {hasMenu && <span className=\"ml-1\">{Icons.chevronDown()}</span>}\n </>\n );\n\n if (!hasMenu) {\n return (\n <button\n type=\"button\"\n title={title}\n aria-pressed={active}\n disabled={disabled}\n onClick={onClick}\n className={\n baseBtn +\n \" h-8 w-8 \" +\n (labelPlacement === \"below\" ? \"flex-col\" : \"\")\n }\n >\n {content}\n </button>\n );\n }\n\n // Menu root\n return (\n <div className=\"relative\">\n <button\n type=\"button\"\n title={title}\n aria-expanded={open ? \"true\" : \"false\"}\n disabled={disabled}\n onClick={onToggleMenu}\n className={\n baseBtn +\n \" h-8 w-8 \" +\n (labelPlacement === \"below\" ? \"flex-col\" : \"\")\n }\n >\n {content}\n </button>\n\n {open && (\n <div\n className=\"absolute left-0 z-20 mt-1 min-w-[10rem] overflow-hidden rounded-md border border-border bg-popover shadow-lg\"\n role=\"menu\"\n >\n <ul className=\"divide-y divide-border\">\n {children?.map((ch) => (\n <li key={ch.id} className=\"p-0\">\n <button\n type=\"button\"\n role=\"menuitem\"\n title={\n labelPlacement === \"tooltip\"\n ? ch.disabled\n ? (ch.disabledReason ??\n ch.label)\n : ch.label\n : undefined\n }\n disabled={ch.disabled}\n onClick={ch.onClick}\n className={\n \"flex w-full items-center gap-2 px-3 py-2 text-sm hover:bg-accent hover:text-accent-foreground \" +\n (ch.disabled\n ? \"opacity-50 cursor-not-allowed\"\n : \"\")\n }\n >\n {ch.icon ?? null}\n {labelText(ch.label, \"inline\")}\n </button>\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n );\n}\n\nfunction labelText(label?: string, placement: LabelPlacement = \"tooltip\") {\n if (!label || placement === \"none\" || placement === \"tooltip\") return null;\n if (placement === \"inline\") return <span>{label}</span>;\n if (placement === \"below\")\n return (\n <span className=\"block text-[10px] leading-3 text-muted-foreground\">\n {label}\n </span>\n );\n return null;\n}\n\nfunction mapIcon(token: string, active: boolean): React.ReactNode {\n switch (token) {\n case \"bind\":\n return Icons.bind(active);\n case \"include\":\n return Icons.include(active);\n case \"exclude\":\n return Icons.exclude(active);\n case \"zoom-in\":\n return Icons.zoomIn();\n case \"zoom-out\":\n return Icons.zoomOut();\n case \"fit\":\n return Icons.fit();\n case \"grid\":\n return Icons.grid(active);\n case \"minimap\":\n return Icons.minimap(active);\n default:\n return (\n <span className=\"text-xs text-muted-foreground\">{token}</span>\n );\n }\n}\n\nfunction groupBy<T>(arr: T[], key: (t: T) => string): Record<string, T[]> {\n const out: Record<string, T[]> = {};\n for (const x of arr) {\n const k = key(x);\n if (!out[k]) out[k] = [];\n out[k].push(x);\n }\n return out;\n}\n","import type {ResolvedTools, ToolDescriptor, ToolsConfig} from './types';\r\n\r\nexport function resolveTools(config: ToolsConfig): ResolvedTools {\r\n const base = dedupeById(config.base ?? []);\r\n const extended = dedupeById(config.extend ?? []);\r\n const hidden = new Set(config.hidden ?? []);\r\n\r\n const byId = new Map<string, ToolDescriptor>();\r\n for (const t of base) byId.set(t.id, t);\r\n for (const t of extended) byId.set(t.id, t);\r\n\r\n let arr = Array.from(byId.values()).filter(t => !hidden.has(t.id));\r\n arr = sortWithAnchors(arr);\r\n arr.sort((a, b) => {\r\n const ga = a.group ?? 'view';\r\n const gb = b.group ?? 'view';\r\n if (ga !== gb) return ga < gb ? -1 : 1;\r\n const oa = a.order ?? 0;\r\n const ob = b.order ?? 0;\r\n return oa - ob;\r\n });\r\n\r\n return arr;\r\n}\r\n\r\nfunction dedupeById(list: ToolDescriptor[]): ToolDescriptor[] {\r\n const seen = new Set<string>();\r\n const out: ToolDescriptor[] = [];\r\n for (const t of list) {\r\n if (seen.has(t.id)) continue;\r\n seen.add(t.id);\r\n out.push(t);\r\n }\r\n return out;\r\n}\r\n\r\nfunction sortWithAnchors(list: ToolDescriptor[]): ToolDescriptor[] {\r\n const byId = new Map(list.map(t => [t.id, t]));\r\n const out: ToolDescriptor[] = [];\r\n const placed = new Set<string>();\r\n\r\n const place = (t: ToolDescriptor) => {\r\n if (placed.has(t.id)) return;\r\n if (t.insertBefore && byId.has(t.insertBefore)) {\r\n const anchor = byId.get(t.insertBefore)!;\r\n place(anchor);\r\n const idx = out.findIndex(x => x.id === anchor.id);\r\n out.splice(idx, 0, t);\r\n placed.add(t.id);\r\n return;\r\n }\r\n if (t.insertAfter && byId.has(t.insertAfter)) {\r\n place(byId.get(t.insertAfter)!);\r\n const idx = out.findIndex(x => x.id === t.insertAfter);\r\n out.splice(idx + 1, 0, t);\r\n placed.add(t.id);\r\n return;\r\n }\r\n out.push(t);\r\n placed.add(t.id);\r\n };\r\n\r\n for (const t of list) place(t);\r\n return out;\r\n}","import React from 'react';\r\n\r\nexport const Icons = {\r\n bind: (active = false) => (\r\n <svg className={`h-4 w-4 ${active ? 'text-primary' : 'text-muted-foreground'}`} viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M6 8a4 4 0 014-4h2a4 4 0 110 8H9\" stroke=\"currentColor\" strokeWidth=\"2\"/>\r\n <path d=\"M14 12a4 4 0 01-4 4H8a4 4 0 110-8h3\" stroke=\"currentColor\" strokeWidth=\"2\"/>\r\n </svg>\r\n ),\r\n include: (active = false) => (\r\n <svg className={`h-4 w-4 ${active ? 'text-primary' : 'text-muted-foreground'}`} viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M8 10h8M8 14h8M8 6h8M4 6h.01M4 10h.01M4 14h.01\" stroke=\"currentColor\" strokeWidth=\"2\"/>\r\n </svg>\r\n ),\r\n exclude: (active = false) => (\r\n <svg className={`h-4 w-4 ${active ? 'text-primary' : 'text-muted-foreground'}`} viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M5 5l10 10M15 5L5 15\" stroke=\"currentColor\" strokeWidth=\"2\"/>\r\n </svg>\r\n ),\r\n zoomIn: () => (\r\n <svg className=\"h-4 w-4 text-muted-foreground\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M9 9V5m0 4H5m4 0h4m-4 0v4\" stroke=\"currentColor\" strokeWidth=\"2\"/>\r\n <circle cx=\"9\" cy=\"9\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"2\"/>\r\n <path d=\"M13.5 13.5L18 18\" stroke=\"currentColor\" strokeWidth=\"2\"/>\r\n </svg>\r\n ),\r\n zoomOut: () => (\r\n <svg className=\"h-4 w-4 text-muted-foreground\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M5 9h8\" stroke=\"currentColor\" strokeWidth=\"2\"/>\r\n <circle cx=\"9\" cy=\"9\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"2\"/>\r\n <path d=\"M13.5 13.5L18 18\" stroke=\"currentColor\" strokeWidth=\"2\"/>\r\n </svg>\r\n ),\r\n fit: () => (\r\n <svg className=\"h-4 w-4 text-muted-foreground\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M3 7V3h4M17 7V3h-4M3 13v4h4M17 13v4h-4\" stroke=\"currentColor\" strokeWidth=\"2\"/>\r\n </svg>\r\n ),\r\n grid: (active = false) => (\r\n <svg className={`h-4 w-4 ${active ? 'text-primary' : 'text-muted-foreground'}`} viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M3 7h14M3 13h14M7 3v14M13 3v14\" stroke=\"currentColor\" strokeWidth=\"2\"/>\r\n </svg>\r\n ),\r\n minimap: (active = false) => (\r\n <svg className={`h-4 w-4 ${active ? 'text-primary' : 'text-muted-foreground'}`} viewBox=\"0 0 20 20\" fill=\"none\">\r\n <rect x=\"3\" y=\"4\" width=\"14\" height=\"12\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"2\"/>\r\n <rect x=\"6\" y=\"7\" width=\"6\" height=\"6\" rx=\"1\" fill=\"currentColor\"/>\r\n </svg>\r\n ),\r\n chevronDown: () => (\r\n <svg className=\"h-3 w-3 text-muted-foreground\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M6 8l4 4 4-4\" stroke=\"currentColor\" strokeWidth=\"2\"/>\r\n </svg>\r\n ),\r\n};","import React, { ReactNode, useEffect, useRef } from \"react\";\nimport { LiaTagsSolid } from \"react-icons/lia\";\nimport { RxInput } from \"react-icons/rx\";\nimport { TbHandClick } from \"react-icons/tb\";\nimport { LuTextSelect } from \"react-icons/lu\";\nimport { TfiComments } from \"react-icons/tfi\";\nimport { Handle, Position } from \"@xyflow/react\";\nimport { useCanvasAPI } from \"@/react/workspace/context/context\";\nimport { clsx } from \"clsx\";\n\ninterface Errors {\n title?: string;\n description: string;\n meta?: Record<string, unknown>;\n}\ninterface NodeProps {\n children?: (\n label: ReactNode,\n icon: ReactNode,\n errors?: Errors[],\n ) => React.ReactNode;\n description?: string;\n label: string;\n id: string;\n type: \"tag\" | \"field\" | \"option\" | \"button\" | \"comment\";\n errors?: Errors[];\n meta?: Record<string, unknown>;\n}\n\nfunction getIcon(\n type: NodeProps[\"type\"],\n): React.FC<React.SVGProps<SVGSVGElement>> {\n switch (type) {\n case \"tag\":\n return LiaTagsSolid;\n case \"field\":\n return RxInput;\n case \"option\":\n return LuTextSelect;\n case \"button\":\n return TbHandClick;\n case \"comment\":\n return TfiComments;\n }\n}\nconst Node: React.FC<NodeProps> = ({\n children,\n label,\n errors,\n id,\n type,\n description,\n}) => {\n const labelRef = useRef<HTMLDivElement>(null);\n const descRef = useRef<HTMLDivElement>(null);\n const { editor } = useCanvasAPI();\n\n useEffect(() => {\n if (labelRef.current && labelRef.current.innerText !== label) {\n labelRef.current.innerText = label;\n }\n if (\n descRef.current &&\n descRef.current.innerText !== (description ?? \"\")\n ) {\n descRef.current.innerText = description ?? \"\";\n }\n }, [label, description]);\n const Icon = getIcon(type);\n const Label = (\n <div\n contentEditable\n suppressContentEditableWarning\n tabIndex={0} // make it focusable\n onPointerDown={(e) => e.stopPropagation()}\n onMouseDown={(e) => e.stopPropagation()}\n onContextMenu={(e) => {\n e.preventDefault(); // prevent default context menu\n labelRef.current?.focus(); // focus the editable div\n }}\n onDoubleClick={(e) => {\n e.stopPropagation();\n labelRef.current?.focus();\n }}\n onBlur={() => {\n const newText = labelRef.current?.innerText.trim() || \"\";\n if (newText && newText !== label) {\n editor.reLabel(id, newText);\n }\n }}\n className=\"text-[12px] outline-none w-full cursor-text text-center\"\n >\n {label}\n </div>\n );\n return (\n <div\n className={clsx(\n \"px-4 items-center gap-2 relative min-h-[40px] flex h-fit bg-card ring ring-grey-100 rounded-md shadow text-card-foreground font-black\",\n )}\n >\n {children ? (\n children(Label, <Icon />, errors)\n ) : (\n <span className={\"flex gap-2 items-center\"}>\n <Icon /> {Label}\n </span>\n )}\n\n <Handle\n id=\"mid-top\"\n type=\"target\"\n position={Position.Top}\n style={{\n top: 0,\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n zIndex: 10,\n }}\n />\n <Handle\n id=\"mid-top\"\n type=\"source\"\n position={Position.Top}\n style={{\n top: 0,\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n zIndex: 10,\n }}\n />\n\n {/* mid-bottom: target + source */}\n <Handle\n id=\"mid-bottom\"\n type=\"target\"\n position={Position.Bottom}\n style={{\n bottom: 0,\n left: \"50%\",\n transform: \"translate(-50%, 50%)\",\n zIndex: 10,\n }}\n />\n <Handle\n id=\"mid-bottom\"\n type=\"source\"\n position={Position.Bottom}\n style={{\n bottom: 0,\n left: \"50%\",\n transform: \"translate(-50%, 50%)\",\n zIndex: 10,\n }}\n />\n </div>\n );\n};\n\nexport default Node;\n","import Node from \"./node\";\nimport type { FlowNode } from \"@/schema/graph\";\n\nfunction Tag({\n id,\n data: {\n node: { label },\n },\n}: FlowNode) {\n return <Node type={\"tag\"} label={label} id={id} />;\n}\n\nexport default Tag;\n","import Node from \"./node\";\nimport { FlowNode } from \"@/schema/graph\";\n\nfunction Field(props: FlowNode) {\n const {\n id,\n data: {\n node: { label },\n },\n } = props;\n return (\n <Node label={label} id={id} type={\"field\"}>\n {(label, icon) => {\n return (\n <span className=\"flex gap-2 items-center\">\n {icon}\n {label}\n </span>\n );\n }}\n </Node>\n );\n}\n\nexport default Field;\n","import Node from \"./node\";\nimport type { Node as RFNode, NodeProps } from \"@xyflow/react\";\n\ntype OptionNode = RFNode<{ label: string }, \"option\">;\n\nfunction Options({ id, data: { label } }: NodeProps<OptionNode>) {\n return <Node label={label} id={id} type={\"option\"} />;\n}\n\nexport default Options;\n","import Tag from \"./nodes/tags\";\nimport Field from \"./nodes/field\";\nimport Options from \"./nodes/options\";\n\nconst nodeTypes = {\n tag: Tag,\n field: Field,\n option: Options,\n};\n\nconst edgeTypes = {};\n\nexport { nodeTypes, edgeTypes };\n","// src/react/adapters/reactflow/index.tsx\nimport React from \"react\";\nimport type { AdapterOptions } from \"../adapters/reactflow/adapter\";\nimport type {\n LabelPlacement,\n ToolsConfig,\n} from \"../adapters/reactflow/toolbar/types\";\nimport { useCanvasAPI } from \"@/react/workspace/context/context\";\nimport { Canvas } from \"@/react/workspace/components/canvas\";\n\nexport type FlowCanvasProps = {\n tools?: ToolsConfig;\n /** 'dev' enables richer UX; 'prod' can hide some helpers */\n mode?: \"dev\" | \"prod\";\n /** Show/position the toolbar (inside the ReactFlow surface) */\n showToolbar?: boolean;\n toolbarPositionClassName?: string; // e.g. \"left-2 top-2\"\n\n /** How labels render on buttons: tooltip | inline | below | none */\n labelPlacement?: LabelPlacement;\n\n /** Pass custom renderer for individual tool buttons */\n renderTool?: React.ComponentProps<typeof Canvas>[\"renderTool\"];\n\n /** Initial layer toggles */\n initialShowGrid?: boolean;\n initialShowMiniMap?: boolean;\n\n /** Adapter options (snapping etc.) */\n options?: AdapterOptions;\n children?: React.ReactNode;\n};\n\nconst FlowCanvas: React.FC<FlowCanvasProps> = ({\n tools,\n showToolbar = true,\n toolbarPositionClassName,\n labelPlacement = \"tooltip\",\n renderTool,\n initialShowGrid = true,\n initialShowMiniMap = false,\n options,\n children,\n}) => {\n const api = useCanvasAPI();\n\n return (\n <Canvas\n api={api}\n tools={tools}\n showToolbar={showToolbar}\n toolbarPositionClassName={toolbarPositionClassName}\n labelPlacement={labelPlacement}\n renderTool={renderTool}\n initialShowGrid={initialShowGrid}\n initialShowMiniMap={initialShowMiniMap}\n options={options}\n children={children}\n />\n );\n};\n\nexport default FlowCanvas;\n\n// Optional convenience re-exports\nexport { Canvas };\nexport type { ToolsConfig, LabelPlacement, AdapterOptions };\n"],"mappings":"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","names":["React","React","toBackendError","runTasks","React","React","setLoadableError","React","setLoadableError","_a","params","React","setLoadableError","params","React","setLoadableError","React","params","_a","_b","_c","_d","React","setLoadableError","React","hasSnapshotProps","React","disconnect","connect","React","_a","React","useWorkspaceBoot","useWorkspaceBoot","_a","createContext","useContext","useEffect","useMemo","useRef","useState","_a","_b","ok","cloneDeep","isButton","isServiceIdRef","cloneDeep","_a","out","role","cap","ok","results","toId","_a","_b","node","_c","_d","isButton","getNode","passesRate","ok","uniq","_a","_b","newId","_a","clone","_b","_c","_d","_e","_f","_g","_a","cloneDeep","_a","f","isButton","cloneDeep","_a","toId","_a","_b","filterServicesForVisibleGroup","_a","_a","_b","ok","toId","cloneDeep","filterServicesForVisibleGroup","_a","field","jsx","createContext","useRef","useMemo","useContext","useEffect","useState","_a","React","useMemo","uniq","useMemo","React","_a","_b","disconnect","connect","_a","__seq","DB_NAME","STORE_NAME","persisted","out","st","jsx","useMemo","useState","useCallback","useEffect","useMemo","useRef","useState","sameIdSet","_a","useMemo","useState","useCallback","_a","_b","_c","jsx","jsxs","Fragment","jsx","jsxs","useState","useMemo","useCallback","useEffect","useRef","jsx","jsxs","useRef","useEffect","jsx","jsx","jsxs","label","jsx","jsx","jsxs","useState","useMemo","jsx"]}
|