@omniharmonic/openspace-ops 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/apply.ts","../src/doc.ts","../src/ops.ts","../src/paths.ts","../src/diff.ts","../src/invert.ts","../src/validate.ts","../src/rebase.ts","../src/roles.ts","../src/summarize.ts","../src/index.ts"],"sourcesContent":["import type { Block, GridItem, Section, SiteDocument } from \"@omniharmonic/openspace-schema\";\nimport { produce } from \"immer\";\nimport {\n autoPlace,\n containerPath,\n copyRows,\n findBlock,\n findSection,\n getPage,\n OpError,\n raiseRows,\n resolvePosition,\n sectionsOf,\n} from \"./doc\";\nimport { type ContainerId, FOOTER, type Op, type Patch } from \"./ops\";\nimport {\n applyPatch,\n checkPath,\n clone,\n isForbiddenKey,\n type Obj,\n overlappingPaths,\n patchPaths,\n} from \"./paths\";\n\n/** Top-level keys that path patches may not touch, per target. */\nexport const PROTECTED_PATHS = {\n page: [\"id\", \"sections\"],\n section: [\"id\", \"blocks\"],\n site: [\"nav\"],\n styles: [] as string[],\n} as const;\n\nfunction checkPatch(\n patch: Patch,\n protectedKeys: readonly string[],\n path: (string | number)[],\n what: string,\n): void {\n const paths = patchPaths(patch);\n for (const p of paths) {\n const problem = checkPath(p);\n if (problem) throw new OpError(problem, path);\n const top = p.split(\".\")[0] as string;\n if (protectedKeys.includes(top)) {\n const hint =\n top === \"nav\"\n ? \"use nav.update\"\n : top === \"sections\" || top === \"blocks\"\n ? \"use the section/block ops\"\n : \"ids never change\";\n throw new OpError(`Cannot patch ${what} \"${top}\" directly (${hint})`, path);\n }\n }\n const overlaps = overlappingPaths(paths);\n if (overlaps.length > 0)\n throw new OpError(`Overlapping patch paths: ${overlaps.join(\", \")}`, path);\n}\n\nfunction requireSections(doc: SiteDocument, container: ContainerId): Section[] {\n const sections = sectionsOf(doc, container);\n if (!sections) throw new OpError(`Page ${container} does not exist`, [\"pages\", container]);\n return sections;\n}\n\nfunction requireSection(doc: SiteDocument, container: ContainerId, id: string): Section {\n requireSections(doc, container);\n const loc = findSection(doc, container, id);\n if (!loc)\n throw new OpError(`Section ${id} is not on ${describe(container)}`, containerPath(container));\n return loc.section;\n}\n\nfunction describe(container: ContainerId): string {\n return container === FOOTER ? \"the footer\" : `page ${container}`;\n}\n\nfunction requirePage(doc: SiteDocument, id: string, op: string) {\n if (id === FOOTER) throw new OpError(`${op} is not allowed on the footer`, [\"site\", \"footer\"]);\n const page = getPage(doc, id);\n if (!page) throw new OpError(`Page ${id} does not exist`, [\"pages\", id]);\n return page;\n}\n\n/** Put a block into a section (grid placement/columns handled by the caller). */\nfunction placeInGrid(section: Section, blockId: string, item: GridItem | undefined): void {\n if (section.layout.mode !== \"grid\") return;\n section.layout.items[blockId as Block[\"id\"]] = item ? clone(item) : autoPlace(section.layout);\n}\n\n/**\n * Mutate `doc` (an Immer draft) by `op`. Throws `OpError` when a precondition fails.\n * Exposed for batching inside one `produce` call; most callers want `apply`.\n */\nexport function mutate(doc: SiteDocument, op: Op): void {\n switch (op.op) {\n case \"block.update\": {\n for (const k of [...(op.unset ?? []), ...Object.keys(op.set ?? {})])\n if (isForbiddenKey(k)) throw new OpError(`Forbidden field key \"${k}\"`, [\"set\", k]);\n requireSections(doc, op.page);\n const loc = findBlock(doc, op.page, op.block);\n if (!loc)\n throw new OpError(\n `Block ${op.block} is not on ${describe(op.page)}`,\n containerPath(op.page),\n );\n const b = loc.block;\n for (const k of op.unset ?? []) delete b.fields[k];\n for (const [k, v] of Object.entries(op.set ?? {})) b.fields[k] = clone(v);\n if (op.variant !== undefined) {\n if (op.variant === null) delete b.variant;\n else b.variant = op.variant;\n }\n if (op.style !== undefined) {\n if (op.style === null) delete b.style;\n else b.style = clone(op.style);\n }\n if (op.label !== undefined) {\n if (op.label === null) delete b.label;\n else b.label = op.label;\n }\n if (op.hidden !== undefined) {\n if (!op.hidden) delete b.hidden;\n else b.hidden = true;\n }\n if (op.column !== undefined) {\n if (op.column === null) delete b.column;\n else b.column = op.column;\n }\n return;\n }\n case \"block.insert\": {\n const section = requireSection(doc, op.page, op.section);\n const at = resolvePosition(\n section.blocks.map((b) => b.id),\n op.at,\n [...containerPath(op.page), \"sections\", op.section],\n );\n if (section.blocks.some((b) => b.id === op.block.id))\n throw new OpError(`Block ${op.block.id} already exists`, [\"block\", \"id\"]);\n section.blocks.splice(at, 0, clone(op.block));\n if (section.layout.mode === \"grid\") {\n placeInGrid(section, op.block.id, op.place);\n if (op.rows) section.layout.rows = copyRows(op.rows);\n else raiseRows(section.layout);\n }\n return;\n }\n case \"block.move\": {\n requireSections(doc, op.page);\n const from = findBlock(doc, op.page, op.block);\n if (!from)\n throw new OpError(\n `Block ${op.block} is not on ${describe(op.page)}`,\n containerPath(op.page),\n );\n const dest = requireSection(doc, op.page, op.to.section);\n const src = from.section;\n const same = src.id === dest.id;\n const [block] = src.blocks.splice(from.index, 1) as [Block];\n if (src.layout.mode === \"grid\" && !same) {\n delete src.layout.items[block.id];\n if (op.fromRows) src.layout.rows = copyRows(op.fromRows);\n }\n const at = resolvePosition(\n dest.blocks.map((b) => b.id),\n op.to.at,\n [...containerPath(op.page), \"sections\", dest.id],\n );\n dest.blocks.splice(at, 0, block);\n const moved = dest.blocks[at] as Block;\n if (dest.layout.mode === \"grid\") {\n // Within one grid section the placement is kept unless a new one is given.\n if (!same || op.to.place || !dest.layout.items[block.id])\n placeInGrid(dest, block.id, op.to.place);\n if (op.to.rows) dest.layout.rows = copyRows(op.to.rows);\n else raiseRows(dest.layout);\n }\n if (op.to.column !== undefined) {\n if (op.to.column === null) delete moved.column;\n else moved.column = op.to.column;\n } else if (dest.layout.mode === \"stack\" && moved.column !== undefined) {\n const cols = dest.layout.columns.d.length;\n if (moved.column >= cols) moved.column = cols - 1;\n }\n return;\n }\n case \"block.delete\": {\n requireSections(doc, op.page);\n const loc = findBlock(doc, op.page, op.block);\n if (!loc)\n throw new OpError(\n `Block ${op.block} is not on ${describe(op.page)}`,\n containerPath(op.page),\n );\n loc.section.blocks.splice(loc.index, 1);\n if (loc.section.layout.mode === \"grid\") {\n delete loc.section.layout.items[op.block];\n if (op.rows) loc.section.layout.rows = copyRows(op.rows);\n }\n return;\n }\n case \"grid.place\": {\n const section = requireSection(doc, op.page, op.section);\n const base = [...containerPath(op.page), \"sections\", op.section];\n if (section.layout.mode !== \"grid\")\n throw new OpError(`Section ${op.section} is not a grid section`, [\n ...base,\n \"layout\",\n \"mode\",\n ]);\n if (!section.blocks.some((b) => b.id === op.block))\n throw new OpError(`Block ${op.block} is not in section ${op.section}`, [...base, \"blocks\"]);\n const item = section.layout.items[op.block];\n if (op.rect === null) {\n if (op.bp === \"d\")\n throw new OpError(\"The desktop placement cannot be removed\", [\n ...base,\n \"layout\",\n \"items\",\n op.block,\n \"d\",\n ]);\n if (item) delete item[op.bp];\n } else if (item) {\n item[op.bp] = clone(op.rect);\n } else {\n if (op.bp !== \"d\")\n throw new OpError(`Block ${op.block} needs a desktop placement first`, [\n ...base,\n \"layout\",\n \"items\",\n op.block,\n ]);\n section.layout.items[op.block] = { d: clone(op.rect) };\n }\n if (op.rows) section.layout.rows = copyRows(op.rows);\n else raiseRows(section.layout);\n return;\n }\n case \"section.insert\": {\n const page = requirePage(doc, op.page, \"section.insert\");\n const at = resolvePosition(\n page.sections.map((s) => s.id),\n op.at,\n [\"pages\", op.page],\n );\n if (page.sections.some((s) => s.id === op.section.id))\n throw new OpError(`Section ${op.section.id} already exists`, [\"section\", \"id\"]);\n page.sections.splice(at, 0, clone(op.section));\n return;\n }\n case \"section.move\": {\n const page = requirePage(doc, op.page, \"section.move\");\n const from = page.sections.findIndex((s) => s.id === op.section);\n if (from < 0)\n throw new OpError(`Section ${op.section} is not on page ${op.page}`, [\"pages\", op.page]);\n const [section] = page.sections.splice(from, 1) as [Section];\n const at = resolvePosition(\n page.sections.map((s) => s.id),\n op.at,\n [\"pages\", op.page],\n );\n page.sections.splice(at, 0, section);\n return;\n }\n case \"section.delete\": {\n const page = requirePage(doc, op.page, \"section.delete\");\n const from = page.sections.findIndex((s) => s.id === op.section);\n if (from < 0)\n throw new OpError(`Section ${op.section} is not on page ${op.page}`, [\"pages\", op.page]);\n page.sections.splice(from, 1);\n return;\n }\n case \"section.update\": {\n const section = requireSection(doc, op.page, op.section);\n checkPatch(\n op,\n PROTECTED_PATHS.section,\n [...containerPath(op.page), \"sections\", op.section],\n \"section\",\n );\n applyPatch(section as unknown as Obj, op);\n return;\n }\n case \"styles.patch\": {\n checkPatch(op.patch, PROTECTED_PATHS.styles, [\"styles\"], \"styles\");\n applyPatch(doc.styles as unknown as Obj, op.patch);\n return;\n }\n case \"page.create\": {\n if (getPage(doc, op.page.id))\n throw new OpError(`Page ${op.page.id} already exists`, [\"pages\", op.page.id]);\n doc.pages[op.page.id] = clone(op.page);\n if (op.nav) doc.site.nav = clone(op.nav);\n return;\n }\n case \"page.update\": {\n const page = requirePage(doc, op.page, \"page.update\");\n checkPatch(op, PROTECTED_PATHS.page, [\"pages\", op.page], \"page\");\n applyPatch(page as unknown as Obj, op);\n return;\n }\n case \"page.delete\": {\n requirePage(doc, op.page, \"page.delete\");\n delete doc.pages[op.page];\n if (op.nav) doc.site.nav = clone(op.nav);\n return;\n }\n case \"nav.update\": {\n doc.site.nav = clone(op.tree);\n return;\n }\n case \"site.update\": {\n checkPatch(op, PROTECTED_PATHS.site, [\"site\"], \"site\");\n applyPatch(doc.site as unknown as Obj, op);\n return;\n }\n case \"media.add\": {\n doc.media[op.path] = clone(op.meta);\n return;\n }\n case \"media.remove\": {\n if (!Object.hasOwn(doc.media, op.path))\n throw new OpError(`Media ${op.path} does not exist`, [\"media\", op.path]);\n delete doc.media[op.path];\n return;\n }\n case \"collection.upsert\": {\n const items = Object.hasOwn(doc.collections, op.collection)\n ? doc.collections[op.collection]\n : undefined;\n if (items) items[op.item.slug] = clone(op.item);\n else doc.collections[op.collection] = { [op.item.slug]: clone(op.item) };\n return;\n }\n case \"collection.delete\": {\n const items = Object.hasOwn(doc.collections, op.collection)\n ? doc.collections[op.collection]\n : undefined;\n if (!items || !Object.hasOwn(items, op.slug))\n throw new OpError(`Item ${op.collection}/${op.slug} does not exist`, [\n \"collections\",\n op.collection,\n op.slug,\n ]);\n delete items[op.slug];\n if (!op.keepEmpty && Object.keys(items).length === 0) delete doc.collections[op.collection];\n return;\n }\n case \"collectionConfig.upsert\": {\n if (op.config === null) {\n const configs = doc.collectionConfigs;\n if (!configs || !Object.hasOwn(configs, op.collection))\n throw new OpError(`Collection ${op.collection} has no settings`, [\n \"collectionConfigs\",\n op.collection,\n ]);\n delete configs[op.collection];\n if (!op.keepEmpty && Object.keys(configs).length === 0) delete doc.collectionConfigs;\n } else {\n if (!doc.collectionConfigs) doc.collectionConfigs = {};\n doc.collectionConfigs[op.collection] = clone(op.config);\n }\n return;\n }\n default: {\n const never: never = op;\n throw new OpError(`Unknown op ${(never as { op: string }).op}`, [\"op\"]);\n }\n }\n}\n\n/**\n * Apply an op immutably (Immer structural sharing; untouched pages keep their identity).\n * Throws `OpError` when a precondition fails. Does not schema-validate — use `validate` for\n * untrusted ops.\n */\nexport function apply(doc: SiteDocument, op: Op): SiteDocument {\n return produce(doc, (draft) => {\n mutate(draft as SiteDocument, op);\n });\n}\n\n/** Apply ops in order (one Immer pass). Throws `OpError` (with `index`) on the first failure. */\nexport function applyAll(doc: SiteDocument, ops: readonly Op[]): SiteDocument {\n return produce(doc, (draft) => {\n ops.forEach((op, index) => {\n try {\n mutate(draft as SiteDocument, op);\n } catch (e) {\n if (e instanceof OpError) throw Object.assign(e, { index });\n throw e;\n }\n });\n });\n}\n","import {\n type Block,\n type Breakpoint,\n GRID_COLUMNS,\n type GridItem,\n type GridLayout,\n type GridRect,\n type Page,\n resolve,\n type Section,\n type SiteDocument,\n} from \"@omniharmonic/openspace-schema\";\nimport { type ContainerId, FOOTER, type Position, type Rows } from \"./ops\";\n\n/** A precondition failure while applying an op (missing target, bad position…). */\nexport class OpError extends Error {\n readonly path: (string | number)[];\n constructor(message: string, path: (string | number)[] = []) {\n super(message);\n this.name = \"OpError\";\n this.path = path;\n }\n}\n\n/** Document path of a container's sections (for error paths). */\nexport function containerPath(container: ContainerId): (string | number)[] {\n return container === FOOTER ? [\"site\", \"footer\"] : [\"pages\", container];\n}\n\n/** The sections of a page, or `[footer]`. Undefined if the page does not exist. */\nexport function sectionsOf(doc: SiteDocument, container: ContainerId): Section[] | undefined {\n if (container === FOOTER) return [doc.site.footer];\n return doc.pages[container]?.sections;\n}\n\nexport function getPage(doc: SiteDocument, id: string): Page | undefined {\n return Object.hasOwn(doc.pages, id) ? doc.pages[id as Page[\"id\"]] : undefined;\n}\n\nexport interface SectionLoc {\n section: Section;\n index: number;\n}\n\nexport function findSection(\n doc: SiteDocument,\n container: ContainerId,\n sectionId: string,\n): SectionLoc | undefined {\n const sections = sectionsOf(doc, container);\n if (!sections) return undefined;\n const index = sections.findIndex((s) => s.id === sectionId);\n if (index < 0) return undefined;\n return { section: sections[index] as Section, index };\n}\n\nexport interface BlockLoc {\n section: Section;\n sectionIndex: number;\n block: Block;\n index: number;\n}\n\nexport function findBlock(\n doc: SiteDocument,\n container: ContainerId,\n blockId: string,\n): BlockLoc | undefined {\n const sections = sectionsOf(doc, container);\n if (!sections) return undefined;\n for (let i = 0; i < sections.length; i++) {\n const section = sections[i] as Section;\n const index = section.blocks.findIndex((b) => b.id === blockId);\n if (index >= 0)\n return { section, sectionIndex: i, block: section.blocks[index] as Block, index };\n }\n return undefined;\n}\n\n/** Where a section lives anywhere in the document. */\nexport function locateSection(\n doc: SiteDocument,\n sectionId: string,\n): { container: ContainerId; index: number; section: Section } | undefined {\n if (doc.site.footer.id === sectionId)\n return { container: FOOTER, index: 0, section: doc.site.footer };\n for (const page of Object.values(doc.pages)) {\n const index = page.sections.findIndex((s) => s.id === sectionId);\n if (index >= 0) return { container: page.id, index, section: page.sections[index] as Section };\n }\n return undefined;\n}\n\n/** Where a block lives anywhere in the document. */\nexport function locateBlock(\n doc: SiteDocument,\n blockId: string,\n): ({ container: ContainerId } & BlockLoc) | undefined {\n const inFooter = findBlock(doc, FOOTER, blockId);\n if (inFooter) return { container: FOOTER, ...inFooter };\n for (const page of Object.values(doc.pages)) {\n const loc = findBlock(doc, page.id, blockId);\n if (loc) return { container: page.id, ...loc };\n }\n return undefined;\n}\n\n/** Every section and block id in the document (pages + footer), mapped to its container. */\nexport function indexIds(doc: SiteDocument): {\n sections: Map<string, ContainerId>;\n blocks: Map<string, ContainerId>;\n} {\n const sections = new Map<string, ContainerId>();\n const blocks = new Map<string, ContainerId>();\n const add = (container: ContainerId, s: Section) => {\n sections.set(s.id, container);\n for (const b of s.blocks) blocks.set(b.id, container);\n };\n add(FOOTER, doc.site.footer);\n for (const page of Object.values(doc.pages)) for (const s of page.sections) add(page.id, s);\n return { sections, blocks };\n}\n\n/** Resolve a position against a list of sibling ids. Throws `OpError` if out of range. */\nexport function resolvePosition(\n ids: readonly string[],\n at: Position,\n path: (string | number)[],\n): number {\n if (typeof at === \"number\") {\n if (at > ids.length)\n throw new OpError(`Position ${at} is out of range (0–${ids.length})`, [...path, \"at\"]);\n return at;\n }\n if (at === \"start\") return 0;\n if (at === \"end\") return ids.length;\n const anchor = \"before\" in at ? at.before : at.after;\n const i = ids.indexOf(anchor);\n if (i < 0) throw new OpError(`Position anchor ${anchor} is not a sibling here`, [...path, \"at\"]);\n return \"before\" in at ? i : i + 1;\n}\n\n// --- grid helpers ---------------------------------------------------------------------------\n\n/** The placement that applies at a breakpoint (tablet inherits desktop; mobile is independent). */\nexport function effectiveRect(item: GridItem, bp: Breakpoint): GridRect | undefined {\n if (bp === \"t\") return item.t ?? item.d;\n return item[bp];\n}\n\n/** The last row used by any placement at a breakpoint (0 when empty). */\nexport function usedRows(layout: GridLayout, bp: Breakpoint): number {\n let max = 0;\n for (const item of Object.values(layout.items)) {\n const r = effectiveRect(item, bp);\n if (r) max = Math.max(max, r.y + r.h - 1);\n }\n return max;\n}\n\n/** Raise `rows` (mutably) wherever a placement extends past the last row. Never shrinks. */\nexport function raiseRows(layout: GridLayout): void {\n for (const bp of [\"d\", \"t\", \"m\"] as const) {\n const need = usedRows(layout, bp);\n if (need > resolve(layout.rows, bp)) layout.rows[bp] = need;\n }\n}\n\nexport const AUTO_PLACE = { w: 12, h: 4 } as const;\n\n/** A placement below everything else: desktop always, mobile when other items have one. */\nexport function autoPlace(layout: GridLayout): GridItem {\n const item: GridItem = {\n d: {\n x: 1,\n y: usedRows(layout, \"d\") + 1,\n w: Math.min(AUTO_PLACE.w, GRID_COLUMNS.d),\n h: AUTO_PLACE.h,\n },\n };\n if (Object.values(layout.items).some((i) => i.m !== undefined)) {\n item.m = { x: 1, y: usedRows(layout, \"m\") + 1, w: GRID_COLUMNS.m, h: AUTO_PLACE.h };\n }\n return item;\n}\n\nexport function copyRows(rows: Rows): Rows {\n const out: Rows = { d: rows.d };\n if (rows.t !== undefined) out.t = rows.t;\n if (rows.m !== undefined) out.m = rows.m;\n return out;\n}\n","import {\n BlockIdSchema,\n BlockSchema,\n BlockStyleSchema,\n CollectionConfigSchema,\n CollectionItemSchema,\n CollectionNameSchema,\n GridItemSchema,\n GridRectSchema,\n MAX_GRID_ROWS,\n MediaMetaSchema,\n MediaPathSchema,\n NavItemSchema,\n PageIdSchema,\n PageSchema,\n responsive,\n SectionIdSchema,\n SectionSchema,\n SlugSchema,\n VariantNameSchema,\n} from \"@omniharmonic/openspace-schema\";\nimport { z } from \"zod\";\n\n/**\n * The operation vocabulary (arch §5.3). Every edit — Studio, Hub DraftRoom, MCP agents, CLI —\n * is one of these plain JSON values. Ops target stable ids, are validated against\n * `@omniharmonic/openspace-schema` before they are accepted, are invertible (undo) and mergeable (rebase).\n */\n\n/** Op metadata: a unique op id, who made it, and when (ms since epoch; used for LWW). */\nexport const OpMetaShape = {\n id: z.string().min(1).max(128),\n actor: z.string().min(1).max(128),\n ts: z.number().finite().min(0),\n};\nexport interface OpMeta {\n id: string;\n actor: string;\n ts: number;\n}\n\n/**\n * The block/section container an op addresses: a page id, or `\"footer\"` for the site footer\n * (a single grid/stack section in `site.footer`). Sections cannot be inserted, moved or\n * deleted in the footer.\n */\nexport const FOOTER = \"footer\" as const;\nexport const ContainerIdSchema = z.union([PageIdSchema, z.literal(FOOTER)]);\nexport type ContainerId = z.infer<typeof ContainerIdSchema>;\n\n/**\n * Where to put a block/section in its parent list: a final index (0-based, in the list\n * without the moved item), `\"start\"`, `\"end\"`, or before/after a sibling id.\n */\nexport const PositionSchema = z.union([\n z.int().min(0),\n z.literal(\"start\"),\n z.literal(\"end\"),\n z.strictObject({ before: z.string().min(1) }),\n z.strictObject({ after: z.string().min(1) }),\n]);\nexport type Position = z.infer<typeof PositionSchema>;\n\n/**\n * A path patch: dot-separated paths into an object (`\"seo.description\"`, `\"choices.palette.brand\"`).\n * Arrays are leaf values (replaced whole). `unset` removes keys. Paths within one patch must not\n * overlap (no path may be a prefix of another).\n */\nexport const PathSchema = z\n .string()\n .min(1)\n .max(300)\n .regex(/^[^.]+(?:\\.[^.]+)*$/, { message: \"Expected a dot-separated path\" });\nexport const PatchShape = {\n set: z.record(PathSchema, z.unknown()).optional(),\n unset: z.array(PathSchema).max(500).optional(),\n};\nexport interface Patch {\n set?: Record<string, unknown>;\n unset?: string[];\n}\n\nexport const RowsSchema = responsive(z.int().min(1).max(MAX_GRID_ROWS));\nexport type Rows = z.infer<typeof RowsSchema>;\n\nexport const BreakpointSchema = z.enum([\"d\", \"t\", \"m\"]);\n\nconst op = <T extends string, S extends z.core.$ZodLooseShape>(name: T, shape: S) =>\n z.strictObject({ op: z.literal(name), ...OpMetaShape, ...shape });\n\nexport const BlockUpdateOpSchema = op(\"block.update\", {\n page: ContainerIdSchema,\n block: BlockIdSchema,\n /** Field values to set (top-level field keys). */\n set: z.record(z.string().min(1).max(100), z.unknown()).optional(),\n /** Field keys to remove. */\n unset: z.array(z.string().min(1).max(100)).max(200).optional(),\n /** New variant; `null` removes it. */\n variant: VariantNameSchema.nullable().optional(),\n /** New style overrides (replaced whole); `null` removes them. */\n style: BlockStyleSchema.nullable().optional(),\n /** Stack column; `null` removes it. */\n column: z.int().min(0).max(3).nullable().optional(),\n /** Layers label; `null` removes it. */\n label: z.string().max(80).nullable().optional(),\n /** Hide the block on the published site; `null` (or `false`) shows it again. */\n hidden: z.boolean().nullable().optional(),\n});\n\nexport const BlockInsertOpSchema = op(\"block.insert\", {\n page: ContainerIdSchema,\n section: SectionIdSchema,\n at: PositionSchema,\n block: BlockSchema,\n /** Grid placement when inserting into a grid section (auto-placed at the bottom if absent). */\n place: GridItemSchema.optional(),\n /** Exact grid rows to set afterwards (used by inverses); otherwise rows auto-grow to fit. */\n rows: RowsSchema.optional(),\n});\n\nexport const BlockMoveOpSchema = op(\"block.move\", {\n page: ContainerIdSchema,\n block: BlockIdSchema,\n to: z.strictObject({\n section: SectionIdSchema,\n at: PositionSchema,\n /** Grid placement in the destination (kept/auto-placed if absent). */\n place: GridItemSchema.optional(),\n /** Stack column in the destination; `null` removes it. */\n column: z.int().min(0).max(3).nullable().optional(),\n /** Exact rows for the destination grid (used by inverses). */\n rows: RowsSchema.optional(),\n }),\n /** Exact rows for the source grid section after the block leaves (used by inverses). */\n fromRows: RowsSchema.optional(),\n});\n\nexport const BlockDeleteOpSchema = op(\"block.delete\", {\n page: ContainerIdSchema,\n block: BlockIdSchema,\n /** Exact rows for the grid section afterwards (used by inverses). */\n rows: RowsSchema.optional(),\n});\n\nexport const GridPlaceOpSchema = op(\"grid.place\", {\n page: ContainerIdSchema,\n section: SectionIdSchema,\n block: BlockIdSchema,\n bp: BreakpointSchema,\n /** The placement; `null` removes a tablet/mobile override (desktop is required). */\n rect: GridRectSchema.nullable(),\n /** Exact rows to set (used by inverses); otherwise rows auto-grow to fit the placement. */\n rows: RowsSchema.optional(),\n});\n\nexport const SectionInsertOpSchema = op(\"section.insert\", {\n page: PageIdSchema,\n at: PositionSchema,\n section: SectionSchema,\n});\n\nexport const SectionMoveOpSchema = op(\"section.move\", {\n page: PageIdSchema,\n section: SectionIdSchema,\n at: PositionSchema,\n});\n\nexport const SectionDeleteOpSchema = op(\"section.delete\", {\n page: PageIdSchema,\n section: SectionIdSchema,\n});\n\n/** Paths into the section (`\"style.colorTheme\"`, `\"layout\"`, `\"label\"`); not `id`/`blocks`. */\nexport const SectionUpdateOpSchema = op(\"section.update\", {\n page: ContainerIdSchema,\n section: SectionIdSchema,\n ...PatchShape,\n});\n\nexport const StylesPatchOpSchema = op(\"styles.patch\", {\n patch: z.strictObject(PatchShape),\n});\n\nexport const PageCreateOpSchema = op(\"page.create\", {\n page: PageSchema,\n /** Optionally replace the navigation tree in the same step (e.g. to add the new page). */\n nav: z.array(NavItemSchema).optional(),\n});\n\n/** Paths into the page (`\"title\"`, `\"slug\"`, `\"seo.description\"`); not `id`/`sections`. */\nexport const PageUpdateOpSchema = op(\"page.update\", {\n page: PageIdSchema,\n ...PatchShape,\n});\n\nexport const PageDeleteOpSchema = op(\"page.delete\", {\n page: PageIdSchema,\n /** Optionally replace the navigation tree in the same step (e.g. to drop links to the page). */\n nav: z.array(NavItemSchema).optional(),\n});\n\nexport const NavUpdateOpSchema = op(\"nav.update\", {\n tree: z.array(NavItemSchema),\n});\n\n/** Paths into `site.json` (`\"title\"`, `\"header.sticky\"`); navigation goes through `nav.update`. */\nexport const SiteUpdateOpSchema = op(\"site.update\", { ...PatchShape });\n\n/** Adds (or replaces) the metadata for a media file. */\nexport const MediaAddOpSchema = op(\"media.add\", {\n path: MediaPathSchema,\n meta: MediaMetaSchema,\n});\n\nexport const MediaRemoveOpSchema = op(\"media.remove\", {\n path: MediaPathSchema,\n});\n\n/** Creates or replaces a collection item (the collection is created if needed). */\nexport const CollectionUpsertOpSchema = op(\"collection.upsert\", {\n collection: CollectionNameSchema,\n item: CollectionItemSchema,\n});\n\nexport const CollectionDeleteOpSchema = op(\"collection.delete\", {\n collection: CollectionNameSchema,\n slug: SlugSchema,\n /**\n * Keep the collection's (now empty) entry. By default a collection with no items left is\n * removed from `collections` (its settings in `collectionConfigs` are untouched).\n */\n keepEmpty: z.boolean().optional(),\n});\n\n/** Creates, replaces or (with `config: null`) removes a collection's `_collection.json`. */\nexport const CollectionConfigUpsertOpSchema = op(\"collectionConfig.upsert\", {\n collection: CollectionNameSchema,\n config: CollectionConfigSchema.nullable(),\n /** With `config: null`: keep an empty `collectionConfigs` object instead of dropping it. */\n keepEmpty: z.boolean().optional(),\n});\n\nexport const OpSchema = z.discriminatedUnion(\"op\", [\n BlockUpdateOpSchema,\n BlockInsertOpSchema,\n BlockMoveOpSchema,\n BlockDeleteOpSchema,\n GridPlaceOpSchema,\n SectionInsertOpSchema,\n SectionMoveOpSchema,\n SectionDeleteOpSchema,\n SectionUpdateOpSchema,\n StylesPatchOpSchema,\n PageCreateOpSchema,\n PageUpdateOpSchema,\n PageDeleteOpSchema,\n NavUpdateOpSchema,\n SiteUpdateOpSchema,\n MediaAddOpSchema,\n MediaRemoveOpSchema,\n CollectionUpsertOpSchema,\n CollectionDeleteOpSchema,\n CollectionConfigUpsertOpSchema,\n]);\n\nexport type Op = z.infer<typeof OpSchema>;\nexport type OpType = Op[\"op\"];\nexport type OpOf<T extends OpType> = Extract<Op, { op: T }>;\nexport type BlockUpdateOp = OpOf<\"block.update\">;\nexport type BlockInsertOp = OpOf<\"block.insert\">;\nexport type BlockMoveOp = OpOf<\"block.move\">;\nexport type BlockDeleteOp = OpOf<\"block.delete\">;\nexport type GridPlaceOp = OpOf<\"grid.place\">;\nexport type SectionInsertOp = OpOf<\"section.insert\">;\nexport type SectionMoveOp = OpOf<\"section.move\">;\nexport type SectionDeleteOp = OpOf<\"section.delete\">;\nexport type SectionUpdateOp = OpOf<\"section.update\">;\nexport type StylesPatchOp = OpOf<\"styles.patch\">;\nexport type PageCreateOp = OpOf<\"page.create\">;\nexport type PageUpdateOp = OpOf<\"page.update\">;\nexport type PageDeleteOp = OpOf<\"page.delete\">;\nexport type NavUpdateOp = OpOf<\"nav.update\">;\nexport type SiteUpdateOp = OpOf<\"site.update\">;\nexport type MediaAddOp = OpOf<\"media.add\">;\nexport type MediaRemoveOp = OpOf<\"media.remove\">;\nexport type CollectionUpsertOp = OpOf<\"collection.upsert\">;\nexport type CollectionDeleteOp = OpOf<\"collection.delete\">;\nexport type CollectionConfigUpsertOp = OpOf<\"collectionConfig.upsert\">;\n\n/** Every op type, in vocabulary order. */\nexport const OP_TYPES = OpSchema.options.map((o) => o.shape.op.value) as OpType[];\n\n/** An op without its metadata, as produced by builders before stamping. */\nexport type OpBody<T extends Op = Op> = T extends Op ? Omit<T, keyof OpMeta> : never;\n\n/** Attach metadata to an op body. */\nexport function stamp<T extends Op>(body: OpBody<T>, meta: OpMeta): T {\n return { ...body, id: meta.id, actor: meta.actor, ts: meta.ts } as unknown as T;\n}\n\n/** Parse untrusted JSON (WebSocket, MCP, CLI) into an `Op`. */\nexport function parseOp(\n value: unknown,\n): { ok: true; op: Op } | { ok: false; errors: { path: (string | number)[]; message: string }[] } {\n const r = OpSchema.safeParse(value);\n if (r.success) return { ok: true, op: r.data };\n return {\n ok: false,\n errors: r.error.issues.map((i) => ({\n path: i.path.map((p) => (typeof p === \"symbol\" ? String(p) : p)),\n message: i.message,\n })),\n };\n}\n","/** Small, dependency-free helpers for JSON values and dot-path patches. */\n\nexport type Obj = Record<string, unknown>;\n\nconst FORBIDDEN_SEGMENTS = new Set([\"__proto__\", \"prototype\", \"constructor\"]);\n\n/** The first own key anywhere in a JSON value that could reach a prototype, if any. */\nexport function findForbiddenKey(value: unknown, depth = 0): string | undefined {\n if (depth > 64 || value === null || typeof value !== \"object\") return undefined;\n if (Array.isArray(value)) {\n for (const v of value) {\n const k = findForbiddenKey(v, depth + 1);\n if (k) return k;\n }\n return undefined;\n }\n for (const key of Object.keys(value)) {\n if (FORBIDDEN_SEGMENTS.has(key)) return key;\n const k = findForbiddenKey((value as Obj)[key], depth + 1);\n if (k) return k;\n }\n return undefined;\n}\n\n/** True for object keys that could reach a prototype (rejected in every op). */\nexport function isForbiddenKey(key: string): boolean {\n return FORBIDDEN_SEGMENTS.has(key);\n}\n\n/** True for plain objects (and Immer drafts of them, which proxy a plain object). */\nexport function isPlainObject(value: unknown): value is Obj {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\n/** Structural equality for JSON values (key order ignored, `undefined` keys ignored). */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== typeof b || a === null || b === null) return false;\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (!deepEqual(a[i], b[i])) return false;\n return true;\n }\n if (Array.isArray(b)) return false;\n if (typeof a === \"object\") {\n const ao = a as Obj;\n const bo = b as Obj;\n const ak = Object.keys(ao).filter((k) => ao[k] !== undefined);\n const bk = Object.keys(bo).filter((k) => bo[k] !== undefined);\n if (ak.length !== bk.length) return false;\n for (const k of ak) {\n if (!Object.hasOwn(bo, k) || !deepEqual(ao[k], bo[k])) return false;\n }\n return true;\n }\n return false;\n}\n\n/** A deep copy of a JSON value (drops `undefined` object values). */\nexport function clone<T>(value: T): T {\n if (Array.isArray(value)) return value.map((v) => clone(v)) as T;\n if (isPlainObject(value)) {\n const out: Obj = {};\n for (const [k, v] of Object.entries(value)) if (v !== undefined) out[k] = clone(v);\n return out as T;\n }\n return value;\n}\n\nexport function splitPath(path: string): string[] {\n return path.split(\".\");\n}\n\n/** Problems with a path (forbidden segments) or `undefined` if fine. */\nexport function checkPath(path: string): string | undefined {\n if (path.length === 0) return \"Empty path\";\n for (const seg of splitPath(path)) {\n if (seg.length === 0) return `Empty segment in path \"${path}\"`;\n if (FORBIDDEN_SEGMENTS.has(seg)) return `Forbidden path segment \"${seg}\"`;\n }\n return undefined;\n}\n\n/** True if path `a` equals `b` or is an ancestor of it (segment-wise). */\nexport function isPathPrefix(a: string, b: string): boolean {\n return a === b || b.startsWith(`${a}.`);\n}\n\nexport function pathsOverlap(a: string, b: string): boolean {\n return isPathPrefix(a, b) || isPathPrefix(b, a);\n}\n\n/** Paths in a patch that overlap one another (each reported once). */\nexport function overlappingPaths(paths: readonly string[]): string[] {\n const out = new Set<string>();\n for (let i = 0; i < paths.length; i++)\n for (let j = i + 1; j < paths.length; j++) {\n const a = paths[i] as string;\n const b = paths[j] as string;\n if (pathsOverlap(a, b)) out.add(a.length >= b.length ? a : b);\n }\n return [...out];\n}\n\nexport interface PathLookup {\n /** Whether the full path exists. */\n exists: boolean;\n value: unknown;\n /**\n * The shortest prefix of the path that does not exist (when `exists` is false and the\n * walk only ran through objects), or `undefined` if the walk hit a non-object.\n */\n missingAt?: string;\n /** True if an intermediate segment is not a plain object. */\n blocked: boolean;\n}\n\nexport function lookupPath(root: unknown, path: string): PathLookup {\n const segs = splitPath(path);\n let cur: unknown = root;\n for (let i = 0; i < segs.length; i++) {\n const seg = segs[i] as string;\n if (!isPlainObject(cur)) return { exists: false, value: undefined, blocked: true };\n if (!Object.hasOwn(cur, seg) || cur[seg] === undefined) {\n return {\n exists: false,\n value: undefined,\n missingAt: segs.slice(0, i + 1).join(\".\"),\n blocked: false,\n };\n }\n cur = cur[seg];\n }\n return { exists: true, value: cur, blocked: false };\n}\n\nexport function getPath(root: unknown, path: string): unknown {\n return lookupPath(root, path).value;\n}\n\n/**\n * Set a value at a path on a mutable object (an Immer draft), creating intermediate objects.\n * Throws if an intermediate value exists and is not a plain object.\n */\nexport function setPath(root: Obj, path: string, value: unknown): void {\n const segs = splitPath(path);\n let cur: Obj = root;\n for (let i = 0; i < segs.length - 1; i++) {\n const seg = segs[i] as string;\n const next = cur[seg];\n if (next === undefined) {\n const created: Obj = {};\n cur[seg] = created;\n cur = cur[seg] as Obj;\n } else if (isPlainObject(next)) {\n cur = next as Obj;\n } else {\n throw new Error(`Cannot set \"${path}\": \"${segs.slice(0, i + 1).join(\".\")}\" is not an object`);\n }\n }\n cur[segs[segs.length - 1] as string] = clone(value);\n}\n\n/** Remove the value at a path (no-op if missing). */\nexport function unsetPath(root: Obj, path: string): void {\n const segs = splitPath(path);\n let cur: unknown = root;\n for (let i = 0; i < segs.length - 1; i++) {\n if (!isPlainObject(cur)) return;\n cur = (cur as Obj)[segs[i] as string];\n }\n if (isPlainObject(cur)) delete cur[segs[segs.length - 1] as string];\n}\n\n/** Apply a patch (unset first, then set) to a mutable object. */\nexport function applyPatch(root: Obj, patch: { set?: Obj; unset?: readonly string[] }): void {\n for (const p of patch.unset ?? []) unsetPath(root, p);\n for (const [p, v] of Object.entries(patch.set ?? {})) setPath(root, p, v);\n}\n\n/**\n * The patch that undoes `patch` on `root` (computed before applying). For a set into missing\n * parents, the inverse unsets the shallowest missing ancestor, so the original shape is restored\n * exactly.\n */\nexport function invertPatch(\n root: unknown,\n patch: { set?: Obj; unset?: readonly string[] },\n): { set: Obj; unset: string[] } {\n const set: Obj = {};\n const unset = new Set<string>();\n for (const p of patch.unset ?? []) {\n const l = lookupPath(root, p);\n if (l.exists) set[p] = clone(l.value);\n }\n for (const p of Object.keys(patch.set ?? {})) {\n const l = lookupPath(root, p);\n if (l.exists) set[p] = clone(l.value);\n else if (l.missingAt !== undefined) unset.add(l.missingAt);\n }\n return { set, unset: [...unset] };\n}\n\n/**\n * Leaf-level differences between two objects as a patch: nested plain objects are recursed into,\n * arrays and primitives are compared whole. `skip` lists top-level keys to ignore.\n */\nexport function diffObjects(\n before: Obj,\n after: Obj,\n skip: readonly string[] = [],\n prefix = \"\",\n): { set: Obj; unset: string[] } {\n const set: Obj = {};\n const unset: string[] = [];\n const walk = (a: Obj, b: Obj, base: string, top: boolean) => {\n for (const k of Object.keys(a)) {\n if (top && skip.includes(k)) continue;\n if (a[k] === undefined) continue;\n if (b[k] === undefined) unset.push(base + k);\n }\n for (const k of Object.keys(b)) {\n if (top && skip.includes(k)) continue;\n const bv = b[k];\n if (bv === undefined) continue;\n const av = a[k];\n if (av === undefined) set[base + k] = clone(bv);\n else if (isPlainObject(av) && isPlainObject(bv)) walk(av, bv, `${base + k}.`, false);\n else if (!deepEqual(av, bv)) set[base + k] = clone(bv);\n }\n };\n walk(before, after, prefix, true);\n return { set, unset };\n}\n\nexport function isEmptyPatch(patch: { set?: Obj; unset?: readonly string[] }): boolean {\n return Object.keys(patch.set ?? {}).length === 0 && (patch.unset ?? []).length === 0;\n}\n\n/** All paths a patch touches. */\nexport function patchPaths(patch: { set?: Obj; unset?: readonly string[] }): string[] {\n return [...(patch.unset ?? []), ...Object.keys(patch.set ?? {})];\n}\n\n/**\n * True if `value` survives a JSON round trip unchanged: null, booleans, finite numbers, strings,\n * arrays and plain objects of those (no `undefined`, functions, class instances, NaN).\n */\nexport function isJson(value: unknown, depth = 0): boolean {\n if (depth > 64) return false;\n if (value === null) return true;\n switch (typeof value) {\n case \"boolean\":\n case \"string\":\n return true;\n case \"number\":\n return Number.isFinite(value);\n case \"object\":\n if (Array.isArray(value)) return value.every((v) => isJson(v, depth + 1));\n if (!isPlainObject(value)) return false;\n return Object.values(value).every((v) => isJson(v, depth + 1));\n default:\n return false;\n }\n}\n","import type { Block, NavItem, Page, Section, SiteDocument } from \"@omniharmonic/openspace-schema\";\nimport { apply } from \"./apply\";\nimport { findSection, getPage, locateBlock, locateSection } from \"./doc\";\nimport { type ContainerId, FOOTER, type Op, type OpBody, type OpMeta } from \"./ops\";\nimport { clone, deepEqual, diffObjects, isEmptyPatch, type Obj } from \"./paths\";\n\nexport interface DiffOptions {\n actor?: string;\n ts?: number;\n /** Op ids are `<idPrefix><n>`. */\n idPrefix?: string;\n}\n\n/** Navigation with every reference to `pageId` removed (folders keep their other items). */\nexport function pruneNav(nav: readonly NavItem[], pageId: string): NavItem[] {\n const out: NavItem[] = [];\n for (const item of nav) {\n if (item.type === \"page\" && item.page === pageId) continue;\n if (item.type === \"button\" && item.link.type === \"page\" && item.link.page === pageId) continue;\n if (item.type === \"folder\") {\n const folder = clone(item);\n if (folder.page === pageId) delete folder.page;\n folder.items = folder.items.filter((leaf) => !(leaf.type === \"page\" && leaf.page === pageId));\n out.push(folder);\n continue;\n }\n out.push(clone(item));\n }\n return out;\n}\n\nfunction navRefersTo(nav: readonly NavItem[], pageId: string): boolean {\n return !deepEqual(pruneNav(nav, pageId), nav);\n}\n\n/**\n * Ops that turn `before` into `after` (`applyAll(before, diff(before, after))` equals `after`,\n * except `config`, which ops do not edit). Used by the CLI/local MCP to turn file edits into ops\n * and by the update bot. Ids are matched, so moved blocks/sections become moves, not\n * delete + insert (cross-page moves are delete + insert).\n *\n * Each op is applied to a working copy as it is emitted, so later ops see earlier ones. For\n * ordinary edits every op is individually valid; contrived reshuffles (e.g. swapping two pages'\n * slugs) may pass through an intermediate state that `validate` would reject.\n */\nexport function diff(before: SiteDocument, after: SiteDocument, options: DiffOptions = {}): Op[] {\n const actor = options.actor ?? \"system\";\n const ts = options.ts ?? 0;\n const prefix = options.idPrefix ?? \"diff-\";\n const ops: Op[] = [];\n let work = before;\n const emit = (body: OpBody) => {\n const meta: OpMeta = { id: `${prefix}${ops.length + 1}`, actor, ts };\n const op = { ...body, ...meta } as Op;\n ops.push(op);\n work = apply(work, op);\n };\n\n // Where every section/block lives in `after`.\n const afterSections = new Map<string, ContainerId>();\n const afterBlocks = new Set<string>();\n const noteSection = (container: ContainerId, s: Section) => {\n afterSections.set(s.id, container);\n for (const b of s.blocks) afterBlocks.add(b.id);\n };\n noteSection(FOOTER, after.site.footer);\n for (const page of Object.values(after.pages))\n for (const s of page.sections) noteSection(page.id, s);\n\n // 1. Styles.\n const styles = diffObjects(before.styles as unknown as Obj, after.styles as unknown as Obj);\n if (!isEmptyPatch(styles)) emit({ op: \"styles.patch\", patch: compactPatch(styles) });\n\n // 2. Deleted pages (dropping them from navigation in the same step).\n for (const id of Object.keys(before.pages)) {\n if (Object.hasOwn(after.pages, id)) continue;\n const nav = work.site.nav;\n emit(\n navRefersTo(nav, id)\n ? { op: \"page.delete\", page: id as Page[\"id\"], nav: pruneNav(nav, id) }\n : { op: \"page.delete\", page: id as Page[\"id\"] },\n );\n }\n\n // 3. Content that no longer exists anywhere.\n for (const page of Object.values(work.pages))\n for (const s of [...page.sections])\n if (!afterSections.has(s.id)) emit({ op: \"section.delete\", page: page.id, section: s.id });\n const removeBlock = (id: string) => {\n const loc = locateBlock(work, id);\n if (loc) emit({ op: \"block.delete\", page: loc.container, block: id as Block[\"id\"] });\n };\n const allBlocks = (doc: SiteDocument) => {\n const ids: string[] = doc.site.footer.blocks.map((b) => b.id);\n for (const p of Object.values(doc.pages))\n for (const s of p.sections) for (const b of s.blocks) ids.push(b.id);\n return ids;\n };\n for (const id of allBlocks(work)) if (!afterBlocks.has(id)) removeBlock(id);\n\n // 4. New pages: whole when none of their content exists yet, otherwise empty then filled.\n for (const page of Object.values(after.pages)) {\n if (getPage(work, page.id)) continue;\n const reuses = page.sections.some(\n (s) => locateSection(work, s.id) || s.blocks.some((b) => locateBlock(work, b.id)),\n );\n emit({ op: \"page.create\", page: reuses ? { ...clone(page), sections: [] } : clone(page) });\n }\n\n // 5. Structure: sections in order per page, blocks in order per section.\n const insertWhole = (page: Page[\"id\"], at: number, section: Section) => {\n for (const b of section.blocks) removeBlock(b.id);\n emit({ op: \"section.insert\", page, at, section: clone(section) });\n };\n const needsReplace = (w: Section, s: Section) =>\n w.layout.mode !== s.layout.mode ||\n (w.layout.mode === \"stack\" &&\n s.layout.mode === \"stack\" &&\n w.layout.columns.d.length !== s.layout.columns.d.length);\n\n const syncBlocks = (container: ContainerId, target: Section) => {\n target.blocks.forEach((ab, i) => {\n const cur = liveSection(work, container, target.id);\n const grid = target.layout.mode === \"grid\" ? target.layout : undefined;\n if (cur.blocks[i]?.id !== ab.id) {\n const loc = locateBlock(work, ab.id);\n if (loc && loc.container === container) {\n const to: Extract<OpBody, { op: \"block.move\" }>[\"to\"] = { section: target.id, at: i };\n const item = grid?.items[ab.id];\n if (item) to.place = clone(item);\n if (!grid) to.column = ab.column ?? null;\n emit({ op: \"block.move\", page: container, block: ab.id, to });\n } else {\n if (loc) removeBlock(ab.id);\n const item = grid?.items[ab.id];\n emit({\n op: \"block.insert\",\n page: container,\n section: target.id,\n at: i,\n block: clone(ab),\n ...(item ? { place: clone(item) } : {}),\n });\n }\n }\n // Content of the block.\n const wb = liveSection(work, container, target.id).blocks[i] as Block;\n const set: Record<string, unknown> = {};\n const unset: string[] = [];\n for (const k of Object.keys(wb.fields))\n if (!Object.hasOwn(ab.fields, k) || ab.fields[k] === undefined) unset.push(k);\n for (const [k, v] of Object.entries(ab.fields))\n if (v !== undefined && !deepEqual(wb.fields[k], v)) set[k] = clone(v);\n const upd: Extract<OpBody, { op: \"block.update\" }> = {\n op: \"block.update\",\n page: container,\n block: ab.id,\n };\n if (Object.keys(set).length) upd.set = set;\n if (unset.length) upd.unset = unset;\n if (!deepEqual(wb.variant, ab.variant)) upd.variant = ab.variant ?? null;\n if (!deepEqual(wb.style, ab.style)) upd.style = ab.style ? clone(ab.style) : null;\n if (!deepEqual(wb.column, ab.column)) upd.column = ab.column ?? null;\n if (!deepEqual(wb.label, ab.label)) upd.label = ab.label ?? null;\n if (Boolean(wb.hidden) !== Boolean(ab.hidden)) upd.hidden = ab.hidden ? true : null;\n if (Object.keys(upd).length > 3) emit(upd);\n // Grid placement.\n if (grid) {\n const wl = liveSection(work, container, target.id).layout;\n const witem = wl.mode === \"grid\" ? wl.items[ab.id] : undefined;\n const sitem = grid.items[ab.id];\n if (sitem)\n for (const bp of [\"d\", \"t\", \"m\"] as const) {\n if (deepEqual(witem?.[bp], sitem[bp])) continue;\n const rect = sitem[bp];\n emit({\n op: \"grid.place\",\n page: container,\n section: target.id,\n block: ab.id,\n bp,\n rect: rect ? clone(rect) : null,\n });\n }\n }\n });\n };\n\n // Footer.\n {\n const target = after.site.footer;\n const w = work.site.footer;\n if (w.id !== target.id || needsReplace(w, target)) {\n for (const b of target.blocks) if (!w.blocks.some((x) => x.id === b.id)) removeBlock(b.id);\n emit({ op: \"site.update\", set: { footer: clone(target) } });\n } else syncBlocks(FOOTER, target);\n }\n\n for (const page of Object.values(after.pages)) {\n page.sections.forEach((target, j) => {\n const cur = (getPage(work, page.id) as Page).sections;\n if (cur[j]?.id !== target.id) {\n const loc = locateSection(work, target.id);\n if (loc && loc.container === page.id) {\n emit({ op: \"section.move\", page: page.id, section: target.id, at: j });\n } else {\n if (loc && loc.container !== FOOTER)\n emit({ op: \"section.delete\", page: loc.container, section: target.id });\n insertWhole(page.id, j, target);\n return;\n }\n }\n const w = (getPage(work, page.id) as Page).sections[j] as Section;\n if (needsReplace(w, target)) {\n emit({ op: \"section.delete\", page: page.id, section: target.id });\n insertWhole(page.id, j, target);\n return;\n }\n syncBlocks(page.id, target);\n });\n }\n\n // 6. Section settings (layout rows/columns, style, label…) once membership is final.\n const syncSection = (container: ContainerId, target: Section) => {\n const w = findSection(work, container, target.id)?.section;\n if (!w) return;\n const patch = diffObjects(w as unknown as Obj, target as unknown as Obj, [\"id\", \"blocks\"]);\n if (!isEmptyPatch(patch))\n emit({ op: \"section.update\", page: container, section: target.id, ...compactPatch(patch) });\n };\n syncSection(FOOTER, after.site.footer);\n for (const page of Object.values(after.pages))\n for (const s of page.sections) syncSection(page.id, s);\n\n // 7. Page settings.\n for (const page of Object.values(after.pages)) {\n const w = getPage(work, page.id) as Page;\n const patch = diffObjects(w as unknown as Obj, page as unknown as Obj, [\"id\", \"sections\"]);\n if (!isEmptyPatch(patch)) emit({ op: \"page.update\", page: page.id, ...compactPatch(patch) });\n }\n\n // 8. Site settings and navigation.\n const site = diffObjects(work.site as unknown as Obj, after.site as unknown as Obj, [\n \"nav\",\n \"footer\",\n ]);\n if (!isEmptyPatch(site)) emit({ op: \"site.update\", ...compactPatch(site) });\n if (!deepEqual(work.site.nav, after.site.nav))\n emit({ op: \"nav.update\", tree: clone(after.site.nav) });\n\n // 9. Media.\n for (const path of Object.keys(work.media))\n if (!Object.hasOwn(after.media, path)) emit({ op: \"media.remove\", path });\n for (const [path, meta] of Object.entries(after.media))\n if (!deepEqual(work.media[path], meta)) emit({ op: \"media.add\", path, meta: clone(meta) });\n\n // 10. Collections.\n for (const [name, items] of Object.entries(work.collections)) {\n const keep = after.collections[name];\n const gone = Object.keys(items).filter((slug) => !keep || !Object.hasOwn(keep, slug));\n for (const slug of gone)\n emit({\n op: \"collection.delete\",\n collection: name,\n slug,\n ...(keep ? { keepEmpty: true } : {}),\n });\n }\n for (const [name, items] of Object.entries(after.collections))\n for (const [slug, item] of Object.entries(items))\n if (!deepEqual(work.collections[name]?.[slug], item))\n emit({ op: \"collection.upsert\", collection: name, item: clone(item) });\n\n // 11. Collection settings.\n const wc = work.collectionConfigs ?? {};\n const ac = after.collectionConfigs;\n const goneConfigs = Object.keys(wc).filter((n) => !ac || !Object.hasOwn(ac, n));\n for (const name of goneConfigs)\n emit({\n op: \"collectionConfig.upsert\",\n collection: name,\n config: null,\n ...(ac ? { keepEmpty: true } : {}),\n });\n for (const [name, config] of Object.entries(ac ?? {}))\n if (!deepEqual(wc[name], config))\n emit({ op: \"collectionConfig.upsert\", collection: name, config: clone(config) });\n\n return ops;\n}\n\nfunction compactPatch(patch: { set: Obj; unset: string[] }): { set?: Obj; unset?: string[] } {\n const out: { set?: Obj; unset?: string[] } = {};\n if (Object.keys(patch.set).length) out.set = patch.set;\n if (patch.unset.length) out.unset = patch.unset;\n return out;\n}\n\nfunction liveSection(doc: SiteDocument, container: ContainerId, id: string): Section {\n const loc = findSection(doc, container, id);\n if (!loc) throw new Error(`diff: section ${id} vanished from ${container}`);\n return loc.section;\n}\n","import type { SiteDocument } from \"@omniharmonic/openspace-schema\";\nimport { apply } from \"./apply\";\nimport {\n containerPath,\n copyRows,\n findBlock,\n findSection,\n getPage,\n OpError,\n sectionsOf,\n} from \"./doc\";\nimport type { ContainerId, Op, OpMeta } from \"./ops\";\nimport { clone, invertPatch } from \"./paths\";\n\n/** Drop `undefined` properties so inverse ops are clean JSON. */\nfunction compact<T extends object>(value: T): T {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) if (v !== undefined) out[k] = v;\n return out as T;\n}\n\nfunction need<T>(value: T | undefined, message: string, path: (string | number)[]): T {\n if (value === undefined) throw new OpError(message, path);\n return value;\n}\n\nfunction blockLoc(doc: SiteDocument, page: ContainerId, block: string) {\n need(sectionsOf(doc, page), `Page ${page} does not exist`, containerPath(page));\n return need(findBlock(doc, page, block), `Block ${block} does not exist`, containerPath(page));\n}\n\nfunction sectionLoc(doc: SiteDocument, page: ContainerId, section: string) {\n need(sectionsOf(doc, page), `Page ${page} does not exist`, containerPath(page));\n return need(\n findSection(doc, page, section),\n `Section ${section} does not exist`,\n containerPath(page),\n );\n}\n\n/**\n * The op that undoes `op`. Computed from the document *before* `op` is applied, so\n * `apply(apply(doc, op), invert(doc, op))` equals `doc`. The inverse carries `meta` (default:\n * the original's actor/ts and id `\"<id>:undo\"`). Throws `OpError` if `op` does not apply to `doc`.\n */\nexport function invert(doc: SiteDocument, op: Op, meta?: OpMeta): Op {\n const m: OpMeta = meta ?? { id: `${op.id}:undo`, actor: op.actor, ts: op.ts };\n const body = invertBody(doc, op);\n return { ...body, id: m.id, actor: m.actor, ts: m.ts } as Op;\n}\n\ntype Body = Record<string, unknown> & { op: Op[\"op\"] };\n\nfunction invertBody(doc: SiteDocument, op: Op): Body {\n switch (op.op) {\n case \"block.update\": {\n const { block } = blockLoc(doc, op.page, op.block);\n const set: Record<string, unknown> = {};\n const unset: string[] = [];\n const keys = new Set([...(op.unset ?? []), ...Object.keys(op.set ?? {})]);\n for (const k of keys) {\n if (Object.hasOwn(block.fields, k) && block.fields[k] !== undefined)\n set[k] = clone(block.fields[k]);\n else if (op.set && Object.hasOwn(op.set, k)) unset.push(k);\n }\n return compact({\n op: \"block.update\",\n page: op.page,\n block: op.block,\n set: Object.keys(set).length ? set : undefined,\n unset: unset.length ? unset : undefined,\n variant: op.variant !== undefined ? (block.variant ?? null) : undefined,\n style: op.style !== undefined ? (block.style ? clone(block.style) : null) : undefined,\n column: op.column !== undefined ? (block.column ?? null) : undefined,\n label: op.label !== undefined ? (block.label ?? null) : undefined,\n hidden: op.hidden !== undefined ? (block.hidden ?? null) : undefined,\n });\n }\n case \"block.insert\": {\n const { section } = sectionLoc(doc, op.page, op.section);\n return compact({\n op: \"block.delete\",\n page: op.page,\n block: op.block.id,\n rows: section.layout.mode === \"grid\" ? copyRows(section.layout.rows) : undefined,\n });\n }\n case \"block.delete\": {\n const loc = blockLoc(doc, op.page, op.block);\n const layout = loc.section.layout;\n const item = layout.mode === \"grid\" ? layout.items[op.block] : undefined;\n return compact({\n op: \"block.insert\",\n page: op.page,\n section: loc.section.id,\n at: loc.index,\n block: clone(loc.block),\n place: item ? clone(item) : undefined,\n rows: layout.mode === \"grid\" ? copyRows(layout.rows) : undefined,\n });\n }\n case \"block.move\": {\n const from = blockLoc(doc, op.page, op.block);\n const dest = sectionLoc(doc, op.page, op.to.section).section;\n const src = from.section;\n const same = src.id === dest.id;\n const srcItem = src.layout.mode === \"grid\" ? src.layout.items[op.block] : undefined;\n return compact({\n op: \"block.move\",\n page: op.page,\n block: op.block,\n to: compact({\n section: src.id,\n at: from.index,\n place: srcItem ? clone(srcItem) : undefined,\n column: from.block.column ?? null,\n rows: src.layout.mode === \"grid\" ? copyRows(src.layout.rows) : undefined,\n }),\n fromRows: !same && dest.layout.mode === \"grid\" ? copyRows(dest.layout.rows) : undefined,\n });\n }\n case \"grid.place\": {\n const { section } = sectionLoc(doc, op.page, op.section);\n if (section.layout.mode !== \"grid\")\n throw new OpError(`Section ${op.section} is not a grid section`, containerPath(op.page));\n const item = section.layout.items[op.block];\n const prev = item?.[op.bp];\n return {\n op: \"grid.place\",\n page: op.page,\n section: op.section,\n block: op.block,\n bp: op.bp,\n rect: prev ? clone(prev) : null,\n rows: copyRows(section.layout.rows),\n };\n }\n case \"section.insert\":\n return { op: \"section.delete\", page: op.page, section: op.section.id };\n case \"section.delete\": {\n const loc = sectionLoc(doc, op.page, op.section);\n return { op: \"section.insert\", page: op.page, at: loc.index, section: clone(loc.section) };\n }\n case \"section.move\": {\n const loc = sectionLoc(doc, op.page, op.section);\n return { op: \"section.move\", page: op.page, section: op.section, at: loc.index };\n }\n case \"section.update\": {\n const loc = sectionLoc(doc, op.page, op.section);\n return {\n op: \"section.update\",\n page: op.page,\n section: op.section,\n ...invertPatch(loc.section, op),\n };\n }\n case \"styles.patch\":\n return { op: \"styles.patch\", patch: invertPatch(doc.styles, op.patch) };\n case \"page.create\":\n return compact({\n op: \"page.delete\",\n page: op.page.id,\n nav: op.nav ? clone(doc.site.nav) : undefined,\n });\n case \"page.delete\": {\n const page = need(getPage(doc, op.page), `Page ${op.page} does not exist`, [\n \"pages\",\n op.page,\n ]);\n return compact({\n op: \"page.create\",\n page: clone(page),\n nav: op.nav ? clone(doc.site.nav) : undefined,\n });\n }\n case \"page.update\": {\n const page = need(getPage(doc, op.page), `Page ${op.page} does not exist`, [\n \"pages\",\n op.page,\n ]);\n return { op: \"page.update\", page: op.page, ...invertPatch(page, op) };\n }\n case \"nav.update\":\n return { op: \"nav.update\", tree: clone(doc.site.nav) };\n case \"site.update\":\n return { op: \"site.update\", ...invertPatch(doc.site, op) };\n case \"media.add\": {\n const prev = Object.hasOwn(doc.media, op.path) ? doc.media[op.path] : undefined;\n return prev\n ? { op: \"media.add\", path: op.path, meta: clone(prev) }\n : { op: \"media.remove\", path: op.path };\n }\n case \"media.remove\": {\n const prev = need(\n Object.hasOwn(doc.media, op.path) ? doc.media[op.path] : undefined,\n `Media ${op.path} does not exist`,\n [\"media\", op.path],\n );\n return { op: \"media.add\", path: op.path, meta: clone(prev) };\n }\n case \"collection.upsert\": {\n const items = Object.hasOwn(doc.collections, op.collection)\n ? doc.collections[op.collection]\n : undefined;\n const prev = items && Object.hasOwn(items, op.item.slug) ? items[op.item.slug] : undefined;\n return prev\n ? { op: \"collection.upsert\", collection: op.collection, item: clone(prev) }\n : compact({\n op: \"collection.delete\",\n collection: op.collection,\n slug: op.item.slug,\n keepEmpty: items ? true : undefined,\n });\n }\n case \"collection.delete\": {\n const items = Object.hasOwn(doc.collections, op.collection)\n ? doc.collections[op.collection]\n : undefined;\n const prev = need(\n items && Object.hasOwn(items, op.slug) ? items[op.slug] : undefined,\n `Item ${op.collection}/${op.slug} does not exist`,\n [\"collections\", op.collection, op.slug],\n );\n return { op: \"collection.upsert\", collection: op.collection, item: clone(prev) };\n }\n case \"collectionConfig.upsert\": {\n const configs = doc.collectionConfigs;\n const prev =\n configs && Object.hasOwn(configs, op.collection) ? configs[op.collection] : undefined;\n if (op.config === null) {\n const p = need(prev, `Collection ${op.collection} has no settings`, [\n \"collectionConfigs\",\n op.collection,\n ]);\n return { op: \"collectionConfig.upsert\", collection: op.collection, config: clone(p) };\n }\n return prev\n ? { op: \"collectionConfig.upsert\", collection: op.collection, config: clone(prev) }\n : compact({\n op: \"collectionConfig.upsert\",\n collection: op.collection,\n config: null,\n keepEmpty: configs ? true : undefined,\n });\n }\n default: {\n const never: never = op;\n throw new OpError(`Unknown op ${(never as { op: string }).op}`, [\"op\"]);\n }\n }\n}\n\n/** Inverses for a sequence (each computed against the document state it applies to), reversed. */\nexport function invertAll(doc: SiteDocument, ops: readonly Op[]): Op[] {\n const out: Op[] = [];\n let cur = doc;\n for (const op of ops) {\n out.push(invert(cur, op));\n cur = apply(cur, op);\n }\n return out.reverse();\n}\n","import {\n type Block,\n type BlockRegistry,\n type CollectionItem,\n type NavItem,\n PageSchema,\n SectionSchema,\n type SiteDocument,\n SiteDocumentSchema,\n SiteSchema,\n StylesSchema,\n} from \"@omniharmonic/openspace-schema\";\nimport { produce } from \"immer\";\nimport type { z } from \"zod\";\nimport { mutate } from \"./apply\";\nimport { containerPath, indexIds, OpError, sectionsOf } from \"./doc\";\nimport { type ContainerId, FOOTER, type Op, parseOp } from \"./ops\";\nimport { findForbiddenKey, isJson, isPathPrefix, isPlainObject, patchPaths } from \"./paths\";\n\nexport interface OpIssue {\n path: (string | number)[];\n message: string;\n}\n\nexport type ValidationResult =\n | { ok: true; doc: SiteDocument; warnings: OpIssue[] }\n | { ok: false; errors: OpIssue[] };\n\nexport interface ValidateOptions {\n /** Also validate inserted/updated blocks' fields against their definitions. */\n registry?: BlockRegistry;\n /**\n * Skip parsing the op's shape with `OpSchema` (only for ops constructed in-process by\n * trusted code; anything from the network must be parsed).\n */\n trusted?: boolean;\n}\n\nfunction zodIssues(error: z.ZodError, prefix: (string | number)[]): OpIssue[] {\n return error.issues.map((i) => ({\n path: [...prefix, ...i.path.map((p) => (typeof p === \"symbol\" ? String(p) : p))],\n message: i.message,\n }));\n}\n\n// --- referential checks ----------------------------------------------------------------------\n\n/** Navigation/announcement links that point at pages which do not exist. */\nexport function siteRefIssues(doc: SiteDocument): OpIssue[] {\n const issues: OpIssue[] = [];\n const has = (id: string) => Object.hasOwn(doc.pages, id);\n const checkItem = (item: NavItem | { type: string }, path: (string | number)[]) => {\n const it = item as NavItem;\n if (it.type === \"page\" && !has(it.page))\n issues.push({\n path: [...path, \"page\"],\n message: `Navigation links to missing page ${it.page}`,\n });\n if (it.type === \"folder\") {\n if (it.page && !has(it.page))\n issues.push({\n path: [...path, \"page\"],\n message: `Folder lands on missing page ${it.page}`,\n });\n it.items.forEach((leaf, j) => {\n checkItem(leaf, [...path, \"items\", j]);\n });\n }\n if (it.type === \"button\" && it.link.type === \"page\" && !has(it.link.page))\n issues.push({\n path: [...path, \"link\", \"page\"],\n message: `Button links to missing page ${it.link.page}`,\n });\n };\n doc.site.nav.forEach((item, i) => {\n checkItem(item, [\"site\", \"nav\", i]);\n });\n const link = doc.site.announcement?.link;\n if (link?.type === \"page\" && !has(link.page))\n issues.push({\n path: [\"site\", \"announcement\", \"link\", \"page\"],\n message: `Announcement links to missing page ${link.page}`,\n });\n return issues;\n}\n\n/** Walk a JSON value, calling `visit` for every plain object with its path. */\nfunction walk(\n value: unknown,\n path: (string | number)[],\n visit: (o: Record<string, unknown>, p: (string | number)[]) => void,\n) {\n if (Array.isArray(value)) {\n value.forEach((v, i) => {\n walk(v, [...path, i], visit);\n });\n } else if (isPlainObject(value)) {\n visit(value, path);\n for (const [k, v] of Object.entries(value)) walk(v, [...path, k], visit);\n }\n}\n\n/** Page links inside page content (block fields, SEO…) that point at `pageId`. */\nfunction contentLinksTo(doc: SiteDocument, pageId: string): OpIssue[] {\n const out: OpIssue[] = [];\n const visit = (o: Record<string, unknown>, p: (string | number)[]) => {\n if (o.type === \"page\" && o.page === pageId)\n out.push({ path: p, message: `Links to deleted page ${pageId}` });\n };\n walk(doc.pages, [\"pages\"], visit);\n walk(doc.site.footer, [\"site\", \"footer\"], visit);\n return out;\n}\n\n/** Strings anywhere in content equal to a media path. */\nfunction mediaRefs(doc: SiteDocument, path: string): OpIssue[] {\n const out: OpIssue[] = [];\n const scan = (value: unknown, p: (string | number)[]) => {\n if (typeof value === \"string\") {\n if (value === path) out.push({ path: p, message: `Still references removed media ${path}` });\n } else if (Array.isArray(value)) {\n value.forEach((v, i) => {\n scan(v, [...p, i]);\n });\n } else if (isPlainObject(value)) for (const [k, v] of Object.entries(value)) scan(v, [...p, k]);\n };\n scan(doc.pages, [\"pages\"]);\n scan(doc.site, [\"site\"]);\n scan(doc.collections, [\"collections\"]);\n return out;\n}\n\nfunction slugIssues(doc: SiteDocument, pageId: string): OpIssue[] {\n const page = doc.pages[pageId as keyof SiteDocument[\"pages\"]];\n if (!page) return [];\n for (const other of Object.values(doc.pages)) {\n if (other.id !== pageId && other.slug === page.slug)\n return [\n {\n path: [\"pages\", pageId, \"slug\"],\n message: `Slug \"${page.slug}\" is also used by ${other.id}`,\n },\n ];\n }\n return [];\n}\n\nfunction collectionIssues(doc: SiteDocument, name: string): OpIssue[] {\n const items = Object.values(doc.collections[name] ?? {}) as CollectionItem[];\n const kinds = new Set(items.map((i) => i.kind));\n const out: OpIssue[] = [];\n if (kinds.size > 1)\n out.push({ path: [\"collections\", name], message: `Collection ${name} mixes item kinds` });\n const configKind = doc.collectionConfigs?.[name]?.kind;\n if (configKind && configKind !== \"custom\") {\n for (const item of items)\n if (item.kind !== configKind)\n out.push({\n path: [\"collections\", name, item.slug, \"kind\"],\n message: `Collection ${name} is a ${configKind} collection but ${item.slug} is ${item.kind}`,\n });\n }\n return out;\n}\n\n/** Section/block ids introduced by an op must be new to the whole document. */\nfunction newIdIssues(\n doc: SiteDocument,\n sections: readonly { id: string; blocks: readonly { id: string }[] }[],\n blocks: readonly { id: string }[],\n path: (string | number)[],\n): OpIssue[] {\n const idx = indexIds(doc);\n const out: OpIssue[] = [];\n const seen = new Set<string>();\n const claim = (id: string, kind: \"Section\" | \"Block\", taken: boolean) => {\n if (taken || seen.has(id)) out.push({ path, message: `${kind} id ${id} is already used` });\n seen.add(id);\n };\n for (const s of sections) {\n claim(s.id, \"Section\", idx.sections.has(s.id));\n for (const b of s.blocks) claim(b.id, \"Block\", idx.blocks.has(b.id));\n }\n for (const b of blocks) claim(b.id, \"Block\", idx.blocks.has(b.id));\n return out;\n}\n\n/** Section/block ids must be unique across pages + footer (checked after footer replacement). */\nfunction globalIdIssues(doc: SiteDocument): OpIssue[] {\n const r = SiteDocumentSchema.safeParse(doc);\n if (r.success) return [];\n return zodIssues(r.error, []).filter((i) => /id .* is used in both/.test(i.message));\n}\n\nfunction containerIssues(doc: SiteDocument, container: ContainerId): OpIssue[] {\n if (container === FOOTER) {\n const r = SectionSchema.safeParse(doc.site.footer);\n return r.success ? [] : zodIssues(r.error, [\"site\", \"footer\"]);\n }\n const page = doc.pages[container];\n if (!page) return [{ path: [\"pages\", container], message: `Page ${container} does not exist` }];\n const r = PageSchema.safeParse(page);\n return r.success ? [] : zodIssues(r.error, [\"pages\", container]);\n}\n\nfunction blockIssues(\n registry: BlockRegistry | undefined,\n doc: SiteDocument,\n container: ContainerId,\n ids: readonly string[],\n): OpIssue[] {\n if (!registry || ids.length === 0) return [];\n const want = new Set(ids);\n const out: OpIssue[] = [];\n const base = containerPath(container);\n (sectionsOf(doc, container) ?? []).forEach((s, i) => {\n s.blocks.forEach((b: Block, j) => {\n if (!want.has(b.id)) return;\n const r = registry.validate(b);\n if (!r.success)\n for (const issue of r.issues)\n out.push({\n path: [...base, \"sections\", i, \"blocks\", j, ...issue.path],\n message: issue.message,\n });\n });\n });\n return out;\n}\n\nfunction setValueIssues(op: Op): OpIssue[] {\n const sets: Record<string, unknown>[] = [];\n if (op.op === \"styles.patch\") sets.push(op.patch.set ?? {});\n else if (\n op.op === \"block.update\" ||\n op.op === \"section.update\" ||\n op.op === \"page.update\" ||\n op.op === \"site.update\"\n )\n sets.push(op.set ?? {});\n const out: OpIssue[] = [];\n for (const set of sets)\n for (const [k, v] of Object.entries(set))\n if (v === undefined || !isJson(v))\n out.push({ path: [\"set\", k], message: `Value for \"${k}\" is not plain JSON` });\n return out;\n}\n\n// --- validate --------------------------------------------------------------------------------\n\n/**\n * Validate an op against a document: shape (OpSchema), preconditions (targets exist, positions in\n * range, new ids unique), then the resulting fragment (page, footer, site, styles, item…) against\n * the schema plus referential integrity. On success returns the resulting document and any\n * non-blocking warnings (e.g. content links to a deleted page).\n */\nexport function validate(\n doc: SiteDocument,\n input: Op | unknown,\n options: ValidateOptions = {},\n): ValidationResult {\n const forbidden = findForbiddenKey(input);\n if (forbidden)\n return { ok: false, errors: [{ path: [], message: `Forbidden key \"${forbidden}\"` }] };\n let op: Op;\n if (options.trusted) op = input as Op;\n else {\n const parsed = parseOp(input);\n if (!parsed.ok) return { ok: false, errors: parsed.errors };\n op = parsed.op;\n }\n const valueIssues = setValueIssues(op);\n if (valueIssues.length) return { ok: false, errors: valueIssues };\n\n // Preconditions that need the document before the op.\n const pre: OpIssue[] = [];\n switch (op.op) {\n case \"block.insert\":\n pre.push(...newIdIssues(doc, [], [op.block], [\"block\", \"id\"]));\n break;\n case \"section.insert\":\n pre.push(...newIdIssues(doc, [op.section], [], [\"section\", \"id\"]));\n break;\n case \"page.create\":\n pre.push(...newIdIssues(doc, op.page.sections, [], [\"page\", \"sections\"]));\n break;\n case \"media.add\":\n if (op.meta.path !== op.path)\n pre.push({\n path: [\"meta\", \"path\"],\n message: `Media path ${op.meta.path} does not match ${op.path}`,\n });\n for (const [p, m] of Object.entries(doc.media))\n if (p !== op.path && m.id === op.meta.id)\n pre.push({\n path: [\"meta\", \"id\"],\n message: `Media id ${op.meta.id} is already used by ${p}`,\n });\n break;\n }\n if (pre.length) return { ok: false, errors: pre };\n\n let next: SiteDocument;\n try {\n next = produce(doc, (draft) => {\n mutate(draft as SiteDocument, op);\n });\n } catch (e) {\n if (e instanceof OpError) return { ok: false, errors: [{ path: e.path, message: e.message }] };\n return {\n ok: false,\n errors: [{ path: [], message: e instanceof Error ? e.message : String(e) }],\n };\n }\n\n const errors: OpIssue[] = [];\n const warnings: OpIssue[] = [];\n switch (op.op) {\n case \"block.update\":\n errors.push(\n ...containerIssues(next, op.page),\n ...blockIssues(options.registry, next, op.page, [op.block]),\n );\n break;\n case \"block.insert\":\n errors.push(\n ...containerIssues(next, op.page),\n ...blockIssues(options.registry, next, op.page, [op.block.id]),\n );\n break;\n case \"block.move\":\n case \"block.delete\":\n case \"grid.place\":\n case \"section.move\":\n case \"section.delete\":\n errors.push(...containerIssues(next, op.page));\n break;\n case \"section.update\":\n errors.push(...containerIssues(next, op.page));\n break;\n case \"section.insert\":\n errors.push(\n ...containerIssues(next, op.page),\n ...blockIssues(\n options.registry,\n next,\n op.page,\n op.section.blocks.map((b) => b.id),\n ),\n );\n break;\n case \"page.create\":\n errors.push(\n ...containerIssues(next, op.page.id),\n ...slugIssues(next, op.page.id),\n ...blockIssues(\n options.registry,\n next,\n op.page.id,\n op.page.sections.flatMap((s) => s.blocks.map((b) => b.id)),\n ),\n );\n if (op.nav) errors.push(...siteSchemaIssues(next), ...siteRefIssues(next));\n break;\n case \"page.update\":\n errors.push(...containerIssues(next, op.page));\n if (patchPaths(op).some((p) => isPathPrefix(\"slug\", p)))\n errors.push(...slugIssues(next, op.page));\n break;\n case \"page.delete\":\n if (op.nav) errors.push(...siteSchemaIssues(next));\n errors.push(...siteRefIssues(next));\n warnings.push(...contentLinksTo(next, op.page));\n break;\n case \"nav.update\":\n errors.push(...siteSchemaIssues(next), ...siteRefIssues(next));\n break;\n case \"site.update\":\n errors.push(...siteSchemaIssues(next), ...siteRefIssues(next));\n if (errors.length === 0 && patchPaths(op).some((p) => isPathPrefix(\"footer\", p)))\n errors.push(...globalIdIssues(next));\n break;\n case \"styles.patch\": {\n const r = StylesSchema.safeParse(next.styles);\n if (!r.success) errors.push(...zodIssues(r.error, [\"styles\"]));\n break;\n }\n case \"media.add\":\n break;\n case \"media.remove\":\n warnings.push(...mediaRefs(next, op.path));\n break;\n case \"collection.upsert\":\n case \"collectionConfig.upsert\":\n errors.push(...collectionIssues(next, op.collection));\n break;\n case \"collection.delete\":\n break;\n }\n if (errors.length) return { ok: false, errors };\n return { ok: true, doc: next, warnings };\n}\n\nfunction siteSchemaIssues(doc: SiteDocument): OpIssue[] {\n const r = SiteSchema.safeParse(doc.site);\n return r.success ? [] : zodIssues(r.error, [\"site\"]);\n}\n\n/** Validate a sequence of ops; stops at the first invalid one. */\nexport function validateAll(\n doc: SiteDocument,\n ops: readonly unknown[],\n options: ValidateOptions = {},\n):\n | { ok: true; doc: SiteDocument; warnings: OpIssue[] }\n | { ok: false; index: number; errors: OpIssue[] } {\n let cur = doc;\n const warnings: OpIssue[] = [];\n for (let index = 0; index < ops.length; index++) {\n const r = validate(cur, ops[index], options);\n if (!r.ok) return { ok: false, index, errors: r.errors };\n cur = r.doc;\n warnings.push(...r.warnings);\n }\n return { ok: true, doc: cur, warnings };\n}\n\n/**\n * Full validation of a document: the whole `SiteDocumentSchema` (ids unique, keys match, …),\n * navigation/announcement page references and, with a registry, every block's fields.\n */\nexport function validateDocument(\n doc: unknown,\n options: Pick<ValidateOptions, \"registry\"> = {},\n): ValidationResult {\n const r = SiteDocumentSchema.safeParse(doc);\n if (!r.success) return { ok: false, errors: zodIssues(r.error, []) };\n const errors = siteRefIssues(r.data);\n if (options.registry)\n for (const issue of options.registry.validateDocument(r.data))\n errors.push({ path: issue.path, message: issue.message });\n if (errors.length) return { ok: false, errors };\n return { ok: true, doc: doc as SiteDocument, warnings: [] };\n}\n","import type { SiteDocument } from \"@omniharmonic/openspace-schema\";\nimport { apply } from \"./apply\";\nimport { findBlock, findSection, getPage } from \"./doc\";\nimport { FOOTER, type Op, type Position } from \"./ops\";\nimport { patchPaths, splitPath } from \"./paths\";\nimport { validate } from \"./validate\";\n\n/**\n * Merging concurrent edits (arch §5.3 \"Conflict handling\").\n *\n * Every op is described by the document locations it touches. Ops whose locations are disjoint\n * commute and pass through untouched. When a local (pending) op and a remote (already ordered)\n * op touch the same location:\n *\n * - **Deletes win.** A remote delete of a page/section/block/item drops local edits to it; a\n * local delete survives remote edits (the remote author gets a conflict entry).\n * - **Same-field edits are last-writer-wins** by `(ts, actor)`. If the local op wins it is kept\n * (applied after the remote op, it overwrites); if the remote op wins the overlapping fields\n * are stripped from the local op (dropped entirely when nothing is left).\n *\n * The DraftRoom must run the same function for an incoming op against the ops its sender had not\n * seen, so both sides converge.\n */\n\n/**\n * `edit`/`create`/`delete` drive conflict detection. `order` marks state an op affects that\n * merges deterministically (a list's order, a grid's rows) — never a conflict, but it means the\n * op does not strictly commute with another op touching the same place (see `independent`).\n */\nexport type TouchKind = \"edit\" | \"create\" | \"delete\" | \"order\";\n\nexport interface Touch {\n path: string[];\n kind: TouchKind;\n}\n\nexport interface OpFootprint {\n touches: Touch[];\n /** Locations that must still exist for the op to apply (its page, its target section). */\n requires: string[][];\n}\n\nconst edit = (...path: string[]): Touch => ({ path, kind: \"edit\" });\nconst order = (...path: string[]): Touch => ({ path, kind: \"order\" });\n/** A section's block list and grid layout (rows/items) are affected. */\nconst sectionContent = (section: string) => [\n order(\"section\", section, \"blocks\"),\n order(\"section\", section, \"props\", \"layout\"),\n];\n\nfunction pageReq(page: string): string[][] {\n return page === FOOTER ? [] : [[\"page\", page]];\n}\n\n/**\n * Locations an op touches and depends on. With `doc` (the document the op applies to), ops that\n * only name a block also record the section the block currently sits in.\n */\nexport function footprint(op: Op, doc?: SiteDocument): OpFootprint {\n const fp = baseFootprint(op);\n if (\n doc &&\n (op.op === \"block.update\" ||\n op.op === \"block.move\" ||\n op.op === \"block.delete\" ||\n op.op === \"grid.place\")\n ) {\n const loc = findBlock(doc, op.page, op.block);\n if (loc) {\n // The block's current section must survive (so a concurrent section.delete is a\n // proper \"deleted\" conflict), and moves/deletes reshape its block list.\n fp.requires.push([\"section\", loc.section.id]);\n if (op.op !== \"block.update\" && op.op !== \"grid.place\")\n fp.touches.push(...sectionContent(loc.section.id));\n }\n }\n if (op.op === \"section.delete\") fp.touches.push(order(\"page\", op.page, \"sections\"));\n return fp;\n}\n\nfunction baseFootprint(op: Op): OpFootprint {\n switch (op.op) {\n case \"block.update\": {\n const t: Touch[] = [];\n for (const k of [...(op.unset ?? []), ...Object.keys(op.set ?? {})])\n t.push(edit(\"block\", op.block, \"fields\", k));\n if (op.variant !== undefined) t.push(edit(\"block\", op.block, \"variant\"));\n if (op.style !== undefined) t.push(edit(\"block\", op.block, \"style\"));\n if (op.column !== undefined) t.push(edit(\"block\", op.block, \"column\"));\n if (op.label !== undefined) t.push(edit(\"block\", op.block, \"label\"));\n if (op.hidden !== undefined) t.push(edit(\"block\", op.block, \"hidden\"));\n return { touches: t, requires: pageReq(op.page) };\n }\n case \"block.insert\":\n return {\n touches: [{ path: [\"block\", op.block.id], kind: \"create\" }, ...sectionContent(op.section)],\n requires: [...pageReq(op.page), [\"section\", op.section]],\n };\n case \"block.move\": {\n const t: Touch[] = [\n edit(\"block\", op.block, \"position\"),\n ...sectionContent(op.to.section),\n order(\"block\", op.block, \"section\"),\n ];\n if (op.to.column !== undefined) t.push(edit(\"block\", op.block, \"column\"));\n if (op.to.place) t.push(edit(\"block\", op.block, \"grid\"));\n return { touches: t, requires: [...pageReq(op.page), [\"section\", op.to.section]] };\n }\n case \"block.delete\":\n return {\n touches: [\n { path: [\"block\", op.block], kind: \"delete\" },\n order(\"block\", op.block, \"section\"),\n ],\n requires: pageReq(op.page),\n };\n case \"grid.place\":\n return {\n touches: [\n edit(\"block\", op.block, \"grid\", op.bp),\n order(\"section\", op.section, \"props\", \"layout\", \"rows\"),\n order(\"section\", op.section, \"props\", \"layout\", \"items\", op.block, op.bp),\n ],\n requires: [...pageReq(op.page), [\"section\", op.section]],\n };\n case \"section.insert\":\n return {\n touches: [\n { path: [\"section\", op.section.id], kind: \"create\" },\n order(\"page\", op.page, \"sections\"),\n ],\n requires: pageReq(op.page),\n };\n case \"section.move\":\n return {\n touches: [edit(\"section\", op.section, \"position\"), order(\"page\", op.page, \"sections\")],\n requires: pageReq(op.page),\n };\n case \"section.delete\":\n return {\n touches: [{ path: [\"section\", op.section], kind: \"delete\" }],\n requires: pageReq(op.page),\n };\n case \"section.update\":\n return {\n touches: patchPaths(op).map((p) => edit(\"section\", op.section, \"props\", ...splitPath(p))),\n requires: pageReq(op.page),\n };\n case \"styles.patch\":\n return {\n touches: patchPaths(op.patch).map((p) => edit(\"styles\", ...splitPath(p))),\n requires: [],\n };\n case \"page.create\":\n return {\n touches: [{ path: [\"page\", op.page.id], kind: \"create\" }, ...(op.nav ? [edit(\"nav\")] : [])],\n requires: [],\n };\n case \"page.update\":\n return {\n touches: patchPaths(op).map((p) => edit(\"page\", op.page, \"props\", ...splitPath(p))),\n requires: [],\n };\n case \"page.delete\":\n return {\n touches: [{ path: [\"page\", op.page], kind: \"delete\" }, ...(op.nav ? [edit(\"nav\")] : [])],\n requires: [],\n };\n case \"nav.update\":\n return { touches: [edit(\"nav\")], requires: [] };\n case \"site.update\":\n return { touches: patchPaths(op).map((p) => edit(\"site\", ...splitPath(p))), requires: [] };\n case \"media.add\":\n return { touches: [edit(\"media\", op.path)], requires: [] };\n case \"media.remove\":\n return { touches: [{ path: [\"media\", op.path], kind: \"delete\" }], requires: [] };\n case \"collection.upsert\":\n return { touches: [edit(\"item\", op.collection, op.item.slug)], requires: [] };\n case \"collection.delete\":\n return {\n touches: [{ path: [\"item\", op.collection, op.slug], kind: \"delete\" }],\n requires: [],\n };\n case \"collectionConfig.upsert\":\n return { touches: [edit(\"collectionConfig\", op.collection)], requires: [] };\n }\n}\n\nfunction isPrefix(a: readonly string[], b: readonly string[]): boolean {\n if (a.length > b.length) return false;\n for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;\n return true;\n}\n\nconst overlaps = (a: readonly string[], b: readonly string[]) => isPrefix(a, b) || isPrefix(b, a);\n\n/**\n * True if `a` was written after `b` under last-writer-wins: later `ts`, then greater actor.\n *\n * `ts` comes from the client, so the server (DraftRoom) must stamp or clamp it on receipt —\n * e.g. `ts = min(clientTs, serverNow)` and never earlier than the op it was based on — otherwise\n * a skewed or malicious clock wins every conflict.\n */\nexport function wins(a: { ts: number; actor: string }, b: { ts: number; actor: string }): boolean {\n if (a.ts !== b.ts) return a.ts > b.ts;\n return a.actor >= b.actor;\n}\n\n/**\n * True if two ops touch disjoint locations, so applying them in either order gives the same\n * document. Pass the document they both apply to for precise block-level footprints.\n */\nexport function independent(a: Op, b: Op, doc?: SiteDocument): boolean {\n const fa = footprint(a, doc);\n const fb = footprint(b, doc);\n for (const ta of fa.touches)\n for (const tb of fb.touches) if (overlaps(ta.path, tb.path)) return false;\n for (const r of fa.requires)\n for (const tb of fb.touches) if (tb.kind === \"delete\" && isPrefix(tb.path, r)) return false;\n for (const r of fb.requires)\n for (const ta of fa.touches) if (ta.kind === \"delete\" && isPrefix(ta.path, r)) return false;\n return true;\n}\n\nexport type ConflictReason = \"concurrent-edit\" | \"deleted\" | \"duplicate\" | \"invalid\";\n\nexport interface Conflict {\n /** The local op as submitted. */\n local: Op;\n /** The remote op it collided with (absent for `invalid`). */\n remote?: Op;\n /** Which side's value is kept. */\n winner: \"local\" | \"remote\";\n reason: ConflictReason;\n /** Touched locations in conflict, e.g. `block/blk_…/fields/title`. */\n paths: string[];\n /** Toast copy, e.g. \"Ana changed this too\". */\n message: string;\n}\n\nexport interface RebaseResult {\n /** Local ops transformed to apply after the remote ops (dropped ones removed). */\n ops: Op[];\n conflicts: Conflict[];\n /** Local ops removed entirely. */\n dropped: Op[];\n}\n\nexport interface RebaseOptions {\n /**\n * The common base document both the local and the remote ops were made against (the document\n * before the remote ops). When given, footprints resolve which section each block-level op\n * sits in, so e.g. a remote `section.delete` vs a local edit of a block inside it is reported\n * as a \"deleted\" conflict.\n */\n base?: SiteDocument;\n /**\n * The document after the remote ops. When given, rebased ops are re-validated in order against\n * it (numeric positions are clamped, missing anchors fall back to the end) and ops that no\n * longer apply are dropped with an `invalid` conflict.\n */\n doc?: SiteDocument;\n}\n\n/** Remove the parts of `op` that touch any of `paths`; `null` when nothing is left. */\nfunction strip(op: Op, paths: readonly string[][]): Op | null {\n const hit = (p: string[]) => paths.some((q) => overlaps(p, q));\n const stripPatch = <T extends { set?: Record<string, unknown>; unset?: string[] }>(\n patch: T,\n base: string[],\n ): T | null => {\n const set: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(patch.set ?? {}))\n if (!hit([...base, ...splitPath(k)])) set[k] = v;\n const unset = (patch.unset ?? []).filter((k) => !hit([...base, ...splitPath(k)]));\n if (Object.keys(set).length === 0 && unset.length === 0) return null;\n const out = { ...patch };\n if (Object.keys(set).length) out.set = set;\n else delete out.set;\n if (unset.length) out.unset = unset;\n else delete out.unset;\n return out;\n };\n switch (op.op) {\n case \"block.update\": {\n const base = [\"block\", op.block];\n const fields = stripPatch({ set: op.set, unset: op.unset }, [...base, \"fields\"]);\n const next: Op & { op: \"block.update\" } = { ...op };\n delete next.set;\n delete next.unset;\n if (fields?.set) next.set = fields.set;\n if (fields?.unset) next.unset = fields.unset;\n for (const prop of [\"variant\", \"style\", \"column\", \"label\", \"hidden\"] as const)\n if (next[prop] !== undefined && hit([...base, prop])) delete next[prop];\n const empty =\n next.set === undefined &&\n next.unset === undefined &&\n next.variant === undefined &&\n next.style === undefined &&\n next.column === undefined &&\n next.label === undefined &&\n next.hidden === undefined;\n return empty ? null : next;\n }\n case \"styles.patch\": {\n const patch = stripPatch(op.patch, [\"styles\"]);\n return patch ? { ...op, patch } : null;\n }\n case \"site.update\":\n return stripPatch(op, [\"site\"]);\n case \"page.update\":\n return stripPatch(op, [\"page\", op.page, \"props\"]);\n case \"section.update\":\n return stripPatch(op, [\"section\", op.section, \"props\"]);\n case \"page.create\":\n case \"page.delete\": {\n // Losing the nav race keeps the page change but not the navigation rewrite.\n const own = op.op === \"page.create\" ? op.page.id : op.page;\n if (hit([\"page\", own])) return null;\n const { nav: _nav, ...rest } = op;\n return rest as Op;\n }\n default:\n return null;\n }\n}\n\nconst key = (p: string[]) => p.join(\"/\");\n\n/**\n * Transform `localPending` (ops not yet acknowledged) so they apply after `remoteOps` (ops the\n * authority ordered first). Returns the surviving ops plus conflicts for \"X changed this too\"\n * toasts.\n *\n * Server-side, the DraftRoom runs this for each incoming op against the ops its sender had not\n * seen. The server must stamp/clamp each op's `ts` on receipt (see `wins`) before ordering it.\n */\nexport function rebase(\n localPending: readonly Op[],\n remoteOps: readonly Op[],\n options: RebaseOptions = {},\n): RebaseResult {\n const conflicts: Conflict[] = [];\n const dropped: Op[] = [];\n const kept: Op[] = [];\n const step = (d: SiteDocument | undefined, o: Op) => {\n if (!d) return undefined;\n try {\n return apply(d, o);\n } catch {\n return d;\n }\n };\n let rd = options.base;\n const remotes = remoteOps.map((r) => {\n const fp = footprint(r, rd);\n rd = step(rd, r);\n return { op: r, fp };\n });\n\n let ld = options.base;\n for (const local of localPending) {\n let cur: Op | null = local;\n const localDoc = ld;\n ld = step(ld, local);\n for (const { op: remote, fp: rfp } of remotes) {\n if (!cur) break;\n const lfp = footprint(cur, localDoc);\n // 1. Remote deleted something this op edits or depends on.\n const deletedHits: string[][] = [];\n for (const rt of rfp.touches) {\n if (rt.kind !== \"delete\") continue;\n const dependent =\n lfp.requires.some((r) => isPrefix(rt.path, r)) ||\n lfp.touches.some((lt) => isPrefix(rt.path, lt.path) && lt.kind !== \"create\");\n if (dependent) deletedHits.push(rt.path);\n }\n if (deletedHits.length) {\n const bothDelete = lfp.touches\n .filter((lt) => lt.kind !== \"order\")\n .every((lt) => lt.kind === \"delete\" && deletedHits.some((d) => isPrefix(d, lt.path)));\n if (!bothDelete)\n conflicts.push({\n local,\n remote,\n winner: \"remote\",\n reason: \"deleted\",\n paths: deletedHits.map(key),\n message: `${remote.actor} deleted this`,\n });\n dropped.push(local);\n cur = null;\n break;\n }\n // 2. Overlapping touches.\n const pairs: { l: Touch; r: Touch }[] = [];\n for (const lt of lfp.touches) {\n if (lt.kind === \"order\") continue;\n for (const rt of rfp.touches)\n if (rt.kind !== \"order\" && overlaps(lt.path, rt.path)) pairs.push({ l: lt, r: rt });\n }\n if (pairs.length === 0) continue;\n const paths = [\n ...new Set(pairs.map((p) => key(p.l.path.length >= p.r.path.length ? p.l.path : p.r.path))),\n ];\n if (pairs.some((p) => p.l.kind === \"create\" && p.r.kind === \"create\")) {\n conflicts.push({\n local,\n remote,\n winner: \"remote\",\n reason: \"duplicate\",\n paths,\n message: `${remote.actor} already added this`,\n });\n dropped.push(local);\n cur = null;\n break;\n }\n const localDeletes = pairs.some((p) => p.l.kind === \"delete\");\n if (localDeletes || wins(cur, remote)) {\n conflicts.push({\n local,\n remote,\n winner: \"local\",\n reason: \"concurrent-edit\",\n paths,\n message: `${remote.actor} changed this too`,\n });\n continue;\n }\n conflicts.push({\n local,\n remote,\n winner: \"remote\",\n reason: \"concurrent-edit\",\n paths,\n message: `${remote.actor} changed this too`,\n });\n cur = strip(\n cur,\n pairs.map((p) => p.r.path),\n );\n if (!cur) dropped.push(local);\n }\n if (cur) kept.push(cur);\n }\n\n if (!options.doc) return { ops: kept, conflicts, dropped };\n\n // Re-validate in order against the merged document.\n const ops: Op[] = [];\n let doc = options.doc;\n for (const op of kept) {\n const fixed = normalizePositions(doc, op);\n const r = validate(doc, fixed, { trusted: true });\n if (r.ok) {\n ops.push(fixed);\n doc = r.doc;\n } else {\n dropped.push(op);\n conflicts.push({\n local: op,\n winner: \"remote\",\n reason: \"invalid\",\n paths: [],\n message: r.errors[0]?.message ?? \"This change no longer applies\",\n });\n }\n }\n return { ops, conflicts, dropped };\n}\n\n/** Clamp numeric positions and replace vanished anchors with \"end\". */\nfunction normalizePositions(doc: SiteDocument, op: Op): Op {\n const fix = (ids: string[] | undefined, at: Position): Position => {\n if (!ids) return at;\n if (typeof at === \"number\") return at > ids.length ? \"end\" : at;\n if (typeof at === \"string\") return at;\n const anchor = \"before\" in at ? at.before : at.after;\n return ids.includes(anchor) ? at : \"end\";\n };\n switch (op.op) {\n case \"block.insert\": {\n const s = findSection(doc, op.page, op.section)?.section;\n return {\n ...op,\n at: fix(\n s?.blocks.map((b) => b.id),\n op.at,\n ),\n };\n }\n case \"block.move\": {\n const s = findSection(doc, op.page, op.to.section)?.section;\n const ids = s?.blocks.map((b) => b.id).filter((id) => id !== op.block);\n return { ...op, to: { ...op.to, at: fix(ids, op.to.at) } };\n }\n case \"section.insert\": {\n const p = getPage(doc, op.page);\n return {\n ...op,\n at: fix(\n p?.sections.map((s) => s.id),\n op.at,\n ),\n };\n }\n case \"section.move\": {\n const p = getPage(doc, op.page);\n return {\n ...op,\n at: fix(\n p?.sections.map((s) => s.id).filter((id) => id !== op.section),\n op.at,\n ),\n };\n }\n default:\n return op;\n }\n}\n","import type {\n BlockRegistry,\n ColorTheme,\n Section,\n SiteDocument,\n} from \"@omniharmonic/openspace-schema\";\nimport { findBlock, findSection, locateBlock } from \"./doc\";\nimport { invert } from \"./invert\";\nimport type { Op } from \"./ops\";\nimport { deepEqual, isPathPrefix, isPlainObject, patchPaths } from \"./paths\";\n\n/**\n * Collaborator roles (arch §6.4, PRD). The Hub enforces them on every op it accepts.\n *\n * - **owner**, **designer**: every op.\n * - **editor**: content, pages, navigation, media and collections — but no `styles.patch`, no\n * `grid.place`, no section layout/style/lock changes, no code injection; and on locked\n * sections only text/image field updates; no header settings; new sections only as a preset\n * build or a copy of an existing section's layout and style.\n * - **contributor**: only `collection.upsert` of a draft item (never over a non-draft item, and\n * never over a draft someone else started).\n */\nexport const ROLES = [\"owner\", \"designer\", \"editor\", \"contributor\"] as const;\nexport type Role = (typeof ROLES)[number];\n\nexport type RoleDecision = { allowed: true; op: Op } | { allowed: false; reason: string };\n\nexport interface RoleContext {\n /**\n * The document the op will apply to. Needed to find which section a block-level op touches\n * (and an item's current status for contributors). Without it, Editors are treated as if\n * any block they touch were in a locked section.\n */\n doc?: SiteDocument;\n /**\n * Block definitions: field kinds for locked-section checks. The Hub must pass it; without it\n * only same-shape changes to existing text/image fields are allowed (fail safe).\n */\n registry?: BlockRegistry;\n /** The person submitting the op (user id). Needed for contributor edits to existing items. */\n userId?: string;\n /**\n * Who started a collection item (user id), as recorded by the Hub when the item was created.\n * Contributors may only change existing drafts they started; without this (or `userId`)\n * edits to existing items are denied (fail safe).\n */\n itemAuthor?: (collection: string, slug: string) => string | undefined;\n /**\n * Builds the section a preset (`section.preset`, e.g. `hero/split-image@2`) produces in a color\n * theme, or undefined for an unknown preset or a theme the preset isn't designed for. Editors may\n * only insert sections whose layout and style match a preset build or an existing section\n * (duplicate / paste); without this, only the latter.\n */\n presetSection?: (preset: string, colorTheme: ColorTheme | undefined) => Section | undefined;\n}\n\n/**\n * A section's designer-owned look: its layout (grid rects keyed by block order, since a built or\n * duplicated section has fresh block ids) and its style.\n */\nfunction sectionLook(section: Section): unknown {\n const layout = section.layout;\n if (layout.mode !== \"grid\") return { layout, style: section.style };\n const order = new Map(section.blocks.map((b, i) => [b.id as string, i]));\n const items = Object.entries(layout.items)\n .map(([id, item]) => [order.get(id) ?? -1, item] as const)\n .sort((a, b) => a[0] - b[0]);\n return { layout: { ...layout, items }, style: section.style };\n}\n\n/** True if `section` looks exactly like a preset build or a section already in the document. */\nexport function isKnownSectionLook(section: Section, context: RoleContext): boolean {\n const look = sectionLook(section);\n if (section.preset && context.presetSection) {\n const built = context.presetSection(section.preset, section.style?.colorTheme);\n if (built && deepEqual(sectionLook(built), look)) return true;\n }\n const doc = context.doc;\n if (!doc) return false;\n if (deepEqual(sectionLook(doc.site.footer), look)) return true;\n for (const page of Object.values(doc.pages))\n for (const s of page.sections) if (deepEqual(sectionLook(s), look)) return true;\n return false;\n}\n\n/** Ids of locked sections in a document (pages + footer). */\nexport function lockedSectionsOf(doc: SiteDocument): Set<string> {\n const out = new Set<string>();\n if (doc.site.footer.locked) out.add(doc.site.footer.id);\n for (const page of Object.values(doc.pages))\n for (const s of page.sections) if (s.locked) out.add(s.id);\n return out;\n}\n\nconst CONTENT_KINDS = new Set([\"text\", \"richText\", \"image\"]);\n\nfunction isImageValue(v: unknown): boolean {\n return isPlainObject(v) && typeof v.src === \"string\";\n}\n\ntype Shape = \"string\" | \"doc\" | \"image\" | \"images\" | undefined;\nfunction contentShape(v: unknown): Shape {\n if (typeof v === \"string\") return \"string\";\n if (isPlainObject(v) && v.type === \"doc\" && Array.isArray(v.content)) return \"doc\";\n if (isImageValue(v)) return \"image\";\n if (Array.isArray(v) && v.length > 0 && v.every(isImageValue)) return \"images\";\n return undefined;\n}\n\n/** True if both values are text/image content of the same shape. */\nexport function sameContentShape(before: unknown, after: unknown): boolean {\n const a = contentShape(before);\n return a !== undefined && a === contentShape(after);\n}\n\n/** Shape-based guess: a string, a rich-text doc, an image, or a list of images. */\nexport function isTextOrImageValue(v: unknown): boolean {\n if (typeof v === \"string\") return true;\n if (isPlainObject(v) && v.type === \"doc\" && Array.isArray(v.content)) return true;\n if (isImageValue(v)) return true;\n return Array.isArray(v) && v.length > 0 && v.every(isImageValue);\n}\n\nconst deny = (reason: string): RoleDecision => ({ allowed: false, reason });\n\n/**\n * True if `op` is exactly the undo of `priorOp`: it equals `invert(docBefore, priorOp)` apart from\n * op metadata. `docBefore` is the document `priorOp` was applied to (the server keeps it, or\n * recomputes it from the op log).\n *\n * How the Hub authorizes undo: an inverse can carry fields a role may not send directly (grid\n * placements and rows restoring a deleted block, for instance). When an op arrives, if it\n * `isInverseOf` one of the same actor's own earlier accepted ops — and nothing has touched those\n * locations since (`rebase` it over the intervening ops first) — accept it as an undo; otherwise\n * run `transformForRole` as usual.\n */\nexport function isInverseOf(op: Op, priorOp: Op, docBefore: SiteDocument): boolean {\n let expected: Op;\n try {\n expected = invert(docBefore, priorOp);\n } catch {\n return false;\n }\n const strip = ({ id: _i, actor: _a, ts: _t, ...body }: Op) => body;\n return deepEqual(strip(op), strip(expected));\n}\n\n/**\n * Decide whether `role` may submit `op`.\n *\n * The Hub must pass `context.doc` (and should pass `context.registry`): without them checks fail\n * safe and deny anything that depends on the document (block edits in locked sections, page\n * deletes, contributor saves). Undo ops are authorized separately — see `isInverseOf`. Allowed ops are returned unchanged (ops are never\n * silently rewritten, so what the user sees is what is stored).\n */\nexport function transformForRole(\n op: Op,\n role: Role,\n lockedSections: Iterable<string>,\n context: RoleContext = {},\n): RoleDecision {\n const allow: RoleDecision = { allowed: true, op };\n if (role === \"owner\" || role === \"designer\") return allow;\n const { doc, registry } = context;\n\n if (role === \"contributor\") {\n if (op.op !== \"collection.upsert\")\n return deny(\"Contributors can only create and edit draft collection items\");\n if (op.item.frontmatter.status !== \"draft\")\n return deny(\"Contributors can only save items as drafts; an editor publishes them\");\n if (!doc) return deny(\"Can't check this item without the current document\");\n const existing = doc.collections[op.collection]?.[op.item.slug];\n if (existing && existing.frontmatter.status !== \"draft\")\n return deny(\"This item is already published or scheduled; only editors can change it\");\n if (existing) {\n const author = context.itemAuthor?.(op.collection, op.item.slug);\n if (!context.userId || !author || author !== context.userId)\n return deny(\"Someone else started this draft; only they or an editor can change it\");\n }\n return allow;\n }\n\n if (role !== \"editor\") return deny(`Unknown role ${String(role)}`);\n const locked = new Set(lockedSections);\n /** Section of a block, or undefined if unknown (no doc / not found). */\n const sectionOfBlock = (page: string, block: string): string | undefined => {\n if (!doc) return undefined;\n const loc =\n findBlock(doc, page as Parameters<typeof findBlock>[1], block) ?? locateBlock(doc, block);\n return loc?.section.id;\n };\n const isLocked = (section: string | undefined) => section === undefined || locked.has(section);\n const sectionById = (page: string, id: string) =>\n doc ? findSection(doc, page as Parameters<typeof findSection>[1], id)?.section : undefined;\n const NO_GRID = \"Editors can't reposition blocks on the grid\";\n\n switch (op.op) {\n case \"styles.patch\":\n return deny(\"Editors can't change site styles\");\n case \"grid.place\":\n return deny(\"Editors can't reposition blocks on the grid\");\n case \"section.update\": {\n const paths = patchPaths(op);\n if (paths.some((p) => isPathPrefix(\"layout\", p) || isPathPrefix(\"style\", p)))\n return deny(\"Editors can't change section layout or style\");\n if (paths.some((p) => isPathPrefix(\"locked\", p)))\n return deny(\"Only owners and designers can lock or unlock sections\");\n if (locked.has(op.section)) return deny(\"This section is locked\");\n return allow;\n }\n case \"section.move\":\n case \"section.delete\":\n if (locked.has(op.section)) return deny(\"This section is locked\");\n return allow;\n case \"section.insert\":\n if (op.section.locked) return deny(\"Only owners and designers can lock sections\");\n if (!isKnownSectionLook(op.section, context))\n return deny(\n \"Editors add sections from the section gallery (or duplicate one); its layout and style come from the design\",\n );\n return allow;\n case \"block.insert\":\n if (locked.has(op.section)) return deny(\"This section is locked\");\n if (op.place || op.rows) return deny(NO_GRID);\n return allow;\n case \"block.delete\":\n if (isLocked(sectionOfBlock(op.page, op.block))) return deny(\"This section is locked\");\n if (op.rows) return deny(NO_GRID);\n return allow;\n case \"block.move\": {\n const from = sectionOfBlock(op.page, op.block);\n if (isLocked(from) || locked.has(op.to.section)) return deny(\"This section is locked\");\n if (op.to.place || op.to.rows || op.fromRows) return deny(NO_GRID);\n // Moving into, out of or between grid sections lays the grid out again; reordering inside\n // one grid section keeps placements and is fine.\n if (from !== op.to.section) {\n const src = sectionById(op.page, from as string);\n const dest = sectionById(op.page, op.to.section);\n if (!src || !dest) return deny(\"Can't check this move without the current document\");\n if (src.layout.mode === \"grid\" || dest.layout.mode === \"grid\") return deny(NO_GRID);\n }\n return allow;\n }\n case \"block.update\": {\n const section = sectionOfBlock(op.page, op.block);\n if (!isLocked(section)) return allow;\n if (\n op.variant !== undefined ||\n op.style !== undefined ||\n op.column !== undefined ||\n op.label !== undefined ||\n op.hidden !== undefined\n )\n return deny(\"This section is locked: only its text and images can change\");\n if (op.unset?.length) return deny(\"This section is locked: fields can't be removed\");\n const block = doc ? findBlock(doc, op.page, op.block)?.block : undefined;\n if (!block) return deny(\"Can't check this edit without the current document\");\n const def = registry?.get(block.type);\n for (const [key, value] of Object.entries(op.set ?? {})) {\n const kind = def?.meta.fields[key]?.kind;\n // With a registry the field kind is authoritative. Without one (fail safe), only an\n // existing field may change, and only to a value of the same text/image shape.\n const ok = def\n ? kind !== undefined && CONTENT_KINDS.has(kind)\n : block.fields[key] !== undefined && sameContentShape(block.fields[key], value);\n if (!ok) return deny(`This section is locked: \"${key}\" is not a text or image field`);\n }\n return allow;\n }\n case \"site.update\": {\n const paths = patchPaths(op);\n if (paths.some((p) => /^(customCss|headInjection|footerInjection)(\\.|$)/.test(p)))\n return deny(\"Editors can't change custom code\");\n if (paths.some((p) => isPathPrefix(\"footer\", p)))\n return deny(\"Editors change the footer through its blocks\");\n if (paths.some((p) => isPathPrefix(\"header\", p)))\n return deny(\"Editors can't change the header layout; ask a designer\");\n return allow;\n }\n case \"page.update\":\n if (patchPaths(op).some((p) => /^(headInjection|footerInjection)(\\.|$)/.test(p)))\n return deny(\"Editors can't change custom code\");\n return allow;\n case \"page.create\":\n if (op.page.headInjection !== undefined || op.page.footerInjection !== undefined)\n return deny(\"Editors can't change custom code\");\n if (op.page.sections.some((s) => s.locked))\n return deny(\"Only owners and designers can lock sections\");\n if (!op.page.sections.every((s) => isKnownSectionLook(s, context)))\n return deny(\n \"Editors build pages from the section gallery; layout and style come from the design\",\n );\n return allow;\n case \"page.delete\": {\n const page = doc?.pages[op.page];\n if (!page) return deny(\"Can't check this page without the current document\");\n if (page.sections.some((s) => s.locked || locked.has(s.id)))\n return deny(\"This page has locked sections; only owners and designers can delete it\");\n return allow;\n }\n default:\n // nav.update, media.*, collection.*, collectionConfig.upsert\n return allow;\n }\n}\n","import type { SiteDocument } from \"@omniharmonic/openspace-schema\";\nimport { FOOTER, type Op } from \"./ops\";\nimport { patchPaths } from \"./paths\";\n\n/** Counts behind a change summary (publish dialog, commit message, \"what changed\" lists). */\nexport interface ChangeStats {\n ops: number;\n /** Ids of existing pages whose content or settings changed (not created/deleted ones). */\n pagesEdited: string[];\n pagesCreated: string[];\n pagesDeleted: string[];\n footerEdited: boolean;\n sectionsAdded: number;\n sectionsRemoved: number;\n sectionsMoved: number;\n blocksAdded: number;\n blocksRemoved: number;\n blocksMoved: number;\n /** Distinct blocks whose fields, style or placement changed. */\n blocksEdited: number;\n imagesAdded: number;\n imagesRemoved: number;\n /** Non-image media (video, audio, files). */\n filesAdded: number;\n filesRemoved: number;\n /** Human labels of changed style settings, e.g. \"accent color\", \"fonts\". */\n stylesChanged: string[];\n navChanged: boolean;\n siteSettingsChanged: boolean;\n itemsSaved: number;\n itemsDeleted: number;\n collectionSettingsChanged: number;\n}\n\nconst STYLE_LABELS: Record<string, string> = {\n \"choices.palette.brand\": \"brand color\",\n \"choices.palette\": \"color palette\",\n \"choices.pairing\": \"fonts\",\n \"choices.density\": \"spacing\",\n \"choices.shape\": \"corner style\",\n \"choices.buttons\": \"button style\",\n \"choices.motion\": \"motion\",\n \"choices.imageTreatment\": \"image style\",\n \"overrides.type\": \"typography\",\n \"overrides.font\": \"typography\",\n \"overrides.space\": \"spacing\",\n \"overrides.radius\": \"corner style\",\n};\n\n/** A friendly label for a styles path, e.g. `overrides.color.accent` → \"accent color\". */\nexport function styleLabel(path: string): string {\n const color = /^overrides\\.color\\.([^.]+)/.exec(path);\n if (color) return `${(color[1] as string).replace(/-/g, \" \")} color`;\n let best = \"\";\n for (const prefix of Object.keys(STYLE_LABELS))\n if ((path === prefix || path.startsWith(`${prefix}.`)) && prefix.length > best.length)\n best = prefix;\n return best ? (STYLE_LABELS[best] as string) : \"site styles\";\n}\n\nexport function stats(ops: readonly Op[], doc: SiteDocument): ChangeStats {\n const s: ChangeStats = {\n ops: ops.length,\n pagesEdited: [],\n pagesCreated: [],\n pagesDeleted: [],\n footerEdited: false,\n sectionsAdded: 0,\n sectionsRemoved: 0,\n sectionsMoved: 0,\n blocksAdded: 0,\n blocksRemoved: 0,\n blocksMoved: 0,\n blocksEdited: 0,\n imagesAdded: 0,\n imagesRemoved: 0,\n filesAdded: 0,\n filesRemoved: 0,\n stylesChanged: [],\n navChanged: false,\n siteSettingsChanged: false,\n itemsSaved: 0,\n itemsDeleted: 0,\n collectionSettingsChanged: 0,\n };\n const edited = new Set<string>();\n const created = new Set<string>();\n const deleted = new Set<string>();\n const editedBlocks = new Set<string>();\n const styleLabels = new Set<string>();\n const configs = new Set<string>();\n const touch = (page: string) => {\n if (page === FOOTER) s.footerEdited = true;\n else edited.add(page);\n };\n for (const op of ops) {\n switch (op.op) {\n case \"block.update\":\n case \"grid.place\":\n touch(op.page);\n editedBlocks.add(op.block);\n break;\n case \"block.insert\":\n touch(op.page);\n s.blocksAdded++;\n break;\n case \"block.delete\":\n touch(op.page);\n s.blocksRemoved++;\n break;\n case \"block.move\":\n touch(op.page);\n s.blocksMoved++;\n break;\n case \"section.insert\":\n touch(op.page);\n s.sectionsAdded++;\n break;\n case \"section.delete\":\n touch(op.page);\n s.sectionsRemoved++;\n break;\n case \"section.move\":\n touch(op.page);\n s.sectionsMoved++;\n break;\n case \"section.update\":\n case \"page.update\":\n touch(op.page);\n break;\n case \"styles.patch\":\n for (const p of patchPaths(op.patch)) styleLabels.add(styleLabel(p));\n break;\n case \"page.create\":\n if (deleted.has(op.page.id)) deleted.delete(op.page.id);\n else created.add(op.page.id);\n if (op.nav) s.navChanged = true;\n break;\n case \"page.delete\":\n if (created.has(op.page)) created.delete(op.page);\n else deleted.add(op.page);\n if (op.nav) s.navChanged = true;\n break;\n case \"nav.update\":\n s.navChanged = true;\n break;\n case \"site.update\":\n if (patchPaths(op).some((p) => p === \"footer\" || p.startsWith(\"footer.\")))\n s.footerEdited = true;\n if (patchPaths(op).some((p) => p !== \"footer\" && !p.startsWith(\"footer.\")))\n s.siteSettingsChanged = true;\n break;\n case \"media.add\":\n if (!Object.hasOwn(doc.media, op.path)) {\n if (op.meta.kind === \"image\") s.imagesAdded++;\n else s.filesAdded++;\n }\n break;\n case \"media.remove\": {\n const kind = doc.media[op.path]?.kind;\n if (kind === \"image\") s.imagesRemoved++;\n else s.filesRemoved++;\n break;\n }\n case \"collection.upsert\":\n s.itemsSaved++;\n break;\n case \"collection.delete\":\n s.itemsDeleted++;\n break;\n case \"collectionConfig.upsert\":\n configs.add(op.collection);\n break;\n }\n }\n s.pagesCreated = [...created];\n s.pagesDeleted = [...deleted];\n s.pagesEdited = [...edited].filter((id) => !created.has(id) && !deleted.has(id));\n s.blocksEdited = editedBlocks.size;\n s.stylesChanged = [...styleLabels];\n s.collectionSettingsChanged = configs.size;\n return s;\n}\n\nfunction list(items: readonly string[], max = 3, noun = \"pages\"): string {\n if (items.length === 0) return \"\";\n if (items.length === 1) return items[0] as string;\n if (items.length <= max)\n return `${items.slice(0, -1).join(\", \")} and ${items[items.length - 1] as string}`;\n const rest = items.length - (max - 1);\n return `${items.slice(0, max - 1).join(\", \")} and ${rest} other ${noun}`;\n}\n\nconst count = (n: number, one: string, many = `${one}s`) => `${n} ${n === 1 ? one : many}`;\n\n/**\n * A one-line human summary of a set of ops against the document they apply to, e.g.\n * \"Edited Home and About; added 2 images; changed accent color\".\n */\nexport function summarize(ops: readonly Op[], doc: SiteDocument): string {\n const s = stats(ops, doc);\n const created = new Map<string, string>();\n for (const op of ops) if (op.op === \"page.create\") created.set(op.page.id, op.page.title);\n const title = (id: string) =>\n doc.pages[id as keyof SiteDocument[\"pages\"]]?.title ?? created.get(id) ?? id;\n\n const parts: string[] = [];\n const editedNames = s.pagesEdited.map(title);\n if (s.footerEdited) editedNames.push(\"the footer\");\n if (editedNames.length) parts.push(`edited ${list(editedNames)}`);\n if (s.pagesCreated.length)\n parts.push(\n s.pagesCreated.length <= 2\n ? `added ${s.pagesCreated.length === 1 ? \"page\" : \"pages\"} ${list(s.pagesCreated.map(title))}`\n : `added ${count(s.pagesCreated.length, \"page\")}`,\n );\n if (s.pagesDeleted.length)\n parts.push(\n s.pagesDeleted.length <= 2\n ? `deleted ${s.pagesDeleted.length === 1 ? \"page\" : \"pages\"} ${list(s.pagesDeleted.map(title))}`\n : `deleted ${count(s.pagesDeleted.length, \"page\")}`,\n );\n if (s.imagesAdded) parts.push(`added ${count(s.imagesAdded, \"image\")}`);\n if (s.filesAdded) parts.push(`added ${count(s.filesAdded, \"file\")}`);\n if (s.imagesRemoved) parts.push(`removed ${count(s.imagesRemoved, \"image\")}`);\n if (s.filesRemoved) parts.push(`removed ${count(s.filesRemoved, \"file\")}`);\n if (s.stylesChanged.length) parts.push(`changed ${list(s.stylesChanged, 3, \"styles\")}`);\n if (s.navChanged) parts.push(\"updated navigation\");\n if (s.siteSettingsChanged) parts.push(\"updated site settings\");\n if (s.itemsSaved) parts.push(`saved ${count(s.itemsSaved, \"collection item\")}`);\n if (s.itemsDeleted) parts.push(`deleted ${count(s.itemsDeleted, \"collection item\")}`);\n if (s.collectionSettingsChanged)\n parts.push(`updated settings for ${count(s.collectionSettingsChanged, \"collection\")}`);\n if (parts.length === 0) return \"No changes\";\n const text = parts.join(\"; \");\n return text.charAt(0).toUpperCase() + text.slice(1);\n}\n","/**\n * @omniharmonic/openspace-ops — typed, validated, invertible, mergeable operations over a `SiteDocument`\n * (arch §5.3). Every edit from Studio, the Hub DraftRoom, MCP agents and the CLI is an `Op`.\n */\nexport const name = \"@omniharmonic/openspace-ops\";\n\nexport type { SiteDocument } from \"@omniharmonic/openspace-schema\";\n\nexport * from \"./apply\";\nexport * from \"./diff\";\nexport {\n autoPlace,\n containerPath,\n effectiveRect,\n findBlock,\n findSection,\n indexIds,\n locateBlock,\n locateSection,\n OpError,\n raiseRows,\n resolvePosition,\n sectionsOf,\n usedRows,\n} from \"./doc\";\nexport * from \"./invert\";\nexport * from \"./ops\";\nexport { deepEqual, isJson } from \"./paths\";\nexport * from \"./rebase\";\nexport * from \"./roles\";\nexport * from \"./summarize\";\nexport * from \"./validate\";\n"],"mappings":"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","names":["name","need","key","walk","overlaps","op","op","name","op","PageSchema","SectionSchema","produce","name","r","SectionSchema","PageSchema","op","produce","op","order","op","strip","key","op"]}
package/package.json CHANGED
@@ -1,6 +1,52 @@
1
1
  {
2
2
  "name": "@omniharmonic/openspace-ops",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.0",
4
+ "description": "OpenSpace ops package.",
5
+ "license": "MIT",
6
+ "author": "The OpenSpace contributors",
7
+ "homepage": "https://github.com/omniharmonic/openspace#readme",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/omniharmonic/openspace.git",
11
+ "directory": "packages/ops"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/omniharmonic/openspace/issues"
15
+ },
16
+ "engines": {
17
+ "node": ">=22"
18
+ },
19
+ "type": "module",
20
+ "sideEffects": false,
21
+ "files": [
22
+ "dist",
23
+ "README.md",
24
+ "LICENSE"
25
+ ],
26
+ "exports": {
27
+ ".": {
28
+ "types": "./dist/index.d.ts",
29
+ "default": "./dist/index.js"
30
+ }
31
+ },
32
+ "publishConfig": {
33
+ "access": "public"
34
+ },
35
+ "devDependencies": {
36
+ "@types/node": "^22.18.0",
37
+ "fast-check": "^4.10.2",
38
+ "tsup": "^8.5.0",
39
+ "typescript": "~5.9.3",
40
+ "vitest": "^3.2.4"
41
+ },
42
+ "dependencies": {
43
+ "immer": "^11.2.9",
44
+ "zod": "^4.6.7",
45
+ "@omniharmonic/openspace-schema": "0.1.0"
46
+ },
47
+ "scripts": {
48
+ "build": "tsup",
49
+ "typecheck": "tsc --noEmit",
50
+ "test": "vitest run"
51
+ }
6
52
  }