@ai-matrx/office 0.8.26 → 0.8.28

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/index.ts","../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","../src/collab/sheets/comment-anchor-transform.ts"],"sourcesContent":["/**\n * @ai-matrx/office/collab/sheets-transform — the sheet transformer: C5a cells and structure, C5b formulas\n * (pure, inert until C6).\n */\nexport type { Barrier, SheetGroup, SheetMutation, SheetRange, Side, TransformResult, Transformed } from \"./types\";\nexport { isBarrier } from \"./types\";\nexport { SHEET_MUTATIONS, allowParams } from \"./registry\";\nexport type { RegistryEntry, CoveredEntry, NeverEntry, BarrierEntry, SheetFamily } from \"./registry\";\nexport {\n CONTENT_KEYS,\n PAIR_BARRIERS,\n SHEET_TRANSFORMER_VERSION,\n SIDE_CAR_PARAMS,\n annotateFormulas,\n annotateSheetOps,\n inlineSheetStyles,\n spanThrough,\n cellRef,\n completeCellContent,\n exactMergeRemovals,\n forApply,\n isStructuralMutation,\n mergeFixupsOwed,\n mergeThrough,\n sheetTransformer,\n transformGroup,\n transformMutation,\n} from \"./transform\";\nexport { mapIndex, transformAxis } from \"./axis\";\nexport type { Axis, AxisOp } from \"./axis\";\nexport { REF_ERROR, formulaBarrier, isFormulaText, refSheetsAfter, refSheetsFor, rewriteFormula } from \"./formula\";\nexport type { FormulaCtx, RefChange, RefSheets, Rewritten } from \"./formula\";\n","/**\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\" | \"anchor\";\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 // ── covered (C9): our own cell comment anchors (comment-anchor-transform.ts; not emitted by Univer) ──────\n \"matrx.mutation.set-comment-anchor\": covered(\"anchor\", \"anchorId\", \"cell\"),\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 { transformCommentAnchor } from \"../comment-anchor-transform\";\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 ca = transformCommentAnchor(x, y, side); // C9: cell comment anchors (their own file)\n if (ca) return ca;\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","/**\n * The sheet comment-anchor transform (COLLAB-DESIGN §8 + §10 class R, unit C9). Its own file; the sheet\n * transformer calls it first for every pair (`transformMutation`) and the registry declares its mutation id.\n *\n * A cell comment is anchored by `matrx.mutation.set-comment-anchor` `{ subUnitId, anchorId, cell: {row, col} | null }`\n * (null takes the anchor out). The anchor is a ranged resource keyed by id:\n * - anchor over a structural op on its sheet: the cell moves by the same index arithmetic as cells (`mapIndex`);\n * a cell whose row or column was removed DROPS the anchor (its author is told) and the thread is orphaned;\n * - anchor over the removal of its sheet: dropped the same way;\n * - anchor over the same anchor id: the later commit wins (§6.4), the earlier side is told;\n * - anything else over an anchor, and an anchor over anything else: unchanged (anchors never move content).\n * Every seat moves its stored anchors through each structural op it applies with `moveSheetAnchorCell` — the\n * same function — so a seat that set an anchor before a peer's row insert and a seat that received the anchor\n * after it end with the same cell.\n */\nimport { mapIndex, type AxisOp } from \"./transform/axis\";\nimport type { SheetMutation, Side, TransformResult } from \"./transform/types\";\n\nexport const SET_SHEET_COMMENT_ANCHOR = \"matrx.mutation.set-comment-anchor\";\n\n/** Mutation ids this package defines itself (never emitted by Univer; the census lists them apart). */\nexport const OWN_SHEET_MUTATION_IDS: readonly string[] = [SET_SHEET_COMMENT_ANCHOR];\n\nexport interface SheetAnchorCell {\n row: number;\n col: number;\n}\n\nconst REMOVE_SHEET = \"sheet.mutation.remove-sheet\";\n\ntype R = { startRow: number; endRow: number; startColumn: number; endColumn: number };\n\n/** The row/column op a Univer structural mutation makes, from its params (the same params on every seat). */\nexport function structuralAxisOp(id: string, params: Readonly<Record<string, unknown>>): { axis: \"row\" | \"col\"; op: AxisOp } | null {\n const p = params as Record<string, R | undefined>;\n switch (id) {\n case \"sheet.mutation.insert-row\":\n return p.range ? { axis: \"row\", op: { kind: \"insert\", at: p.range.startRow, count: p.range.endRow - p.range.startRow + 1 } } : null;\n case \"sheet.mutation.remove-rows\":\n return p.range ? { axis: \"row\", op: { kind: \"remove\", start: p.range.startRow, count: p.range.endRow - p.range.startRow + 1 } } : null;\n case \"sheet.mutation.insert-col\":\n return p.range ? { axis: \"col\", op: { kind: \"insert\", at: p.range.startColumn, count: p.range.endColumn - p.range.startColumn + 1 } } : null;\n case \"sheet.mutation.remove-col\":\n return p.range ? { axis: \"col\", op: { kind: \"remove\", start: p.range.startColumn, count: p.range.endColumn - p.range.startColumn + 1 } } : null;\n case \"sheet.mutation.move-rows\":\n return p.sourceRange && p.targetRange\n ? { axis: \"row\", op: { kind: \"move\", from: p.sourceRange.startRow, count: p.sourceRange.endRow - p.sourceRange.startRow + 1, to: p.targetRange.startRow } }\n : null;\n case \"sheet.mutation.move-columns\":\n return p.sourceRange && p.targetRange\n ? {\n axis: \"col\",\n op: { kind: \"move\", from: p.sourceRange.startColumn, count: p.sourceRange.endColumn - p.sourceRange.startColumn + 1, to: p.targetRange.startColumn },\n }\n : null;\n default:\n return null;\n }\n}\n\n/**\n * Where an anchored cell is after one applied mutation on `sheet`: the same cell, a moved cell, or null when the\n * mutation removed it (its row, its column or its sheet).\n */\nexport function moveSheetAnchorCell(cell: SheetAnchorCell, sheet: string, id: string, params: Readonly<Record<string, unknown>>): SheetAnchorCell | null {\n if (String(params.subUnitId ?? \"\") !== sheet) return cell;\n if (id === REMOVE_SHEET) return null;\n const s = structuralAxisOp(id, params);\n if (!s) return cell;\n if (s.axis === \"row\") {\n const row = mapIndex(s.op, cell.row);\n return row === null ? null : row === cell.row ? cell : { row, col: cell.col };\n }\n const col = mapIndex(s.op, cell.col);\n return col === null ? null : col === cell.col ? cell : { row: cell.row, col };\n}\n\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}\n/** \"B5\" for row 4, column 1. */\nexport const sheetCellName = (cell: SheetAnchorCell) => `${colName(cell.col)}${cell.row + 1}`;\n\nfunction cellOf(m: SheetMutation): SheetAnchorCell | null {\n const c = m.params.cell as SheetAnchorCell | null | undefined;\n return c && typeof c.row === \"number\" && typeof c.col === \"number\" ? c : null;\n}\n\nconst ok = (op: SheetMutation[], lost: string[] = [], dropped: string[] = []): TransformResult => ({ op, lost, dropped });\nconst label = (m: SheetMutation) => {\n const c = cellOf(m);\n return `${String(m.params.subUnitId ?? \"\")}!${c ? sheetCellName(c) : \"?\"} comment`;\n};\n\n/** x over y when either is an anchor mutation; null when neither is (the sheet transformer carries on). */\nexport function transformCommentAnchor(x: SheetMutation, y: SheetMutation, side: Side): TransformResult | null {\n const xa = x.id === SET_SHEET_COMMENT_ANCHOR;\n const ya = y.id === SET_SHEET_COMMENT_ANCHOR;\n if (!xa && !ya) return null;\n if (!xa) return ok([x]); // an anchor never moves content\n if (ya) {\n // anchors are keyed by sheet and id: the same id on another sheet is another anchor\n if (x.params.anchorId !== y.params.anchorId || x.params.subUnitId !== y.params.subUnitId) return ok([x]);\n return side === \"left\" ? ok([x], [label(y)]) : ok([], [], [label(x)]);\n }\n const cell = cellOf(x);\n if (!cell) return ok([x]); // taking an anchor out commutes with every move\n const moved = moveSheetAnchorCell(cell, String(x.params.subUnitId ?? \"\"), y.id, y.params);\n if (!moved) return ok([], [], [label(x)]);\n return ok([moved === cell ? x : { id: x.id, params: { ...x.params, cell: moved } }]);\n}\n"],"mappings":"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","names":["import_sheets","to","out","r","ops","res","barrier","ok","colName","FULL","ch","out","gone","spans","P","first","rest"]}
1
+ {"version":3,"sources":["../src/collab/sheets/transform/index.ts","../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","../src/collab/sheets/comment-anchor-transform.ts","../src/collab/sheets/transform/ranged-resources.ts"],"sourcesContent":["/**\n * @ai-matrx/office/collab/sheets-transform — the sheet transformer: C5a cells and structure, C5b formulas\n * (pure, inert until C6).\n */\nexport type { Barrier, SheetGroup, SheetMutation, SheetRange, Side, TransformResult, Transformed } from \"./types\";\nexport { isBarrier } from \"./types\";\nexport { SHEET_MUTATIONS, allowParams } from \"./registry\";\nexport type { RegistryEntry, CoveredEntry, NeverEntry, BarrierEntry, SheetFamily } from \"./registry\";\nexport {\n CONTENT_KEYS,\n PAIR_BARRIERS,\n SHEET_TRANSFORMER_VERSION,\n SIDE_CAR_PARAMS,\n annotateFormulas,\n annotateSheetOps,\n inlineSheetStyles,\n spanThrough,\n cellRef,\n completeCellContent,\n exactMergeRemovals,\n forApply,\n isStructuralMutation,\n mergeFixupsOwed,\n mergeThrough,\n sheetTransformer,\n transformGroup,\n transformMutation,\n} from \"./transform\";\nexport { mapIndex, transformAxis } from \"./axis\";\nexport type { Axis, AxisOp } from \"./axis\";\nexport { REF_ERROR, formulaBarrier, isFormulaText, refSheetsAfter, refSheetsFor, rewriteFormula } from \"./formula\";\nexport type { FormulaCtx, RefChange, RefSheets, Rewritten } from \"./formula\";\n","/**\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\" | \"anchor\" | \"cf\" | \"dv\" | \"filter\";\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 // ── covered (C9): our own cell comment anchors (comment-anchor-transform.ts; not emitted by Univer) ──────\n \"matrx.mutation.set-comment-anchor\": covered(\"anchor\", \"anchorId\", \"cell\"),\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 // ── covered (C5d): ranged resources, transformed by ranged-resources.ts ──\n \"sheet.mutation.add-conditional-rule\": covered(\"cf\", \"rule\", \"derived\"),\n \"sheet.mutation.set-conditional-rule\": covered(\"cf\", \"cfId\", \"rule\", \"derived\"),\n \"sheet.mutation.delete-conditional-rule\": covered(\"cf\", \"cfId\", \"derived\"),\n \"sheet.mutation.move-conditional-rule\": barrier(\"C5c\", \"conditional-format priority (ordered list)\"),\n \"data-validation.mutation.addRule\": covered(\"dv\", \"rule\", \"index\", \"source\", \"derived\"),\n \"data-validation.mutation.updateRule\": covered(\"dv\", \"ruleId\", \"payload\", \"source\", \"derived\"),\n \"data-validation.mutation.removeRule\": covered(\"dv\", \"ruleId\", \"source\", \"derived\"),\n \"sheet.mutation.set-filter-range\": covered(\"filter\", \"range\", \"derived\"),\n \"sheet.mutation.set-filter-criteria\": covered(\"filter\", \"col\", \"criteria\", \"reCalc\", \"derived\"),\n \"sheet.mutation.remove-filter\": covered(\"filter\", \"derived\"),\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 { transformCommentAnchor } from \"../comment-anchor-transform\";\nimport { rangedSpecOf } from \"./ranged-resources\";\nimport { type Barrier, type SheetGroup, type SheetMutation, type SheetRange, type Side, type TransformResult, type Transformed, isBarrier } from \"./types\";\n\nexport const SHEET_TRANSFORMER_VERSION = \"c5d-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 (sheetOf(x) === gone && x.id !== ID.setName && x.id !== ID.removeName)\n return ok([], [], isDerived(x) ? [] : [`${gone}: the sheet was removed`]);\n if (namesSheet(x, gone)) {\n // C5d: references to the removed sheet become #REF! (what Univer writes into formulas it knew about)\n const ch: RefChange = { kind: \"remove-sheet\", sheet: gone };\n if (x.id === ID.values) return cellsOverChange(x, ch);\n const r = definedNameThrough(x, ch);\n return typeof r === \"string\" ? barrier(r) : ok([r.op]);\n }\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 const ry = rangedSpecOf(y.id);\n if (ry && sheetOf(y) === gone && ry.ids[y.id] !== \"remove\")\n // the plugin cleans up only the records it knew when the sheet went (those cleanups meet y first, ahead of x):\n // a record y created reaches x, and goes with the sheet, first\n return ok([...ry.keys(y).map((k) => ({ id: ry.removeOf(gone, k).id, params: { ...ry.removeOf(gone, k).params } })), x]);\n const lost = sheetOf(y) === gone && !isDerived(y) && y.id !== ID.setName && y.id !== ID.removeName ? [`${gone}: the sheet was removed`] : [];\n if (sheetOf(y) !== gone && namesSheet(y, gone)) {\n // the rewrite Univer's interceptor would have written, had y's formulas been there: it travels after x\n const ch: RefChange = { kind: \"remove-sheet\", sheet: gone };\n if (y.id === ID.values) {\n const add = rewritesOf(y, ch);\n if (typeof add === \"string\") return barrier(add);\n return ok(add ? [x, add] : [x], lost);\n }\n const r = definedNameThrough(y, ch);\n if (typeof r === \"string\") return barrier(r);\n return ok(r.changed ? [x, asDerived(r.op)] : [x], lost);\n }\n return ok([x], lost);\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 return cleanupsBeforeSheetRemoval(annotateSheetOpsInOrder(group, sheetOrder));\n}\nfunction annotateSheetOpsInOrder(group: SheetGroup, sheetOrder: readonly string[]): SheetMutation[] {\n const order = [...sheetOrder];\n // C5d: a resource op after a structural op in one group is the plugin's ref-range handler at work (derived)\n let structural = false;\n return group.map((m0) => {\n if (structuralOf(m0)) structural = true;\n const m = structural && rangedSpecOf(m0.id) && !isDerived(m0) ? { id: m0.id, params: { ...m0.params, derived: true } } : m0;\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/**\n * C5d: Univer's plugins clean a removed sheet's records up AFTER remove-sheet (the same group). Moved ahead of it,\n * they meet a concurrent removal of the same record before the sheet goes (two removes are one); behind it, a\n * concurrent remove the sheet removal dropped would leave them removing what is gone (refused). Same end state.\n */\nfunction cleanupsBeforeSheetRemoval(group: SheetMutation[]): SheetMutation[] {\n const at = group.findIndex((m) => m.id === ID.removeSheet);\n if (at < 0) return group;\n const gone = sheetOf(group[at]!);\n const moved = group.filter((m, k) => k > at && rangedSpecOf(m.id) && sheetOf(m) === gone);\n if (!moved.length) return group;\n const rest = group.filter((m) => !moved.includes(m));\n const k = rest.indexOf(group[at]!);\n return [...rest.slice(0, k), ...moved, ...rest.slice(k)];\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 ──────────────────────────────────────────────────────────────────────────────\n// ── ranged resources (C5d; specs in ranged-resources.ts) ─────────────────────────────────────────────\nfunction rangedPair(x: SheetMutation, y: SheetMutation, side: Side, sx: Structural | null, sy: Structural | null): TransformResult | null {\n const px = rangedSpecOf(x.id);\n const py = rangedSpecOf(y.id);\n if (!px && !py) return null;\n const told = (m: SheetMutation, what: string) => (isDerived(m) ? [] : [`${sheetOf(m)}: ${what}`]);\n if (px && sy) {\n const role = px.ids[x.id];\n const rects = role === \"remove\" ? null : px.rects(x);\n if (!rects) return ok([x]);\n const why = px.barrierOver?.(x, sy.axis, sy.op.kind);\n if (why) return barrier(why);\n if (px.hasFormula?.(x)) return barrier(`${px.family}: a rule with formula text against a row or column change (its formulas do not move yet)`);\n const moved = rectsThrough(sy, rects as Rect[]) as SheetRange[];\n if (moved.length) return ok([px.withRects(x, moved)]);\n if (role === \"add\" || px.emptyDrops?.(x)) return ok([], [], told(x, `${px.family} ${px.keys(x).join(\",\")}: its cells were removed`));\n return ok(px.keys(x).map((k) => px.removeOf(sheetOf(x), k)), [], told(x, `${px.family} ${px.keys(x).join(\",\")}: its cells were removed`));\n }\n if (py && sx) {\n // a raw structural mutation runs no plugin ref-range handler: x carries the fixup y's record is owed\n const role = py.ids[y.id];\n const rects = role === \"remove\" ? null : py.rects(y);\n if (!rects) return ok([x]);\n const why = py.barrierOver?.(y, sx.axis, sx.op.kind);\n if (why) return barrier(why);\n if (py.hasFormula?.(y)) return barrier(`${py.family}: a rule with formula text against a row or column change (its formulas do not move yet)`);\n const moved = rectsThrough(sx, rects as Rect[]) as SheetRange[];\n if (!moved.length && py.emptyDrops?.(y)) return ok([x], told(y, `${py.family} ${py.keys(y).join(\",\")}: its cells were removed`));\n return ok([x, ...(moved.length ? [py.setFor(y, moved)] : py.keys(y).map((k) => py.removeOf(sheetOf(y), k)))], moved.length ? [] : told(y, `${py.family} ${py.keys(y).join(\",\")}: its cells were removed`));\n }\n if (!px || !py || px !== py) return ok([x]); // a resource commutes with cells, merges, sizes, names, sorts and other resources\n const rx = px.ids[x.id]!;\n const ry = py.ids[y.id]!;\n const ky = py.keys(y);\n const common = px.keys(x).filter((k) => ky.includes(k));\n if (!common.length) {\n if (rx === \"add\" && ry === \"add\" && px.orderedAdds) return barrier(`${px.family}: two added to one sheet at once (their order is state)`);\n return ok([x]);\n }\n if (rx === \"remove\") {\n if (ry !== \"remove\") return ok([x]);\n const rest = px.withoutKeys ? px.withoutKeys(x, common) : null;\n return ok(rest ? [rest] : []);\n }\n if (ry === \"remove\") return ok([], [], told(x, `${px.family} ${common.join(\",\")}: removed at the same time`));\n const fx = px.facet?.(x) ?? \"all\";\n const fy = py.facet?.(y) ?? \"all\";\n if (fx !== fy && fx !== \"all\" && fy !== \"all\") return ok([x]);\n const dx = isDerived(x);\n const dy = isDerived(y);\n const xWins = dx !== dy ? !dx : side === \"left\";\n if (xWins) return ok([x], told(y, `${py.family} ${common.join(\",\")}`));\n // an \"all\" op losing to one facet keeps its other facets (a row insert's restated rule keeps its moved range)\n const narrowed = fx === \"all\" && fy !== \"all\" ? px.narrow?.(x, fy) : null;\n return ok(narrowed ? [narrowed] : [], [], told(x, `${px.family} ${common.join(\",\")}`));\n}\n\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 ca = transformCommentAnchor(x, y, side); // C9: cell comment anchors (their own file)\n if (ca) return ca;\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 rp = rangedPair(x, y, side, sx, sy);\n if (rp) return rp;\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 /** C5d: the sheet was removed; every reference that names it becomes #REF! (Excel's rule). */\n | { readonly kind: \"remove-sheet\"; readonly sheet: 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 if (change.kind === \"remove-sheet\") {\n if (!sheetName) continue; // an unqualified reference lives on the removed sheet itself, which is gone with it\n token = REF_ERROR;\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 === \"remove-sheet\" && refSheets) {\n // the removed sheet's name now names no sheet (a later sheet of that name is a different one)\n if (!Object.values(refSheets).includes(change.sheet)) return refSheets;\n return Object.fromEntries(Object.entries(refSheets).map(([n, id]) => [n, id === change.sheet ? null : id]));\n }\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","/**\n * The sheet comment-anchor transform (COLLAB-DESIGN §8 + §10 class R, unit C9). Its own file; the sheet\n * transformer calls it first for every pair (`transformMutation`) and the registry declares its mutation id.\n *\n * A cell comment is anchored by `matrx.mutation.set-comment-anchor` `{ subUnitId, anchorId, cell: {row, col} | null }`\n * (null takes the anchor out). The anchor is a ranged resource keyed by id:\n * - anchor over a structural op on its sheet: the cell moves by the same index arithmetic as cells (`mapIndex`);\n * a cell whose row or column was removed DROPS the anchor (its author is told) and the thread is orphaned;\n * - anchor over the removal of its sheet: dropped the same way;\n * - anchor over the same anchor id: the later commit wins (§6.4), the earlier side is told;\n * - anything else over an anchor, and an anchor over anything else: unchanged (anchors never move content).\n * Every seat moves its stored anchors through each structural op it applies with `moveSheetAnchorCell` — the\n * same function — so a seat that set an anchor before a peer's row insert and a seat that received the anchor\n * after it end with the same cell.\n */\nimport { mapIndex, type AxisOp } from \"./transform/axis\";\nimport type { SheetMutation, Side, TransformResult } from \"./transform/types\";\n\nexport const SET_SHEET_COMMENT_ANCHOR = \"matrx.mutation.set-comment-anchor\";\n\n/** Mutation ids this package defines itself (never emitted by Univer; the census lists them apart). */\nexport const OWN_SHEET_MUTATION_IDS: readonly string[] = [SET_SHEET_COMMENT_ANCHOR];\n\n/**\n * A sheet op that only sets or clears comment anchors: every mutation is `matrx.mutation.set-comment-anchor`. A seat\n * that may comment but not edit sends exactly these (the door `content.collab_append` checks the same rule).\n */\nexport function isSheetsAnchorOnlyOp(op: ReadonlyArray<SheetMutation> | null | undefined): boolean {\n return !!op && op.length > 0 && op.every((m) => m.id === SET_SHEET_COMMENT_ANCHOR);\n}\n\nexport interface SheetAnchorCell {\n row: number;\n col: number;\n}\n\nconst REMOVE_SHEET = \"sheet.mutation.remove-sheet\";\n\ntype R = { startRow: number; endRow: number; startColumn: number; endColumn: number };\n\n/** The row/column op a Univer structural mutation makes, from its params (the same params on every seat). */\nexport function structuralAxisOp(id: string, params: Readonly<Record<string, unknown>>): { axis: \"row\" | \"col\"; op: AxisOp } | null {\n const p = params as Record<string, R | undefined>;\n switch (id) {\n case \"sheet.mutation.insert-row\":\n return p.range ? { axis: \"row\", op: { kind: \"insert\", at: p.range.startRow, count: p.range.endRow - p.range.startRow + 1 } } : null;\n case \"sheet.mutation.remove-rows\":\n return p.range ? { axis: \"row\", op: { kind: \"remove\", start: p.range.startRow, count: p.range.endRow - p.range.startRow + 1 } } : null;\n case \"sheet.mutation.insert-col\":\n return p.range ? { axis: \"col\", op: { kind: \"insert\", at: p.range.startColumn, count: p.range.endColumn - p.range.startColumn + 1 } } : null;\n case \"sheet.mutation.remove-col\":\n return p.range ? { axis: \"col\", op: { kind: \"remove\", start: p.range.startColumn, count: p.range.endColumn - p.range.startColumn + 1 } } : null;\n case \"sheet.mutation.move-rows\":\n return p.sourceRange && p.targetRange\n ? { axis: \"row\", op: { kind: \"move\", from: p.sourceRange.startRow, count: p.sourceRange.endRow - p.sourceRange.startRow + 1, to: p.targetRange.startRow } }\n : null;\n case \"sheet.mutation.move-columns\":\n return p.sourceRange && p.targetRange\n ? {\n axis: \"col\",\n op: { kind: \"move\", from: p.sourceRange.startColumn, count: p.sourceRange.endColumn - p.sourceRange.startColumn + 1, to: p.targetRange.startColumn },\n }\n : null;\n default:\n return null;\n }\n}\n\n/**\n * Where an anchored cell is after one applied mutation on `sheet`: the same cell, a moved cell, or null when the\n * mutation removed it (its row, its column or its sheet).\n */\nexport function moveSheetAnchorCell(cell: SheetAnchorCell, sheet: string, id: string, params: Readonly<Record<string, unknown>>): SheetAnchorCell | null {\n if (String(params.subUnitId ?? \"\") !== sheet) return cell;\n if (id === REMOVE_SHEET) return null;\n const s = structuralAxisOp(id, params);\n if (!s) return cell;\n if (s.axis === \"row\") {\n const row = mapIndex(s.op, cell.row);\n return row === null ? null : row === cell.row ? cell : { row, col: cell.col };\n }\n const col = mapIndex(s.op, cell.col);\n return col === null ? null : col === cell.col ? cell : { row: cell.row, col };\n}\n\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}\n/** \"B5\" for row 4, column 1. */\nexport const sheetCellName = (cell: SheetAnchorCell) => `${colName(cell.col)}${cell.row + 1}`;\n\nfunction cellOf(m: SheetMutation): SheetAnchorCell | null {\n const c = m.params.cell as SheetAnchorCell | null | undefined;\n return c && typeof c.row === \"number\" && typeof c.col === \"number\" ? c : null;\n}\n\nconst ok = (op: SheetMutation[], lost: string[] = [], dropped: string[] = []): TransformResult => ({ op, lost, dropped });\nconst label = (m: SheetMutation) => {\n const c = cellOf(m);\n return `${String(m.params.subUnitId ?? \"\")}!${c ? sheetCellName(c) : \"?\"} comment`;\n};\n\n/** x over y when either is an anchor mutation; null when neither is (the sheet transformer carries on). */\nexport function transformCommentAnchor(x: SheetMutation, y: SheetMutation, side: Side): TransformResult | null {\n const xa = x.id === SET_SHEET_COMMENT_ANCHOR;\n const ya = y.id === SET_SHEET_COMMENT_ANCHOR;\n if (!xa && !ya) return null;\n if (!xa) return ok([x]); // an anchor never moves content\n if (ya) {\n // anchors are keyed by sheet and id: the same id on another sheet is another anchor\n if (x.params.anchorId !== y.params.anchorId || x.params.subUnitId !== y.params.subUnitId) return ok([x]);\n return side === \"left\" ? ok([x], [label(y)]) : ok([], [], [label(x)]);\n }\n const cell = cellOf(x);\n if (!cell) return ok([x]); // taking an anchor out commutes with every move\n const moved = moveSheetAnchorCell(cell, String(x.params.subUnitId ?? \"\"), y.id, y.params);\n if (!moved) return ok([], [], [label(x)]);\n return ok([moved === cell ? x : { id: x.id, params: { ...x.params, cell: moved } }]);\n}\n","/**\n * R — ranged resources (COLLAB-DESIGN §10, C5d): plugin records keyed by id whose ranges live on a sheet\n * (conditional formats, data validation, filters, and any lane's own range resource). One generic transform;\n * each resource registers a spec saying how to read and rebuild its mutations.\n *\n * Rules (x over y, same sheet):\n * - Structural y moves x's ranges (`rectsThrough`). A set whose ranges are all removed becomes a remove of that\n * record (the record existed everywhere); an add whose ranges are all removed is dropped (its author is told).\n * - Structural x over a resource y: a raw structural mutation never runs the plugin's ref-range handlers, so x\n * carries the fixup they would have made for y's record (a set with the moved ranges, or its remove).\n * - Same record: a remove wins over every set; two removes are one. Two sets of the same facet: a person's beats\n * a structural op's derived one, else the later commit wins; different facets commute.\n * - Records whose order is state (a conditional format's priority): two adds on one sheet are a barrier.\n * - A record that carries formula text cannot follow a structural op yet: barrier (formulas in rules are C5e).\n *\n * Capture marks a resource op that comes AFTER a structural op in the same group `derived` (the plugin's handler\n * wrote it), so it never beats a person's concurrent change to that record (§21.2's rule, for resources).\n */\nimport type { SheetMutation, SheetRange } from \"./types\";\n\ntype Obj = Record<string, unknown>;\n\nexport type ResourceRole = \"add\" | \"set\" | \"remove\";\n\nexport interface RangedResourceSpec {\n /** The registry family (also the name in barrier reasons). */\n family: string;\n /** Mutation id → role. */\n ids: Readonly<Record<string, ResourceRole>>;\n /** The records an op touches (a remove may name several). */\n keys(m: SheetMutation): string[];\n /** Which part of a record a set writes (sets of different facets commute). Default \"all\". */\n facet?(m: SheetMutation): string;\n /** The ranges an add or set names; null when it names none (its record keeps its ranges). */\n rects(m: SheetMutation): SheetRange[] | null;\n /** The op with its ranges replaced. */\n withRects(m: SheetMutation, rects: SheetRange[]): SheetMutation;\n /** A set that puts y's record at `rects` on a seat that applied y (the structural fixup). */\n setFor(m: SheetMutation, rects: SheetRange[]): SheetMutation;\n /** The remove of record `key`. */\n removeOf(sheet: string, key: string): SheetMutation;\n /** Remove `keys` from a remove op naming several; null when none is left. */\n withoutKeys?(m: SheetMutation, keys: string[]): SheetMutation | null;\n /** Formula text the op carries (it cannot follow a structural op yet). */\n hasFormula?(m: SheetMutation): boolean;\n /** Two adds on one sheet change the records' order (priority): barrier. */\n orderedAdds?: boolean;\n /** The op without facet `lost` (another op won it), or null when nothing is left. */\n narrow?(m: SheetMutation, lost: string): SheetMutation | null;\n /** A reason this op cannot follow a structural op of that axis and kind yet (barrier), or null. */\n barrierOver?(m: SheetMutation, axis: \"row\" | \"col\", kind: \"insert\" | \"remove\" | \"move\"): string | null;\n /** An op whose ranges were all removed is dropped instead of removing its record. */\n emptyDrops?(m: SheetMutation): boolean;\n}\n\nconst specs = new Map<string, RangedResourceSpec>();\nconst byId = new Map<string, RangedResourceSpec>();\n\n/** Register a ranged resource (a plugin's or a lane's own). Ids must also be in the sheet registry as covered. */\nexport function registerRangedResource(spec: RangedResourceSpec): void {\n specs.set(spec.family, spec);\n for (const id of Object.keys(spec.ids)) byId.set(id, spec);\n}\nexport const rangedSpecOf = (id: string): RangedResourceSpec | undefined => byId.get(id);\n\n// ── conditional formats ──\nconst cfRule = (m: SheetMutation) => (m.params.rule ?? {}) as Obj;\nconst CF_FORMULA = (r: Obj): boolean => {\n const rule = (r.rule ?? {}) as Obj;\n if (rule.type === \"highlightCell\" && rule.subType === \"formula\") return true;\n return JSON.stringify(rule).includes('\"type\":\"formula\"');\n};\nregisterRangedResource({\n family: \"cf\",\n ids: { \"sheet.mutation.add-conditional-rule\": \"add\", \"sheet.mutation.set-conditional-rule\": \"set\", \"sheet.mutation.delete-conditional-rule\": \"remove\" },\n keys: (m) => [String(m.id === \"sheet.mutation.add-conditional-rule\" ? cfRule(m).cfId : m.params.cfId)],\n rects: (m) => ((cfRule(m).ranges as SheetRange[] | undefined) ?? null),\n withRects: (m, rects) => ({ id: m.id, params: { ...m.params, rule: { ...cfRule(m), ranges: rects } } }),\n setFor: (m, rects) => ({\n id: \"sheet.mutation.set-conditional-rule\",\n params: { subUnitId: m.params.subUnitId, cfId: cfRule(m).cfId ?? m.params.cfId, rule: { ...cfRule(m), ranges: rects }, derived: true },\n }),\n removeOf: (sheet, key) => ({ id: \"sheet.mutation.delete-conditional-rule\", params: { subUnitId: sheet, cfId: key, derived: true } }),\n hasFormula: (m) => CF_FORMULA(cfRule(m)),\n orderedAdds: true,\n});\n\n// ── data validation ──\nconst DV = { add: \"data-validation.mutation.addRule\", update: \"data-validation.mutation.updateRule\", remove: \"data-validation.mutation.removeRule\" } as const;\nconst DV_RANGE = 1;\nconst DV_FACETS: Record<number, string> = { 0: \"setting\", 1: \"range\", 2: \"options\", 3: \"all\" };\nconst dvPayload = (m: SheetMutation) => (m.params.payload ?? {}) as { type?: number; payload?: unknown };\nconst dvFormula = (o: Obj | undefined): boolean => !!o && [o.formula1, o.formula2].some((f) => typeof f === \"string\" && f.trim().startsWith(\"=\"));\nregisterRangedResource({\n family: \"dv\",\n ids: { [DV.add]: \"add\", [DV.update]: \"set\", [DV.remove]: \"remove\" },\n keys: (m) => {\n if (m.id === DV.add) return [String(((m.params.rule ?? {}) as Obj).uid)];\n const id = m.params.ruleId;\n return Array.isArray(id) ? id.map(String) : [String(id)];\n },\n facet: (m) => (m.id === DV.update ? (DV_FACETS[Number(dvPayload(m).type)] ?? \"all\") : \"all\"),\n rects: (m) => {\n if (m.id === DV.add) return ((m.params.rule as Obj | undefined)?.ranges as SheetRange[] | undefined) ?? null;\n if (m.id === DV.update && dvPayload(m).type === DV_RANGE) return (dvPayload(m).payload as SheetRange[] | undefined) ?? null;\n if (m.id === DV.update && dvPayload(m).type === 3) return (((dvPayload(m).payload ?? {}) as Obj).ranges as SheetRange[] | undefined) ?? null;\n return null;\n },\n withRects: (m, rects) => {\n if (m.id === DV.add) return { id: m.id, params: { ...m.params, rule: { ...(m.params.rule as Obj), ranges: rects } } };\n const p = dvPayload(m);\n return { id: m.id, params: { ...m.params, payload: p.type === DV_RANGE ? { ...p, payload: rects } : { ...p, payload: { ...(p.payload as Obj), ranges: rects } } } };\n },\n setFor: (m, rects) => ({\n id: DV.update,\n params: { subUnitId: m.params.subUnitId, ruleId: m.id === DV.add ? ((m.params.rule ?? {}) as Obj).uid : m.params.ruleId, payload: { type: DV_RANGE, payload: rects }, derived: true },\n }),\n removeOf: (sheet, key) => ({ id: DV.remove, params: { subUnitId: sheet, ruleId: key, derived: true } }),\n withoutKeys: (m, keys) => {\n const left = (Array.isArray(m.params.ruleId) ? m.params.ruleId : [m.params.ruleId]).filter((k) => !keys.includes(String(k)));\n return left.length ? { id: m.id, params: { ...m.params, ruleId: Array.isArray(m.params.ruleId) ? left : left[0] } } : null;\n },\n hasFormula: (m) => {\n if (m.id === DV.add) return dvFormula(m.params.rule as Obj);\n const p = dvPayload(m);\n return p.type === 0 || p.type === 3 ? dvFormula(p.payload as Obj) : false;\n },\n orderedAdds: true,\n // an ALL update (the ref-range handler restates the whole rule) losing to a setting/options change keeps its ranges\n narrow: (m, lost) => {\n if (m.id !== DV.update || dvPayload(m).type !== 3 || lost === \"range\") return null;\n const ranges = ((dvPayload(m).payload ?? {}) as Obj).ranges;\n return Array.isArray(ranges) ? { id: m.id, params: { ...m.params, payload: { type: DV_RANGE, payload: ranges } } } : null;\n },\n});\n\n// ── filters (one per sheet; criteria by absolute column) ──\nconst FILTER = { range: \"sheet.mutation.set-filter-range\", criteria: \"sheet.mutation.set-filter-criteria\", remove: \"sheet.mutation.remove-filter\" } as const;\n/** A filter has one range: the hull of what survives a structural op (a row inserted inside it joins it). */\nconst hull = (rects: SheetRange[]): SheetRange => ({\n startRow: Math.min(...rects.map((r) => r.startRow)),\n endRow: Math.max(...rects.map((r) => r.endRow)),\n startColumn: Math.min(...rects.map((r) => r.startColumn)),\n endColumn: Math.max(...rects.map((r) => r.endColumn)),\n});\nconst filterWith = (m: SheetMutation, rects: SheetRange[]): SheetMutation =>\n m.id === FILTER.range ? { id: m.id, params: { ...m.params, range: hull(rects) } } : { id: m.id, params: { ...m.params, col: rects[0]!.startColumn } };\n/** A criteria column as a rectangle spanning every row: only its column moves. */\nconst colRect = (col: number): SheetRange => ({ startRow: 0, endRow: 1_000_000_000, startColumn: col, endColumn: col });\nregisterRangedResource({\n family: \"filter\",\n ids: { [FILTER.range]: \"set\", [FILTER.criteria]: \"set\", [FILTER.remove]: \"remove\" },\n keys: () => [\"filter\"],\n facet: (m) => (m.id === FILTER.criteria ? `col:${String(m.params.col)}` : \"range\"),\n rects: (m) => (m.id === FILTER.range ? [m.params.range as SheetRange] : m.id === FILTER.criteria ? [colRect(Number(m.params.col))] : null),\n withRects: (m, rects) => filterWith(m, rects),\n setFor: (m, rects) => {\n const f = filterWith(m, rects);\n return { id: f.id, params: { ...f.params, derived: true } };\n },\n removeOf: (sheet) => ({ id: FILTER.remove, params: { subUnitId: sheet, derived: true } }),\n /** a criteria column that was removed takes only its criteria with it, never the filter */\n emptyDrops: (m) => m.id === FILTER.criteria,\n // a column move can carry a criteria column out of the filter's range (the model refuses it): not yet\n // where a criteria column lands depends on how the filter's own range moved (Univer's rule at its edges): not yet\n barrierOver: (m, axis) => (m.id === FILTER.criteria && axis === \"col\" ? \"filter: a column's criteria against a column insert, remove or move\" : null),\n});\n\nexport const RANGED_FAMILIES = () => [...specs.keys()];\n"],"mappings":"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","names":["import_sheets","to","out","r","ops","res","barrier","ok","colName","FULL","ch","out","gone","k","spans","P","first","rest"]}