@ai-matrx/office 0.8.21 → 0.8.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/collab/sheets/transform/types.ts","../src/collab/sheets/transform/registry.ts","../src/collab/sheets/transform/transform.ts","../src/collab/sheets/transform/axis.ts","../src/collab/sheets/transform/formula.ts"],"sourcesContent":["/**\n * Sheet co-editing transforms (C5a): the shapes. Pure data; no Univer import.\n *\n * Convention (COLLAB-DESIGN §6.4): `transform(x, y, side)` returns `x` rewritten to apply AFTER `y`, where\n * `side` is x's side. The later-committed op always takes \"left\": it wins overwrites and sits first on\n * position ties.\n */\n\n/** One allowlisted Univer mutation as it travels: no `unitId` (the receiver re-addresses to its own unit). */\nexport interface SheetMutation {\n readonly id: string;\n readonly params: Readonly<Record<string, unknown>>;\n}\n\n/** A top-level command's mutations, applied in order. The unit the transformer works on. */\nexport type SheetGroup = readonly SheetMutation[];\n\nexport type Side = \"left\" | \"right\";\n\nexport interface Barrier {\n readonly barrier: true;\n readonly reason: string;\n}\n\nexport interface Transformed {\n /** x rewritten to apply after y; `[]` when nothing of x survives. */\n readonly op: SheetMutation[];\n /** Parts of the OTHER op (y) that x overrode: y's author is told (\"Sam changed B4 at the same time\"). */\n readonly lost: string[];\n /** Parts of x itself that cannot apply after y (an edit inside rows y removed): x's author is told. */\n readonly dropped: string[];\n}\n\nexport type TransformResult = Transformed | Barrier;\n\nexport const isBarrier = (r: TransformResult): r is Barrier => (r as Barrier).barrier === true;\n\nexport interface SheetRange {\n startRow: number;\n endRow: number;\n startColumn: number;\n endColumn: number;\n rangeType?: number;\n [k: string]: unknown;\n}\n","/**\n * The sheet mutation registry (COLLAB-DESIGN §10): every mutation id Univer 1.0.4 can emit into a workbook\n * is declared here exactly once, as covered (with its params allowlist), never-travels, or a barrier.\n * `census.test.ts` fails when an emitted id is missing or a declared id is stale.\n *\n * Covered in C5a: cell values and styles, row/column insert, remove and move, merge/unmerge, row height,\n * column width, worksheet name. C5b: formula text in cells (`f`, array `ref`) and defined names. Shared\n * formulas (`si`) stay barriers (see transform.ts cellBarrier); ranged resources are C5c.\n */\n\nexport type SheetFamily = \"cell\" | \"structure\" | \"merge\" | \"size\" | \"name\" | \"defname\" | \"numfmt\" | \"count\" | \"sheet\";\n\nexport interface CoveredEntry {\n readonly kind: \"covered\";\n readonly family: SheetFamily;\n /** The params that travel. `unitId` never travels. */\n readonly allow: readonly string[];\n}\nexport interface NeverEntry {\n readonly kind: \"never-travels\";\n readonly reason: string;\n}\nexport interface BarrierEntry {\n readonly kind: \"barrier\";\n /** The unit that owns its transform (C5c resources) or \"X\" (no unit yet). */\n readonly until: \"C5c\" | \"X\";\n readonly reason: string;\n}\nexport type RegistryEntry = CoveredEntry | NeverEntry | BarrierEntry;\n\nconst covered = (family: SheetFamily, ...allow: string[]): CoveredEntry => ({ kind: \"covered\", family, allow: [\"subUnitId\", ...allow] });\nconst never = (reason: string): NeverEntry => ({ kind: \"never-travels\", reason });\nconst barrier = (until: BarrierEntry[\"until\"], reason: string): BarrierEntry => ({ kind: \"barrier\", until, reason });\n\nconst FORMULA_RESULT = \"formula engine output; every seat computes it (dropped at capture)\";\nconst RESOURCE = \"ranged resource keyed by id; C5c\";\nconst UNIVER_COMMENTS = \"Univer's own thread-comment store; our comments anchor elsewhere (design §8)\";\n\nexport const SHEET_MUTATIONS: Readonly<Record<string, RegistryEntry>> = {\n // ── covered (C5a) ────────────────────────────────────────────────────────────────────────────────\n \"sheet.mutation.set-range-values\": covered(\"cell\", \"cellValue\", \"refSheets\", \"derived\"),\n \"sheet.mutation.insert-row\": covered(\"structure\", \"range\", \"rowInfo\"),\n \"sheet.mutation.remove-rows\": covered(\"structure\", \"range\"),\n \"sheet.mutation.insert-col\": covered(\"structure\", \"range\", \"colInfo\"),\n \"sheet.mutation.remove-col\": covered(\"structure\", \"range\"),\n \"sheet.mutation.move-rows\": covered(\"structure\", \"sourceRange\", \"targetRange\"),\n \"sheet.mutation.move-columns\": covered(\"structure\", \"sourceRange\", \"targetRange\"),\n \"sheet.mutation.add-worksheet-merge\": covered(\"merge\", \"ranges\"),\n \"sheet.mutation.remove-worksheet-merge\": covered(\"merge\", \"ranges\"),\n \"sheet.mutation.set-worksheet-row-height\": covered(\"size\", \"ranges\", \"rowHeight\"),\n \"sheet.mutation.set-worksheet-row-is-auto-height\": covered(\"size\", \"ranges\", \"autoHeightInfo\"),\n \"sheet.mutation.set-worksheet-row-auto-height\": covered(\"size\", \"rowsAutoHeightInfo\"),\n \"sheet.mutation.set-worksheet-col-width\": covered(\"size\", \"ranges\", \"colWidth\"),\n \"sheet.mutation.set-worksheet-name\": covered(\"name\", \"name\"),\n // ── covered (C5c) ────────────────────────────────────────────────────────────────────────────────\n \"sheet.mutation.set.numfmt\": covered(\"numfmt\", \"values\", \"refMap\"),\n \"sheet.mutation.remove.numfmt\": covered(\"numfmt\", \"ranges\"),\n \"sheet.mutation.set-worksheet-row-count\": covered(\"count\", \"rowCount\"),\n \"sheet.mutation.set-worksheet-column-count\": covered(\"count\", \"columnCount\"),\n \"sheet.mutation.insert-sheet\": covered(\"sheet\", \"index\", \"sheet\"),\n \"sheet.mutation.remove-sheet\": covered(\"sheet\", \"sheetIndex\", \"sheetsLeft\"),\n \"sheet.mutation.set-worksheet-order\": covered(\"sheet\", \"fromOrder\", \"toOrder\"),\n\n // ── never travels ────────────────────────────────────────────────────────────────────────────────\n \"formula.mutation.set-formula-calculation-start\": never(FORMULA_RESULT),\n \"formula.mutation.set-trigger-formula-calculation-start\": never(FORMULA_RESULT),\n \"formula.mutation.set-formula-calculation-stop\": never(FORMULA_RESULT),\n \"formula.mutation.set-formula-calculation-notification\": never(FORMULA_RESULT),\n \"formula.mutation.set-formula-calculation-result\": never(FORMULA_RESULT),\n \"formula.mutation.set-array-formula-data\": never(FORMULA_RESULT),\n \"formula.mutation.set-formula-data\": never(FORMULA_RESULT),\n \"formula.mutation.set-image-formula-data\": never(FORMULA_RESULT),\n \"formula.mutation.set-formula-string-batch-calculation\": never(FORMULA_RESULT),\n \"formula.mutation.set-formula-string-batch-calculation-result\": never(FORMULA_RESULT),\n \"formula.mutation.set-formula-dependency-calculation\": never(FORMULA_RESULT),\n \"formula.mutation.set-formula-dependency-calculation-result\": never(FORMULA_RESULT),\n \"formula.mutation.set-cell-formula-dependency-calculation\": never(FORMULA_RESULT),\n \"formula.mutation.set-cell-formula-dependency-calculation-result\": never(FORMULA_RESULT),\n \"formula.mutation.set-query-formula-dependency\": never(FORMULA_RESULT),\n \"formula.mutation.set-query-formula-dependency-result\": never(FORMULA_RESULT),\n \"formula.mutation.set-query-formula-dependency-all\": never(FORMULA_RESULT),\n \"formula.mutation.set-query-formula-dependency-all-result\": never(FORMULA_RESULT),\n \"formula.mutation.register-function\": never(\"registers a function body on this seat's engine\"),\n \"sheet.mutation.data-validation-formula-mark-dirty\": never(\"dirty mark\"),\n \"sheet.mutation.mark-dirty-filter-change\": never(\"dirty mark\"),\n \"sheet.mutation.re-calc-filter\": never(\"filter recalculation result\"),\n \"sheet.mutation.toggle-note-popup\": never(\"popup state\"),\n \"sheet.operation.clear-drawing-transformer\": never(\"drawing selection handles (declared as a mutation)\"),\n \"sheet.mutation.copy-worksheet-end\": never(\"end marker of a copy; the copy travels as insert-sheet\"),\n \"sheet.mutation.empty\": never(\"no content\"),\n \"thread-comment.mutation.add-comment\": never(UNIVER_COMMENTS),\n \"thread-comment.mutation.update-comment\": never(UNIVER_COMMENTS),\n \"thread-comment.mutation.update-comment-ref\": never(UNIVER_COMMENTS),\n \"thread-comment.mutation.resolve-comment\": never(UNIVER_COMMENTS),\n \"thread-comment.mutation.delete-comment\": never(UNIVER_COMMENTS),\n\n // ── barriers: X (no transform yet, design §10) ───────────────────────────────────────────────────\n \"sheet.mutation.reorder-range\": barrier(\"X\", \"sort: a permutation, not transformed yet\"),\n \"sheet.mutation.move-range\": barrier(\"X\", \"cut-paste carries the sender's cell matrices\"),\n \"sheet.mutation.set-worksheet-hidden\": barrier(\"X\", \"sheet-level setting: not in C5a\"),\n \"sheet.mutation.set-tab-color\": barrier(\"X\", \"sheet-level setting: not in C5a\"),\n \"sheet.mutation.set-workbook-name\": barrier(\"X\", \"workbook-level setting: not in C5a\"),\n \"sheet.mutation.set-worksheet-right-to-left\": barrier(\"X\", \"sheet-level setting: not in C5a\"),\n \"sheet.mutation.toggle-gridlines\": barrier(\"X\", \"sheet-level setting: not in C5a\"),\n \"sheet.mutation.set-gridlines-color\": barrier(\"X\", \"sheet-level setting: not in C5a\"),\n \"sheet.mutation.set-worksheet-default-style\": barrier(\"X\", \"sheet-level setting: not in C5a\"),\n \"sheet.mutation.set-frozen\": barrier(\"X\", \"absolute frozen indices: not in C5a\"),\n \"sheet.mutation.set-row-data\": barrier(\"X\", \"row properties by index: not in C5a\"),\n \"sheet.mutation.set-col-data\": barrier(\"X\", \"column properties by index: not in C5a\"),\n \"sheet.mutation.set-row-hidden\": barrier(\"X\", \"row visibility: not in C5a\"),\n \"sheet.mutation.set-row-visible\": barrier(\"X\", \"row visibility: not in C5a\"),\n \"sheet.mutation.set-col-hidden\": barrier(\"X\", \"column visibility: not in C5a\"),\n \"sheet.mutation.set-col-visible\": barrier(\"X\", \"column visibility: not in C5a\"),\n \"sheet.mutation.add-range-protection\": barrier(\"X\", \"permissions: not in C5a\"),\n \"sheet.mutation.set-range-protection\": barrier(\"X\", \"permissions: not in C5a\"),\n \"sheet.mutation.delete-range-protection\": barrier(\"X\", \"permissions: not in C5a\"),\n \"sheet.mutation.add-worksheet-protection\": barrier(\"X\", \"permissions: not in C5a\"),\n \"sheet.mutation.set-worksheet-protection\": barrier(\"X\", \"permissions: not in C5a\"),\n \"sheet.mutation.delete-worksheet-protection\": barrier(\"X\", \"permissions: not in C5a\"),\n \"sheet.mutation.set-worksheet-permission-points\": barrier(\"X\", \"permissions: not in C5a\"),\n\n // ── formulas (C5b) ───────────────────────────────────────────────────────────────────────────────\n \"formula.mutation.set-defined-name\": covered(\"defname\", \"id\", \"name\", \"formulaOrRefString\", \"formulaOrRefStringWithPrefix\", \"comment\", \"localSheetId\", \"hidden\", \"refSheets\", \"previousName\", \"derived\"),\n \"formula.mutation.remove-defined-name\": covered(\"defname\", \"id\", \"name\"),\n \"formula.mutation.set-feature-calculation\": barrier(\"X\", \"a plugin's registered calculation (feature id + dependency ranges); no transform yet\"),\n \"formula.mutation.remove-feature-calculation\": barrier(\"X\", \"a plugin's registered calculation; no transform yet\"),\n \"formula.mutation.set-other-formula\": barrier(\"C5c\", \"formulas owned by conditional formats and data validation travel with their rule\"),\n \"formula.mutation.remove-other-formula\": barrier(\"C5c\", \"formulas owned by conditional formats and data validation travel with their rule\"),\n \"formula.mutation.set-super-table\": barrier(\"C5c\", \"table names in structured references belong to tables (C5c)\"),\n \"formula.mutation.remove-super-table\": barrier(\"C5c\", \"table names in structured references belong to tables (C5c)\"),\n \"formula.mutation.set-super-table-option\": barrier(\"C5c\", \"table names in structured references belong to tables (C5c)\"),\n\n // ── barriers until C5c (ranged resources) ────────────────────────────────────────────────────────\n \"sheet.mutation.add-conditional-rule\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.set-conditional-rule\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.delete-conditional-rule\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.move-conditional-rule\": barrier(\"C5c\", \"conditional-format priority (ordered list)\"),\n \"data-validation.mutation.addRule\": barrier(\"C5c\", RESOURCE),\n \"data-validation.mutation.updateRule\": barrier(\"C5c\", RESOURCE),\n \"data-validation.mutation.removeRule\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.set-filter-range\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.set-filter-criteria\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.remove-filter\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.add-table\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.delete-table\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.set-sheet-table\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.set-table-filter\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.move-table\": barrier(\"C5c\", RESOURCE),\n \"sheets.mutation.add-hyper-link\": barrier(\"C5c\", RESOURCE),\n \"sheets.mutation.remove-hyper-link\": barrier(\"C5c\", RESOURCE),\n \"sheets.mutation.update-hyper-link\": barrier(\"C5c\", RESOURCE),\n \"sheets.mutation.update-hyper-link-ref\": barrier(\"C5c\", RESOURCE),\n \"sheets.mutation.update-rich-hyper-link\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.update-note\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.remove-note\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.update-note-position\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.set-drawing-apply\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.set-worksheet-background-image\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.add-range-theme\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.set-range-theme\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.remove-range-theme\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.set-worksheet-range-theme-style\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.remove-worksheet-range-theme-style\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.register-worksheet-range-theme-style\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.unregister-worksheet-range-theme-style\": barrier(\"C5c\", RESOURCE),\n};\n\n/** Keep only the allowlisted params of a covered id; anything else returns null (it does not travel). */\nexport function allowParams(id: string, params: Readonly<Record<string, unknown>>): Record<string, unknown> | null {\n const entry = SHEET_MUTATIONS[id];\n if (!entry || entry.kind !== \"covered\") return null;\n const out: Record<string, unknown> = {};\n for (const f of entry.allow) if (params[f] !== undefined) out[f] = params[f];\n return out;\n}\n","/**\n * The C5a sheet transformer: `transformGroup(x, y, side)` rewrites command group x to apply after group y.\n * Pure: no Univer runtime, no DOM. One rule (COLLAB-DESIGN §6.4): the later-committed op takes \"left\"; it\n * wins overwrites and sits first on position ties. Anything without a proven transform is a Barrier.\n *\n * Covered families: cell values and styles (set-range-values), row/column insert, remove and move,\n * merge/unmerge, row height / column width, worksheet name. See `registry.ts` for every other id.\n *\n * Merges: Univer moves merges two ways when rows or columns change. A listener in MergeCellController shifts\n * merges that sit wholly after the change on EVERY seat (no mutation travels); the command adds explicit\n * remove-merge / add-merge fixups for merges the change cuts through. `mergeThrough` reproduces both, so a\n * merge added concurrently is moved exactly as the command would have moved it.\n */\nimport { adjustRangeOnMutation } from \"@univerjs/sheets\";\nimport { type Axis, type AxisOp, mapIndex, runs, transformAxis } from \"./axis\";\nimport { type FormulaCtx, type RefChange, type RefSheets, REF_ERROR, formulaBarrier, isFormulaText, refSheetsAfter, refSheetsFor, rewriteFormula } from \"./formula\";\nimport { SHEET_MUTATIONS } from \"./registry\";\nimport { type Barrier, type SheetGroup, type SheetMutation, type SheetRange, type Side, type TransformResult, type Transformed, isBarrier } from \"./types\";\n\nexport const SHEET_TRANSFORMER_VERSION = \"c5c-1\";\n\nconst ID = {\n values: \"sheet.mutation.set-range-values\",\n insertRow: \"sheet.mutation.insert-row\",\n removeRows: \"sheet.mutation.remove-rows\",\n insertCol: \"sheet.mutation.insert-col\",\n removeCol: \"sheet.mutation.remove-col\",\n moveRows: \"sheet.mutation.move-rows\",\n moveCols: \"sheet.mutation.move-columns\",\n addMerge: \"sheet.mutation.add-worksheet-merge\",\n removeMerge: \"sheet.mutation.remove-worksheet-merge\",\n rowHeight: \"sheet.mutation.set-worksheet-row-height\",\n rowIsAuto: \"sheet.mutation.set-worksheet-row-is-auto-height\",\n rowAutoHeight: \"sheet.mutation.set-worksheet-row-auto-height\",\n colWidth: \"sheet.mutation.set-worksheet-col-width\",\n name: \"sheet.mutation.set-worksheet-name\",\n setName: \"formula.mutation.set-defined-name\",\n removeName: \"formula.mutation.remove-defined-name\",\n setNumfmt: \"sheet.mutation.set.numfmt\",\n removeNumfmt: \"sheet.mutation.remove.numfmt\",\n rowCount: \"sheet.mutation.set-worksheet-row-count\",\n colCount: \"sheet.mutation.set-worksheet-column-count\",\n insertSheet: \"sheet.mutation.insert-sheet\",\n removeSheet: \"sheet.mutation.remove-sheet\",\n sheetOrder: \"sheet.mutation.set-worksheet-order\",\n} as const;\n\n/**\n * Pairs the fuzz proved divergent (or that have no transform yet), as unordered mutation-id pairs, with the\n * failing seed. Each returns a Barrier until it has its own correct transform under a new proto.\n */\nexport const PAIR_BARRIERS: Readonly<Record<string, { seed: number | null; reason: string }>> = {};\n\nconst pairKey = (a: string, b: string) => (a < b ? `${a}|${b}` : `${b}|${a}`);\nconst barrier = (reason: string): Barrier => ({ barrier: true, reason });\nconst ok = (op: SheetMutation[], lost: string[] = [], dropped: string[] = []): Transformed => ({ op, lost, dropped });\nconst flip = (side: Side): Side => (side === \"left\" ? \"right\" : \"left\");\n\n// ── addressing ──────────────────────────────────────────────────────────────────────────────────────\nconst sheetOf = (m: SheetMutation) => String(m.params.subUnitId ?? \"\");\nfunction colName(c: number): string {\n let s = \"\";\n for (let n = c + 1; n > 0; n = Math.floor((n - 1) / 26)) s = String.fromCharCode(65 + ((n - 1) % 26)) + s;\n return s;\n}\nexport const cellRef = (sheet: string, row: number, col: number) => `${sheet}!${colName(col)}${row + 1}`;\nconst rangeRef = (sheet: string, r: SheetRange) =>\n `${sheet}!${colName(r.startColumn)}${r.startRow + 1}:${colName(r.endColumn)}${r.endRow + 1}`;\n\n// ── structural ops ──────────────────────────────────────────────────────────────────────────────────\ninterface Structural {\n axis: Axis;\n op: AxisOp;\n}\nfunction structuralOf(m: SheetMutation): Structural | null {\n const p = m.params as Record<string, SheetRange | undefined>;\n switch (m.id) {\n case ID.insertRow:\n return { axis: \"row\", op: { kind: \"insert\", at: p.range!.startRow, count: p.range!.endRow - p.range!.startRow + 1 } };\n case ID.removeRows:\n return { axis: \"row\", op: { kind: \"remove\", start: p.range!.startRow, count: p.range!.endRow - p.range!.startRow + 1 } };\n case ID.insertCol:\n return { axis: \"col\", op: { kind: \"insert\", at: p.range!.startColumn, count: p.range!.endColumn - p.range!.startColumn + 1 } };\n case ID.removeCol:\n return { axis: \"col\", op: { kind: \"remove\", start: p.range!.startColumn, count: p.range!.endColumn - p.range!.startColumn + 1 } };\n case ID.moveRows:\n return {\n axis: \"row\",\n op: { kind: \"move\", from: p.sourceRange!.startRow, count: p.sourceRange!.endRow - p.sourceRange!.startRow + 1, to: p.targetRange!.startRow },\n };\n case ID.moveCols:\n return {\n axis: \"col\",\n op: {\n kind: \"move\",\n from: p.sourceRange!.startColumn,\n count: p.sourceRange!.endColumn - p.sourceRange!.startColumn + 1,\n to: p.targetRange!.startColumn,\n },\n };\n default:\n return null;\n }\n}\n\nconst S = (axis: Axis) => (axis === \"row\" ? ([\"startRow\", \"endRow\"] as const) : ([\"startColumn\", \"endColumn\"] as const));\n\nfunction buildStructural(template: SheetMutation, axis: Axis, op: AxisOp): SheetMutation {\n const [a0, a1] = S(axis);\n const p = template.params as Record<string, unknown>;\n if (op.kind === \"move\") {\n const src = p.sourceRange as SheetRange;\n const tgt = p.targetRange as SheetRange;\n return {\n id: template.id,\n params: {\n ...p,\n sourceRange: { ...src, [a0]: op.from, [a1]: op.from + op.count - 1 },\n targetRange: { ...tgt, [a0]: op.to, [a1]: op.to + op.count - 1 },\n },\n };\n }\n const start = op.kind === \"insert\" ? op.at : op.start;\n return { id: template.id, params: { ...p, range: { ...(p.range as SheetRange), [a0]: start, [a1]: start + op.count - 1 } } };\n}\n\n/** The same structural op as a Univer mutation info, normalized to span the whole other axis, for Univer's helper. */\nfunction univerMutationInfo(axis: Axis, op: Exclude<AxisOp, { kind: \"move\" }>) {\n const FULL = { startRow: 0, endRow: Number.MAX_SAFE_INTEGER, startColumn: 0, endColumn: Number.MAX_SAFE_INTEGER };\n const start = op.kind === \"insert\" ? op.at : op.start;\n const range = axis === \"row\" ? { ...FULL, startRow: start, endRow: start + op.count - 1 } : { ...FULL, startColumn: start, endColumn: start + op.count - 1 };\n const id = op.kind === \"insert\" ? (axis === \"row\" ? ID.insertRow : ID.insertCol) : axis === \"row\" ? ID.removeRows : ID.removeCol;\n return { id, params: { unitId: \"\", subUnitId: \"\", range } };\n}\n\n// ── merges ──────────────────────────────────────────────────────────────────────────────────────────\nconst intersects = (a: SheetRange, b: SheetRange) =>\n a.startRow <= b.endRow && b.startRow <= a.endRow && a.startColumn <= b.endColumn && b.startColumn <= a.endColumn;\nconst isSingleCell = (r: SheetRange) => r.startRow === r.endRow && r.startColumn === r.endColumn;\n\n/**\n * Where Univer puts merge `m` when structural op `s` runs, and whether that move is a command fixup (a\n * traveling remove/add pair) rather than the seat-local listener shift. `null` = the merge is gone.\n */\nexport function mergeThrough(s: Structural, m: SheetRange): { range: SheetRange | null; fixup: boolean } {\n const [a0, a1] = S(s.axis);\n const lo = m[a0] as number;\n const hi = m[a1] as number;\n const op = s.op;\n if (op.kind === \"insert\") {\n // Univer's own helper is exact here once the insert spans the whole other axis.\n const fixup = lo < op.at && op.at <= hi;\n return { range: adjustRangeOnMutation(m, univerMutationInfo(s.axis, op)) as SheetRange, fixup };\n }\n if (op.kind === \"remove\") {\n const e = op.start + op.count - 1;\n if (e < lo || op.start > hi) return { range: adjustRangeOnMutation(m, univerMutationInfo(s.axis, op)) as SheetRange, fixup: false };\n // The command's own shrink rule (MergeCellController._handleRemove*Command), then a single cell is no merge.\n if (op.start <= lo && e >= hi) return { range: null, fixup: true };\n const r = { ...m };\n if (op.start >= lo && e <= hi) r[a1] = hi - op.count;\n else if (op.start < lo) {\n r[a0] = op.start;\n r[a1] = hi - op.count;\n } else r[a1] = op.start - 1;\n return { range: isSingleCell(r) ? null : r, fixup: true };\n }\n // move: the listener shifts merges clear of the source; the command moves merges wholly inside it; a merge\n // the source cuts through stays where it is (Univer refuses such moves on the sender's own seat).\n const fe = op.from + op.count - 1;\n if (hi < op.from || lo > fe) {\n const r = { ...m };\n if (op.from < lo && op.to > hi) {\n r[a0] = lo - op.count;\n r[a1] = hi - op.count;\n } else if (op.from > hi && op.to <= lo) {\n r[a0] = lo + op.count;\n r[a1] = hi + op.count;\n }\n return { range: r, fixup: false };\n }\n if (lo >= op.from && hi <= fe) {\n const r = { ...m, [a0]: mapIndex(op, lo)!, [a1]: mapIndex(op, hi)! };\n return { range: r, fixup: true };\n }\n return { range: m, fixup: false };\n}\n\n/**\n * The merge fixups a structural mutation is owed but Univer's command did not make (C5c). The transform's model\n * (`mergeThrough`) is \"every merge the change cuts through is moved by the command\"; Univer 1.0.4 only fixes the\n * merges that intersect the COMMAND's range on the other axis (a `-by-range` call with a partial range, an API\n * call) and only when its ref-range registration is current (it is refreshed on sheet activation, add-merge and\n * structural mutations, never after a content load or a remove-merge). A cut merge it skipped stays where it was on\n * the sender, while every transform moves it: chains of such ops diverged by a column (the session fuzz's\n * column -1 vs 0). Capture therefore completes the command: right BEFORE the structural mutation it removes the\n * cut merges still on the sheet (`remove`, exact, at their pre-change positions), and right AFTER it adds their\n * model positions (`add`). The same shape as Univer's own remove/move fixups, so every transform rule applies.\n * `mergesBefore` = the sheet's merges right before the mutation runs (after the command's own pre-removals).\n */\nexport function mergeFixupsOwed(m: SheetMutation, mergesBefore: readonly SheetRange[]): { remove: SheetRange[]; add: SheetRange[] } | null {\n const st = structuralOf(m);\n if (!st) return null;\n const remove: SheetRange[] = [];\n const add: SheetRange[] = [];\n for (const q of mergesBefore) {\n const t = mergeThrough(st, q);\n if (!t.fixup) continue;\n remove.push({ startRow: q.startRow, endRow: q.endRow, startColumn: q.startColumn, endColumn: q.endColumn, ...(q.rangeType !== undefined ? { rangeType: q.rangeType } : {}) });\n if (t.range) add.push({ ...t.range });\n }\n return remove.length ? { remove, add } : null;\n}\n\n/** True for the six row/column structural mutation ids. */\nexport const isStructuralMutation = (m: SheetMutation) => structuralOf(m) !== null;\n\n/**\n * Rewrites every remove-merge in a group to name the exact merges it removes. Univer removes every merge a\n * range intersects, and the unmerge command sends the SELECTION; a selection does not move the way the\n * merges under it move, so only exact merges transform correctly. `merges` is each sheet's mergeData right\n * before the group (C6 reads it in beforeCommandExecuted). Pure: the group is simulated, not applied.\n */\nexport function exactMergeRemovals(group: SheetGroup, merges: Readonly<Record<string, readonly SheetRange[]>>): SheetMutation[] {\n const sim = new Map<string, SheetRange[]>(Object.entries(merges).map(([k, v]) => [k, v.map((r) => ({ ...r }))]));\n const out: SheetMutation[] = [];\n for (const m of group) {\n const sheet = sheetOf(m);\n const cur = sim.get(sheet) ?? [];\n if (m.id === ID.removeMerge) {\n const hit = cur.filter((q) => mergeRanges(m).some((r) => intersects(r, q)));\n sim.set(sheet, cur.filter((q) => !hit.includes(q)));\n if (hit.length) out.push(withRanges(m, hit.map((r) => ({ ...r }))));\n continue;\n }\n if (m.id === ID.addMerge) sim.set(sheet, [...cur, ...mergeRanges(m).map((r) => ({ ...r }))]);\n const st = structuralOf(m);\n if (st) sim.set(sheet, cur.map((q) => mergeThrough(st, q).range).filter((q): q is SheetRange => q !== null));\n out.push(m);\n }\n return out;\n}\n\nconst mergeRanges = (m: SheetMutation) => (m.params.ranges as SheetRange[] | undefined) ?? [];\nconst withRanges = (m: SheetMutation, ranges: SheetRange[]): SheetMutation => ({ id: m.id, params: { ...m.params, ranges } });\nconst mergeMutation = (id: string, sheet: string, ranges: SheetRange[]): SheetMutation => ({ id, params: { subUnitId: sheet, ranges } });\n\n// ── cells ───────────────────────────────────────────────────────────────────────────────────────────\ntype Cell = Record<string, unknown> | null;\ntype CellMatrix = Record<string, Record<string, Cell>>;\n/** The content slot of a cell. A traveling entry that touches content must carry all of them (see completeCellContent). */\nexport const CONTENT_KEYS = [\"v\", \"t\", \"p\", \"f\", \"si\", \"custom\", \"ref\", \"xf\", \"ft\", \"fd\"] as const;\nconst CONTENT_TOUCH = [\"v\", \"p\", \"f\", \"si\", \"custom\", \"ref\", \"xf\", \"ft\", \"fd\"];\nconst KNOWN_CELL_KEYS = new Set<string>([...CONTENT_KEYS, \"s\"]);\n\n/**\n * Completes a captured cell entry's content slot from the sender's post-state, so content writes are full\n * replacements (an entry that sets `v` alone would otherwise keep a stale `p` on some seats). C6's capture\n * calls this per touched cell with the cell as it stands right after the command.\n */\nexport function completeCellContent(entry: Cell, post: Record<string, unknown> | null | undefined): Cell {\n if (entry === null) return null;\n if (!CONTENT_TOUCH.some((k) => k in entry)) return entry;\n const out: Record<string, unknown> = {};\n for (const k of CONTENT_KEYS) out[k] = post && post[k] !== undefined ? post[k] : null;\n if (out.v === null) delete out.t; // Univer stores no type without a value; t:null is not a content write\n if (\"s\" in entry) out.s = entry.s;\n return out;\n}\n\nfunction cellsOf(m: SheetMutation): CellMatrix {\n return (m.params.cellValue as CellMatrix | undefined) ?? {};\n}\nfunction forEachCell(cells: CellMatrix, fn: (r: number, c: number, v: Cell) => void) {\n for (const r of Object.keys(cells)) for (const c of Object.keys(cells[r] ?? {})) fn(Number(r), Number(c), cells[r]![c] ?? null);\n}\nfunction cellsMutation(template: SheetMutation, cells: CellMatrix): SheetMutation {\n return { id: template.id, params: { ...template.params, cellValue: cells } };\n}\nfunction putCell(cells: CellMatrix, r: number, c: number, v: Cell) {\n (cells[r] ??= {})[c] = v;\n}\nfunction cellsOverlap(a: CellMatrix, b: CellMatrix): boolean {\n for (const r of Object.keys(a)) {\n const br = b[r];\n if (!br) continue;\n for (const c of Object.keys(a[r] ?? {})) if (c in br) return true;\n }\n return false;\n}\nconst isEmptyMatrix = (cells: CellMatrix) => Object.values(cells).every((row) => Object.keys(row).length === 0);\n\n/** Why a set-range-values cannot be transformed by C5a, or null. Cached per mutation object (ops are immutable). */\nconst cellBarrierCache = new WeakMap<SheetMutation, string | null>();\nfunction cellBarrier(m: SheetMutation): string | null {\n const hit = cellBarrierCache.get(m);\n if (hit !== undefined) return hit;\n const why = cellBarrierOf(m);\n cellBarrierCache.set(m, why);\n return why;\n}\nfunction cellBarrierOf(m: SheetMutation): string | null {\n if (m.params.isOverrideStyle) return \"set-range-values with isOverrideStyle (whole-style replace) is not covered\";\n let why: string | null = null;\n forEachCell(cellsOf(m), (_r, _c, v) => {\n if (why || v === null) return;\n for (const k of Object.keys(v)) {\n if (why) break;\n if (!KNOWN_CELL_KEYS.has(k)) why = `cell key \"${k}\" is not covered`;\n else if (k === \"si\" && v.si != null) why = \"shared formula (si): its text lives in a master cell this op does not carry\";\n else if ((k === \"f\" && isFormulaText(v.f)) || (k === \"ref\" && typeof v.ref === \"string\")) why = formulaBarrier(v[k] as string, formulaCtx(m));\n }\n if (typeof v.s === \"string\") why = \"a style id travels (style ids are seat-local; capture must send the style object)\";\n if (!why && CONTENT_TOUCH.some((k) => k in v) && !CONTENT_KEYS.every((k) => k in v || (k === \"t\" && v.v == null)))\n why = \"cell content is not completed (capture must call completeCellContent)\";\n });\n return why;\n}\n\nconst hasContent = (v: Record<string, unknown>) => CONTENT_TOUCH.some((k) => k in v);\nconst contentOf = (v: Record<string, unknown>) => {\n const out: Record<string, unknown> = {};\n for (const k of Object.keys(v)) if (k !== \"s\") out[k] = v[k];\n return out;\n};\nconst richText = (v: Record<string, unknown>) => v.p != null;\n\n/** Style keys of a style object; borders count per side (\"bd.t\", \"bd.b\" …). */\nfunction styleKeys(s: Record<string, unknown>): string[] {\n const out: string[] = [];\n for (const k of Object.keys(s)) {\n if (k === \"bd\" && s.bd && typeof s.bd === \"object\") for (const side of Object.keys(s.bd)) out.push(`bd.${side}`);\n else out.push(k);\n }\n return out;\n}\nfunction withoutStyleKeys(s: Record<string, unknown>, drop: Set<string>): Record<string, unknown> | null {\n const out: Record<string, unknown> = {};\n for (const k of Object.keys(s)) {\n if (k === \"bd\" && s.bd && typeof s.bd === \"object\") {\n const bd: Record<string, unknown> = {};\n for (const side of Object.keys(s.bd)) if (!drop.has(`bd.${side}`)) bd[side] = (s.bd as Record<string, unknown>)[side];\n if (Object.keys(bd).length) out.bd = bd;\n } else if (!drop.has(k)) out[k] = s[k];\n }\n return Object.keys(out).length ? out : null;\n}\n\n/**\n * One cell touched by both x and y (same sheet). Returns x's entry after y as a list of entries applied in\n * order (a later entry re-applies what the other side keeps), plus what each side lost.\n */\nfunction transformCell(X: Cell, Y: Cell, side: Side): { entries: Cell[]; xLost: boolean; yLost: boolean } | string {\n // A null entry deletes the whole cell.\n if (X === null || Y === null) {\n if (side === \"left\") return { entries: [X], xLost: false, yLost: true };\n // x loses: a delete of x becomes delete-then-y; x's write on a cell y deleted is dropped.\n return X === null ? { entries: [null, Y], xLost: true, yLost: false } : { entries: [], xLost: true, yLost: false };\n }\n if ((hasContent(X) && richText(X) && \"s\" in Y) || (hasContent(Y) && richText(Y) && \"s\" in X))\n return \"rich-text content concurrent with a style change on the same cell is not covered\";\n const out: Record<string, unknown> = {};\n let xLost = false;\n let yLost = false;\n // content slot: later wins\n if (hasContent(X)) {\n if (!hasContent(Y) || side === \"left\") Object.assign(out, contentOf(X));\n else xLost = true;\n if (hasContent(Y) && side === \"left\") yLost = true;\n }\n // style slot: per key, later wins; a null style clears every key\n const tail: Cell[] = [];\n if (\"s\" in X) {\n const xs = X.s as Record<string, unknown> | null;\n const ys = \"s\" in Y ? (Y.s as Record<string, unknown> | null) : undefined;\n if (ys === undefined || side === \"left\") {\n if (xs !== undefined) out.s = xs;\n if (ys !== undefined) yLost = true;\n } else if (ys === null) {\n xLost = true; // y cleared every style key after x\n } else if (xs === null) {\n // x cleared styles, y (later) set some: clear, then put y's keys back\n out.s = null;\n tail.push({ s: ys });\n xLost = true;\n } else {\n const kept = withoutStyleKeys(xs, new Set(styleKeys(ys)));\n if (kept) out.s = kept;\n if (styleKeys(xs).length !== styleKeys(kept ?? {}).length) xLost = true;\n }\n }\n return { entries: Object.keys(out).length ? [out, ...tail] : tail, xLost, yLost };\n}\n\nfunction transformCellsOverCells(x: SheetMutation, y: SheetMutation, side: Side): TransformResult {\n if (sheetOf(x) !== sheetOf(y)) return ok([x]);\n const ycells = cellsOf(y);\n if (!cellsOverlap(cellsOf(x), ycells)) return ok([x]); // no shared cell: x is untouched\n const xd = isDerived(x);\n const yd = isDerived(y);\n const eff = derivedSide(x, y, side);\n const passes: CellMatrix[] = [{}];\n const lost: string[] = [];\n const dropped: string[] = [];\n let why: string | null = null;\n forEachCell(cellsOf(x), (r, c, X) => {\n if (why) return;\n const yRow = ycells[r];\n if (!yRow || !(String(c) in yRow)) {\n putCell(passes[0]!, r, c, X);\n return;\n }\n const res = transformCell(X, yRow[c] ?? null, eff);\n if (typeof res === \"string\") {\n why = res;\n return;\n }\n res.entries.forEach((e, i) => putCell((passes[i] ??= {}), r, c, e));\n // a derived rewrite losing is nobody's loss: no notice\n if (res.xLost && !xd) dropped.push(cellRef(sheetOf(x), r, c));\n if (res.yLost && !yd) lost.push(cellRef(sheetOf(x), r, c));\n });\n if (why) return barrier(why);\n const op = passes.filter((p) => !isEmptyMatrix(p)).map((p) => cellsMutation(x, p));\n return ok(op, lost, dropped);\n}\n\n\n// ── formulas (C5b) ──────────────────────────────────────────────────────────────────────────────────\n/** Params that travel for the transformer only; `forApply` strips them before Univer sees the mutation. */\nexport const SIDE_CAR_PARAMS = [\"refSheets\", \"previousName\", \"derived\", \"sheetIndex\", \"sheetsLeft\"] as const;\n\n/**\n * A derived mutation is a formula rewrite a structural op, a rename or a defined-name change carries for\n * formulas that already existed (Univer's interceptors). It never outranks a person's concurrent write to the\n * same cell or name, whichever committed first: the person's write is rewritten by the same change instead.\n */\nconst isDerived = (m: SheetMutation) => m.params.derived === true;\nfunction derivedSide(x: SheetMutation, y: SheetMutation, side: Side): Side {\n const xd = isDerived(x);\n const yd = isDerived(y);\n return xd === yd ? side : xd ? \"right\" : \"left\";\n}\nexport function forApply(m: SheetMutation): SheetMutation {\n if (!SIDE_CAR_PARAMS.some((k) => k in m.params)) return m;\n const params = { ...m.params };\n for (const k of SIDE_CAR_PARAMS) delete params[k];\n return { id: m.id, params };\n}\n\nconst refSheetsOf = (m: SheetMutation) => m.params.refSheets as RefSheets | undefined;\nconst formulaCtx = (m: SheetMutation): FormulaCtx => ({ ownSheet: sheetOf(m), refSheets: refSheetsOf(m) });\nfunction withRefSheets(params: Readonly<Record<string, unknown>>, rs: RefSheets | undefined): Record<string, unknown> {\n const out: Record<string, unknown> = { ...params };\n if (rs) out.refSheets = rs;\n else delete out.refSheets;\n return out;\n}\nconst hasFormulaText = (v: Cell) => !!v && (isFormulaText(v.f) || typeof v.ref === \"string\");\nconst hasFormulaCache = new WeakMap<SheetMutation, boolean>();\nfunction hasFormula(m: SheetMutation): boolean {\n const hit = hasFormulaCache.get(m);\n if (hit !== undefined) return hit;\n const any = hasFormulaOf(m);\n hasFormulaCache.set(m, any);\n return any;\n}\nfunction hasFormulaOf(m: SheetMutation): boolean {\n let any = false;\n forEachCell(cellsOf(m), (_r, _c, v) => {\n any ||= hasFormulaText(v);\n });\n return any;\n}\nconst setNameWithoutPrevious = (m: SheetMutation) => m.id === ID.setName && !(\"previousName\" in m.params);\n\n/** The change a mutation makes to formula text elsewhere, or null. */\nfunction refChangeOf(m: SheetMutation): RefChange | null {\n const st = structuralOf(m);\n if (st) return { kind: \"axis\", sheet: sheetOf(m), axis: st.axis, op: st.op };\n if (m.id === ID.name) return { kind: \"rename\", sheet: sheetOf(m), name: String(m.params.name) };\n if (m.id === ID.removeName) return { kind: \"defined-name\", from: String(m.params.name), to: null };\n if (m.id === ID.setName && typeof m.params.previousName === \"string\" && m.params.previousName !== m.params.name)\n return { kind: \"defined-name\", from: m.params.previousName, to: String(m.params.name) };\n return null;\n}\n\n/** A cell entry's formula text (`f`) and array range (`ref`) after `change`. */\nfunction rewriteEntry(v: Record<string, unknown>, ctx: FormulaCtx, change: RefChange): { entry: Record<string, unknown>; changed: boolean } | string {\n let entry = v;\n let changed = false;\n for (const k of [\"f\", \"ref\"] as const) {\n const t = v[k];\n if (k === \"f\" ? !isFormulaText(t) : typeof t !== \"string\") continue;\n const r = rewriteFormula(t as string, ctx, change);\n if (typeof r === \"string\") return r;\n if (!r.changed) continue;\n if (k === \"ref\" && r.text.includes(REF_ERROR)) return \"an array formula's range was removed under it\";\n entry = { ...entry, [k]: r.text };\n changed = true;\n }\n return { entry, changed };\n}\n\n/** Where cell (r, c) of a mutation on `sheet` lands after `change`; null = removed. */\nfunction cellThrough(sheet: string, change: RefChange, r: number, c: number): [number, number] | null {\n if (change.kind !== \"axis\" || change.sheet !== sheet) return [r, c];\n const nr = change.axis === \"row\" ? mapIndex(change.op, r) : r;\n const nc = change.axis === \"col\" ? mapIndex(change.op, c) : c;\n return nr === null || nc === null ? null : [nr, nc];\n}\n\n/** Cell op x after a structural op, a rename or a defined-name change: cells move, formula text is rewritten. */\nfunction cellsOverChange(x: SheetMutation, change: RefChange): TransformResult {\n // untouched: no formula text and the change is elsewhere (another sheet, a rename, a defined name)\n if (!hasFormula(x) && (change.kind !== \"axis\" || change.sheet !== sheetOf(x))) return ok([x]);\n const ctx = formulaCtx(x);\n const out: CellMatrix = {};\n const dropped: string[] = [];\n let why: string | null = null;\n let changed = false;\n forEachCell(cellsOf(x), (r, c, v) => {\n if (why) return;\n const at = cellThrough(sheetOf(x), change, r, c);\n if (!at) {\n dropped.push(cellRef(sheetOf(x), r, c));\n changed = true;\n return;\n }\n let e = v;\n if (hasFormulaText(v)) {\n const res = rewriteEntry(v!, ctx, change);\n if (typeof res === \"string\") {\n why = res;\n return;\n }\n e = res.entry;\n if (res.changed) changed = true;\n }\n if (at[0] !== r || at[1] !== c) changed = true;\n putCell(out, at[0], at[1], e);\n });\n if (why) return barrier(why);\n const rsAfter = refSheetsAfter(ctx.refSheets, change);\n if (!changed && JSON.stringify(rsAfter ?? null) === JSON.stringify(ctx.refSheets ?? null)) return ok([x]);\n const params = { ...withRefSheets(x.params, rsAfter), cellValue: out };\n return ok(isEmptyMatrix(out) ? [] : [{ id: x.id, params }], [], dropped);\n}\n\n/**\n * The formula rewrites a change owes to cell op y's formulas: what Univer's interceptor would have written had\n * y's formulas been there when the change was made. Placed after the change, at the cells' new positions.\n */\nfunction rewritesOf(y: SheetMutation, change: RefChange): SheetMutation | null | string {\n if (!hasFormula(y)) return null;\n const ctx = formulaCtx(y);\n const out: CellMatrix = {};\n let why: string | null = null;\n forEachCell(cellsOf(y), (r, c, v) => {\n if (why || !hasFormulaText(v)) return;\n const at = cellThrough(sheetOf(y), change, r, c);\n if (!at) return;\n const res = rewriteEntry(v!, ctx, change);\n if (typeof res === \"string\") {\n why = res;\n return;\n }\n if (res.changed) putCell(out, at[0], at[1], contentOf(res.entry));\n });\n if (why) return why;\n if (isEmptyMatrix(out)) return null;\n return { id: ID.values, params: withRefSheets({ subUnitId: sheetOf(y), cellValue: out, derived: true }, refSheetsAfter(ctx.refSheets, change)) };\n}\n\nconst NAME_TEXT_KEYS = [\"formulaOrRefString\", \"formulaOrRefStringWithPrefix\"] as const;\n/** A set-defined-name after a structural op or a rename (sheets-formula UpdateDefinedNameController rules). */\nfunction definedNameThrough(m: SheetMutation, change: RefChange): { op: SheetMutation; changed: boolean } | string {\n if (change.kind === \"defined-name\" || m.id !== ID.setName) return { op: m, changed: false };\n // Univer resolves a defined name's unqualified references against the changed sheet and keeps qualifiers.\n const ctx: FormulaCtx = { ownSheet: change.sheet, refSheets: refSheetsOf(m), keepQualifier: true };\n const params: Record<string, unknown> = { ...m.params };\n let changed = false;\n for (const k of NAME_TEXT_KEYS) {\n if (typeof params[k] !== \"string\" || !params[k]) continue;\n const r = rewriteFormula(params[k] as string, ctx, change);\n if (typeof r === \"string\") return r;\n if (r.changed) {\n params[k] = r.text;\n changed = true;\n }\n }\n return { op: { id: m.id, params: withRefSheets(params, refSheetsAfter(ctx.refSheets, change)) }, changed };\n}\nfunction asDerived(m: SheetMutation): SheetMutation {\n return { id: m.id, params: { ...m.params, derived: true } };\n}\n\n/** Formula-aware pairs (C5b). null = not a formula pair; the C5a rules apply. */\nfunction formulaPair(x: SheetMutation, y: SheetMutation, side: Side): TransformResult | null {\n const fx = familyOf(x.id);\n const fy = familyOf(y.id);\n const SET_NAME_BARRIER = \"set-defined-name without previousName (capture must record the name it replaces) against formula text\";\n if (fx === \"defname\" && fy === \"defname\") {\n if (String(x.params.id) !== String(y.params.id)) return ok([x]);\n const eff = derivedSide(x, y, side);\n if (eff === \"left\") return ok([x], isDerived(y) ? [] : [`defined name \"${String(y.params.name)}\"`]);\n return ok([], [], isDerived(x) ? [] : [`defined name \"${String(x.params.name)}\"`]);\n }\n if (fx === \"defname\") {\n if (fy === \"cell\") {\n if (setNameWithoutPrevious(x) && hasFormula(y)) return barrier(SET_NAME_BARRIER);\n const ch = refChangeOf(x);\n if (!ch) return ok([x]);\n const add = rewritesOf(y, ch);\n if (typeof add === \"string\") return barrier(add);\n return ok(add ? [x, add] : [x]);\n }\n const ch = refChangeOf(y);\n if (!ch) return ok([x]);\n const r = definedNameThrough(x, ch);\n return typeof r === \"string\" ? barrier(r) : ok([r.op]);\n }\n if (fy === \"defname\") {\n if (fx === \"cell\") {\n if (setNameWithoutPrevious(y) && hasFormula(x)) return barrier(SET_NAME_BARRIER);\n const ch = refChangeOf(y);\n return ch ? cellsOverChange(x, ch) : ok([x]);\n }\n const ch = refChangeOf(x);\n if (!ch) return ok([x]);\n const r = definedNameThrough(y, ch);\n if (typeof r === \"string\") return barrier(r);\n return ok(r.changed ? [x, asDerived(r.op)] : [x]);\n }\n if (fx === \"cell\") {\n const ch = refChangeOf(y);\n return ch ? cellsOverChange(x, ch) : null;\n }\n if (fy === \"cell\") {\n const ch = refChangeOf(x);\n if (!ch) return null;\n // x removes rows/columns holding y's cells: y's author is told (S3).\n const lost: string[] = [];\n forEachCell(cellsOf(y), (r, c) => {\n if (!cellThrough(sheetOf(y), ch, r, c)) lost.push(cellRef(sheetOf(y), r, c));\n });\n const add = rewritesOf(y, ch);\n if (typeof add === \"string\") return barrier(add);\n return ok(add ? [x, add] : [x], lost);\n }\n return null;\n}\n\nconst withPrevious = (m: SheetMutation, definedNames: Readonly<Record<string, string>>): SheetMutation =>\n m.id === ID.setName && !(\"previousName\" in m.params) ? { id: m.id, params: { ...m.params, previousName: definedNames[String(m.params.id)] ?? null } } : m;\n\n/**\n * Capture-time annotation (C6 calls it per group, like completeCellContent): every op whose formula text\n * qualifies a reference with a sheet name gets `refSheets`, and every set-defined-name gets `previousName`\n * (the name its id had before the command; null for a new name). Rewrites that follow a structural op, a\n * rename or a defined-name change in the same group are marked `derived`. `sheets` is sheet id → name and\n * `definedNames` defined-name id → name, both read right before the command ran.\n */\nexport function annotateFormulas(group: SheetGroup, sheets: Readonly<Record<string, string>>, definedNames: Readonly<Record<string, string>>): SheetMutation[] {\n let changed = false;\n return group.map((m0) => {\n // Everything a structural op, rename or defined-name change brings after it is its interceptors' rewrites.\n const m = changed && (m0.id === ID.values || m0.id === ID.setName) ? asDerived(m0) : m0;\n if (!changed && refChangeOf(withPrevious(m0, definedNames))) changed = true;\n if (m.id === ID.values) {\n const texts: string[] = [];\n forEachCell(cellsOf(m), (_r, _c, v) => {\n if (v && isFormulaText(v.f)) texts.push(v.f);\n if (v && typeof v.ref === \"string\") texts.push(v.ref);\n });\n return { id: m.id, params: withRefSheets(m.params, refSheetsFor(texts, sheets)) };\n }\n if (m.id === ID.setName) {\n const texts = NAME_TEXT_KEYS.map((k) => m.params[k]).filter((t): t is string => typeof t === \"string\");\n return { id: m.id, params: { ...withRefSheets(m.params, refSheetsFor(texts, sheets)), previousName: withPrevious(m, definedNames).params.previousName } };\n }\n return m;\n });\n}\n\n// ── sizes (row height, auto-height flag, auto height, column width) ────────────────────────────────\ninterface SizeOp {\n axis: Axis;\n attr: string;\n values: Map<number, unknown>;\n}\nfunction sizeOf(m: SheetMutation): SizeOp {\n const p = m.params as Record<string, unknown>;\n const values = new Map<number, unknown>();\n if (m.id === ID.rowAutoHeight) {\n for (const { row, autoHeight } of (p.rowsAutoHeightInfo as Array<{ row: number; autoHeight: unknown }>) ?? []) values.set(row, autoHeight);\n return { axis: \"row\", attr: \"ah\", values };\n }\n const axis: Axis = m.id === ID.colWidth ? \"col\" : \"row\";\n const field = m.id === ID.colWidth ? \"colWidth\" : m.id === ID.rowHeight ? \"rowHeight\" : \"autoHeightInfo\";\n const value = p[field];\n const [a0, a1] = S(axis);\n for (const r of (p.ranges as SheetRange[]) ?? [])\n for (let i = r[a0] as number; i <= (r[a1] as number); i++) {\n if (typeof value === \"number\") values.set(i, value);\n else if (m.id === ID.rowIsAuto) values.set(i, (value as Record<number, unknown> | undefined)?.[i]);\n else if ((value as Record<number, unknown> | undefined)?.[i] != null) values.set(i, (value as Record<number, unknown>)[i]);\n }\n return { axis, attr: m.id === ID.colWidth ? \"w\" : m.id === ID.rowHeight ? \"h\" : \"ia\", values };\n}\nfunction buildSize(template: SheetMutation, values: Map<number, unknown>): SheetMutation | null {\n if (values.size === 0) return null;\n const p = template.params as Record<string, unknown>;\n if (template.id === ID.rowAutoHeight)\n return { id: template.id, params: { ...p, rowsAutoHeightInfo: [...values].sort((a, b) => a[0] - b[0]).map(([row, autoHeight]) => ({ row, autoHeight })) } };\n const axis: Axis = template.id === ID.colWidth ? \"col\" : \"row\";\n const field = template.id === ID.colWidth ? \"colWidth\" : template.id === ID.rowHeight ? \"rowHeight\" : \"autoHeightInfo\";\n const [a0, a1] = S(axis);\n const first = ((p.ranges as SheetRange[]) ?? [])[0] ?? ({ startRow: 0, endRow: 0, startColumn: 0, endColumn: 0 } as SheetRange);\n const ranges = runs(values.keys()).map((r) => ({ ...first, [a0]: r.start, [a1]: r.start + r.count - 1 }));\n const uniform = typeof p[field] === \"number\" ? p[field] : undefined;\n const value = uniform !== undefined && [...values.values()].every((v) => v === uniform) ? uniform : Object.fromEntries(values);\n return { id: template.id, params: { ...p, ranges, [field]: value } };\n}\n\n// ── number formats (C5c) ────────────────────────────────────────────────────────────────────────────\n// Univer 1.0.4 keeps a number format as the style key `n` of each cell (NumfmtService.setValues/deleteValues).\n// set.numfmt writes `n` = { pattern } on its ranges (per refMap key), remove.numfmt deletes `n`. Ranges follow\n// structural edits cell by cell (an inserted row inside a range is not formatted, exactly as on the seat that\n// formatted first); against another write of `n` on the same cell (a numfmt, a style with `n`, a style clear, a\n// cell delete) the later-committed op wins.\ntype Rect = { startRow: number; endRow: number; startColumn: number; endColumn: number; [k: string]: unknown };\ninterface NfPart {\n key: string | null; // null: remove.numfmt\n ranges: Rect[];\n}\nconst isNumfmt = (m: SheetMutation) => m.id === ID.setNumfmt || m.id === ID.removeNumfmt;\nfunction nfParts(m: SheetMutation): NfPart[] {\n if (m.id === ID.removeNumfmt) return [{ key: null, ranges: ((m.params.ranges as Rect[]) ?? []).map((r) => ({ ...r })) }];\n const values = (m.params.values ?? {}) as Record<string, { ranges?: Rect[] }>;\n return Object.keys(values).map((k) => ({ key: k, ranges: (values[k]?.ranges ?? []).map((r) => ({ ...r })) }));\n}\nfunction nfBuild(m: SheetMutation, parts: NfPart[]): SheetMutation[] {\n const keep = parts.filter((p) => p.ranges.length);\n if (!keep.length) return [];\n if (m.id === ID.removeNumfmt) return [{ id: m.id, params: { ...m.params, ranges: keep[0]!.ranges } }];\n const values: Record<string, unknown> = {};\n const refMap: Record<string, unknown> = {};\n const srcValues = (m.params.values ?? {}) as Record<string, Record<string, unknown>>;\n const srcRef = (m.params.refMap ?? {}) as Record<string, unknown>;\n for (const p of keep) {\n values[p.key!] = { ...srcValues[p.key!], ranges: p.ranges };\n refMap[p.key!] = srcRef[p.key!];\n }\n return [{ id: m.id, params: { ...m.params, values, refMap } }];\n}\n/** The `n` a numfmt op writes at (row, col): { pattern } for set, null for remove, undefined when it does not cover it. */\nfunction nfValueAt(m: SheetMutation, row: number, col: number): { pattern: unknown } | null | undefined {\n for (const p of nfParts(m))\n if (p.ranges.some((r) => r.startRow <= row && row <= r.endRow && r.startColumn <= col && col <= r.endColumn)) {\n if (p.key === null) return null;\n const ref = ((m.params.refMap ?? {}) as Record<string, { pattern?: unknown } | undefined>)[p.key];\n return { pattern: ref?.pattern };\n }\n return undefined;\n}\n\n/** Where a span [lo, hi] of one axis lands after an axis op: the pieces that survive, merged. */\nexport function spanThrough(op: AxisOp, lo: number, hi: number): Array<[number, number]> {\n const pieces: Array<[number, number, number]> = []; // [from, to, shift]\n if (op.kind === \"insert\") pieces.push([0, op.at - 1, 0], [op.at, Infinity, op.count]);\n else if (op.kind === \"remove\") pieces.push([0, op.start - 1, 0], [op.start + op.count, Infinity, -op.count]);\n else if (op.count <= 0 || (op.to >= op.from && op.to <= op.from + op.count)) pieces.push([0, Infinity, 0]);\n else if (op.to > op.from) {\n const n = op.count;\n pieces.push([0, op.from - 1, 0], [op.from, op.from + n - 1, op.to - n - op.from], [op.from + n, op.to - 1, -n], [op.to, Infinity, 0]);\n } else {\n const n = op.count;\n pieces.push([0, op.to - 1, 0], [op.to, op.from - 1, n], [op.from, op.from + n - 1, op.to - op.from], [op.from + n, Infinity, 0]);\n }\n const out: Array<[number, number]> = [];\n for (const [a, b, d] of pieces) {\n const x0 = Math.max(a, lo);\n const x1 = Math.min(b, hi);\n if (x0 <= x1) out.push([x0 + d, x1 + d]);\n }\n out.sort((p, q) => p[0] - q[0]);\n const merged: Array<[number, number]> = [];\n for (const p of out) {\n const last = merged[merged.length - 1];\n if (last && last[1] + 1 >= p[0]) last[1] = Math.max(last[1], p[1]);\n else merged.push([p[0], p[1]]);\n }\n return merged;\n}\nfunction rectsThrough(st: Structural, rects: Rect[]): Rect[] {\n const [a0, a1] = S(st.axis);\n const out: Rect[] = [];\n for (const r of rects) for (const [lo, hi] of spanThrough(st.op, r[a0] as number, r[a1] as number)) out.push({ ...r, [a0]: lo, [a1]: hi });\n return out;\n}\n/** a minus b, as disjoint rectangles. */\nfunction rectMinus(a: Rect, b: Rect): Rect[] {\n if (a.startRow > b.endRow || b.startRow > a.endRow || a.startColumn > b.endColumn || b.startColumn > a.endColumn) return [a];\n const out: Rect[] = [];\n if (a.startRow < b.startRow) out.push({ ...a, endRow: b.startRow - 1 });\n if (a.endRow > b.endRow) out.push({ ...a, startRow: b.endRow + 1 });\n const r0 = Math.max(a.startRow, b.startRow);\n const r1 = Math.min(a.endRow, b.endRow);\n if (a.startColumn < b.startColumn) out.push({ ...a, startRow: r0, endRow: r1, endColumn: b.startColumn - 1 });\n if (a.endColumn > b.endColumn) out.push({ ...a, startRow: r0, endRow: r1, startColumn: b.endColumn + 1 });\n return out;\n}\nfunction rectsMinus(as: Rect[], bs: Rect[]): Rect[] {\n let cur = as;\n for (const b of bs) cur = cur.flatMap((a) => rectMinus(a, b));\n return cur;\n}\n/** The cells where a set-range-values writes `n`: a style with `n`, a style clear (s: null), a cell delete. */\nfunction nWrites(m: SheetMutation): Rect[] {\n const out: Rect[] = [];\n forEachCell(cellsOf(m), (r, c, v) => {\n if (v === null || v.s === null || (v.s && typeof v.s === \"object\" && \"n\" in (v.s as Record<string, unknown>)))\n out.push({ startRow: r, endRow: r, startColumn: c, endColumn: c });\n });\n return out;\n}\n/** Numfmt pairs (same sheet). null = not a numfmt pair. */\nfunction numfmtPair(x: SheetMutation, y: SheetMutation, side: Side, sx: Structural | null, sy: Structural | null): TransformResult | null {\n const nx = isNumfmt(x);\n const ny = isNumfmt(y);\n if (!nx && !ny) return null;\n if (nx && sy) return ok(nfBuild(x, nfParts(x).map((p) => ({ ...p, ranges: rectsThrough(sy, p.ranges) }))));\n if (ny && sx) return ok([x]);\n if (nx && ny) {\n if (side === \"left\") return ok([x]);\n const ys = nfParts(y).flatMap((p) => p.ranges);\n return ok(nfBuild(x, nfParts(x).map((p) => ({ ...p, ranges: rectsMinus(p.ranges, ys) }))));\n }\n if (nx && y.id === ID.values) {\n if (side === \"left\") return ok([x]);\n const ys = nWrites(y);\n return ys.length ? ok(nfBuild(x, nfParts(x).map((p) => ({ ...p, ranges: rectsMinus(p.ranges, ys) })))) : ok([x]);\n }\n if (ny && x.id === ID.values) {\n if (side === \"left\") return ok([x]);\n // y (later) wrote `n`: x's own `n` gives way; a clear or delete of x is followed by y's `n` again\n const out: CellMatrix = {};\n const tail: CellMatrix = {};\n let touched = false;\n forEachCell(cellsOf(x), (r, c, v) => {\n const n = nfValueAt(y, r, c);\n if (n === undefined) return putCell(out, r, c, v);\n if (v === null || v.s === null) {\n putCell(out, r, c, v);\n if (n) {\n putCell(tail, r, c, { s: { n } });\n touched = true;\n }\n return;\n }\n if (v.s && typeof v.s === \"object\" && \"n\" in (v.s as Record<string, unknown>)) {\n const { n: _drop, ...rest } = v.s as Record<string, unknown>;\n const e: Record<string, unknown> = { ...v };\n if (Object.keys(rest).length) e.s = rest;\n else delete e.s;\n touched = true;\n if (Object.keys(e).length) putCell(out, r, c, e);\n return;\n }\n putCell(out, r, c, v);\n });\n if (!touched) return ok([x]);\n const ops: SheetMutation[] = [];\n if (!isEmptyMatrix(out)) ops.push(cellsMutation(x, out));\n if (!isEmptyMatrix(tail)) ops.push({ id: ID.values, params: { subUnitId: sheetOf(x), cellValue: tail } });\n return ok(ops);\n }\n return ok([x]); // numfmt × merge, size, name, count: different state\n}\n\n// ── row/column counts (C5c) ─────────────────────────────────────────────────────────────────────────\n// set-worksheet-row-count / -column-count set an absolute size. A concurrent insert or remove on that axis shifts\n// it by its count (both seats then agree on the structure); two concurrent counts: the larger wins (a refresh that\n// grows the sheet is never undone by a smaller one; side-independent).\nconst isCount = (m: SheetMutation) => m.id === ID.rowCount || m.id === ID.colCount;\nconst countAxis = (m: SheetMutation): Axis => (m.id === ID.rowCount ? \"row\" : \"col\");\nconst countKey = (m: SheetMutation) => (m.id === ID.rowCount ? \"rowCount\" : \"columnCount\");\nfunction countPair(x: SheetMutation, y: SheetMutation, sy: Structural | null): TransformResult | null {\n if (!isCount(x)) return isCount(y) ? ok([x]) : null;\n const k = countKey(x);\n const v = Number(x.params[k]);\n if (sy) {\n if (sy.axis !== countAxis(x) || sy.op.kind === \"move\") return ok([x]);\n const d = sy.op.kind === \"insert\" ? sy.op.count : -sy.op.count;\n return ok([{ id: x.id, params: { ...x.params, [k]: Math.max(1, v + d) } }]);\n }\n if (isCount(y) && y.id === x.id) {\n const w = Number(y.params[k]);\n return ok([w > v ? { id: x.id, params: { ...x.params, [k]: w } } : x]);\n }\n return ok([x]);\n}\n\n// ── sheets: add, remove, order (C5c) ───────────────────────────────────────────────────────────────\n// The sheet order is one more axis: insert-sheet = insert(index, 1), remove-sheet = remove(sheetIndex, 1) (capture\n// records the removed sheet's index, `annotateSheetOps`), set-worksheet-order = a move of one sheet (Univer:\n// splice out at fromOrder, splice in at toOrder). Index arithmetic is transformAxis. An op addressed to a sheet a\n// concurrent op removed is dropped (its author is told); a formula that names a removed sheet is a barrier.\nconst isSheetOp = (m: SheetMutation) => m.id === ID.insertSheet || m.id === ID.removeSheet || m.id === ID.sheetOrder;\nconst sheetIdOf = (m: SheetMutation) => (m.id === ID.insertSheet ? String((m.params.sheet as { id?: unknown } | undefined)?.id ?? \"\") : sheetOf(m));\nfunction sheetAxisOf(m: SheetMutation): AxisOp | null {\n const p = m.params;\n if (m.id === ID.insertSheet) return typeof p.index === \"number\" ? { kind: \"insert\", at: p.index, count: 1 } : null;\n if (m.id === ID.removeSheet) return typeof p.sheetIndex === \"number\" ? { kind: \"remove\", start: p.sheetIndex, count: 1 } : null;\n if (m.id === ID.sheetOrder) {\n const f = Number(p.fromOrder);\n const t = Number(p.toOrder);\n return { kind: \"move\", from: f, count: 1, to: t > f ? t + 1 : t };\n }\n return null;\n}\nfunction buildSheetOp(template: SheetMutation, op: AxisOp): SheetMutation {\n if (op.kind === \"insert\") return { id: template.id, params: { ...template.params, index: op.at } };\n if (op.kind === \"remove\") return { id: template.id, params: { ...template.params, sheetIndex: op.start } };\n return { id: template.id, params: { ...template.params, fromOrder: op.from, toOrder: op.to > op.from ? op.to - 1 : op.to } };\n}\n/** True when the op's formula text (or defined-name text) names sheet `id`. */\nfunction namesSheet(m: SheetMutation, id: string): boolean {\n const rs = refSheetsOf(m);\n return !!rs && Object.values(rs).includes(id) && (m.id === ID.setName || hasFormula(m));\n}\nfunction sheetPair(x: SheetMutation, y: SheetMutation, side: Side): TransformResult | null {\n const xs = isSheetOp(x);\n const ys = isSheetOp(y);\n if (!xs && !ys) return null;\n if (xs && ys) {\n const a = sheetAxisOf(x);\n const b = sheetAxisOf(y);\n if (!a || !b) return barrier(\"a sheet add or remove without its index (capture must call annotateSheetOps)\");\n if (x.id === ID.insertSheet && y.id === ID.insertSheet && sheetIdOf(x) === sheetIdOf(y)) {\n // the same sheet added twice (one op delivered twice): it is there once\n return JSON.stringify(x.params) === JSON.stringify(y.params) ? ok([]) : barrier(\"the same sheet id added twice with different content\");\n }\n if (x.id === ID.removeSheet && typeof x.params.sheetsLeft === \"number\" && sheetIdOf(x) !== sheetIdOf(y) && (y.id === ID.removeSheet || y.id === ID.insertSheet)) {\n // a workbook keeps one sheet: two concurrent removes that would leave none are a barrier\n const left = x.params.sheetsLeft + (y.id === ID.insertSheet ? 1 : -1);\n if (left < 1) return barrier(\"concurrent sheet removes would leave the workbook without a sheet\");\n const out = transformAxis(a, b, side);\n if (!out) return barrier(\"sheet order: no transform\");\n return ok(out.map((o) => buildSheetOp({ id: x.id, params: { ...x.params, sheetsLeft: left } }, o)));\n }\n // the same sheet removed twice, or moved twice: transformAxis drops the earlier one\n const out = transformAxis(a, b, side);\n if (!out) return barrier(\"sheet order: no transform\");\n return ok(out.map((o) => buildSheetOp(x, o)), [], out.length === 0 && x.id === ID.sheetOrder ? [`${sheetIdOf(x)}: sheet order`] : []);\n }\n if (ys) {\n if (y.id !== ID.removeSheet) return ok([x]); // a new sheet or a new order commutes with every edit\n const gone = sheetOf(y);\n if (namesSheet(x, gone)) return barrier(\"a formula names a sheet removed at the same time\");\n if (sheetOf(x) === gone && x.id !== ID.setName && x.id !== ID.removeName)\n return ok([], [], isDerived(x) ? [] : [`${gone}: the sheet was removed`]);\n return ok([x]);\n }\n // x is a sheet op over an edit\n if (x.id !== ID.removeSheet) return ok([x]);\n const gone = sheetOf(x);\n if (namesSheet(y, gone)) return barrier(\"a formula names a sheet removed at the same time\");\n return ok([x], sheetOf(y) === gone && !isDerived(y) && y.id !== ID.setName && y.id !== ID.removeName ? [`${gone}: the sheet was removed`] : []);\n}\n\n/**\n * Capture-time annotation for sheet ops (the port calls it per group, like annotateFormulas): a remove-sheet gets\n * `sheetIndex` (the removed sheet's index right before it) and `sheetsLeft` (sheets after it), an insert-sheet without `index` gets its append index.\n * `sheetOrder` = the workbook's sheet order right before the command.\n */\nexport function annotateSheetOps(group: SheetGroup, sheetOrder: readonly string[]): SheetMutation[] {\n const order = [...sheetOrder];\n return group.map((m) => {\n if (m.id === ID.insertSheet) {\n const index = typeof m.params.index === \"number\" ? Math.min(m.params.index, order.length) : order.length;\n order.splice(index, 0, sheetIdOf(m));\n return index === m.params.index ? m : { id: m.id, params: { ...m.params, index } };\n }\n if (m.id === ID.removeSheet) {\n const i = order.indexOf(sheetOf(m));\n if (i >= 0) order.splice(i, 1);\n return i >= 0 ? { id: m.id, params: { ...m.params, sheetIndex: i, sheetsLeft: order.length } } : m;\n }\n if (m.id === ID.sheetOrder) {\n const f = Number(m.params.fromOrder);\n const [id] = order.splice(f, 1);\n order.splice(Number(m.params.toOrder), 0, id ?? sheetOf(m));\n }\n return m;\n });\n}\n\n/** Style ids inside a sheet's data replaced by their objects (style ids are seat-local, C0 surprise 4). */\nexport function inlineSheetStyles(sheet: Record<string, unknown>, styleOf: (id: string) => unknown): Record<string, unknown> {\n const out = JSON.parse(JSON.stringify(sheet)) as Record<string, any>;\n const fix = (o: Record<string, any> | null | undefined) => {\n if (o && typeof o.s === \"string\") {\n const st = styleOf(o.s);\n if (st) o.s = JSON.parse(JSON.stringify(st));\n }\n };\n for (const row of Object.values<Record<string, any>>(out.cellData ?? {})) for (const cell of Object.values<Record<string, any>>(row ?? {})) fix(cell);\n for (const key of [\"rowData\", \"columnData\"]) for (const v of Object.values<Record<string, any>>(out[key] ?? {})) fix(v);\n if (typeof out.defaultStyle === \"string\") {\n const st = styleOf(out.defaultStyle);\n if (st) out.defaultStyle = JSON.parse(JSON.stringify(st));\n }\n return out;\n}\n\n// ── the pair transform ──────────────────────────────────────────────────────────────────────────────\nfunction familyOf(id: string): string {\n const e = SHEET_MUTATIONS[id];\n return e && e.kind === \"covered\" ? e.family : \"\";\n}\n\n/** x over y for single mutations. */\nexport function transformMutation(x: SheetMutation, y: SheetMutation, side: Side): TransformResult {\n for (const m of [x, y]) {\n const e = SHEET_MUTATIONS[m.id];\n if (!e) return barrier(`${m.id} is not in the registry`);\n if (e.kind !== \"covered\") return barrier(`${m.id}: ${e.kind === \"barrier\" ? `barrier until ${e.until} (${e.reason})` : \"never travels\"}`);\n if (m.id === ID.values) {\n const why = cellBarrier(m);\n if (why) return barrier(why);\n }\n }\n const pb = PAIR_BARRIERS[pairKey(x.id, y.id)];\n if (pb) return barrier(`${x.id} × ${y.id}: ${pb.reason}${pb.seed === null ? \"\" : ` (fuzz seed ${pb.seed})`}`);\n const sp = sheetPair(x, y, side);\n if (sp) return sp;\n const fp = formulaPair(x, y, side);\n if (fp) return fp;\n if (sheetOf(x) !== sheetOf(y)) return ok([x]);\n\n const fx = familyOf(x.id);\n const fy = familyOf(y.id);\n const sy = structuralOf(y);\n const sx = structuralOf(x);\n const cp = countPair(x, y, sy);\n if (cp) return cp;\n const np = numfmtPair(x, y, side, sx, sy);\n if (np) return np;\n\n // structural over structural\n if (sx && sy) {\n if (sx.axis !== sy.axis) return ok([x]);\n const out = transformAxis(sx.op, sy.op, side);\n if (!out) return barrier(`${x.id} over ${y.id}: moved blocks overlap in part, or the block would split`);\n const dropped = out.length === 0 && sx.op.kind === \"move\" ? [`${sheetOf(x)}: moved ${sx.axis}s`] : [];\n return ok(out.map((o) => buildStructural(x, sx.axis, o)), [], dropped);\n }\n\n // anything over structural: coordinates move\n if (sy) {\n if (fx === \"merge\") {\n const kept: SheetRange[] = [];\n const dropped: string[] = [];\n for (const r of mergeRanges(x)) {\n const t = mergeThrough(sy, r).range;\n if (t) kept.push(t);\n else dropped.push(rangeRef(sheetOf(x), r));\n }\n return ok(kept.length ? [withRanges(x, kept)] : [], [], x.id === ID.addMerge ? dropped : []);\n }\n if (fx === \"size\") {\n const size = sizeOf(x);\n if (size.axis !== sy.axis) return ok([x]);\n const next = new Map<number, unknown>();\n for (const [i, v] of size.values) {\n const m = mapIndex(sy.op, i);\n if (m !== null) next.set(m, v);\n }\n const built = buildSize(x, next);\n return ok(built ? [built] : []);\n }\n return ok([x]); // name\n }\n\n // structural over others\n if (sx) {\n if (fy !== \"merge\" || y.id !== ID.addMerge) return ok([x]);\n // y added merges this seat already holds; the raw structural mutation leaves the ones it cuts through\n // where they were, so the fixups the command would have made travel with x.\n const remove: SheetRange[] = [];\n const add: SheetRange[] = [];\n for (const r of mergeRanges(y)) {\n const t = mergeThrough(sx, r);\n if (!t.fixup) continue;\n remove.push(r);\n if (t.range) add.push(t.range);\n }\n const lostMerges = mergeRanges(y).filter((r) => mergeThrough(sx, r).range === null).map((r) => rangeRef(sheetOf(y), r));\n if (!remove.length) return ok([x], lostMerges);\n const sheet = sheetOf(x);\n const pre = sx.op.kind === \"insert\" ? [] : [mergeMutation(ID.removeMerge, sheet, remove)];\n const mid = sx.op.kind === \"insert\" ? [mergeMutation(ID.removeMerge, sheet, remove)] : [];\n return ok([...pre, x, ...mid, ...(add.length ? [mergeMutation(ID.addMerge, sheet, add)] : [])], lostMerges);\n }\n\n if (fx === \"cell\" && fy === \"cell\") return transformCellsOverCells(x, y, side);\n\n if (fx === \"merge\" && fy === \"merge\") {\n const xr = mergeRanges(x);\n const yr = mergeRanges(y);\n const hit = (r: SheetRange) => yr.some((q) => intersects(r, q));\n const sheet = sheetOf(x);\n if (x.id === ID.addMerge && y.id === ID.addMerge) {\n if (!xr.some(hit)) return ok([x]);\n if (side === \"left\") {\n // the later merge stands: clear what it overlaps, then add it\n const lost = yr.filter((q) => xr.some((r) => intersects(r, q))).map((q) => rangeRef(sheet, q));\n return ok([mergeMutation(ID.removeMerge, sheet, xr.filter(hit)), x], lost);\n }\n const kept = xr.filter((r) => !hit(r));\n return ok(kept.length ? [withRanges(x, kept)] : [], [], xr.filter(hit).map((r) => rangeRef(sheet, r)));\n }\n if (x.id === ID.addMerge && y.id === ID.removeMerge) {\n if (side === \"left\" || !xr.some(hit)) return ok([x], side === \"left\" && xr.some(hit) ? yr.filter((q) => xr.some((r) => intersects(r, q))).map((q) => rangeRef(sheet, q)) : []);\n const kept = xr.filter((r) => !hit(r));\n return ok(kept.length ? [withRanges(x, kept)] : [], [], xr.filter(hit).map((r) => rangeRef(sheet, r)));\n }\n if (x.id === ID.removeMerge && y.id === ID.addMerge) {\n // Univer removes every merge a range intersects, so x would also take y's merge with it.\n const touched = yr.filter((q) => xr.some((r) => intersects(r, q)));\n if (!touched.length) return ok([x]);\n if (side === \"left\") return ok([x], touched.map((q) => rangeRef(sheet, q)));\n return ok([x, mergeMutation(ID.addMerge, sheet, touched)], [], xr.filter(hit).map((r) => rangeRef(sheet, r)));\n }\n return ok([x]); // remove over remove: idempotent\n }\n\n if (fx === \"size\" && fy === \"size\") {\n const a = sizeOf(x);\n const b = sizeOf(y);\n if (a.axis !== b.axis || a.attr !== b.attr) return ok([x]);\n if (side === \"left\") {\n const lost = [...a.values.keys()].filter((i) => b.values.has(i)).map((i) => `${sheetOf(x)}: ${a.axis} ${i + 1} ${a.attr}`);\n return ok([x], lost);\n }\n const next = new Map([...a.values].filter(([i]) => !b.values.has(i)));\n const built = buildSize(x, next);\n const dropped = [...a.values.keys()].filter((i) => b.values.has(i)).map((i) => `${sheetOf(x)}: ${a.axis} ${i + 1} ${a.attr}`);\n return ok(built ? [built] : [], [], dropped);\n }\n\n if (fx === \"name\" && fy === \"name\") {\n if (side === \"left\") return ok([x], [`${sheetOf(x)}: name \"${String(y.params.name)}\"`]);\n return ok([], [], [`${sheetOf(x)}: name \"${String(x.params.name)}\"`]);\n }\n\n // different families of different kinds commute (cells × merges, cells × sizes, merges × sizes, name × any)\n return ok([x]);\n}\n\n// ── groups ──────────────────────────────────────────────────────────────────────────────────────────\ninterface Acc {\n lost: string[];\n dropped: string[];\n}\ntype Pair = [SheetMutation[], SheetMutation[]] | Barrier;\nconst blocked = (p: Pair): p is Barrier => !Array.isArray(p);\n\n/**\n * Transforms two sequences against each other: [xs after ys, ys after xs]. The OT grid, walked one x at a time\n * against the whole (evolving) y list; a pair whose transform yields several ops refines the grid in place.\n * Iterative over the outer lists (no slicing), so composed changesets of hundreds of mutations stay linear per cell.\n */\nfunction tSeq(xs: SheetMutation[], ys: SheetMutation[], side: Side, acc: Acc): Pair {\n if (xs.length === 0 || ys.length === 0) return [xs, ys];\n if (xs.length === 1 && ys.length === 1) {\n const a = transformMutation(xs[0]!, ys[0]!, side);\n if (isBarrier(a)) return a;\n const b = transformMutation(ys[0]!, xs[0]!, flip(side));\n if (isBarrier(b)) return b;\n acc.lost.push(...a.lost);\n acc.dropped.push(...a.dropped);\n return [a.op, b.op];\n }\n const outX: SheetMutation[] = [];\n let curY = ys;\n for (const x of xs) {\n // one x against every y in turn: x evolves, each y is rewritten over it\n let curX: SheetMutation[] = [x];\n const nextY: SheetMutation[] = [];\n for (const y of curY) {\n if (curX.length === 0) {\n nextY.push(y);\n continue;\n }\n const r = tSeq(curX, [y], side, acc);\n if (blocked(r)) return r;\n curX = r[0];\n for (const m of r[1]) nextY.push(m);\n }\n for (const m of curX) outX.push(m);\n curY = nextY;\n }\n return [outX, curY];\n}\n\n\nfunction tSeqOld(xs: SheetMutation[], ys: SheetMutation[], side: Side, acc: Acc): Pair {\n if (xs.length === 0 || ys.length === 0) return [xs, ys];\n if (xs.length === 1 && ys.length === 1) return tSeq(xs, ys, side, acc);\n if (xs.length > 1) {\n const first = tSeqOld([xs[0]!], ys, side, acc);\n if (blocked(first)) return first;\n const rest = tSeqOld(xs.slice(1), first[1], side, acc);\n if (blocked(rest)) return rest;\n return [[...first[0], ...rest[0]], rest[1]];\n }\n const first = tSeqOld(xs, [ys[0]!], side, acc);\n if (blocked(first)) return first;\n const rest = tSeqOld(first[0], ys.slice(1), side, acc);\n if (blocked(rest)) return rest;\n return [rest[0], [...first[1], ...rest[1]]];\n}\n\n/** Command group x rewritten to apply after command group y. One Barrier makes the whole group a barrier. */\nexport function transformGroup(x: SheetGroup, y: SheetGroup, side: Side): TransformResult {\n const acc: Acc = { lost: [], dropped: [] };\n const r = (process.env.OLD_TSEQ ? tSeqOld : tSeq)([...x], [...y], side, acc);\n if (blocked(r)) return r;\n return { op: r[0], lost: [...new Set(acc.lost)], dropped: [...new Set(acc.dropped)] };\n}\n\n/** The OpTransformer the C2 session takes (`@ai-matrx/data/realtime/collab`), for sheet command groups. */\nexport const sheetTransformer = {\n version: SHEET_TRANSFORMER_VERSION,\n transform(x: SheetGroup, y: SheetGroup, side: Side): { op: SheetMutation[] | null; lost: string[]; dropped: string[] } | Barrier {\n const r = transformGroup(x, y, side);\n if (isBarrier(r)) return r;\n return { op: r.op.length ? r.op : null, lost: r.lost, dropped: r.dropped };\n },\n compose(a: SheetGroup, b: SheetGroup): SheetMutation[] {\n return [...a, ...b];\n },\n isNoop(op: SheetGroup): boolean {\n return op.length === 0;\n },\n};\n","/**\n * One-dimensional structural algebra for rows and columns: insert, remove and move, the index map each\n * induces, and S-over-S transforms. Index arithmetic is ours (not Univer's ref-range helpers) because ties\n * need the side rule and overlapping removes must subtract, which no free helper does.\n *\n * Semantics pinned to Univer 1.0.4:\n * - insert(at, n): new rows occupy [at, at+n); old row i >= at moves to i+n (the row AT `at` moves down).\n * - remove(start, n): rows [start, start+n) go; i >= start+n moves to i-n.\n * - move(from, n, to): `moveMatrixArray` — rows [from, from+n) are placed before old row `to`. Forward\n * (to >= from+n): block lands at [to-n, to). Backward (to < from): block lands at [to, to+n). A `to` in\n * [from, from+n] moves nothing (Univer throws for [from, from+n)); we treat it as a no-op.\n */\nimport type { Side } from \"./types\";\n\nexport type Axis = \"row\" | \"col\";\n\nexport type AxisOp =\n | { kind: \"insert\"; at: number; count: number }\n | { kind: \"remove\"; start: number; count: number }\n | { kind: \"move\"; from: number; count: number; to: number };\n\nexport function isNoopMove(op: { from: number; count: number; to: number }): boolean {\n return op.count <= 0 || (op.to >= op.from && op.to <= op.from + op.count);\n}\n\n/** Where the moved block starts after the move. */\nexport function movedBlockStart(op: { from: number; count: number; to: number }): number {\n return op.to > op.from ? op.to - op.count : op.to;\n}\n\n/** Old index → new index, or null when the index is removed. */\nexport function mapIndex(op: AxisOp, i: number): number | null {\n switch (op.kind) {\n case \"insert\":\n return i >= op.at ? i + op.count : i;\n case \"remove\":\n if (i < op.start) return i;\n if (i < op.start + op.count) return null;\n return i - op.count;\n case \"move\": {\n if (isNoopMove(op)) return i;\n const { from, count, to } = op;\n if (i >= from && i < from + count) return movedBlockStart(op) + (i - from);\n if (to > from) return i >= from + count && i < to ? i - count : i;\n return i >= to && i < from ? i + count : i;\n }\n }\n}\n\n/** Contiguous runs of a sorted, de-duplicated index list. */\nexport function runs(indices: Iterable<number>): Array<{ start: number; count: number }> {\n const sorted = [...new Set(indices)].sort((a, b) => a - b);\n const out: Array<{ start: number; count: number }> = [];\n for (const i of sorted) {\n const last = out[out.length - 1];\n if (last && last.start + last.count === i) last.count++;\n else out.push({ start: i, count: 1 });\n }\n return out;\n}\n\n/**\n * A gap (insert position: \"before old row p\") through a move. Gaps strictly inside the block ride with\n * it; any other gap is a gap of the non-block rows. At the move's own target gap an insert lands BEFORE\n * the block (side-independent; `transformAxis(move, insert)` keeps the same order).\n */\nfunction mapGapThroughMove(p: number, mv: { from: number; count: number; to: number }): number {\n const { from, count, to } = mv;\n if (p > from && p < from + count) return movedBlockStart(mv) + (p - from);\n const g = p <= from ? p : p - count; // gap index among the non-block rows\n const tg = to <= from ? to : to - count;\n return g <= tg ? g : g + count;\n}\n\n/**\n * x over y on ONE axis. Returns the list of axis ops that apply after y (empty = x vanished), or null when\n * the pair has no transform (the caller turns that into a barrier).\n */\nexport function transformAxis(x: AxisOp, y: AxisOp, side: Side): AxisOp[] | null {\n if (y.kind === \"move\" && isNoopMove(y)) return [x];\n if (x.kind === \"move\" && isNoopMove(x)) return [];\n switch (x.kind) {\n case \"insert\": {\n if (y.kind === \"insert\") {\n if (x.at < y.at || (x.at === y.at && side === \"left\")) return [x];\n return [{ ...x, at: x.at + y.count }];\n }\n if (y.kind === \"remove\") {\n if (x.at <= y.start) return [x];\n if (x.at >= y.start + y.count) return [{ ...x, at: x.at - y.count }];\n return [{ ...x, at: y.start }]; // an insert inside a removed span survives at its start\n }\n return [{ ...x, at: mapGapThroughMove(x.at, y) }];\n }\n case \"remove\": {\n const kept: number[] = [];\n for (let i = x.start; i < x.start + x.count; i++) {\n const m = mapIndex(y, i);\n if (m !== null) kept.push(m);\n }\n if (y.kind === \"insert\" || y.kind === \"remove\" || y.kind === \"move\") {\n // Removes are emitted highest first so each index is still valid when it applies.\n return runs(kept)\n .reverse()\n .map((r) => ({ kind: \"remove\" as const, start: r.start, count: r.count }));\n }\n return null;\n }\n case \"move\": {\n if (y.kind === \"insert\") {\n const inside = y.at > x.from && y.at < x.from + x.count;\n const from = inside || y.at > x.from ? x.from : x.from + y.count;\n const count = inside ? x.count + y.count : x.count;\n const to = x.to >= y.at ? x.to + y.count : x.to;\n const out = { kind: \"move\" as const, from, count, to };\n return isNoopMove(out) ? [] : [out];\n }\n if (y.kind === \"remove\") {\n const kept: number[] = [];\n for (let i = x.from; i < x.from + x.count; i++) {\n const m = mapIndex(y, i);\n if (m !== null) kept.push(m);\n }\n if (kept.length === 0) return [];\n const r = runs(kept);\n if (r.length !== 1) return null;\n const to = x.to <= y.start ? x.to : x.to >= y.start + y.count ? x.to - y.count : y.start;\n const out = { kind: \"move\" as const, from: r[0]!.start, count: r[0]!.count, to };\n return isNoopMove(out) ? [] : [out];\n }\n // move over move. The same rows moved twice: the later move wins, the earlier one is dropped.\n // Blocks that only partly overlap have no transform yet.\n const overlap = Math.min(x.from + x.count, y.from + y.count) - Math.max(x.from, y.from);\n if (overlap > 0) {\n if (x.from !== y.from || x.count !== y.count) return null;\n if (side === \"right\") return [];\n const out = { kind: \"move\" as const, from: movedBlockStart(y), count: x.count, to: mapGapThroughMove(x.to, y) };\n return isNoopMove(out) ? [] : [out];\n }\n // Disjoint blocks: x's rows through y must stay contiguous; the target gap goes through y.\n const mapped: number[] = [];\n for (let i = x.from; i < x.from + x.count; i++) mapped.push(mapIndex(y, i)!);\n const r = runs(mapped);\n if (r.length !== 1) return null;\n let to: number;\n if (x.to > y.from && x.to < y.from + y.count) to = movedBlockStart(y) + (x.to - y.from);\n else to = mapGapThroughMove(x.to, y) + (x.to === y.to && side === \"right\" ? y.count : 0); // same target: later block first\n const out = { kind: \"move\" as const, from: r[0]!.start, count: r[0]!.count, to };\n if (to > out.from && to < out.from + out.count) return null;\n return isNoopMove(out) ? [] : [out];\n }\n }\n}\n","/**\n * C5b: formula references under concurrent structural edits and sheet renames. Pure: Univer's free formula\n * lexer (`LexerTreeBuilder.sequenceNodesBuilder`) reads the text, Univer's free ref-range helpers from\n * `@univerjs/sheets` move each reference, and the rewrite mirrors `@univerjs/sheets-formula` 1.0.4\n * (`getNewRangeByMoveParam`, `getMoveNewRange`, `checkMoveEdge`, `updateRefOffset`; Apache-2.0, ported because\n * sheets-formula exports none of them). A concurrent formula therefore ends up exactly as Univer's own\n * interceptor would have rewritten it had the two edits been made one after the other.\n *\n * Sheet names: formula text names sheets, ops name sheet ids. Every traveling op whose formula text carries a\n * sheet-qualified reference holds `refSheets` (name → sheet id, null for a name no sheet has), written at\n * capture by `annotateRefSheets`. An unqualified reference means the formula's own sheet.\n */\nimport { Direction, RANGE_TYPE, Rectangle, getIntersectRange, type IRange } from \"@univerjs/core\";\nimport { type ISequenceNode, LexerTreeBuilder, deserializeRangeWithSheet, generateStringWithSequence, sequenceNodeType, serializeRangeToRefString } from \"@univerjs/engine-formula\";\nimport {\n EffectRefRangId,\n handleIRemoveCol,\n handleIRemoveRow,\n handleInsertCol,\n handleInsertRow,\n handleMoveCols,\n handleMoveRows,\n runRefRangeMutations,\n} from \"@univerjs/sheets\";\nimport type { Axis, AxisOp } from \"./axis\";\n\n/** Sheet name → sheet id (null: the name is no sheet of this workbook). */\nexport type RefSheets = Readonly<Record<string, string | null>>;\n\n/** What changed under a formula: rows/columns of one sheet, or one sheet's name. */\nexport type RefChange =\n | { readonly kind: \"axis\"; readonly sheet: string; readonly axis: Axis; readonly op: AxisOp }\n | { readonly kind: \"rename\"; readonly sheet: string; readonly name: string }\n | { readonly kind: \"defined-name\"; readonly from: string; readonly to: string | null };\n\nexport interface FormulaCtx {\n /** The sheet the formula lives in (its unqualified references point here). */\n readonly ownSheet: string;\n readonly refSheets: RefSheets | undefined;\n /** Defined names keep the sheet qualifier of a moved reference (sheets-formula `preserveSheetQualifier`). */\n readonly keepQualifier?: boolean;\n}\n\nexport const REF_ERROR = \"#REF!\";\n/** Larger than any sheet; stands in for \"the whole other axis\" in the ref-range helpers. */\nconst FULL = 16383 * 64;\n\nlet lexer: LexerTreeBuilder | null = null;\nconst lex = (body: string) => (lexer ??= new LexerTreeBuilder()).sequenceNodesBuilder(body);\n\nexport const isFormulaText = (f: unknown): f is string => typeof f === \"string\" && f.length > 1 && f.startsWith(\"=\");\n\nconst IDENT = /^[A-Za-z_\\\\][A-Za-z0-9_.\\\\]*$/;\nconst ERROR_TOKEN = /^(?:[^!]+!)?#(?:REF!|NAME\\?|VALUE!|DIV\\/0!|N\\/A|NUM!|NULL!|SPILL!|CALC!)$/i;\n\ntype Node = string | ISequenceNode;\n\nfunction parse(text: string): { prefix: string; nodes: Node[] } | string {\n const prefix = text.startsWith(\"=\") ? \"=\" : \"\";\n const nodes = lex(text.slice(prefix.length));\n if (!nodes) return \"the formula lexer could not read the text\";\n for (const n of nodes) {\n if (typeof n === \"string\") continue;\n if (n.nodeType === sequenceNodeType.TABLE || (n.nodeType === sequenceNodeType.FUNCTION && n.token.includes(\"[\"))) return \"a structured table reference (tables are C5c)\";\n if (n.nodeType === sequenceNodeType.FUNCTION && !IDENT.test(n.token) && !ERROR_TOKEN.test(n.token))\n return `the lexer read \"${n.token}\" as one name (an intersection or a reference it cannot split)`;\n if (n.nodeType === sequenceNodeType.REFERENCE) {\n const d = deserializeRangeWithSheet(n.token);\n if (d.unitId) return \"a reference into another workbook\";\n }\n }\n return { prefix, nodes };\n}\n\n/** The sheet id a reference points at, \"\" when it names no sheet, or undefined when capture did not say. */\nfunction targetSheet(sheetName: string, ctx: FormulaCtx): string | undefined {\n if (!sheetName) return ctx.ownSheet;\n const id = ctx.refSheets?.[sheetName];\n if (id === undefined) return undefined;\n return id ?? \"\";\n}\n\n/** Why a formula cannot be transformed (null = it can). */\nexport function formulaBarrier(text: string, ctx: FormulaCtx): string | null {\n const p = parse(text);\n if (typeof p === \"string\") return p;\n for (const n of p.nodes) {\n if (typeof n === \"string\" || n.nodeType !== sequenceNodeType.REFERENCE) continue;\n const { sheetName } = deserializeRangeWithSheet(n.token);\n if (targetSheet(sheetName, ctx) === undefined) return `sheet \"${sheetName}\" is not in refSheets (capture must call annotateRefSheets)`;\n }\n return null;\n}\n\n/** Sheet names the text qualifies references with. */\nexport function referencedSheetNames(text: string): string[] {\n const p = parse(text);\n if (typeof p === \"string\") return [];\n const out = new Set<string>();\n for (const n of p.nodes) if (typeof n !== \"string\" && n.nodeType === sequenceNodeType.REFERENCE) {\n const { sheetName } = deserializeRangeWithSheet(n.token);\n if (sheetName) out.add(sheetName);\n }\n return [...out];\n}\n\n// ── one reference through one change (sheets-formula getNewRangeByMoveParam, types 1–6) ──────────────\nconst fullRowsRange = (start: number, count: number): IRange => ({ startRow: start, endRow: start + count - 1, startColumn: 0, endColumn: FULL, rangeType: RANGE_TYPE.ROW });\nconst fullColsRange = (start: number, count: number): IRange => ({ startRow: 0, endRow: FULL, startColumn: start, endColumn: start + count - 1, rangeType: RANGE_TYPE.COLUMN });\n\nconst startV = (v: number) => (Number.isNaN(v) || v == null ? -Infinity : v);\nconst endV = (v: number) => (Number.isNaN(v) || v == null ? Infinity : v);\nfunction startEnd(r: IRange) {\n return { ...r, startRow: startV(r.startRow), endRow: endV(r.endRow), startColumn: startV(r.startColumn), endColumn: endV(r.endColumn) };\n}\n\nfunction checkMoveEdge(origin: IRange, from: IRange): number | null {\n const startRow = startV(origin.startRow), endRow = endV(origin.endRow), startColumn = startV(origin.startColumn), endColumn = endV(origin.endColumn);\n const fromStartRow = startV(from.startRow), fromEndRow = endV(from.endRow), fromStartColumn = startV(from.startColumn), fromEndColumn = endV(from.endColumn);\n const rowsCover = () => (origin.rangeType === RANGE_TYPE.COLUMN && from.rangeType === RANGE_TYPE.COLUMN) || (startRow >= fromStartRow && endRow <= fromEndRow);\n const columnsCover = () => (origin.rangeType === RANGE_TYPE.ROW && from.rangeType === RANGE_TYPE.ROW) || (startColumn >= fromStartColumn && endColumn <= fromEndColumn);\n const allCover = () => origin.rangeType === RANGE_TYPE.ALL && from.rangeType === RANGE_TYPE.ALL;\n if ((rowsCover() && columnsCover()) || allCover()) return 4;\n if (columnsCover() && startRow >= fromStartRow && startRow <= fromEndRow && endRow > fromEndRow) return 0;\n if (columnsCover() && endRow >= fromStartRow && endRow <= fromEndRow && startRow < fromStartRow) return 1;\n if (rowsCover() && startColumn >= fromStartColumn && startColumn <= fromEndColumn && endColumn > fromEndColumn) return 2;\n if (rowsCover() && endColumn >= fromStartColumn && endColumn <= fromEndColumn && startColumn < fromStartColumn) return 3;\n return null;\n}\n\nfunction getMoveNewRange(moveEdge: number | null, result: IRange, from: IRange, to: IRange, origin: IRange, remain: IRange): IRange | undefined {\n const { startRow, endRow, startColumn, endColumn, rangeType } = startEnd(result);\n const f = startEnd(from);\n const fromRangeType = from.rangeType ?? RANGE_TYPE.NORMAL;\n const t = startEnd(to);\n const rm = startEnd(remain);\n const o = startEnd(origin);\n const originRangeType = origin.rangeType ?? RANGE_TYPE.NORMAL;\n const newRange: IRange = { ...origin };\n const rowsCover = () => (rangeType === RANGE_TYPE.COLUMN && originRangeType === RANGE_TYPE.COLUMN) || (startColumn >= o.startColumn && endColumn <= o.endColumn);\n const columnsCover = () => (rangeType === RANGE_TYPE.ROW && originRangeType === RANGE_TYPE.ROW) || (startRow >= o.startRow && endRow <= o.endRow);\n if (moveEdge === 0) {\n if (!rowsCover()) return undefined;\n if (startRow < o.startRow) newRange.startRow = startRow;\n else if (startRow >= o.endRow) newRange.endRow -= f.endRow + 1 - o.startRow;\n else return undefined;\n } else if (moveEdge === 1) {\n if (!rowsCover()) return undefined;\n if (endRow > o.endRow) newRange.endRow = endRow;\n else if (endRow <= o.startRow) newRange.startRow += o.endRow - f.startRow + 1;\n else return undefined;\n } else if (moveEdge === 2) {\n if (!columnsCover()) return undefined;\n if (startColumn < o.startColumn) newRange.startColumn = startColumn;\n else if (startColumn >= o.endColumn) newRange.endColumn -= f.endColumn + 1 - o.startColumn;\n else return undefined;\n } else if (moveEdge === 3) {\n if (!columnsCover()) return undefined;\n if (endColumn > o.endColumn) newRange.endColumn = endColumn;\n else if (endColumn <= o.startColumn) newRange.startColumn += o.endColumn - f.startColumn + 1;\n else return undefined;\n } else if (moveEdge === 4) {\n Object.assign(newRange, { startRow, startColumn, endRow, endColumn });\n } else if ((f.startColumn <= o.startColumn && f.endColumn >= o.endColumn) || (fromRangeType === RANGE_TYPE.ROW && originRangeType === RANGE_TYPE.ROW)) {\n const n = f.endRow - f.startRow + 1;\n if (from.endRow < o.startRow) {\n if (t.startRow >= o.startRow) newRange.startRow -= n;\n if (t.startRow >= o.endRow) newRange.endRow -= n;\n } else if (from.startRow > o.endRow) {\n if (t.endRow <= o.endRow) newRange.endRow += n;\n if (t.endRow <= o.startRow) newRange.startRow += n;\n } else if (from.startRow >= o.startRow && from.endRow <= o.endRow) {\n if (t.startRow <= o.startRow) newRange.startRow += n;\n else if (t.startRow >= o.endRow) newRange.endRow -= n;\n }\n } else if ((f.startRow <= o.startRow && f.endRow >= o.endRow) || (fromRangeType === RANGE_TYPE.COLUMN && originRangeType === RANGE_TYPE.COLUMN)) {\n const n = f.endColumn - f.startColumn + 1;\n if (from.endColumn < o.startColumn) {\n if (t.startColumn >= o.startColumn) newRange.startColumn -= n;\n if (t.startColumn >= o.endColumn) newRange.endColumn -= n;\n } else if (from.startColumn > o.endColumn) {\n if (t.endColumn <= o.endColumn) newRange.endColumn += n;\n if (t.endColumn <= o.startColumn) newRange.startColumn += n;\n } else if (from.startColumn >= o.startColumn && from.endColumn <= o.endColumn) {\n if (t.startColumn <= o.startColumn) newRange.startColumn += n;\n else if (t.startColumn >= o.endColumn) newRange.endColumn -= n;\n }\n } else {\n // the three remaining branches of the original all take the result as is\n Object.assign(newRange, { startRow, startColumn, endRow, endColumn });\n void rm;\n }\n return newRange;\n}\n\n/** The new range of one reference, REF_ERROR when it is gone, or undefined when the change leaves it alone. */\nfunction moveRange(range: IRange, axis: Axis, op: AxisOp): IRange | typeof REF_ERROR | undefined {\n const isRow = axis === \"row\";\n if (op.kind === \"insert\") {\n const r = isRow ? fullRowsRange(op.at, op.count) : fullColsRange(op.at, op.count);\n const ops = isRow\n ? handleInsertRow({ id: EffectRefRangId.InsertRowCommandId, params: { range: r, unitId: \"\", subUnitId: \"\", direction: Direction.DOWN } }, range)\n : handleInsertCol({ id: EffectRefRangId.InsertColCommandId, params: { range: r, unitId: \"\", subUnitId: \"\", direction: Direction.RIGHT } }, range);\n const res = runRefRangeMutations(ops, range);\n return res == null ? undefined : { ...range, ...res };\n }\n if (op.kind === \"remove\") {\n const r = isRow ? fullRowsRange(op.start, op.count) : fullColsRange(op.start, op.count);\n const ops = isRow\n ? handleIRemoveRow({ id: EffectRefRangId.RemoveRowCommandId, params: { range: r } }, range, [])\n : handleIRemoveCol({ id: EffectRefRangId.RemoveColCommandId, params: { range: r } }, range);\n const res = runRefRangeMutations(ops, range);\n return res == null ? REF_ERROR : { ...range, ...res };\n }\n const from = isRow ? fullRowsRange(op.from, op.count) : fullColsRange(op.from, op.count);\n const to = isRow ? fullRowsRange(op.to, op.count) : fullColsRange(op.to, op.count);\n const moveEdge = checkMoveEdge(range, from);\n let remain = getIntersectRange(range, from);\n if (isRow) {\n if (remain == null && ((from.endRow < range.startRow && to.endRow <= range.startRow) || (from.startRow > range.endRow && to.startRow > range.endRow))) return undefined;\n } else if (remain == null && ((from.endColumn < range.startColumn && to.endColumn <= range.startColumn) || (from.startColumn > range.endColumn && to.startColumn > range.endColumn))) return undefined;\n remain ??= { startRow: range.startRow, endRow: range.endRow, startColumn: range.startColumn, endColumn: range.endColumn, rangeType: RANGE_TYPE.NORMAL };\n const ops = isRow\n ? handleMoveRows({ id: EffectRefRangId.MoveRowsCommandId, params: { toRange: to, fromRange: from } }, remain)\n : handleMoveCols({ id: EffectRefRangId.MoveColsCommandId, params: { toRange: to, fromRange: from } }, remain);\n const res = runRefRangeMutations(ops, remain);\n if (res == null) return REF_ERROR;\n return getMoveNewRange(moveEdge, res, from, to, range, remain);\n}\n\nexport interface Rewritten {\n readonly text: string;\n readonly changed: boolean;\n}\n\n/**\n * The formula (or defined-name ref string) after `change`, exactly as Univer rewrites it: every reference into\n * the changed sheet moves (or becomes #REF!), and once anything changed every other reference is re-serialized\n * (`updateRefOffset`). Returns a reason string when the text cannot be transformed.\n */\nexport function rewriteFormula(text: string, ctx: FormulaCtx, change: RefChange): Rewritten | string {\n const p = parse(text);\n if (typeof p === \"string\") return p;\n const nodes = p.nodes.slice();\n const changedIds: number[] = [];\n for (let i = 0; i < nodes.length; i++) {\n const n = nodes[i]!;\n if (typeof n === \"string\") continue;\n if (change.kind === \"defined-name\") {\n if ((n.nodeType === sequenceNodeType.DEFINED_NAME || n.nodeType === sequenceNodeType.FUNCTION) && n.token === change.from) {\n nodes[i] = { ...n, token: change.to ?? REF_ERROR };\n changedIds.push(i);\n }\n continue;\n }\n if (n.nodeType !== sequenceNodeType.REFERENCE) continue;\n const { range, sheetName, unitId } = deserializeRangeWithSheet(n.token);\n const target = targetSheet(sheetName, ctx);\n if (target === undefined) return `sheet \"${sheetName}\" is not in refSheets (capture must call annotateRefSheets)`;\n if (target !== change.sheet) continue;\n let token: string | undefined;\n if (change.kind === \"rename\") {\n if (!sheetName) continue; // an unqualified reference names no sheet\n token = serializeRangeToRefString({ range, sheetName: change.name, unitId });\n } else {\n // sheets-formula moves `Rectangle.moveOffset(range, 0, 0)`, not the parsed range (it differs for whole rows/columns)\n const moved = moveRange(Rectangle.moveOffset(range, 0, 0), change.axis, change.op);\n if (moved === undefined) continue;\n token = moved === REF_ERROR ? REF_ERROR : serializeRangeToRefString({ range: moved, sheetName: target === ctx.ownSheet && !ctx.keepQualifier ? \"\" : sheetName, unitId });\n }\n nodes[i] = { ...n, token };\n changedIds.push(i);\n }\n if (!changedIds.length) return { text, changed: false };\n // updateRefOffset: every other reference is re-serialized too, as Univer does\n for (let i = 0; i < nodes.length; i++) {\n const n = nodes[i]!;\n if (typeof n === \"string\" || n.nodeType !== sequenceNodeType.REFERENCE || changedIds.includes(i)) continue;\n nodes[i] = { ...n, token: serializeRangeToRefString(deserializeRangeWithSheet(n.token)) };\n }\n const out = p.prefix + generateStringWithSequence(nodes);\n return { text: out, changed: out !== text };\n}\n\n/**\n * An op's `refSheets` after a rename: the renamed sheet answers to its new name only, and a name that was\n * no sheet before now names it. Unchanged (same object) when the rename touches nothing it lists.\n */\nexport function refSheetsAfter(refSheets: RefSheets | undefined, change: RefChange): RefSheets | undefined {\n if (change.kind !== \"rename\" || !refSheets) return refSheets;\n const entries = Object.entries(refSheets);\n if (!entries.some(([name, id]) => id === change.sheet || name === change.name)) return refSheets;\n const next: Record<string, string | null> = {};\n for (const [name, id] of entries) if (id !== change.sheet && name !== change.name) next[name] = id;\n next[change.name] = change.sheet;\n return next;\n}\n\n/** `refSheets` for the given formula texts: every sheet name they qualify a reference with, resolved now. */\nexport function refSheetsFor(texts: Iterable<string>, sheets: Readonly<Record<string, string>>): RefSheets | undefined {\n const byName = new Map(Object.entries(sheets).map(([id, name]) => [name, id] as const));\n const out: Record<string, string | null> = {};\n for (const t of texts) for (const name of referencedSheetNames(t)) out[name] = byName.get(name) ?? null;\n return Object.keys(out).length ? out : undefined;\n}\n"],"mappings":"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","names":["to","out","r","ops","res","barrier","FULL","ch","out","gone","first","rest"]}
1
+ {"version":3,"sources":["../src/collab/sheets/transform/types.ts","../src/collab/sheets/transform/registry.ts","../src/collab/sheets/transform/transform.ts","../src/collab/sheets/transform/axis.ts","../src/collab/sheets/transform/formula.ts"],"sourcesContent":["/**\n * Sheet co-editing transforms (C5a): the shapes. Pure data; no Univer import.\n *\n * Convention (COLLAB-DESIGN §6.4): `transform(x, y, side)` returns `x` rewritten to apply AFTER `y`, where\n * `side` is x's side. The later-committed op always takes \"left\": it wins overwrites and sits first on\n * position ties.\n */\n\n/** One allowlisted Univer mutation as it travels: no `unitId` (the receiver re-addresses to its own unit). */\nexport interface SheetMutation {\n readonly id: string;\n readonly params: Readonly<Record<string, unknown>>;\n}\n\n/** A top-level command's mutations, applied in order. The unit the transformer works on. */\nexport type SheetGroup = readonly SheetMutation[];\n\nexport type Side = \"left\" | \"right\";\n\nexport interface Barrier {\n readonly barrier: true;\n readonly reason: string;\n}\n\nexport interface Transformed {\n /** x rewritten to apply after y; `[]` when nothing of x survives. */\n readonly op: SheetMutation[];\n /** Parts of the OTHER op (y) that x overrode: y's author is told (\"Sam changed B4 at the same time\"). */\n readonly lost: string[];\n /** Parts of x itself that cannot apply after y (an edit inside rows y removed): x's author is told. */\n readonly dropped: string[];\n}\n\nexport type TransformResult = Transformed | Barrier;\n\nexport const isBarrier = (r: TransformResult): r is Barrier => (r as Barrier).barrier === true;\n\nexport interface SheetRange {\n startRow: number;\n endRow: number;\n startColumn: number;\n endColumn: number;\n rangeType?: number;\n [k: string]: unknown;\n}\n","/**\n * The sheet mutation registry (COLLAB-DESIGN §10): every mutation id Univer 1.0.4 can emit into a workbook\n * is declared here exactly once, as covered (with its params allowlist), never-travels, or a barrier.\n * `census.test.ts` fails when an emitted id is missing or a declared id is stale.\n *\n * Covered in C5a: cell values and styles, row/column insert, remove and move, merge/unmerge, row height,\n * column width, worksheet name. C5b: formula text in cells (`f`, array `ref`) and defined names. Shared\n * formulas (`si`) stay barriers (see transform.ts cellBarrier); ranged resources are C5c.\n */\n\nexport type SheetFamily = \"cell\" | \"structure\" | \"merge\" | \"size\" | \"name\" | \"defname\" | \"numfmt\" | \"count\" | \"sheet\" | \"sort\";\n\nexport interface CoveredEntry {\n readonly kind: \"covered\";\n readonly family: SheetFamily;\n /** The params that travel. `unitId` never travels. */\n readonly allow: readonly string[];\n}\nexport interface NeverEntry {\n readonly kind: \"never-travels\";\n readonly reason: string;\n}\nexport interface BarrierEntry {\n readonly kind: \"barrier\";\n /** The unit that owns its transform (C5c resources) or \"X\" (no unit yet). */\n readonly until: \"C5c\" | \"X\";\n readonly reason: string;\n}\nexport type RegistryEntry = CoveredEntry | NeverEntry | BarrierEntry;\n\nconst covered = (family: SheetFamily, ...allow: string[]): CoveredEntry => ({ kind: \"covered\", family, allow: [\"subUnitId\", ...allow] });\nconst never = (reason: string): NeverEntry => ({ kind: \"never-travels\", reason });\nconst barrier = (until: BarrierEntry[\"until\"], reason: string): BarrierEntry => ({ kind: \"barrier\", until, reason });\n\nconst FORMULA_RESULT = \"formula engine output; every seat computes it (dropped at capture)\";\nconst RESOURCE = \"ranged resource keyed by id; C5c\";\nconst UNIVER_COMMENTS = \"Univer's own thread-comment store; our comments anchor elsewhere (design §8)\";\n\nexport const SHEET_MUTATIONS: Readonly<Record<string, RegistryEntry>> = {\n // ── covered (C5a) ────────────────────────────────────────────────────────────────────────────────\n \"sheet.mutation.set-range-values\": covered(\"cell\", \"cellValue\", \"refSheets\", \"derived\"),\n \"sheet.mutation.insert-row\": covered(\"structure\", \"range\", \"rowInfo\"),\n \"sheet.mutation.remove-rows\": covered(\"structure\", \"range\"),\n \"sheet.mutation.insert-col\": covered(\"structure\", \"range\", \"colInfo\"),\n \"sheet.mutation.remove-col\": covered(\"structure\", \"range\"),\n \"sheet.mutation.move-rows\": covered(\"structure\", \"sourceRange\", \"targetRange\"),\n \"sheet.mutation.move-columns\": covered(\"structure\", \"sourceRange\", \"targetRange\"),\n \"sheet.mutation.add-worksheet-merge\": covered(\"merge\", \"ranges\"),\n \"sheet.mutation.remove-worksheet-merge\": covered(\"merge\", \"ranges\"),\n \"sheet.mutation.set-worksheet-row-height\": covered(\"size\", \"ranges\", \"rowHeight\"),\n \"sheet.mutation.set-worksheet-row-is-auto-height\": covered(\"size\", \"ranges\", \"autoHeightInfo\"),\n \"sheet.mutation.set-worksheet-row-auto-height\": covered(\"size\", \"rowsAutoHeightInfo\"),\n \"sheet.mutation.set-worksheet-col-width\": covered(\"size\", \"ranges\", \"colWidth\"),\n \"sheet.mutation.set-worksheet-name\": covered(\"name\", \"name\"),\n // ── covered (C5c) ────────────────────────────────────────────────────────────────────────────────\n \"sheet.mutation.set.numfmt\": covered(\"numfmt\", \"values\", \"refMap\"),\n \"sheet.mutation.remove.numfmt\": covered(\"numfmt\", \"ranges\"),\n \"sheet.mutation.set-worksheet-row-count\": covered(\"count\", \"rowCount\"),\n \"sheet.mutation.set-worksheet-column-count\": covered(\"count\", \"columnCount\"),\n \"sheet.mutation.insert-sheet\": covered(\"sheet\", \"index\", \"sheet\"),\n \"sheet.mutation.remove-sheet\": covered(\"sheet\", \"sheetIndex\", \"sheetsLeft\"),\n \"sheet.mutation.set-worksheet-order\": covered(\"sheet\", \"fromOrder\", \"toOrder\"),\n \"sheet.mutation.reorder-range\": covered(\"sort\", \"range\", \"order\"),\n\n // ── never travels ────────────────────────────────────────────────────────────────────────────────\n \"formula.mutation.set-formula-calculation-start\": never(FORMULA_RESULT),\n \"formula.mutation.set-trigger-formula-calculation-start\": never(FORMULA_RESULT),\n \"formula.mutation.set-formula-calculation-stop\": never(FORMULA_RESULT),\n \"formula.mutation.set-formula-calculation-notification\": never(FORMULA_RESULT),\n \"formula.mutation.set-formula-calculation-result\": never(FORMULA_RESULT),\n \"formula.mutation.set-array-formula-data\": never(FORMULA_RESULT),\n \"formula.mutation.set-formula-data\": never(FORMULA_RESULT),\n \"formula.mutation.set-image-formula-data\": never(FORMULA_RESULT),\n \"formula.mutation.set-formula-string-batch-calculation\": never(FORMULA_RESULT),\n \"formula.mutation.set-formula-string-batch-calculation-result\": never(FORMULA_RESULT),\n \"formula.mutation.set-formula-dependency-calculation\": never(FORMULA_RESULT),\n \"formula.mutation.set-formula-dependency-calculation-result\": never(FORMULA_RESULT),\n \"formula.mutation.set-cell-formula-dependency-calculation\": never(FORMULA_RESULT),\n \"formula.mutation.set-cell-formula-dependency-calculation-result\": never(FORMULA_RESULT),\n \"formula.mutation.set-query-formula-dependency\": never(FORMULA_RESULT),\n \"formula.mutation.set-query-formula-dependency-result\": never(FORMULA_RESULT),\n \"formula.mutation.set-query-formula-dependency-all\": never(FORMULA_RESULT),\n \"formula.mutation.set-query-formula-dependency-all-result\": never(FORMULA_RESULT),\n \"formula.mutation.register-function\": never(\"registers a function body on this seat's engine\"),\n \"sheet.mutation.data-validation-formula-mark-dirty\": never(\"dirty mark\"),\n \"sheet.mutation.mark-dirty-filter-change\": never(\"dirty mark\"),\n \"sheet.mutation.re-calc-filter\": never(\"filter recalculation result\"),\n \"sheet.mutation.toggle-note-popup\": never(\"popup state\"),\n \"sheet.operation.clear-drawing-transformer\": never(\"drawing selection handles (declared as a mutation)\"),\n \"sheet.mutation.copy-worksheet-end\": never(\"end marker of a copy; the copy travels as insert-sheet\"),\n \"sheet.mutation.empty\": never(\"no content\"),\n \"thread-comment.mutation.add-comment\": never(UNIVER_COMMENTS),\n \"thread-comment.mutation.update-comment\": never(UNIVER_COMMENTS),\n \"thread-comment.mutation.update-comment-ref\": never(UNIVER_COMMENTS),\n \"thread-comment.mutation.resolve-comment\": never(UNIVER_COMMENTS),\n \"thread-comment.mutation.delete-comment\": never(UNIVER_COMMENTS),\n\n // ── barriers: X (no transform yet, design §10) ───────────────────────────────────────────────────\n \"sheet.mutation.move-range\": barrier(\"X\", \"cut-paste carries the sender's cell matrices\"),\n \"sheet.mutation.set-worksheet-hidden\": barrier(\"X\", \"sheet-level setting: not in C5a\"),\n \"sheet.mutation.set-tab-color\": barrier(\"X\", \"sheet-level setting: not in C5a\"),\n \"sheet.mutation.set-workbook-name\": barrier(\"X\", \"workbook-level setting: not in C5a\"),\n \"sheet.mutation.set-worksheet-right-to-left\": barrier(\"X\", \"sheet-level setting: not in C5a\"),\n \"sheet.mutation.toggle-gridlines\": barrier(\"X\", \"sheet-level setting: not in C5a\"),\n \"sheet.mutation.set-gridlines-color\": barrier(\"X\", \"sheet-level setting: not in C5a\"),\n \"sheet.mutation.set-worksheet-default-style\": barrier(\"X\", \"sheet-level setting: not in C5a\"),\n \"sheet.mutation.set-frozen\": barrier(\"X\", \"absolute frozen indices: not in C5a\"),\n \"sheet.mutation.set-row-data\": barrier(\"X\", \"row properties by index: not in C5a\"),\n \"sheet.mutation.set-col-data\": barrier(\"X\", \"column properties by index: not in C5a\"),\n \"sheet.mutation.set-row-hidden\": barrier(\"X\", \"row visibility: not in C5a\"),\n \"sheet.mutation.set-row-visible\": barrier(\"X\", \"row visibility: not in C5a\"),\n \"sheet.mutation.set-col-hidden\": barrier(\"X\", \"column visibility: not in C5a\"),\n \"sheet.mutation.set-col-visible\": barrier(\"X\", \"column visibility: not in C5a\"),\n \"sheet.mutation.add-range-protection\": barrier(\"X\", \"permissions: not in C5a\"),\n \"sheet.mutation.set-range-protection\": barrier(\"X\", \"permissions: not in C5a\"),\n \"sheet.mutation.delete-range-protection\": barrier(\"X\", \"permissions: not in C5a\"),\n \"sheet.mutation.add-worksheet-protection\": barrier(\"X\", \"permissions: not in C5a\"),\n \"sheet.mutation.set-worksheet-protection\": barrier(\"X\", \"permissions: not in C5a\"),\n \"sheet.mutation.delete-worksheet-protection\": barrier(\"X\", \"permissions: not in C5a\"),\n \"sheet.mutation.set-worksheet-permission-points\": barrier(\"X\", \"permissions: not in C5a\"),\n\n // ── formulas (C5b) ───────────────────────────────────────────────────────────────────────────────\n \"formula.mutation.set-defined-name\": covered(\"defname\", \"id\", \"name\", \"formulaOrRefString\", \"formulaOrRefStringWithPrefix\", \"comment\", \"localSheetId\", \"hidden\", \"refSheets\", \"previousName\", \"derived\"),\n \"formula.mutation.remove-defined-name\": covered(\"defname\", \"id\", \"name\"),\n \"formula.mutation.set-feature-calculation\": barrier(\"X\", \"a plugin's registered calculation (feature id + dependency ranges); no transform yet\"),\n \"formula.mutation.remove-feature-calculation\": barrier(\"X\", \"a plugin's registered calculation; no transform yet\"),\n \"formula.mutation.set-other-formula\": barrier(\"C5c\", \"formulas owned by conditional formats and data validation travel with their rule\"),\n \"formula.mutation.remove-other-formula\": barrier(\"C5c\", \"formulas owned by conditional formats and data validation travel with their rule\"),\n \"formula.mutation.set-super-table\": barrier(\"C5c\", \"table names in structured references belong to tables (C5c)\"),\n \"formula.mutation.remove-super-table\": barrier(\"C5c\", \"table names in structured references belong to tables (C5c)\"),\n \"formula.mutation.set-super-table-option\": barrier(\"C5c\", \"table names in structured references belong to tables (C5c)\"),\n\n // ── barriers until C5c (ranged resources) ────────────────────────────────────────────────────────\n \"sheet.mutation.add-conditional-rule\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.set-conditional-rule\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.delete-conditional-rule\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.move-conditional-rule\": barrier(\"C5c\", \"conditional-format priority (ordered list)\"),\n \"data-validation.mutation.addRule\": barrier(\"C5c\", RESOURCE),\n \"data-validation.mutation.updateRule\": barrier(\"C5c\", RESOURCE),\n \"data-validation.mutation.removeRule\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.set-filter-range\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.set-filter-criteria\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.remove-filter\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.add-table\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.delete-table\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.set-sheet-table\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.set-table-filter\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.move-table\": barrier(\"C5c\", RESOURCE),\n \"sheets.mutation.add-hyper-link\": barrier(\"C5c\", RESOURCE),\n \"sheets.mutation.remove-hyper-link\": barrier(\"C5c\", RESOURCE),\n \"sheets.mutation.update-hyper-link\": barrier(\"C5c\", RESOURCE),\n \"sheets.mutation.update-hyper-link-ref\": barrier(\"C5c\", RESOURCE),\n \"sheets.mutation.update-rich-hyper-link\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.update-note\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.remove-note\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.update-note-position\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.set-drawing-apply\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.set-worksheet-background-image\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.add-range-theme\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.set-range-theme\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.remove-range-theme\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.set-worksheet-range-theme-style\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.remove-worksheet-range-theme-style\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.register-worksheet-range-theme-style\": barrier(\"C5c\", RESOURCE),\n \"sheet.mutation.unregister-worksheet-range-theme-style\": barrier(\"C5c\", RESOURCE),\n};\n\n/** Keep only the allowlisted params of a covered id; anything else returns null (it does not travel). */\nexport function allowParams(id: string, params: Readonly<Record<string, unknown>>): Record<string, unknown> | null {\n const entry = SHEET_MUTATIONS[id];\n if (!entry || entry.kind !== \"covered\") return null;\n const out: Record<string, unknown> = {};\n for (const f of entry.allow) if (params[f] !== undefined) out[f] = params[f];\n return out;\n}\n","/**\n * The C5a sheet transformer: `transformGroup(x, y, side)` rewrites command group x to apply after group y.\n * Pure: no Univer runtime, no DOM. One rule (COLLAB-DESIGN §6.4): the later-committed op takes \"left\"; it\n * wins overwrites and sits first on position ties. Anything without a proven transform is a Barrier.\n *\n * Covered families: cell values and styles (set-range-values), row/column insert, remove and move,\n * merge/unmerge, row height / column width, worksheet name. See `registry.ts` for every other id.\n *\n * Merges: Univer moves merges two ways when rows or columns change. A listener in MergeCellController shifts\n * merges that sit wholly after the change on EVERY seat (no mutation travels); the command adds explicit\n * remove-merge / add-merge fixups for merges the change cuts through. `mergeThrough` reproduces both, so a\n * merge added concurrently is moved exactly as the command would have moved it.\n */\nimport { adjustRangeOnMutation } from \"@univerjs/sheets\";\nimport { type Axis, type AxisOp, mapIndex, runs, transformAxis } from \"./axis\";\nimport { type FormulaCtx, type RefChange, type RefSheets, REF_ERROR, formulaBarrier, isFormulaText, refSheetsAfter, refSheetsFor, rewriteFormula } from \"./formula\";\nimport { SHEET_MUTATIONS } from \"./registry\";\nimport { type Barrier, type SheetGroup, type SheetMutation, type SheetRange, type Side, type TransformResult, type Transformed, isBarrier } from \"./types\";\n\nexport const SHEET_TRANSFORMER_VERSION = \"c5c-1\";\n\nconst ID = {\n values: \"sheet.mutation.set-range-values\",\n insertRow: \"sheet.mutation.insert-row\",\n removeRows: \"sheet.mutation.remove-rows\",\n insertCol: \"sheet.mutation.insert-col\",\n removeCol: \"sheet.mutation.remove-col\",\n moveRows: \"sheet.mutation.move-rows\",\n moveCols: \"sheet.mutation.move-columns\",\n addMerge: \"sheet.mutation.add-worksheet-merge\",\n removeMerge: \"sheet.mutation.remove-worksheet-merge\",\n rowHeight: \"sheet.mutation.set-worksheet-row-height\",\n rowIsAuto: \"sheet.mutation.set-worksheet-row-is-auto-height\",\n rowAutoHeight: \"sheet.mutation.set-worksheet-row-auto-height\",\n colWidth: \"sheet.mutation.set-worksheet-col-width\",\n name: \"sheet.mutation.set-worksheet-name\",\n setName: \"formula.mutation.set-defined-name\",\n removeName: \"formula.mutation.remove-defined-name\",\n setNumfmt: \"sheet.mutation.set.numfmt\",\n removeNumfmt: \"sheet.mutation.remove.numfmt\",\n rowCount: \"sheet.mutation.set-worksheet-row-count\",\n colCount: \"sheet.mutation.set-worksheet-column-count\",\n insertSheet: \"sheet.mutation.insert-sheet\",\n removeSheet: \"sheet.mutation.remove-sheet\",\n sheetOrder: \"sheet.mutation.set-worksheet-order\",\n sort: \"sheet.mutation.reorder-range\",\n} as const;\n\n/**\n * Pairs the fuzz proved divergent (or that have no transform yet), as unordered mutation-id pairs, with the\n * failing seed. Each returns a Barrier until it has its own correct transform under a new proto.\n */\nexport const PAIR_BARRIERS: Readonly<Record<string, { seed: number | null; reason: string }>> = {};\n\nconst pairKey = (a: string, b: string) => (a < b ? `${a}|${b}` : `${b}|${a}`);\nconst barrier = (reason: string): Barrier => ({ barrier: true, reason });\nconst ok = (op: SheetMutation[], lost: string[] = [], dropped: string[] = []): Transformed => ({ op, lost, dropped });\nconst flip = (side: Side): Side => (side === \"left\" ? \"right\" : \"left\");\n\n// ── addressing ──────────────────────────────────────────────────────────────────────────────────────\nconst sheetOf = (m: SheetMutation) => String(m.params.subUnitId ?? \"\");\nfunction colName(c: number): string {\n let s = \"\";\n for (let n = c + 1; n > 0; n = Math.floor((n - 1) / 26)) s = String.fromCharCode(65 + ((n - 1) % 26)) + s;\n return s;\n}\nexport const cellRef = (sheet: string, row: number, col: number) => `${sheet}!${colName(col)}${row + 1}`;\nconst rangeRef = (sheet: string, r: SheetRange) =>\n `${sheet}!${colName(r.startColumn)}${r.startRow + 1}:${colName(r.endColumn)}${r.endRow + 1}`;\n\n// ── structural ops ──────────────────────────────────────────────────────────────────────────────────\ninterface Structural {\n axis: Axis;\n op: AxisOp;\n}\nfunction structuralOf(m: SheetMutation): Structural | null {\n const p = m.params as Record<string, SheetRange | undefined>;\n switch (m.id) {\n case ID.insertRow:\n return { axis: \"row\", op: { kind: \"insert\", at: p.range!.startRow, count: p.range!.endRow - p.range!.startRow + 1 } };\n case ID.removeRows:\n return { axis: \"row\", op: { kind: \"remove\", start: p.range!.startRow, count: p.range!.endRow - p.range!.startRow + 1 } };\n case ID.insertCol:\n return { axis: \"col\", op: { kind: \"insert\", at: p.range!.startColumn, count: p.range!.endColumn - p.range!.startColumn + 1 } };\n case ID.removeCol:\n return { axis: \"col\", op: { kind: \"remove\", start: p.range!.startColumn, count: p.range!.endColumn - p.range!.startColumn + 1 } };\n case ID.moveRows:\n return {\n axis: \"row\",\n op: { kind: \"move\", from: p.sourceRange!.startRow, count: p.sourceRange!.endRow - p.sourceRange!.startRow + 1, to: p.targetRange!.startRow },\n };\n case ID.moveCols:\n return {\n axis: \"col\",\n op: {\n kind: \"move\",\n from: p.sourceRange!.startColumn,\n count: p.sourceRange!.endColumn - p.sourceRange!.startColumn + 1,\n to: p.targetRange!.startColumn,\n },\n };\n default:\n return null;\n }\n}\n\nconst S = (axis: Axis) => (axis === \"row\" ? ([\"startRow\", \"endRow\"] as const) : ([\"startColumn\", \"endColumn\"] as const));\n\nfunction buildStructural(template: SheetMutation, axis: Axis, op: AxisOp): SheetMutation {\n const [a0, a1] = S(axis);\n const p = template.params as Record<string, unknown>;\n if (op.kind === \"move\") {\n const src = p.sourceRange as SheetRange;\n const tgt = p.targetRange as SheetRange;\n return {\n id: template.id,\n params: {\n ...p,\n sourceRange: { ...src, [a0]: op.from, [a1]: op.from + op.count - 1 },\n targetRange: { ...tgt, [a0]: op.to, [a1]: op.to + op.count - 1 },\n },\n };\n }\n const start = op.kind === \"insert\" ? op.at : op.start;\n return { id: template.id, params: { ...p, range: { ...(p.range as SheetRange), [a0]: start, [a1]: start + op.count - 1 } } };\n}\n\n/** The same structural op as a Univer mutation info, normalized to span the whole other axis, for Univer's helper. */\nfunction univerMutationInfo(axis: Axis, op: Exclude<AxisOp, { kind: \"move\" }>) {\n const FULL = { startRow: 0, endRow: Number.MAX_SAFE_INTEGER, startColumn: 0, endColumn: Number.MAX_SAFE_INTEGER };\n const start = op.kind === \"insert\" ? op.at : op.start;\n const range = axis === \"row\" ? { ...FULL, startRow: start, endRow: start + op.count - 1 } : { ...FULL, startColumn: start, endColumn: start + op.count - 1 };\n const id = op.kind === \"insert\" ? (axis === \"row\" ? ID.insertRow : ID.insertCol) : axis === \"row\" ? ID.removeRows : ID.removeCol;\n return { id, params: { unitId: \"\", subUnitId: \"\", range } };\n}\n\n// ── merges ──────────────────────────────────────────────────────────────────────────────────────────\nconst intersects = (a: SheetRange, b: SheetRange) =>\n a.startRow <= b.endRow && b.startRow <= a.endRow && a.startColumn <= b.endColumn && b.startColumn <= a.endColumn;\nconst isSingleCell = (r: SheetRange) => r.startRow === r.endRow && r.startColumn === r.endColumn;\n\n/**\n * Where Univer puts merge `m` when structural op `s` runs, and whether that move is a command fixup (a\n * traveling remove/add pair) rather than the seat-local listener shift. `null` = the merge is gone.\n */\nexport function mergeThrough(s: Structural, m: SheetRange): { range: SheetRange | null; fixup: boolean } {\n const [a0, a1] = S(s.axis);\n const lo = m[a0] as number;\n const hi = m[a1] as number;\n const op = s.op;\n if (op.kind === \"insert\") {\n // Univer's own helper is exact here once the insert spans the whole other axis.\n const fixup = lo < op.at && op.at <= hi;\n return { range: adjustRangeOnMutation(m, univerMutationInfo(s.axis, op)) as SheetRange, fixup };\n }\n if (op.kind === \"remove\") {\n const e = op.start + op.count - 1;\n if (e < lo || op.start > hi) return { range: adjustRangeOnMutation(m, univerMutationInfo(s.axis, op)) as SheetRange, fixup: false };\n // The command's own shrink rule (MergeCellController._handleRemove*Command), then a single cell is no merge.\n if (op.start <= lo && e >= hi) return { range: null, fixup: true };\n const r = { ...m };\n if (op.start >= lo && e <= hi) r[a1] = hi - op.count;\n else if (op.start < lo) {\n r[a0] = op.start;\n r[a1] = hi - op.count;\n } else r[a1] = op.start - 1;\n return { range: isSingleCell(r) ? null : r, fixup: true };\n }\n // move: the listener shifts merges clear of the source; the command moves merges wholly inside it; a merge\n // the source cuts through stays where it is (Univer refuses such moves on the sender's own seat).\n const fe = op.from + op.count - 1;\n if (hi < op.from || lo > fe) {\n const r = { ...m };\n if (op.from < lo && op.to > hi) {\n r[a0] = lo - op.count;\n r[a1] = hi - op.count;\n } else if (op.from > hi && op.to <= lo) {\n r[a0] = lo + op.count;\n r[a1] = hi + op.count;\n }\n return { range: r, fixup: false };\n }\n if (lo >= op.from && hi <= fe) {\n const r = { ...m, [a0]: mapIndex(op, lo)!, [a1]: mapIndex(op, hi)! };\n return { range: r, fixup: true };\n }\n return { range: m, fixup: false };\n}\n\n/**\n * The merge fixups a structural mutation is owed but Univer's command did not make (C5c). The transform's model\n * (`mergeThrough`) is \"every merge the change cuts through is moved by the command\"; Univer 1.0.4 only fixes the\n * merges that intersect the COMMAND's range on the other axis (a `-by-range` call with a partial range, an API\n * call) and only when its ref-range registration is current (it is refreshed on sheet activation, add-merge and\n * structural mutations, never after a content load or a remove-merge). A cut merge it skipped stays where it was on\n * the sender, while every transform moves it: chains of such ops diverged by a column (the session fuzz's\n * column -1 vs 0). Capture therefore completes the command: right BEFORE the structural mutation it removes the\n * cut merges still on the sheet (`remove`, exact, at their pre-change positions), and right AFTER it adds their\n * model positions (`add`). The same shape as Univer's own remove/move fixups, so every transform rule applies.\n * `mergesBefore` = the sheet's merges right before the mutation runs (after the command's own pre-removals).\n */\nexport function mergeFixupsOwed(m: SheetMutation, mergesBefore: readonly SheetRange[]): { remove: SheetRange[]; add: SheetRange[] } | null {\n const st = structuralOf(m);\n if (!st) return null;\n const remove: SheetRange[] = [];\n const add: SheetRange[] = [];\n for (const q of mergesBefore) {\n const t = mergeThrough(st, q);\n if (!t.fixup) continue;\n remove.push({ startRow: q.startRow, endRow: q.endRow, startColumn: q.startColumn, endColumn: q.endColumn, ...(q.rangeType !== undefined ? { rangeType: q.rangeType } : {}) });\n if (t.range) add.push({ ...t.range });\n }\n return remove.length ? { remove, add } : null;\n}\n\n/** True for the six row/column structural mutation ids. */\nexport const isStructuralMutation = (m: SheetMutation) => structuralOf(m) !== null;\n\n/**\n * Rewrites every remove-merge in a group to name the exact merges it removes. Univer removes every merge a\n * range intersects, and the unmerge command sends the SELECTION; a selection does not move the way the\n * merges under it move, so only exact merges transform correctly. `merges` is each sheet's mergeData right\n * before the group (C6 reads it in beforeCommandExecuted). Pure: the group is simulated, not applied.\n */\nexport function exactMergeRemovals(group: SheetGroup, merges: Readonly<Record<string, readonly SheetRange[]>>): SheetMutation[] {\n const sim = new Map<string, SheetRange[]>(Object.entries(merges).map(([k, v]) => [k, v.map((r) => ({ ...r }))]));\n const out: SheetMutation[] = [];\n for (const m of group) {\n const sheet = sheetOf(m);\n const cur = sim.get(sheet) ?? [];\n if (m.id === ID.removeMerge) {\n const hit = cur.filter((q) => mergeRanges(m).some((r) => intersects(r, q)));\n sim.set(sheet, cur.filter((q) => !hit.includes(q)));\n if (hit.length) out.push(withRanges(m, hit.map((r) => ({ ...r }))));\n continue;\n }\n if (m.id === ID.addMerge) sim.set(sheet, [...cur, ...mergeRanges(m).map((r) => ({ ...r }))]);\n const st = structuralOf(m);\n if (st) sim.set(sheet, cur.map((q) => mergeThrough(st, q).range).filter((q): q is SheetRange => q !== null));\n out.push(m);\n }\n return out;\n}\n\nconst mergeRanges = (m: SheetMutation) => (m.params.ranges as SheetRange[] | undefined) ?? [];\nconst withRanges = (m: SheetMutation, ranges: SheetRange[]): SheetMutation => ({ id: m.id, params: { ...m.params, ranges } });\nconst mergeMutation = (id: string, sheet: string, ranges: SheetRange[]): SheetMutation => ({ id, params: { subUnitId: sheet, ranges } });\n\n// ── cells ───────────────────────────────────────────────────────────────────────────────────────────\ntype Cell = Record<string, unknown> | null;\ntype CellMatrix = Record<string, Record<string, Cell>>;\n/** The content slot of a cell. A traveling entry that touches content must carry all of them (see completeCellContent). */\nexport const CONTENT_KEYS = [\"v\", \"t\", \"p\", \"f\", \"si\", \"custom\", \"ref\", \"xf\", \"ft\", \"fd\"] as const;\nconst CONTENT_TOUCH = [\"v\", \"p\", \"f\", \"si\", \"custom\", \"ref\", \"xf\", \"ft\", \"fd\"];\nconst KNOWN_CELL_KEYS = new Set<string>([...CONTENT_KEYS, \"s\"]);\n\n/**\n * Completes a captured cell entry's content slot from the sender's post-state, so content writes are full\n * replacements (an entry that sets `v` alone would otherwise keep a stale `p` on some seats). C6's capture\n * calls this per touched cell with the cell as it stands right after the command.\n */\nexport function completeCellContent(entry: Cell, post: Record<string, unknown> | null | undefined): Cell {\n if (entry === null) return null;\n if (!CONTENT_TOUCH.some((k) => k in entry)) return entry;\n const out: Record<string, unknown> = {};\n for (const k of CONTENT_KEYS) out[k] = post && post[k] !== undefined ? post[k] : null;\n if (out.v === null) delete out.t; // Univer stores no type without a value; t:null is not a content write\n if (\"s\" in entry) out.s = entry.s;\n return out;\n}\n\nfunction cellsOf(m: SheetMutation): CellMatrix {\n return (m.params.cellValue as CellMatrix | undefined) ?? {};\n}\nfunction forEachCell(cells: CellMatrix, fn: (r: number, c: number, v: Cell) => void) {\n for (const r of Object.keys(cells)) for (const c of Object.keys(cells[r] ?? {})) fn(Number(r), Number(c), cells[r]![c] ?? null);\n}\nfunction cellsMutation(template: SheetMutation, cells: CellMatrix): SheetMutation {\n return { id: template.id, params: { ...template.params, cellValue: cells } };\n}\nfunction putCell(cells: CellMatrix, r: number, c: number, v: Cell) {\n (cells[r] ??= {})[c] = v;\n}\nfunction cellsOverlap(a: CellMatrix, b: CellMatrix): boolean {\n for (const r of Object.keys(a)) {\n const br = b[r];\n if (!br) continue;\n for (const c of Object.keys(a[r] ?? {})) if (c in br) return true;\n }\n return false;\n}\nconst isEmptyMatrix = (cells: CellMatrix) => Object.values(cells).every((row) => Object.keys(row).length === 0);\n\n/** Why a set-range-values cannot be transformed by C5a, or null. Cached per mutation object (ops are immutable). */\nconst cellBarrierCache = new WeakMap<SheetMutation, string | null>();\nfunction cellBarrier(m: SheetMutation): string | null {\n const hit = cellBarrierCache.get(m);\n if (hit !== undefined) return hit;\n const why = cellBarrierOf(m);\n cellBarrierCache.set(m, why);\n return why;\n}\nfunction cellBarrierOf(m: SheetMutation): string | null {\n if (m.params.isOverrideStyle) return \"set-range-values with isOverrideStyle (whole-style replace) is not covered\";\n let why: string | null = null;\n forEachCell(cellsOf(m), (_r, _c, v) => {\n if (why || v === null) return;\n for (const k of Object.keys(v)) {\n if (why) break;\n if (!KNOWN_CELL_KEYS.has(k)) why = `cell key \"${k}\" is not covered`;\n else if (k === \"si\" && v.si != null) why = \"shared formula (si): its text lives in a master cell this op does not carry\";\n else if ((k === \"f\" && isFormulaText(v.f)) || (k === \"ref\" && typeof v.ref === \"string\")) why = formulaBarrier(v[k] as string, formulaCtx(m));\n }\n if (typeof v.s === \"string\") why = \"a style id travels (style ids are seat-local; capture must send the style object)\";\n if (!why && CONTENT_TOUCH.some((k) => k in v) && !CONTENT_KEYS.every((k) => k in v || (k === \"t\" && v.v == null)))\n why = \"cell content is not completed (capture must call completeCellContent)\";\n });\n return why;\n}\n\nconst hasContent = (v: Record<string, unknown>) => CONTENT_TOUCH.some((k) => k in v);\nconst contentOf = (v: Record<string, unknown>) => {\n const out: Record<string, unknown> = {};\n for (const k of Object.keys(v)) if (k !== \"s\") out[k] = v[k];\n return out;\n};\nconst richText = (v: Record<string, unknown>) => v.p != null;\n\n/** Style keys of a style object; borders count per side (\"bd.t\", \"bd.b\" …). */\nfunction styleKeys(s: Record<string, unknown>): string[] {\n const out: string[] = [];\n for (const k of Object.keys(s)) {\n if (k === \"bd\" && s.bd && typeof s.bd === \"object\") for (const side of Object.keys(s.bd)) out.push(`bd.${side}`);\n else out.push(k);\n }\n return out;\n}\nfunction withoutStyleKeys(s: Record<string, unknown>, drop: Set<string>): Record<string, unknown> | null {\n const out: Record<string, unknown> = {};\n for (const k of Object.keys(s)) {\n if (k === \"bd\" && s.bd && typeof s.bd === \"object\") {\n const bd: Record<string, unknown> = {};\n for (const side of Object.keys(s.bd)) if (!drop.has(`bd.${side}`)) bd[side] = (s.bd as Record<string, unknown>)[side];\n if (Object.keys(bd).length) out.bd = bd;\n } else if (!drop.has(k)) out[k] = s[k];\n }\n return Object.keys(out).length ? out : null;\n}\n\n/**\n * One cell touched by both x and y (same sheet). Returns x's entry after y as a list of entries applied in\n * order (a later entry re-applies what the other side keeps), plus what each side lost.\n */\nfunction transformCell(X: Cell, Y: Cell, side: Side): { entries: Cell[]; xLost: boolean; yLost: boolean } | string {\n // A null entry deletes the whole cell.\n if (X === null || Y === null) {\n if (side === \"left\") return { entries: [X], xLost: false, yLost: true };\n // x loses: a delete of x becomes delete-then-y; x's write on a cell y deleted is dropped.\n return X === null ? { entries: [null, Y], xLost: true, yLost: false } : { entries: [], xLost: true, yLost: false };\n }\n if ((hasContent(X) && richText(X) && \"s\" in Y) || (hasContent(Y) && richText(Y) && \"s\" in X))\n return \"rich-text content concurrent with a style change on the same cell is not covered\";\n const out: Record<string, unknown> = {};\n let xLost = false;\n let yLost = false;\n // content slot: later wins\n if (hasContent(X)) {\n if (!hasContent(Y) || side === \"left\") Object.assign(out, contentOf(X));\n else xLost = true;\n if (hasContent(Y) && side === \"left\") yLost = true;\n }\n // style slot: per key, later wins; a null style clears every key\n const tail: Cell[] = [];\n if (\"s\" in X) {\n const xs = X.s as Record<string, unknown> | null;\n const ys = \"s\" in Y ? (Y.s as Record<string, unknown> | null) : undefined;\n if (ys === undefined || side === \"left\") {\n if (xs !== undefined) out.s = xs;\n if (ys !== undefined) yLost = true;\n } else if (ys === null) {\n xLost = true; // y cleared every style key after x\n } else if (xs === null) {\n // x cleared styles, y (later) set some: clear, then put y's keys back\n out.s = null;\n tail.push({ s: ys });\n xLost = true;\n } else {\n const kept = withoutStyleKeys(xs, new Set(styleKeys(ys)));\n if (kept) out.s = kept;\n if (styleKeys(xs).length !== styleKeys(kept ?? {}).length) xLost = true;\n }\n }\n return { entries: Object.keys(out).length ? [out, ...tail] : tail, xLost, yLost };\n}\n\nfunction transformCellsOverCells(x: SheetMutation, y: SheetMutation, side: Side): TransformResult {\n if (sheetOf(x) !== sheetOf(y)) return ok([x]);\n const ycells = cellsOf(y);\n if (!cellsOverlap(cellsOf(x), ycells)) return ok([x]); // no shared cell: x is untouched\n const xd = isDerived(x);\n const yd = isDerived(y);\n const eff = derivedSide(x, y, side);\n const passes: CellMatrix[] = [{}];\n const lost: string[] = [];\n const dropped: string[] = [];\n let why: string | null = null;\n forEachCell(cellsOf(x), (r, c, X) => {\n if (why) return;\n const yRow = ycells[r];\n if (!yRow || !(String(c) in yRow)) {\n putCell(passes[0]!, r, c, X);\n return;\n }\n const res = transformCell(X, yRow[c] ?? null, eff);\n if (typeof res === \"string\") {\n why = res;\n return;\n }\n res.entries.forEach((e, i) => putCell((passes[i] ??= {}), r, c, e));\n // a derived rewrite losing is nobody's loss: no notice\n if (res.xLost && !xd) dropped.push(cellRef(sheetOf(x), r, c));\n if (res.yLost && !yd) lost.push(cellRef(sheetOf(x), r, c));\n });\n if (why) return barrier(why);\n const op = passes.filter((p) => !isEmptyMatrix(p)).map((p) => cellsMutation(x, p));\n return ok(op, lost, dropped);\n}\n\n\n// ── formulas (C5b) ──────────────────────────────────────────────────────────────────────────────────\n/** Params that travel for the transformer only; `forApply` strips them before Univer sees the mutation. */\nexport const SIDE_CAR_PARAMS = [\"refSheets\", \"previousName\", \"derived\", \"sheetIndex\", \"sheetsLeft\"] as const;\n\n/**\n * A derived mutation is a formula rewrite a structural op, a rename or a defined-name change carries for\n * formulas that already existed (Univer's interceptors). It never outranks a person's concurrent write to the\n * same cell or name, whichever committed first: the person's write is rewritten by the same change instead.\n */\nconst isDerived = (m: SheetMutation) => m.params.derived === true;\nfunction derivedSide(x: SheetMutation, y: SheetMutation, side: Side): Side {\n const xd = isDerived(x);\n const yd = isDerived(y);\n return xd === yd ? side : xd ? \"right\" : \"left\";\n}\nexport function forApply(m: SheetMutation): SheetMutation {\n if (!SIDE_CAR_PARAMS.some((k) => k in m.params)) return m;\n const params = { ...m.params };\n for (const k of SIDE_CAR_PARAMS) delete params[k];\n return { id: m.id, params };\n}\n\nconst refSheetsOf = (m: SheetMutation) => m.params.refSheets as RefSheets | undefined;\nconst formulaCtx = (m: SheetMutation): FormulaCtx => ({ ownSheet: sheetOf(m), refSheets: refSheetsOf(m) });\nfunction withRefSheets(params: Readonly<Record<string, unknown>>, rs: RefSheets | undefined): Record<string, unknown> {\n const out: Record<string, unknown> = { ...params };\n if (rs) out.refSheets = rs;\n else delete out.refSheets;\n return out;\n}\nconst hasFormulaText = (v: Cell) => !!v && (isFormulaText(v.f) || typeof v.ref === \"string\");\nconst hasFormulaCache = new WeakMap<SheetMutation, boolean>();\nfunction hasFormula(m: SheetMutation): boolean {\n const hit = hasFormulaCache.get(m);\n if (hit !== undefined) return hit;\n const any = hasFormulaOf(m);\n hasFormulaCache.set(m, any);\n return any;\n}\nfunction hasFormulaOf(m: SheetMutation): boolean {\n let any = false;\n forEachCell(cellsOf(m), (_r, _c, v) => {\n any ||= hasFormulaText(v);\n });\n return any;\n}\nconst setNameWithoutPrevious = (m: SheetMutation) => m.id === ID.setName && !(\"previousName\" in m.params);\n\n/** The change a mutation makes to formula text elsewhere, or null. */\nfunction refChangeOf(m: SheetMutation): RefChange | null {\n const st = structuralOf(m);\n if (st) return { kind: \"axis\", sheet: sheetOf(m), axis: st.axis, op: st.op };\n if (m.id === ID.name) return { kind: \"rename\", sheet: sheetOf(m), name: String(m.params.name) };\n if (m.id === ID.removeName) return { kind: \"defined-name\", from: String(m.params.name), to: null };\n if (m.id === ID.setName && typeof m.params.previousName === \"string\" && m.params.previousName !== m.params.name)\n return { kind: \"defined-name\", from: m.params.previousName, to: String(m.params.name) };\n return null;\n}\n\n/** A cell entry's formula text (`f`) and array range (`ref`) after `change`. */\nfunction rewriteEntry(v: Record<string, unknown>, ctx: FormulaCtx, change: RefChange): { entry: Record<string, unknown>; changed: boolean } | string {\n let entry = v;\n let changed = false;\n for (const k of [\"f\", \"ref\"] as const) {\n const t = v[k];\n if (k === \"f\" ? !isFormulaText(t) : typeof t !== \"string\") continue;\n const r = rewriteFormula(t as string, ctx, change);\n if (typeof r === \"string\") return r;\n if (!r.changed) continue;\n if (k === \"ref\" && r.text.includes(REF_ERROR)) return \"an array formula's range was removed under it\";\n entry = { ...entry, [k]: r.text };\n changed = true;\n }\n return { entry, changed };\n}\n\n/** Where cell (r, c) of a mutation on `sheet` lands after `change`; null = removed. */\nfunction cellThrough(sheet: string, change: RefChange, r: number, c: number): [number, number] | null {\n if (change.kind !== \"axis\" || change.sheet !== sheet) return [r, c];\n const nr = change.axis === \"row\" ? mapIndex(change.op, r) : r;\n const nc = change.axis === \"col\" ? mapIndex(change.op, c) : c;\n return nr === null || nc === null ? null : [nr, nc];\n}\n\n/** Cell op x after a structural op, a rename or a defined-name change: cells move, formula text is rewritten. */\nfunction cellsOverChange(x: SheetMutation, change: RefChange): TransformResult {\n // untouched: no formula text and the change is elsewhere (another sheet, a rename, a defined name)\n if (!hasFormula(x) && (change.kind !== \"axis\" || change.sheet !== sheetOf(x))) return ok([x]);\n const ctx = formulaCtx(x);\n const out: CellMatrix = {};\n const dropped: string[] = [];\n let why: string | null = null;\n let changed = false;\n forEachCell(cellsOf(x), (r, c, v) => {\n if (why) return;\n const at = cellThrough(sheetOf(x), change, r, c);\n if (!at) {\n dropped.push(cellRef(sheetOf(x), r, c));\n changed = true;\n return;\n }\n let e = v;\n if (hasFormulaText(v)) {\n const res = rewriteEntry(v!, ctx, change);\n if (typeof res === \"string\") {\n why = res;\n return;\n }\n e = res.entry;\n if (res.changed) changed = true;\n }\n if (at[0] !== r || at[1] !== c) changed = true;\n putCell(out, at[0], at[1], e);\n });\n if (why) return barrier(why);\n const rsAfter = refSheetsAfter(ctx.refSheets, change);\n if (!changed && JSON.stringify(rsAfter ?? null) === JSON.stringify(ctx.refSheets ?? null)) return ok([x]);\n const params = { ...withRefSheets(x.params, rsAfter), cellValue: out };\n return ok(isEmptyMatrix(out) ? [] : [{ id: x.id, params }], [], dropped);\n}\n\n/**\n * The formula rewrites a change owes to cell op y's formulas: what Univer's interceptor would have written had\n * y's formulas been there when the change was made. Placed after the change, at the cells' new positions.\n */\nfunction rewritesOf(y: SheetMutation, change: RefChange): SheetMutation | null | string {\n if (!hasFormula(y)) return null;\n const ctx = formulaCtx(y);\n const out: CellMatrix = {};\n let why: string | null = null;\n forEachCell(cellsOf(y), (r, c, v) => {\n if (why || !hasFormulaText(v)) return;\n const at = cellThrough(sheetOf(y), change, r, c);\n if (!at) return;\n const res = rewriteEntry(v!, ctx, change);\n if (typeof res === \"string\") {\n why = res;\n return;\n }\n if (res.changed) putCell(out, at[0], at[1], contentOf(res.entry));\n });\n if (why) return why;\n if (isEmptyMatrix(out)) return null;\n return { id: ID.values, params: withRefSheets({ subUnitId: sheetOf(y), cellValue: out, derived: true }, refSheetsAfter(ctx.refSheets, change)) };\n}\n\nconst NAME_TEXT_KEYS = [\"formulaOrRefString\", \"formulaOrRefStringWithPrefix\"] as const;\n/** A set-defined-name after a structural op or a rename (sheets-formula UpdateDefinedNameController rules). */\nfunction definedNameThrough(m: SheetMutation, change: RefChange): { op: SheetMutation; changed: boolean } | string {\n if (change.kind === \"defined-name\" || m.id !== ID.setName) return { op: m, changed: false };\n // Univer resolves a defined name's unqualified references against the changed sheet and keeps qualifiers.\n const ctx: FormulaCtx = { ownSheet: change.sheet, refSheets: refSheetsOf(m), keepQualifier: true };\n const params: Record<string, unknown> = { ...m.params };\n let changed = false;\n for (const k of NAME_TEXT_KEYS) {\n if (typeof params[k] !== \"string\" || !params[k]) continue;\n const r = rewriteFormula(params[k] as string, ctx, change);\n if (typeof r === \"string\") return r;\n if (r.changed) {\n params[k] = r.text;\n changed = true;\n }\n }\n return { op: { id: m.id, params: withRefSheets(params, refSheetsAfter(ctx.refSheets, change)) }, changed };\n}\nfunction asDerived(m: SheetMutation): SheetMutation {\n return { id: m.id, params: { ...m.params, derived: true } };\n}\n\n/** Formula-aware pairs (C5b). null = not a formula pair; the C5a rules apply. */\nfunction formulaPair(x: SheetMutation, y: SheetMutation, side: Side): TransformResult | null {\n const fx = familyOf(x.id);\n const fy = familyOf(y.id);\n const SET_NAME_BARRIER = \"set-defined-name without previousName (capture must record the name it replaces) against formula text\";\n if (fx === \"defname\" && fy === \"defname\") {\n if (String(x.params.id) !== String(y.params.id)) return ok([x]);\n const eff = derivedSide(x, y, side);\n if (eff === \"left\") return ok([x], isDerived(y) ? [] : [`defined name \"${String(y.params.name)}\"`]);\n return ok([], [], isDerived(x) ? [] : [`defined name \"${String(x.params.name)}\"`]);\n }\n if (fx === \"defname\") {\n if (fy === \"cell\") {\n if (setNameWithoutPrevious(x) && hasFormula(y)) return barrier(SET_NAME_BARRIER);\n const ch = refChangeOf(x);\n if (!ch) return ok([x]);\n const add = rewritesOf(y, ch);\n if (typeof add === \"string\") return barrier(add);\n return ok(add ? [x, add] : [x]);\n }\n const ch = refChangeOf(y);\n if (!ch) return ok([x]);\n const r = definedNameThrough(x, ch);\n return typeof r === \"string\" ? barrier(r) : ok([r.op]);\n }\n if (fy === \"defname\") {\n if (fx === \"cell\") {\n if (setNameWithoutPrevious(y) && hasFormula(x)) return barrier(SET_NAME_BARRIER);\n const ch = refChangeOf(y);\n return ch ? cellsOverChange(x, ch) : ok([x]);\n }\n const ch = refChangeOf(x);\n if (!ch) return ok([x]);\n const r = definedNameThrough(y, ch);\n if (typeof r === \"string\") return barrier(r);\n return ok(r.changed ? [x, asDerived(r.op)] : [x]);\n }\n if (fx === \"cell\") {\n const ch = refChangeOf(y);\n return ch ? cellsOverChange(x, ch) : null;\n }\n if (fy === \"cell\") {\n const ch = refChangeOf(x);\n if (!ch) return null;\n // x removes rows/columns holding y's cells: y's author is told (S3).\n const lost: string[] = [];\n forEachCell(cellsOf(y), (r, c) => {\n if (!cellThrough(sheetOf(y), ch, r, c)) lost.push(cellRef(sheetOf(y), r, c));\n });\n const add = rewritesOf(y, ch);\n if (typeof add === \"string\") return barrier(add);\n return ok(add ? [x, add] : [x], lost);\n }\n return null;\n}\n\nconst withPrevious = (m: SheetMutation, definedNames: Readonly<Record<string, string>>): SheetMutation =>\n m.id === ID.setName && !(\"previousName\" in m.params) ? { id: m.id, params: { ...m.params, previousName: definedNames[String(m.params.id)] ?? null } } : m;\n\n/**\n * Capture-time annotation (C6 calls it per group, like completeCellContent): every op whose formula text\n * qualifies a reference with a sheet name gets `refSheets`, and every set-defined-name gets `previousName`\n * (the name its id had before the command; null for a new name). Rewrites that follow a structural op, a\n * rename or a defined-name change in the same group are marked `derived`. `sheets` is sheet id → name and\n * `definedNames` defined-name id → name, both read right before the command ran.\n */\nexport function annotateFormulas(group: SheetGroup, sheets: Readonly<Record<string, string>>, definedNames: Readonly<Record<string, string>>): SheetMutation[] {\n let changed = false;\n return group.map((m0) => {\n // Everything a structural op, rename or defined-name change brings after it is its interceptors' rewrites.\n const m = changed && (m0.id === ID.values || m0.id === ID.setName) ? asDerived(m0) : m0;\n if (!changed && refChangeOf(withPrevious(m0, definedNames))) changed = true;\n if (m.id === ID.values) {\n const texts: string[] = [];\n forEachCell(cellsOf(m), (_r, _c, v) => {\n if (v && isFormulaText(v.f)) texts.push(v.f);\n if (v && typeof v.ref === \"string\") texts.push(v.ref);\n });\n return { id: m.id, params: withRefSheets(m.params, refSheetsFor(texts, sheets)) };\n }\n if (m.id === ID.setName) {\n const texts = NAME_TEXT_KEYS.map((k) => m.params[k]).filter((t): t is string => typeof t === \"string\");\n return { id: m.id, params: { ...withRefSheets(m.params, refSheetsFor(texts, sheets)), previousName: withPrevious(m, definedNames).params.previousName } };\n }\n return m;\n });\n}\n\n// ── sizes (row height, auto-height flag, auto height, column width) ────────────────────────────────\ninterface SizeOp {\n axis: Axis;\n attr: string;\n values: Map<number, unknown>;\n}\nfunction sizeOf(m: SheetMutation): SizeOp {\n const p = m.params as Record<string, unknown>;\n const values = new Map<number, unknown>();\n if (m.id === ID.rowAutoHeight) {\n for (const { row, autoHeight } of (p.rowsAutoHeightInfo as Array<{ row: number; autoHeight: unknown }>) ?? []) values.set(row, autoHeight);\n return { axis: \"row\", attr: \"ah\", values };\n }\n const axis: Axis = m.id === ID.colWidth ? \"col\" : \"row\";\n const field = m.id === ID.colWidth ? \"colWidth\" : m.id === ID.rowHeight ? \"rowHeight\" : \"autoHeightInfo\";\n const value = p[field];\n const [a0, a1] = S(axis);\n for (const r of (p.ranges as SheetRange[]) ?? [])\n for (let i = r[a0] as number; i <= (r[a1] as number); i++) {\n if (typeof value === \"number\") values.set(i, value);\n else if (m.id === ID.rowIsAuto) values.set(i, (value as Record<number, unknown> | undefined)?.[i]);\n else if ((value as Record<number, unknown> | undefined)?.[i] != null) values.set(i, (value as Record<number, unknown>)[i]);\n }\n return { axis, attr: m.id === ID.colWidth ? \"w\" : m.id === ID.rowHeight ? \"h\" : \"ia\", values };\n}\nfunction buildSize(template: SheetMutation, values: Map<number, unknown>): SheetMutation | null {\n if (values.size === 0) return null;\n const p = template.params as Record<string, unknown>;\n if (template.id === ID.rowAutoHeight)\n return { id: template.id, params: { ...p, rowsAutoHeightInfo: [...values].sort((a, b) => a[0] - b[0]).map(([row, autoHeight]) => ({ row, autoHeight })) } };\n const axis: Axis = template.id === ID.colWidth ? \"col\" : \"row\";\n const field = template.id === ID.colWidth ? \"colWidth\" : template.id === ID.rowHeight ? \"rowHeight\" : \"autoHeightInfo\";\n const [a0, a1] = S(axis);\n const first = ((p.ranges as SheetRange[]) ?? [])[0] ?? ({ startRow: 0, endRow: 0, startColumn: 0, endColumn: 0 } as SheetRange);\n const ranges = runs(values.keys()).map((r) => ({ ...first, [a0]: r.start, [a1]: r.start + r.count - 1 }));\n const uniform = typeof p[field] === \"number\" ? p[field] : undefined;\n const value = uniform !== undefined && [...values.values()].every((v) => v === uniform) ? uniform : Object.fromEntries(values);\n return { id: template.id, params: { ...p, ranges, [field]: value } };\n}\n\n// ── number formats (C5c) ────────────────────────────────────────────────────────────────────────────\n// Univer 1.0.4 keeps a number format as the style key `n` of each cell (NumfmtService.setValues/deleteValues).\n// set.numfmt writes `n` = { pattern } on its ranges (per refMap key), remove.numfmt deletes `n`. Ranges follow\n// structural edits cell by cell (an inserted row inside a range is not formatted, exactly as on the seat that\n// formatted first); against another write of `n` on the same cell (a numfmt, a style with `n`, a style clear, a\n// cell delete) the later-committed op wins.\ntype Rect = { startRow: number; endRow: number; startColumn: number; endColumn: number; [k: string]: unknown };\ninterface NfPart {\n key: string | null; // null: remove.numfmt\n ranges: Rect[];\n}\nconst isNumfmt = (m: SheetMutation) => m.id === ID.setNumfmt || m.id === ID.removeNumfmt;\nfunction nfParts(m: SheetMutation): NfPart[] {\n if (m.id === ID.removeNumfmt) return [{ key: null, ranges: ((m.params.ranges as Rect[]) ?? []).map((r) => ({ ...r })) }];\n const values = (m.params.values ?? {}) as Record<string, { ranges?: Rect[] }>;\n return Object.keys(values).map((k) => ({ key: k, ranges: (values[k]?.ranges ?? []).map((r) => ({ ...r })) }));\n}\nfunction nfBuild(m: SheetMutation, parts: NfPart[]): SheetMutation[] {\n const keep = parts.filter((p) => p.ranges.length);\n if (!keep.length) return [];\n if (m.id === ID.removeNumfmt) return [{ id: m.id, params: { ...m.params, ranges: keep[0]!.ranges } }];\n const values: Record<string, unknown> = {};\n const refMap: Record<string, unknown> = {};\n const srcValues = (m.params.values ?? {}) as Record<string, Record<string, unknown>>;\n const srcRef = (m.params.refMap ?? {}) as Record<string, unknown>;\n for (const p of keep) {\n values[p.key!] = { ...srcValues[p.key!], ranges: p.ranges };\n refMap[p.key!] = srcRef[p.key!];\n }\n return [{ id: m.id, params: { ...m.params, values, refMap } }];\n}\n/** The `n` a numfmt op writes at (row, col): { pattern } for set, null for remove, undefined when it does not cover it. */\nfunction nfValueAt(m: SheetMutation, row: number, col: number): { pattern: unknown } | null | undefined {\n for (const p of nfParts(m))\n if (p.ranges.some((r) => r.startRow <= row && row <= r.endRow && r.startColumn <= col && col <= r.endColumn)) {\n if (p.key === null) return null;\n const ref = ((m.params.refMap ?? {}) as Record<string, { pattern?: unknown } | undefined>)[p.key];\n return { pattern: ref?.pattern };\n }\n return undefined;\n}\n\n/** Where a span [lo, hi] of one axis lands after an axis op: the pieces that survive, merged. */\nexport function spanThrough(op: AxisOp, lo: number, hi: number): Array<[number, number]> {\n const pieces: Array<[number, number, number]> = []; // [from, to, shift]\n if (op.kind === \"insert\") pieces.push([0, op.at - 1, 0], [op.at, Infinity, op.count]);\n else if (op.kind === \"remove\") pieces.push([0, op.start - 1, 0], [op.start + op.count, Infinity, -op.count]);\n else if (op.count <= 0 || (op.to >= op.from && op.to <= op.from + op.count)) pieces.push([0, Infinity, 0]);\n else if (op.to > op.from) {\n const n = op.count;\n pieces.push([0, op.from - 1, 0], [op.from, op.from + n - 1, op.to - n - op.from], [op.from + n, op.to - 1, -n], [op.to, Infinity, 0]);\n } else {\n const n = op.count;\n pieces.push([0, op.to - 1, 0], [op.to, op.from - 1, n], [op.from, op.from + n - 1, op.to - op.from], [op.from + n, Infinity, 0]);\n }\n const out: Array<[number, number]> = [];\n for (const [a, b, d] of pieces) {\n const x0 = Math.max(a, lo);\n const x1 = Math.min(b, hi);\n if (x0 <= x1) out.push([x0 + d, x1 + d]);\n }\n out.sort((p, q) => p[0] - q[0]);\n const merged: Array<[number, number]> = [];\n for (const p of out) {\n const last = merged[merged.length - 1];\n if (last && last[1] + 1 >= p[0]) last[1] = Math.max(last[1], p[1]);\n else merged.push([p[0], p[1]]);\n }\n return merged;\n}\nfunction rectsThrough(st: Structural, rects: Rect[]): Rect[] {\n const [a0, a1] = S(st.axis);\n const out: Rect[] = [];\n for (const r of rects) for (const [lo, hi] of spanThrough(st.op, r[a0] as number, r[a1] as number)) out.push({ ...r, [a0]: lo, [a1]: hi });\n return out;\n}\n/** a minus b, as disjoint rectangles. */\nfunction rectMinus(a: Rect, b: Rect): Rect[] {\n if (a.startRow > b.endRow || b.startRow > a.endRow || a.startColumn > b.endColumn || b.startColumn > a.endColumn) return [a];\n const out: Rect[] = [];\n if (a.startRow < b.startRow) out.push({ ...a, endRow: b.startRow - 1 });\n if (a.endRow > b.endRow) out.push({ ...a, startRow: b.endRow + 1 });\n const r0 = Math.max(a.startRow, b.startRow);\n const r1 = Math.min(a.endRow, b.endRow);\n if (a.startColumn < b.startColumn) out.push({ ...a, startRow: r0, endRow: r1, endColumn: b.startColumn - 1 });\n if (a.endColumn > b.endColumn) out.push({ ...a, startRow: r0, endRow: r1, startColumn: b.endColumn + 1 });\n return out;\n}\nfunction rectsMinus(as: Rect[], bs: Rect[]): Rect[] {\n let cur = as;\n for (const b of bs) cur = cur.flatMap((a) => rectMinus(a, b));\n return cur;\n}\n/** The cells where a set-range-values writes `n`: a style with `n`, a style clear (s: null), a cell delete. */\nfunction nWrites(m: SheetMutation): Rect[] {\n const out: Rect[] = [];\n forEachCell(cellsOf(m), (r, c, v) => {\n if (v === null || v.s === null || (v.s && typeof v.s === \"object\" && \"n\" in (v.s as Record<string, unknown>)))\n out.push({ startRow: r, endRow: r, startColumn: c, endColumn: c });\n });\n return out;\n}\n/** Numfmt pairs (same sheet). null = not a numfmt pair. */\nfunction numfmtPair(x: SheetMutation, y: SheetMutation, side: Side, sx: Structural | null, sy: Structural | null): TransformResult | null {\n const nx = isNumfmt(x);\n const ny = isNumfmt(y);\n if (!nx && !ny) return null;\n if (nx && sy) return ok(nfBuild(x, nfParts(x).map((p) => ({ ...p, ranges: rectsThrough(sy, p.ranges) }))));\n if (ny && sx) return ok([x]);\n if (nx && ny) {\n if (side === \"left\") return ok([x]);\n const ys = nfParts(y).flatMap((p) => p.ranges);\n return ok(nfBuild(x, nfParts(x).map((p) => ({ ...p, ranges: rectsMinus(p.ranges, ys) }))));\n }\n if (nx && y.id === ID.values) {\n if (side === \"left\") return ok([x]);\n const ys = nWrites(y);\n return ys.length ? ok(nfBuild(x, nfParts(x).map((p) => ({ ...p, ranges: rectsMinus(p.ranges, ys) })))) : ok([x]);\n }\n if (ny && x.id === ID.values) {\n if (side === \"left\") return ok([x]);\n // y (later) wrote `n`: x's own `n` gives way; a clear or delete of x is followed by y's `n` again\n const out: CellMatrix = {};\n const tail: CellMatrix = {};\n let touched = false;\n forEachCell(cellsOf(x), (r, c, v) => {\n const n = nfValueAt(y, r, c);\n if (n === undefined) return putCell(out, r, c, v);\n if (v === null || v.s === null) {\n putCell(out, r, c, v);\n if (n) {\n putCell(tail, r, c, { s: { n } });\n touched = true;\n }\n return;\n }\n if (v.s && typeof v.s === \"object\" && \"n\" in (v.s as Record<string, unknown>)) {\n const { n: _drop, ...rest } = v.s as Record<string, unknown>;\n const e: Record<string, unknown> = { ...v };\n if (Object.keys(rest).length) e.s = rest;\n else delete e.s;\n touched = true;\n if (Object.keys(e).length) putCell(out, r, c, e);\n return;\n }\n putCell(out, r, c, v);\n });\n if (!touched) return ok([x]);\n const ops: SheetMutation[] = [];\n if (!isEmptyMatrix(out)) ops.push(cellsMutation(x, out));\n if (!isEmptyMatrix(tail)) ops.push({ id: ID.values, params: { subUnitId: sheetOf(x), cellValue: tail } });\n return ok(ops);\n }\n return ok([x]); // numfmt × merge, size, name, count: different state\n}\n\n// ── row/column counts (C5c) ─────────────────────────────────────────────────────────────────────────\n// set-worksheet-row-count / -column-count set an absolute size. A concurrent insert or remove on that axis shifts\n// it by its count (both seats then agree on the structure); two concurrent counts: the larger wins (a refresh that\n// grows the sheet is never undone by a smaller one; side-independent).\nconst isCount = (m: SheetMutation) => m.id === ID.rowCount || m.id === ID.colCount;\nconst countAxis = (m: SheetMutation): Axis => (m.id === ID.rowCount ? \"row\" : \"col\");\nconst countKey = (m: SheetMutation) => (m.id === ID.rowCount ? \"rowCount\" : \"columnCount\");\nfunction countPair(x: SheetMutation, y: SheetMutation, sy: Structural | null): TransformResult | null {\n if (!isCount(x)) return isCount(y) ? ok([x]) : null;\n const k = countKey(x);\n const v = Number(x.params[k]);\n if (sy) {\n if (sy.axis !== countAxis(x) || sy.op.kind === \"move\") return ok([x]);\n const d = sy.op.kind === \"insert\" ? sy.op.count : -sy.op.count;\n return ok([{ id: x.id, params: { ...x.params, [k]: Math.max(1, v + d) } }]);\n }\n if (isCount(y) && y.id === x.id) {\n const w = Number(y.params[k]);\n return ok([w > v ? { id: x.id, params: { ...x.params, [k]: w } } : x]);\n }\n return ok([x]);\n}\n\n// ── sheets: add, remove, order (C5c) ───────────────────────────────────────────────────────────────\n// The sheet order is one more axis: insert-sheet = insert(index, 1), remove-sheet = remove(sheetIndex, 1) (capture\n// records the removed sheet's index, `annotateSheetOps`), set-worksheet-order = a move of one sheet (Univer:\n// splice out at fromOrder, splice in at toOrder). Index arithmetic is transformAxis. An op addressed to a sheet a\n// concurrent op removed is dropped (its author is told); a formula that names a removed sheet is a barrier.\nconst isSheetOp = (m: SheetMutation) => m.id === ID.insertSheet || m.id === ID.removeSheet || m.id === ID.sheetOrder;\nconst sheetIdOf = (m: SheetMutation) => (m.id === ID.insertSheet ? String((m.params.sheet as { id?: unknown } | undefined)?.id ?? \"\") : sheetOf(m));\nfunction sheetAxisOf(m: SheetMutation): AxisOp | null {\n const p = m.params;\n if (m.id === ID.insertSheet) return typeof p.index === \"number\" ? { kind: \"insert\", at: p.index, count: 1 } : null;\n if (m.id === ID.removeSheet) return typeof p.sheetIndex === \"number\" ? { kind: \"remove\", start: p.sheetIndex, count: 1 } : null;\n if (m.id === ID.sheetOrder) {\n const f = Number(p.fromOrder);\n const t = Number(p.toOrder);\n return { kind: \"move\", from: f, count: 1, to: t > f ? t + 1 : t };\n }\n return null;\n}\nfunction buildSheetOp(template: SheetMutation, op: AxisOp): SheetMutation {\n if (op.kind === \"insert\") return { id: template.id, params: { ...template.params, index: op.at } };\n if (op.kind === \"remove\") return { id: template.id, params: { ...template.params, sheetIndex: op.start } };\n return { id: template.id, params: { ...template.params, fromOrder: op.from, toOrder: op.to > op.from ? op.to - 1 : op.to } };\n}\n/** True when the op's formula text (or defined-name text) names sheet `id`. */\nfunction namesSheet(m: SheetMutation, id: string): boolean {\n const rs = refSheetsOf(m);\n return !!rs && Object.values(rs).includes(id) && (m.id === ID.setName || hasFormula(m));\n}\nfunction sheetPair(x: SheetMutation, y: SheetMutation, side: Side): TransformResult | null {\n const xs = isSheetOp(x);\n const ys = isSheetOp(y);\n if (!xs && !ys) return null;\n if (xs && ys) {\n const a = sheetAxisOf(x);\n const b = sheetAxisOf(y);\n if (!a || !b) return barrier(\"a sheet add or remove without its index (capture must call annotateSheetOps)\");\n if (x.id === ID.insertSheet && y.id === ID.insertSheet && sheetIdOf(x) === sheetIdOf(y)) {\n // the same sheet added twice (one op delivered twice): it is there once\n return JSON.stringify(x.params) === JSON.stringify(y.params) ? ok([]) : barrier(\"the same sheet id added twice with different content\");\n }\n if (x.id === ID.removeSheet && typeof x.params.sheetsLeft === \"number\" && sheetIdOf(x) !== sheetIdOf(y) && (y.id === ID.removeSheet || y.id === ID.insertSheet)) {\n // a workbook keeps one sheet: two concurrent removes that would leave none are a barrier\n const left = x.params.sheetsLeft + (y.id === ID.insertSheet ? 1 : -1);\n if (left < 1) return barrier(\"concurrent sheet removes would leave the workbook without a sheet\");\n const out = transformAxis(a, b, side);\n if (!out) return barrier(\"sheet order: no transform\");\n return ok(out.map((o) => buildSheetOp({ id: x.id, params: { ...x.params, sheetsLeft: left } }, o)));\n }\n // the same sheet removed twice, or moved twice: transformAxis drops the earlier one\n const out = transformAxis(a, b, side);\n if (!out) return barrier(\"sheet order: no transform\");\n return ok(out.map((o) => buildSheetOp(x, o)), [], out.length === 0 && x.id === ID.sheetOrder ? [`${sheetIdOf(x)}: sheet order`] : []);\n }\n if (ys) {\n if (y.id !== ID.removeSheet) return ok([x]); // a new sheet or a new order commutes with every edit\n const gone = sheetOf(y);\n if (namesSheet(x, gone)) return barrier(\"a formula names a sheet removed at the same time\");\n if (sheetOf(x) === gone && x.id !== ID.setName && x.id !== ID.removeName)\n return ok([], [], isDerived(x) ? [] : [`${gone}: the sheet was removed`]);\n return ok([x]);\n }\n // x is a sheet op over an edit\n if (x.id !== ID.removeSheet) return ok([x]);\n const gone = sheetOf(x);\n if (namesSheet(y, gone)) return barrier(\"a formula names a sheet removed at the same time\");\n return ok([x], sheetOf(y) === gone && !isDerived(y) && y.id !== ID.setName && y.id !== ID.removeName ? [`${gone}: the sheet was removed`] : []);\n}\n\n/**\n * Capture-time annotation for sheet ops (the port calls it per group, like annotateFormulas): a remove-sheet gets\n * `sheetIndex` (the removed sheet's index right before it) and `sheetsLeft` (sheets after it), an insert-sheet without `index` gets its append index.\n * `sheetOrder` = the workbook's sheet order right before the command.\n */\nexport function annotateSheetOps(group: SheetGroup, sheetOrder: readonly string[]): SheetMutation[] {\n const order = [...sheetOrder];\n return group.map((m) => {\n if (m.id === ID.insertSheet) {\n const index = typeof m.params.index === \"number\" ? Math.min(m.params.index, order.length) : order.length;\n order.splice(index, 0, sheetIdOf(m));\n return index === m.params.index ? m : { id: m.id, params: { ...m.params, index } };\n }\n if (m.id === ID.removeSheet) {\n const i = order.indexOf(sheetOf(m));\n if (i >= 0) order.splice(i, 1);\n return i >= 0 ? { id: m.id, params: { ...m.params, sheetIndex: i, sheetsLeft: order.length } } : m;\n }\n if (m.id === ID.sheetOrder) {\n const f = Number(m.params.fromOrder);\n const [id] = order.splice(f, 1);\n order.splice(Number(m.params.toOrder), 0, id ?? sheetOf(m));\n }\n return m;\n });\n}\n\n/** Style ids inside a sheet's data replaced by their objects (style ids are seat-local, C0 surprise 4). */\nexport function inlineSheetStyles(sheet: Record<string, unknown>, styleOf: (id: string) => unknown): Record<string, unknown> {\n const out = JSON.parse(JSON.stringify(sheet)) as Record<string, any>;\n const fix = (o: Record<string, any> | null | undefined) => {\n if (o && typeof o.s === \"string\") {\n const st = styleOf(o.s);\n if (st) o.s = JSON.parse(JSON.stringify(st));\n }\n };\n for (const row of Object.values<Record<string, any>>(out.cellData ?? {})) for (const cell of Object.values<Record<string, any>>(row ?? {})) fix(cell);\n for (const key of [\"rowData\", \"columnData\"]) for (const v of Object.values<Record<string, any>>(out[key] ?? {})) fix(v);\n if (typeof out.defaultStyle === \"string\") {\n const st = styleOf(out.defaultStyle);\n if (st) out.defaultStyle = JSON.parse(JSON.stringify(st));\n }\n return out;\n}\n\n// ── sort (C5c) ──────────────────────────────────────────────────────────────────────────────────────\n// reorder-range is a permutation of the rows of `range`, column by column inside it: the cell at (t, c) becomes\n// the cell that was at (order[t], c) (Univer 1.0.4 writes empties too). So concurrent edits follow their rows:\n// a cell op's cell at (s, c) inside the range lands at Q[s] (Q = order inverted). A row insert keeps the new rows\n// fixed; a row remove removes the moved rows (Q of them) and the sort is compacted around them. Moves through the\n// sort range, two overlapping sorts, are barriers.\ninterface SortOp {\n range: Rect;\n /** target row -> source row (keys are the moved rows; a row not listed stays) */\n P: Map<number, number>;\n}\nconst isSort = (m: SheetMutation) => m.id === ID.sort;\nfunction sortOf(m: SheetMutation): SortOp {\n const P = new Map<number, number>();\n for (const [t, src] of Object.entries((m.params.order ?? {}) as Record<string, number>)) P.set(Number(t), Number(src));\n return { range: { ...(m.params.range as Rect) }, P };\n}\nconst sortQ = (o: SortOp) => new Map([...o.P].map(([t, s0]) => [s0, t] as const));\nfunction buildSort(template: SheetMutation, o: SortOp): SheetMutation[] {\n const order: Record<string, number> = {};\n for (const [t, s0] of [...o.P].sort((a, b) => a[0] - b[0])) if (t !== s0) order[t] = s0;\n if (!Object.keys(order).length || o.range.startRow > o.range.endRow || o.range.startColumn > o.range.endColumn) return [];\n return [{ id: template.id, params: { ...template.params, range: o.range, order } }];\n}\nconst inSortCols = (o: SortOp, c: number) => c >= o.range.startColumn && c <= o.range.endColumn;\n/** The sort after a row/column structural op; null = no transform (barrier). */\nfunction sortThrough(o: SortOp, st: Structural): SortOp | null {\n const r = o.range;\n if (st.axis === \"col\") {\n if (st.op.kind === \"move\") {\n const { from, count, to } = st.op;\n const touches = !(from + count - 1 < r.startColumn || from > r.endColumn) || (to > r.startColumn && to <= r.endColumn);\n if (touches) return null;\n const spans = spanThrough(st.op, r.startColumn, r.endColumn);\n return spans.length === 1 ? { range: { ...r, startColumn: spans[0]![0], endColumn: spans[0]![1] }, P: o.P } : null;\n }\n const spans = spanThrough(st.op, r.startColumn, r.endColumn);\n if (!spans.length) return { range: { ...r, startColumn: 1, endColumn: 0 }, P: new Map() };\n return { range: { ...r, startColumn: spans[0]![0], endColumn: spans[spans.length - 1]![1] }, P: o.P };\n }\n const op = st.op;\n if (op.kind === \"move\") {\n const touches = !(op.from + op.count - 1 < r.startRow || op.from > r.endRow) || (op.to > r.startRow && op.to <= r.endRow);\n if (touches) return null;\n }\n if (op.kind === \"insert\" || op.kind === \"move\") {\n const P = new Map<number, number>();\n for (const [t, s0] of o.P) P.set(mapIndex(op, t)!, mapIndex(op, s0)!);\n const spans = spanThrough(op, r.startRow, r.endRow);\n return { range: { ...r, startRow: spans[0]![0], endRow: spans[spans.length - 1]![1] }, P };\n }\n // remove: drop the removed sources; targets compact around the positions the removed rows were sorted to\n const removed = (i: number) => i >= op.start && i < op.start + op.count;\n const Q = sortQ(o);\n const goneTargets: number[] = [];\n for (let i = op.start; i < op.start + op.count; i++) goneTargets.push(Q.get(i) ?? i);\n goneTargets.sort((a, b) => a - b);\n const compact = (t: number) => t - goneTargets.filter((g) => g < t).length;\n const P = new Map<number, number>();\n for (const [t, s0] of o.P) if (!removed(s0)) P.set(compact(t), mapIndex(op, s0)!);\n const spans = spanThrough(op, r.startRow, r.endRow);\n if (!spans.length) return { range: { ...r, startRow: 1, endRow: 0 }, P: new Map() };\n return { range: { ...r, startRow: spans[0]![0], endRow: spans[spans.length - 1]![1] }, P };\n}\nfunction sortPair(x: SheetMutation, y: SheetMutation, sx: Structural | null, sy: Structural | null): TransformResult | null {\n const xs = isSort(x);\n const ys = isSort(y);\n if (!xs && !ys) return null;\n if (xs && ys) {\n const a = sortOf(x).range;\n const b = sortOf(y).range;\n const overlap = a.startRow <= b.endRow && b.startRow <= a.endRow && a.startColumn <= b.endColumn && b.startColumn <= a.endColumn;\n return overlap ? barrier(\"two sorts of overlapping ranges at once\") : ok([x]);\n }\n if (xs) {\n if (sy) {\n const t = sortThrough(sortOf(x), sy);\n return t ? ok(buildSort(x, t)) : barrier(\"a row or column move through a sorted range\");\n }\n return ok([x]); // cells, formats, merges, sizes, names, counts: the sort carries them (or does not touch them)\n }\n // y is the sort: x follows the rows it moved\n const o = sortOf(y);\n const Q = sortQ(o);\n const moved = (r: number) => r >= o.range.startRow && r <= o.range.endRow && Q.has(r);\n if (sx) {\n if (sx.axis === \"col\") return sx.op.kind === \"move\" && !sortThrough(o, sx) ? barrier(\"a column move through a sorted range\") : ok([x]);\n if (sx.op.kind === \"insert\") return ok([x]);\n if (sx.op.kind === \"move\") return sortThrough(o, sx) ? ok([x]) : barrier(\"a row move through a sorted range\");\n // remove: the rows x removed now sit where the sort put them (only whole rows move when the sort spans every column\n // of the removed rows' cells, which a column-limited sort does not: then it is a barrier)\n const rows: number[] = [];\n let partial = false;\n for (let i = sx.op.start; i < sx.op.start + sx.op.count; i++) {\n if (moved(i)) partial = true;\n rows.push(Q.get(i) ?? i);\n }\n if (partial) return barrier(\"a row remove against a concurrent sort of those rows\");\n return ok([x]);\n }\n if (x.id === ID.values) {\n const out: CellMatrix = {};\n let changed = false;\n forEachCell(cellsOf(x), (r, c, v) => {\n if (inSortCols(o, c) && moved(r)) {\n putCell(out, Q.get(r)!, c, v);\n changed = true;\n } else putCell(out, r, c, v);\n });\n return changed ? ok([cellsMutation(x, out)]) : ok([x]);\n }\n if (isNumfmt(x)) {\n const parts = nfParts(x).map((p) => {\n const ranges: Rect[] = [];\n for (const rc of p.ranges) {\n const inner: Rect = { ...rc, startRow: Math.max(rc.startRow, o.range.startRow), endRow: Math.min(rc.endRow, o.range.endRow), startColumn: Math.max(rc.startColumn, o.range.startColumn), endColumn: Math.min(rc.endColumn, o.range.endColumn) };\n if (inner.startRow > inner.endRow || inner.startColumn > inner.endColumn) {\n ranges.push(rc);\n continue;\n }\n ranges.push(...rectMinus(rc, inner));\n for (let r = inner.startRow; r <= inner.endRow; r++) ranges.push({ ...inner, startRow: Q.get(r) ?? r, endRow: Q.get(r) ?? r });\n }\n return { ...p, ranges };\n });\n return ok(nfBuild(x, parts));\n }\n return ok([x]);\n}\n\n// ── the pair transform ──────────────────────────────────────────────────────────────────────────────\nfunction familyOf(id: string): string {\n const e = SHEET_MUTATIONS[id];\n return e && e.kind === \"covered\" ? e.family : \"\";\n}\n\n/** x over y for single mutations. */\nexport function transformMutation(x: SheetMutation, y: SheetMutation, side: Side): TransformResult {\n for (const m of [x, y]) {\n const e = SHEET_MUTATIONS[m.id];\n if (!e) return barrier(`${m.id} is not in the registry`);\n if (e.kind !== \"covered\") return barrier(`${m.id}: ${e.kind === \"barrier\" ? `barrier until ${e.until} (${e.reason})` : \"never travels\"}`);\n if (m.id === ID.values) {\n const why = cellBarrier(m);\n if (why) return barrier(why);\n }\n }\n const pb = PAIR_BARRIERS[pairKey(x.id, y.id)];\n if (pb) return barrier(`${x.id} × ${y.id}: ${pb.reason}${pb.seed === null ? \"\" : ` (fuzz seed ${pb.seed})`}`);\n const sp = sheetPair(x, y, side);\n if (sp) return sp;\n const fp = formulaPair(x, y, side);\n if (fp) return fp;\n if (sheetOf(x) !== sheetOf(y)) return ok([x]);\n\n const fx = familyOf(x.id);\n const fy = familyOf(y.id);\n const sy = structuralOf(y);\n const sx = structuralOf(x);\n const sortp = sortPair(x, y, sx, sy);\n if (sortp) return sortp;\n const cp = countPair(x, y, sy);\n if (cp) return cp;\n const np = numfmtPair(x, y, side, sx, sy);\n if (np) return np;\n\n // structural over structural\n if (sx && sy) {\n if (sx.axis !== sy.axis) return ok([x]);\n const out = transformAxis(sx.op, sy.op, side);\n if (!out) return barrier(`${x.id} over ${y.id}: moved blocks overlap in part, or the block would split`);\n const dropped = out.length === 0 && sx.op.kind === \"move\" ? [`${sheetOf(x)}: moved ${sx.axis}s`] : [];\n return ok(out.map((o) => buildStructural(x, sx.axis, o)), [], dropped);\n }\n\n // anything over structural: coordinates move\n if (sy) {\n if (fx === \"merge\") {\n const kept: SheetRange[] = [];\n const dropped: string[] = [];\n for (const r of mergeRanges(x)) {\n const t = mergeThrough(sy, r).range;\n if (t) kept.push(t);\n else dropped.push(rangeRef(sheetOf(x), r));\n }\n return ok(kept.length ? [withRanges(x, kept)] : [], [], x.id === ID.addMerge ? dropped : []);\n }\n if (fx === \"size\") {\n const size = sizeOf(x);\n if (size.axis !== sy.axis) return ok([x]);\n const next = new Map<number, unknown>();\n for (const [i, v] of size.values) {\n const m = mapIndex(sy.op, i);\n if (m !== null) next.set(m, v);\n }\n const built = buildSize(x, next);\n return ok(built ? [built] : []);\n }\n return ok([x]); // name\n }\n\n // structural over others\n if (sx) {\n if (fy !== \"merge\" || y.id !== ID.addMerge) return ok([x]);\n // y added merges this seat already holds; the raw structural mutation leaves the ones it cuts through\n // where they were, so the fixups the command would have made travel with x.\n const remove: SheetRange[] = [];\n const add: SheetRange[] = [];\n for (const r of mergeRanges(y)) {\n const t = mergeThrough(sx, r);\n if (!t.fixup) continue;\n remove.push(r);\n if (t.range) add.push(t.range);\n }\n const lostMerges = mergeRanges(y).filter((r) => mergeThrough(sx, r).range === null).map((r) => rangeRef(sheetOf(y), r));\n if (!remove.length) return ok([x], lostMerges);\n const sheet = sheetOf(x);\n const pre = sx.op.kind === \"insert\" ? [] : [mergeMutation(ID.removeMerge, sheet, remove)];\n const mid = sx.op.kind === \"insert\" ? [mergeMutation(ID.removeMerge, sheet, remove)] : [];\n return ok([...pre, x, ...mid, ...(add.length ? [mergeMutation(ID.addMerge, sheet, add)] : [])], lostMerges);\n }\n\n if (fx === \"cell\" && fy === \"cell\") return transformCellsOverCells(x, y, side);\n\n if (fx === \"merge\" && fy === \"merge\") {\n const xr = mergeRanges(x);\n const yr = mergeRanges(y);\n const hit = (r: SheetRange) => yr.some((q) => intersects(r, q));\n const sheet = sheetOf(x);\n if (x.id === ID.addMerge && y.id === ID.addMerge) {\n if (!xr.some(hit)) return ok([x]);\n if (side === \"left\") {\n // the later merge stands: clear what it overlaps, then add it\n const lost = yr.filter((q) => xr.some((r) => intersects(r, q))).map((q) => rangeRef(sheet, q));\n return ok([mergeMutation(ID.removeMerge, sheet, xr.filter(hit)), x], lost);\n }\n const kept = xr.filter((r) => !hit(r));\n return ok(kept.length ? [withRanges(x, kept)] : [], [], xr.filter(hit).map((r) => rangeRef(sheet, r)));\n }\n if (x.id === ID.addMerge && y.id === ID.removeMerge) {\n if (side === \"left\" || !xr.some(hit)) return ok([x], side === \"left\" && xr.some(hit) ? yr.filter((q) => xr.some((r) => intersects(r, q))).map((q) => rangeRef(sheet, q)) : []);\n const kept = xr.filter((r) => !hit(r));\n return ok(kept.length ? [withRanges(x, kept)] : [], [], xr.filter(hit).map((r) => rangeRef(sheet, r)));\n }\n if (x.id === ID.removeMerge && y.id === ID.addMerge) {\n // Univer removes every merge a range intersects, so x would also take y's merge with it.\n const touched = yr.filter((q) => xr.some((r) => intersects(r, q)));\n if (!touched.length) return ok([x]);\n if (side === \"left\") return ok([x], touched.map((q) => rangeRef(sheet, q)));\n return ok([x, mergeMutation(ID.addMerge, sheet, touched)], [], xr.filter(hit).map((r) => rangeRef(sheet, r)));\n }\n return ok([x]); // remove over remove: idempotent\n }\n\n if (fx === \"size\" && fy === \"size\") {\n const a = sizeOf(x);\n const b = sizeOf(y);\n if (a.axis !== b.axis || a.attr !== b.attr) return ok([x]);\n if (side === \"left\") {\n const lost = [...a.values.keys()].filter((i) => b.values.has(i)).map((i) => `${sheetOf(x)}: ${a.axis} ${i + 1} ${a.attr}`);\n return ok([x], lost);\n }\n const next = new Map([...a.values].filter(([i]) => !b.values.has(i)));\n const built = buildSize(x, next);\n const dropped = [...a.values.keys()].filter((i) => b.values.has(i)).map((i) => `${sheetOf(x)}: ${a.axis} ${i + 1} ${a.attr}`);\n return ok(built ? [built] : [], [], dropped);\n }\n\n if (fx === \"name\" && fy === \"name\") {\n if (side === \"left\") return ok([x], [`${sheetOf(x)}: name \"${String(y.params.name)}\"`]);\n return ok([], [], [`${sheetOf(x)}: name \"${String(x.params.name)}\"`]);\n }\n\n // different families of different kinds commute (cells × merges, cells × sizes, merges × sizes, name × any)\n return ok([x]);\n}\n\n// ── groups ──────────────────────────────────────────────────────────────────────────────────────────\ninterface Acc {\n lost: string[];\n dropped: string[];\n}\ntype Pair = [SheetMutation[], SheetMutation[]] | Barrier;\nconst blocked = (p: Pair): p is Barrier => !Array.isArray(p);\n\n/**\n * Transforms two sequences against each other: [xs after ys, ys after xs]. The OT grid, walked one x at a time\n * against the whole (evolving) y list; a pair whose transform yields several ops refines the grid in place.\n * Iterative over the outer lists (no slicing), so composed changesets of hundreds of mutations stay linear per cell.\n */\nfunction tSeq(xs: SheetMutation[], ys: SheetMutation[], side: Side, acc: Acc): Pair {\n if (xs.length === 0 || ys.length === 0) return [xs, ys];\n if (xs.length === 1 && ys.length === 1) {\n const a = transformMutation(xs[0]!, ys[0]!, side);\n if (isBarrier(a)) return a;\n const b = transformMutation(ys[0]!, xs[0]!, flip(side));\n if (isBarrier(b)) return b;\n acc.lost.push(...a.lost);\n acc.dropped.push(...a.dropped);\n return [a.op, b.op];\n }\n const outX: SheetMutation[] = [];\n let curY = ys;\n for (const x of xs) {\n // one x against every y in turn: x evolves, each y is rewritten over it\n let curX: SheetMutation[] = [x];\n const nextY: SheetMutation[] = [];\n for (const y of curY) {\n if (curX.length === 0) {\n nextY.push(y);\n continue;\n }\n const r = tSeq(curX, [y], side, acc);\n if (blocked(r)) return r;\n curX = r[0];\n for (const m of r[1]) nextY.push(m);\n }\n for (const m of curX) outX.push(m);\n curY = nextY;\n }\n return [outX, curY];\n}\n\n\nfunction tSeqOld(xs: SheetMutation[], ys: SheetMutation[], side: Side, acc: Acc): Pair {\n if (xs.length === 0 || ys.length === 0) return [xs, ys];\n if (xs.length === 1 && ys.length === 1) return tSeq(xs, ys, side, acc);\n if (xs.length > 1) {\n const first = tSeqOld([xs[0]!], ys, side, acc);\n if (blocked(first)) return first;\n const rest = tSeqOld(xs.slice(1), first[1], side, acc);\n if (blocked(rest)) return rest;\n return [[...first[0], ...rest[0]], rest[1]];\n }\n const first = tSeqOld(xs, [ys[0]!], side, acc);\n if (blocked(first)) return first;\n const rest = tSeqOld(first[0], ys.slice(1), side, acc);\n if (blocked(rest)) return rest;\n return [rest[0], [...first[1], ...rest[1]]];\n}\n\n/** Command group x rewritten to apply after command group y. One Barrier makes the whole group a barrier. */\nexport function transformGroup(x: SheetGroup, y: SheetGroup, side: Side): TransformResult {\n const acc: Acc = { lost: [], dropped: [] };\n const r = (process.env.OLD_TSEQ ? tSeqOld : tSeq)([...x], [...y], side, acc);\n if (blocked(r)) return r;\n return { op: r[0], lost: [...new Set(acc.lost)], dropped: [...new Set(acc.dropped)] };\n}\n\n/** The OpTransformer the C2 session takes (`@ai-matrx/data/realtime/collab`), for sheet command groups. */\nexport const sheetTransformer = {\n version: SHEET_TRANSFORMER_VERSION,\n transform(x: SheetGroup, y: SheetGroup, side: Side): { op: SheetMutation[] | null; lost: string[]; dropped: string[] } | Barrier {\n const r = transformGroup(x, y, side);\n if (isBarrier(r)) return r;\n return { op: r.op.length ? r.op : null, lost: r.lost, dropped: r.dropped };\n },\n compose(a: SheetGroup, b: SheetGroup): SheetMutation[] {\n return [...a, ...b];\n },\n isNoop(op: SheetGroup): boolean {\n return op.length === 0;\n },\n};\n","/**\n * One-dimensional structural algebra for rows and columns: insert, remove and move, the index map each\n * induces, and S-over-S transforms. Index arithmetic is ours (not Univer's ref-range helpers) because ties\n * need the side rule and overlapping removes must subtract, which no free helper does.\n *\n * Semantics pinned to Univer 1.0.4:\n * - insert(at, n): new rows occupy [at, at+n); old row i >= at moves to i+n (the row AT `at` moves down).\n * - remove(start, n): rows [start, start+n) go; i >= start+n moves to i-n.\n * - move(from, n, to): `moveMatrixArray` — rows [from, from+n) are placed before old row `to`. Forward\n * (to >= from+n): block lands at [to-n, to). Backward (to < from): block lands at [to, to+n). A `to` in\n * [from, from+n] moves nothing (Univer throws for [from, from+n)); we treat it as a no-op.\n */\nimport type { Side } from \"./types\";\n\nexport type Axis = \"row\" | \"col\";\n\nexport type AxisOp =\n | { kind: \"insert\"; at: number; count: number }\n | { kind: \"remove\"; start: number; count: number }\n | { kind: \"move\"; from: number; count: number; to: number };\n\nexport function isNoopMove(op: { from: number; count: number; to: number }): boolean {\n return op.count <= 0 || (op.to >= op.from && op.to <= op.from + op.count);\n}\n\n/** Where the moved block starts after the move. */\nexport function movedBlockStart(op: { from: number; count: number; to: number }): number {\n return op.to > op.from ? op.to - op.count : op.to;\n}\n\n/** Old index → new index, or null when the index is removed. */\nexport function mapIndex(op: AxisOp, i: number): number | null {\n switch (op.kind) {\n case \"insert\":\n return i >= op.at ? i + op.count : i;\n case \"remove\":\n if (i < op.start) return i;\n if (i < op.start + op.count) return null;\n return i - op.count;\n case \"move\": {\n if (isNoopMove(op)) return i;\n const { from, count, to } = op;\n if (i >= from && i < from + count) return movedBlockStart(op) + (i - from);\n if (to > from) return i >= from + count && i < to ? i - count : i;\n return i >= to && i < from ? i + count : i;\n }\n }\n}\n\n/** Contiguous runs of a sorted, de-duplicated index list. */\nexport function runs(indices: Iterable<number>): Array<{ start: number; count: number }> {\n const sorted = [...new Set(indices)].sort((a, b) => a - b);\n const out: Array<{ start: number; count: number }> = [];\n for (const i of sorted) {\n const last = out[out.length - 1];\n if (last && last.start + last.count === i) last.count++;\n else out.push({ start: i, count: 1 });\n }\n return out;\n}\n\n/**\n * A gap (insert position: \"before old row p\") through a move. Gaps strictly inside the block ride with\n * it; any other gap is a gap of the non-block rows. At the move's own target gap an insert lands BEFORE\n * the block (side-independent; `transformAxis(move, insert)` keeps the same order).\n */\nfunction mapGapThroughMove(p: number, mv: { from: number; count: number; to: number }): number {\n const { from, count, to } = mv;\n if (p > from && p < from + count) return movedBlockStart(mv) + (p - from);\n const g = p <= from ? p : p - count; // gap index among the non-block rows\n const tg = to <= from ? to : to - count;\n return g <= tg ? g : g + count;\n}\n\n/**\n * x over y on ONE axis. Returns the list of axis ops that apply after y (empty = x vanished), or null when\n * the pair has no transform (the caller turns that into a barrier).\n */\nexport function transformAxis(x: AxisOp, y: AxisOp, side: Side): AxisOp[] | null {\n if (y.kind === \"move\" && isNoopMove(y)) return [x];\n if (x.kind === \"move\" && isNoopMove(x)) return [];\n switch (x.kind) {\n case \"insert\": {\n if (y.kind === \"insert\") {\n if (x.at < y.at || (x.at === y.at && side === \"left\")) return [x];\n return [{ ...x, at: x.at + y.count }];\n }\n if (y.kind === \"remove\") {\n if (x.at <= y.start) return [x];\n if (x.at >= y.start + y.count) return [{ ...x, at: x.at - y.count }];\n return [{ ...x, at: y.start }]; // an insert inside a removed span survives at its start\n }\n return [{ ...x, at: mapGapThroughMove(x.at, y) }];\n }\n case \"remove\": {\n const kept: number[] = [];\n for (let i = x.start; i < x.start + x.count; i++) {\n const m = mapIndex(y, i);\n if (m !== null) kept.push(m);\n }\n if (y.kind === \"insert\" || y.kind === \"remove\" || y.kind === \"move\") {\n // Removes are emitted highest first so each index is still valid when it applies.\n return runs(kept)\n .reverse()\n .map((r) => ({ kind: \"remove\" as const, start: r.start, count: r.count }));\n }\n return null;\n }\n case \"move\": {\n if (y.kind === \"insert\") {\n const inside = y.at > x.from && y.at < x.from + x.count;\n const from = inside || y.at > x.from ? x.from : x.from + y.count;\n const count = inside ? x.count + y.count : x.count;\n const to = x.to >= y.at ? x.to + y.count : x.to;\n const out = { kind: \"move\" as const, from, count, to };\n return isNoopMove(out) ? [] : [out];\n }\n if (y.kind === \"remove\") {\n const kept: number[] = [];\n for (let i = x.from; i < x.from + x.count; i++) {\n const m = mapIndex(y, i);\n if (m !== null) kept.push(m);\n }\n if (kept.length === 0) return [];\n const r = runs(kept);\n if (r.length !== 1) return null;\n const to = x.to <= y.start ? x.to : x.to >= y.start + y.count ? x.to - y.count : y.start;\n const out = { kind: \"move\" as const, from: r[0]!.start, count: r[0]!.count, to };\n return isNoopMove(out) ? [] : [out];\n }\n // move over move. The same rows moved twice: the later move wins, the earlier one is dropped.\n // Blocks that only partly overlap have no transform yet.\n const overlap = Math.min(x.from + x.count, y.from + y.count) - Math.max(x.from, y.from);\n if (overlap > 0) {\n if (x.from !== y.from || x.count !== y.count) return null;\n if (side === \"right\") return [];\n const out = { kind: \"move\" as const, from: movedBlockStart(y), count: x.count, to: mapGapThroughMove(x.to, y) };\n return isNoopMove(out) ? [] : [out];\n }\n // Disjoint blocks: x's rows through y must stay contiguous; the target gap goes through y.\n const mapped: number[] = [];\n for (let i = x.from; i < x.from + x.count; i++) mapped.push(mapIndex(y, i)!);\n const r = runs(mapped);\n if (r.length !== 1) return null;\n let to: number;\n if (x.to > y.from && x.to < y.from + y.count) to = movedBlockStart(y) + (x.to - y.from);\n else to = mapGapThroughMove(x.to, y) + (x.to === y.to && side === \"right\" ? y.count : 0); // same target: later block first\n const out = { kind: \"move\" as const, from: r[0]!.start, count: r[0]!.count, to };\n if (to > out.from && to < out.from + out.count) return null;\n return isNoopMove(out) ? [] : [out];\n }\n }\n}\n","/**\n * C5b: formula references under concurrent structural edits and sheet renames. Pure: Univer's free formula\n * lexer (`LexerTreeBuilder.sequenceNodesBuilder`) reads the text, Univer's free ref-range helpers from\n * `@univerjs/sheets` move each reference, and the rewrite mirrors `@univerjs/sheets-formula` 1.0.4\n * (`getNewRangeByMoveParam`, `getMoveNewRange`, `checkMoveEdge`, `updateRefOffset`; Apache-2.0, ported because\n * sheets-formula exports none of them). A concurrent formula therefore ends up exactly as Univer's own\n * interceptor would have rewritten it had the two edits been made one after the other.\n *\n * Sheet names: formula text names sheets, ops name sheet ids. Every traveling op whose formula text carries a\n * sheet-qualified reference holds `refSheets` (name → sheet id, null for a name no sheet has), written at\n * capture by `annotateRefSheets`. An unqualified reference means the formula's own sheet.\n */\nimport { Direction, RANGE_TYPE, Rectangle, getIntersectRange, type IRange } from \"@univerjs/core\";\nimport { type ISequenceNode, LexerTreeBuilder, deserializeRangeWithSheet, generateStringWithSequence, sequenceNodeType, serializeRangeToRefString } from \"@univerjs/engine-formula\";\nimport {\n EffectRefRangId,\n handleIRemoveCol,\n handleIRemoveRow,\n handleInsertCol,\n handleInsertRow,\n handleMoveCols,\n handleMoveRows,\n runRefRangeMutations,\n} from \"@univerjs/sheets\";\nimport type { Axis, AxisOp } from \"./axis\";\n\n/** Sheet name → sheet id (null: the name is no sheet of this workbook). */\nexport type RefSheets = Readonly<Record<string, string | null>>;\n\n/** What changed under a formula: rows/columns of one sheet, or one sheet's name. */\nexport type RefChange =\n | { readonly kind: \"axis\"; readonly sheet: string; readonly axis: Axis; readonly op: AxisOp }\n | { readonly kind: \"rename\"; readonly sheet: string; readonly name: string }\n | { readonly kind: \"defined-name\"; readonly from: string; readonly to: string | null };\n\nexport interface FormulaCtx {\n /** The sheet the formula lives in (its unqualified references point here). */\n readonly ownSheet: string;\n readonly refSheets: RefSheets | undefined;\n /** Defined names keep the sheet qualifier of a moved reference (sheets-formula `preserveSheetQualifier`). */\n readonly keepQualifier?: boolean;\n}\n\nexport const REF_ERROR = \"#REF!\";\n/** Larger than any sheet; stands in for \"the whole other axis\" in the ref-range helpers. */\nconst FULL = 16383 * 64;\n\nlet lexer: LexerTreeBuilder | null = null;\nconst lex = (body: string) => (lexer ??= new LexerTreeBuilder()).sequenceNodesBuilder(body);\n\nexport const isFormulaText = (f: unknown): f is string => typeof f === \"string\" && f.length > 1 && f.startsWith(\"=\");\n\nconst IDENT = /^[A-Za-z_\\\\][A-Za-z0-9_.\\\\]*$/;\nconst ERROR_TOKEN = /^(?:[^!]+!)?#(?:REF!|NAME\\?|VALUE!|DIV\\/0!|N\\/A|NUM!|NULL!|SPILL!|CALC!)$/i;\n\ntype Node = string | ISequenceNode;\n\nfunction parse(text: string): { prefix: string; nodes: Node[] } | string {\n const prefix = text.startsWith(\"=\") ? \"=\" : \"\";\n const nodes = lex(text.slice(prefix.length));\n if (!nodes) return \"the formula lexer could not read the text\";\n for (const n of nodes) {\n if (typeof n === \"string\") continue;\n if (n.nodeType === sequenceNodeType.TABLE || (n.nodeType === sequenceNodeType.FUNCTION && n.token.includes(\"[\"))) return \"a structured table reference (tables are C5c)\";\n if (n.nodeType === sequenceNodeType.FUNCTION && !IDENT.test(n.token) && !ERROR_TOKEN.test(n.token))\n return `the lexer read \"${n.token}\" as one name (an intersection or a reference it cannot split)`;\n if (n.nodeType === sequenceNodeType.REFERENCE) {\n const d = deserializeRangeWithSheet(n.token);\n if (d.unitId) return \"a reference into another workbook\";\n }\n }\n return { prefix, nodes };\n}\n\n/** The sheet id a reference points at, \"\" when it names no sheet, or undefined when capture did not say. */\nfunction targetSheet(sheetName: string, ctx: FormulaCtx): string | undefined {\n if (!sheetName) return ctx.ownSheet;\n const id = ctx.refSheets?.[sheetName];\n if (id === undefined) return undefined;\n return id ?? \"\";\n}\n\n/** Why a formula cannot be transformed (null = it can). */\nexport function formulaBarrier(text: string, ctx: FormulaCtx): string | null {\n const p = parse(text);\n if (typeof p === \"string\") return p;\n for (const n of p.nodes) {\n if (typeof n === \"string\" || n.nodeType !== sequenceNodeType.REFERENCE) continue;\n const { sheetName } = deserializeRangeWithSheet(n.token);\n if (targetSheet(sheetName, ctx) === undefined) return `sheet \"${sheetName}\" is not in refSheets (capture must call annotateRefSheets)`;\n }\n return null;\n}\n\n/** Sheet names the text qualifies references with. */\nexport function referencedSheetNames(text: string): string[] {\n const p = parse(text);\n if (typeof p === \"string\") return [];\n const out = new Set<string>();\n for (const n of p.nodes) if (typeof n !== \"string\" && n.nodeType === sequenceNodeType.REFERENCE) {\n const { sheetName } = deserializeRangeWithSheet(n.token);\n if (sheetName) out.add(sheetName);\n }\n return [...out];\n}\n\n// ── one reference through one change (sheets-formula getNewRangeByMoveParam, types 1–6) ──────────────\nconst fullRowsRange = (start: number, count: number): IRange => ({ startRow: start, endRow: start + count - 1, startColumn: 0, endColumn: FULL, rangeType: RANGE_TYPE.ROW });\nconst fullColsRange = (start: number, count: number): IRange => ({ startRow: 0, endRow: FULL, startColumn: start, endColumn: start + count - 1, rangeType: RANGE_TYPE.COLUMN });\n\nconst startV = (v: number) => (Number.isNaN(v) || v == null ? -Infinity : v);\nconst endV = (v: number) => (Number.isNaN(v) || v == null ? Infinity : v);\nfunction startEnd(r: IRange) {\n return { ...r, startRow: startV(r.startRow), endRow: endV(r.endRow), startColumn: startV(r.startColumn), endColumn: endV(r.endColumn) };\n}\n\nfunction checkMoveEdge(origin: IRange, from: IRange): number | null {\n const startRow = startV(origin.startRow), endRow = endV(origin.endRow), startColumn = startV(origin.startColumn), endColumn = endV(origin.endColumn);\n const fromStartRow = startV(from.startRow), fromEndRow = endV(from.endRow), fromStartColumn = startV(from.startColumn), fromEndColumn = endV(from.endColumn);\n const rowsCover = () => (origin.rangeType === RANGE_TYPE.COLUMN && from.rangeType === RANGE_TYPE.COLUMN) || (startRow >= fromStartRow && endRow <= fromEndRow);\n const columnsCover = () => (origin.rangeType === RANGE_TYPE.ROW && from.rangeType === RANGE_TYPE.ROW) || (startColumn >= fromStartColumn && endColumn <= fromEndColumn);\n const allCover = () => origin.rangeType === RANGE_TYPE.ALL && from.rangeType === RANGE_TYPE.ALL;\n if ((rowsCover() && columnsCover()) || allCover()) return 4;\n if (columnsCover() && startRow >= fromStartRow && startRow <= fromEndRow && endRow > fromEndRow) return 0;\n if (columnsCover() && endRow >= fromStartRow && endRow <= fromEndRow && startRow < fromStartRow) return 1;\n if (rowsCover() && startColumn >= fromStartColumn && startColumn <= fromEndColumn && endColumn > fromEndColumn) return 2;\n if (rowsCover() && endColumn >= fromStartColumn && endColumn <= fromEndColumn && startColumn < fromStartColumn) return 3;\n return null;\n}\n\nfunction getMoveNewRange(moveEdge: number | null, result: IRange, from: IRange, to: IRange, origin: IRange, remain: IRange): IRange | undefined {\n const { startRow, endRow, startColumn, endColumn, rangeType } = startEnd(result);\n const f = startEnd(from);\n const fromRangeType = from.rangeType ?? RANGE_TYPE.NORMAL;\n const t = startEnd(to);\n const rm = startEnd(remain);\n const o = startEnd(origin);\n const originRangeType = origin.rangeType ?? RANGE_TYPE.NORMAL;\n const newRange: IRange = { ...origin };\n const rowsCover = () => (rangeType === RANGE_TYPE.COLUMN && originRangeType === RANGE_TYPE.COLUMN) || (startColumn >= o.startColumn && endColumn <= o.endColumn);\n const columnsCover = () => (rangeType === RANGE_TYPE.ROW && originRangeType === RANGE_TYPE.ROW) || (startRow >= o.startRow && endRow <= o.endRow);\n if (moveEdge === 0) {\n if (!rowsCover()) return undefined;\n if (startRow < o.startRow) newRange.startRow = startRow;\n else if (startRow >= o.endRow) newRange.endRow -= f.endRow + 1 - o.startRow;\n else return undefined;\n } else if (moveEdge === 1) {\n if (!rowsCover()) return undefined;\n if (endRow > o.endRow) newRange.endRow = endRow;\n else if (endRow <= o.startRow) newRange.startRow += o.endRow - f.startRow + 1;\n else return undefined;\n } else if (moveEdge === 2) {\n if (!columnsCover()) return undefined;\n if (startColumn < o.startColumn) newRange.startColumn = startColumn;\n else if (startColumn >= o.endColumn) newRange.endColumn -= f.endColumn + 1 - o.startColumn;\n else return undefined;\n } else if (moveEdge === 3) {\n if (!columnsCover()) return undefined;\n if (endColumn > o.endColumn) newRange.endColumn = endColumn;\n else if (endColumn <= o.startColumn) newRange.startColumn += o.endColumn - f.startColumn + 1;\n else return undefined;\n } else if (moveEdge === 4) {\n Object.assign(newRange, { startRow, startColumn, endRow, endColumn });\n } else if ((f.startColumn <= o.startColumn && f.endColumn >= o.endColumn) || (fromRangeType === RANGE_TYPE.ROW && originRangeType === RANGE_TYPE.ROW)) {\n const n = f.endRow - f.startRow + 1;\n if (from.endRow < o.startRow) {\n if (t.startRow >= o.startRow) newRange.startRow -= n;\n if (t.startRow >= o.endRow) newRange.endRow -= n;\n } else if (from.startRow > o.endRow) {\n if (t.endRow <= o.endRow) newRange.endRow += n;\n if (t.endRow <= o.startRow) newRange.startRow += n;\n } else if (from.startRow >= o.startRow && from.endRow <= o.endRow) {\n if (t.startRow <= o.startRow) newRange.startRow += n;\n else if (t.startRow >= o.endRow) newRange.endRow -= n;\n }\n } else if ((f.startRow <= o.startRow && f.endRow >= o.endRow) || (fromRangeType === RANGE_TYPE.COLUMN && originRangeType === RANGE_TYPE.COLUMN)) {\n const n = f.endColumn - f.startColumn + 1;\n if (from.endColumn < o.startColumn) {\n if (t.startColumn >= o.startColumn) newRange.startColumn -= n;\n if (t.startColumn >= o.endColumn) newRange.endColumn -= n;\n } else if (from.startColumn > o.endColumn) {\n if (t.endColumn <= o.endColumn) newRange.endColumn += n;\n if (t.endColumn <= o.startColumn) newRange.startColumn += n;\n } else if (from.startColumn >= o.startColumn && from.endColumn <= o.endColumn) {\n if (t.startColumn <= o.startColumn) newRange.startColumn += n;\n else if (t.startColumn >= o.endColumn) newRange.endColumn -= n;\n }\n } else {\n // the three remaining branches of the original all take the result as is\n Object.assign(newRange, { startRow, startColumn, endRow, endColumn });\n void rm;\n }\n return newRange;\n}\n\n/** The new range of one reference, REF_ERROR when it is gone, or undefined when the change leaves it alone. */\nfunction moveRange(range: IRange, axis: Axis, op: AxisOp): IRange | typeof REF_ERROR | undefined {\n const isRow = axis === \"row\";\n if (op.kind === \"insert\") {\n const r = isRow ? fullRowsRange(op.at, op.count) : fullColsRange(op.at, op.count);\n const ops = isRow\n ? handleInsertRow({ id: EffectRefRangId.InsertRowCommandId, params: { range: r, unitId: \"\", subUnitId: \"\", direction: Direction.DOWN } }, range)\n : handleInsertCol({ id: EffectRefRangId.InsertColCommandId, params: { range: r, unitId: \"\", subUnitId: \"\", direction: Direction.RIGHT } }, range);\n const res = runRefRangeMutations(ops, range);\n return res == null ? undefined : { ...range, ...res };\n }\n if (op.kind === \"remove\") {\n const r = isRow ? fullRowsRange(op.start, op.count) : fullColsRange(op.start, op.count);\n const ops = isRow\n ? handleIRemoveRow({ id: EffectRefRangId.RemoveRowCommandId, params: { range: r } }, range, [])\n : handleIRemoveCol({ id: EffectRefRangId.RemoveColCommandId, params: { range: r } }, range);\n const res = runRefRangeMutations(ops, range);\n return res == null ? REF_ERROR : { ...range, ...res };\n }\n const from = isRow ? fullRowsRange(op.from, op.count) : fullColsRange(op.from, op.count);\n const to = isRow ? fullRowsRange(op.to, op.count) : fullColsRange(op.to, op.count);\n const moveEdge = checkMoveEdge(range, from);\n let remain = getIntersectRange(range, from);\n if (isRow) {\n if (remain == null && ((from.endRow < range.startRow && to.endRow <= range.startRow) || (from.startRow > range.endRow && to.startRow > range.endRow))) return undefined;\n } else if (remain == null && ((from.endColumn < range.startColumn && to.endColumn <= range.startColumn) || (from.startColumn > range.endColumn && to.startColumn > range.endColumn))) return undefined;\n remain ??= { startRow: range.startRow, endRow: range.endRow, startColumn: range.startColumn, endColumn: range.endColumn, rangeType: RANGE_TYPE.NORMAL };\n const ops = isRow\n ? handleMoveRows({ id: EffectRefRangId.MoveRowsCommandId, params: { toRange: to, fromRange: from } }, remain)\n : handleMoveCols({ id: EffectRefRangId.MoveColsCommandId, params: { toRange: to, fromRange: from } }, remain);\n const res = runRefRangeMutations(ops, remain);\n if (res == null) return REF_ERROR;\n return getMoveNewRange(moveEdge, res, from, to, range, remain);\n}\n\nexport interface Rewritten {\n readonly text: string;\n readonly changed: boolean;\n}\n\n/**\n * The formula (or defined-name ref string) after `change`, exactly as Univer rewrites it: every reference into\n * the changed sheet moves (or becomes #REF!), and once anything changed every other reference is re-serialized\n * (`updateRefOffset`). Returns a reason string when the text cannot be transformed.\n */\nexport function rewriteFormula(text: string, ctx: FormulaCtx, change: RefChange): Rewritten | string {\n const p = parse(text);\n if (typeof p === \"string\") return p;\n const nodes = p.nodes.slice();\n const changedIds: number[] = [];\n for (let i = 0; i < nodes.length; i++) {\n const n = nodes[i]!;\n if (typeof n === \"string\") continue;\n if (change.kind === \"defined-name\") {\n if ((n.nodeType === sequenceNodeType.DEFINED_NAME || n.nodeType === sequenceNodeType.FUNCTION) && n.token === change.from) {\n nodes[i] = { ...n, token: change.to ?? REF_ERROR };\n changedIds.push(i);\n }\n continue;\n }\n if (n.nodeType !== sequenceNodeType.REFERENCE) continue;\n const { range, sheetName, unitId } = deserializeRangeWithSheet(n.token);\n const target = targetSheet(sheetName, ctx);\n if (target === undefined) return `sheet \"${sheetName}\" is not in refSheets (capture must call annotateRefSheets)`;\n if (target !== change.sheet) continue;\n let token: string | undefined;\n if (change.kind === \"rename\") {\n if (!sheetName) continue; // an unqualified reference names no sheet\n token = serializeRangeToRefString({ range, sheetName: change.name, unitId });\n } else {\n // sheets-formula moves `Rectangle.moveOffset(range, 0, 0)`, not the parsed range (it differs for whole rows/columns)\n const moved = moveRange(Rectangle.moveOffset(range, 0, 0), change.axis, change.op);\n if (moved === undefined) continue;\n token = moved === REF_ERROR ? REF_ERROR : serializeRangeToRefString({ range: moved, sheetName: target === ctx.ownSheet && !ctx.keepQualifier ? \"\" : sheetName, unitId });\n }\n nodes[i] = { ...n, token };\n changedIds.push(i);\n }\n if (!changedIds.length) return { text, changed: false };\n // updateRefOffset: every other reference is re-serialized too, as Univer does\n for (let i = 0; i < nodes.length; i++) {\n const n = nodes[i]!;\n if (typeof n === \"string\" || n.nodeType !== sequenceNodeType.REFERENCE || changedIds.includes(i)) continue;\n nodes[i] = { ...n, token: serializeRangeToRefString(deserializeRangeWithSheet(n.token)) };\n }\n const out = p.prefix + generateStringWithSequence(nodes);\n return { text: out, changed: out !== text };\n}\n\n/**\n * An op's `refSheets` after a rename: the renamed sheet answers to its new name only, and a name that was\n * no sheet before now names it. Unchanged (same object) when the rename touches nothing it lists.\n */\nexport function refSheetsAfter(refSheets: RefSheets | undefined, change: RefChange): RefSheets | undefined {\n if (change.kind !== \"rename\" || !refSheets) return refSheets;\n const entries = Object.entries(refSheets);\n if (!entries.some(([name, id]) => id === change.sheet || name === change.name)) return refSheets;\n const next: Record<string, string | null> = {};\n for (const [name, id] of entries) if (id !== change.sheet && name !== change.name) next[name] = id;\n next[change.name] = change.sheet;\n return next;\n}\n\n/** `refSheets` for the given formula texts: every sheet name they qualify a reference with, resolved now. */\nexport function refSheetsFor(texts: Iterable<string>, sheets: Readonly<Record<string, string>>): RefSheets | undefined {\n const byName = new Map(Object.entries(sheets).map(([id, name]) => [name, id] as const));\n const out: Record<string, string | null> = {};\n for (const t of texts) for (const name of referencedSheetNames(t)) out[name] = byName.get(name) ?? null;\n return Object.keys(out).length ? out : undefined;\n}\n"],"mappings":"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","names":["to","out","r","ops","res","barrier","FULL","ch","out","gone","spans","P","first","rest"]}