@ai-matrx/office 0.8.17 → 0.8.19

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.
@@ -41,6 +41,7 @@ __export(collab_exports, {
41
41
  SHEETS_EDIT_GROUP: () => SHEETS_EDIT_GROUP,
42
42
  WorkbookCollabSession: () => WorkbookCollabSession,
43
43
  applyDocsOp: () => applyDocsOp,
44
+ asLoadedDocsSnapshot: () => asLoadedDocsSnapshot,
44
45
  canonicalDocsSnapshot: () => canonicalDocsSnapshot,
45
46
  canonicalDocsString: () => canonicalDocsString,
46
47
  canonicalKeys: () => canonicalKeys,
@@ -949,6 +950,104 @@ function invertDocsOp(op, preDoc) {
949
950
  }
950
951
  var DOCS_TRANSFORM_VERSION = "univer-1.0.4+docs-ot-r6";
951
952
 
953
+ // src/univer/collab/docs-ot/state-hash.ts
954
+ var import_core4 = require("@univerjs/core");
955
+
956
+ // src/docs/sanitize-univer-doc-snapshot.ts
957
+ var import_core2 = require("@univerjs/core");
958
+
959
+ // src/core/document-page-style.ts
960
+ var TRADITIONAL = 1;
961
+ var PORTRAIT = 0;
962
+ var PX_PER_INCH = 96;
963
+ var DEFAULT_DOCUMENT_PAGE_STYLE = {
964
+ pageSize: { width: 816, height: 1056 },
965
+ documentFlavor: TRADITIONAL,
966
+ pageOrient: PORTRAIT,
967
+ marginTop: PX_PER_INCH,
968
+ marginBottom: PX_PER_INCH,
969
+ marginLeft: PX_PER_INCH,
970
+ marginRight: PX_PER_INCH,
971
+ // Univer applies no paragraph spacing to a paginated page by itself; without this every paragraph
972
+ // runs into the next (Google Docs' own default: 1.15 lines, 10px after).
973
+ defaultParagraphStyle: { spaceAbove: { v: 0 }, spaceBelow: { v: 10 }, lineSpacing: 1.15 }
974
+ };
975
+ function defaultDocumentPageStyle() {
976
+ return {
977
+ ...DEFAULT_DOCUMENT_PAGE_STYLE,
978
+ pageSize: { ...DEFAULT_DOCUMENT_PAGE_STYLE.pageSize },
979
+ defaultParagraphStyle: { ...DEFAULT_DOCUMENT_PAGE_STYLE.defaultParagraphStyle }
980
+ };
981
+ }
982
+ function isLegacySqueezedPageStyle(style) {
983
+ const size = style?.pageSize;
984
+ return !!size && size.width === 595 && size.height === 842 && style?.marginLeft === 90 && style?.marginRight === 90 && style?.marginTop === 72 && style?.marginBottom === 72;
985
+ }
986
+ var PAGE_COLORS = ["#ffffff", "#fff8e7", "#f3f3f3", "#e8f0fe", "#e6f4ea", "#fef7e0"];
987
+ var DEFAULT_PAGE_COLOR = PAGE_COLORS[0];
988
+
989
+ // src/docs/sanitize-univer-doc-snapshot.ts
990
+ var NAMED_STYLE_STRING_TO_NUMBER = Object.fromEntries(
991
+ Object.entries(import_core2.NamedStyleType).filter(([key, val]) => typeof val === "number" && isNaN(Number(key))).map(([key, val]) => [key, val])
992
+ );
993
+ function sanitizeUniverDocSnapshot(snapshot, docId, opts = {}) {
994
+ restorePageStyle(snapshot, docId, opts.quiet === true);
995
+ ensureTextRuns(snapshot);
996
+ const paragraphs = snapshot?.body?.paragraphs;
997
+ if (!Array.isArray(paragraphs)) return snapshot;
998
+ let fixed = 0;
999
+ for (const paragraph of paragraphs) {
1000
+ const style = paragraph?.paragraphStyle;
1001
+ const value = style?.namedStyleType;
1002
+ if (typeof value === "string") {
1003
+ const numeric = NAMED_STYLE_STRING_TO_NUMBER[value];
1004
+ if (numeric !== void 0) {
1005
+ style.namedStyleType = numeric;
1006
+ fixed += 1;
1007
+ } else {
1008
+ delete style.namedStyleType;
1009
+ fixed += 1;
1010
+ }
1011
+ }
1012
+ }
1013
+ if (fixed > 0 && opts.quiet !== true) {
1014
+ console.warn(
1015
+ `[data-tables] RECOVERY: sanitized ${fixed} string namedStyleType value(s) to numeric NamedStyleType in document snapshot${docId ? ` ${docId}` : ""}. The snapshot was written with the wrong enum encoding (string instead of number) and would have crashed Univer's <ParagraphMenu>. Fix the snapshot writer to emit numeric NamedStyleType values.`
1016
+ );
1017
+ }
1018
+ return snapshot;
1019
+ }
1020
+ function restorePageStyle(snapshot, docId, quiet = false) {
1021
+ if (!snapshot || typeof snapshot !== "object") return;
1022
+ const style = snapshot.documentStyle;
1023
+ if (style?.pageSize?.width && isLegacySqueezedPageStyle(style)) {
1024
+ const page = defaultDocumentPageStyle();
1025
+ snapshot.documentStyle = { ...style, ...page, defaultParagraphStyle: style.defaultParagraphStyle ?? page.defaultParagraphStyle };
1026
+ return;
1027
+ }
1028
+ if (style?.pageSize?.width) {
1029
+ if (!style.documentFlavor) {
1030
+ const page = defaultDocumentPageStyle();
1031
+ Object.assign(style, { documentFlavor: page.documentFlavor });
1032
+ if (page.defaultParagraphStyle) style.defaultParagraphStyle ??= page.defaultParagraphStyle;
1033
+ }
1034
+ return;
1035
+ }
1036
+ snapshot.documentStyle = {
1037
+ ...defaultDocumentPageStyle(),
1038
+ ...snapshot.documentStyle ?? {},
1039
+ pageSize: defaultDocumentPageStyle().pageSize
1040
+ };
1041
+ if (quiet) return;
1042
+ console.warn(
1043
+ `[data-tables] RECOVERY: document snapshot${docId ? ` ${docId}` : ""} had no documentStyle.pageSize \u2014 restored the default Letter page geometry. Without a page box Univer lays the body out unbounded: text does not wrap and the viewport has no scrollable extent, so the document appears frozen. Fix the snapshot writer (agent/markdown converters must stamp DEFAULT_DOCUMENT_PAGE_STYLE).`
1044
+ );
1045
+ }
1046
+ function ensureTextRuns(snapshot) {
1047
+ const body = snapshot?.body;
1048
+ if (body && typeof body === "object" && !Array.isArray(body.textRuns)) body.textRuns = [];
1049
+ }
1050
+
952
1051
  // src/univer/collab/docs-ot/state-hash.ts
953
1052
  var DOC_LOCAL_KEYS = ["rev", "__matrxCollabCovered", "__collab", "disabled", "layoutState", "textRanges", "selections"];
954
1053
  function sortDeep(v) {
@@ -1008,6 +1107,7 @@ function canonicalBody(body) {
1008
1107
  const b = { ...body };
1009
1108
  b.textRuns = canonicalRuns(b.textRuns);
1010
1109
  if (Array.isArray(b.paragraphs)) b.paragraphs = b.paragraphs.map(({ paragraphId: _p, ...p }) => p);
1110
+ if (Array.isArray(b.sectionBreaks)) b.sectionBreaks = b.sectionBreaks.map(({ sectionId: _s, ...x }) => x);
1011
1111
  b.customRanges = foldPieces(b.customRanges, (r) => JSON.stringify([rootId(r.rangeId), r.rangeType, sortDeep(r.properties ?? {})])).map((r) => ({
1012
1112
  ...r,
1013
1113
  rangeId: rootId(r.rangeId)
@@ -1022,9 +1122,44 @@ function canonicalBody(body) {
1022
1122
  }
1023
1123
  return b;
1024
1124
  }
1125
+ function asLoadedDocsSnapshot(snapshot) {
1126
+ const s = stampDeterministicIds(structuredClone(snapshot ?? {}));
1127
+ delete s.id;
1128
+ for (const k of DOC_LOCAL_KEYS) delete s[k];
1129
+ sanitizeUniverDocSnapshot(s, void 0, { quiet: true });
1130
+ const model = new import_core4.DocumentDataModel(s);
1131
+ try {
1132
+ return structuredClone(model.getSnapshot());
1133
+ } finally {
1134
+ model.dispose();
1135
+ }
1136
+ }
1137
+ var isEmptyDeep = (v) => v == null || v === "" || (Array.isArray(v) ? v.every(isEmptyDeep) : typeof v === "object" ? Object.values(v).every(isEmptyDeep) : false);
1138
+ function canonicalResources(resources) {
1139
+ if (!Array.isArray(resources)) return [];
1140
+ const out = [];
1141
+ for (const r of resources) {
1142
+ if (!r || typeof r.name !== "string") continue;
1143
+ let data = r.data;
1144
+ if (typeof data === "string" && data !== "") {
1145
+ try {
1146
+ data = JSON.parse(data);
1147
+ } catch {
1148
+ }
1149
+ }
1150
+ if (isEmptyDeep(data)) continue;
1151
+ out.push({ name: r.name, data: sortDeep(data) });
1152
+ }
1153
+ return out.sort((a, b) => a.name.localeCompare(b.name));
1154
+ }
1025
1155
  function canonicalDocsSnapshot(snapshot) {
1026
- const s = structuredClone(snapshot ?? {});
1156
+ const s = asLoadedDocsSnapshot(snapshot);
1027
1157
  delete s.id;
1158
+ s.resources = canonicalResources(s.resources);
1159
+ if (s.settings && typeof s.settings === "object") {
1160
+ s.settings = { ...s.settings };
1161
+ delete s.settings.zoomRatio;
1162
+ }
1028
1163
  for (const k of DOC_LOCAL_KEYS) delete s[k];
1029
1164
  s.body = canonicalBody(s.body);
1030
1165
  for (const seg of ["headers", "footers", "notes"]) {
@@ -1232,7 +1367,10 @@ function openDocsOtRoom(o) {
1232
1367
  queue = next.filter((q) => !isNoopDocsOp(q));
1233
1368
  if (isNoopDocsOp(op)) return;
1234
1369
  }
1235
- if (!session.local(op, { ...inverse !== void 0 ? { inverse } : {}, label: m.cmd ?? RICH_TEXT_EDITING })) notice({ kind: "not_live" });
1370
+ if (!session.local(op, { ...inverse !== void 0 ? { inverse } : {}, label: m.cmd ?? RICH_TEXT_EDITING })) {
1371
+ notice({ kind: "not_live" });
1372
+ session.rebuild("not_live");
1373
+ }
1236
1374
  };
1237
1375
  const unsubLocal = port.onLocal(onLocal);
1238
1376
  const target = o.compositionTarget === void 0 ? typeof document !== "undefined" ? document : null : o.compositionTarget;
@@ -1294,7 +1432,7 @@ var import_awareness2 = require("y-protocols/awareness");
1294
1432
  var import_collab3 = require("@ai-matrx/data/realtime/collab");
1295
1433
 
1296
1434
  // src/docs/remote-carets.ts
1297
- var import_core2 = require("@univerjs/core");
1435
+ var import_core5 = require("@univerjs/core");
1298
1436
  var CARET_HEARTBEAT_MS = 2e3;
1299
1437
  var CARET_STALE_MS = 12e3;
1300
1438
  var CARET_MAX_RANGES = 4;
@@ -1312,8 +1450,8 @@ function movePeerRangesThroughBodyEdit(ranges, actions) {
1312
1450
  const e = sub.e;
1313
1451
  return ranges.map((r) => {
1314
1452
  const collapsed = r.start === r.end;
1315
- const start = import_core2.TextX.transformPosition(e, r.start, false);
1316
- return { start, end: collapsed ? start : import_core2.TextX.transformPosition(e, r.end, true) };
1453
+ const start = import_core5.TextX.transformPosition(e, r.start, false);
1454
+ return { start, end: collapsed ? start : import_core5.TextX.transformPosition(e, r.end, true) };
1317
1455
  });
1318
1456
  }
1319
1457
  var sameRanges = (a, b) => a.length === b.length && a.every((r, i) => r.start === b[i].start && r.end === b[i].end);
@@ -1451,15 +1589,6 @@ async function documentUsesOrderedRoom(documentId, knob, isNewDocument) {
1451
1589
  if (knob === "new") return isNewDocument();
1452
1590
  return false;
1453
1591
  }
1454
- function pickColor2(uid) {
1455
- const palette = ["#ef4444", "#f59e0b", "#10b981", "#3b82f6", "#8b5cf6", "#ec4899", "#14b8a6", "#f97316"];
1456
- let h = 2166136261;
1457
- for (let i = 0; i < uid.length; i++) {
1458
- h ^= uid.charCodeAt(i);
1459
- h = Math.imul(h, 16777619);
1460
- }
1461
- return palette[Math.abs(h) % palette.length] ?? "#ec4899";
1462
- }
1463
1592
  function documentOtFactory(o) {
1464
1593
  return async (basePort, onAwareness) => {
1465
1594
  const latest = await getLatestDocumentSnapshot(o.documentId);
@@ -1473,7 +1602,8 @@ function documentOtFactory(o) {
1473
1602
  }
1474
1603
  const doc = new Y2.Doc();
1475
1604
  const awareness = new import_awareness2.Awareness(doc);
1476
- awareness.setLocalState({ uid: o.uid, clientId: o.clientId, name: o.displayName ?? o.uid.slice(0, 8), color: pickColor2(o.uid), ts: Date.now() });
1605
+ awareness.setLocalState({ uid: o.uid, clientId: o.clientId, name: o.displayName ?? o.uid.slice(0, 8), ts: Date.now() });
1606
+ const stopColor = (0, import_collab3.claimCollaboratorColor)(awareness, { uid: o.uid, clientId: o.clientId });
1477
1607
  const carets = new RemoteCaretBook(awareness.clientID);
1478
1608
  const emit = () => onAwareness({ states: new Map(awareness.getStates()), selfUid: o.uid, carets: carets.list() });
1479
1609
  const publishAwareness = () => {
@@ -1559,6 +1689,7 @@ function documentOtFactory(o) {
1559
1689
  replace: (snapshot) => room.replace(snapshot),
1560
1690
  stop: () => {
1561
1691
  clearInterval(caretTimer);
1692
+ stopColor();
1562
1693
  room.stop();
1563
1694
  awareness.off("change", publishAwareness);
1564
1695
  provider.disconnect();
@@ -1880,7 +2011,7 @@ function transformAxis(x, y, side) {
1880
2011
  }
1881
2012
 
1882
2013
  // src/collab/sheets/transform/formula.ts
1883
- var import_core3 = require("@univerjs/core");
2014
+ var import_core6 = require("@univerjs/core");
1884
2015
  var import_engine_formula = require("@univerjs/engine-formula");
1885
2016
  var import_sheets = require("@univerjs/sheets");
1886
2017
  var REF_ERROR = "#REF!";
@@ -1932,8 +2063,8 @@ function referencedSheetNames(text) {
1932
2063
  }
1933
2064
  return [...out];
1934
2065
  }
1935
- var fullRowsRange = (start, count) => ({ startRow: start, endRow: start + count - 1, startColumn: 0, endColumn: FULL, rangeType: import_core3.RANGE_TYPE.ROW });
1936
- var fullColsRange = (start, count) => ({ startRow: 0, endRow: FULL, startColumn: start, endColumn: start + count - 1, rangeType: import_core3.RANGE_TYPE.COLUMN });
2066
+ var fullRowsRange = (start, count) => ({ startRow: start, endRow: start + count - 1, startColumn: 0, endColumn: FULL, rangeType: import_core6.RANGE_TYPE.ROW });
2067
+ var fullColsRange = (start, count) => ({ startRow: 0, endRow: FULL, startColumn: start, endColumn: start + count - 1, rangeType: import_core6.RANGE_TYPE.COLUMN });
1937
2068
  var startV = (v) => Number.isNaN(v) || v == null ? -Infinity : v;
1938
2069
  var endV = (v) => Number.isNaN(v) || v == null ? Infinity : v;
1939
2070
  function startEnd(r) {
@@ -1942,9 +2073,9 @@ function startEnd(r) {
1942
2073
  function checkMoveEdge(origin, from) {
1943
2074
  const startRow = startV(origin.startRow), endRow = endV(origin.endRow), startColumn = startV(origin.startColumn), endColumn = endV(origin.endColumn);
1944
2075
  const fromStartRow = startV(from.startRow), fromEndRow = endV(from.endRow), fromStartColumn = startV(from.startColumn), fromEndColumn = endV(from.endColumn);
1945
- const rowsCover = () => origin.rangeType === import_core3.RANGE_TYPE.COLUMN && from.rangeType === import_core3.RANGE_TYPE.COLUMN || startRow >= fromStartRow && endRow <= fromEndRow;
1946
- const columnsCover = () => origin.rangeType === import_core3.RANGE_TYPE.ROW && from.rangeType === import_core3.RANGE_TYPE.ROW || startColumn >= fromStartColumn && endColumn <= fromEndColumn;
1947
- const allCover = () => origin.rangeType === import_core3.RANGE_TYPE.ALL && from.rangeType === import_core3.RANGE_TYPE.ALL;
2076
+ const rowsCover = () => origin.rangeType === import_core6.RANGE_TYPE.COLUMN && from.rangeType === import_core6.RANGE_TYPE.COLUMN || startRow >= fromStartRow && endRow <= fromEndRow;
2077
+ const columnsCover = () => origin.rangeType === import_core6.RANGE_TYPE.ROW && from.rangeType === import_core6.RANGE_TYPE.ROW || startColumn >= fromStartColumn && endColumn <= fromEndColumn;
2078
+ const allCover = () => origin.rangeType === import_core6.RANGE_TYPE.ALL && from.rangeType === import_core6.RANGE_TYPE.ALL;
1948
2079
  if (rowsCover() && columnsCover() || allCover()) return 4;
1949
2080
  if (columnsCover() && startRow >= fromStartRow && startRow <= fromEndRow && endRow > fromEndRow) return 0;
1950
2081
  if (columnsCover() && endRow >= fromStartRow && endRow <= fromEndRow && startRow < fromStartRow) return 1;
@@ -1955,14 +2086,14 @@ function checkMoveEdge(origin, from) {
1955
2086
  function getMoveNewRange(moveEdge, result, from, to, origin, remain) {
1956
2087
  const { startRow, endRow, startColumn, endColumn, rangeType } = startEnd(result);
1957
2088
  const f = startEnd(from);
1958
- const fromRangeType = from.rangeType ?? import_core3.RANGE_TYPE.NORMAL;
2089
+ const fromRangeType = from.rangeType ?? import_core6.RANGE_TYPE.NORMAL;
1959
2090
  const t = startEnd(to);
1960
2091
  const rm = startEnd(remain);
1961
2092
  const o = startEnd(origin);
1962
- const originRangeType = origin.rangeType ?? import_core3.RANGE_TYPE.NORMAL;
2093
+ const originRangeType = origin.rangeType ?? import_core6.RANGE_TYPE.NORMAL;
1963
2094
  const newRange = { ...origin };
1964
- const rowsCover = () => rangeType === import_core3.RANGE_TYPE.COLUMN && originRangeType === import_core3.RANGE_TYPE.COLUMN || startColumn >= o.startColumn && endColumn <= o.endColumn;
1965
- const columnsCover = () => rangeType === import_core3.RANGE_TYPE.ROW && originRangeType === import_core3.RANGE_TYPE.ROW || startRow >= o.startRow && endRow <= o.endRow;
2095
+ const rowsCover = () => rangeType === import_core6.RANGE_TYPE.COLUMN && originRangeType === import_core6.RANGE_TYPE.COLUMN || startColumn >= o.startColumn && endColumn <= o.endColumn;
2096
+ const columnsCover = () => rangeType === import_core6.RANGE_TYPE.ROW && originRangeType === import_core6.RANGE_TYPE.ROW || startRow >= o.startRow && endRow <= o.endRow;
1966
2097
  if (moveEdge === 0) {
1967
2098
  if (!rowsCover()) return void 0;
1968
2099
  if (startRow < o.startRow) newRange.startRow = startRow;
@@ -1985,7 +2116,7 @@ function getMoveNewRange(moveEdge, result, from, to, origin, remain) {
1985
2116
  else return void 0;
1986
2117
  } else if (moveEdge === 4) {
1987
2118
  Object.assign(newRange, { startRow, startColumn, endRow, endColumn });
1988
- } else if (f.startColumn <= o.startColumn && f.endColumn >= o.endColumn || fromRangeType === import_core3.RANGE_TYPE.ROW && originRangeType === import_core3.RANGE_TYPE.ROW) {
2119
+ } else if (f.startColumn <= o.startColumn && f.endColumn >= o.endColumn || fromRangeType === import_core6.RANGE_TYPE.ROW && originRangeType === import_core6.RANGE_TYPE.ROW) {
1989
2120
  const n = f.endRow - f.startRow + 1;
1990
2121
  if (from.endRow < o.startRow) {
1991
2122
  if (t.startRow >= o.startRow) newRange.startRow -= n;
@@ -1997,7 +2128,7 @@ function getMoveNewRange(moveEdge, result, from, to, origin, remain) {
1997
2128
  if (t.startRow <= o.startRow) newRange.startRow += n;
1998
2129
  else if (t.startRow >= o.endRow) newRange.endRow -= n;
1999
2130
  }
2000
- } else if (f.startRow <= o.startRow && f.endRow >= o.endRow || fromRangeType === import_core3.RANGE_TYPE.COLUMN && originRangeType === import_core3.RANGE_TYPE.COLUMN) {
2131
+ } else if (f.startRow <= o.startRow && f.endRow >= o.endRow || fromRangeType === import_core6.RANGE_TYPE.COLUMN && originRangeType === import_core6.RANGE_TYPE.COLUMN) {
2001
2132
  const n = f.endColumn - f.startColumn + 1;
2002
2133
  if (from.endColumn < o.startColumn) {
2003
2134
  if (t.startColumn >= o.startColumn) newRange.startColumn -= n;
@@ -2019,7 +2150,7 @@ function moveRange(range, axis, op) {
2019
2150
  const isRow = axis === "row";
2020
2151
  if (op.kind === "insert") {
2021
2152
  const r = isRow ? fullRowsRange(op.at, op.count) : fullColsRange(op.at, op.count);
2022
- const ops2 = isRow ? (0, import_sheets.handleInsertRow)({ id: import_sheets.EffectRefRangId.InsertRowCommandId, params: { range: r, unitId: "", subUnitId: "", direction: import_core3.Direction.DOWN } }, range) : (0, import_sheets.handleInsertCol)({ id: import_sheets.EffectRefRangId.InsertColCommandId, params: { range: r, unitId: "", subUnitId: "", direction: import_core3.Direction.RIGHT } }, range);
2153
+ const ops2 = isRow ? (0, import_sheets.handleInsertRow)({ id: import_sheets.EffectRefRangId.InsertRowCommandId, params: { range: r, unitId: "", subUnitId: "", direction: import_core6.Direction.DOWN } }, range) : (0, import_sheets.handleInsertCol)({ id: import_sheets.EffectRefRangId.InsertColCommandId, params: { range: r, unitId: "", subUnitId: "", direction: import_core6.Direction.RIGHT } }, range);
2023
2154
  const res2 = (0, import_sheets.runRefRangeMutations)(ops2, range);
2024
2155
  return res2 == null ? void 0 : { ...range, ...res2 };
2025
2156
  }
@@ -2032,11 +2163,11 @@ function moveRange(range, axis, op) {
2032
2163
  const from = isRow ? fullRowsRange(op.from, op.count) : fullColsRange(op.from, op.count);
2033
2164
  const to = isRow ? fullRowsRange(op.to, op.count) : fullColsRange(op.to, op.count);
2034
2165
  const moveEdge = checkMoveEdge(range, from);
2035
- let remain = (0, import_core3.getIntersectRange)(range, from);
2166
+ let remain = (0, import_core6.getIntersectRange)(range, from);
2036
2167
  if (isRow) {
2037
2168
  if (remain == null && (from.endRow < range.startRow && to.endRow <= range.startRow || from.startRow > range.endRow && to.startRow > range.endRow)) return void 0;
2038
2169
  } else if (remain == null && (from.endColumn < range.startColumn && to.endColumn <= range.startColumn || from.startColumn > range.endColumn && to.startColumn > range.endColumn)) return void 0;
2039
- remain ??= { startRow: range.startRow, endRow: range.endRow, startColumn: range.startColumn, endColumn: range.endColumn, rangeType: import_core3.RANGE_TYPE.NORMAL };
2170
+ remain ??= { startRow: range.startRow, endRow: range.endRow, startColumn: range.startColumn, endColumn: range.endColumn, rangeType: import_core6.RANGE_TYPE.NORMAL };
2040
2171
  const ops = isRow ? (0, import_sheets.handleMoveRows)({ id: import_sheets.EffectRefRangId.MoveRowsCommandId, params: { toRange: to, fromRange: from } }, remain) : (0, import_sheets.handleMoveCols)({ id: import_sheets.EffectRefRangId.MoveColsCommandId, params: { toRange: to, fromRange: from } }, remain);
2041
2172
  const res = (0, import_sheets.runRefRangeMutations)(ops, remain);
2042
2173
  if (res == null) return REF_ERROR;
@@ -2067,7 +2198,7 @@ function rewriteFormula(text, ctx, change) {
2067
2198
  if (!sheetName) continue;
2068
2199
  token = (0, import_engine_formula.serializeRangeToRefString)({ range, sheetName: change.name, unitId });
2069
2200
  } else {
2070
- const moved = moveRange(import_core3.Rectangle.moveOffset(range, 0, 0), change.axis, change.op);
2201
+ const moved = moveRange(import_core6.Rectangle.moveOffset(range, 0, 0), change.axis, change.op);
2071
2202
  if (moved === void 0) continue;
2072
2203
  token = moved === REF_ERROR ? REF_ERROR : (0, import_engine_formula.serializeRangeToRefString)({ range: moved, sheetName: target === ctx.ownSheet && !ctx.keepQualifier ? "" : sheetName, unitId });
2073
2204
  }
@@ -3338,7 +3469,7 @@ function univerSheetsOtPort(o) {
3338
3469
  const a = forApply(m);
3339
3470
  applying = true;
3340
3471
  try {
3341
- const ok2 = cs.syncExecuteCommand(a.id, { ...json(a.params), unitId: u }, { onlyLocal: true, fromCollab: true });
3472
+ const ok2 = cs.syncExecuteCommand(a.id, { ...json(a.params), unitId: u }, { fromCollab: true });
3342
3473
  if (ok2 === false) throw new Error(`"${m.id}" was refused by the editor`);
3343
3474
  } finally {
3344
3475
  applying = false;
@@ -3512,7 +3643,7 @@ async function workbookUsesOrderedRoom(workbookId, knob, isNewWorkbook) {
3512
3643
  if (knob === "new") return isNewWorkbook();
3513
3644
  return false;
3514
3645
  }
3515
- function pickColor3(uid) {
3646
+ function pickColor2(uid) {
3516
3647
  const palette = ["#ef4444", "#f59e0b", "#10b981", "#3b82f6", "#8b5cf6", "#ec4899", "#14b8a6", "#f97316"];
3517
3648
  let h = 2166136261;
3518
3649
  for (let i = 0; i < uid.length; i++) {
@@ -3537,7 +3668,7 @@ async function startWorkbookOtRoom(port, o) {
3537
3668
  uid: o.uid,
3538
3669
  clientId: o.clientId,
3539
3670
  name: o.displayName ?? o.uid.slice(0, 8),
3540
- color: pickColor3(o.uid),
3671
+ color: pickColor2(o.uid),
3541
3672
  sheetId: null,
3542
3673
  row: null,
3543
3674
  col: null,