@timeax/digital-service-engine 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/react/workspace/index.ts","../../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-workspace-refresh.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/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/validate/steps/visibility.ts","../../src/core/validate/steps/structure.ts","../../src/core/validate/steps/identity.ts","../../src/core/validate/steps/option-maps.ts","../../src/core/validate/steps/service-vs-input.ts","../../src/core/validate/steps/utility.ts","../../src/utils/index.ts","../../src/core/validate/steps/rates.ts","../../src/core/validate/steps/constraints.ts","../../src/core/validate/steps/custom.ts","../../src/core/validate/steps/global-utility-guard.ts","../../src/core/validate/steps/unbound.ts","../../src/core/validate/steps/fallbacks.ts","../../src/core/validate/policies/collect-service-items.ts","../../src/core/validate/policies/ops.ts","../../src/core/validate/policies/apply-policies.ts","../../src/core/validate/index.ts","../../src/core/builder.ts","../../src/core/fallback.ts","../../src/core/tag-relations.ts","../../src/utils/util.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/memory-backend.ts","../../src/react/workspace/app.tsx"],"sourcesContent":["// src/react/workspace/index.ts\n\nexport { Workspace } from \"./app\";\nexport type { WorkspaceProps } from \"./app\";\n\nexport * from \"./context\";","// src/react/workspace/context/provider/context.ts\nimport * as React from \"react\";\nimport type { WorkspaceAPI } 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","// 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 { useWorkspaceRefresh } from \"./compose/use-workspace-refresh\";\nimport { useLivePolling } from \"./compose/use-live-polling\";\nimport { usePoliciesSlice } from \"@/react/workspace/context/provider/slices/use-policies-slice\";\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, // if you add it to initial\n runtime,\n });\n\n const refresh = useWorkspaceRefresh({\n runtime,\n refreshAuthors: authorsSlice.refreshAuthors,\n refreshPermissions: permissionsSlice.refreshPermissions,\n refreshBranches: branchesSlice.refreshBranches,\n refreshServices: servicesSlice.refreshServices,\n refreshPolicies: policiesSlice.refreshPolicies,\n refreshComments: comments.refreshThreads,\n getCurrentBranchId,\n refreshTemplates: async (p?: Partial<{ branchId: string }>) => {\n await templatesSlice.refreshTemplates(\n p?.branchId\n ? ({ branchId: p.branchId } as Partial<\n Pick<TemplatesListParams, \"branchId\">\n >)\n : undefined,\n );\n },\n refreshParticipants: async (p?: Partial<{ branchId: string }>) => {\n await branchesSlice.refreshParticipants(\n p?.branchId\n ? ({ branchId: p.branchId } as Partial<{\n branchId: string;\n }>)\n : undefined,\n );\n },\n refreshSnapshotPointersForBranch:\n snapshotsSlice.refreshSnapshotPointersForBranch,\n refreshSnapshotPointers: snapshotsSlice.refreshSnapshotPointers,\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?.props,\n );\n\n const liveCtl = useLivePolling({\n live,\n workspaceId,\n actor,\n hasAnyData,\n getCurrentBranchId: () => branchesSlice.branches.currentId,\n refreshAll: refresh.refreshAll,\n refreshBranchContext: refresh.refreshBranchContext,\n refreshSnapshotPointers: refresh.refreshSnapshotPointers,\n adapters: liveAdapters,\n debounceMs: liveDebounceMs,\n });\n\n /* ---------------- branch ops ---------------- */\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, workspaceId, branchesSlice /* setCurrentBranch */],\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) await branchesSlice.refreshBranches();\n return res;\n },\n [backend.branches, workspaceId, branchesSlice],\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 if (res.ok) {\n await runtime.runTasks(\n [\n () => branchesSlice.refreshBranches(),\n () => refresh.refreshBranchContext(),\n ],\n true,\n );\n }\n return res;\n },\n [backend.branches, workspaceId, runtime, branchesSlice, refresh],\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 await branchesSlice.refreshBranches();\n\n if (branchesSlice.branches.currentId === branchId) {\n const fallback: string | undefined =\n branchesSlice.branches.data.find(\n (b) => b.id !== branchId,\n )?.id;\n\n if (fallback) setCurrentBranch(fallback);\n }\n }\n return res;\n },\n [backend.branches, workspaceId, branchesSlice /* setCurrentBranch */],\n );\n\n /* ---------------- branch switching (cache-first) ---------------- */\n\n const hasInitialSnapshot: boolean = Boolean(initial?.snapshot);\n\n const setCurrentBranch = React.useCallback(\n (id: string): void => {\n const prevId: string | undefined = branchesSlice.branches.currentId;\n\n branchCache.switchBranch({\n workspaceId: workspaceId,\n nextId: id,\n prevId,\n\n templates: templatesSlice.templates,\n participants: branchesSlice.participants,\n snapshot: snapshotsSlice.snapshot,\n\n setTemplates: templatesSlice.__setTemplatesState,\n setParticipants: branchesSlice.__setParticipantsState,\n setSnapshot: snapshotsSlice.__setSnapshotState,\n\n resetTemplates: templatesSlice.resetTemplatesForBranch,\n resetParticipants: () => {\n branchesSlice.__setParticipantsState((s) => ({\n ...s,\n data: null,\n error: undefined,\n }));\n },\n resetSnapshot: snapshotsSlice.resetSnapshotForBranch,\n\n setCurrentBranchId: branchesSlice.setCurrentBranchId,\n\n hasInitialSnapshot,\n\n loadSnapshotForBranch: (branchId: string) => {\n void snapshotsSlice.loadSnapshotForBranch(branchId);\n },\n });\n },\n [\n branchesSlice.branches.currentId,\n branchesSlice.participants,\n branchesSlice.setCurrentBranchId,\n branchesSlice.__setParticipantsState,\n templatesSlice.templates,\n templatesSlice.__setTemplatesState,\n templatesSlice.resetTemplatesForBranch,\n snapshotsSlice.snapshot,\n snapshotsSlice.__setSnapshotState,\n snapshotsSlice.resetSnapshotForBranch,\n snapshotsSlice.loadSnapshotForBranch,\n branchCache,\n hasInitialSnapshot,\n ],\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 if (setAll || keys?.includes(\"permissions\"))\n permissionsSlice.invalidatePermissions();\n if (setAll || keys?.includes(\"branches\"))\n branchesSlice.invalidateBranches();\n if (setAll || keys?.includes(\"services\"))\n servicesSlice.invalidateServices();\n\n if (setAll || keys?.includes(\"templates\"))\n templatesSlice.invalidateTemplates();\n if (setAll || keys?.includes(\"participants\"))\n branchesSlice.invalidateParticipants();\n\n if (\n setAll ||\n keys?.includes(\"templates\") ||\n keys?.includes(\"participants\")\n ) {\n branchCache.clear();\n }\n if (setAll || keys?.includes(\"policies\"))\n policiesSlice.invalidatePolicies();\n\n },\n [\n authorsSlice,\n permissionsSlice,\n branchesSlice,\n servicesSlice,\n templatesSlice,\n branchCache,\n ],\n );\n\n /* ---------------- memo API ---------------- */\n\n const api: WorkspaceAPI = React.useMemo<WorkspaceAPI>(\n () => ({\n info: backend.info,\n actor,\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: refresh.refreshAll,\n\n authors: authorsSlice.refreshAuthors,\n permissions: permissionsSlice.refreshPermissions,\n branches: branchesSlice.refreshBranches,\n services: servicesSlice.refreshServices,\n\n branchContext: refresh.refreshBranchContext,\n\n templates: async (\n params?: Partial<\n Pick<TemplatesListParams, \"branchId\" | \"since\">\n >,\n ) => templatesSlice.refreshTemplates(params),\n\n participants: async (\n params?: Partial<{\n branchId: string;\n since?: number | string;\n }>,\n ) => branchesSlice.refreshParticipants(params),\n\n snapshotPointers: refresh.refreshSnapshotPointers,\n policies: () => policiesSlice.refreshPolicies(),\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: snapshotsSlice.refreshSnapshotPointers,\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 backend.info,\n actor,\n\n authorsSlice.authors,\n authorsSlice.refreshAuthors,\n\n permissionsSlice.permissions,\n permissionsSlice.refreshPermissions,\n\n branchesSlice.branches,\n branchesSlice.participants,\n branchesSlice.refreshBranches,\n branchesSlice.refreshParticipants,\n\n templatesSlice.templates,\n templatesSlice.refreshTemplates,\n templatesSlice.createTemplate,\n templatesSlice.updateTemplate,\n templatesSlice.cloneTemplate,\n templatesSlice.publishTemplate,\n templatesSlice.unpublishTemplate,\n templatesSlice.deleteTemplate,\n\n servicesSlice.services,\n servicesSlice.refreshServices,\n\n refresh.refreshAll,\n refresh.refreshBranchContext,\n refresh.refreshSnapshotPointers,\n\n setCurrentBranch,\n\n createBranch,\n setMain,\n mergeBranch,\n deleteBranch,\n\n invalidate,\n\n liveCtl.connected,\n liveCtl.lastEventAt,\n\n snapshotsSlice.snapshot,\n snapshotsSlice.setSnapshotData,\n snapshotsSlice.loadSnapshot,\n snapshotsSlice.refreshSnapshotPointers,\n snapshotsSlice.autosave,\n snapshotsSlice.save,\n snapshotsSlice.publish,\n snapshotsSlice.discardDraft,\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 { Author, BackendError, WorkspaceBackend } 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<void>;\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<void> => {\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 } else {\n setLoadableError(setAuthors, res.error);\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 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<void>;\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<void> => {\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 } else {\n setLoadableError(setPermissions, res.error);\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 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<void>;\n readonly refreshParticipants: (\n params?: Partial<{ branchId: string; since?: number | string }>,\n ) => Promise<void>;\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<void> => {\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;\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 }, [backend.branches, workspaceId, runtime]);\n\n const refreshParticipants = React.useCallback(\n async (\n params?: Partial<{ branchId: string; since?: number | string }>,\n ): Promise<void> => {\n const branchId: string | undefined =\n params?.branchId ?? branches.currentId;\n if (!branchId) return;\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 } else {\n setLoadableError(setParticipants, res.error);\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 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<void>;\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<void> => {\n const branchId: string | undefined =\n params?.branchId ?? getCurrentBranchId();\n if (!branchId) return;\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 } else {\n setLoadableError(setTemplates, res.error);\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 { BackendError, WorkspaceBackend } 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<void>;\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<void> => {\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;\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 }, [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 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<void>;\n readonly refreshSnapshotPointers: () => Promise<void>;\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\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 schemaVersion: initialSnapshot?.schema_version,\n data: initialSnapshot?.data as EditorSnapshot | undefined,\n head: initialHead,\n draft: initialDraft,\n state: initialDraft ? \"uncommitted\" : \"clean\",\n saving: false,\n dirty: false,\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 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 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 (branchId: string): Promise<void> => {\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;\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 },\n [\n backend.snapshots,\n workspaceId,\n actor.id,\n snapshot.lastSavedAt,\n snapshot.lastDraftAt,\n ],\n );\n\n const refreshSnapshotPointers =\n React.useCallback(async (): Promise<void> => {\n const branchId = getCurrentBranchId();\n if (!branchId) return;\n await 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 (!snapshot.data || !snapshot.schemaVersion) {\n return setSnapshotError({\n code: \"no_snapshot\",\n message: \"Nothing to autosave.\",\n }) as any;\n }\n\n const res = await backend.snapshots.autosave({\n workspaceId,\n branchId,\n actorId: actor.id,\n snapshot: {\n schema_version: snapshot.schemaVersion,\n data: snapshot.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 (!snapshot.data || !snapshot.schemaVersion) {\n return setSnapshotError({\n code: \"no_snapshot\",\n message: \"Nothing to save.\",\n }) as any;\n }\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: snapshot.schemaVersion,\n data: snapshot.data,\n },\n message,\n draftId: snapshot.draft?.id,\n etag: 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((s) => ({\n ...s,\n head: undefined,\n draft: undefined,\n state: \"clean\",\n saving: false,\n dirty: false,\n lastSavedAt: undefined,\n lastDraftAt: undefined,\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: setSnapshot,\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 ],\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 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<void>;\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 (p?: Readonly<{ branchId?: string }>): Promise<void> => {\n const scope: BackendScope | null = resolveScope(p?.branchId);\n if (!scope) return;\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 } else {\n setLoadableError(setThreads, res.error);\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\n hasInitialSnapshot: boolean;\n\n loadSnapshotForBranch: (branchId: string) => void;\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 workspaceId: string;\n nextId: string;\n hasInitialSnapshot: boolean;\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 loadSnapshotForBranch: (branchId: string) => void;\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\n // If switchBranch runs before hydration completes, we defer the “load snapshot” decision.\n const pendingRef = React.useRef<PendingSwitch | null>(null);\n\n const applyCached = React.useCallback(\n (\n wsId: string,\n nextId: string,\n p: PendingSwitch,\n ): { cached?: BranchCacheEntry; hasCachedSnapshot: boolean } => {\n const cached = cache.get<BranchCacheEntry>(keyOf(wsId, nextId));\n\n if (cached) {\n p.setTemplates(cached.templates);\n p.setParticipants(cached.participants);\n p.setSnapshot(cached.snapshot);\n }\n\n const hasCachedSnapshot = Boolean(\n cached?.snapshot?.data && cached?.snapshot?.schemaVersion,\n );\n\n return { cached, hasCachedSnapshot };\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 const { hasCachedSnapshot } = applyCached(\n p.workspaceId,\n p.nextId,\n p,\n );\n\n if (!hasCachedSnapshot && !p.hasInitialSnapshot) {\n p.loadSnapshotForBranch(p.nextId);\n }\n\n pendingRef.current = null;\n });\n\n return () => unsub();\n }, [cache, applyCached]);\n\n const clear = React.useCallback((): void => {\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\n hasInitialSnapshot: boolean;\n\n loadSnapshotForBranch: (branchId: string) => void;\n }>,\n ): void => {\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 // If you want strict behavior later, we can throw in dev only.\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\n if (cached) {\n args.setTemplates(cached.templates);\n args.setParticipants(cached.participants);\n args.setSnapshot(cached.snapshot);\n } else {\n args.resetTemplates();\n args.resetParticipants();\n args.resetSnapshot();\n }\n\n args.setCurrentBranchId(args.nextId);\n\n const hasCachedSnapshot: boolean = Boolean(\n cached?.snapshot?.data && cached?.snapshot?.schemaVersion,\n );\n\n // If not hydrated yet, defer the “no cache → load snapshot” decision because hydration\n // might bring in a cached snapshot for this workspace+branch.\n if (!readyRef.current && !hasCachedSnapshot) {\n pendingRef.current = {\n workspaceId: wsId,\n nextId: args.nextId,\n hasInitialSnapshot: args.hasInitialSnapshot,\n setTemplates: args.setTemplates,\n setParticipants: args.setParticipants,\n setSnapshot: args.setSnapshot,\n loadSnapshotForBranch: args.loadSnapshotForBranch,\n };\n return;\n }\n\n // Normal behavior once ready (or when already has cached snapshot).\n if (!hasCachedSnapshot && !args.hasInitialSnapshot) {\n args.loadSnapshotForBranch(args.nextId);\n } else {\n pendingRef.current = null;\n }\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-workspace-refresh.ts\nimport * as React from \"react\";\nimport type { RunResult } from \"../types\";\nimport type { BackendRuntime } from \"../runtime/use-backend-runtime\";\nimport { PoliciesSlice } from \"@/react/workspace/context/provider/slices/use-policies-slice\";\nimport { CommentsSliceApi } from \"@/react/workspace/context/provider/slices/use-comments-slice\";\n\nexport interface WorkspaceRefreshApi {\n readonly refreshAll: (opts?: { strict?: boolean }) => Promise<RunResult>;\n\n // NOTE: still callable as refreshBranchContext() — we just allow optional params.\n readonly refreshBranchContext: (\n opts?: Readonly<{\n branchId?: string;\n\n /**\n * When true, errors stop the chain (same meaning as refreshAll strict).\n * Defaults to false (tolerant).\n */\n strict?: boolean;\n\n /**\n * Include workspace-scoped refreshes that are often “branch-relevant” in practice\n * (services, permissions, authors). Defaults to true.\n */\n includeWorkspaceData?: boolean;\n }>,\n ) => Promise<void>;\n\n // NOTE: still callable as refreshSnapshotPointers() — optional params allowed.\n readonly refreshSnapshotPointers: (\n opts?: Readonly<{\n branchId?: string;\n strict?: boolean;\n }>,\n ) => Promise<void>;\n}\n\nexport interface UseWorkspaceRefreshParams {\n readonly runtime: BackendRuntime;\n\n readonly refreshAuthors: () => Promise<void>;\n readonly refreshPermissions: () => Promise<void>;\n readonly refreshBranches: () => Promise<void>;\n readonly refreshServices: () => Promise<void>;\n readonly refreshPolicies: PoliciesSlice[\"refreshPolicies\"];\n readonly refreshComments: CommentsSliceApi[\"refreshThreads\"];\n\n readonly getCurrentBranchId: () => string | undefined;\n\n readonly refreshTemplates: (\n params?: Partial<{ branchId: string }>,\n ) => Promise<void>;\n readonly refreshParticipants: (\n params?: Partial<{ branchId: string }>,\n ) => Promise<void>;\n\n readonly refreshSnapshotPointersForBranch: (\n branchId: string,\n ) => Promise<void>;\n readonly refreshSnapshotPointers: () => Promise<void>;\n}\n\nexport function useWorkspaceRefresh(\n params: UseWorkspaceRefreshParams,\n): WorkspaceRefreshApi {\n const {\n runtime,\n refreshAuthors,\n refreshPermissions,\n refreshBranches,\n refreshServices,\n refreshComments,\n refreshPolicies,\n getCurrentBranchId,\n refreshTemplates,\n refreshParticipants,\n refreshSnapshotPointersForBranch,\n refreshSnapshotPointers,\n } = params;\n\n const refreshBranchLocalContext = React.useCallback(\n async (branchId: string, tolerant: boolean): Promise<RunResult> => {\n return runtime.runTasks(\n [\n () => refreshParticipants({ branchId }),\n () => refreshTemplates({ branchId }),\n () => refreshSnapshotPointersForBranch(branchId),\n () => refreshComments(),\n () => refreshPolicies({ branchId }),\n ],\n tolerant,\n );\n },\n [\n runtime,\n refreshParticipants,\n refreshTemplates,\n refreshSnapshotPointersForBranch,\n ],\n );\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 branchId: string | undefined =\n opts?.branchId ?? getCurrentBranchId();\n\n if (!branchId) return;\n\n const tolerant: boolean = !(opts?.strict ?? false);\n const includeWorkspaceData: boolean =\n opts?.includeWorkspaceData ?? true;\n\n // The “practical” expectation: branch refresh should refresh branch-local data\n // AND other workspace data that impacts the branch experience.\n // (Services, authors/permissions often impact what a branch can do/render.)\n const tasks: Array<() => Promise<unknown>> = [];\n\n if (includeWorkspaceData) {\n tasks.push(() => refreshAuthors());\n tasks.push(() => refreshPermissions());\n tasks.push(() => refreshServices());\n }\n\n tasks.push(() => refreshBranchLocalContext(branchId, tolerant));\n\n await runtime.runTasks(tasks, tolerant);\n },\n [\n getCurrentBranchId,\n runtime,\n refreshAuthors,\n refreshPermissions,\n refreshServices,\n refreshBranchLocalContext,\n ],\n );\n\n const refreshAll = React.useCallback(\n async (opts?: { strict?: boolean }): Promise<RunResult> => {\n const tolerant: boolean = !(opts?.strict ?? false);\n\n // Avoid duplicate workspace refresh work:\n // refreshAll() does workspace-wide first, then branch-local only.\n const branchId: string | undefined = getCurrentBranchId();\n\n const tasks: Array<() => Promise<unknown>> = [\n () => refreshAuthors(),\n () => refreshPermissions(),\n () => refreshBranches(),\n () => refreshServices(),\n ];\n\n if (branchId) {\n tasks.push(() => refreshBranchLocalContext(branchId, tolerant));\n }\n\n return runtime.runTasks(tasks, tolerant);\n },\n [\n runtime,\n refreshAuthors,\n refreshPermissions,\n refreshBranches,\n refreshServices,\n getCurrentBranchId,\n refreshBranchLocalContext,\n refreshComments,\n refreshPolicies,\n ],\n );\n\n const refreshSnapshotPointersWrapped = React.useCallback(\n async (\n opts?: Readonly<{ branchId?: string; strict?: boolean }>,\n ): Promise<void> => {\n const tolerant: boolean = !(opts?.strict ?? false);\n\n if (opts?.branchId) {\n await runtime.runTasks(\n [\n () =>\n refreshSnapshotPointersForBranch(\n opts.branchId as string,\n ),\n ],\n tolerant,\n );\n return;\n }\n\n await runtime.runTasks([() => refreshSnapshotPointers()], tolerant);\n },\n [runtime, refreshSnapshotPointers, refreshSnapshotPointersForBranch],\n );\n\n return React.useMemo<WorkspaceRefreshApi>(\n () => ({\n refreshAll,\n refreshBranchContext,\n refreshSnapshotPointers: refreshSnapshotPointersWrapped,\n }),\n [refreshAll, refreshBranchContext, refreshSnapshotPointersWrapped],\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 { WorkspaceBackend, Result, BackendError } 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<void>;\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<void> => {\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()\n const fn: any = api?.refresh ?? api?.get;\n const fnKey: string = api?.refresh ? \"refresh\" : \"get\";\n\n if (!fn) {\n __setPoliciesState((s) =>\n failed(s, missingBackendError(fnKey)),\n );\n return;\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 __setPoliciesState((s) =>\n failed(s, res?.error ?? missingBackendError(fnKey)),\n );\n return;\n }\n\n const list: readonly DynamicRule[] = (res.value?.policies ??\n res.value ??\n []) as readonly DynamicRule[];\n\n __setPoliciesState(() => ready(list));\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 React, {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useRef,\n type ReactNode, useState,\n} from \"react\";\nimport { CanvasAPI, Field, GraphSnapshot, Tag } from \"@/react\";\nimport { Builder, BuilderOptions, createBuilder } from \"@/core\";\nimport type { CanvasOptions } from \"@/schema/canvas-types\";\nimport type { CanvasBackendOptions } from \"../../canvas/backend\";\nimport type { ServiceProps } from \"@/schema\";\nimport { useWorkspaceMaybe } from \".\";\nimport { Editor } from \"@/react/canvas/editor\";\nimport { VisibleGroup, VisibleGroupResult } from \"@/react/canvas/selection\";\n\n/* ───────────────────────── context ───────────────────────── */\n\nconst Ctx = createContext<CanvasAPI | null>(null);\n\n/** Managed props (back-compat): host provides the API instance. */\ntype CanvasProviderManagedProps = { api: CanvasAPI; children: ReactNode };\n\n/** Workspace-aware props: host omits `api`, we attach to Workspace on demand. */\ntype CanvasProviderWorkspaceProps = {\n children: ReactNode;\n /** Optional Builder options (e.g., historyLimit, serviceMap if you already have one). */\n builderOpts?: BuilderOptions;\n /** Canvas view/backend options for CanvasAPI ctor. */\n canvasOpts?: CanvasOptions & CanvasBackendOptions;\n /** If false, we won’t attempt to read Workspace; will throw if no api is provided. */\n attachToWorkspace?: boolean; // default true\n};\n\ntype CanvasProviderProps =\n | CanvasProviderManagedProps\n | CanvasProviderWorkspaceProps;\n\n/**\n * CanvasProvider\n * - Managed mode (existing): <CanvasProvider api={api}>{...}</CanvasProvider>\n * - Workspace-aware mode (new): if no `api` and inside a Workspace, auto-create Builder+CanvasAPI and load snapshot props.\n */\nexport function CanvasProvider(props: CanvasProviderProps) {\n // Managed mode: unchanged behavior\n if (\"api\" in props) {\n return <Ctx.Provider value={props.api}>{props.children}</Ctx.Provider>;\n }\n\n // Workspace-aware mode\n const {\n children,\n builderOpts,\n canvasOpts,\n attachToWorkspace = true,\n } = props;\n\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 // 🔹 NEW: if snapshot props aren’t loaded yet, trigger a one-time load\n const triedInitialLoadRef = useRef<boolean>(false);\n useEffect(() => {\n const hasProps = Boolean(ws.snapshot.data?.props);\n if (!hasProps && !triedInitialLoadRef.current) {\n triedInitialLoadRef.current = true;\n void ws.snapshot.load().then((res) => {\n // dev-only noise; stay silent in prod\n if (\n typeof window !== \"undefined\" &&\n // @ts-expect-error allow host env guard\n window.SITE?.env !== \"production\"\n ) {\n if (!res.ok) {\n // eslint-disable-next-line no-console\n console.warn(\n \"[CanvasProvider] snapshot.load() failed:\",\n res.error?.code ?? \"load_error\",\n res.error?.message ?? \"(no message)\",\n );\n }\n }\n });\n }\n }, [ws]);\n\n // Pull initial ServiceProps from current editor snapshot (if present)\n const initialProps: ServiceProps | undefined = ws.snapshot.data?.props as\n | ServiceProps\n | undefined;\n\n // If the Workspace exposes services as a map, we can forward it to builderOpts.\n // (We avoid any normalization here; arrays are ignored by design.)\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 return hasMap\n ? {\n ...(builderOpts ?? {}),\n serviceMap: svc as BuilderOptions[\"serviceMap\"],\n }\n : builderOpts;\n }, [builderOpts, ws.services.data]);\n\n const { api } = useCanvasOwned(\n initialProps,\n canvasOpts,\n resolvedBuilderOpts,\n );\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 return api;\n}\n\n/**\n * Create & memoize a CanvasAPI from a Builder.\n * - Disposes the previous API when builder changes.\n * - Accepts both view/state options and backend options.\n * - Warns (DEV only) if `opts` identity is changing every render.\n */\nexport function useCanvasFromBuilder(\n builder: Builder,\n opts?: CanvasOptions & CanvasBackendOptions,\n): CanvasAPI {\n // Warn (DEV) if the raw opts reference is churning each render\n useDevWarnOnOptsChurn(opts);\n\n // Stabilize opts content to avoid churn-driven re-instantiation\n const lastOptsRef = useRef<\n (CanvasOptions & CanvasBackendOptions) | undefined\n >(undefined);\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 // Clean up listeners / timers when API instance is replaced or unmounted\n api.dispose?.();\n };\n }, [api]);\n\n return api;\n}\n\n/**\n * Use an existing CanvasAPI instance without creating/disposing anything.\n * Useful when the host fully manages the API lifecycle (e.g., from a parent).\n */\nexport function useCanvasFromExisting(api: CanvasAPI): CanvasAPI {\n // No disposal here—the host owns the instance\n return api;\n}\n\n/* ───────────────────────── helpers ───────────────────────── */\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 const aKeys = Object.keys(a) as (keyof (CanvasOptions &\n CanvasBackendOptions))[];\n const bKeys = Object.keys(b) as (keyof (CanvasOptions &\n CanvasBackendOptions))[];\n if (aKeys.length !== bKeys.length) return false;\n for (const k of aKeys) {\n if ((a as any)[k] !== (b as any)[k]) return false;\n }\n return true;\n}\n\n/** DEV-only: warn if opts identity changes on most renders (suggests wrapping in useMemo). */\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 const now = Date.now();\n\n // Reset window every 2s\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 we see churn on most renders in the window, warn once.\n if (!warnedRef.current && churnCountRef.current >= 5) {\n warnedRef.current = true;\n // eslint-disable-next-line no-console\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 = { api: CanvasAPI; builder: Builder };\n\n/** Creates a Builder once, loads initial props, and owns the CanvasAPI lifecycle. */\nexport function useCanvasOwned(\n initialProps?: ServiceProps,\n canvasOpts?: CanvasOptions & CanvasBackendOptions,\n builderOpts?: BuilderOptions, // ← pass builder params here\n): UseCanvasOwnedReturn {\n // 1) Create the builder ONCE with the provided builder options\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); // ← forwarded\n if (initialProps) {\n builderRef.current.load(initialProps);\n loadedOnceRef.current = true;\n }\n // @ts-ignore\n } else if (window.SITE?.env !== \"production\") {\n // Warn if builderOpts identity changes after first mount (they won't be applied)\n if (builderOptsRef.current !== builderOpts) {\n // eslint-disable-next-line no-console\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 const builder = builderRef.current!;\n\n // If initial props arrive later (async Workspace load), load them once.\n useEffect(() => {\n if (!loadedOnceRef.current && initialProps) {\n builderRef.current!.load(initialProps);\n loadedOnceRef.current = true;\n }\n }, [initialProps]);\n\n // 2) Stabilize canvas options to avoid churn re-instantiation of CanvasAPI\n const lastCanvasOptsRef = useRef<typeof canvasOpts>();\n const stableCanvasOpts = useMemo(() => {\n if (!lastCanvasOptsRef.current) {\n lastCanvasOptsRef.current = canvasOpts;\n return canvasOpts;\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 if (same) return lastCanvasOptsRef.current;\n lastCanvasOptsRef.current = canvasOpts;\n return canvasOpts;\n }, [canvasOpts]);\n\n // 3) Create CanvasAPI and dispose on change/unmount\n const api = useMemo(\n () => new CanvasAPI(builder, stableCanvasOpts),\n [builder, stableCanvasOpts],\n );\n\n useEffect(\n () => () => {\n api.dispose?.();\n },\n [api],\n );\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 type { Builder } from \"@/core\";\nimport { normalise } from \"@/core\";\nimport type {\n Command,\n DgpServiceCapability,\n DgpServiceMap,\n DynamicRule,\n EditorEvents,\n EditorOptions,\n EditorSnapshot,\n FallbackSettings,\n Field,\n ServiceProps,\n Tag,\n} from \"@/schema\";\nimport type { CanvasAPI } from \"./api\";\nimport { compilePolicies, type PolicyDiagnostic } from \"@/core/policy\";\nimport { constraintFitOk, rateOk, toFiniteNumber } from \"@/utils/util\";\n\nconst MAX_LIMIT = 100;\ntype WireKind = \"bind\" | \"include\" | \"exclude\" | \"service\";\n\n// Addressing nodes\nexport type TagRef = { kind: \"tag\"; id: string };\nexport type FieldRef = { kind: \"field\"; id: string };\nexport type OptionRef = { kind: \"option\"; fieldId: string; id: string };\nexport type NodeRef = TagRef | FieldRef | OptionRef;\n\nexport type DuplicateOptions = {\n // tags\n withChildren?: boolean; // default false\n // fields\n copyBindings?: boolean; // default true\n copyIncludesExcludes?: boolean; // default false\n copyOptionMaps?: boolean; // default false\n // all\n id?: string; // force an id instead of auto\n labelStrategy?: (old: string) => string; // override default \"Label (copy)\" logic\n nameStrategy?: (old?: string) => string | undefined; // for fields; default suffix \"_copy\"\n optionIdStrategy?: (old: string) => string; // for options; default add \"_copy\"\n};\n\nconst isTagId = (id: string) => id.startsWith(\"t:\");\nconst isFieldId = (id: string) => id.startsWith(\"f:\");\nconst isOptionId = (id: string) => id.startsWith(\"o:\");\n\n// owner lookup (linear, OK for editor; index if you want later)\nfunction ownerOfOption(\n props: ServiceProps,\n optionId: string,\n): { fieldId: string; index: number } | null {\n for (const f of props.fields ?? []) {\n const idx = (f.options ?? []).findIndex((o) => o.id === optionId);\n if (idx >= 0) return { fieldId: f.id, index: idx };\n }\n return null;\n}\n\nfunction ensureServiceExists(opts: EditorOptions, id: any) {\n if (typeof opts.serviceExists === \"function\") {\n if (!opts.serviceExists(id))\n throw new Error(`service_not_found:${String(id)}`);\n return;\n }\n if (opts.serviceMap) {\n if (!Object.prototype.hasOwnProperty.call(opts.serviceMap, id as any)) {\n throw new Error(`service_not_found:${String(id)}`);\n }\n return;\n }\n // Host didn't provide a way to verify — fail so they wire one.\n throw new Error(\"service_checker_missing\");\n}\n\nexport class Editor {\n private builder: Builder;\n private api: CanvasAPI;\n private readonly opts: Required<EditorOptions>;\n private history: EditorSnapshot[] = [];\n private index = -1; // points to current snapshot\n private txnDepth = 0;\n private txnLabel?: string;\n private stagedBefore?: EditorSnapshot;\n private _lastPolicyDiagnostics?: PolicyDiagnostic[];\n constructor(builder: Builder, api: CanvasAPI, opts: EditorOptions = {}) {\n this.builder = builder;\n this.api = api;\n // @ts-ignore\n this.opts = {\n historyLimit: Math.max(\n 1,\n Math.min(opts.historyLimit ?? MAX_LIMIT, 1000),\n ),\n validateAfterEach: opts.validateAfterEach ?? false,\n };\n // seed initial snapshot\n this.pushHistory(this.makeSnapshot(\"init\"));\n }\n\n /* ───────────────────────── Public API ───────────────────────── */\n\n getProps(): ServiceProps {\n return this.builder.getProps();\n }\n\n transact(label: string, fn: () => void): void {\n const wasTop = this.txnDepth === 0;\n let ok = false;\n if (wasTop) {\n this.txnLabel = label;\n this.stagedBefore = this.makeSnapshot(label + \":before\");\n }\n this.txnDepth++;\n try {\n fn();\n ok = true;\n } finally {\n this.txnDepth--;\n if (wasTop) {\n if (ok) {\n this.commit(label); // push one history entry\n } else if (this.stagedBefore) {\n this.loadSnapshot(this.stagedBefore, \"undo\"); // rollback to pre-txn state\n }\n this.txnLabel = undefined;\n this.stagedBefore = undefined;\n }\n }\n }\n\n exec(cmd: Command): void {\n try {\n const before = this.makeSnapshot(cmd.name + \":before\");\n cmd.do();\n this.afterMutation(cmd.name, before);\n } catch (err) {\n this.emit(\"editor:error\", {\n message: (err as Error)?.message ?? String(err),\n code: \"command\",\n });\n throw err;\n }\n }\n\n undo(): boolean {\n if (this.index <= 0) return false;\n this.index--;\n this.loadSnapshot(this.history[this.index], \"undo\");\n this.emit(\"editor:undo\", {\n stackSize: this.history.length,\n index: this.index,\n });\n return true;\n }\n\n redo(): boolean {\n if (this.index >= this.history.length - 1) return false;\n this.index++;\n this.loadSnapshot(this.history[this.index], \"redo\");\n this.emit(\"editor:redo\", {\n stackSize: this.history.length,\n index: this.index,\n });\n return true;\n }\n\n clearService(id: string) {\n this.setService(id, { service_id: undefined });\n }\n\n /* ───────────── Convenience editing ops (command-wrapped) ───────────── */\n duplicate(ref: NodeRef, opts: DuplicateOptions = {}): string {\n const snapBefore = this.makeSnapshot(\"duplicate:before\");\n try {\n let newId = \"\";\n this.transact(\"duplicate\", () => {\n if (ref.kind === \"tag\") {\n newId = this.duplicateTag(ref.id, opts);\n } else if (ref.kind === \"field\") {\n newId = this.duplicateField(ref.id, opts);\n } else {\n newId = this.duplicateOption(ref.fieldId, ref.id, opts);\n }\n });\n return newId;\n } catch (err) {\n // rollback to be safe\n this.loadSnapshot(snapBefore, \"undo\");\n throw err;\n }\n }\n\n /**\n * Update the display label for a node and refresh the graph so node labels stay in sync.\n * Supports: tag (\"t:*\"), field (\"f:*\"), option (\"o:*\").\n * IDs are NOT changed; only the human-readable label.\n */\n reLabel(id: string, nextLabel: string): void {\n const label = String(nextLabel ?? \"\").trim();\n\n this.exec({\n name: \"reLabel\",\n do: () =>\n this.patchProps((p) => {\n // Tag\n if (isTagId(id)) {\n const t = (p.filters ?? []).find((x) => x.id === id);\n if (!t) return;\n if ((t.label ?? \"\") === label) return;\n t.label = label;\n // graph nodes mirror builder, so rebuild\n this.api.refreshGraph();\n return;\n }\n\n // Option (find owner field → option)\n if (isOptionId(id)) {\n const own = ownerOfOption(p, id);\n if (!own) return;\n const f = (p.fields ?? []).find(\n (x) => x.id === own.fieldId,\n );\n const o = f?.options?.find((x) => x.id === id);\n if (!o) return;\n if ((o.label ?? \"\") === label) return;\n o.label = label;\n this.api.refreshGraph();\n return;\n }\n\n // Field (default)\n const fld = (p.fields ?? []).find((x) => x.id === id);\n if (!fld) return;\n if ((fld.label ?? \"\") === label) return;\n fld.label = label;\n this.api.refreshGraph();\n }),\n undo: () => this.api.undo(),\n });\n }\n\n /**\n * Assign or change a field's `name`. Only allowed when the field (and its options) have NO service mapping.\n * - If `nextName` is empty/blank → removes the `name`.\n * - Emits an error if the field or any of its options carry a `service_id`.\n * - Emits an error if `nextName` collides with an existing field's name (case-sensitive).\n */\n setFieldName(fieldId: string, nextName: string | null | undefined): void {\n const raw = typeof nextName === \"string\" ? nextName : \"\";\n const name = raw.trim();\n\n this.exec({\n name: \"setFieldName\",\n do: () =>\n this.patchProps((p) => {\n const fields = p.fields ?? [];\n const f = fields.find((x) => x.id === fieldId);\n if (!f) {\n this.api.emit(\"error\", {\n code: \"field_not_found\",\n message: `Field not found: ${fieldId}`,\n meta: { fieldId },\n });\n return;\n }\n\n // Disallow if the field itself maps to a service\n const fieldHasService =\n typeof (f as any).service_id === \"number\";\n\n // Disallow if any option maps to a service\n const optionHasService = Array.isArray(f.options)\n ? f.options.some(\n (o) => typeof (o as any).service_id === \"number\",\n )\n : false;\n\n if (fieldHasService || optionHasService) {\n this.api.emit(\"error\", {\n code: \"field_has_service_mapping\",\n message:\n \"Cannot set a name on a field that maps to a service (either the field or one of its options has a service_id).\",\n meta: {\n fieldId,\n fieldHasService,\n optionHasService,\n },\n });\n return;\n }\n\n // If clearing, remove the key to keep payload lean\n if (name.length === 0) {\n if (\"name\" in f) delete (f as any).name;\n return;\n }\n\n // Prevent name collisions with other fields\n const collision = fields.find(\n (x) => x.id !== fieldId && (x.name ?? \"\") === name,\n );\n if (collision) {\n this.api.emit(\"error\", {\n code: \"field_name_collision\",\n message: `Another field already uses the name \"${name}\".`,\n meta: { fieldId, otherFieldId: collision.id },\n });\n return;\n }\n\n // Assign\n (f as any).name = name;\n }),\n undo: () => this.api.undo(),\n });\n }\n getLastPolicyDiagnostics(): PolicyDiagnostic[] | undefined {\n return this._lastPolicyDiagnostics;\n }\n /* ───────────────────── Internals: duplicate impls ───────────────────── */\n\n private duplicateTag(tagId: string, opts: DuplicateOptions): string {\n const props = this.builder.getProps();\n const tags = props.filters ?? [];\n const src = tags.find((t) => t.id === tagId);\n if (!src) throw new Error(`Tag not found: ${tagId}`);\n\n // generate new id + label\n const id = opts.id ?? this.uniqueId(src.id);\n const label = (opts.labelStrategy ?? nextCopyLabel)(src.label ?? id);\n\n if (!opts.withChildren) {\n // shallow copy\n this.patchProps((p) => {\n const clone = { ...src, id, label };\n // keep same parent\n clone.bind_id = src.bind_id;\n // includes/excludes are field ids—copy them as-is\n clone.constraints_overrides = undefined;\n clone.constraints_origin = undefined;\n // insert after original among siblings: we can rebuild array with splice\n const arr = p.filters ?? [];\n const idx = arr.findIndex((t) => t.id === tagId);\n arr.splice(idx + 1, 0, clone);\n p.filters = arr;\n });\n return id;\n }\n\n // deep clone subtree: map oldTagId -> newTagId\n const idMap = new Map<string, string>();\n const collect = (t: typeof src, acc: (typeof src)[]) => {\n acc.push(t);\n for (const child of tags.filter((x) => x.bind_id === t.id))\n collect(child as any, acc);\n };\n const subtree: (typeof src)[] = [];\n collect(src, subtree);\n\n // allocate ids\n for (const n of subtree)\n idMap.set(n.id, n.id === src.id ? id : this.uniqueId(n.id));\n\n // build clones\n const clones = subtree.map((n) => {\n const cloned = { ...n };\n cloned.id = idMap.get(n.id)!;\n cloned.label =\n n.id === src.id\n ? label\n : (opts.labelStrategy ?? nextCopyLabel)(n.label ?? n.id);\n\n // rewire parent if parent is in subtree\n cloned.bind_id = n.bind_id\n ? (idMap.get(n.bind_id) ?? n.bind_id)\n : undefined;\n\n // scrub derived meta (will be re-created by normalise)\n cloned.constraints_origin = undefined;\n cloned.constraints_overrides = undefined;\n return cloned;\n });\n\n this.patchProps((p) => {\n const arr = p.filters ?? [];\n // insert root clone after original\n const rootIdx = arr.findIndex((t) => t.id === tagId);\n arr.splice(rootIdx + 1, 0, clones[0] as any);\n // append other clones (order: parent before children to keep grouping stable)\n for (const c of clones.slice(1)) arr.push(c as any);\n p.filters = arr;\n });\n\n return id;\n }\n\n private duplicateField(fieldId: string, opts: DuplicateOptions): string {\n const props = this.builder.getProps();\n const fields = props.fields ?? [];\n const src = fields.find((f) => f.id === fieldId);\n if (!src) throw new Error(`Field not found: ${fieldId}`);\n\n const id = opts.id ?? this.uniqueId(src.id);\n const label = (opts.labelStrategy ?? nextCopyLabel)(src.label ?? id);\n const name = opts.nameStrategy\n ? opts.nameStrategy(src.name)\n : nextCopyName(src.name);\n\n // helper to create new option ids\n const optId = (old: string) =>\n this.uniqueOptionId(\n id,\n (opts.optionIdStrategy ?? defaultOptionIdStrategy)(old),\n );\n\n // deep copy options with new ids\n const clonedOptions = (src.options ?? []).map((o) => ({\n ...o,\n id: optId(o.id),\n label: (opts.labelStrategy ?? nextCopyLabel)(o.label ?? o.id),\n }));\n\n const cloned = {\n ...src,\n id,\n label,\n name,\n bind_id: (opts.copyBindings ?? true) ? src.bind_id : undefined,\n options: clonedOptions,\n } as typeof src;\n\n // map: oldOptId -> newOptId (only if options exist)\n const optionIdMap = new Map<string, string>();\n (src.options ?? []).forEach((o, i) => {\n const newOptId = clonedOptions[i]?.id ?? o.id;\n optionIdMap.set(o.id, newOptId);\n });\n\n this.patchProps((p) => {\n // insert clone after original\n const arr = p.fields ?? [];\n const idx = arr.findIndex((f) => f.id === fieldId);\n arr.splice(idx + 1, 0, cloned as any);\n p.fields = arr;\n\n // copy tag-level includes/excludes (field ids)\n if (opts.copyIncludesExcludes) {\n for (const t of p.filters ?? []) {\n if (t.includes?.includes(fieldId)) {\n const s = new Set(t.includes);\n s.add(id);\n t.includes = Array.from(s);\n }\n if (t.excludes?.includes(fieldId)) {\n const s = new Set(t.excludes);\n s.add(id);\n t.excludes = Array.from(s);\n }\n }\n }\n\n // copy button maps (keys are only field ids OR option ids)\n if (opts.copyOptionMaps) {\n const maps: Array<\n \"includes_for_buttons\" | \"excludes_for_buttons\"\n > = [\"includes_for_buttons\", \"excludes_for_buttons\"];\n\n for (const mapKey of maps) {\n const srcMap = (p as any)[mapKey] ?? {};\n const nextMap: Record<string, string[]> = { ...srcMap };\n\n for (const [key, targets] of Object.entries(\n srcMap as Record<string, string[]>,\n )) {\n // A) non-option button: key === original field id → duplicate under new field id\n if (key === fieldId) {\n const newKey = id;\n const merged = new Set([\n ...(nextMap[newKey] ?? []),\n ...targets,\n ]);\n nextMap[newKey] = Array.from(merged);\n continue;\n }\n\n // B) option button: key === one of the original option ids → duplicate under new option id\n if (optionIdMap.has(key)) {\n const newKey = optionIdMap.get(key)!;\n const merged = new Set([\n ...(nextMap[newKey] ?? []),\n ...targets,\n ]);\n nextMap[newKey] = Array.from(merged);\n }\n }\n\n (p as any)[mapKey] = nextMap;\n }\n }\n });\n\n return id;\n }\n\n private duplicateOption(\n fieldId: string,\n optionId: string,\n opts: DuplicateOptions,\n ): string {\n const props = this.builder.getProps();\n const fields = props.fields ?? [];\n const f = fields.find((x) => x.id === fieldId);\n if (!f) throw new Error(`Field not found: ${fieldId}`);\n const optIdx = (f.options ?? []).findIndex((o) => o.id === optionId);\n if (optIdx < 0)\n throw new Error(`Option not found: ${fieldId}::${optionId}`);\n const src = (f.options ?? [])[optIdx];\n\n const newId = this.uniqueOptionId(\n fieldId,\n (opts.optionIdStrategy ?? defaultOptionIdStrategy)(src.id),\n );\n const newLabel = (opts.labelStrategy ?? nextCopyLabel)(\n src.label ?? src.id,\n );\n\n this.patchProps((p) => {\n const fld = (p.fields ?? []).find((x) => x.id === fieldId)!;\n const arr = fld.options ?? [];\n const clone = { ...src, id: newId, label: newLabel };\n arr.splice(optIdx + 1, 0, clone);\n fld.options = arr;\n\n // Option-level maps are NOT copied by default (safer)\n if (opts.copyOptionMaps) {\n const oldKey = `${fieldId}::${optionId}`;\n const newKey = `${fieldId}::${newId}`;\n for (const mapKey of [\n \"includes_for_buttons\",\n \"excludes_for_buttons\",\n ] as const) {\n const m = p[mapKey] ?? {};\n if (m[oldKey]) {\n m[newKey] = Array.from(new Set(m[oldKey]));\n p[mapKey] = m as any;\n }\n }\n }\n });\n\n return newId;\n }\n\n /* ───────────────────── Helpers: uniqueness & naming ───────────────────── */\n\n private uniqueId(base: string): string {\n const props = this.builder.getProps();\n const taken = new Set<string>([\n ...(props.filters ?? []).map((t) => t.id),\n ...(props.fields ?? []).map((f) => f.id),\n ]);\n let candidate = nextCopyId(base);\n while (taken.has(candidate)) candidate = bumpSuffix(candidate);\n return candidate;\n }\n\n private uniqueOptionId(fieldId: string, base: string): string {\n const props = this.builder.getProps();\n const fld = (props.fields ?? []).find((f) => f.id === fieldId);\n const taken = new Set((fld?.options ?? []).map((o) => o.id));\n let candidate = base;\n if (taken.has(candidate)) candidate = nextCopyId(candidate);\n while (taken.has(candidate)) candidate = bumpSuffix(candidate);\n return candidate;\n }\n\n //---------\n\n /**\n * Reorder a node:\n * - Tag: among its siblings (same bind_id) inside filters[]\n * - Field: inside order_for_tags[scopeTagId] (you must pass scopeTagId)\n * - Option: use placeOption() instead\n */\n placeNode(\n id: string,\n opts: {\n scopeTagId?: string;\n beforeId?: string;\n afterId?: string;\n index?: number;\n },\n ) {\n if (isTagId(id)) {\n // … your existing tag sibling reorder logic …\n this.exec({\n name: \"placeTag\",\n do: () =>\n this.patchProps((p) => {\n const all = p.filters ?? [];\n const cur = all.find((t) => t.id === id);\n if (!cur) return;\n const groupKey = cur.bind_id ?? \"__root__\";\n const siblings = all.filter(\n (t) => (t.bind_id ?? \"__root__\") === groupKey,\n );\n\n const curIdx = siblings.findIndex((t) => t.id === id);\n if (curIdx < 0) return;\n const pulled = siblings.splice(curIdx, 1)[0];\n\n let dest =\n typeof opts.index === \"number\"\n ? opts.index\n : undefined;\n if (opts.beforeId)\n dest = Math.max(\n 0,\n siblings.findIndex(\n (t) => t.id === opts.beforeId,\n ),\n );\n if (opts.afterId)\n dest = Math.min(\n siblings.length,\n siblings.findIndex(\n (t) => t.id === opts.afterId,\n ) + 1,\n );\n if (dest === undefined || Number.isNaN(dest))\n dest = siblings.length;\n\n // stitch back: leave other groups untouched, replace this group in order\n const out: Tag[] = [];\n for (const t of all) {\n const sameGroup =\n (t.bind_id ?? \"__root__\") === groupKey;\n if (!sameGroup) {\n out.push(t);\n }\n // if (!used.has(t.id) && t.id !== id) continue; // skip old group entries\n }\n siblings.splice(dest, 0, pulled);\n p.filters = [...out, ...siblings];\n }),\n undo: () => this.api.undo(),\n });\n } else if (isFieldId(id)) {\n if (!opts.scopeTagId)\n throw new Error(\"placeNode(field): scopeTagId is required\");\n const fieldId = id;\n const tagId = opts.scopeTagId;\n\n this.exec({\n name: \"placeField\",\n do: () =>\n this.patchProps((p) => {\n const map = (p.order_for_tags ??= {});\n const arr = (map[tagId] ??= []);\n const curIdx = arr.indexOf(fieldId);\n if (curIdx >= 0) arr.splice(curIdx, 1);\n\n let dest =\n typeof opts.index === \"number\"\n ? opts.index\n : undefined;\n if (opts.beforeId)\n dest = Math.max(0, arr.indexOf(opts.beforeId));\n if (opts.afterId)\n dest = Math.min(\n arr.length,\n arr.indexOf(opts.afterId) + 1,\n );\n if (dest === undefined || Number.isNaN(dest))\n dest = arr.length;\n\n arr.splice(dest, 0, fieldId);\n }),\n undo: () => this.api.undo(),\n });\n } else if (isOptionId(id)) {\n // defer to placeOption for options\n this.placeOption(id, opts);\n } else {\n throw new Error(\"placeNode: unknown id prefix\");\n }\n }\n\n placeOption(\n optionId: string,\n opts: { beforeId?: string; afterId?: string; index?: number },\n ) {\n if (!isOptionId(optionId))\n throw new Error('placeOption: optionId must start with \"o:\"');\n\n this.exec({\n name: \"placeOption\",\n do: () =>\n this.patchProps((p) => {\n const owner = ownerOfOption(p, optionId);\n if (!owner) return;\n const f = (p.fields ?? []).find(\n (x) => x.id === owner.fieldId,\n );\n if (!f?.options) return;\n\n const curIdx = f.options.findIndex(\n (o) => o.id === optionId,\n );\n if (curIdx < 0) return;\n\n const pulled = f.options.splice(curIdx, 1)[0];\n\n let dest =\n typeof opts.index === \"number\" ? opts.index : undefined;\n if (opts.beforeId)\n dest = Math.max(\n 0,\n f.options.findIndex((o) => o.id === opts.beforeId),\n );\n if (opts.afterId)\n dest = Math.min(\n f.options.length,\n f.options.findIndex((o) => o.id === opts.afterId) +\n 1,\n );\n if (dest === undefined || Number.isNaN(dest))\n dest = f.options.length;\n\n f.options.splice(dest, 0, pulled);\n }),\n undo: () => this.api.undo(),\n });\n }\n\n addOption(\n fieldId: string,\n input: {\n id?: string;\n label: string;\n service_id?: number;\n pricing_role?: \"base\" | \"utility\" | \"addon\";\n [k: string]: any;\n },\n ): string {\n // decide id up-front so we can return synchronously\n const id = input.id ?? this.genId(\"o\");\n\n this.exec({\n name: \"addOption\",\n do: () =>\n this.patchProps((p) => {\n const f = (p.fields ?? []).find((x) => x.id === fieldId);\n if (!f)\n throw new Error(\n `addOption: field '${fieldId}' not found`,\n );\n const list = (f.options ??= []);\n if (list.some((o) => o.id === id))\n throw new Error(`Option id '${id}' already exists`);\n // @ts-ignore\n list.push({ ...input, id });\n }),\n undo: () => this.api.undo(),\n });\n\n return id;\n }\n\n updateOption(\n optionId: string,\n patch: Partial<\n {\n label: string;\n service_id: number;\n pricing_role: \"base\" | \"utility\" | \"addon\";\n } & Record<string, any>\n >,\n ) {\n if (!isOptionId(optionId))\n throw new Error('updateOption: optionId must start with \"o:\"');\n this.exec({\n name: \"updateOption\",\n do: () =>\n this.patchProps((p) => {\n const owner = ownerOfOption(p, optionId);\n if (!owner) return;\n const f = (p.fields ?? []).find(\n (x) => x.id === owner.fieldId,\n );\n if (!f?.options) return;\n const o = f.options.find((x) => x.id === optionId);\n if (o) Object.assign(o, patch);\n }),\n undo: () => this.api.undo(),\n });\n }\n\n removeOption(optionId: string) {\n if (!isOptionId(optionId))\n throw new Error('removeOption: optionId must start with \"o:\"');\n this.exec({\n name: \"removeOption\",\n do: () =>\n this.patchProps((p) => {\n const owner = ownerOfOption(p, optionId);\n if (!owner) return;\n const f = (p.fields ?? []).find(\n (x) => x.id === owner.fieldId,\n );\n if (!f?.options) return;\n f.options = f.options.filter((o) => o.id !== optionId);\n\n // prune option-level include/exclude maps keyed by the option id\n const maps: Array<\n \"includes_for_options\" | \"excludes_for_options\"\n > = [\"includes_for_options\", \"excludes_for_options\"];\n for (const m of maps) {\n const map = (p as any)[m] as\n | Record<string, string[]>\n | undefined;\n if (!map) continue;\n if (map[optionId]) delete map[optionId];\n if (!Object.keys(map).length) delete (p as any)[m];\n }\n }),\n undo: () => this.api.undo(),\n });\n }\n\n editLabel(id: string, label: string): void {\n const next = (label ?? \"\").trim();\n if (!next) throw new Error(\"Label cannot be empty\");\n\n this.exec({\n name: \"editLabel\",\n do: () =>\n this.patchProps((p) => {\n if (isTagId(id)) {\n const t = (p.filters ?? []).find((x) => x.id === id);\n if (t) t.label = next;\n return;\n }\n if (isFieldId(id)) {\n const f = (p.fields ?? []).find((x) => x.id === id);\n if (f) f.label = next;\n return;\n }\n if (isOptionId(id)) {\n const own = ownerOfOption(p, id);\n if (!own) return;\n const f = (p.fields ?? []).find(\n (x) => x.id === own.fieldId,\n );\n const o = f?.options?.find((x) => x.id === id);\n if (o) o.label = next;\n return;\n }\n throw new Error(\"editLabel: unsupported id\");\n }),\n undo: () => this.api.undo(),\n });\n }\n\n editName(fieldId: string, name: string | undefined) {\n this.exec({\n name: \"editName\",\n do: () =>\n this.patchProps((p) => {\n const f = (p.fields ?? []).find((x) => x.id === fieldId);\n if (!f) return;\n f.name = name;\n }),\n undo: () => this.api.undo(),\n });\n }\n\n setService(\n id: string,\n input: { service_id?: number; pricing_role?: \"base\" | \"utility\" },\n ): void {\n this.exec({\n name: \"setService\",\n do: () =>\n this.patchProps((p) => {\n const hasSidKey = Object.prototype.hasOwnProperty.call(\n input,\n \"service_id\",\n );\n const validId =\n hasSidKey &&\n typeof input.service_id === \"number\" &&\n Number.isFinite(input.service_id);\n const sid: number | undefined = validId\n ? Number(input.service_id)\n : undefined;\n const nextRole = input.pricing_role;\n\n // ── TAG ───────────────────────────────────────────────────\n if (isTagId(id)) {\n const t = (p.filters ?? []).find((x) => x.id === id);\n if (!t) return;\n\n // role not applicable for tags\n if (hasSidKey) {\n if (sid === undefined) delete (t as any).service_id;\n else t.service_id = sid;\n }\n return;\n }\n\n // ── OPTION ───────────────────────────────────────────────\n if (isOptionId(id)) {\n const own = ownerOfOption(p, id);\n if (!own) return;\n const f = (p.fields ?? []).find(\n (x) => x.id === own.fieldId,\n );\n const o = f?.options?.find((x) => x.id === id);\n if (!o) return;\n\n const currentRole = (o.pricing_role ?? \"base\") as\n | \"base\"\n | \"utility\";\n const role = nextRole ?? currentRole;\n\n if (role === \"utility\") {\n // Utilities cannot have service_id, and if switching to utility, strip any existing sid.\n if (hasSidKey && sid !== undefined) {\n this.api.emit(\"error\", {\n message:\n \"Utilities cannot have service_id (option).\",\n code: \"utility_service_conflict\",\n meta: { id, service_id: sid },\n });\n }\n o.pricing_role = \"utility\";\n if (\"service_id\" in o) delete (o as any).service_id;\n return;\n }\n\n // role === 'base'\n if (nextRole) o.pricing_role = \"base\";\n if (hasSidKey) {\n if (sid === undefined) delete (o as any).service_id;\n else o.service_id = sid;\n }\n return;\n }\n\n // ── FIELD (button-able) ─────────────────────────────────\n // Field ids usually look like \"f:*\" in your project; we’ll treat any non-tag/non-option as field.\n const f = (p.fields ?? []).find((x) => x.id === id);\n if (!f) {\n throw new Error(\n 'setService only supports tag (\"t:*\"), option (\"o:*\"), or field (\"f:*\") ids',\n );\n }\n\n const isOptionBased =\n Array.isArray(f.options) && f.options.length > 0;\n const isButton = !!(f as any).button;\n\n // Move/normalize role at field level if provided\n if (nextRole) {\n f.pricing_role = nextRole;\n }\n const effectiveRole = (f.pricing_role ?? \"base\") as\n | \"base\"\n | \"utility\";\n\n // If the field is option-based, services must live on options, not on the field.\n if (isOptionBased) {\n if (hasSidKey) {\n this.api.emit(\"error\", {\n message:\n \"Cannot set service_id on an option-based field. Assign service_id on its options instead.\",\n code: \"field_option_based_service_forbidden\",\n meta: { id, service_id: sid },\n });\n }\n // Still allow changing pricing_role at field level (acts as a default for options),\n // but never write/keep service_id on the field itself.\n if (\"service_id\" in (f as any))\n delete (f as any).service_id;\n return;\n }\n\n // For non-option fields, only \"button\" fields are allowed to carry a service_id.\n if (!isButton) {\n if (hasSidKey) {\n this.api.emit(\"error\", {\n message:\n \"Only button fields (without options) can have a service_id.\",\n code: \"non_button_field_service_forbidden\",\n meta: { id, service_id: sid },\n });\n }\n // Ensure we don't keep any stray sid\n if (\"service_id\" in (f as any))\n delete (f as any).service_id;\n return;\n }\n\n // Button field + role checks\n if (effectiveRole === \"utility\") {\n // Utilities cannot have service_id at all.\n if (hasSidKey && sid !== undefined) {\n this.api.emit(\"error\", {\n message:\n \"Utilities cannot have service_id (field).\",\n code: \"utility_service_conflict\",\n meta: { id, service_id: sid },\n });\n }\n if (\"service_id\" in (f as any))\n delete (f as any).service_id;\n return;\n }\n\n // Button field with role 'base' → allow setting/clearing sid\n if (hasSidKey) {\n if (sid === undefined) delete (f as any).service_id;\n else (f as any).service_id = sid;\n }\n }),\n undo: () => this.api.undo(),\n });\n }\n\n addTag(\n partial: Omit<Tag, \"id\" | \"label\"> & { id?: string; label: string },\n ) {\n const id = partial.id ?? this.genId(\"t\");\n const payload = { ...partial, id };\n this.exec({\n name: \"addTag\",\n do: () =>\n this.patchProps((p) => {\n p.filters = [...(p.filters ?? []), payload];\n }),\n undo: () =>\n this.patchProps((p) => {\n p.filters = (p.filters ?? []).filter((t) => t.id !== id);\n }),\n });\n }\n\n updateTag(id: string, patch: Partial<Tag>) {\n let prev: Tag | undefined;\n this.exec({\n name: \"updateTag\",\n do: () =>\n this.patchProps((p) => {\n p.filters = (p.filters ?? []).map((t) => {\n if (t.id !== id) return t;\n prev = t;\n return { ...t, ...patch };\n });\n }),\n undo: () =>\n this.patchProps((p) => {\n p.filters = (p.filters ?? []).map((t) =>\n t.id === id && prev ? prev : t,\n );\n }),\n });\n }\n\n removeTag(id: string) {\n let prevSlice!: ServiceProps;\n this.exec({\n name: \"removeTag\",\n do: () =>\n this.patchProps((p) => {\n prevSlice = cloneDeep(p);\n // noinspection DuplicatedCode\n p.filters = (p.filters ?? []).filter((t) => t.id !== id);\n // drop references\n for (const t of p.filters ?? []) {\n if (t.bind_id === id) delete t.bind_id;\n t.includes = (t.includes ?? []).filter((x) => x !== id);\n t.excludes = (t.excludes ?? []).filter((x) => x !== id);\n }\n for (const f of p.fields ?? []) {\n if (Array.isArray(f.bind_id))\n f.bind_id = f.bind_id.filter((x) => x !== id);\n else if (f.bind_id === id) delete f.bind_id;\n }\n }),\n undo: () => this.replaceProps(prevSlice),\n });\n }\n\n addField(\n partial: Omit<Field, \"id\" | \"label\" | \"type\"> & {\n id?: string;\n label: string;\n type: Field[\"type\"];\n },\n ) {\n const id = partial.id ?? this.genId(\"f\");\n const payload = { ...partial, id };\n this.exec({\n name: \"addField\",\n do: () =>\n this.patchProps((p) => {\n p.fields = [...(p.fields ?? []), payload as Field];\n }),\n undo: () =>\n this.patchProps((p) => {\n p.fields = (p.fields ?? []).filter((f) => f.id !== id);\n }),\n });\n }\n\n updateField(id: string, patch: Partial<Field>) {\n let prev: Field | undefined;\n this.exec({\n name: \"updateField\",\n do: () =>\n this.patchProps((p) => {\n // @ts-ignore\n p.fields = (p.fields ?? []).map((f) => {\n if (f.id !== id) return f;\n prev = f;\n return { ...f, ...patch };\n });\n }),\n undo: () =>\n this.patchProps((p) => {\n p.fields = (p.fields ?? []).map((f) =>\n f.id === id && prev ? prev : f,\n );\n }),\n });\n }\n\n removeField(id: string) {\n let prevSlice!: ServiceProps;\n this.exec({\n name: \"removeField\",\n do: () =>\n this.patchProps((p) => {\n prevSlice = cloneDeep(p);\n p.fields = (p.fields ?? []).filter((f) => f.id !== id);\n // prune option maps that reference this field\n for (const mapKey of [\n \"includes_for_buttons\",\n \"excludes_for_buttons\",\n ] as const) {\n const m = p[mapKey];\n if (!m) continue;\n for (const k of Object.keys(m)) {\n m[k] = (m[k] ?? []).filter((fid) => fid !== id);\n if (!m[k]?.length) delete m[k];\n }\n }\n for (const t of p.filters ?? []) {\n t.includes = (t.includes ?? []).filter((x) => x !== id);\n t.excludes = (t.excludes ?? []).filter((x) => x !== id);\n }\n }),\n undo: () => this.replaceProps(prevSlice),\n });\n }\n\n remove(id: string) {\n if (isTagId(id)) {\n this.exec({\n name: \"removeTag\",\n do: () =>\n this.patchProps((p) => {\n // noinspection DuplicatedCode\n p.filters = (p.filters ?? []).filter(\n (t) => t.id !== id,\n );\n\n // detach children + prune includes/excludes references\n for (const t of p.filters ?? []) {\n if (t.bind_id === id) delete t.bind_id;\n t.includes = (t.includes ?? []).filter(\n (x) => x !== id,\n );\n t.excludes = (t.excludes ?? []).filter(\n (x) => x !== id,\n );\n }\n\n // remove tag from field.bind_id arrays\n for (const f of p.fields ?? []) {\n if (Array.isArray(f.bind_id))\n f.bind_id = f.bind_id.filter(\n (x) => x !== id,\n ) as any;\n else if (f.bind_id === id) delete f.bind_id;\n }\n\n // prune per-tag ordering entry and stale field ids\n if (p.order_for_tags?.[id]) delete p.order_for_tags[id];\n for (const k of Object.keys(p.order_for_tags ?? {})) {\n p.order_for_tags![k] = (\n p.order_for_tags![k] ?? []\n ).filter((fid) =>\n (p.fields ?? []).some((f) => f.id === fid),\n );\n if (!p.order_for_tags![k].length)\n delete p.order_for_tags![k];\n }\n }),\n undo: () => this.api.undo(),\n });\n return;\n }\n\n if (isFieldId(id)) {\n this.exec({\n name: \"removeField\",\n do: () =>\n this.patchProps((p) => {\n p.fields = (p.fields ?? []).filter((f) => f.id !== id);\n\n // prune tag includes/excludes\n for (const t of p.filters ?? []) {\n t.includes = (t.includes ?? []).filter(\n (x) => x !== id,\n );\n t.excludes = (t.excludes ?? []).filter(\n (x) => x !== id,\n );\n }\n\n // prune per-tag ordering\n for (const k of Object.keys(p.order_for_tags ?? {})) {\n p.order_for_tags![k] = (\n p.order_for_tags![k] ?? []\n ).filter((fid) => fid !== id);\n if (!p.order_for_tags![k].length)\n delete p.order_for_tags![k];\n }\n\n // prune option maps that reference this field id\n const maps: Array<\n \"includes_for_options\" | \"excludes_for_options\"\n > = [\"includes_for_options\", \"excludes_for_options\"];\n for (const m of maps) {\n const map = (p as any)[m] as\n | Record<string, string[]>\n | undefined;\n if (!map) continue;\n for (const key of Object.keys(map)) {\n map[key] = (map[key] ?? []).filter(\n (fid) => fid !== id,\n );\n if (!map[key]?.length) delete map[key];\n }\n if (!Object.keys(map).length) delete (p as any)[m];\n }\n }),\n undo: () => this.api.undo(),\n });\n return;\n }\n\n if (isOptionId(id)) {\n this.removeOption(id);\n return;\n }\n\n throw new Error(\"remove: unknown id prefix\");\n }\n\n getNode(\n id: string,\n ):\n | { kind: \"tag\"; data?: Tag; owners: { parentTagId?: string } }\n | { kind: \"field\"; data?: Field; owners: { bindTagIds: string[] } }\n | { kind: \"option\"; data?: any; owners: { fieldId?: string } } {\n const props = this.builder.getProps();\n if (isTagId(id)) {\n const t = (props.filters ?? []).find((x) => x.id === id);\n return {\n kind: \"tag\",\n data: t,\n owners: { parentTagId: t?.bind_id },\n };\n }\n if (isFieldId(id)) {\n const f = (props.fields ?? []).find((x) => x.id === id);\n const bind = Array.isArray(f?.bind_id)\n ? (f!.bind_id as string[])\n : f?.bind_id\n ? [f.bind_id]\n : [];\n return { kind: \"field\", data: f, owners: { bindTagIds: bind } };\n }\n if (isOptionId(id)) {\n const own = ownerOfOption(props, id);\n const f = own\n ? (props.fields ?? []).find((x) => x.id === own.fieldId)\n : undefined;\n const o = f?.options?.find((x) => x.id === id);\n return {\n kind: \"option\",\n data: o,\n owners: { fieldId: own?.fieldId },\n };\n }\n // you can extend for service lookup if desired\n return { kind: \"option\", data: undefined, owners: {} };\n }\n\n getFieldQuantityRule(id: string): QuantityRule | undefined {\n const props = this.builder.getProps();\n const f = (props.fields ?? []).find((x) => x.id === id);\n if (!f) return undefined;\n return normalizeQuantityRule((f as any).meta?.quantity);\n }\n\n setFieldQuantityRule(id: string, rule: unknown): void {\n this.exec({\n name: \"setFieldQuantityRule\",\n do: () =>\n this.patchProps((p) => {\n const f = (p.fields ?? []).find((x) => x.id === id);\n if (!f) return;\n\n const normalized = normalizeQuantityRule(rule);\n\n if (!normalized) {\n // Drop invalid shapes entirely\n if ((f as any).meta?.quantity !== undefined) {\n delete (f as any).meta.quantity;\n // Clean up empty meta object\n if (\n (f as any).meta &&\n Object.keys((f as any).meta).length === 0\n ) {\n delete (f as any).meta;\n }\n }\n return;\n }\n\n // Keep other meta keys intact\n (f as any).meta = {\n ...(f as any).meta,\n quantity: normalized,\n };\n }),\n undo: () => this.api.undo(),\n });\n }\n\n clearFieldQuantityRule(id: string): void {\n this.exec({\n name: \"clearFieldQuantityRule\",\n do: () =>\n this.patchProps((p) => {\n const f = (p.fields ?? []).find((x) => x.id === id);\n if (!f || !(f as any).meta?.quantity) return;\n delete (f as any).meta.quantity;\n if (\n (f as any).meta &&\n Object.keys((f as any).meta).length === 0\n ) {\n delete (f as any).meta;\n }\n }),\n undo: () => this.api.undo(),\n });\n }\n\n /** Walk ancestors for a tag and detect if parent→child would create a cycle */\n private wouldCreateTagCycle(\n p: ServiceProps,\n parentId: string,\n childId: string,\n ): boolean {\n if (parentId === childId) return true;\n const tagById = new Map((p.filters ?? []).map((t) => [t.id, t]));\n let cur: string | undefined = parentId;\n const guard = new Set<string>();\n while (cur) {\n if (cur === childId) return true; // child is ancestor of parent → cycle\n if (guard.has(cur)) break;\n guard.add(cur);\n cur = tagById.get(cur)?.bind_id;\n }\n return false;\n }\n\n private wouldCreateIncludeExcludeCycle(\n p: ServiceProps,\n receiverId: string,\n targetId: string,\n ): boolean {\n // Simple case: A includes A or A excludes A\n if (receiverId === targetId) return true;\n\n // We want to prevent A including/excluding B if B includes/excludes A.\n const getDirectRelations = (id: string): string[] => {\n if (isTagId(id)) {\n const t = (p.filters ?? []).find((x) => x.id === id);\n return [...(t?.includes ?? []), ...(t?.excludes ?? [])];\n }\n // For buttons and options\n const inc = p.includes_for_buttons?.[id] ?? [];\n const exc = p.excludes_for_buttons?.[id] ?? [];\n return [...inc, ...exc];\n };\n\n const visited = new Set<string>();\n const stack = [targetId];\n\n while (stack.length > 0) {\n const curr = stack.pop()!;\n if (curr === receiverId) return true;\n if (visited.has(curr)) continue;\n visited.add(curr);\n\n stack.push(...getDirectRelations(curr));\n }\n\n return false;\n }\n\n include(receiverId: string, idOrIds: string | string[]) {\n this.exec({\n name: \"include\",\n do: () =>\n this.patchProps((p) => {\n const receiver = this.getNode(receiverId);\n const ids = Array.isArray(idOrIds) ? idOrIds : [idOrIds];\n if (\n receiver.kind === \"tag\" ||\n (receiver.kind === \"field\" &&\n (receiver.data as any)?.button) ||\n receiver.kind === \"option\"\n ) {\n if (receiver.kind === \"tag\") {\n const t = (p.filters ?? []).find(\n (x) => x.id === receiverId,\n );\n if (t) {\n const accepted: string[] = [];\n const next = new Set(t.includes ?? []);\n for (const id of ids) {\n if (\n this.wouldCreateIncludeExcludeCycle(\n p,\n receiverId,\n id,\n )\n ) {\n this.emit(\"editor:error\", {\n message: `Cycle detected: ${receiverId} including ${id} would create a cycle.`,\n code: \"cycle_detected\",\n meta: {\n receiverId,\n targetId: id,\n type: \"include\",\n },\n });\n continue;\n }\n next.add(id);\n accepted.push(id);\n }\n if (\n accepted.length > 0 ||\n (t.includes?.length ?? 0) > 0\n ) {\n t.includes = Array.from(next);\n }\n\n if (t.excludes) {\n t.excludes = t.excludes.filter(\n (x) => !accepted.includes(x),\n );\n if (t.excludes.length === 0) {\n delete t.excludes;\n }\n }\n }\n } else {\n const accepted: string[] = [];\n const current =\n p.includes_for_buttons?.[receiverId] ?? [];\n const next = new Set(current);\n for (const id of ids) {\n if (\n this.wouldCreateIncludeExcludeCycle(\n p,\n receiverId,\n id,\n )\n ) {\n this.emit(\"editor:error\", {\n message: `Cycle detected: ${receiverId} including ${id} would create a cycle.`,\n code: \"cycle_detected\",\n meta: {\n receiverId,\n targetId: id,\n type: \"include\",\n },\n });\n continue;\n }\n next.add(id);\n accepted.push(id);\n }\n if (\n accepted.length > 0 ||\n current.length > 0\n ) {\n if (!p.includes_for_buttons)\n p.includes_for_buttons = {};\n p.includes_for_buttons[receiverId] =\n Array.from(next);\n }\n\n if (p.excludes_for_buttons?.[receiverId]) {\n p.excludes_for_buttons[receiverId] =\n p.excludes_for_buttons[receiverId].filter(\n (x) => !accepted.includes(x),\n );\n if (\n p.excludes_for_buttons[receiverId]\n .length === 0\n ) {\n delete p.excludes_for_buttons[receiverId];\n }\n }\n }\n\n // ensure normalise doesn't drop it (test environment might not have all nodes)\n if (!p.fields) p.fields = [];\n if (!p.filters) p.filters = [];\n } else {\n throw new Error(\n \"Receiver must be a tag, button field, or option\",\n );\n }\n }),\n undo: () => this.api.undo(),\n });\n }\n\n exclude(receiverId: string, idOrIds: string | string[]) {\n this.exec({\n name: \"exclude\",\n do: () =>\n this.patchProps((p) => {\n const receiver = this.getNode(receiverId);\n const ids = Array.isArray(idOrIds) ? idOrIds : [idOrIds];\n if (\n receiver.kind === \"tag\" ||\n (receiver.kind === \"field\" &&\n (receiver.data as any)?.button) ||\n receiver.kind === \"option\"\n ) {\n if (receiver.kind === \"tag\") {\n const t = (p.filters ?? []).find(\n (x) => x.id === receiverId,\n );\n if (t) {\n const accepted: string[] = [];\n const next = new Set(t.excludes ?? []);\n for (const id of ids) {\n if (\n this.wouldCreateIncludeExcludeCycle(\n p,\n receiverId,\n id,\n )\n ) {\n this.emit(\"editor:error\", {\n message: `Cycle detected: ${receiverId} excluding ${id} would create a cycle.`,\n code: \"cycle_detected\",\n meta: {\n receiverId,\n targetId: id,\n type: \"exclude\",\n },\n });\n continue;\n }\n next.add(id);\n accepted.push(id);\n }\n if (\n accepted.length > 0 ||\n (t.excludes?.length ?? 0) > 0\n ) {\n t.excludes = Array.from(next);\n }\n\n if (t.includes) {\n t.includes = t.includes.filter(\n (x) => !accepted.includes(x),\n );\n if (t.includes.length === 0) {\n delete t.includes;\n }\n }\n }\n } else {\n const accepted: string[] = [];\n const current =\n p.excludes_for_buttons?.[receiverId] ?? [];\n const next = new Set(current);\n for (const id of ids) {\n if (\n this.wouldCreateIncludeExcludeCycle(\n p,\n receiverId,\n id,\n )\n ) {\n this.emit(\"editor:error\", {\n message: `Cycle detected: ${receiverId} excluding ${id} would create a cycle.`,\n code: \"cycle_detected\",\n meta: {\n receiverId,\n targetId: id,\n type: \"exclude\",\n },\n });\n continue;\n }\n next.add(id);\n accepted.push(id);\n }\n if (\n accepted.length > 0 ||\n current.length > 0\n ) {\n if (!p.excludes_for_buttons)\n p.excludes_for_buttons = {};\n p.excludes_for_buttons[receiverId] =\n Array.from(next);\n }\n\n if (p.includes_for_buttons?.[receiverId]) {\n p.includes_for_buttons[receiverId] =\n p.includes_for_buttons[receiverId].filter(\n (x) => !accepted.includes(x),\n );\n if (\n p.includes_for_buttons[receiverId]\n .length === 0\n ) {\n delete p.includes_for_buttons[receiverId];\n }\n }\n }\n\n // ensure normalise doesn't drop it (test environment might not have all nodes)\n if (!p.fields) p.fields = [];\n if (!p.filters) p.filters = [];\n } else {\n throw new Error(\n \"Receiver must be a tag, button field, or option\",\n );\n }\n }),\n undo: () => this.api.undo(),\n });\n }\n\n /* ──────────────────────────────────────────────────────────────────────────\n * CONNECT\n * ────────────────────────────────────────────────────────────────────────── */\n connect(kind: WireKind, fromId: string, toId: string): void {\n this.exec({\n name: `connect:${kind}`,\n do: () =>\n this.patchProps((p) => {\n /* ── BIND ─────────────────────────────────────────────── */\n if (kind === \"bind\") {\n // Tag → Tag: set child.bind_id = parent (cycle-safe)\n if (isTagId(fromId) && isTagId(toId)) {\n if (this.wouldCreateTagCycle(p, fromId, toId)) {\n throw new Error(\n `bind would create a cycle: ${fromId} → ${toId}`,\n );\n }\n const child = (p.filters ?? []).find(\n (t) => t.id === toId,\n );\n if (child) child.bind_id = fromId;\n return;\n }\n // Tag → Field (or Field → Tag): ensure field.bind_id contains the tag\n if (\n (isTagId(fromId) && isFieldId(toId)) ||\n (isFieldId(fromId) && isTagId(toId))\n ) {\n const fieldId = isFieldId(toId) ? toId : fromId;\n const tagId = isTagId(fromId) ? fromId : toId;\n const f = (p.fields ?? []).find(\n (x) => x.id === fieldId,\n );\n if (!f) return;\n if (!f.bind_id) {\n f.bind_id = tagId;\n return;\n }\n if (typeof f.bind_id === \"string\") {\n if (f.bind_id !== tagId)\n f.bind_id = [f.bind_id, tagId];\n return;\n }\n if (!f.bind_id.includes(tagId))\n f.bind_id.push(tagId);\n return;\n }\n throw new Error(\n `bind: unsupported route ${fromId} → ${toId}`,\n );\n }\n\n /* ── INCLUDE / EXCLUDE (Tag→Field, Option→Field) ──────── */\n if (kind === \"include\" || kind === \"exclude\") {\n const key =\n kind === \"include\" ? \"includes\" : \"excludes\";\n\n // Tag → Field: mutate tag.includes/excludes\n if (isTagId(fromId) && isFieldId(toId)) {\n const t = (p.filters ?? []).find(\n (x) => x.id === fromId,\n );\n if (!t) return;\n const arr = (t[key] ??= []);\n if (!arr.includes(toId)) arr.push(toId);\n return;\n }\n\n // Option → Field: mutate includes_for_options / excludes_for_options using optionId\n if (isOptionId(fromId) && isFieldId(toId)) {\n const mapKey =\n kind === \"include\"\n ? \"includes_for_options\"\n : \"excludes_for_options\";\n const maps = (p as any)[mapKey] as\n | Record<string, string[]>\n | undefined;\n const next = { ...(maps ?? {}) };\n const arr = next[fromId] ?? [];\n if (!arr.includes(toId)) arr.push(toId);\n next[fromId] = arr;\n (p as any)[mapKey] = next;\n return;\n }\n\n throw new Error(\n `${kind}: unsupported route ${fromId} → ${toId}`,\n );\n }\n\n /* ── SERVICE (Service→Tag | Service→Option) ───────────── */\n // inside connect(kind, from, to)\n if (kind === \"service\") {\n // ONLY ensure it exists; no type checks/parsing\n ensureServiceExists(this.opts, fromId);\n\n if (toId.startsWith(\"t:\")) {\n this.exec({\n name: \"connect:service→tag\",\n do: () =>\n this.patchProps((p) => {\n const t = (p.filters ?? []).find(\n (x) => x.id === toId,\n );\n if (t) (t as any).service_id = fromId; // store as-is\n }),\n undo: () => this.api.undo(),\n });\n return;\n }\n\n if (toId.startsWith(\"o:\")) {\n this.exec({\n name: \"connect:service→option\",\n do: () =>\n this.patchProps((p) => {\n for (const f of p.fields ?? []) {\n const o = f.options?.find(\n (x) => x.id === toId,\n );\n if (o) {\n (o as any).service_id = fromId;\n return;\n }\n }\n }),\n undo: () => this.api.undo(),\n });\n return;\n }\n\n throw new Error(\n 'service: to must be a tag (\"t:*\") or option (\"o:*\")',\n );\n }\n\n throw new Error(`Unknown connect kind: ${kind}`);\n }),\n undo: () => this.api.undo(), // snapshot-based undo will restore prior state\n });\n }\n\n /* ──────────────────────────────────────────────────────────────────────────\n * DISCONNECT\n * ────────────────────────────────────────────────────────────────────────── */\n disconnect(kind: WireKind, fromId: string, toId: string): void {\n this.exec({\n name: `disconnect:${kind}`,\n do: () =>\n this.patchProps((p) => {\n /* ── BIND ─────────────────────────────────────────────── */\n if (kind === \"bind\") {\n // Tag → Tag\n if (isTagId(fromId) && isTagId(toId)) {\n const child = (p.filters ?? []).find(\n (t) => t.id === toId,\n );\n if (child?.bind_id === fromId) delete child.bind_id;\n return;\n }\n // Tag ↔ Field\n if (\n (isTagId(fromId) && isFieldId(toId)) ||\n (isFieldId(fromId) && isTagId(toId))\n ) {\n const fieldId = isFieldId(toId) ? toId : fromId;\n const tagId = isTagId(fromId) ? fromId : toId;\n const f = (p.fields ?? []).find(\n (x) => x.id === fieldId,\n );\n if (!f?.bind_id) return;\n if (typeof f.bind_id === \"string\") {\n if (f.bind_id === tagId) delete f.bind_id;\n return;\n }\n f.bind_id = f.bind_id.filter(\n (x) => x !== tagId,\n ) as any;\n if (f.bind_id?.length === 0) delete f.bind_id;\n return;\n }\n throw new Error(\n `unbind: unsupported route ${fromId} → ${toId}`,\n );\n }\n\n /* ── INCLUDE / EXCLUDE (Tag→Field, Option→Field) ──────── */\n if (kind === \"include\" || kind === \"exclude\") {\n const key =\n kind === \"include\" ? \"includes\" : \"excludes\";\n\n // Tag → Field\n if (isTagId(fromId) && isFieldId(toId)) {\n const t = (p.filters ?? []).find(\n (x) => x.id === fromId,\n );\n if (!t) return;\n t[key] = (t[key] ?? []).filter((x) => x !== toId);\n if (!t[key]?.length) delete (t as any)[key];\n return;\n }\n\n // Option → Field\n if (isOptionId(fromId) && isFieldId(toId)) {\n const mapKey =\n kind === \"include\"\n ? \"includes_for_options\"\n : \"excludes_for_options\";\n const maps = (p as any)[mapKey] as\n | Record<string, string[]>\n | undefined;\n if (!maps) return;\n if (maps[fromId]) {\n maps[fromId] = (maps[fromId] ?? []).filter(\n (fid) => fid !== toId,\n );\n if (!maps[fromId]?.length) delete maps[fromId];\n }\n if (!Object.keys(maps).length)\n delete (p as any)[mapKey];\n return;\n }\n\n throw new Error(\n `${kind}: unsupported route ${fromId} → ${toId}`,\n );\n }\n\n /* ── SERVICE (Service→Tag | Service→Option) ───────────── */\n if (kind === \"service\") {\n // STILL only ensure it exists; no type checks/parsing\n ensureServiceExists(this.opts, fromId);\n\n if (toId.startsWith(\"t:\")) {\n this.exec({\n name: \"disconnect:service→tag\",\n do: () =>\n this.patchProps((p) => {\n const t = (p.filters ?? []).find(\n (x) => x.id === toId,\n );\n if (t) delete (t as any).service_id;\n }),\n undo: () => this.api.undo(),\n });\n return;\n }\n\n if (toId.startsWith(\"o:\")) {\n this.exec({\n name: \"disconnect:service→option\",\n do: () =>\n this.patchProps((p) => {\n for (const f of p.fields ?? []) {\n const o = f.options?.find(\n (x) => x.id === toId,\n );\n if (o) {\n delete (o as any).service_id;\n return;\n }\n }\n }),\n undo: () => this.api.undo(),\n });\n return;\n }\n\n throw new Error(\n 'service: to must be a tag (\"t:*\") or option (\"o:*\")',\n );\n }\n\n throw new Error(`Unknown disconnect kind: ${kind}`);\n }),\n undo: () => this.api.undo(),\n });\n }\n\n setConstraint(tagId: string, flag: string, value: boolean | undefined) {\n let prev: boolean | undefined;\n this.exec({\n name: \"setConstraint\",\n do: () =>\n this.patchProps((p) => {\n const t = (p.filters ?? []).find((x) => x.id === tagId);\n if (!t) return;\n prev = t.constraints?.[flag];\n if (!t.constraints) t.constraints = {};\n if (value === undefined) delete t.constraints[flag];\n else t.constraints[flag] = value;\n }),\n undo: () =>\n this.patchProps((p) => {\n const t = (p.filters ?? []).find((x) => x.id === tagId);\n if (!t) return;\n if (!t.constraints) t.constraints = {};\n if (prev === undefined) delete t.constraints[flag];\n else t.constraints[flag] = prev;\n }),\n });\n // After mutation, normalise() will propagate effective constraints & meta\n }\n\n /**\n * Clear a constraint override by removing the local constraint that conflicts with an ancestor.\n */\n clearConstraintOverride(tagId: string, flag: string) {\n let prev: boolean | undefined;\n let prevOverride: any;\n this.exec({\n name: \"clearConstraintOverride\",\n do: () =>\n this.patchProps((p) => {\n const t = (p.filters ?? []).find((x) => x.id === tagId);\n if (!t) return;\n prev = t.constraints?.[flag];\n prevOverride = t.constraints_overrides?.[flag];\n\n if (t.constraints) delete t.constraints[flag];\n if (t.constraints_overrides)\n delete t.constraints_overrides[flag];\n }),\n undo: () =>\n this.patchProps((p) => {\n const t = (p.filters ?? []).find((x) => x.id === tagId);\n if (!t) return;\n if (prev !== undefined) {\n if (!t.constraints) t.constraints = {};\n t.constraints[flag] = prev;\n }\n if (prevOverride !== undefined) {\n if (!t.constraints_overrides)\n t.constraints_overrides = {};\n t.constraints_overrides[flag] = prevOverride;\n }\n }),\n });\n }\n\n /**\n * Clear a constraint from a tag and its descendants.\n * If a descendant has an override, it assigns that override's value as local.\n */\n clearConstraint(tagId: string, flag: string) {\n this.exec({\n name: \"clearConstraint\",\n do: () =>\n this.patchProps((p) => {\n const tags = p.filters ?? [];\n const byId = new Map(tags.map((t) => [t.id, t]));\n const children = new Map<string, string[]>();\n for (const t of tags) {\n if (t.bind_id) {\n if (!children.has(t.bind_id))\n children.set(t.bind_id, []);\n children.get(t.bind_id)!.push(t.id);\n }\n }\n\n const process = (id: string) => {\n const t = byId.get(id);\n if (!t) return;\n\n const override = t.constraints_overrides?.[flag];\n if (override) {\n if (!t.constraints) t.constraints = {};\n t.constraints[flag] = override.from;\n delete t.constraints_overrides![flag];\n if (\n Object.keys(t.constraints_overrides ?? {})\n .length === 0\n ) {\n delete t.constraints_overrides;\n }\n } else {\n if (t.constraints) {\n delete t.constraints[flag];\n if (Object.keys(t.constraints).length === 0) {\n delete t.constraints;\n }\n }\n }\n\n for (const childId of children.get(id) ?? []) {\n process(childId);\n }\n };\n\n process(tagId);\n }),\n undo: () => this.api.undo(),\n });\n }\n\n /* ───────────────────── Internals ───────────────────── */\n\n private replaceProps(next: ServiceProps): void {\n // Ensure canonical shape + constraint propagation\n const norm = normalise(next, {\n constraints: this.builder\n .getConstraints()\n .map((item) => item.label),\n defaultPricingRole: \"base\",\n });\n this.builder.load(norm);\n this.api.refreshGraph();\n }\n\n private patchProps(mut: (p: ServiceProps) => void): void {\n const cur = cloneDeep(this.builder.getProps());\n mut(cur);\n this.replaceProps(cur);\n }\n\n private afterMutation(command: string, _before: EditorSnapshot) {\n if (this.txnDepth > 0) return; // delay until commit()\n this.pushHistory(this.makeSnapshot(command));\n this.emit(\"editor:command\", { name: command });\n if (this.opts.validateAfterEach)\n this.emit(\"editor:change\", {\n props: this.builder.getProps(),\n reason: \"validate\",\n command,\n });\n else\n this.emit(\"editor:change\", {\n props: this.builder.getProps(),\n reason: \"mutation\",\n command,\n });\n }\n\n private commit(label: string) {\n const snap = this.makeSnapshot(label);\n this.pushHistory(snap);\n this.emit(\"editor:change\", {\n props: snap.props,\n reason: \"transaction\",\n command: this.txnLabel,\n });\n }\n\n private makeSnapshot(_why: string): EditorSnapshot {\n const props = cloneDeep(this.builder.getProps());\n const canvas = this.api.snapshot();\n return {\n props,\n layout: {\n canvas,\n },\n };\n }\n\n private loadSnapshot(s: EditorSnapshot, reason: \"undo\" | \"redo\") {\n this.builder.load(cloneDeep(s.props));\n\n const layout = s.layout;\n const canvas = layout?.canvas;\n\n if (canvas) {\n if (canvas.positions) this.api.setPositions(canvas.positions);\n if (canvas.viewport) this.api.setViewport(canvas.viewport);\n if (canvas.selection)\n this.api.select(\n Array.isArray(canvas.selection)\n ? canvas.selection\n : Array.from(canvas.selection),\n );\n } else {\n this.api.refreshGraph();\n }\n this.emit(\"editor:change\", { props: this.builder.getProps(), reason });\n }\n\n private pushHistory(snap: EditorSnapshot) {\n // truncate forward\n if (this.index < this.history.length - 1) {\n this.history = this.history.slice(0, this.index + 1);\n }\n this.history.push(snap);\n // trim from start if beyond limit\n const over = this.history.length - this.opts.historyLimit;\n if (over > 0) {\n this.history.splice(0, over);\n this.index = this.history.length - 1;\n } else {\n this.index = this.history.length - 1;\n }\n }\n\n // IDs like \"t:1\", \"f:2\", \"o:3\" — must be unique across tags, fields, options.\n private genId(prefix: \"t\" | \"f\" | \"o\"): string {\n const props = this.builder.getProps();\n const taken = new Set<string>([\n ...(props.filters ?? []).map((t) => t.id),\n ...(props.fields ?? []).map((f) => f.id),\n ...(props.fields ?? []).flatMap(\n (f) => f.options?.map((o) => o.id) ?? [],\n ),\n ]);\n for (let i = 1; i < 10_000; i++) {\n const id = `${prefix}:${i}`;\n if (!taken.has(id)) return id;\n }\n throw new Error(\"Unable to generate id\");\n }\n\n private emit<K extends keyof (EditorEvents & any)>(\n event: K,\n payload: (EditorEvents & any)[K],\n ) {\n // Reuse CanvasAPI’s bus so consumers have a single stream\n this.api.emit(event as any, payload as any);\n }\n\n /**\n * Suggest/filter candidate services against the current visible-group\n * (single tag) context.\n *\n * - Excludes services already used in this group.\n * - Applies capability presence, tag constraints, rate policy, and compiled policies.\n *\n * @param candidates service ids to evaluate\n * @param ctx\n * @param ctx.tagId active visible-group tag id\n * @param ctx.usedServiceIds services already selected for this visible group (first is treated as \"primary\" for rate policy)\n * @param ctx.effectiveConstraints effective constraints for the active tag (dripfeed/refill/cancel)\n * @param ctx.policies raw JSON policies (will be compiled via compilePolicies)\n * @param ctx.fallback fallback/rate settings (defaults applied if omitted)\n */\n public filterServicesForVisibleGroup(\n candidates: Array<number | string>,\n ctx: {\n tagId: string;\n usedServiceIds: Array<number | string>;\n effectiveConstraints?: Partial<\n Record<\"refill\" | \"cancel\" | \"dripfeed\", boolean>\n >;\n policies?: unknown;\n fallback?: FallbackSettings;\n },\n ): ServiceCheck[] {\n const svcMap: DgpServiceMap =\n (this as any).opts?.serviceMap ??\n (this.builder as any).getServiceMap?.() ??\n {};\n\n const usedSet = new Set(ctx.usedServiceIds.map(String));\n const primary = ctx.usedServiceIds[0]; // group \"primary\" (first used); rate policy compares against this when present\n\n const fb: FallbackSettings = {\n requireConstraintFit: true,\n ratePolicy: { kind: \"lte_primary\" },\n selectionStrategy: \"priority\",\n mode: \"strict\",\n ...(ctx.fallback ?? {}),\n };\n\n // Compile policies once here; you asked for the evaluate path to call compilePolicies.\n const evaluatePoliciesRaw = (\n raw: unknown,\n serviceIds: Array<number | string>,\n tagId: string,\n ) => {\n const { policies } = compilePolicies(raw);\n return evaluateServicePolicies(policies, serviceIds, svcMap, tagId);\n };\n\n const out: ServiceCheck[] = [];\n\n for (const id of candidates) {\n // Skip already-used services in this group\n if (usedSet.has(String(id))) continue;\n\n const cap = svcMap[Number(id)];\n if (!cap) {\n out.push({\n id,\n ok: false,\n fitsConstraints: false,\n passesRate: false,\n passesPolicies: false,\n reasons: [\"missing_capability\"],\n });\n continue;\n }\n\n // Constraints (only flags explicitly true at tag are \"required\")\n const fitsConstraints = constraintFitOk(\n svcMap,\n cap.id,\n ctx.effectiveConstraints ?? {},\n );\n\n // Rate policy vs primary (if any); if no primary, consider pass\n const passesRate =\n primary == null ? true : rateOk(svcMap, id, primary, fb);\n\n // Policies: compile + evaluate with current used + candidate\n const polRes = evaluatePoliciesRaw(\n ctx.policies ?? [],\n [...ctx.usedServiceIds, id],\n ctx.tagId,\n );\n const passesPolicies = polRes.ok;\n\n const reasons: ServiceCheck[\"reasons\"] = [];\n if (!fitsConstraints) reasons.push(\"constraint_mismatch\");\n if (!passesRate) reasons.push(\"rate_policy\");\n if (!passesPolicies) reasons.push(\"policy_error\");\n\n out.push({\n id,\n ok: fitsConstraints && passesRate && passesPolicies,\n fitsConstraints,\n passesRate,\n passesPolicies,\n policyErrors: polRes.errors.length ? polRes.errors : undefined,\n policyWarnings: polRes.warnings.length\n ? polRes.warnings\n : undefined,\n reasons,\n cap,\n rate: toFiniteNumber(cap.rate),\n });\n }\n\n return out;\n }\n}\n\nfunction nextCopyLabel(old: string): string {\n // \"Label\" -> \"Label (copy)\", \"Label (copy)\" -> \"Label (copy 2)\"\n // noinspection RegExpUnnecessaryNonCapturingGroup\n const m = old.match(/^(.*?)(?:\\s*\\(copy(?:\\s+(\\d+))?\\))$/i);\n if (!m) return `${old} (copy)`;\n const stem = m[1].trim();\n const n = m[2] ? parseInt(m[2], 10) + 1 : 2;\n return `${stem} (copy ${n})`;\n}\n\nfunction nextCopyName(old?: string): string | undefined {\n if (!old) return undefined;\n // \"name\" -> \"name_copy\", \"name_copy\" -> \"name_copy2\", \"name_copy2\" -> \"name_copy3\"\n const m = old.match(/^(.*?)(_copy(\\d+)?)$/i);\n if (!m) return `${old}_copy`;\n const stem = m[1];\n const n = m[3] ? parseInt(m[3], 10) + 1 : 2;\n return `${stem}_copy${n}`;\n}\n\nfunction defaultOptionIdStrategy(old: string): string {\n // \"basic\" -> \"basic_copy\" / \"basic_copy2\"…\n return nextCopyId(old);\n}\n\nfunction nextCopyId(old: string): string {\n // \"tag_1\" -> \"tag_1_copy\" or bumps trailing copy N\n // noinspection RegExpUnnecessaryNonCapturingGroup\n const m = old.match(/^(.*?)(?:_copy(\\d+)?)$/i);\n if (!m) return `${old}_copy`;\n const stem = m[1];\n const n = m[2] ? parseInt(m[2], 10) + 1 : 2;\n return `${stem}_copy${n}`;\n}\n\nfunction bumpSuffix(old: string): string {\n // \"foo_copy\" -> \"foo_copy2\", \"foo_copy2\" -> \"foo_copy3\"\n const m = old.match(/^(.*?)(\\d+)$/);\n if (!m) return `${old}2`;\n const stem = m[1];\n return `${stem}${parseInt(m[2], 10) + 1}`;\n}\n\n// Accept only these shapes; drop everything else.\ntype QuantityRule = { valueBy: \"value\" | \"length\" | \"eval\"; code?: string };\n\nfunction normalizeQuantityRule(input: unknown): QuantityRule | undefined {\n if (!input || typeof input !== \"object\") return undefined;\n const v = input as any;\n const vb = v.valueBy;\n if (vb !== \"value\" && vb !== \"length\" && vb !== \"eval\") return undefined;\n\n const out: QuantityRule = { valueBy: vb };\n if (vb === \"eval\" && typeof v.code === \"string\" && v.code.trim()) {\n out.code = v.code;\n }\n // For non-eval, any provided code is dropped.\n return out;\n}\n\n// ---- Policy evaluation (compiled rules) -------------------------------------\n\nfunction evaluateServicePolicies(\n rules: DynamicRule[] | undefined,\n svcIds: (string | number)[],\n svcMap: DgpServiceMap,\n tagId: string,\n): { ok: boolean; errors: string[]; warnings: string[] } {\n const errors: string[] = [];\n const warnings: string[] = [];\n if (!rules || !rules.length) return { ok: true, errors, warnings };\n\n const relevant = rules.filter(\n (r) =>\n r.subject === \"services\" &&\n (r.scope === \"visible_group\" || r.scope === \"global\"),\n );\n\n for (const r of relevant) {\n const ids = svcIds.filter((id) =>\n matchesRuleFilter(svcMap[Number(id)], r, tagId),\n );\n const projection = r.projection || \"service.id\";\n const values = ids.map((id) =>\n policyProjectValue(svcMap[Number(id)], projection),\n );\n\n let ok = true;\n switch (r.op) {\n case \"all_equal\":\n ok = values.length <= 1 || values.every((v) => v === values[0]);\n break;\n case \"unique\": {\n const uniq = new Set(values.map((v) => String(v)));\n ok = uniq.size === values.length;\n break;\n }\n case \"no_mix\": {\n const uniq = new Set(values.map((v) => String(v)));\n ok = uniq.size <= 1;\n break;\n }\n case \"all_true\":\n ok = values.every((v) => !!v);\n break;\n case \"any_true\":\n ok = values.some((v) => !!v);\n break;\n case \"max_count\": {\n const n = typeof r.value === \"number\" ? r.value : NaN;\n ok = Number.isFinite(n) ? values.length <= n : true;\n break;\n }\n case \"min_count\": {\n const n = typeof r.value === \"number\" ? r.value : NaN;\n ok = Number.isFinite(n) ? values.length >= n : true;\n break;\n }\n default:\n ok = true;\n }\n\n if (!ok) {\n if ((r.severity ?? \"error\") === \"error\")\n errors.push(r.id ?? \"policy_error\");\n else warnings.push(r.id ?? \"policy_warning\");\n }\n }\n\n return { ok: errors.length === 0, errors, warnings };\n}\n\nfunction policyProjectValue(\n cap: DgpServiceCapability | undefined,\n projection: string,\n) {\n if (!cap) return undefined;\n const key = projection.startsWith(\"service.\")\n ? projection.slice(8)\n : projection;\n return (cap as any)[key];\n}\n\nfunction matchesRuleFilter(\n cap: DgpServiceCapability | undefined,\n rule: DynamicRule,\n tagId: string,\n): boolean {\n if (!cap) return false;\n const f = rule.filter;\n if (!f) return true;\n\n if (f.tag_id && !toStrSet(f.tag_id).has(String(tagId))) return false;\n // role is intentionally ignored at suggestion-time (unknown), as discussed.\n return true;\n}\n\nfunction toStrSet(v: string | string[] | number | number[]): Set<string> {\n const arr = Array.isArray(v) ? v : [v];\n const s = new Set<string>();\n for (const x of arr) s.add(String(x));\n return s;\n}\n\ntype ServiceCheck = {\n id: number | string;\n ok: boolean;\n fitsConstraints: boolean;\n passesRate: boolean;\n passesPolicies: boolean;\n policyErrors?: string[];\n policyWarnings?: string[];\n reasons: Array<\n | \"constraint_mismatch\"\n | \"rate_policy\"\n | \"policy_error\"\n | \"missing_capability\"\n >;\n cap?: DgpServiceCapability;\n rate?: number;\n};\n","// src/core/normalise.ts\n\nimport { cloneDeep } from \"lodash-es\";\nimport type {\n Field,\n FieldOption,\n PricingRole,\n ServiceFallback,\n ServiceIdRef,\n ServiceProps,\n Tag,\n} from \"@/schema\";\n\nexport type NormaliseOptions = {\n /** default pricing role for fields/options when missing */\n defaultPricingRole?: PricingRole; // default: 'base',\n constraints?: string[];\n};\n\nexport function normalise(\n input: unknown,\n opts: NormaliseOptions = {},\n): ServiceProps {\n const defRole: PricingRole = opts.defaultPricingRole ?? \"base\";\n const constraints = opts.constraints ?? [\"refill\", \"cancel\", \"dripfeed\"];\n const obj = toObject(input);\n\n // ── Canonical top-level keys only\n const rawFilters = Array.isArray((obj as any).filters)\n ? (obj as any).filters\n : [];\n const rawFields = Array.isArray((obj as any).fields)\n ? (obj as any).fields\n : [];\n\n const includes_for_buttons = toStringArrayMap(\n (obj as any).includes_for_buttons,\n );\n const excludes_for_buttons = toStringArrayMap(\n (obj as any).excludes_for_buttons,\n );\n\n // Tags & fields\n let filters: Tag[] = rawFilters.map((t: any) => coerceTag(t, constraints));\n const fields: Field[] = rawFields.map((f: any) => coerceField(f, defRole));\n\n // ── Ensure a root tag exists (id: 't:root')\n if (!filters.some((t) => t.id === \"t:root\")) {\n filters = [{ id: \"t:root\", label: \"Root\" }, ...filters];\n }\n\n // Canonical fallbacks only\n const fallbacks = coerceFallbacks((obj as any).fallbacks);\n\n const out: ServiceProps = {\n filters,\n fields,\n order_for_tags: (obj as any).order_for_tags,\n ...(isNonEmpty(includes_for_buttons) && { includes_for_buttons }),\n ...(isNonEmpty(excludes_for_buttons) && { excludes_for_buttons }),\n ...(fallbacks &&\n (isNonEmpty(fallbacks.nodes) || isNonEmpty(fallbacks.global)) && {\n fallbacks,\n }),\n schema_version:\n typeof (obj as any).schema_version === \"string\"\n ? (obj as any).schema_version\n : \"1.0\",\n };\n\n propagateConstraints(out, constraints);\n return out;\n}\n\n/* ───────────────────────── Constraint propagation ───────────────────────── */\n\n/**\n * Propagate constraint flags down the tag tree:\n * - Any flag defined on an ancestor overrides the child's local value.\n * - Writes back the effective value to each tag.constraints.\n * - Records provenance in tag.constraints_origin[flag] = <originTagId>.\n * - Records child overrides in tag.constraints_overrides[flag] = { from, to, origin }.\n *\n * IMPORTANT: Children inherit the **effective** value from their parent,\n * not the parent's raw local. This ensures overridden values keep propagating.\n */\nfunction propagateConstraints(props: ServiceProps, flagKeys: string[]): void {\n const tags = Array.isArray(props.filters) ? props.filters : [];\n if (!tags.length) return;\n\n const byId = new Map(tags.map((t) => [t.id, t]));\n const children = new Map<string, Tag[]>();\n\n for (const t of tags) {\n const pid = t.bind_id;\n if (!pid || !byId.has(pid)) continue;\n if (!children.has(pid)) children.set(pid, []);\n children.get(pid)!.push(t);\n }\n\n const roots = tags.filter((t) => !t.bind_id || !byId.has(t.bind_id));\n const starts = roots.length ? roots : tags;\n\n type Inherited = Partial<Record<string, { val: boolean; origin: string }>>;\n const visited = new Set<string>();\n\n const visit = (tag: Tag, inherited: Inherited) => {\n if (visited.has(tag.id)) return;\n visited.add(tag.id);\n\n // If the tag already has overrides, it means it was already normalised once.\n // We should use the 'from' value as our local baseline for this pass\n // so that we don't lose the original local intent.\n const local = cloneDeep(tag.constraints ?? {});\n if (tag.constraints_overrides) {\n for (const [k, over] of Object.entries(tag.constraints_overrides)) {\n if (over) local[k] = over.from;\n }\n }\n\n const next: Partial<Record<string, boolean>> = {};\n const origin: Partial<Record<string, string>> = {};\n const overrides: NonNullable<Tag[\"constraints_overrides\"]> = {};\n\n for (const k of flagKeys) {\n const inh = inherited[k];\n const prev = local[k];\n\n if (inh) {\n if (prev === undefined || prev === inh.val) {\n next[k] = inh.val;\n origin[k] = inh.origin;\n } else {\n next[k] = inh.val;\n origin[k] = inh.origin;\n overrides[k] = {\n from: prev as boolean,\n to: inh.val,\n origin: inh.origin,\n };\n }\n } else if (prev !== undefined) {\n next[k] = prev as boolean;\n origin[k] = tag.id;\n }\n }\n\n tag.constraints = Object.keys(next).length ? next : undefined;\n tag.constraints_origin = Object.keys(origin).length ? origin : undefined;\n tag.constraints_overrides = Object.keys(overrides).length ? overrides : undefined;\n\n const passDown: Inherited = { ...inherited };\n for (const k of flagKeys) {\n if (next[k] !== undefined && origin[k] !== undefined) {\n passDown[k] = { val: next[k] as boolean, origin: origin[k]! };\n }\n }\n for (const c of children.get(tag.id) ?? []) visit(c, passDown);\n };\n\n for (const r of starts) visit(r, {});\n}\n\n/* ───────────────────────────── coercers ───────────────────────────── */\n\nfunction coerceTag(src: any, flagKeys: string[]): Tag {\n if (!src || typeof src !== \"object\") src = {};\n const id = str(src.id);\n const label = str(src.label);\n const bind_id = str(src.bind_id) || (id == \"t:root\" ? undefined : \"t:root\");\n const service_id = toNumberOrUndefined(src.service_id);\n\n const includes = toStringArray(src.includes);\n const excludes = toStringArray(src.excludes);\n\n let constraints: Record<string, boolean> | undefined = undefined;\n if (src.constraints && typeof src.constraints === \"object\") {\n constraints = {};\n for (const k of flagKeys) {\n const v = (src.constraints as any)[k];\n if (v !== undefined) {\n constraints[k] = bool(v)!;\n }\n }\n if (Object.keys(constraints).length === 0) {\n constraints = undefined;\n }\n }\n\n const constraints_overrides =\n src.constraints_overrides && typeof src.constraints_overrides === \"object\"\n ? (src.constraints_overrides as Tag[\"constraints_overrides\"])\n : undefined;\n\n const meta =\n src.meta && typeof src.meta === \"object\"\n ? (src.meta as Record<string, unknown>)\n : undefined;\n\n const tag: Tag = {\n id: \"\",\n label: \"\",\n ...(id && { id }),\n ...(label && { label }),\n ...(bind_id && { bind_id }),\n ...(service_id !== undefined && { service_id }),\n ...(constraints && { constraints }),\n ...(constraints_overrides && { constraints_overrides }),\n ...(includes.length && { includes: dedupe(includes) }),\n ...(excludes.length && { excludes: dedupe(excludes) }),\n ...(meta && { meta }),\n };\n return tag;\n}\nfunction coerceField(src: any, defRole: PricingRole): Field {\n if (!src || typeof src !== \"object\") src = {};\n\n const bind_id = normaliseBindId(src.bind_id);\n const type = str(src.type) || \"text\";\n const id = str(src.id);\n const name = typeof src.name === \"string\" ? src.name : undefined;\n\n // BaseFieldUI (trimmed)\n const label = str(src.label) || \"\";\n const required = !!src.required;\n\n // host-defined UI schema + defaults (pass-through if objects)\n const ui =\n src.ui && typeof src.ui === \"object\"\n ? (src.ui as Record<string, unknown>)\n : undefined;\n const defaults =\n src.defaults && typeof src.defaults === \"object\"\n ? (src.defaults as Record<string, unknown>)\n : undefined;\n\n // field-level role (used as default for options)\n const pricing_role: PricingRole =\n src.pricing_role === \"utility\" || src.pricing_role === \"base\"\n ? src.pricing_role\n : defRole;\n\n // options\n const srcHasOptions = Array.isArray(src.options) && src.options.length > 0;\n const options = srcHasOptions\n ? (src.options as any[]).map((o) => coerceOption(o, pricing_role))\n : undefined;\n\n // custom component (only for type === 'custom')\n const component =\n type === \"custom\" ? str(src.component) || undefined : undefined;\n\n // meta (pass-through)\n const meta =\n src.meta && typeof src.meta === \"object\"\n ? { ...(src.meta as any) }\n : undefined;\n\n // button rule:\n // - option-based fields are always buttons\n // - otherwise, respect explicit boolean true\n const button: boolean = srcHasOptions ? true : src.button === true;\n\n // field-level service_id is allowed only for *buttons* with base role\n const field_service_id_raw = toNumberOrUndefined(src.service_id);\n const field_service_id =\n button &&\n pricing_role !== \"utility\" &&\n field_service_id_raw !== undefined\n ? field_service_id_raw\n : undefined;\n\n const field: Field = {\n id,\n type,\n ...(bind_id !== undefined && { bind_id }),\n ...(name && { name }),\n ...(options && options.length && { options }),\n ...(component && { component }),\n pricing_role,\n label,\n required,\n ...(ui && { ui: ui as any }),\n ...(defaults && { defaults }),\n ...(meta && { meta }),\n ...(button ? { button } : {}),\n ...(field_service_id !== undefined && { service_id: field_service_id }),\n };\n\n return field;\n}\n\nfunction coerceOption(src: any, inheritRole: PricingRole): FieldOption {\n if (!src || typeof src !== \"object\") src = {};\n const id = str(src.id);\n const label = str(src.label);\n const service_id = toNumberOrUndefined(src.service_id);\n const value =\n typeof src.value === \"string\" || typeof src.value === \"number\"\n ? (src.value as string | number)\n : undefined;\n\n const pricing_role: PricingRole =\n src.pricing_role === \"utility\" || src.pricing_role === \"base\"\n ? src.pricing_role\n : inheritRole;\n\n const meta =\n src.meta && typeof src.meta === \"object\"\n ? (src.meta as Record<string, unknown>)\n : undefined;\n\n const option: FieldOption = {\n id: \"\",\n label: \"\",\n ...(id && { id }),\n ...(label && { label }),\n ...(value !== undefined && { value }),\n ...(service_id !== undefined && { service_id }),\n pricing_role,\n ...(meta && { meta }),\n };\n return option;\n}\n\n/* ───────────────────────── fallbacks (canonical only) ───────────────────────── */\n\nfunction coerceFallbacks(src: any): ServiceFallback | undefined {\n if (!src || typeof src !== \"object\") return undefined;\n\n const out: ServiceFallback = {};\n const g = (src as any).global;\n const n = (src as any).nodes;\n\n if (g && typeof g === \"object\") {\n const rg: Record<string, ServiceIdRef[]> = {};\n for (const [k, v] of Object.entries(g)) {\n const key = String(k);\n const arr = toServiceIdArray(v);\n const clean = dedupe(arr.filter((x) => String(x) !== key));\n if (clean.length) rg[key] = clean;\n }\n if (Object.keys(rg).length) out.global = rg;\n }\n\n if (n && typeof n === \"object\") {\n const rn: Record<string, ServiceIdRef[]> = {};\n for (const [nodeId, v] of Object.entries(n)) {\n const key = String(nodeId);\n const arr = toServiceIdArray(v);\n const clean = dedupe(arr.filter((x) => String(x) !== key));\n if (clean.length) rn[key] = clean;\n }\n if (Object.keys(rn).length) out.nodes = rn;\n }\n\n return out.nodes || out.global ? out : undefined;\n}\n\n/* ───────────────────────── utilities ───────────────────────── */\n\nfunction toObject(input: unknown): Record<string, unknown> {\n if (input && typeof input === \"object\")\n return input as Record<string, unknown>;\n throw new TypeError(\"normalise(): expected an object payload\");\n}\n\nfunction normaliseBindId(bind: unknown): string | string[] | undefined {\n if (typeof bind === \"string\" && bind.trim()) return bind.trim();\n if (Array.isArray(bind)) {\n const arr = dedupe(bind.map((b) => String(b).trim()).filter(Boolean));\n if (arr.length === 0) return undefined;\n if (arr.length === 1) return arr[0];\n return arr;\n }\n return undefined;\n}\n\nfunction toStringArrayMap(src: any): Record<string, string[]> | undefined {\n if (!src || typeof src !== \"object\") return undefined;\n const out: Record<string, string[]> = {};\n for (const [k, v] of Object.entries(src)) {\n if (!k) continue;\n const arr = toStringArray(v);\n if (arr.length) out[k] = dedupe(arr);\n }\n return Object.keys(out).length ? out : undefined;\n}\n\nfunction toStringArray(v: any): string[] {\n if (!Array.isArray(v)) return [];\n return v.map((x) => String(x)).filter((s) => !!s && s.trim().length > 0);\n}\n\nfunction toNumberOrUndefined(v: any): number | undefined {\n if (v === null || v === undefined) return undefined;\n const n = Number(v);\n return Number.isFinite(n) ? n : undefined;\n}\n\nfunction str(v: any): string | undefined {\n if (typeof v === \"string\" && v.trim().length > 0) return v.trim();\n return undefined;\n}\n\nfunction bool(v: any): boolean | undefined {\n if (v === undefined) return undefined;\n return !!v;\n}\n\nfunction dedupe<T>(arr: T[]): T[] {\n return Array.from(new Set(arr));\n}\n\nfunction isNonEmpty<T extends Record<string, any> | undefined>(\n obj: T,\n): obj is NonNullable<T> {\n return !!obj && Object.keys(obj).length > 0;\n}\n\nfunction toServiceIdArray(v: any): ServiceIdRef[] {\n if (!Array.isArray(v)) return [];\n return v\n .map((x) =>\n typeof x === \"number\" || typeof x === \"string\" ? x : String(x),\n )\n .filter(\n (x) => x !== \"\" && x !== null && x !== undefined,\n ) as ServiceIdRef[];\n}\n","// src/core/validate/shared.ts\nimport type { ServiceProps, Tag, Field } from \"@/schema\";\nimport type { DgpServiceMap } from \"@/schema/provider\";\nimport type { ValidationError, ValidatorOptions } from \"@/schema/validation\";\n\nexport interface ValidationCtx {\n readonly props: ServiceProps;\n readonly options: ValidatorOptions;\n\n readonly errors: ValidationError[];\n\n readonly serviceMap: DgpServiceMap;\n readonly selectedKeys: Set<string>;\n\n readonly tags: Tag[];\n readonly fields: Field[];\n\n readonly tagById: Map<string, Tag>;\n readonly fieldById: Map<string, Field>;\n\n fieldsVisibleUnder: (tagId: string) => Field[];\n}\n\nexport function isFiniteNumber(v: unknown): v is number {\n return typeof v === \"number\" && Number.isFinite(v);\n}\n\nexport function hasAnyServiceOption(f: Field): boolean {\n return (f.options ?? []).some((o) => isFiniteNumber(o.service_id));\n}\n\nexport function isBoundTo(f: Field, tagId: string): boolean {\n const b: string | string[] | undefined = f.bind_id;\n if (!b) return false;\n return Array.isArray(b) ? b.includes(tagId) : b === tagId;\n}\n\nexport function getByPath(obj: unknown, path: string | undefined): unknown {\n if (!path) return undefined;\n\n const parts: string[] = path.split(\".\");\n let cur: any = obj;\n\n for (const p of parts) {\n if (cur == null) return undefined;\n cur = cur[p];\n }\n\n return cur;\n}\n\nexport type WhereClause = NonNullable<\n NonNullable<import(\"@/schema/validation\").DynamicRule[\"filter\"]>[\"where\"]\n>[number];\n\nexport function jsonStable(v: unknown): string {\n try {\n return JSON.stringify(v);\n } catch {\n return String(v);\n }\n}\n\nexport function eqValue(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n return jsonStable(a) === jsonStable(b);\n}\n\nexport function includesValue(\n arr: readonly unknown[],\n needle: unknown,\n): boolean {\n for (const v of arr) {\n if (eqValue(v, needle)) return true;\n }\n return false;\n}\n\nexport function matchesWhere(\n svc: Record<string, unknown>,\n where: readonly WhereClause[] | undefined,\n): boolean {\n if (!where || where.length === 0) return true;\n\n const root: Record<string, unknown> = { service: svc };\n\n for (const clause of where) {\n const path: string = clause.path;\n const op: string = clause.op ?? \"eq\";\n const value: unknown = clause.value;\n\n const cur: unknown = getByPath(root, path);\n\n if (op === \"exists\") {\n if (cur === undefined || cur === null) return false;\n continue;\n }\n if (op === \"truthy\") {\n if (!cur) return false;\n continue;\n }\n if (op === \"falsy\") {\n if (cur) return false;\n continue;\n }\n\n if (op === \"in\" || op === \"nin\") {\n const list: unknown[] = Array.isArray(value) ? value : [];\n const hit: boolean = includesValue(list, cur);\n if (op === \"in\" && !hit) return false;\n if (op === \"nin\" && hit) return false;\n continue;\n }\n\n if (op === \"neq\") {\n if (eqValue(cur, value)) return false;\n continue;\n }\n\n if (op === \"sw\") {\n const s: string = String(cur ?? \"\");\n const prefix: string = String(value ?? \"\");\n if (!s.startsWith(prefix)) return false;\n continue;\n }\n\n // default \"eq\"\n if (!eqValue(cur, value)) return false;\n }\n\n return true;\n}\n\nexport function serviceFlagState(\n svc: Record<string, unknown>,\n flagId: string,\n): boolean | undefined {\n const flags: unknown = (svc as any).flags;\n const entry: unknown =\n flags && typeof flags === \"object\" ? (flags as any)[flagId] : undefined;\n\n const enabled: unknown =\n entry && typeof entry === \"object\" ? (entry as any).enabled : undefined;\n\n if (enabled === true) return true;\n if (enabled === false) return false;\n\n return undefined;\n}\n\nexport function isServiceFlagEnabled(\n svc: Record<string, unknown>,\n flagId: string,\n): boolean {\n return serviceFlagState(svc, flagId) === true;\n}\n\n// src/core/validate/error.ts\nexport function withAffected(\n details: Record<string, unknown> | undefined,\n ids: string[] | undefined,\n): Record<string, unknown> | undefined {\n if (!ids || ids.length <= 1) return details;\n return { ...(details ?? {}), affectedIds: ids };\n}\n","// src/core/validate/steps/visibility.ts\nimport type { Field } from \"@/schema\";\nimport type { ValidationCtx } from \"../shared\";\nimport { isBoundTo, isFiniteNumber, withAffected } from \"../shared\";\n\nexport function createFieldsVisibleUnder(\n v: ValidationCtx,\n): (tagId: string) => Field[] {\n return (tagId: string): Field[] => {\n const tag = v.tagById.get(tagId);\n const includesTag: Set<string> = new Set<string>(tag?.includes ?? []);\n const excludesTag: Set<string> = new Set<string>(tag?.excludes ?? []);\n\n const incForOpt: Record<string, string[]> =\n v.props.includes_for_buttons ?? {};\n const excForOpt: Record<string, string[]> =\n v.props.excludes_for_buttons ?? {};\n\n const includesOpt: Set<string> = new Set<string>();\n const excludesOpt: Set<string> = new Set<string>();\n\n for (const key of v.selectedKeys) {\n for (const id of incForOpt[key] ?? []) includesOpt.add(id);\n for (const id of excForOpt[key] ?? []) excludesOpt.add(id);\n }\n\n const merged: Map<string, Field> = new Map<string, Field>();\n\n for (const f of v.fields) {\n if (isBoundTo(f, tagId)) merged.set(f.id, f);\n if (includesTag.has(f.id)) merged.set(f.id, f);\n if (includesOpt.has(f.id)) merged.set(f.id, f);\n }\n\n for (const id of excludesTag) merged.delete(id);\n for (const id of excludesOpt) merged.delete(id);\n\n return Array.from(merged.values());\n };\n}\n\nexport function validateVisibility(v: ValidationCtx): void {\n // duplicate visible labels (selection-aware)\n for (const t of v.tags) {\n const visible: Field[] = v.fieldsVisibleUnder(t.id);\n const seen: Map<string, string> = new Map<string, string>();\n\n for (const f of visible) {\n const label: string = (f.label ?? \"\").trim();\n if (!label) continue;\n\n if (seen.has(label)) {\n const otherId: string | undefined = seen.get(label);\n\n v.errors.push({\n code: \"duplicate_visible_label\",\n severity: \"error\",\n message: `Duplicate visible label \"${label}\" under tag \"${t.id}\".`,\n nodeId: f.id,\n details: withAffected(\n { tagId: t.id, other: otherId, label },\n otherId ? [t.id, f.id, otherId] : [t.id, f.id],\n ),\n });\n } else {\n seen.set(label, f.id);\n }\n }\n }\n\n // Quantity marker rule: at most one marker per visible group (tag)\n for (const t of v.tags) {\n const visible: Field[] = v.fieldsVisibleUnder(t.id);\n const markers: string[] = [];\n\n for (const f of visible) {\n const q: unknown = (f.meta as any)?.quantity;\n if (q) markers.push(f.id);\n }\n\n if (markers.length > 1) {\n v.errors.push({\n code: \"quantity_multiple_markers\",\n severity: \"error\",\n message: `Multiple quantity markers found under tag \"${t.id}\". Only one is allowed per visible group.`,\n nodeId: t.id,\n details: withAffected({ tagId: t.id, markers }, [\n t.id,\n ...markers,\n ]),\n });\n }\n }\n\n // utility_without_base per visible tag group (selection-aware)\n for (const t of v.tags) {\n const visible: Field[] = v.fieldsVisibleUnder(t.id);\n\n let hasBase: boolean = false;\n let hasUtility: boolean = false;\n const utilityOptionIds: string[] = [];\n\n for (const f of visible) {\n for (const o of f.options ?? []) {\n if (!isFiniteNumber(o.service_id)) continue;\n\n const role: string = o.pricing_role ?? f.pricing_role ?? \"base\";\n if (role === \"base\") hasBase = true;\n else if (role === \"utility\") {\n hasUtility = true;\n utilityOptionIds.push(o.id);\n }\n }\n }\n\n if (hasUtility && !hasBase) {\n v.errors.push({\n code: \"utility_without_base\",\n severity: \"error\",\n message: `Utility-priced options exist under tag \"${t.id}\" but no base-priced options were found in the same visible group.`,\n nodeId: t.id,\n details: withAffected({ tagId: t.id, utilityOptionIds }, [\n t.id,\n ...utilityOptionIds,\n ]),\n });\n }\n }\n}\n","// src/core/validate/steps/structure.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { withAffected } from \"../shared\";\nimport { isFiniteNumber } from \"../shared\";\n\nexport function validateStructure(v: ValidationCtx): void {\n const tags = v.tags;\n const fields = v.fields;\n\n // root present\n if (!tags.some((t) => t.id === \"root\")) {\n v.errors.push({\n code: \"root_missing\",\n severity: \"error\",\n message: 'Missing required root tag with id \"root\".',\n });\n }\n\n // cycles in tag parentage\n const visiting: Set<string> = new Set<string>();\n const visited: Set<string> = new Set<string>();\n\n const hasCycleFrom = (id: string): boolean => {\n if (visiting.has(id)) return true;\n if (visited.has(id)) return false;\n\n visiting.add(id);\n\n const parent: string | undefined = v.tagById.get(id)?.bind_id;\n if (parent && v.tagById.has(parent) && hasCycleFrom(parent))\n return true;\n\n visiting.delete(id);\n visited.add(id);\n return false;\n };\n\n for (const t of tags) {\n if (hasCycleFrom(t.id)) {\n v.errors.push({\n code: \"cycle_in_tags\",\n severity: \"error\",\n message: `Cycle detected in tag parentage starting at tag \"${t.id}\".`,\n nodeId: t.id,\n details: { tagId: t.id },\n });\n break;\n }\n }\n\n // tag.bind_id must point to existing tag (if present)\n for (const t of tags) {\n if (t.bind_id && !v.tagById.has(t.bind_id)) {\n v.errors.push({\n code: \"bad_bind_reference\",\n severity: \"error\",\n message: `Tag \"${t.id}\" binds to missing parent tag \"${t.bind_id}\".`,\n nodeId: t.id,\n details: withAffected({ ref: t.bind_id }, [t.id]),\n });\n }\n }\n\n // field.bind_id must reference tags\n for (const f of fields) {\n const b = f.bind_id;\n\n if (Array.isArray(b)) {\n for (const id of b) {\n if (!v.tagById.has(id)) {\n v.errors.push({\n code: \"bad_bind_reference\",\n severity: \"error\",\n message: `Field \"${f.id}\" binds to missing tag \"${id}\".`,\n nodeId: f.id,\n details: withAffected({ ref: id }, [f.id]),\n });\n }\n }\n } else if (typeof b === \"string\") {\n if (!v.tagById.has(b)) {\n v.errors.push({\n code: \"bad_bind_reference\",\n severity: \"error\",\n message: `Field \"${f.id}\" binds to missing tag \"${b}\".`,\n nodeId: f.id,\n details: withAffected({ ref: b }, [f.id]),\n });\n }\n }\n }\n\n void isFiniteNumber; // keeps parity if you had helper usage in the original file\n}\n","// src/core/validate/steps/identity.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { hasAnyServiceOption, withAffected } from \"../shared\";\n\nexport function validateIdentity(v: ValidationCtx): void {\n const tags = v.tags;\n const fields = v.fields;\n\n // duplicate ids across tags + fields\n {\n const firstSeen: Map<string, string> = new Map<string, string>(); // id -> first kind (\"tag\"|\"field\")\n const seen: Set<string> = new Set<string>();\n\n for (const t of tags) {\n if (seen.has(t.id)) {\n v.errors.push({\n code: \"duplicate_id\",\n severity: \"error\",\n message: `Duplicate id \"${t.id}\" found (tag).`,\n nodeId: t.id,\n // we only know the id itself; no other id to point at\n });\n } else {\n seen.add(t.id);\n firstSeen.set(t.id, \"tag\");\n }\n }\n\n for (const f of fields) {\n if (seen.has(f.id)) {\n const kind: string = firstSeen.get(f.id) ?? \"tag/field\";\n v.errors.push({\n code: \"duplicate_id\",\n severity: \"error\",\n message: `Duplicate id \"${f.id}\" found (field) — already used by a ${kind}.`,\n nodeId: f.id,\n });\n } else {\n seen.add(f.id);\n firstSeen.set(f.id, \"field\");\n }\n }\n }\n\n // tag labels unique + required\n {\n const seen: Map<string, string> = new Map<string, string>(); // label -> tagId\n\n for (const t of tags) {\n if (!t.label || !t.label.trim()) {\n v.errors.push({\n code: \"label_missing\",\n severity: \"error\",\n message: `Tag \"${t.id}\" is missing a label.`,\n nodeId: t.id,\n details: { kind: \"tag\" },\n });\n continue;\n }\n\n const k: string = t.label;\n\n if (seen.has(k)) {\n const otherId: string | undefined = seen.get(k);\n v.errors.push({\n code: \"duplicate_tag_label\",\n severity: \"error\",\n message: `Duplicate tag label \"${k}\" found on tag \"${t.id}\".`,\n nodeId: t.id,\n details: withAffected(\n { other: otherId, label: k },\n otherId ? [t.id, otherId] : undefined,\n ),\n });\n } else {\n seen.set(k, t.id);\n }\n }\n }\n\n // field labels required; names unique among user-input fields\n {\n const seenNames: Map<string, string> = new Map<string, string>(); // name -> fieldId\n\n for (const f of fields) {\n if (!f.label || !f.label.trim()) {\n v.errors.push({\n code: \"label_missing\",\n severity: \"error\",\n message: `Field \"${f.id}\" is missing a label.`,\n nodeId: f.id,\n details: { kind: \"field\" },\n });\n }\n\n const isUserInput: boolean = !!f.name && !hasAnyServiceOption(f);\n\n if (isUserInput && f.name) {\n const k: string = f.name;\n\n if (seenNames.has(k)) {\n const otherId: string | undefined = seenNames.get(k);\n v.errors.push({\n code: \"duplicate_field_name\",\n severity: \"error\",\n message: `Duplicate field name \"${k}\" found on field \"${f.id}\".`,\n nodeId: f.id,\n details: withAffected(\n { other: otherId, name: k },\n otherId ? [f.id, otherId] : undefined,\n ),\n });\n } else {\n seenNames.set(k, f.id);\n }\n }\n }\n }\n\n // option labels required\n for (const f of fields) {\n for (const o of f.options ?? []) {\n if (!o.label || !o.label.trim()) {\n v.errors.push({\n code: \"label_missing\",\n severity: \"error\",\n message: `Option \"${o.id}\" (field \"${f.id}\") is missing a label.`,\n nodeId: o.id,\n details: { kind: \"option\", fieldId: f.id },\n });\n }\n }\n }\n}\n","// src/core/validate/steps/option-maps.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { withAffected } from \"../shared\";\n\ntype ParsedKey = { fieldId: string; optionId: string };\n\nexport function validateOptionMaps(v: ValidationCtx): void {\n const incMap: Record<string, string[]> = v.props.includes_for_buttons ?? {};\n const excMap: Record<string, string[]> = v.props.excludes_for_buttons ?? {};\n\n const parseKey = (key: string): ParsedKey | null => {\n const parts: string[] = key.split(\"::\");\n const fid: string | undefined = parts[0];\n const oid: string | undefined = parts[1];\n if (!fid || !oid) return null;\n return { fieldId: fid, optionId: oid };\n };\n\n const hasOption = (fid: string, oid: string): boolean => {\n const f = v.fieldById.get(fid);\n if (!f) return false;\n return !!(f.options ?? []).find((o) => o.id === oid);\n };\n\n const badKeyMessage = (key: string): string =>\n `Invalid option-map key \"${key}\". Expected \"fieldId::optionId\" pointing to an existing option.`;\n\n // bad_option_key\n for (const k of Object.keys(incMap)) {\n const p = parseKey(k);\n if (!p || !hasOption(p.fieldId, p.optionId)) {\n v.errors.push({\n code: \"bad_option_key\",\n severity: \"error\",\n message: badKeyMessage(k),\n details: { key: k },\n });\n }\n }\n for (const k of Object.keys(excMap)) {\n const p = parseKey(k);\n if (!p || !hasOption(p.fieldId, p.optionId)) {\n v.errors.push({\n code: \"bad_option_key\",\n severity: \"error\",\n message: badKeyMessage(k),\n details: { key: k },\n });\n }\n }\n\n // option_include_exclude_conflict\n for (const k of Object.keys(incMap)) {\n if (k in excMap) {\n const p = parseKey(k);\n const affected: string[] | undefined = p\n ? [p.fieldId, p.optionId]\n : undefined;\n\n v.errors.push({\n code: \"option_include_exclude_conflict\",\n severity: \"error\",\n message: `Option-map key \"${k}\" appears in both includes_for_buttons and excludes_for_buttons.`,\n nodeId: p?.fieldId,\n details: withAffected({ key: k }, affected),\n });\n }\n }\n}\n","// src/core/validate/steps/service-vs-input.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { hasAnyServiceOption } from \"../shared\";\n\nexport function validateServiceVsUserInput(v: ValidationCtx): void {\n for (const f of v.fields) {\n const anySvc: boolean = hasAnyServiceOption(f);\n const hasName: boolean = !!(f.name && f.name.trim());\n\n if (f.type === \"custom\" && anySvc) {\n v.errors.push({\n code: \"user_input_field_has_service_option\",\n severity: \"error\",\n message: `Custom field \"${f.id}\" cannot map service options.`,\n nodeId: f.id,\n details: { reason: \"custom_cannot_map_service\" },\n });\n }\n\n if (!hasName) {\n // treated as service-backed → require at least one service option\n if (!anySvc) {\n v.errors.push({\n code: \"service_field_missing_service_id\",\n severity: \"error\",\n message: `Service-backed field \"${f.id}\" has no \"name\" and must provide at least one option with a service_id.`,\n nodeId: f.id,\n });\n }\n } else {\n // user-input → options must not carry service_id\n if (anySvc) {\n v.errors.push({\n code: \"user_input_field_has_service_option\",\n severity: \"error\",\n message: `User-input field \"${f.id}\" has a name and must not include any options with service_id.`,\n nodeId: f.id,\n });\n }\n }\n }\n}\n","// src/core/validate/steps/utility.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { isFiniteNumber, withAffected } from \"../shared\";\n\nexport function validateUtilityMarkers(v: ValidationCtx): void {\n const ALLOWED_UTILITY_MODES: Set<string> = new Set<string>([\n \"flat\",\n \"per_quantity\",\n \"per_value\",\n \"percent\",\n ]);\n\n // option-level\n for (const f of v.fields) {\n const optsArr = Array.isArray(f.options) ? f.options : [];\n for (const o of optsArr) {\n const role: string = o.pricing_role ?? f.pricing_role ?? \"base\";\n const hasService: boolean = isFiniteNumber(o.service_id);\n const util: unknown = (o.meta as any)?.utility;\n\n if (role === \"utility\" && hasService) {\n v.errors.push({\n code: \"utility_with_service_id\",\n severity: \"error\",\n message: `Utility-priced option \"${o.id}\" (field \"${f.id}\") must not reference a service_id.`,\n nodeId: o.id,\n details: withAffected(\n {\n fieldId: f.id,\n optionId: o.id,\n service_id: o.service_id,\n },\n [f.id, o.id],\n ),\n });\n }\n\n if (util) {\n const mode: unknown = (util as any).mode;\n const rate: unknown = (util as any).rate;\n\n if (!isFiniteNumber(rate)) {\n v.errors.push({\n code: \"utility_missing_rate\",\n severity: \"error\",\n message: `Utility definition for option \"${o.id}\" (field \"${f.id}\") is missing a valid rate.`,\n nodeId: o.id,\n details: withAffected(\n { fieldId: f.id, optionId: o.id },\n [f.id, o.id],\n ),\n });\n }\n\n if (!ALLOWED_UTILITY_MODES.has(String(mode))) {\n v.errors.push({\n code: \"utility_invalid_mode\",\n severity: \"error\",\n message: `Utility definition for option \"${o.id}\" (field \"${f.id}\") has invalid mode \"${String(\n mode,\n )}\".`,\n nodeId: o.id,\n details: withAffected(\n { fieldId: f.id, optionId: o.id, mode },\n [f.id, o.id],\n ),\n });\n }\n }\n }\n }\n\n // field-level\n for (const f of v.fields) {\n const util: unknown = (f.meta as any)?.utility;\n if (!util) continue;\n\n const mode: unknown = (util as any).mode;\n const rate: unknown = (util as any).rate;\n\n if (!isFiniteNumber(rate)) {\n v.errors.push({\n code: \"utility_missing_rate\",\n severity: \"error\",\n message: `Utility definition for field \"${f.id}\" is missing a valid rate.`,\n nodeId: f.id,\n details: withAffected({ fieldId: f.id }, [f.id]),\n });\n }\n\n if (!ALLOWED_UTILITY_MODES.has(String(mode))) {\n v.errors.push({\n code: \"utility_invalid_mode\",\n severity: \"error\",\n message: `Utility definition for field \"${f.id}\" has invalid mode \"${String(\n mode,\n )}\".`,\n nodeId: f.id,\n details: withAffected({ fieldId: f.id, mode }, [f.id]),\n });\n }\n }\n}\n","import { Field } from \"@/schema\";\n\n/**\n * Heuristic: multi-select if type hints ('multiselect'|'checkbox') or meta.multi === true.\n * Hosts can rely on meta.multi if using custom type strings.\n */\nexport function isMultiField(f: Field): boolean {\n const t = (f.type || \"\").toLowerCase();\n const metaMulti = !!f.meta?.multi;\n return t === \"multiselect\" || t === \"checkbox\" || metaMulti;\n}\n","// src/core/validate/steps/rates.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { isFiniteNumber, withAffected } from \"../shared\";\nimport { isMultiField } from \"@/utils\";\n\nexport function validateRates(v: ValidationCtx): void {\n for (const f of v.fields) {\n if (!isMultiField(f)) continue;\n\n const baseRates: Set<number> = new Set<number>();\n const contributingOptionIds: Set<string> = new Set<string>();\n\n for (const o of f.options ?? []) {\n const role: string = o.pricing_role ?? f.pricing_role ?? \"base\";\n if (role !== \"base\") continue;\n\n const sid: unknown = o.service_id;\n if (!isFiniteNumber(sid)) continue;\n\n const rate: unknown = (v.serviceMap as any)[sid]?.rate;\n if (isFiniteNumber(rate)) {\n baseRates.add(Number(rate));\n contributingOptionIds.add(o.id);\n }\n }\n\n if (baseRates.size > 1) {\n const affectedIds: string[] = [\n f.id,\n ...Array.from(contributingOptionIds),\n ];\n\n v.errors.push({\n code: \"rate_mismatch_across_base\",\n severity: \"error\",\n message: `Base options under field \"${f.id}\" resolve to different service rates.`,\n nodeId: f.id,\n details: withAffected(\n {\n fieldId: f.id,\n rates: Array.from(baseRates.values()),\n optionIds: Array.from(contributingOptionIds.values()),\n },\n affectedIds.length > 1 ? affectedIds : undefined,\n ),\n });\n }\n }\n}\n","// src/core/validate/steps/constraints.ts\nimport type { ValidationCtx } from \"../shared\";\nimport {\n isFiniteNumber,\n isServiceFlagEnabled,\n withAffected, // <-- your helper (adjust name/import if you named it differently)\n} from \"../shared\";\n\ntype ConstraintBag = Record<string, boolean | undefined>;\n\nfunction constraintKeysInChain(v: ValidationCtx, tagId: string): string[] {\n const keys: string[] = [];\n const seenKeys: Set<string> = new Set<string>();\n\n let cur: string | undefined = tagId;\n const seenTags: Set<string> = new Set<string>();\n\n while (cur && !seenTags.has(cur)) {\n seenTags.add(cur);\n\n const t = v.tagById.get(cur);\n const c: unknown = t?.constraints;\n\n if (c && typeof c === \"object\") {\n for (const k of Object.keys(c as any)) {\n if (!seenKeys.has(k)) {\n seenKeys.add(k);\n keys.push(k);\n }\n }\n }\n\n cur = t?.bind_id;\n }\n\n return keys;\n}\n\nfunction effectiveConstraints(v: ValidationCtx, tagId: string): ConstraintBag {\n const out: ConstraintBag = {};\n const keys: string[] = constraintKeysInChain(v, tagId);\n\n for (const key of keys) {\n let cur: string | undefined = tagId;\n const seen: Set<string> = new Set<string>();\n\n while (cur && !seen.has(cur)) {\n seen.add(cur);\n\n const t = v.tagById.get(cur);\n const val: unknown = (t?.constraints as any)?.[key];\n\n if (val === true || val === false) {\n out[key] = val;\n break;\n }\n\n cur = t?.bind_id;\n }\n }\n\n return out;\n}\n\nexport function validateConstraints(v: ValidationCtx): void {\n // Enforce tag constraints on visible options' services\n for (const t of v.tags) {\n const eff: ConstraintBag = effectiveConstraints(v, t.id);\n const hasAnyRequired: boolean = Object.values(eff).some(\n (x) => x === true,\n );\n if (!hasAnyRequired) continue;\n\n const visible = v.fieldsVisibleUnder(t.id);\n\n for (const f of visible) {\n for (const o of f.options ?? []) {\n if (!isFiniteNumber(o.service_id)) continue;\n\n const svc: unknown = (v.serviceMap as any)[o.service_id];\n if (!svc || typeof svc !== \"object\") continue;\n\n for (const [k, val] of Object.entries(eff)) {\n if (val === true && !isServiceFlagEnabled(svc as any, k)) {\n v.errors.push({\n code: \"unsupported_constraint\",\n severity: \"error\",\n message: `Service option \"${o.id}\" under tag \"${t.id}\" does not support required constraint \"${k}\".`,\n nodeId: t.id,\n details: withAffected(\n {\n flag: k,\n serviceId: o.service_id,\n fieldId: f.id,\n optionId: o.id,\n },\n [t.id, f.id, o.id],\n ),\n });\n }\n }\n }\n }\n }\n\n // Unsupported constraint vs tag's mapped service capabilities\n for (const t of v.tags) {\n const sid: unknown = t.service_id;\n if (!isFiniteNumber(sid)) continue;\n\n const svc: unknown = (v.serviceMap as any)[Number(sid)];\n if (!svc || typeof svc !== \"object\") continue;\n\n const eff: ConstraintBag = effectiveConstraints(v, t.id);\n\n for (const [k, val] of Object.entries(eff)) {\n if (val === true && !isServiceFlagEnabled(svc as any, k)) {\n v.errors.push({\n code: \"unsupported_constraint\",\n severity: \"error\",\n message: `Tag \"${t.id}\" maps to service \"${String(\n sid,\n )}\" which does not support required constraint \"${k}\".`,\n nodeId: t.id,\n details: { flag: k, serviceId: sid },\n });\n }\n }\n }\n\n // constraint_overridden diagnostics\n for (const t of v.tags) {\n const ov: unknown = t.constraints_overrides;\n if (!ov || typeof ov !== \"object\") continue;\n\n for (const k of Object.keys(ov as Record<string, unknown>)) {\n const row: any = (ov as any)[k];\n if (!row) continue;\n\n const from: boolean = row.from === true;\n const to: boolean = row.to === true;\n const origin: string = String(row.origin ?? \"\");\n\n v.errors.push({\n code: \"constraint_overridden\",\n severity: \"warning\",\n message: origin\n ? `Constraint \"${k}\" on tag \"${t.id}\" was overridden by ancestor \"${origin}\" (${String(from)} → ${String(\n to,\n )}).`\n : `Constraint \"${k}\" on tag \"${t.id}\" was overridden by an ancestor (${String(from)} → ${String(to)}).`,\n nodeId: t.id,\n details: withAffected(\n { flag: k, from, to, origin },\n origin ? [t.id, origin] : undefined,\n ),\n });\n }\n }\n}\n","// src/core/validate/steps/custom.ts\nimport type { ValidationCtx } from \"../shared\";\n\nexport function validateCustomFields(v: ValidationCtx): void {\n for (const f of v.fields) {\n if (f.type !== \"custom\") continue;\n\n if (!f.component || !String(f.component).trim()) {\n v.errors.push({\n code: \"custom_component_missing\",\n severity: \"error\",\n message: `Custom field \"${f.id}\" is missing a valid component reference.`,\n nodeId: f.id,\n });\n }\n }\n}\n","// src/core/validate/steps/global-utility-guard.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { isFiniteNumber } from \"../shared\";\n\nexport function validateGlobalUtilityGuard(v: ValidationCtx): void {\n if (!v.options.globalUtilityGuard) return;\n\n let hasUtility: boolean = false;\n let hasBase: boolean = false;\n\n for (const f of v.fields) {\n for (const o of f.options ?? []) {\n if (!isFiniteNumber(o.service_id)) continue;\n\n const role: string = o.pricing_role ?? f.pricing_role ?? \"base\";\n if (role === \"base\") hasBase = true;\n else if (role === \"utility\") hasUtility = true;\n\n if (hasUtility && hasBase) break;\n }\n\n if (hasUtility && hasBase) break;\n }\n\n if (hasUtility && !hasBase) {\n v.errors.push({\n code: \"utility_without_base\",\n severity: \"warning\",\n message:\n \"Global utility guard: utility-priced options exist but no base-priced options were found.\",\n nodeId: \"global\",\n details: { scope: \"global\" },\n });\n }\n}\n","// src/core/validate/steps/unbound.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { withAffected } from \"../shared\";\n\nexport function validateUnboundFields(v: ValidationCtx): void {\n const boundFieldIds: Set<string> = new Set<string>();\n\n for (const f of v.fields) {\n if (f.bind_id) boundFieldIds.add(f.id);\n }\n\n const includedByTag: Set<string> = new Set<string>();\n for (const t of v.tags) {\n for (const id of t.includes ?? []) includedByTag.add(id);\n }\n\n const includedByOption: Set<string> = new Set<string>();\n for (const arr of Object.values(v.props.includes_for_buttons ?? {})) {\n for (const id of arr ?? []) includedByOption.add(id);\n }\n\n for (const f of v.fields) {\n if (\n !boundFieldIds.has(f.id) &&\n !includedByTag.has(f.id) &&\n !includedByOption.has(f.id)\n ) {\n v.errors.push({\n code: \"field_unbound\",\n severity: \"error\",\n message: `Field \"${f.id}\" is unbound: it is not bound to any tag and not included by tags or option maps.`,\n nodeId: f.id,\n details: withAffected(\n {\n fieldId: f.id,\n bound: false,\n // exposing these helps editors explain \"why\"\n includedByTag: includedByTag.has(f.id),\n includedByOption: includedByOption.has(f.id),\n },\n [f.id],\n ),\n });\n }\n }\n}\n","// src/core/validate/steps/fallbacks.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { withAffected } from \"../shared\";\nimport { collectFailedFallbacks } from \"@/core\";\n\nfunction codeForReason(\n reason: string,\n):\n | \"fallback_unknown_service\"\n | \"fallback_no_primary\"\n | \"fallback_rate_violation\"\n | \"fallback_constraint_mismatch\"\n | \"fallback_cycle\"\n | \"fallback_bad_node\" {\n switch (reason) {\n case \"unknown_service\":\n return \"fallback_unknown_service\";\n case \"no_primary\":\n return \"fallback_no_primary\";\n case \"rate_violation\":\n return \"fallback_rate_violation\";\n case \"constraint_mismatch\":\n return \"fallback_constraint_mismatch\";\n case \"cycle\":\n return \"fallback_cycle\";\n default:\n return \"fallback_bad_node\";\n }\n}\n\nfunction messageFor(\n code:\n | \"fallback_unknown_service\"\n | \"fallback_no_primary\"\n | \"fallback_rate_violation\"\n | \"fallback_constraint_mismatch\"\n | \"fallback_cycle\"\n | \"fallback_bad_node\",\n d: {\n nodeId?: string;\n primary?: unknown;\n candidate?: unknown;\n tagContext?: unknown;\n scope?: unknown;\n },\n): string {\n const n = d.nodeId ? `node \"${String(d.nodeId)}\"` : \"node\";\n switch (code) {\n case \"fallback_unknown_service\":\n return `Fallback candidate \"${String(\n d.candidate,\n )}\" is unknown for ${n}.`;\n case \"fallback_no_primary\":\n return `Fallback rule has no primary service for ${n}.`;\n case \"fallback_rate_violation\":\n return `Fallback candidate \"${String(\n d.candidate,\n )}\" violates the base-rate rules for ${n}.`;\n case \"fallback_constraint_mismatch\":\n return `Fallback candidate \"${String(\n d.candidate,\n )}\" does not satisfy required constraints for ${n}.`;\n case \"fallback_cycle\":\n return `Fallback rules contain a cycle for ${n}.`;\n default:\n return `Fallback rule is invalid for ${n}.`;\n }\n}\n\nexport function validateFallbacks(v: ValidationCtx): void {\n const mode: string = v.options.fallbackSettings?.mode ?? \"strict\";\n if (!v.props.fallbacks) return;\n\n // collect non-fatal diagnostics first\n const diags = collectFailedFallbacks(v.props, v.options.serviceMap ?? {}, {\n ...v.options.fallbackSettings,\n mode: \"dev\",\n });\n\n if (mode !== \"strict\") return;\n\n for (const d of diags) {\n if (d.scope === \"global\") continue;\n\n const code = codeForReason(\n String((d as any).reason ?? \"fallback_bad_node\"),\n );\n\n const nodeId: string | undefined = (d as any).nodeId\n ? String((d as any).nodeId)\n : undefined;\n\n // Best-effort affected ids:\n // - Always include nodeId (if present)\n // - Include tagContext if it looks like a tag id (string)\n const tagContext: unknown = (d as any).tagContext;\n const affectedIds: string[] = [];\n if (nodeId) affectedIds.push(nodeId);\n if (\n typeof tagContext === \"string\" &&\n tagContext &&\n tagContext !== nodeId\n )\n affectedIds.push(tagContext);\n\n v.errors.push({\n code,\n severity: \"error\",\n message: messageFor(code, {\n nodeId,\n primary: (d as any).primary,\n candidate: (d as any).candidate,\n tagContext,\n scope: (d as any).scope,\n }),\n nodeId,\n details: withAffected(\n {\n primary: (d as any).primary,\n candidate: (d as any).candidate,\n tagContext,\n scope: (d as any).scope,\n },\n affectedIds.length > 1 ? affectedIds : undefined,\n ),\n });\n }\n}\n","// src/core/validate/policies/collect-service-items.ts\nimport type { ServiceProps, Tag, Field } from \"@/schema\";\nimport type {\n DgpServiceCapability,\n DgpServiceMap,\n IdType,\n} from \"@/schema/provider\";\nimport type { DynamicRule } from \"@/schema/validation\";\n\nimport { matchesWhere } from \"../shared\";\n\nexport type ServiceItem = Readonly<{\n /** Scope tag context (only meaningful for visible_group / tag-filtered global) */\n tagId?: string;\n\n /** Reference metadata (used for affectedIds + debugging) */\n fieldId?: string;\n optionId?: string;\n nodeId?: string;\n\n /** Canonical service id reference */\n serviceId: IdType;\n\n /** Pricing role context */\n role: \"base\" | \"utility\";\n\n /** Projection target (always present with at least { id }) */\n service: Record<string, unknown>;\n\n /** Aggregated affected ids (node/service refs that contributed to this item) */\n affectedIds: string[];\n}>;\n\ntype WhereClause = NonNullable<\n NonNullable<DynamicRule[\"filter\"]>[\"where\"]\n>[number];\n\ntype CollectMode = \"global\" | \"visible_group\";\n\nexport type CollectServiceItemsArgs = Readonly<{\n mode: CollectMode;\n\n props: ServiceProps;\n serviceMap: DgpServiceMap;\n\n /** For global: pass all tags, and usually props.fields */\n tags?: readonly Tag[];\n fields?: readonly Field[];\n\n /** For visible_group */\n tag?: Tag;\n tagId?: string;\n\n /** Host-defined filter surface */\n filter?: DynamicRule[\"filter\"];\n\n /**\n * visible_group fallbacks:\n * - include node-scoped fallbacks for these node ids (tag.id, option.id, etc.)\n */\n visibleNodeIds?: readonly string[];\n\n /**\n * visible_group fallbacks:\n * - include global fallbacks for these primary ids (services in the group)\n */\n visiblePrimaries?: readonly IdType[];\n}>;\n\nfunction asArray<T>(v: T | readonly T[] | undefined): readonly T[] | undefined {\n if (v === undefined) return undefined;\n return Array.isArray(v) ? v : [v as any];\n}\n\nfunction isServiceIdRef(v: unknown): v is IdType {\n return (\n typeof v === \"string\" || (typeof v === \"number\" && Number.isFinite(v))\n );\n}\n\nfunction svcSnapshot(\n serviceMap: DgpServiceMap,\n sid: IdType,\n): Record<string, unknown> {\n const svc: DgpServiceCapability | undefined = (serviceMap as any)[sid];\n if (!svc) return { id: sid };\n\n const meta: Record<string, unknown> =\n svc.meta && typeof svc.meta === \"object\" ? (svc.meta as any) : {};\n\n return {\n ...svc,\n id: sid,\n ...meta,\n } as unknown as Record<string, unknown>;\n}\n\nfunction pushItem(\n out: Map<string, ServiceItem>,\n next: Readonly<{\n tagId?: string;\n fieldId?: string;\n optionId?: string;\n nodeId?: string;\n serviceId: IdType;\n role: \"base\" | \"utility\";\n affectedIds: readonly string[];\n service: Record<string, unknown>;\n }>,\n): void {\n // dedupe by (serviceId, role) to preserve role semantics\n const key: string = `${String(next.serviceId)}|${next.role}`;\n\n const existing: ServiceItem | undefined = out.get(key);\n if (!existing) {\n out.set(key, {\n tagId: next.tagId,\n fieldId: next.fieldId,\n optionId: next.optionId,\n nodeId: next.nodeId,\n serviceId: next.serviceId,\n role: next.role,\n service: next.service,\n affectedIds: Array.from(new Set(next.affectedIds)),\n });\n return;\n }\n\n const mergedIds: string[] = Array.from(\n new Set<string>([...existing.affectedIds, ...next.affectedIds]),\n );\n\n // Prefer preserving an existing tagId if present; otherwise use new\n out.set(key, {\n ...existing,\n tagId: existing.tagId ?? next.tagId,\n affectedIds: mergedIds,\n });\n}\n\nfunction fieldRoleOf(\n f: Field,\n o?: { pricing_role?: string | undefined },\n): \"base\" | \"utility\" {\n const roleRaw: string | undefined =\n (o?.pricing_role as any) ?? (f.pricing_role as any) ?? \"base\";\n return roleRaw === \"utility\" ? \"utility\" : \"base\";\n}\n\nfunction applyFilterAllowLists(\n tagId: string | undefined,\n fieldId: string | undefined,\n filter: DynamicRule[\"filter\"] | undefined,\n): boolean {\n const tagAllow: readonly string[] | undefined = asArray(filter?.tag_id);\n const fieldAllow: readonly string[] | undefined = asArray(filter?.field_id);\n\n if (tagAllow) {\n if (!tagId) return false;\n if (!tagAllow.includes(tagId)) return false;\n }\n\n if (fieldAllow) {\n if (!fieldId) return false;\n if (!fieldAllow.includes(fieldId)) return false;\n }\n\n return true;\n}\n\nexport function collectServiceItems(\n args: CollectServiceItemsArgs,\n): ServiceItem[] {\n const filter: DynamicRule[\"filter\"] | undefined = args.filter;\n const roleFilter: NonNullable<DynamicRule[\"filter\"]>[\"role\"] =\n (filter?.role as any) ?? \"both\";\n const where: readonly WhereClause[] | undefined = filter?.where;\n\n const out: Map<string, ServiceItem> = new Map<string, ServiceItem>();\n\n const addServiceRef = (\n ref: Readonly<{\n tagId?: string;\n fieldId?: string;\n optionId?: string;\n nodeId?: string;\n\n serviceId: IdType;\n role: \"base\" | \"utility\";\n\n affectedIds: readonly string[];\n }>,\n ): void => {\n if (roleFilter !== \"both\" && ref.role !== roleFilter) return;\n if (!applyFilterAllowLists(ref.tagId, ref.fieldId, filter)) return;\n\n const svc: DgpServiceCapability | undefined = (args.serviceMap as any)[\n ref.serviceId\n ];\n\n // IMPORTANT (per your 1:A): unknown services are INCLUDED; where-filter only applies when svc exists.\n if (where && svc && !matchesWhere(svc as any, where)) return;\n\n pushItem(out, {\n ...ref,\n service: svcSnapshot(args.serviceMap, ref.serviceId),\n });\n };\n\n // ────────────────────────────────────────────────────────────────\n // 1) TAG SERVICES (tag.service_id)\n // ────────────────────────────────────────────────────────────────\n if (args.mode === \"global\") {\n for (const t of args.tags ?? []) {\n const sid: unknown = (t as any).service_id;\n if (!isServiceIdRef(sid)) continue;\n\n addServiceRef({\n tagId: t.id,\n serviceId: sid,\n role: \"base\",\n affectedIds: [`tag:${t.id}`, `service:${String(sid)}`],\n });\n }\n } else if (args.mode === \"visible_group\") {\n const t: Tag | undefined = args.tag;\n const sid: unknown = t ? (t as any).service_id : undefined;\n\n if (t && isServiceIdRef(sid)) {\n addServiceRef({\n tagId: t.id,\n serviceId: sid,\n role: \"base\",\n affectedIds: [`tag:${t.id}`, `service:${String(sid)}`],\n });\n }\n }\n\n // ────────────────────────────────────────────────────────────────\n // 2) FIELD SERVICES (field.service_id) + OPTION SERVICES\n // - fields can be button fields with service_id\n // - multi-field options can map to services\n // ────────────────────────────────────────────────────────────────\n const fields: readonly Field[] = args.fields ?? [];\n\n for (const f of fields) {\n // field.service_id (button field)\n const fSid: unknown = (f as any).service_id;\n if (isServiceIdRef(fSid)) {\n addServiceRef({\n tagId: args.tagId,\n fieldId: f.id,\n serviceId: fSid,\n role: \"base\",\n affectedIds: [`field:${f.id}`, `service:${String(fSid)}`],\n });\n }\n\n // option services\n for (const o of f.options ?? []) {\n const oSid: unknown = (o as any).service_id;\n if (!isServiceIdRef(oSid)) continue;\n\n const role: \"base\" | \"utility\" = fieldRoleOf(f, o);\n\n addServiceRef({\n tagId: args.tagId,\n fieldId: f.id,\n optionId: o.id,\n serviceId: oSid,\n role,\n affectedIds: [\n `field:${f.id}`,\n `option:${o.id}`,\n `service:${String(oSid)}`,\n ],\n });\n }\n }\n\n // ────────────────────────────────────────────────────────────────\n // 3) FALLBACK SERVICES (node + global)\n // Global: include ALL fallbacks everywhere\n // Visible group: include:\n // - nodes fallbacks for visibleNodeIds (tag + visible option ids)\n // - global fallbacks for visiblePrimaries (primary ids in group)\n // ────────────────────────────────────────────────────────────────\n const fb: ServiceProps[\"fallbacks\"] | undefined = args.props.fallbacks;\n if (!fb) return Array.from(out.values());\n\n const addFallbackNode = (nodeId: string, list: unknown): void => {\n const arr: readonly unknown[] = Array.isArray(list) ? list : [];\n for (const cand of arr) {\n if (!isServiceIdRef(cand)) continue;\n\n addServiceRef({\n tagId: args.tagId,\n nodeId,\n serviceId: cand,\n role: \"base\",\n affectedIds: [`fallback-node:${nodeId}`, `service:${String(cand)}`],\n });\n }\n };\n\n const addFallbackGlobal = (primaryKey: string, list: unknown): void => {\n const primaryId: IdType = primaryKey;\n\n addServiceRef({\n tagId: args.tagId,\n nodeId: primaryKey,\n serviceId: primaryId,\n role: \"base\",\n affectedIds: [\n `fallback-global-primary:${primaryKey}`,\n `service:${String(primaryId)}`,\n ],\n });\n\n const arr: readonly unknown[] = Array.isArray(list) ? list : [];\n for (const cand of arr) {\n if (!isServiceIdRef(cand)) continue;\n\n addServiceRef({\n tagId: args.tagId,\n nodeId: primaryKey,\n serviceId: cand,\n role: \"base\",\n affectedIds: [\n `fallback-global:${primaryKey}`,\n `service:${String(cand)}`,\n ],\n });\n }\n };\n\n const includeAllFallbacks: boolean = args.mode === \"global\";\n const includeGroupFallbacks: boolean = args.mode === \"visible_group\";\n\n // node-scoped fallbacks\n const nodes: Record<string, IdType[] | undefined> | undefined =\n fb.nodes && typeof fb.nodes === \"object\"\n ? (fb.nodes as any)\n : undefined;\n\n if (nodes) {\n if (includeAllFallbacks) {\n for (const [nodeId, list] of Object.entries(nodes)) {\n addFallbackNode(nodeId, list);\n }\n } else if (includeGroupFallbacks) {\n const allowNodes: Set<string> = new Set<string>(\n Array.isArray(args.visibleNodeIds)\n ? (args.visibleNodeIds as string[])\n : [],\n );\n\n for (const nodeId of allowNodes) {\n addFallbackNode(nodeId, (nodes as any)[nodeId]);\n }\n }\n }\n\n // global fallbacks: primary -> candidates\n const globalFb: Record<string, IdType[] | undefined> | undefined =\n fb.global && typeof fb.global === \"object\"\n ? (fb.global as any)\n : undefined;\n\n if (globalFb) {\n if (includeAllFallbacks) {\n for (const [primaryKey, list] of Object.entries(globalFb)) {\n addFallbackGlobal(primaryKey, list);\n }\n } else if (includeGroupFallbacks) {\n const allowPrimaries: Set<string> = new Set<string>(\n (args.visiblePrimaries ?? []).map((x) => String(x)),\n );\n\n for (const primaryKey of allowPrimaries) {\n const list: unknown = (globalFb as any)[primaryKey];\n if (list === undefined) continue;\n addFallbackGlobal(primaryKey, list);\n }\n }\n }\n\n return Array.from(out.values());\n}\n","// src/core/validate/policies/ops.ts\nimport type { DynamicRule } from \"@/schema/validation\";\n\nexport function evalPolicyOp(\n op: DynamicRule[\"op\"],\n values: unknown[],\n rule: DynamicRule,\n): boolean {\n switch (op) {\n case \"all_equal\": {\n const set: Set<string> = new Set<string>(\n values.map((v) => JSON.stringify(v)),\n );\n return set.size <= 1;\n }\n case \"no_mix\": {\n const set: Set<string> = new Set<string>(\n values.map((v) => JSON.stringify(v)),\n );\n return set.size <= 1;\n }\n case \"unique\": {\n const seen: Set<string> = new Set<string>();\n for (const v of values) {\n const k: string = JSON.stringify(v);\n if (seen.has(k)) return false;\n seen.add(k);\n }\n return true;\n }\n case \"all_true\": {\n return values.every((v) => v === true);\n }\n case \"any_true\": {\n return values.some((v) => v === true);\n }\n case \"max_count\": {\n const limit: number =\n typeof rule.value === \"number\" ? rule.value : Infinity;\n return values.length <= limit;\n }\n case \"min_count\": {\n const min: number = typeof rule.value === \"number\" ? rule.value : 0;\n return values.length >= min;\n }\n default:\n return true;\n }\n}\n","// src/core/validate/policies/apply-policies.ts\nimport type { ServiceProps, Tag, Field } from \"@/schema\";\nimport type { DgpServiceMap, IdType } from \"@/schema/provider\";\nimport type { DynamicRule, ValidationError } from \"@/schema/validation\";\n\nimport { getByPath } from \"../shared\";\nimport { collectServiceItems, type ServiceItem } from \"./collect-service-items\";\nimport { evalPolicyOp } from \"./ops\";\n\nfunction uniq<T>(arr: readonly T[]): T[] {\n return Array.from(new Set<T>(arr));\n}\n\nfunction stableSeverity(\n s: DynamicRule[\"severity\"] | undefined,\n): \"error\" | \"warning\" | \"info\" {\n if (s === \"warning\") return \"warning\";\n if (s === \"error\") return \"error\";\n return \"error\";\n}\n\nfunction defaultPolicyMessage(rule: DynamicRule): string {\n if (typeof rule.message === \"string\" && rule.message.trim())\n return rule.message;\n if (typeof rule.label === \"string\" && rule.label.trim())\n return rule.label.trim();\n return `Policy \"${rule.id}\" violated`;\n}\n\nfunction affectedFromItems(items: readonly ServiceItem[]): string[] {\n const ids: string[] = [];\n for (const it of items) {\n for (const x of it.affectedIds ?? []) ids.push(x);\n ids.push(`service:${String(it.serviceId)}`);\n }\n return uniq(ids);\n}\n\nfunction visibleGroupNodeIds(tag: Tag, fields: readonly Field[]): string[] {\n const ids: string[] = [tag.id];\n\n for (const f of fields) {\n for (const o of f.options ?? []) {\n ids.push(o.id);\n }\n }\n\n return uniq(ids);\n}\n\nfunction visibleGroupPrimaries(tag: Tag, fields: readonly Field[]): IdType[] {\n const prim: IdType[] = [];\n\n const tagSid: unknown = (tag as any).service_id;\n if (\n typeof tagSid === \"string\" ||\n (typeof tagSid === \"number\" && Number.isFinite(tagSid))\n ) {\n prim.push(tagSid);\n }\n\n for (const f of fields) {\n const fsid: unknown = (f as any).service_id;\n if (\n typeof fsid === \"string\" ||\n (typeof fsid === \"number\" && Number.isFinite(fsid))\n ) {\n prim.push(fsid);\n }\n\n for (const o of f.options ?? []) {\n const osid: unknown = (o as any).service_id;\n if (\n typeof osid === \"string\" ||\n (typeof osid === \"number\" && Number.isFinite(osid))\n ) {\n prim.push(osid);\n }\n }\n }\n\n return uniq(prim);\n}\n\nexport function applyPolicies(\n errors: ValidationError[],\n props: ServiceProps,\n serviceMap: DgpServiceMap,\n policies: DynamicRule[] | undefined,\n fieldsVisibleUnder: (tagId: string) => Field[],\n tags: Tag[],\n): void {\n if (!policies?.length) return;\n\n const tagById: Map<string, Tag> = new Map<string, Tag>();\n for (const t of tags) tagById.set(t.id, t);\n\n for (const rule of policies) {\n const projPath: string = rule.projection ?? \"service.id\";\n const severity: \"error\" | \"warning\" | \"info\" = stableSeverity(\n rule.severity,\n );\n const message: string = defaultPolicyMessage(rule);\n\n // ────────────────────────────────────────────────────────────────\n // GLOBAL: \"all services - everywhere, anywhere\"\n // - includes tags, fields (field.service_id + option.service_id), fallbacks (nodes + global)\n // - if rule.filter.tag_id is present, global becomes \"union of those visible groups\"\n // (still strict within the selected universe)\n // ────────────────────────────────────────────────────────────────\n if (rule.scope === \"global\") {\n const tagAllow: readonly string[] | undefined = Array.isArray(\n rule.filter?.tag_id,\n )\n ? (rule.filter?.tag_id as string[])\n : rule.filter?.tag_id\n ? [rule.filter.tag_id as string]\n : undefined;\n\n let items: ServiceItem[] = [];\n\n if (tagAllow && tagAllow.length) {\n // Union of selected visible-groups (including tag itself + group fallbacks)\n const merged: Map<string, ServiceItem> = new Map<\n string,\n ServiceItem\n >();\n\n for (const id of tagAllow) {\n const t: Tag | undefined = tagById.get(id);\n if (!t) continue;\n\n const visibleFields: Field[] = fieldsVisibleUnder(t.id);\n const nodeIds: string[] = visibleGroupNodeIds(\n t,\n visibleFields,\n );\n const primaries: IdType[] = visibleGroupPrimaries(\n t,\n visibleFields,\n );\n\n const sub: ServiceItem[] = collectServiceItems({\n mode: \"visible_group\",\n props,\n serviceMap,\n tag: t,\n tagId: t.id,\n fields: visibleFields,\n filter: rule.filter,\n visibleNodeIds: nodeIds,\n visiblePrimaries: primaries,\n });\n\n for (const it of sub) {\n const k: string = `${String(it.serviceId)}|${it.role}`;\n const existing: ServiceItem | undefined = merged.get(k);\n if (!existing) {\n merged.set(k, it);\n } else {\n merged.set(k, {\n ...existing,\n affectedIds: uniq([\n ...existing.affectedIds,\n ...it.affectedIds,\n ]),\n });\n }\n }\n }\n\n items = Array.from(merged.values());\n } else {\n // Truly everything, anywhere:\n const allFields: Field[] = props.fields ?? [];\n\n items = collectServiceItems({\n mode: \"global\",\n props,\n serviceMap,\n tags,\n fields: allFields,\n filter: rule.filter,\n });\n }\n\n const values: unknown[] = items.map((it) =>\n getByPath(it as any, projPath),\n );\n\n if (!evalPolicyOp(rule.op, values, rule)) {\n errors.push({\n code: \"policy_violation\",\n severity,\n message,\n nodeId: \"global\",\n details: {\n ruleId: rule.id,\n scope: \"global\",\n op: rule.op,\n projection: projPath,\n count: items.length,\n affectedIds: affectedFromItems(items),\n },\n });\n }\n\n continue;\n }\n\n // ────────────────────────────────────────────────────────────────\n // VISIBLE GROUP: \"all current visible nodes under tagId including the tag\"\n // + include node-scoped fallbacks for the tag + visible option ids\n // + include global fallbacks for primaries present in that group\n // ────────────────────────────────────────────────────────────────\n for (const t of tags) {\n const visibleFields: Field[] = fieldsVisibleUnder(t.id);\n\n const nodeIds: string[] = visibleGroupNodeIds(t, visibleFields);\n const primaries: IdType[] = visibleGroupPrimaries(t, visibleFields);\n\n const items: ServiceItem[] = collectServiceItems({\n mode: \"visible_group\",\n props,\n serviceMap,\n tag: t,\n tagId: t.id,\n fields: visibleFields,\n filter: rule.filter,\n visibleNodeIds: nodeIds,\n visiblePrimaries: primaries,\n });\n\n if (!items.length) continue;\n\n const values: unknown[] = items.map((it) =>\n getByPath(it as any, projPath),\n );\n\n if (!evalPolicyOp(rule.op, values, rule)) {\n errors.push({\n code: \"policy_violation\",\n severity,\n message,\n nodeId: t.id,\n details: {\n ruleId: rule.id,\n scope: \"visible_group\",\n op: rule.op,\n projection: projPath,\n count: items.length,\n affectedIds: affectedFromItems(items),\n },\n });\n }\n }\n }\n}\n","// src/core/validate/index.ts\nimport type { ServiceProps, Tag, Field } from \"@/schema\";\nimport type { DgpServiceMap } from \"@/schema/provider\";\nimport type { ValidationError, ValidatorOptions } from \"@/schema/validation\";\n\nimport {\n createFieldsVisibleUnder,\n validateVisibility,\n} from \"./steps/visibility\";\nimport { validateStructure } from \"./steps/structure\";\nimport { validateIdentity } from \"./steps/identity\";\nimport { validateOptionMaps } from \"./steps/option-maps\";\nimport { validateServiceVsUserInput } from \"./steps/service-vs-input\";\nimport { validateUtilityMarkers } from \"./steps/utility\";\nimport { validateRates } from \"./steps/rates\";\nimport { validateConstraints } from \"./steps/constraints\";\nimport { validateCustomFields } from \"./steps/custom\";\nimport { validateGlobalUtilityGuard } from \"./steps/global-utility-guard\";\nimport { validateUnboundFields } from \"./steps/unbound\";\nimport { validateFallbacks } from \"./steps/fallbacks\";\n\nimport { applyPolicies } from \"./policies/apply-policies\";\nimport type { ValidationCtx } from \"./shared\";\n\nexport function validate(\n props: ServiceProps,\n ctx: ValidatorOptions = {},\n): ValidationError[] {\n const errors: ValidationError[] = [];\n const serviceMap: DgpServiceMap = ctx.serviceMap ?? {};\n const selectedKeys: Set<string> = new Set<string>(\n ctx.selectedOptionKeys ?? [],\n );\n\n const tags: Tag[] = Array.isArray(props.filters) ? props.filters : [];\n const fields: Field[] = Array.isArray(props.fields) ? props.fields : [];\n\n const tagById: Map<string, Tag> = new Map<string, Tag>();\n const fieldById: Map<string, Field> = new Map<string, Field>();\n\n for (const t of tags) tagById.set(t.id, t);\n for (const f of fields) fieldById.set(f.id, f);\n\n const v: ValidationCtx = {\n props,\n options: ctx,\n errors,\n serviceMap,\n selectedKeys,\n tags,\n fields,\n tagById,\n fieldById,\n fieldsVisibleUnder: (_tagId: string): Field[] => [],\n };\n\n // 1) structure\n validateStructure(v);\n\n // 2) identity + labels\n validateIdentity(v);\n\n // 3) option maps\n validateOptionMaps(v);\n\n // 4) visibility helpers + visibility rules\n v.fieldsVisibleUnder = createFieldsVisibleUnder(v);\n validateVisibility(v);\n\n // --------- Dynamic policies (super-admin) --------------------------\n applyPolicies(\n v.errors,\n v.props,\n v.serviceMap,\n v.options.policies,\n v.fieldsVisibleUnder,\n v.tags,\n );\n\n // 5) service vs user-input rules\n validateServiceVsUserInput(v);\n\n // 6) utility marker rules\n validateUtilityMarkers(v);\n\n // 7) rates & pricing roles\n validateRates(v);\n\n // 8) constraints vs capabilities + inheritance\n validateConstraints(v);\n\n // 9) custom field rules\n validateCustomFields(v);\n\n // 10) optional global utility guard\n validateGlobalUtilityGuard(v);\n\n // 11) unbound fields\n validateUnboundFields(v);\n\n // 12) fallbacks strict-mode conversion\n validateFallbacks(v);\n\n return v.errors;\n}\n","// src/core/builder.ts\nimport { normalise } from \"./normalise\";\nimport { validate } from \"./validate\";\n\nimport type {\n DgpServiceMap,\n EdgeKind,\n Field,\n GraphEdge,\n GraphNode,\n GraphSnapshot,\n NodeKind,\n ServiceProps,\n Tag,\n ValidationError,\n ValidatorOptions\n} from \"@/schema\";\n\n/** Options you can set on the builder (used for validation/visibility) */\nexport type BuilderOptions = Omit<ValidatorOptions, \"serviceMap\"> & {\n serviceMap?: DgpServiceMap;\n /** max history entries for undo/redo */\n historyLimit?: number;\n /**\n * Field ids whose options should be shown as nodes in the graph.\n * If a field id is NOT in this set, its options are not materialized as nodes:\n * - include/exclude wires keyed by an option id will be drawn from the FIELD instead.\n */\n showOptionNodes?: Set<string> | string[];\n};\n\nexport interface Builder {\n /** Replace current payload (injects root if missing, rebuilds indexes) */\n load(props: ServiceProps): void;\n\n /** Graph for visualisation */\n tree(): GraphSnapshot;\n\n /** Deterministic save payload (drops unbound utility fields, prunes dead maps) */\n cleanedProps(): ServiceProps;\n\n /** Validation errors for current state */\n errors(): ValidationError[];\n\n /**\n * Compute IDs of fields visible under a tag.\n * If selectedOptionKeys provided, applies option-level include/exclude.\n * NOTE: keys are “button ids”: either option.id or field.id for option-less buttons.\n */\n visibleFields(tagId: string, selectedOptionKeys?: string[]): string[];\n\n /** Update builder options (validator context etc.) */\n setOptions(patch: Partial<BuilderOptions>): void;\n\n /** History */\n undo(): boolean;\n redo(): boolean;\n\n /** Access the current props (already normalised) */\n getProps(): ServiceProps;\n\n /** Service map for validation/rules */\n getServiceMap(): DgpServiceMap;\n\n getConstraints(): {\n id: string;\n label: string;\n description: string;\n value: string;\n }[];\n}\n\nexport function createBuilder(opts: BuilderOptions = {}): Builder {\n return new BuilderImpl(opts);\n}\n\n/* ────────────────────────────────────────────────────────────────────────── */\n\nclass BuilderImpl implements Builder {\n private props: ServiceProps = {\n filters: [],\n fields: [],\n schema_version: \"1.0\",\n };\n private tagById = new Map<string, Tag>();\n private fieldById = new Map<string, Field>();\n private optionOwnerById = new Map<string, { fieldId: string }>(); // option.id → fieldId\n\n private options: BuilderOptions;\n private readonly history: ServiceProps[] = [];\n private readonly future: ServiceProps[] = [];\n private readonly historyLimit: number;\n\n constructor(opts: BuilderOptions = {}) {\n this.options = { ...opts };\n this.historyLimit = opts.historyLimit ?? 50;\n }\n\n /* ───── lifecycle ─────────────────────────────────────────────────────── */\n\n load(raw: ServiceProps): void {\n const next = normalise(raw, {\n defaultPricingRole: \"base\",\n constraints: this.getConstraints().map((item) => item.label),\n });\n this.pushHistory(this.props);\n this.future.length = 0; // clear redo stack\n this.props = next;\n this.rebuildIndexes();\n }\n\n getProps(): ServiceProps {\n return this.props;\n }\n\n setOptions(patch: Partial<BuilderOptions>): void {\n this.options = { ...this.options, ...patch };\n }\n\n getServiceMap(): DgpServiceMap {\n return this.options.serviceMap ?? {};\n }\n\n getConstraints() {\n const serviceMap = this.getServiceMap();\n\n const out = new Set<{\n label: string;\n id: string;\n value: string;\n description: string;\n }>();\n const guard = new Set<string>();\n\n for (const svc of Object.values(serviceMap)) {\n const flags = svc.flags ?? {};\n for (const flagId of Object.keys(flags)) {\n if (guard.has(flagId)) continue;\n guard.add(flagId);\n out.add({\n id: flagId,\n value: flagId,\n label: flagId,\n description: flags[flagId].description,\n });\n }\n }\n\n // if you want deterministic ordering in UI:\n return Array.from(out);\n }\n\n /* ───── querying ─────────────────────────────────────────────────────── */\n\n tree(): GraphSnapshot {\n const nodes: GraphNode[] = [];\n const edges: GraphEdge[] = [];\n\n const showSet = toStringSet(this.options.showOptionNodes);\n\n // 1) tags as nodes\n for (const t of this.props.filters) {\n nodes.push({ id: t.id, kind: \"tag\" as NodeKind, label: t.label });\n }\n\n // 2) tag hierarchy edges\n for (const t of this.props.filters) {\n if (t.bind_id) {\n edges.push({\n from: t.bind_id,\n to: t.id,\n kind: \"child\" as EdgeKind,\n });\n }\n }\n\n // 3) fields as nodes\n for (const f of this.props.fields) {\n nodes.push({\n id: f.id,\n kind: \"field\" as NodeKind,\n label: f.label,\n bind_type:\n f.pricing_role === \"utility\"\n ? \"utility\"\n : f.bind_id\n ? \"bound\"\n : null,\n });\n }\n\n // 4) field bind edges\n for (const f of this.props.fields) {\n const b = f.bind_id;\n if (Array.isArray(b)) {\n for (const tagId of b)\n edges.push({\n from: tagId,\n to: f.id,\n kind: \"bind\" as EdgeKind,\n });\n } else if (typeof b === \"string\") {\n edges.push({ from: b, to: f.id, kind: \"bind\" as EdgeKind });\n }\n }\n\n // 5) Option nodes (only for fields in showOptionNodes)\n for (const f of this.props.fields) {\n const showOptions = showSet.has(f.id);\n if (!showOptions) continue;\n if (!Array.isArray(f.options)) continue;\n\n for (const o of f.options) {\n nodes.push({\n id: o.id,\n kind: \"option\",\n label: o.label,\n });\n // field → option edge\n const e: any = {\n from: f.id,\n to: o.id,\n kind: \"option\" as EdgeKind,\n meta: { ownerField: f.id },\n };\n edges.push(e as GraphEdge);\n }\n }\n\n // 6) tag includes/excludes\n for (const t of this.props.filters) {\n for (const id of t.includes ?? []) {\n edges.push({ from: t.id, to: id, kind: \"include\" as EdgeKind });\n }\n for (const id of t.excludes ?? []) {\n edges.push({ from: t.id, to: id, kind: \"exclude\" as EdgeKind });\n }\n }\n\n // 7) button-level includes/excludes (keys are button IDs: option.id OR field.id)\n const incMap = this.props.includes_for_buttons ?? {};\n const excMap = this.props.excludes_for_buttons ?? {};\n\n const pushButtonEdge = (\n keyId: string,\n targetFieldId: string,\n kind: EdgeKind,\n ) => {\n const owner = this.optionOwnerById.get(keyId);\n const ownerFieldId =\n owner?.fieldId ??\n (this.fieldById.has(keyId) ? keyId : undefined);\n if (!ownerFieldId) return; // dangling key, ignore\n\n // If the key is an option AND its field is being shown, draw from the option\n const fromNode =\n owner && showSet.has(owner.fieldId)\n ? keyId // option node → visible, draw from option\n : ownerFieldId; // else draw from the field\n\n const meta: any = owner\n ? showSet.has(owner.fieldId)\n ? {\n via: \"option-visible\",\n ownerField: owner.fieldId,\n sourceOption: keyId,\n }\n : {\n via: \"option-hidden\",\n ownerField: owner.fieldId,\n sourceOption: keyId,\n }\n : { via: \"field-button\" };\n\n const e: any = { from: fromNode, to: targetFieldId, kind, meta };\n edges.push(e as GraphEdge);\n };\n\n for (const [keyId, arr] of Object.entries(incMap)) {\n for (const fid of arr ?? [])\n pushButtonEdge(keyId, fid, \"include\" as EdgeKind);\n }\n for (const [keyId, arr] of Object.entries(excMap)) {\n for (const fid of arr ?? [])\n pushButtonEdge(keyId, fid, \"exclude\" as EdgeKind);\n }\n\n return { nodes, edges };\n }\n\n cleanedProps(): ServiceProps {\n // Build quick indexes\n const fieldIds = new Set(this.props.fields.map((f) => f.id));\n const optionIds = new Set<string>();\n this.optionOwnerById.forEach((_v, oid) => optionIds.add(oid));\n\n // 1) drop utility fields that are truly \"orphaned\"\n // (unbound + not included by tag or button includes + not referenced as a key)\n const includedByTag = new Set<string>();\n const excludedAnywhere = new Set<string>();\n for (const t of this.props.filters) {\n for (const id of t.includes ?? []) includedByTag.add(id);\n for (const id of t.excludes ?? []) excludedAnywhere.add(id);\n }\n\n const incMap = this.props.includes_for_buttons ?? {};\n const excMap = this.props.excludes_for_buttons ?? {};\n const includedByButtons = new Set<string>(); // field ids that might be pulled in\n const referencedKeys = new Set<string>(); // keys in maps (field button or option id)\n const referencedOwnerFields = new Set<string>();\n\n for (const [key, arr] of Object.entries(incMap)) {\n referencedKeys.add(key);\n const owner = this.optionOwnerById.get(key);\n if (owner) referencedOwnerFields.add(owner.fieldId);\n for (const fid of arr ?? []) {\n includedByButtons.add(fid);\n }\n }\n for (const [key, arr] of Object.entries(excMap)) {\n referencedKeys.add(key);\n const owner = this.optionOwnerById.get(key);\n if (owner) referencedOwnerFields.add(owner.fieldId);\n for (const fid of arr ?? []) {\n // exclusion targets don’t “include”, but record that these field ids are referenced\n // (so we don’t accidentally drop something host intentionally excludes/controls)\n // not strictly necessary, but conservative:\n void fid;\n }\n }\n\n const boundIds = new Set<string>();\n for (const f of this.props.fields) {\n const b = f.bind_id;\n if (Array.isArray(b)) b.forEach((id) => boundIds.add(id));\n else if (typeof b === \"string\") boundIds.add(b);\n }\n\n const fields = this.props.fields.filter((f) => {\n const isUtility = (f.pricing_role ?? \"base\") === \"utility\";\n if (!isUtility) return true;\n\n const bound = !!f.bind_id;\n const included =\n includedByTag.has(f.id) || includedByButtons.has(f.id);\n const referenced =\n referencedOwnerFields.has(f.id) || referencedKeys.has(f.id);\n const excluded = excludedAnywhere.has(f.id);\n\n // keep if bound OR included OR referenced by maps; drop if truly orphaned or globally excluded\n return bound || included || referenced || !excluded;\n });\n\n // 2) prune button maps: keep only valid keys and existing field targets\n const allowedTargets = new Set(fields.map((f) => f.id)); // targets must be existing fields\n\n const pruneButtons = (src?: Record<string, string[]>) => {\n if (!src) return undefined;\n const out: Record<string, string[]> = {};\n for (const [key, arr] of Object.entries(src)) {\n // key must be an existing option.id OR field.id\n const keyIsValid = optionIds.has(key) || fieldIds.has(key);\n if (!keyIsValid) continue;\n\n const cleaned = (arr ?? []).filter((fid) =>\n allowedTargets.has(fid),\n );\n if (cleaned.length) out[key] = Array.from(new Set(cleaned));\n }\n return Object.keys(out).length ? out : undefined;\n };\n\n const includes_for_buttons = pruneButtons(\n this.props.includes_for_buttons,\n );\n const excludes_for_buttons = pruneButtons(\n this.props.excludes_for_buttons,\n );\n\n // 3) return canonical object\n const out: ServiceProps = {\n filters: this.props.filters.slice(),\n fields,\n ...(includes_for_buttons && { includes_for_buttons }),\n ...(excludes_for_buttons && { excludes_for_buttons }),\n schema_version: this.props.schema_version ?? \"1.0\",\n // keep fallbacks & other maps as-is\n ...(this.props.fallbacks\n ? { fallbacks: this.props.fallbacks }\n : {}),\n };\n return out;\n }\n\n errors(): ValidationError[] {\n return validate(this.props, this.options);\n }\n\n visibleFields(tagId: string, selectedKeys?: string[]): string[] {\n const props = this.props;\n const tags = props.filters ?? [];\n const fields = props.fields ?? [];\n\n const tagById = new Map(tags.map((t) => [t.id, t]));\n const tag = tagById.get(tagId);\n if (!tag) return [];\n\n // ---- lineage with depth: self=0, parent=1, grandparent=2 ...\n const lineageDepth = new Map<string, number>();\n {\n const guard = new Set<string>();\n let cur: Tag | undefined = tag;\n let d = 0;\n while (cur && !guard.has(cur.id)) {\n lineageDepth.set(cur.id, d++);\n guard.add(cur.id);\n const parentId: string | undefined = cur.bind_id;\n cur = parentId ? tagById.get(parentId) : undefined;\n }\n }\n\n const isTagInLineage = (id: string) => lineageDepth.has(id);\n\n const fieldById = new Map(fields.map((f) => [f.id, f]));\n\n // Build optionId -> owner field (so we can infer what tag group the option belongs to)\n const optionOwnerFieldId = new Map<string, string>();\n for (const f of fields) {\n for (const o of f.options ?? []) optionOwnerFieldId.set(o.id, f.id);\n }\n\n const ownerDepthForField = (f: Field): number | undefined => {\n const b = f.bind_id;\n if (!b) return undefined;\n\n if (typeof b === \"string\") return lineageDepth.get(b);\n\n // if multiple binds, take closest in the lineage\n let best: number | undefined = undefined;\n for (const id of b) {\n const d = lineageDepth.get(id);\n if (d == null) continue;\n if (best == null || d < best) best = d;\n }\n return best;\n };\n\n const ownerDepthForTrigger = (\n triggerId: string,\n ): number | undefined => {\n // option trigger -> use owner field bind(s)\n if (triggerId.startsWith(\"o:\")) {\n const fid = optionOwnerFieldId.get(triggerId);\n if (!fid) return undefined;\n const f = fieldById.get(fid);\n if (!f) return undefined;\n return ownerDepthForField(f);\n }\n\n // field trigger (button field id) -> use field bind(s)\n const f = fieldById.get(triggerId);\n if (!f || f.button !== true) return undefined;\n return ownerDepthForField(f);\n };\n\n // ---- current tag includes/excludes (NOT inherited)\n const tagInclude = new Set(tag.includes ?? []);\n const tagExclude = new Set(tag.excludes ?? []);\n\n // ---- selection triggers (buttons + options)\n const selected = new Set(\n selectedKeys ?? this.options.selectedOptionKeys ?? [],\n );\n const incMap = props.includes_for_buttons ?? {};\n const excMap = props.excludes_for_buttons ?? {};\n\n // We only apply triggers that belong to (self ∪ ancestors), so their effects inherit down.\n // Also keep reveal order (determinism) but only among relevant triggers.\n const relevantTriggersInOrder: string[] = [];\n for (const key of selected) {\n const d = ownerDepthForTrigger(key);\n if (d == null) continue; // cannot place it in a tag group => ignore\n // d exists means it belongs to lineage => inherited down\n relevantTriggersInOrder.push(key);\n }\n\n // ---- base candidates: bound fields inherited + current tag includes\n const visible = new Set<string>();\n const isBoundToLineage = (f: Field): boolean => {\n const b = f.bind_id;\n if (!b) return false;\n if (typeof b === \"string\") return isTagInLineage(b);\n for (const id of b) if (isTagInLineage(id)) return true;\n return false;\n };\n\n for (const f of fields) {\n if (isBoundToLineage(f)) visible.add(f.id);\n if (tagInclude.has(f.id)) visible.add(f.id);\n }\n\n // apply current tag excludes (tag-level only)\n for (const id of tagExclude) visible.delete(id);\n\n // ---- button decisions with precedence:\n // closest depth wins; if same depth and conflict => exclude wins\n type ButtonDecision = { depth: number; kind: \"include\" | \"exclude\" };\n const decide = new Map<string, ButtonDecision>();\n\n const applyDecision = (fieldId: string, next: ButtonDecision) => {\n const prev = decide.get(fieldId);\n if (!prev) {\n decide.set(fieldId, next);\n return;\n }\n // closer (smaller depth) overrides farther\n if (next.depth < prev.depth) {\n decide.set(fieldId, next);\n return;\n }\n if (next.depth > prev.depth) return;\n\n // same depth: exclude wins\n if (prev.kind === \"include\" && next.kind === \"exclude\") {\n decide.set(fieldId, next);\n }\n };\n\n // also track reveal order (first time a field is included by buttons, at the best known depth)\n const revealedOrder: string[] = [];\n const revealedSeen = new Set<string>();\n\n for (const triggerId of relevantTriggersInOrder) {\n const depth = ownerDepthForTrigger(triggerId);\n if (depth == null) continue;\n\n for (const id of incMap[triggerId] ?? []) {\n applyDecision(id, { depth, kind: \"include\" });\n\n // determinism: record reveal attempt in trigger order (not final visibility)\n if (!revealedSeen.has(id)) {\n revealedSeen.add(id);\n revealedOrder.push(id);\n }\n }\n\n for (const id of excMap[triggerId] ?? []) {\n applyDecision(id, { depth, kind: \"exclude\" });\n }\n }\n\n // apply button decisions (buttons override tag state)\n for (const [fid, d] of decide) {\n if (d.kind === \"include\") visible.add(fid);\n else visible.delete(fid);\n }\n\n // ---- natural visible ids (props.fields order)\n const base = fields.filter((f) => visible.has(f.id)).map((f) => f.id);\n\n // ---- order_for_tags: pin-first ordering (ordering-only; never adds invisible)\n const order = props.order_for_tags?.[tagId];\n if (order && order.length) {\n const ordered = order.filter((fid) => visible.has(fid));\n const orderedSet = new Set(ordered);\n const rest = base.filter((fid) => !orderedSet.has(fid));\n return [...ordered, ...rest];\n }\n\n // no explicit order: revealed-first (but only final-visible)\n const promoted = revealedOrder.filter((fid) => visible.has(fid));\n const promotedSet = new Set(promoted);\n const rest = base.filter((fid) => !promotedSet.has(fid));\n return [...promoted, ...rest];\n }\n\n /* ───── history ─────────────────────────────────────────────────────── */\n\n undo(): boolean {\n if (this.history.length === 0) return false;\n const prev = this.history.pop()!;\n this.future.push(structuredCloneSafe(this.props));\n this.props = prev;\n this.rebuildIndexes();\n return true;\n }\n\n redo(): boolean {\n if (this.future.length === 0) return false;\n const next = this.future.pop()!;\n this.pushHistory(this.props);\n this.props = next;\n this.rebuildIndexes();\n return true;\n }\n\n /* ───── internals ──────────────────────────────────────────────────── */\n\n private rebuildIndexes(): void {\n this.tagById.clear();\n this.fieldById.clear();\n this.optionOwnerById.clear();\n\n for (const t of this.props.filters) this.tagById.set(t.id, t);\n for (const f of this.props.fields) {\n this.fieldById.set(f.id, f);\n if (Array.isArray(f.options)) {\n for (const o of f.options)\n this.optionOwnerById.set(o.id, { fieldId: f.id });\n }\n }\n }\n\n private pushHistory(state: ServiceProps): void {\n // avoid pushing initial empty state on the very first load\n if (!state || (!state.filters.length && !state.fields.length)) return;\n this.history.push(structuredCloneSafe(state));\n if (this.history.length > this.historyLimit) this.history.shift();\n }\n}\n\n/* ───────────────────────── helpers ───────────────────────── */\nfunction structuredCloneSafe<T>(v: T): T {\n if (typeof (globalThis as any).structuredClone === \"function\") {\n return (globalThis as any).structuredClone(v);\n }\n return JSON.parse(JSON.stringify(v));\n}\n\nfunction toStringSet(v: Set<string> | string[] | undefined): Set<string> {\n if (!v) return new Set();\n if (v instanceof Set) return new Set(Array.from(v).map(String));\n return new Set((v as string[]).map(String));\n}\n","// src/core/utils/fallback.ts\nimport type {\n ServiceProps,\n ServiceFallback,\n ServiceIdRef,\n NodeIdRef,\n} from \"@/schema\";\nimport type { DgpServiceCapability, DgpServiceMap } from \"@/schema/provider\";\nimport type { FallbackSettings } from \"@/schema/validation\";\n\nexport type FailedFallbackContext = {\n scope: \"node\" | \"global\";\n nodeId?: string; // when scope='node'\n primary: ServiceIdRef;\n candidate: ServiceIdRef;\n tagContext?: string; // tag.id when evaluating constraints\n reason:\n | \"unknown_service\"\n | \"no_primary\"\n | \"rate_violation\"\n | \"constraint_mismatch\"\n | \"cycle\"\n | \"no_tag_context\";\n details?: Record<string, unknown>;\n};\n\nconst DEFAULT_SETTINGS: Required<FallbackSettings> = {\n requireConstraintFit: true,\n ratePolicy: { kind: \"lte_primary\" },\n selectionStrategy: \"priority\",\n mode: \"strict\",\n};\n\nexport function resolveServiceFallback(params: {\n primary: ServiceIdRef;\n nodeId?: NodeIdRef; // prefer node-scoped first if provided\n tagId?: string; // constraints context (if known)\n services: DgpServiceMap;\n fallbacks?: ServiceFallback;\n settings?: FallbackSettings;\n props: ServiceProps;\n}): ServiceIdRef | null {\n const s = { ...DEFAULT_SETTINGS, ...(params.settings ?? {}) };\n const { primary, nodeId, tagId, services } = params;\n const fb = params.fallbacks ?? {};\n const tried: ServiceIdRef[] = [];\n\n const lists: ServiceIdRef[][] = [];\n if (nodeId && fb.nodes?.[nodeId]) lists.push(fb.nodes[nodeId]);\n if (fb.global?.[primary]) lists.push(fb.global[primary]);\n\n const primaryRate = rateOf(services, primary);\n\n for (const list of lists) {\n for (const cand of list) {\n if (tried.includes(cand)) continue;\n tried.push(cand);\n\n const candCap = services[Number(cand)] ?? services[cand as any];\n if (!candCap) continue;\n\n if (!passesRate(s.ratePolicy, primaryRate, candCap.rate)) continue;\n if (s.requireConstraintFit && tagId) {\n const ok = satisfiesTagConstraints(tagId, params, candCap);\n if (!ok) continue;\n }\n return cand;\n }\n }\n return null;\n}\n\nexport function collectFailedFallbacks(\n props: ServiceProps,\n services: DgpServiceMap,\n settings?: FallbackSettings,\n): FailedFallbackContext[] {\n const s = { ...DEFAULT_SETTINGS, ...(settings ?? {}) };\n const out: FailedFallbackContext[] = [];\n const fb = props.fallbacks ?? {};\n const primaryRate = (p: ServiceIdRef) => rateOf(services, p);\n\n // Node-scoped (tags or options)\n for (const [nodeId, list] of Object.entries(fb.nodes ?? {})) {\n const { primary, tagContexts } = primaryForNode(props, nodeId);\n if (!primary) {\n out.push({\n scope: \"node\",\n nodeId,\n primary: \"\" as any,\n candidate: \"\" as any,\n reason: \"no_primary\",\n });\n continue;\n }\n for (const cand of list) {\n const cap = getCap(services, cand);\n if (!cap) {\n out.push({\n scope: \"node\",\n nodeId,\n primary,\n candidate: cand,\n reason: \"unknown_service\",\n });\n continue;\n }\n if (String(cand) === String(primary)) {\n out.push({\n scope: \"node\",\n nodeId,\n primary,\n candidate: cand,\n reason: \"cycle\",\n });\n continue;\n }\n if (!passesRate(s.ratePolicy, primaryRate(primary), cap.rate)) {\n out.push({\n scope: \"node\",\n nodeId,\n primary,\n candidate: cand,\n reason: \"rate_violation\",\n });\n continue;\n }\n // Tag contexts\n if (tagContexts.length === 0) {\n out.push({\n scope: \"node\",\n nodeId,\n primary,\n candidate: cand,\n reason: \"no_tag_context\",\n });\n continue;\n }\n let anyPass = false;\n let anyFail = false;\n for (const tagId of tagContexts) {\n const ok = s.requireConstraintFit\n ? satisfiesTagConstraints(tagId, { services, props }, cap)\n : true;\n if (ok) anyPass = true;\n else {\n anyFail = true;\n out.push({\n scope: \"node\",\n nodeId,\n primary,\n candidate: cand,\n tagContext: tagId,\n reason: \"constraint_mismatch\",\n });\n }\n }\n // If none passed, we already added per-context mismatches above\n void anyPass;\n void anyFail;\n }\n }\n\n // Global (soft; no tag context)\n for (const [primary, list] of Object.entries(fb.global ?? {})) {\n for (const cand of list) {\n const cap = getCap(services, cand);\n if (!cap) {\n out.push({\n scope: \"global\",\n primary,\n candidate: cand,\n reason: \"unknown_service\",\n });\n continue;\n }\n if (String(cand) === String(primary)) {\n out.push({\n scope: \"global\",\n primary,\n candidate: cand,\n reason: \"cycle\",\n });\n continue;\n }\n if (!passesRate(s.ratePolicy, primaryRate(primary), cap.rate)) {\n out.push({\n scope: \"global\",\n primary,\n candidate: cand,\n reason: \"rate_violation\",\n });\n }\n }\n }\n return out;\n}\n\n/* ───────────────────────── helpers ───────────────────────── */\n\nfunction rateOf(\n map: DgpServiceMap,\n id: ServiceIdRef | undefined,\n): number | undefined {\n if (id === undefined || id === null) return undefined;\n const c = getCap(map, id);\n return c?.rate ?? undefined;\n}\n\nfunction passesRate(\n policy: Required<FallbackSettings>[\"ratePolicy\"],\n primaryRate?: number,\n candRate?: number,\n): boolean {\n if (typeof candRate !== \"number\" || !Number.isFinite(candRate))\n return false;\n if (typeof primaryRate !== \"number\" || !Number.isFinite(primaryRate))\n return false;\n switch (policy.kind) {\n case \"lte_primary\":\n return candRate <= primaryRate;\n case \"within_pct\":\n return candRate <= primaryRate * (1 + policy.pct / 100);\n case \"at_least_pct_lower\":\n return candRate <= primaryRate * (1 - policy.pct / 100);\n }\n}\n\nfunction getCap(\n map: DgpServiceMap,\n id: ServiceIdRef,\n): DgpServiceCapability | undefined {\n // Keep the old behavior, but avoid NaN poisoning lookups.\n const direct: DgpServiceCapability | undefined = (map as any)[id];\n if (direct) return direct;\n\n const strKey: string = String(id);\n const byStr: DgpServiceCapability | undefined = (map as any)[strKey];\n if (byStr) return byStr;\n\n const n: number =\n typeof id === \"number\"\n ? id\n : typeof id === \"string\"\n ? Number(id)\n : Number.NaN;\n\n if (Number.isFinite(n)) {\n const byNum: DgpServiceCapability | undefined = (map as any)[n];\n if (byNum) return byNum;\n }\n\n return undefined;\n}\n\nfunction isCapFlagEnabled(cap: DgpServiceCapability, flagId: string): boolean {\n // New structure: flags[flagId].enabled\n const fromFlags: boolean | undefined = cap.flags?.[flagId]?.enabled;\n if (fromFlags === true) return true;\n if (fromFlags === false) return false;\n\n // Soft-compat during migration: if legacy boolean exists on cap, respect it.\n const legacy: unknown = (cap as any)[flagId];\n return legacy === true;\n}\n\nfunction satisfiesTagConstraints(\n tagId: string,\n ctx: Readonly<{ props: ServiceProps; services: DgpServiceMap }>,\n cap: DgpServiceCapability,\n): boolean {\n const tag = ctx.props.filters.find((t) => t.id === tagId);\n const eff: Record<string, unknown> | undefined = tag?.constraints as any; // effective constraints (propagated)\n if (!eff) return true;\n\n // Enforce only keys explicitly set TRUE at the tag; false/undefined => no requirement.\n for (const [key, value] of Object.entries(eff)) {\n if (value === true && !isCapFlagEnabled(cap, key)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction primaryForNode(\n props: ServiceProps,\n nodeId: string,\n): {\n primary?: ServiceIdRef;\n tagContexts: string[];\n reasonNoPrimary?: string;\n} {\n // Tag node?\n const tag = props.filters.find((t) => t.id === nodeId);\n if (tag) {\n return { primary: tag.service_id as any, tagContexts: [tag.id] };\n }\n // Option node: locate its parent field\n const field = props.fields.find(\n (f) =>\n Array.isArray(f.options) && f.options.some((o) => o.id === nodeId),\n );\n if (!field) return { tagContexts: [], reasonNoPrimary: \"no_parent_field\" };\n const opt = field.options!.find((o) => o.id === nodeId)!;\n const contexts = bindIdsToArray(field.bind_id);\n return { primary: opt.service_id as any, tagContexts: contexts };\n}\n\nfunction bindIdsToArray(bind: string | string[] | undefined): string[] {\n if (!bind) return [];\n return Array.isArray(bind) ? bind.slice() : [bind];\n}\n\n/**\n * Return all fallback candidates that are eligible for the given primary,\n * respecting:\n * - node-scoped list first (if nodeId provided), then global list for `primary`\n * - rate policy vs. primary\n * - (optional) tag constraint fit, only when tagId is provided and requireConstraintFit=true\n * - excludes (including primary automatically)\n * - selectionStrategy: 'priority' keeps list order, 'cheapest' sorts by rate asc\n * - unique (dedupe) and optional limit\n */\nexport function getEligibleFallbacks(params: {\n primary: ServiceIdRef;\n nodeId?: NodeIdRef; // prefer node-scoped list first\n tagId?: string; // constraints context (if known)\n services: DgpServiceMap;\n fallbacks?: ServiceFallback;\n settings?: FallbackSettings;\n props: ServiceProps;\n exclude?: Array<ServiceIdRef>; // additional ids to ignore\n unique?: boolean; // default true\n limit?: number; // optional cap\n}): ServiceIdRef[] {\n const s = { ...DEFAULT_SETTINGS, ...(params.settings ?? {}) };\n const { primary, nodeId, tagId, services } = params;\n const fb = params.fallbacks ?? {};\n const excludes = new Set<string>((params.exclude ?? []).map(String));\n excludes.add(String(primary)); // never return the primary itself\n const unique = params.unique ?? true;\n\n // Gather source lists: node → global\n const lists: ServiceIdRef[][] = [];\n if (nodeId && fb.nodes?.[nodeId]) lists.push(fb.nodes[nodeId]);\n if (fb.global?.[primary]) lists.push(fb.global[primary]);\n\n if (!lists.length) return [];\n\n const primaryRate = rateOf(services, primary);\n const seen = new Set<string>();\n const eligible: ServiceIdRef[] = [];\n\n for (const list of lists) {\n for (const cand of list) {\n const key = String(cand);\n if (excludes.has(key)) continue;\n if (unique && seen.has(key)) continue;\n seen.add(key);\n\n const cap = getCap(services, cand);\n if (!cap) continue;\n\n // Rate policy must pass\n if (!passesRate(s.ratePolicy, primaryRate, cap.rate)) continue;\n\n // Tag constraint fit is only enforced if we know tagId and setting requires it\n if (s.requireConstraintFit && tagId) {\n const ok = satisfiesTagConstraints(\n tagId,\n { props: params.props, services },\n cap,\n );\n if (!ok) continue;\n }\n\n eligible.push(cand);\n }\n }\n\n // Selection strategy\n if (s.selectionStrategy === \"cheapest\") {\n eligible.sort((a, b) => {\n const ra = rateOf(services, a) ?? Infinity;\n const rb = rateOf(services, b) ?? Infinity;\n return ra - rb;\n });\n }\n // 'priority' keeps original order\n\n // Optional limit\n if (typeof params.limit === \"number\" && params.limit >= 0) {\n return eligible.slice(0, params.limit);\n }\n return eligible;\n}\n","import type { Field, FieldOption, Tag } from \"@/schema\";\nimport { Builder } from \"@/core/builder\";\n\nexport type NodeKind = \"tag\" | \"field\" | \"option\" | \"unknown\";\n\nexport type RelKind = \"self\" | \"ancestor\" | \"descendant\" | \"unrelated\";\n\nexport interface AncestryHit {\n kind: RelKind;\n node: TagNode;\n index: number;\n direct: boolean;\n path: string[];\n}\n\nexport interface WithAncestry {\n ancestry(baseTag: string | TagNode): readonly AncestryHit[];\n isAncestorOf(baseTag: string | TagNode): boolean;\n isDescendantOf(baseTag: string | TagNode): boolean;\n isWithin(baseTag: string | TagNode): boolean;\n}\n\nexport interface TagNode extends WithAncestry {\n kind: \"tag\";\n id: string;\n raw: Tag;\n\n includes: ReadonlySet<string>;\n excludes: ReadonlySet<string>;\n isInherited?: boolean;\n\n parent(): TagNode | undefined;\n children(): readonly TagNode[];\n ancestors(): readonly {\n node: TagNode;\n direct: boolean;\n index: number;\n path: string[];\n }[];\n pathTo(descendant: string | TagNode): string[] | null;\n isBoundTo(tagId: string | TagNode): boolean;\n getDescendant(id: string): FieldNode | undefined;\n getDescendants(): readonly FieldNode[];\n}\n\nexport interface FieldNode extends WithAncestry {\n kind: \"field\";\n id: string;\n raw: Field;\n\n includes: ReadonlySet<string>;\n excludes: ReadonlySet<string>;\n isInherited?: boolean;\n\n bindIds(): readonly string[];\n ownerTags(): readonly TagNode[];\n isBoundTo(tagId: string | TagNode): boolean;\n getDescendant(id: string, contextId?: string): FieldNode | undefined;\n getDescendants(tagId?: string): readonly FieldNode[];\n}\n\nexport interface OptionNode extends WithAncestry {\n kind: \"option\";\n id: string;\n raw: FieldOption;\n\n includes: ReadonlySet<string>;\n excludes: ReadonlySet<string>;\n isInherited?: boolean;\n\n field(): FieldNode;\n ownerTags(): readonly TagNode[];\n isBoundTo(tagId: string | TagNode): boolean;\n getDescendant(id: string, contextId?: string): FieldNode | undefined;\n getDescendants(tagId?: string): readonly FieldNode[];\n}\n\nexport interface UnknownNode extends WithAncestry {\n kind: \"unknown\";\n id: string;\n\n includes: ReadonlySet<string>;\n excludes: ReadonlySet<string>;\n isInherited?: boolean;\n}\n\nexport type AnyNode = TagNode | FieldNode | OptionNode | UnknownNode;\n\nexport interface NodeIndex {\n getNode(input: string | Tag | Field | FieldOption): AnyNode;\n getTag(id: string): TagNode | undefined;\n getField(id: string): FieldNode | undefined;\n getOption(id: string): OptionNode | undefined;\n}\n\nconst toId = (x: string | { id: string }) => (typeof x === \"string\" ? x : x.id);\n\nconst toBindList = (b: Field[\"bind_id\"]): string[] => {\n if (!b) return [];\n return typeof b === \"string\" ? [b] : [...b];\n};\n\nexport function createNodeIndex(\n builder: Builder\n): NodeIndex {\n const props = builder.getProps();\n //---\n const tags = props.filters ?? [];\n const fields = props.fields ?? [];\n\n const tagById = new Map<string, Tag>(tags.map((t) => [t.id, t]));\n const fieldById = new Map<string, Field>(fields.map((f) => [f.id, f]));\n\n const optionById = new Map<string, FieldOption>();\n const optionOwnerFieldId = new Map<string, string>();\n for (const f of fields) {\n for (const o of f.options ?? []) {\n optionById.set(o.id, o);\n optionOwnerFieldId.set(o.id, f.id);\n }\n }\n\n const parentById = new Map<string, string | undefined>();\n const childrenById = new Map<string, string[]>();\n for (const t of tags) {\n parentById.set(t.id, t.bind_id);\n if (t.bind_id) {\n const arr = childrenById.get(t.bind_id) ?? [];\n arr.push(t.id);\n childrenById.set(t.bind_id, arr);\n }\n }\n\n // --- caches\n const nodeCache = new Map<string, AnyNode>();\n const tagNodeCache = new Map<string, TagNode>();\n const fieldNodeCache = new Map<string, FieldNode>();\n const optionNodeCache = new Map<string, OptionNode>();\n\n const tagAncestorsCache = new Map<\n string,\n readonly {\n node: TagNode;\n direct: boolean;\n index: number;\n path: string[];\n }[]\n >();\n const tagChildrenCache = new Map<string, readonly TagNode[]>();\n const lineageIdsCache = new Map<string, ReadonlySet<string>>();\n\n const fieldBindIdsCache = new Map<string, readonly string[]>();\n const fieldOwnerTagsCache = new Map<string, readonly TagNode[]>();\n\n const emptySet = Object.freeze(new Set<string>());\n\n const isFieldBoundDirectToTag = (fieldId: string, tagId: string): boolean => {\n const field = fieldById.get(fieldId);\n if (!field) return false;\n const bind = field.bind_id;\n if (!bind) return false;\n if (typeof bind === \"string\") return bind === tagId;\n return bind.includes(tagId);\n };\n\n const resolveDescendants = (\n id: string,\n includes: ReadonlySet<string>,\n tagId?: string,\n forceSimple?: boolean\n ): readonly FieldNode[] => {\n if (!tagId || forceSimple) {\n const results: FieldNode[] = [];\n for (const incId of includes) {\n const node = getField(incId);\n if (node) results.push(node);\n }\n return Object.freeze(results);\n }\n\n const results: FieldNode[] = [];\n const visible = builder.visibleFields(tagId, [id]);\n\n for (const fieldId of visible) {\n const node = getField(fieldId);\n if (!node) continue;\n const explicit =\n includes.has(fieldId) ||\n isFieldBoundDirectToTag(fieldId, tagId);\n results.push(explicit ? node : { ...node, isInherited: true });\n }\n\n return Object.freeze(results);\n };\n\n // ---- core graph helpers\n const lineageIds = (tagId: string): ReadonlySet<string> => {\n const cached = lineageIdsCache.get(tagId);\n if (cached) return cached;\n\n const out = new Set<string>();\n const guard = new Set<string>();\n let cur: string | undefined = tagId;\n\n while (cur && !guard.has(cur)) {\n out.add(cur);\n guard.add(cur);\n cur = parentById.get(cur);\n }\n\n lineageIdsCache.set(tagId, out);\n return out;\n };\n\n const pathBetween = (fromId: string, toId: string): string[] | null => {\n if (fromId === toId) return [fromId];\n\n const guard = new Set<string>();\n const stack: string[] = [];\n let cur: string | undefined = toId;\n\n while (cur && !guard.has(cur)) {\n stack.push(cur);\n if (cur === fromId) return stack.reverse(); // from -> ... -> to\n guard.add(cur);\n cur = parentById.get(cur);\n }\n return null;\n };\n\n const relationBetween = (\n baseId: string,\n otherId: string,\n ): { kind: RelKind; path: string[]; index: number; direct: boolean } => {\n if (baseId === otherId)\n return { kind: \"self\", path: [baseId], index: 0, direct: false };\n\n // base -> other ? => descendant\n const down = pathBetween(baseId, otherId);\n if (down)\n return {\n kind: \"descendant\",\n path: down,\n index: down.length - 1,\n direct: down.length === 2,\n };\n\n // other -> base ? => ancestor\n const up = pathBetween(otherId, baseId);\n if (up) {\n // want base -> other path; we can just reverse \"up\"\n const p = up.slice().reverse();\n return {\n kind: \"ancestor\",\n path: p,\n index: p.length - 1,\n direct: p.length === 2,\n };\n }\n\n return { kind: \"unrelated\", path: [], index: -1, direct: false };\n };\n\n // ---- shared ancestry impl builder\n const makeAncestry = (selfOwnerTagIds: readonly string[]) => {\n return (baseTag: string | TagNode): readonly AncestryHit[] => {\n const baseId = toId(baseTag);\n const hits: AncestryHit[] = [];\n\n for (const ownerId of selfOwnerTagIds) {\n const owner = getTag(ownerId);\n if (!owner) continue;\n\n const rel = relationBetween(baseId, ownerId);\n hits.push({\n kind: rel.kind,\n node: owner,\n index: rel.index,\n direct: rel.direct,\n path: rel.path,\n });\n }\n\n return hits;\n };\n };\n\n const makeAncestryFns = (\n ancestryFn: (baseTag: string | TagNode) => readonly AncestryHit[],\n ) => ({\n ancestry: ancestryFn,\n\n isAncestorOf(baseTag: string | TagNode): boolean {\n return ancestryFn(baseTag).some((h) => h.kind === \"ancestor\");\n },\n\n isDescendantOf(baseTag: string | TagNode): boolean {\n return ancestryFn(baseTag).some((h) => h.kind === \"descendant\");\n },\n\n isWithin(baseTag: string | TagNode): boolean {\n return ancestryFn(baseTag).some(\n (h) => h.kind === \"self\" || h.kind === \"descendant\",\n );\n },\n });\n\n // ---- node factories\n const getTag = (id: string): TagNode | undefined => {\n const cached = tagNodeCache.get(id);\n if (cached) return cached;\n\n const raw = tagById.get(id);\n if (!raw) return undefined;\n\n const includes = Object.freeze(new Set(raw.includes ?? []));\n const excludes = Object.freeze(new Set(raw.excludes ?? []));\n\n const ancestryFn = makeAncestry([id]);\n\n const node: TagNode = {\n kind: \"tag\",\n id,\n raw,\n\n includes,\n excludes,\n\n ...makeAncestryFns(ancestryFn),\n\n parent() {\n const pid = parentById.get(id);\n return pid ? getTag(pid) : undefined;\n },\n\n children() {\n const cachedChildren = tagChildrenCache.get(id);\n if (cachedChildren) return cachedChildren;\n\n const childIds = childrenById.get(id) ?? [];\n const arr = childIds\n .map((cid) => getTag(cid))\n .filter(Boolean) as TagNode[];\n const frozen = Object.freeze(arr);\n tagChildrenCache.set(id, frozen);\n return frozen;\n },\n\n ancestors() {\n const cachedAnc = tagAncestorsCache.get(id);\n if (cachedAnc) return cachedAnc;\n\n const rows: Array<{\n node: TagNode;\n direct: boolean;\n index: number;\n path: string[];\n }> = [];\n const guard = new Set<string>();\n let cur = parentById.get(id);\n let index = 1;\n\n while (cur && !guard.has(cur)) {\n const n = getTag(cur);\n if (!n) break;\n const p = pathBetween(id, cur) ?? [id, cur];\n\n rows.push({ node: n, direct: index === 1, index, path: p });\n\n guard.add(cur);\n cur = parentById.get(cur);\n index++;\n }\n\n const frozen = Object.freeze(rows);\n tagAncestorsCache.set(id, frozen);\n return frozen;\n },\n\n pathTo(descendant) {\n const to = toId(descendant);\n return pathBetween(id, to);\n },\n\n isBoundTo(tagId) {\n const tid = toId(tagId);\n if (tid === id) return true;\n // A tag is bound to tagId if tagId is its DIRECT parent.\n return parentById.get(id) === tid;\n },\n\n getDescendant(descendantId) {\n return this.getDescendants().find(item => item.id == descendantId)\n },\n\n getDescendants() {\n const results: FieldNode[] = [];\n const visible = builder.visibleFields(id);\n\n for (const fieldId of visible) {\n const node = getField(fieldId);\n if (!node) continue;\n const explicit =\n includes.has(fieldId) ||\n isFieldBoundDirectToTag(fieldId, id);\n results.push(explicit ? node : { ...node, isInherited: true });\n }\n\n return Object.freeze(results);\n },\n };\n\n tagNodeCache.set(id, node);\n nodeCache.set(id, node);\n return node;\n };\n\n const getField = (id: string): FieldNode | undefined => {\n const cached = fieldNodeCache.get(id);\n if (cached) return cached;\n\n const raw = fieldById.get(id);\n if (!raw) return undefined;\n\n const isButton = (raw as any).button === true;\n const includes = isButton\n ? Object.freeze(new Set(props.includes_for_buttons?.[id] ?? []))\n : emptySet;\n const excludes = isButton\n ? Object.freeze(new Set(props.excludes_for_buttons?.[id] ?? []))\n : emptySet;\n\n const bindIds = (): readonly string[] => {\n const cachedBind = fieldBindIdsCache.get(id);\n if (cachedBind) return cachedBind;\n const res = Object.freeze(toBindList(raw.bind_id));\n fieldBindIdsCache.set(id, res);\n return res;\n };\n\n const ancestryFn = makeAncestry(bindIds());\n\n const node: FieldNode = {\n kind: \"field\",\n id,\n raw,\n\n includes,\n excludes,\n\n ...makeAncestryFns(ancestryFn),\n\n bindIds,\n\n ownerTags() {\n const cachedOwners = fieldOwnerTagsCache.get(id);\n if (cachedOwners) return cachedOwners;\n\n const owners = bindIds()\n .map((tid) => getTag(tid))\n .filter(Boolean) as TagNode[];\n\n const frozen = Object.freeze(owners);\n fieldOwnerTagsCache.set(id, frozen);\n return frozen;\n },\n\n isBoundTo(tagId) {\n const tid = toId(tagId);\n const lin = lineageIds(tid); // self + ancestors\n for (const b of bindIds()) if (lin.has(b)) return true;\n return false;\n },\n\n getDescendant(descendantId, context) {\n return this.getDescendants(context).find(item => item.id == descendantId);\n },\n\n getDescendants(tagId?: string) {\n return resolveDescendants(id, includes, tagId, !isButton);\n },\n };\n\n fieldNodeCache.set(id, node);\n nodeCache.set(id, node);\n return node;\n };\n\n const getOption = (id: string): OptionNode | undefined => {\n const cached = optionNodeCache.get(id);\n if (cached) return cached;\n\n const raw = optionById.get(id);\n const ownerFieldId = optionOwnerFieldId.get(id);\n if (!raw || !ownerFieldId) return undefined;\n\n const owner = getField(ownerFieldId);\n if (!owner) return undefined;\n\n const includes = Object.freeze(\n new Set(props.includes_for_buttons?.[id] ?? []),\n );\n const excludes = Object.freeze(\n new Set(props.excludes_for_buttons?.[id] ?? []),\n );\n\n // option shares ancestry with its owning field\n const node: OptionNode = {\n kind: \"option\",\n id,\n raw,\n\n includes,\n excludes,\n\n ...makeAncestryFns((baseTag) => owner.ancestry(baseTag)),\n\n field() {\n return owner;\n },\n\n ownerTags() {\n return owner.ownerTags();\n },\n\n isBoundTo(tagId) {\n return owner.isBoundTo(tagId);\n },\n\n getDescendant(descendantId, context) {\n return this.getDescendants(context).find(item => item.id == descendantId);\n },\n\n getDescendants(tagId?: string) {\n return resolveDescendants(id, includes, tagId);\n },\n };\n\n optionNodeCache.set(id, node);\n nodeCache.set(id, node);\n return node;\n };\n\n const getNode = (input: string | Tag | Field | FieldOption): AnyNode => {\n if (typeof input !== \"string\") {\n if (\"bind_id\" in input && !(\"type\" in input))\n return getTag(input.id) ?? mkUnknown(input.id);\n if (\"type\" in input)\n return getField(input.id) ?? mkUnknown(input.id);\n return getOption(input.id) ?? mkUnknown((input as FieldOption).id);\n }\n\n const cached = nodeCache.get(input);\n if (cached) return cached;\n\n const id = input;\n\n if (id.startsWith(\"t:\")) return getTag(id) ?? mkUnknown(id);\n if (id.startsWith(\"f:\")) return getField(id) ?? mkUnknown(id);\n if (id.startsWith(\"o:\")) return getOption(id) ?? mkUnknown(id);\n\n return getTag(id) ?? getField(id) ?? getOption(id) ?? mkUnknown(id);\n };\n\n const mkUnknown = (id: string): UnknownNode => {\n const u: UnknownNode = {\n kind: \"unknown\",\n id,\n includes: emptySet,\n excludes: emptySet,\n ...makeAncestryFns(() => []),\n };\n nodeCache.set(id, u);\n return u;\n };\n\n return {\n getNode,\n getTag,\n getField,\n getOption,\n };\n}\n","import type { DgpServiceMap, DgpServiceCapability } from \"@/schema/provider\";\r\nimport type { FallbackSettings } from \"@/schema/validation\";\r\n\r\n/**\r\n * Safely convert unknown to a finite number. Returns NaN if not finite.\r\n */\r\nexport function toFiniteNumber(v: unknown): number {\r\n const n = Number(v);\r\n return Number.isFinite(n) ? n : NaN;\r\n}\r\n\r\n/**\r\n * Check if a candidate service satisfies the active tag constraints.\r\n * Only flags explicitly set to true are treated as required.\r\n */\r\nexport function constraintFitOk(\r\n svcMap: DgpServiceMap,\r\n candidate: string | number,\r\n constraints: Partial<Record<\"refill\" | \"cancel\" | \"dripfeed\", boolean>>,\r\n): boolean {\r\n const cap: DgpServiceCapability | undefined = svcMap[Number(candidate)];\r\n if (!cap) return false;\r\n\r\n if (constraints.dripfeed === true && !cap.dripfeed) return false;\r\n if (constraints.refill === true && !cap.refill) return false;\r\n return !(constraints.cancel === true && !cap.cancel);\r\n\r\n}\r\n\r\n/**\r\n * Evaluate candidate rate against primary according to the fallback rate policy.\r\n * If either service is missing or rates are not finite, returns false.\r\n */\r\nexport function rateOk(\r\n svcMap: DgpServiceMap,\r\n candidate: string | number,\r\n primary: string | number,\r\n policy: FallbackSettings,\r\n): boolean {\r\n const cand = svcMap[Number(candidate)];\r\n const prim = svcMap[Number(primary)];\r\n if (!cand || !prim) return false;\r\n\r\n const cRate = toFiniteNumber(cand.rate);\r\n const pRate = toFiniteNumber(prim.rate);\r\n if (!Number.isFinite(cRate) || !Number.isFinite(pRate)) return false;\r\n\r\n const rp = policy.ratePolicy ?? { kind: \"lte_primary\" as const };\r\n switch (rp.kind) {\r\n case \"lte_primary\":\r\n return cRate <= pRate;\r\n case \"within_pct\": {\r\n const pct = Math.max(0, rp.pct ?? 0);\r\n return cRate <= pRate * (1 + pct / 100);\r\n }\r\n case \"at_least_pct_lower\": {\r\n const pct = Math.max(0, rp.pct ?? 0);\r\n return cRate <= pRate * (1 - pct / 100);\r\n }\r\n default:\r\n return false;\r\n }\r\n}\r\n","// src/react/canvas/selection.ts\nimport type { Builder } from \"@/core\";\nimport type { Field, PricingRole, ServiceProps, Tag } from \"@/schema\";\nimport type { DgpServiceCapability } from \"@/schema/provider\";\n\nexport type Env = \"client\" | \"workspace\";\n\nexport type VisibleGroup = {\n tagId?: string;\n tag?: Tag;\n fields: Field[];\n fieldIds: string[];\n parentTags?: Tag[];\n childrenTags?: Tag[];\n /** In order of selection: tag base (unless overridden) then selected options */\n services?: DgpServiceCapability[];\n};\n\n// Returned by visibleGroup():\nexport type VisibleGroupResult =\n | { kind: \"single\"; group: VisibleGroup }\n | { kind: \"multi\"; groups: string[] };\n\ntype ChangeEvt = { ids: string[]; primary?: string };\ntype Listener = (e: ChangeEvt) => void;\n\nconst isTagId = (id: string) => typeof id === \"string\" && id.startsWith(\"t:\");\nconst isOptionId = (id: string) =>\n typeof id === \"string\" && id.startsWith(\"o:\");\n\nexport type SelectionOptions = {\n env?: Env;\n rootTagId?: string;\n /** Resolve service capability from an id (used for `services` array) */\n resolveService?: (id: any) => DgpServiceCapability | undefined;\n};\n\nexport class Selection {\n private set = new Set<string>();\n private primaryId: string | undefined;\n private currentTagId: string | undefined;\n private onChangeFns: Listener[] = [];\n\n constructor(\n private readonly builder: Builder,\n private readonly opts: SelectionOptions,\n ) {}\n\n // ── Public mutators ──────────────────────────────────────────────────────\n replace(id?: string | null) {\n if (!id) return this.clear();\n this.set.clear();\n this.set.add(id);\n this.primaryId = id;\n this.updateCurrentTagFrom(id);\n this.emit();\n }\n\n add(id: string) {\n this.set.add(id);\n this.primaryId = id;\n this.updateCurrentTagFrom(id);\n this.emit();\n }\n\n remove(id: string) {\n if (!this.set.delete(id)) return;\n if (this.primaryId === id) {\n this.primaryId = this.set.values().next().value;\n if (this.primaryId) this.updateCurrentTagFrom(this.primaryId);\n }\n this.emit();\n }\n\n toggle(id: string) {\n if (this.set.has(id)) this.remove(id);\n else this.add(id);\n }\n\n many(ids: Iterable<string>, primary?: string) {\n this.set = new Set(ids);\n this.primaryId = primary ?? this.set.values().next().value;\n if (this.primaryId) this.updateCurrentTagFrom(this.primaryId);\n this.emit();\n }\n\n clear() {\n if (!this.set.size && !this.primaryId) return;\n this.set.clear();\n this.primaryId = undefined;\n this.emit();\n }\n\n // ── Read APIs ────────────────────────────────────────────────────────────\n all(): ReadonlySet<string> {\n return this.set;\n }\n\n has(id: string): boolean {\n return this.set.has(id);\n }\n\n primary(): string | undefined {\n return this.primaryId;\n }\n\n currentTag(): string | undefined {\n return this.currentTagId;\n }\n\n onChange(fn: Listener): () => void {\n this.onChangeFns.push(fn);\n return () => {\n const i = this.onChangeFns.indexOf(fn);\n if (i >= 0) this.onChangeFns.splice(i, 1);\n };\n }\n\n // ── Main: visible group snapshot (env-aware) ─────────────────────────────\n visibleGroup(): VisibleGroupResult {\n const props = this.builder.getProps() as ServiceProps;\n\n // WORKSPACE: >1 tag selected → return raw selection set\n if ((this.opts.env ?? \"client\") === \"workspace\") {\n const tagIds = Array.from(this.set).filter(isTagId);\n if (tagIds.length > 1) {\n return { kind: \"multi\", groups: Array.from(this.set) };\n }\n }\n\n const tagId = this.resolveTagContextId(props);\n if (!tagId)\n return { kind: \"single\", group: { fields: [], fieldIds: [] } };\n\n const group = this.computeGroupForTag(props, tagId);\n return { kind: \"single\", group };\n }\n\n // ── Internals ────────────────────────────────────────────────────────────\n private emit() {\n const payload: ChangeEvt = {\n ids: Array.from(this.set),\n primary: this.primaryId,\n };\n for (const fn of this.onChangeFns) fn(payload);\n }\n\n private updateCurrentTagFrom(id: string) {\n const props = this.builder.getProps() as ServiceProps;\n const tags = props.filters ?? [];\n const fields = props.fields ?? [];\n\n if (tags.some((t) => t.id === id)) {\n this.currentTagId = id;\n return;\n }\n const f = fields.find((x) => x.id === id);\n if (f?.bind_id) {\n this.currentTagId = Array.isArray(f.bind_id)\n ? f.bind_id[0]\n : f.bind_id;\n return;\n }\n\n if (isOptionId(id)) {\n const host = fields.find((x) =>\n (x.options ?? []).some((o) => o.id === id),\n );\n if (host?.bind_id) {\n this.currentTagId = Array.isArray(host.bind_id)\n ? host.bind_id[0]\n : host.bind_id;\n return;\n }\n }\n\n if (id.includes(\"::\")) {\n const [fid] = id.split(\"::\");\n const host = fields.find((x) => x.id === fid);\n if (host?.bind_id) {\n this.currentTagId = Array.isArray(host.bind_id)\n ? host.bind_id[0]\n : host.bind_id;\n return;\n }\n }\n }\n\n private resolveTagContextId(props: ServiceProps): string | undefined {\n if (this.currentTagId) return this.currentTagId;\n\n for (const id of this.set) if (isTagId(id)) return id;\n\n const fields = props.fields ?? [];\n for (const id of this.set) {\n const f = fields.find((x) => x.id === id);\n if (f?.bind_id)\n return Array.isArray(f.bind_id) ? f.bind_id[0] : f.bind_id;\n }\n\n for (const id of this.set) {\n if (isOptionId(id)) {\n const host = fields.find((x) =>\n (x.options ?? []).some((o) => o.id === id),\n );\n if (host?.bind_id)\n return Array.isArray(host.bind_id)\n ? host.bind_id[0]\n : host.bind_id;\n }\n if (id.includes(\"::\")) {\n const [fid] = id.split(\"::\");\n const host = fields.find((x) => x.id === fid);\n if (host?.bind_id)\n return Array.isArray(host.bind_id)\n ? host.bind_id[0]\n : host.bind_id;\n }\n }\n\n return this.opts.rootTagId;\n }\n\n private selectedButtonTriggerIds(props: ServiceProps): string[] {\n const fields = props.fields ?? [];\n const fieldById = new Map(fields.map((f) => [f.id, f]));\n\n const out: string[] = [];\n for (const selId of this.set) {\n // option ids are triggers\n if (selId.startsWith(\"o:\")) {\n out.push(selId);\n continue;\n }\n\n // field ids are triggers ONLY if the field is a button\n const f = fieldById.get(selId);\n if (f?.button === true) out.push(selId);\n }\n\n return out;\n }\n\n private computeGroupForTag(\n props: ServiceProps,\n tagId: string,\n ): VisibleGroup {\n const tags = props.filters ?? [];\n const fields = props.fields ?? [];\n const tagById = new Map(tags.map((t) => [t.id, t]));\n const tag = tagById.get(tagId);\n\n // ---- delegate visible fields to builder\n const selectedTriggerIds = this.selectedButtonTriggerIds(props);\n const fieldIds = this.builder.visibleFields(tagId, selectedTriggerIds);\n\n const fieldById = new Map(fields.map((f) => [f.id, f]));\n const visible = fieldIds\n .map((id) => fieldById.get(id))\n .filter(Boolean) as Field[];\n\n // ---- ancestry & immediate children (unchanged)\n const parentTags: Tag[] = [];\n let cur = tag?.bind_id;\n const guard = new Set<string>();\n while (cur && !guard.has(cur)) {\n const t = tagById.get(cur);\n if (!t) break;\n parentTags.push(t);\n guard.add(cur);\n cur = t.bind_id;\n }\n const childrenTags = tags.filter((t) => t.bind_id === tagId);\n\n // ---- services: tag base (unless overridden) → selected OPTIONs + selected BUTTON FIELDs (in insertion order)\n const services: DgpServiceCapability[] = [];\n const resolve = this.opts.resolveService;\n\n // 1) tag base\n let baseAddedFromTag = false;\n if (tag?.service_id != null) {\n services.push(\n resolve?.(tag.service_id) ??\n ({ id: tag.service_id } as DgpServiceCapability),\n );\n baseAddedFromTag = true;\n }\n\n // 2) walk selected ids in insertion order\n let baseOverridden = false;\n for (const selId of this.set) {\n // OPTION selected\n const opt = this.findOptionById(fields, selId);\n if (opt?.service_id != null) {\n const role = (opt.pricing_role ?? \"base\") as PricingRole;\n const cap =\n resolve?.(opt.service_id) ??\n ({ id: opt.service_id } as DgpServiceCapability);\n\n baseOverridden = this.addServiceByRole(\n services,\n cap,\n role,\n baseAddedFromTag,\n baseOverridden,\n );\n continue;\n }\n\n // BUTTON FIELD selected\n const f = fieldById.get(selId);\n if (f?.button === true && f.service_id != null) {\n const role = (f.pricing_role ?? \"base\") as PricingRole;\n const cap =\n resolve?.(f.service_id) ??\n ({ id: f.service_id } as DgpServiceCapability);\n\n baseOverridden = this.addServiceByRole(\n services,\n cap,\n role,\n baseAddedFromTag,\n baseOverridden,\n );\n }\n }\n\n return {\n tagId,\n tag,\n fields: visible,\n fieldIds,\n parentTags,\n childrenTags,\n services,\n };\n }\n\n private addServiceByRole(\n services: DgpServiceCapability[],\n cap: DgpServiceCapability,\n role: PricingRole,\n baseAddedFromTag: boolean,\n baseOverridden: boolean,\n ): boolean {\n if (role === \"base\") {\n if (!baseOverridden) {\n if (baseAddedFromTag && services.length > 0) {\n services[0] = cap;\n } else {\n services.unshift(cap);\n }\n return true;\n } else {\n services.push(cap);\n }\n } else {\n services.push(cap);\n }\n return baseOverridden;\n }\n\n private findOptionById(fields: Field[], selId: string) {\n if (isOptionId(selId)) {\n for (const f of fields) {\n const o = f.options?.find((x) => x.id === selId);\n if (o) return o;\n }\n }\n if (selId.includes(\"::\")) {\n const [fid, oid] = selId.split(\"::\");\n const f = fields.find((x) => x.id === fid);\n const o = f?.options?.find((x) => x.id === oid || x.id === selId);\n if (o) return o;\n }\n return undefined;\n }\n}\n","import { EventBus } from \"@/react\";\nimport type {\n CanvasEvents,\n CanvasOptions,\n CanvasState,\n DraftWire,\n NodePositions,\n Viewport,\n} from \"@/schema/canvas-types\";\nimport type { Builder } from \"@/core\";\nimport type { EdgeKind, GraphSnapshot } from \"@/schema/graph\";\nimport { CommentsAPI } from \"./comments\";\nimport { CanvasBackendOptions } from \"./backend\";\nimport { Editor } from \"./editor\";\nimport { Selection } from \"./selection\";\nimport type { BackendScope } from \"@/react/workspace/context/backend\";\n\nexport class CanvasAPI {\n private bus = new EventBus<CanvasEvents>();\n private readonly state: CanvasState;\n public readonly builder: Builder;\n public readonly editor: Editor;\n private readonly autoEmit: boolean;\n readonly comments: CommentsAPI;\n readonly selection: Selection;\n\n constructor(\n builder: Builder,\n opts: CanvasOptions & CanvasBackendOptions = {},\n ) {\n this.builder = builder;\n this.autoEmit = opts.autoEmitState ?? true;\n this.selection = new Selection(builder, {\n env: \"workspace\",\n rootTagId: \"t:root\",\n });\n\n const graph = builder.tree();\n this.state = {\n graph,\n positions: {},\n selection: new Set(),\n highlighted: new Set(),\n viewport: { x: 0, y: 0, zoom: 1, ...opts.initialViewport },\n version: 1,\n };\n\n this.selection.onChange(({ ids }) => {\n // mirror into CanvasState for snapshot/versioning consumers\n this.state.selection = new Set(ids);\n this.bump();\n\n // keep existing event contract\n this.bus.emit(\"selection:change\", { ids });\n\n // keep existing auto-emit behaviour\n if (this.autoEmit) this.bus.emit(\"state:change\", this.snapshot());\n });\n\n // compose comments with backend (if provided)\n const scopeProvider: (() => BackendScope | undefined) | undefined =\n (opts as unknown as { getScope?: () => BackendScope | undefined })\n .getScope ??\n (() => {\n const anyOpts = opts as unknown as Partial<{\n workspaceId: string;\n actorId: string;\n branchId: string;\n }>;\n\n if (\n !anyOpts.workspaceId ||\n !anyOpts.actorId ||\n !anyOpts.branchId\n ) {\n return undefined;\n }\n\n return {\n workspaceId: anyOpts.workspaceId,\n actorId: anyOpts.actorId,\n branchId: anyOpts.branchId,\n };\n });\n\n this.comments = new CommentsAPI(this.bus, {\n backend: opts.backend?.comments,\n getScope: scopeProvider,\n });\n\n this.editor = new Editor(builder, this, {\n serviceMap: builder.getServiceMap(),\n serviceExists: (id) => builder.getServiceMap().hasOwnProperty(id),\n ...opts,\n });\n\n if (this.autoEmit) this.bus.emit(\"state:change\", this.snapshot());\n }\n\n /* ─── Events ─────────────────────────────────────────────── */\n on = this.bus.on.bind(this.bus);\n once = this.bus.once.bind(this.bus);\n\n public emit<K extends keyof CanvasEvents>(\n event: K,\n payload: CanvasEvents[K],\n ): void {\n this.bus.emit(event, payload);\n }\n\n /* ─── State accessors ───────────────────────────────────── */\n snapshot(): CanvasState {\n // return an immutable-looking view\n return {\n ...this.state,\n selection: new Set(this.state.selection),\n highlighted: new Set(this.state.highlighted),\n graph: {\n nodes: [...this.state.graph.nodes],\n edges: [...this.state.graph.edges],\n },\n positions: { ...this.state.positions },\n };\n }\n\n getGraph(): GraphSnapshot {\n return this.state.graph;\n }\n\n getSelection(): string[] {\n return Array.from(this.state.selection);\n }\n\n getViewport(): Viewport {\n return { ...this.state.viewport };\n }\n\n /* ─── Graph lifecycle ───────────────────────────────────── */\n refreshGraph(): void {\n this.state.graph = this.builder.tree();\n this.bump();\n this.bus.emit(\"graph:update\", this.state.graph);\n }\n\n setPositions(pos: NodePositions): void {\n this.state.positions = { ...this.state.positions, ...pos };\n this.bump();\n }\n\n setPosition(id: string, x: number, y: number): void {\n this.state.positions[id] = { x, y };\n this.bump();\n }\n\n /* ─── Selection ─────────────────────────────────────────── */\n select(ids: string[] | Set<string>): void {\n this.selection.many(ids);\n }\n\n addToSelection(ids: string[] | Set<string>): void {\n const next = new Set(this.selection.all());\n let primary: string | undefined;\n\n for (const id of ids as any) {\n next.add(id);\n primary = id;\n }\n\n this.selection.many(next, primary);\n }\n\n toggleSelection(id: string): void {\n this.selection.toggle(id);\n }\n\n clearSelection(): void {\n this.selection.clear();\n }\n\n selectComments(threadId?: string): void {\n this.bus.emit(\"comment:select\", { threadId });\n }\n\n /* ─── Highlight / Hover ─────────────────────────────────── */\n setHighlighted(ids: string[] | Set<string>): void {\n this.state.highlighted = new Set(ids as any);\n this.bump();\n }\n\n setHover(id?: string): void {\n this.state.hoverId = id;\n this.bump();\n this.bus.emit(\"hover:change\", { id });\n }\n\n /* ─── Viewport ──────────────────────────────────────────── */\n setViewport(v: Partial<Viewport>): void {\n this.state.viewport = { ...this.state.viewport, ...v };\n this.bump();\n this.bus.emit(\"viewport:change\", this.getViewport());\n }\n\n /* ─── Wiring draft (for bind/include/exclude UX) ────────── */\n startWire(from: string, kind: DraftWire[\"kind\"]): void {\n this.state.draftWire = { from, kind };\n this.bump();\n this.bus.emit(\"wire:preview\", { from, kind });\n }\n\n previewWire(to?: string): void {\n const dw = this.state.draftWire;\n if (!dw) return;\n this.bus.emit(\"wire:preview\", { from: dw.from, to, kind: dw.kind });\n }\n\n commitWire(to: string): void {\n const dw = this.state.draftWire;\n if (!dw) return;\n // Headless API emits; the adapter/host decides how to mutate Builder\n this.bus.emit(\"wire:commit\", { from: dw.from, to, kind: dw.kind });\n this.state.draftWire = undefined;\n this.bump();\n }\n\n cancelWire(): void {\n const dw = this.state.draftWire;\n if (!dw) return;\n this.bus.emit(\"wire:cancel\", { from: dw.from });\n this.state.draftWire = undefined;\n this.bump();\n }\n\n /* ─── Utilities ─────────────────────────────────────────── */\n private bump(): void {\n this.state.version++;\n if (this.autoEmit) this.bus.emit(\"state:change\", this.snapshot());\n }\n\n dispose(): void {\n this.bus.clear();\n }\n\n undo() {\n this.builder.undo();\n this.refreshGraph();\n }\n\n private edgeRel: EdgeKind = \"bind\";\n\n getEdgeRel(): EdgeKind {\n return this.edgeRel;\n }\n\n public setEdgeRel(rel: EdgeKind) {\n if (this.edgeRel === rel) return; // ← correct: skip only if identical\n this.edgeRel = rel;\n this.bus.emit(\"edge:change\", rel);\n }\n\n /* ─── Option-node visibility (per field) ───────────────────────────────── */\n\n /** Internal mirror of which fields should show their options as nodes. */\n private shownOptionFields = new Set<string>();\n\n /** Return the field ids whose options are currently set to be visible as nodes. */\n getShownOptionFields(): string[] {\n return Array.from(this.shownOptionFields);\n }\n\n /** True if this field’s options are shown as nodes. */\n isFieldOptionsShown(fieldId: string): boolean {\n return this.shownOptionFields.has(String(fieldId));\n }\n\n /**\n * Set visibility of option nodes for a field, then rebuild the graph.\n * When shown = true, the Builder will emit option nodes for this field.\n */\n setFieldOptionsShown(fieldId: string, shown: boolean): void {\n const id = String(fieldId);\n const before = this.shownOptionFields.has(id);\n if (shown && !before) this.shownOptionFields.add(id);\n else if (!shown && before) this.shownOptionFields.delete(id);\n else return; // no-op\n\n // Push to builder options and refresh\n this.builder.setOptions({\n showOptionNodes: new Set(this.shownOptionFields),\n });\n this.refreshGraph();\n }\n\n /** Toggle option-node visibility for a field. Returns the new visibility. */\n toggleFieldOptions(fieldId: string): boolean {\n const next = !this.isFieldOptionsShown(fieldId);\n this.setFieldOptionsShown(fieldId, next);\n return next;\n }\n\n /**\n * Replace the whole set of fields whose options are visible as nodes.\n * Useful for restoring a saved UI state.\n */\n setShownOptionFields(ids: Iterable<string>): void {\n const next = new Set(Array.from(ids, String));\n // Fast-path: if identical set, skip work\n if (\n next.size === this.shownOptionFields.size &&\n Array.from(next).every((id) => this.shownOptionFields.has(id))\n ) {\n return;\n }\n this.shownOptionFields = next;\n this.builder.setOptions({\n showOptionNodes: new Set(this.shownOptionFields),\n });\n this.refreshGraph();\n }\n\n getConstraints() {\n return this.builder.getConstraints();\n }\n\n getServiceProps() {\n return this.builder.getProps();\n }\n}\n","// src/react/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 { Builder, createNodeIndex, NodeIndex } from \"@/core\";\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 ---------------- */\n\nconst isTagId = (id: string) => id.startsWith(\"t:\");\nconst isOptionId = (id: string) => id.startsWith(\"o:\");\n\nfunction deriveSelectionInfo(\n props: ServiceProps,\n ids: readonly string[],\n): CanvasSelection {\n const tags: string[] = [];\n const fields: string[] = [];\n const options: string[] = [];\n\n const fieldById = new Map<string, Field>();\n for (const f of props.fields ?? []) fieldById.set(f.id, f);\n\n for (const id of ids) {\n if (isTagId(id)) {\n tags.push(id);\n continue;\n }\n\n if (isOptionId(id)) {\n options.push(id);\n continue;\n }\n\n // legacy option selection: \"fieldId::legacyOptionId\"\n if (id.includes(\"::\")) {\n const [fid, legacyOid] = id.split(\"::\");\n if (fid && legacyOid) {\n const host = fieldById.get(fid);\n const resolved =\n host?.options?.find((o) => o.id === legacyOid)?.id ??\n legacyOid;\n\n options.push(resolved);\n\n // often you still want the field id in fieldIds too\n if (fieldById.has(fid)) fields.push(fid);\n }\n continue;\n }\n\n // plain field selection (only if it exists as a field)\n if (fieldById.has(id)) {\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(props0, 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 setSelectionInfo(deriveSelectionInfo(nextProps, 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","// 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 BranchParticipant,\n BranchesBackend,\n CommentsBackend,\n Commit,\n Draft,\n FieldTemplate,\n PoliciesBackend,\n PoliciesLoadResult,\n PolicyScope,\n ServiceSnapshot,\n ServicesBackend,\n ServicesInput,\n SnapshotsBackend,\n SnapshotsLoadResult,\n TemplatesBackend,\n TemplatesListParams,\n TemplateCreateInput,\n TemplateUpdatePatch,\n WorkspaceBackend,\n WorkspaceInfo,\n PermissionsBackend,\n PermissionsMap,\n MergeResult,\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 { ok, fail } from \"./errors\";\nimport { isoNow } from \"./time\";\nimport type {\n CreateMemoryWorkspaceBackendOptions,\n MemoryBackendSeed,\n} from \"./seed\";\nimport {\n ensureThread,\n findMessageIndex,\n newBranchSnapshotState,\n newCommentsBranchState,\n type MemoryWorkspaceStore,\n} from \"./store\";\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\nexport function createMemoryWorkspaceBackend(\n opts: CreateMemoryWorkspaceBackendOptions,\n): WorkspaceBackend {\n const store: MemoryWorkspaceStore = seedStore(opts);\n\n const info: WorkspaceInfo = store.info;\n\n const authors: 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\n const permissions: 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\n const branches: 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\n const access: 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\n const services: 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\n const templates: 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 templates.list({ ...params });\n },\n };\n\n const snapshots: 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\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 commentsImpl: 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\"] = commentsImpl;\n\n const policies: 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\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"],"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","React","setLoadableError","React","React","React","React","_a","_a","import_react","_a","_b","ok","import_lodash_es","_a","_a","out","f","rest","ok","results","toId","_a","_b","node","_c","_d","ok","newId","_a","_b","_c","_d","_e","_f","_g","f","toId","p","passesRate","uniq","isTagId","isOptionId","_a","import_jsx_runtime","_a","React","import_react","isTagId","isOptionId","uniq","React","_a","_b","_a","__seq","out","st","import_jsx_runtime"]}