@superdoc-dev/cli 0.2.0-next.7 → 0.2.0-next.9

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.
Files changed (2) hide show
  1. package/dist/index.js +783 -260
  2. package/package.json +8 -8
package/dist/index.js CHANGED
@@ -5,25 +5,43 @@ var __getProtoOf = Object.getPrototypeOf;
5
5
  var __defProp = Object.defineProperty;
6
6
  var __getOwnPropNames = Object.getOwnPropertyNames;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ function __accessProp(key) {
9
+ return this[key];
10
+ }
11
+ var __toESMCache_node;
12
+ var __toESMCache_esm;
8
13
  var __toESM = (mod, isNodeMode, target) => {
14
+ var canCache = mod != null && typeof mod === "object";
15
+ if (canCache) {
16
+ var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap;
17
+ var cached = cache.get(mod);
18
+ if (cached)
19
+ return cached;
20
+ }
9
21
  target = mod != null ? __create(__getProtoOf(mod)) : {};
10
22
  const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
11
23
  for (let key of __getOwnPropNames(mod))
12
24
  if (!__hasOwnProp.call(to, key))
13
25
  __defProp(to, key, {
14
- get: () => mod[key],
26
+ get: __accessProp.bind(mod, key),
15
27
  enumerable: true
16
28
  });
29
+ if (canCache)
30
+ cache.set(mod, to);
17
31
  return to;
18
32
  };
19
33
  var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
34
+ var __returnValue = (v) => v;
35
+ function __exportSetter(name, newValue) {
36
+ this[name] = __returnValue.bind(null, newValue);
37
+ }
20
38
  var __export = (target, all) => {
21
39
  for (var name in all)
22
40
  __defProp(target, name, {
23
41
  get: all[name],
24
42
  enumerable: true,
25
43
  configurable: true,
26
- set: (newValue) => all[name] = () => newValue
44
+ set: __exportSetter.bind(all, name)
27
45
  });
28
46
  };
29
47
  var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
@@ -548,6 +566,9 @@ var init_operation_definitions = __esm(() => {
548
566
  "TARGET_MOVED",
549
567
  "PLAN_CONFLICT_OVERLAP",
550
568
  "INVALID_STEP_COMBINATION",
569
+ "REVISION_CHANGED_SINCE_COMPILE",
570
+ "INVALID_INSERTION_CONTEXT",
571
+ "DOCUMENT_IDENTITY_CONFLICT",
551
572
  "CAPABILITY_UNAVAILABLE"
552
573
  ];
553
574
  T_QUERY_MATCH = ["MATCH_NOT_FOUND", "AMBIGUOUS_MATCH", "INVALID_INPUT", "INTERNAL_ERROR"];
@@ -18365,7 +18386,7 @@ var init_constants_DBKi0Amm_es = __esm(() => {
18365
18386
  ]);
18366
18387
  });
18367
18388
 
18368
- // ../../packages/superdoc/dist/chunks/SuperConverter-BxBclpFg.es.js
18389
+ // ../../packages/superdoc/dist/chunks/SuperConverter-DFpPWkcl.es.js
18369
18390
  function getExtensionConfigField(extension, field, context = { name: "" }) {
18370
18391
  const fieldValue = extension.config[field];
18371
18392
  if (typeof fieldValue === "function")
@@ -19305,7 +19326,8 @@ function decodeProperties(params, translatorsBySdName, properties) {
19305
19326
  node: { attrs: { [key]: properties[key] } }
19306
19327
  });
19307
19328
  if (result != null) {
19308
- result.name = translator$202.xmlName;
19329
+ if (result.name == null)
19330
+ result.name = translator$202.xmlName;
19309
19331
  elements.push(result);
19310
19332
  }
19311
19333
  }
@@ -42116,7 +42138,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
42116
42138
  state.kern = kernNode.attributes["w:val"];
42117
42139
  }
42118
42140
  }, SuperConverter;
42119
- var init_SuperConverter_BxBclpFg_es = __esm(() => {
42141
+ var init_SuperConverter_DFpPWkcl_es = __esm(() => {
42120
42142
  init_rolldown_runtime_B2q5OVn9_es();
42121
42143
  init_jszip_ChlR43oI_es();
42122
42144
  init_xml_js_DLE8mr0n_es();
@@ -87504,9 +87526,9 @@ var init_remark_gfm_RDxetNVS_es = __esm(() => {
87504
87526
  emptyOptions4 = {};
87505
87527
  });
87506
87528
 
87507
- // ../../packages/superdoc/dist/chunks/src-B6O9kkNF.es.js
87508
- var exports_src_B6O9kkNF_es = {};
87509
- __export(exports_src_B6O9kkNF_es, {
87529
+ // ../../packages/superdoc/dist/chunks/src-Cl9CKlDG.es.js
87530
+ var exports_src_Cl9CKlDG_es = {};
87531
+ __export(exports_src_Cl9CKlDG_es, {
87510
87532
  zt: () => defineMark,
87511
87533
  z: () => cM,
87512
87534
  yt: () => removeAwarenessStates,
@@ -95639,9 +95661,11 @@ function checkRevision(editor, expectedRevision) {
95639
95661
  return;
95640
95662
  const current = getRevision(editor);
95641
95663
  if (expectedRevision !== current)
95642
- throw new PlanError("REVISION_MISMATCH", `REVISION_MISMATCH — expected revision "${expectedRevision}" but document is at "${current}"`, undefined, {
95664
+ throw new PlanError("REVISION_MISMATCH", `REVISION_MISMATCH — expected revision "${expectedRevision}" but document is at "${current}". Re-run query.match to obtain a fresh ref.`, undefined, {
95643
95665
  expectedRevision,
95644
- currentRevision: current
95666
+ currentRevision: current,
95667
+ refStability: "ephemeral",
95668
+ remediation: "Re-run query.match() to obtain a fresh ref valid for the current revision."
95645
95669
  });
95646
95670
  }
95647
95671
  function resolveSegmentPosition(targetOffset, segmentStart, segmentLength, docFrom, docTo) {
@@ -95897,7 +95921,9 @@ function captureRunsInRange(editor, blockPos, from$12, to) {
95897
95921
  return;
95898
95922
  }
95899
95923
  if (node3.isLeaf) {
95924
+ const start$1 = offset$1;
95900
95925
  offset$1 += 1;
95926
+ maybePushRun(start$1, offset$1, []);
95901
95927
  return;
95902
95928
  }
95903
95929
  let isFirstChild = true;
@@ -96335,12 +96361,69 @@ function executeBlockSelector(index2, query2, diagnostics) {
96335
96361
  function isAssertStep(step) {
96336
96362
  return step.op === "assert";
96337
96363
  }
96364
+ function isCreateOp(op) {
96365
+ return op === "create.heading" || op === "create.paragraph";
96366
+ }
96338
96367
  function isSelectWhere(where) {
96339
96368
  return where.by === "select";
96340
96369
  }
96341
96370
  function isRefWhere(where) {
96342
96371
  return where.by === "ref";
96343
96372
  }
96373
+ function validateCreateStepPosition(step) {
96374
+ const args$1 = step.args;
96375
+ if (args$1.position === undefined || args$1.position === null) {
96376
+ args$1.position = "after";
96377
+ return;
96378
+ }
96379
+ if (!VALID_CREATE_POSITIONS.includes(args$1.position))
96380
+ throw planError("INVALID_INPUT", `create step requires args.position to be 'before' or 'after'`, step.id, {
96381
+ receivedPosition: args$1.position,
96382
+ allowedValues: [...VALID_CREATE_POSITIONS],
96383
+ default: "after"
96384
+ });
96385
+ }
96386
+ function resolveCreateAnchorFromTargets(targets, position4, stepId) {
96387
+ const target = targets[0];
96388
+ if (!target)
96389
+ throw planError("INVALID_INPUT", "create step has no resolved targets", stepId);
96390
+ if (target.kind === "range")
96391
+ return target.blockId;
96392
+ const segments = target.segments;
96393
+ if (!segments.length)
96394
+ throw planError("INVALID_INPUT", "span target has no segments", stepId);
96395
+ return position4 === "before" ? segments[0].blockId : segments[segments.length - 1].blockId;
96396
+ }
96397
+ function validateInsertionContext(editor, index2, step, stepIndex, anchorBlockId, position4) {
96398
+ const candidate = index2.candidates.find((c$3) => c$3.nodeId === anchorBlockId);
96399
+ if (!candidate)
96400
+ return;
96401
+ const paragraphType = editor.state.schema?.nodes?.paragraph;
96402
+ if (!paragraphType)
96403
+ return;
96404
+ const resolvedPos = editor.state.doc.resolve(candidate.pos);
96405
+ const parent = resolvedPos.parent;
96406
+ const anchorIndex = resolvedPos.index();
96407
+ const insertionIndex = position4 === "before" ? anchorIndex : anchorIndex + 1;
96408
+ if (!(typeof parent.canReplaceWith === "function" ? parent.canReplaceWith(insertionIndex, insertionIndex, paragraphType) : parent.type.contentMatch.matchType(paragraphType))) {
96409
+ const allowedChildTypes = [];
96410
+ const match$1 = parent.type.contentMatch;
96411
+ for (const nodeType of Object.values(editor.state.schema.nodes))
96412
+ if (match$1.matchType(nodeType))
96413
+ allowedChildTypes.push(nodeType.name);
96414
+ throw planError("INVALID_INSERTION_CONTEXT", `Cannot create ${step.op} inside ${parent.type.name}`, step.id, {
96415
+ stepIndex,
96416
+ stepId: step.id,
96417
+ operation: step.op,
96418
+ anchorBlockId,
96419
+ parentType: parent.type.name,
96420
+ allowedChildTypes,
96421
+ insertionIndex,
96422
+ requestedChildType: "paragraph",
96423
+ requestedSemanticType: step.op === "create.heading" ? "heading" : "paragraph"
96424
+ });
96425
+ }
96426
+ }
96344
96427
  function isV3Ref(payload) {
96345
96428
  return typeof payload === "object" && payload !== null && "v" in payload && payload.v === 3;
96346
96429
  }
@@ -96575,9 +96658,13 @@ function decodeTextRefPayload(encoded, stepId) {
96575
96658
  function resolveV3TextRef(editor, index2, step, refData) {
96576
96659
  const currentRevision = getRevision(editor);
96577
96660
  if (refData.rev !== currentRevision)
96578
- throw planError("REVISION_MISMATCH", `text ref was created at revision "${refData.rev}" but document is at "${currentRevision}"`, step.id, {
96661
+ throw planError("REVISION_MISMATCH", `Text ref is ephemeral and revision-scoped. Re-run query.match to obtain a fresh handle.ref for revision ${currentRevision}.`, step.id, {
96579
96662
  refRevision: refData.rev,
96580
- currentRevision
96663
+ currentRevision,
96664
+ refStability: "ephemeral",
96665
+ refScope: refData.scope,
96666
+ blockId: refData.segments?.[0]?.blockId,
96667
+ remediation: `Re-run query.match() to obtain a fresh ref valid for the current revision.`
96581
96668
  });
96582
96669
  if (!refData.segments?.length)
96583
96670
  return [];
@@ -96668,7 +96755,11 @@ function resolveStepTargets(editor, index2, step) {
96668
96755
  });
96669
96756
  if (refWhere) {
96670
96757
  if (targets.length === 0)
96671
- throw planError("MATCH_NOT_FOUND", `ref "${refWhere.ref}" did not resolve to any targets`, step.id);
96758
+ throw planError("MATCH_NOT_FOUND", `ref "${refWhere.ref}" did not resolve to any targets`, step.id, {
96759
+ selectorType: "ref",
96760
+ selectorPattern: refWhere.ref,
96761
+ candidateCount: 0
96762
+ });
96672
96763
  if (targets.length > 1)
96673
96764
  throw planError("AMBIGUOUS_MATCH", `ref "${refWhere.ref}" resolved to ${targets.length} targets`, step.id, { matchCount: targets.length });
96674
96765
  return targets;
@@ -96680,6 +96771,18 @@ function resolveStepTargets(editor, index2, step) {
96680
96771
  targets = [targets[0]];
96681
96772
  return targets;
96682
96773
  }
96774
+ function buildMatchNotFoundDetails(step) {
96775
+ const where = step.where;
96776
+ const select2 = "select" in where ? where.select : undefined;
96777
+ const within$1 = "within" in where ? where.within : undefined;
96778
+ return {
96779
+ selectorType: select2?.type ?? "unknown",
96780
+ selectorPattern: select2?.pattern ?? "",
96781
+ selectorMode: select2?.mode ?? "contains",
96782
+ searchScope: within$1?.blockId ?? "document",
96783
+ candidateCount: 0
96784
+ };
96785
+ }
96683
96786
  function applyCardinalityCheck(step, targets) {
96684
96787
  const where = step.where;
96685
96788
  if (!("require" in where) || where.require === undefined)
@@ -96687,62 +96790,131 @@ function applyCardinalityCheck(step, targets) {
96687
96790
  const require$1 = where.require;
96688
96791
  if (require$1 === "first") {
96689
96792
  if (targets.length === 0)
96690
- throw planError("MATCH_NOT_FOUND", "selector matched zero ranges", step.id);
96793
+ throw planError("MATCH_NOT_FOUND", "selector matched zero ranges", step.id, buildMatchNotFoundDetails(step));
96691
96794
  } else if (require$1 === "exactlyOne") {
96692
96795
  if (targets.length === 0)
96693
- throw planError("MATCH_NOT_FOUND", "selector matched zero ranges", step.id);
96796
+ throw planError("MATCH_NOT_FOUND", "selector matched zero ranges", step.id, buildMatchNotFoundDetails(step));
96694
96797
  if (targets.length > 1)
96695
96798
  throw planError("AMBIGUOUS_MATCH", `selector matched ${targets.length} ranges, expected exactly one`, step.id, { matchCount: targets.length });
96696
96799
  } else if (require$1 === "all") {
96697
96800
  if (targets.length === 0)
96698
- throw planError("MATCH_NOT_FOUND", "selector matched zero ranges", step.id);
96699
- }
96700
- }
96701
- function detectOverlaps(steps) {
96702
- const rangesByBlock = /* @__PURE__ */ new Map;
96703
- for (const compiled of steps)
96704
- for (const target of compiled.targets)
96705
- if (target.kind === "range")
96706
- addRange2(rangesByBlock, target.blockId, target.stepId, target.from, target.to);
96707
- else
96708
- for (const seg of target.segments)
96709
- addRange2(rangesByBlock, seg.blockId, target.stepId, seg.from, seg.to);
96710
- for (const [blockId, ranges] of rangesByBlock) {
96711
- ranges.sort((a2, b$1) => a2.from - b$1.from);
96712
- for (let i$1 = 1;i$1 < ranges.length; i$1++) {
96713
- const prev = ranges[i$1 - 1];
96714
- const curr = ranges[i$1];
96715
- if (prev.stepId !== curr.stepId && prev.to > curr.from)
96716
- throw planError("PLAN_CONFLICT_OVERLAP", `steps "${prev.stepId}" and "${curr.stepId}" target overlapping ranges in block "${blockId}"`, curr.stepId, {
96801
+ throw planError("MATCH_NOT_FOUND", "selector matched zero ranges", step.id, buildMatchNotFoundDetails(step));
96802
+ }
96803
+ }
96804
+ function normalizeOpForMatrix(op) {
96805
+ return op.startsWith("create.") ? "create.*" : op;
96806
+ }
96807
+ function classifyOverlap(stepA, stepB) {
96808
+ const rangesA = extractBlockRanges(stepA);
96809
+ const rangesB = extractBlockRanges(stepB);
96810
+ const opA = normalizeOpForMatrix(stepA.step.op);
96811
+ const opB = normalizeOpForMatrix(stepB.step.op);
96812
+ const isCreateA = opA === "create.*";
96813
+ const isCreateB = opB === "create.*";
96814
+ for (const [blockId, aEntries] of rangesA) {
96815
+ const bEntries = rangesB.get(blockId);
96816
+ if (!bEntries)
96817
+ continue;
96818
+ for (const a2 of aEntries)
96819
+ for (const b$1 of bEntries) {
96820
+ if (isCreateA || isCreateB)
96821
+ return {
96822
+ overlapClass: "same_block",
96823
+ blockId,
96824
+ rangeA: a2,
96825
+ rangeB: b$1
96826
+ };
96827
+ if (a2.to <= b$1.from || b$1.to <= a2.from)
96828
+ continue;
96829
+ if (a2.from === b$1.from && a2.to === b$1.to)
96830
+ return {
96831
+ overlapClass: "same_target",
96832
+ blockId,
96833
+ rangeA: a2,
96834
+ rangeB: b$1
96835
+ };
96836
+ return {
96837
+ overlapClass: "overlapping",
96717
96838
  blockId,
96718
- rangeA: {
96719
- from: prev.from,
96720
- to: prev.to
96721
- },
96722
- rangeB: {
96723
- from: curr.from,
96724
- to: curr.to
96725
- }
96726
- });
96727
- }
96839
+ rangeA: a2,
96840
+ rangeB: b$1
96841
+ };
96842
+ }
96728
96843
  }
96729
96844
  }
96730
- function addRange2(map$22, blockId, stepId, from$12, to) {
96731
- let blockRanges = map$22.get(blockId);
96732
- if (!blockRanges) {
96733
- blockRanges = [];
96734
- map$22.set(blockId, blockRanges);
96845
+ function extractBlockRanges(compiled) {
96846
+ const result = /* @__PURE__ */ new Map;
96847
+ for (const target of compiled.targets)
96848
+ if (target.kind === "range")
96849
+ pushBlockRange(result, target.blockId, target.from, target.to);
96850
+ else
96851
+ for (const seg of target.segments)
96852
+ pushBlockRange(result, seg.blockId, seg.from, seg.to);
96853
+ return result;
96854
+ }
96855
+ function pushBlockRange(map$22, blockId, from$12, to) {
96856
+ let entries = map$22.get(blockId);
96857
+ if (!entries) {
96858
+ entries = [];
96859
+ map$22.set(blockId, entries);
96735
96860
  }
96736
- blockRanges.push({
96737
- stepId,
96861
+ entries.push({
96738
96862
  from: from$12,
96739
96863
  to
96740
96864
  });
96741
96865
  }
96866
+ function validateStepInteractions(steps) {
96867
+ for (let i$1 = 0;i$1 < steps.length; i$1++)
96868
+ for (let j2 = i$1 + 1;j2 < steps.length; j2++) {
96869
+ const stepA = steps[i$1];
96870
+ const stepB = steps[j2];
96871
+ if (MATRIX_EXEMPT_OPS.has(stepA.step.op) || MATRIX_EXEMPT_OPS.has(stepB.step.op))
96872
+ continue;
96873
+ const overlap = classifyOverlap(stepA, stepB);
96874
+ if (!overlap)
96875
+ continue;
96876
+ const matrixKey = `${normalizeOpForMatrix(stepA.step.op)}::${normalizeOpForMatrix(stepB.step.op)}::${overlap.overlapClass}`;
96877
+ const verdict = STEP_INTERACTION_MATRIX.get(matrixKey) ?? "reject";
96878
+ if (verdict === "reject")
96879
+ throw planError("PLAN_CONFLICT_OVERLAP", `steps "${stepA.step.id}" and "${stepB.step.id}" target overlapping ranges in block "${overlap.blockId}"`, stepB.step.id, {
96880
+ blockId: overlap.blockId,
96881
+ stepIdA: stepA.step.id,
96882
+ stepIdB: stepB.step.id,
96883
+ opKeyA: stepA.step.op,
96884
+ opKeyB: stepB.step.op,
96885
+ rangeA: overlap.rangeA,
96886
+ rangeB: overlap.rangeB,
96887
+ overlapRegion: {
96888
+ from: Math.max(overlap.rangeA.from, overlap.rangeB.from),
96889
+ to: Math.min(overlap.rangeA.to, overlap.rangeB.to)
96890
+ },
96891
+ matrixVerdict: verdict,
96892
+ matrixKey
96893
+ });
96894
+ }
96895
+ }
96896
+ function assertNoDuplicateBlockIds(index2) {
96897
+ const seen = /* @__PURE__ */ new Map;
96898
+ const duplicates = [];
96899
+ for (const candidate of index2.candidates) {
96900
+ const count = seen.get(candidate.nodeId) ?? 0;
96901
+ seen.set(candidate.nodeId, count + 1);
96902
+ if (count === 1)
96903
+ duplicates.push(candidate.nodeId);
96904
+ }
96905
+ if (duplicates.length > 0)
96906
+ throw planError("DOCUMENT_IDENTITY_CONFLICT", "Document contains blocks with duplicate identities. This must be resolved before mutations can be applied.", undefined, {
96907
+ duplicateBlockIds: duplicates,
96908
+ blockCount: duplicates.length,
96909
+ remediation: "Re-import the document or call document.repair() to assign unique identities."
96910
+ });
96911
+ }
96742
96912
  function compilePlan(editor, steps) {
96743
96913
  if (steps.length > 200)
96744
96914
  throw planError("INVALID_INPUT", `plan contains ${steps.length} steps, maximum is 200`);
96915
+ const compiledRevision = getRevision(editor);
96745
96916
  const index2 = getBlockIndex(editor);
96917
+ assertNoDuplicateBlockIds(index2);
96746
96918
  const mutationSteps = [];
96747
96919
  const assertSteps = [];
96748
96920
  const seenIds = /* @__PURE__ */ new Set;
@@ -96754,28 +96926,45 @@ function compilePlan(editor, steps) {
96754
96926
  seenIds.add(step.id);
96755
96927
  }
96756
96928
  let totalTargets = 0;
96929
+ let stepIndex = 0;
96757
96930
  for (const step of steps) {
96758
96931
  if (isAssertStep(step)) {
96759
96932
  assertSteps.push(step);
96933
+ stepIndex++;
96760
96934
  continue;
96761
96935
  }
96762
96936
  if (!hasStepExecutor(step.op))
96763
96937
  throw planError("INVALID_INPUT", `unknown step op "${step.op}"`, step.id);
96938
+ if (isCreateOp(step.op))
96939
+ validateCreateStepPosition(step);
96764
96940
  const targets = resolveStepTargets(editor, index2, step);
96941
+ if (isCreateOp(step.op) && targets.length > 0) {
96942
+ const position4 = step.args.position ?? "after";
96943
+ const anchorBlockId = resolveCreateAnchorFromTargets(targets, position4, step.id);
96944
+ validateInsertionContext(editor, index2, step, stepIndex, anchorBlockId, position4);
96945
+ }
96765
96946
  totalTargets += targets.length;
96766
96947
  mutationSteps.push({
96767
96948
  step,
96768
96949
  targets
96769
96950
  });
96951
+ stepIndex++;
96770
96952
  }
96771
96953
  if (totalTargets > 500)
96772
96954
  throw planError("INVALID_INPUT", `plan resolved ${totalTargets} total targets, maximum is 500`);
96773
- detectOverlaps(mutationSteps);
96955
+ validateStepInteractions(mutationSteps);
96774
96956
  return {
96775
96957
  mutationSteps,
96776
- assertSteps
96958
+ assertSteps,
96959
+ compiledRevision
96777
96960
  };
96778
96961
  }
96962
+ function resolveBlockInsertionPos(editor, anchorBlockId, position4, stepId) {
96963
+ const candidate = getBlockIndex(editor).candidates.find((c$3) => c$3.nodeId === anchorBlockId);
96964
+ if (!candidate)
96965
+ throw planError("TARGET_NOT_FOUND", `block "${anchorBlockId}" not found`, stepId);
96966
+ return position4 === "before" ? candidate.pos : candidate.end;
96967
+ }
96779
96968
  function applyDirectMutationMeta(tr) {
96780
96969
  tr.setMeta("inputType", "programmatic");
96781
96970
  tr.setMeta("skipTrackChanges", true);
@@ -96828,11 +97017,33 @@ function buildMarksFromSetMarks(editor, setMarks) {
96828
97017
  marks.push(schema.marks.strike.create());
96829
97018
  return marks;
96830
97019
  }
96831
- function toAbsoluteBlockInsertPos(editor, blockId, offset$1, stepId) {
96832
- const candidate = getBlockIndex(editor).candidates.find((c$3) => c$3.nodeId === blockId);
96833
- if (!candidate)
96834
- throw planError("TARGET_NOT_FOUND", `block "${blockId}" not found`, stepId);
96835
- return candidate.pos + offset$1;
97020
+ function applyInlineMarkPatches(editor, tr, absFrom, absTo, inline) {
97021
+ const { schema } = editor.state;
97022
+ let changed = false;
97023
+ const markEntries = [
97024
+ [inline.bold, schema.marks.bold],
97025
+ [inline.italic, schema.marks.italic],
97026
+ [inline.underline, schema.marks.underline],
97027
+ [inline.strike, schema.marks.strike]
97028
+ ];
97029
+ for (const [value, markType] of markEntries) {
97030
+ if (value === undefined || !markType)
97031
+ continue;
97032
+ if (value)
97033
+ tr.addMark(absFrom, absTo, markType.create());
97034
+ else
97035
+ tr.removeMark(absFrom, absTo, markType);
97036
+ changed = true;
97037
+ }
97038
+ return changed;
97039
+ }
97040
+ function resolveCreateAnchorBlockId(target, position4, stepId) {
97041
+ if (target.kind === "range")
97042
+ return target.blockId;
97043
+ const segments = target.segments;
97044
+ if (!segments.length)
97045
+ throw planError("INVALID_INPUT", "span target has no segments", stepId);
97046
+ return position4 === "before" ? segments[0].blockId : segments[segments.length - 1].blockId;
96836
97047
  }
96837
97048
  function executeTextRewrite(editor, tr, target, step, mapping) {
96838
97049
  const absFrom = mapping.map(target.absFrom);
@@ -96873,42 +97084,7 @@ function executeTextDelete(_editor, tr, target, _step, mapping) {
96873
97084
  return { changed: true };
96874
97085
  }
96875
97086
  function executeStyleApply2(editor, tr, target, step, mapping) {
96876
- const absFrom = mapping.map(target.absFrom);
96877
- const absTo = mapping.map(target.absTo);
96878
- const { schema } = editor.state;
96879
- let changed = false;
96880
- const markEntries = [
96881
- [
96882
- "bold",
96883
- step.args.inline.bold,
96884
- schema.marks.bold
96885
- ],
96886
- [
96887
- "italic",
96888
- step.args.inline.italic,
96889
- schema.marks.italic
96890
- ],
96891
- [
96892
- "underline",
96893
- step.args.inline.underline,
96894
- schema.marks.underline
96895
- ],
96896
- [
96897
- "strike",
96898
- step.args.inline.strike,
96899
- schema.marks.strike
96900
- ]
96901
- ];
96902
- for (const [, value, markType] of markEntries) {
96903
- if (value === undefined || !markType)
96904
- continue;
96905
- if (value)
96906
- tr.addMark(absFrom, absTo, markType.create());
96907
- else
96908
- tr.removeMark(absFrom, absTo, markType);
96909
- changed = true;
96910
- }
96911
- return { changed };
97087
+ return { changed: applyInlineMarkPatches(editor, tr, mapping.map(target.absFrom), mapping.map(target.absTo), step.args.inline) };
96912
97088
  }
96913
97089
  function validateMappedSpanContiguity(target, mapping, stepId) {
96914
97090
  let lastMappedEnd = -1;
@@ -96974,44 +97150,9 @@ function executeSpanTextDelete(_editor, tr, target, step, mapping) {
96974
97150
  }
96975
97151
  function executeSpanStyleApply(editor, tr, target, step, mapping) {
96976
97152
  validateMappedSpanContiguity(target, mapping, step.id);
96977
- const { schema } = editor.state;
96978
- let changed = false;
96979
97153
  const firstSeg = target.segments[0];
96980
97154
  const lastSeg = target.segments[target.segments.length - 1];
96981
- const absFrom = mapping.map(firstSeg.absFrom, 1);
96982
- const absTo = mapping.map(lastSeg.absTo, -1);
96983
- const markEntries = [
96984
- [
96985
- "bold",
96986
- step.args.inline.bold,
96987
- schema.marks.bold
96988
- ],
96989
- [
96990
- "italic",
96991
- step.args.inline.italic,
96992
- schema.marks.italic
96993
- ],
96994
- [
96995
- "underline",
96996
- step.args.inline.underline,
96997
- schema.marks.underline
96998
- ],
96999
- [
97000
- "strike",
97001
- step.args.inline.strike,
97002
- schema.marks.strike
97003
- ]
97004
- ];
97005
- for (const [, value, markType] of markEntries) {
97006
- if (value === undefined || !markType)
97007
- continue;
97008
- if (value)
97009
- tr.addMark(absFrom, absTo, markType.create());
97010
- else
97011
- tr.removeMark(absFrom, absTo, markType);
97012
- changed = true;
97013
- }
97014
- return { changed };
97155
+ return { changed: applyInlineMarkPatches(editor, tr, mapping.map(firstSeg.absFrom, 1), mapping.map(lastSeg.absTo, -1), step.args.inline) };
97015
97156
  }
97016
97157
  function getReplacementText(replacement) {
97017
97158
  if (replacement.blocks !== undefined)
@@ -97212,10 +97353,12 @@ function executeAssertStep(_editor, tr, step) {
97212
97353
  }
97213
97354
  function executeCreateStep(editor, tr, step, targets, mapping) {
97214
97355
  const target = targets[0];
97215
- if (!target || target.kind !== "range")
97216
- throw planError("INVALID_INPUT", `${step.op} step requires exactly one range target`, step.id);
97356
+ if (!target)
97357
+ throw planError("INVALID_INPUT", `${step.op} step requires at least one target`, step.id);
97217
97358
  const args$1 = step.args;
97218
- const pos = mapping.map(toAbsoluteBlockInsertPos(editor, target.blockId, target.from, step.id));
97359
+ const position4 = args$1.position ?? "after";
97360
+ const anchorPos = resolveBlockInsertionPos(editor, resolveCreateAnchorBlockId(target, position4, step.id), position4, step.id);
97361
+ const pos = mapping.map(anchorPos);
97219
97362
  const paragraphType = editor.state.schema?.nodes?.paragraph;
97220
97363
  if (!paragraphType)
97221
97364
  throw planError("INVALID_INPUT", "paragraph node type not in schema", step.id);
@@ -97235,6 +97378,7 @@ function executeCreateStep(editor, tr, step, targets, mapping) {
97235
97378
  if (!node3)
97236
97379
  throw planError("INVALID_INPUT", `could not create ${step.op} node`, step.id);
97237
97380
  tr.insert(pos, node3);
97381
+ assertNoPostInsertDuplicateIds(tr.doc, step.id);
97238
97382
  return {
97239
97383
  stepId: step.id,
97240
97384
  op: step.op,
@@ -97246,6 +97390,31 @@ function executeCreateStep(editor, tr, step, targets, mapping) {
97246
97390
  }
97247
97391
  };
97248
97392
  }
97393
+ function assertNoPostInsertDuplicateIds(doc$2, stepId) {
97394
+ const seen = /* @__PURE__ */ new Set;
97395
+ const duplicateSet = /* @__PURE__ */ new Set;
97396
+ doc$2.descendants((node3) => {
97397
+ if (!node3.isTextblock)
97398
+ return true;
97399
+ const attrs = node3.attrs ?? {};
97400
+ const id2 = typeof attrs.paraId === "string" && attrs.paraId || typeof attrs.sdBlockId === "string" && attrs.sdBlockId || typeof attrs.nodeId === "string" && attrs.nodeId;
97401
+ if (!id2)
97402
+ return true;
97403
+ if (seen.has(id2))
97404
+ duplicateSet.add(id2);
97405
+ else
97406
+ seen.add(id2);
97407
+ return true;
97408
+ });
97409
+ if (duplicateSet.size > 0) {
97410
+ const duplicates = [...duplicateSet];
97411
+ throw planError("INTERNAL_ERROR", `create step produced duplicate block identities: [${duplicates.join(", ")}]`, stepId, {
97412
+ source: "executor:checkPostInsertIdentityUniqueness",
97413
+ invariant: "post-insert block IDs must be unique",
97414
+ duplicateBlockIds: duplicates
97415
+ });
97416
+ }
97417
+ }
97249
97418
  function runMutationsOnTransaction(editor, tr, compiled, options) {
97250
97419
  const mapping = tr.mapping;
97251
97420
  const stepOutcomes = [];
@@ -97303,6 +97472,14 @@ function executeCompiledPlan(editor, compiled, options = {}) {
97303
97472
  const startTime = performance.now();
97304
97473
  const revisionBefore = getRevision(editor);
97305
97474
  checkRevision(editor, options.expectedRevision);
97475
+ if (compiled.compiledRevision !== revisionBefore)
97476
+ throw planError("REVISION_CHANGED_SINCE_COMPILE", `Document revision changed between compile and execute. Compiled at "${compiled.compiledRevision}", now at "${revisionBefore}".`, undefined, {
97477
+ compiledRevision: compiled.compiledRevision,
97478
+ currentRevision: revisionBefore,
97479
+ stepCount: compiled.mutationSteps.length,
97480
+ failedAtStep: "pre-execution",
97481
+ remediation: "Re-compile the plan against the current document state."
97482
+ });
97306
97483
  const tr = editor.state.tr;
97307
97484
  if ((options.changeMode ?? "direct") === "tracked")
97308
97485
  applyTrackedMutationMeta(tr);
@@ -97522,7 +97699,8 @@ function executeDomainCommand(editor, handler2, options) {
97522
97699
  },
97523
97700
  targets: []
97524
97701
  }],
97525
- assertSteps: []
97702
+ assertSteps: [],
97703
+ compiledRevision: getRevision(editor)
97526
97704
  }, { expectedRevision: options?.expectedRevision });
97527
97705
  }
97528
97706
  function validateWriteRequest(request, resolved) {
@@ -97618,7 +97796,8 @@ function writeWrapper(editor, request, options) {
97618
97796
  step: stepDef,
97619
97797
  targets: [toCompiledTarget(stepId, op, resolved)]
97620
97798
  }],
97621
- assertSteps: []
97799
+ assertSteps: [],
97800
+ compiledRevision: getRevision(editor)
97622
97801
  }, {
97623
97802
  changeMode: mode,
97624
97803
  expectedRevision: options?.expectedRevision
@@ -97683,7 +97862,8 @@ function styleApplyWrapper(editor, input2, options) {
97683
97862
  marks: []
97684
97863
  }]
97685
97864
  }],
97686
- assertSteps: []
97865
+ assertSteps: [],
97866
+ compiledRevision: getRevision(editor)
97687
97867
  }, {
97688
97868
  changeMode: mode,
97689
97869
  expectedRevision: options?.expectedRevision
@@ -98705,10 +98885,7 @@ function resolveCreateInsertPosition(editor, at, operationLabel) {
98705
98885
  return 0;
98706
98886
  if (location$1.kind === "documentEnd")
98707
98887
  return editor.state.doc.content.size;
98708
- const target = findBlockById(getBlockIndex(editor), location$1.target);
98709
- if (!target)
98710
- throw new DocumentApiAdapterError("TARGET_NOT_FOUND", `Create ${operationLabel} target block was not found.`, { target: location$1.target });
98711
- return location$1.kind === "before" ? target.pos : target.end;
98888
+ return resolveBlockInsertionPos(editor, location$1.target.nodeId, location$1.kind);
98712
98889
  }
98713
98890
  function resolveCreatedBlock(editor, nodeType, blockId) {
98714
98891
  const index2 = getBlockIndex(editor);
@@ -98817,7 +98994,10 @@ function createParagraphWrapper(editor, input2, options) {
98817
98994
  const paragraph2 = resolveCreatedBlock(editor, "paragraph", paragraphId);
98818
98995
  if (mode === "tracked")
98819
98996
  trackedChangeRefs = collectTrackInsertRefsInRange(editor, paragraph2.pos, paragraph2.end);
98820
- } catch {}
98997
+ } catch (e) {
98998
+ if (!(e instanceof DocumentApiAdapterError))
98999
+ throw e;
99000
+ }
98821
99001
  }
98822
99002
  return didApply;
98823
99003
  }, { expectedRevision: options?.expectedRevision }).steps[0]?.effect !== "changed")
@@ -98883,7 +99063,10 @@ function createHeadingWrapper(editor, input2, options) {
98883
99063
  const heading3 = resolveCreatedBlock(editor, "heading", headingId);
98884
99064
  if (mode === "tracked")
98885
99065
  trackedChangeRefs = collectTrackInsertRefsInRange(editor, heading3.pos, heading3.end);
98886
- } catch {}
99066
+ } catch (e) {
99067
+ if (!(e instanceof DocumentApiAdapterError))
99068
+ throw e;
99069
+ }
98887
99070
  }
98888
99071
  return didApply;
98889
99072
  }, { expectedRevision: options?.expectedRevision }).steps[0]?.effect !== "changed")
@@ -100242,15 +100425,16 @@ function trackChangesRejectAllWrapper(editor, _input, options) {
100242
100425
  return { success: true };
100243
100426
  }
100244
100427
  function previewPlan(editor, input2) {
100245
- const evaluatedRevision = getRevision(editor);
100246
100428
  checkRevision(editor, input2.expectedRevision);
100247
100429
  if (!input2.steps?.length)
100248
100430
  throw planError("INVALID_INPUT", "plan must contain at least one step");
100249
100431
  const failures = [];
100250
100432
  const stepPreviews = [];
100251
100433
  let currentPhase = "compile";
100434
+ let evaluatedRevision = getRevision(editor);
100252
100435
  try {
100253
100436
  const compiled = compilePlan(editor, input2.steps);
100437
+ evaluatedRevision = compiled.compiledRevision;
100254
100438
  currentPhase = "execute";
100255
100439
  const tr = editor.state.tr;
100256
100440
  const { stepOutcomes, assertFailures } = runMutationsOnTransaction(editor, tr, compiled, { throwOnAssertFailure: false });
@@ -100662,7 +100846,13 @@ function queryMatchAdapter(editor, input2) {
100662
100846
  const paginatedMatches = isTextSelector ? applyPagination(rawMatches, userOffset, input2.limit) : rawMatches;
100663
100847
  if (require$1 === "first" || require$1 === "exactlyOne" || require$1 === "all") {
100664
100848
  if (totalMatches === 0)
100665
- throw planError("MATCH_NOT_FOUND", "selector matched zero ranges");
100849
+ throw planError("MATCH_NOT_FOUND", "selector matched zero ranges", undefined, {
100850
+ selectorType: input2.select?.type ?? "unknown",
100851
+ selectorPattern: input2.select?.pattern ?? "",
100852
+ selectorMode: input2.select?.mode ?? "contains",
100853
+ searchScope: (input2.within?.kind === "block" ? input2.within.nodeId : undefined) ?? "document",
100854
+ candidateCount: 0
100855
+ });
100666
100856
  }
100667
100857
  if (require$1 === "exactlyOne" && totalMatches > 1)
100668
100858
  throw planError("AMBIGUOUS_MATCH", `selector matched ${totalMatches} ranges, expected exactly one`, undefined, { matchCount: totalMatches });
@@ -100671,7 +100861,11 @@ function queryMatchAdapter(editor, input2) {
100671
100861
  if (isTextSelector && raw.textRanges?.length) {
100672
100862
  const blocks2 = buildMatchBlocks(editor, raw.textRanges, evaluatedRevision, id2);
100673
100863
  if (blocks2.length === 0)
100674
- throw planError("INTERNAL_ERROR", `text match produced no blocks for ${id2}`);
100864
+ throw planError("INTERNAL_ERROR", `text match produced no blocks for ${id2}`, undefined, {
100865
+ source: "query-match-adapter:buildMatchEntries",
100866
+ invariant: "text match must have at least one block after zero-width filtering",
100867
+ context: { matchId: id2 }
100868
+ });
100675
100869
  const snippetResult = buildBlocksSnippet(editor, blocks2);
100676
100870
  return {
100677
100871
  id: id2,
@@ -134950,7 +135144,7 @@ var Node$13 = class Node$14 {
134950
135144
  console.warn("Failed to initialize developer tools:", error);
134951
135145
  }
134952
135146
  }
134953
- }, BLANK_DOCX_DATA_URI = `data:application/vnd.openxmlformats-officedocument.wordprocessingml.document;base64,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`, NODE_TYPES2, BLOCK_NODE_TYPES2, DELETABLE_BLOCK_NODE_TYPES2, INLINE_NODE_TYPES2, MARK_KEYS2, MARK_KEY_SET2, NONE_FAILURES2, NONE_THROWS2, T_NOT_FOUND2, T_NOT_FOUND_CAPABLE2, T_PLAN_ENGINE2, T_QUERY_MATCH2, OPERATION_DEFINITIONS2, OPERATION_IDS2, COMMAND_CATALOG2, DocumentApiValidationError2, ALIGNMENTS2, ALIGNMENT_SET2, STYLE_APPLY_INPUT_ALLOWED_KEYS2, FONT_SIZE_ALLOWED_KEYS2, FONT_FAMILY_ALLOWED_KEYS2, COLOR_ALLOWED_KEYS2, ALIGN_ALLOWED_KEYS2, nodeTypeValues2, blockNodeTypeValues2, deletableBlockNodeTypeValues2, inlineNodeTypeValues2, rangeSchema2, textAddressSchema2, textTargetSchema2, blockNodeAddressSchema2, deletableBlockNodeAddressSchema2, paragraphAddressSchema2, headingAddressSchema2, listItemAddressSchema2, nodeAddressSchema2, commentAddressSchema2, trackedChangeAddressSchema2, resolvedHandleSchema2, pageInfoSchema2, receiptSuccessSchema2, textMutationResolutionSchema2, textMutationSuccessSchema2, matchBlockSchema2, trackChangeRefSchema2, createParagraphSuccessSchema2, createHeadingSuccessSchema2, headingLevelSchema2, listsInsertSuccessSchema2, listsMutateItemSuccessSchema2, listsExitSuccessSchema2, nodeSummarySchema2, nodeInfoSchema2, matchContextSchema2, unknownNodeDiagnosticSchema2, textSelectorSchema2, nodeSelectorSchema2, findItemDomainSchema2, documentInfoCountsSchema2, documentInfoOutlineItemSchema2, documentInfoCapabilitiesSchema2, listKindSchema2, listInsertPositionSchema2, capabilityReasonsSchema2, capabilityFlagSchema2, operationRuntimeCapabilitySchema2, operationCapabilitiesSchema2, formatCapabilitiesSchema2, GROUP_METADATA2, CAPABILITY_REASON_CODES2, CREATE_COMMENT_ALLOWED_KEYS2, PATCH_COMMENT_ALLOWED_KEYS2, DELETE_INPUT_ALLOWED_KEYS2, INSERT_INPUT_ALLOWED_KEYS2, REPLACE_INPUT_ALLOWED_KEYS2, SUPPORTED_DELETE_NODE_TYPES2, REJECTED_DELETE_NODE_TYPES2, REQUIRED_COMMANDS, VALID_CAPABILITY_REASON_CODES, REQUIRED_HELPERS, STYLE_MARK_SCHEMA_NAMES, INLINE_FORMAT_OPERATIONS, SUPPORTED_STEP_OPS, SUPPORTED_NON_UNIFORM_STRATEGIES, SUPPORTED_SET_MARKS, REGEX_MAX_PATTERN_LENGTH = 1024, DocumentApiAdapterError, LINK_MARK_NAME = "link", COMMENT_MARK_NAME, SUPPORTED_INLINE_TYPES, ALIAS_ELIGIBLE_TYPES, cacheByEditor, PlanError, revisionMap, subscribedEditors, registry, CORE_MARK_NAMES, METADATA_MARK_NAMES, SNIPPET_PADDING = 30, DUAL_KIND_TYPES, KNOWN_BLOCK_PM_NODE_TYPES, KNOWN_INLINE_PM_NODE_TYPES, MAX_PATTERN_LENGTH = 1024, REF_HANDLERS, DEFAULT_INLINE_POLICY, OBJECT_REPLACEMENT_CHAR = "", STUB_WHERE, MARK_KEY_TO_SCHEMA_NAME, FALLBACK_STORE_KEY = "__documentApiComments", SUPPORTED_NODE_TYPES, REJECTED_NODE_TYPES, DERIVED_ID_LENGTH = 24, groupedCache, CSS_NAMED_COLORS, registered = false, empty_exports, init_empty, PIXELS_PER_INCH$1 = 96, MAX_HEIGHT_BUFFER_PX = 50, MAX_WIDTH_BUFFER_PX = 20, Editor, ContextMenuPluginKey, MENU_OFFSET_X = 0, MENU_OFFSET_Y = 28, CONTEXT_MENU_OFFSET_X = 10, CONTEXT_MENU_OFFSET_Y = 10, SLASH_COOLDOWN_MS = 5000, ContextMenu, SearchQuery = class {
135147
+ }, BLANK_DOCX_DATA_URI = `data:application/vnd.openxmlformats-officedocument.wordprocessingml.document;base64,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`, NODE_TYPES2, BLOCK_NODE_TYPES2, DELETABLE_BLOCK_NODE_TYPES2, INLINE_NODE_TYPES2, MARK_KEYS2, MARK_KEY_SET2, NONE_FAILURES2, NONE_THROWS2, T_NOT_FOUND2, T_NOT_FOUND_CAPABLE2, T_PLAN_ENGINE2, T_QUERY_MATCH2, OPERATION_DEFINITIONS2, OPERATION_IDS2, COMMAND_CATALOG2, DocumentApiValidationError2, ALIGNMENTS2, ALIGNMENT_SET2, STYLE_APPLY_INPUT_ALLOWED_KEYS2, FONT_SIZE_ALLOWED_KEYS2, FONT_FAMILY_ALLOWED_KEYS2, COLOR_ALLOWED_KEYS2, ALIGN_ALLOWED_KEYS2, nodeTypeValues2, blockNodeTypeValues2, deletableBlockNodeTypeValues2, inlineNodeTypeValues2, rangeSchema2, textAddressSchema2, textTargetSchema2, blockNodeAddressSchema2, deletableBlockNodeAddressSchema2, paragraphAddressSchema2, headingAddressSchema2, listItemAddressSchema2, nodeAddressSchema2, commentAddressSchema2, trackedChangeAddressSchema2, resolvedHandleSchema2, pageInfoSchema2, receiptSuccessSchema2, textMutationResolutionSchema2, textMutationSuccessSchema2, matchBlockSchema2, trackChangeRefSchema2, createParagraphSuccessSchema2, createHeadingSuccessSchema2, headingLevelSchema2, listsInsertSuccessSchema2, listsMutateItemSuccessSchema2, listsExitSuccessSchema2, nodeSummarySchema2, nodeInfoSchema2, matchContextSchema2, unknownNodeDiagnosticSchema2, textSelectorSchema2, nodeSelectorSchema2, findItemDomainSchema2, documentInfoCountsSchema2, documentInfoOutlineItemSchema2, documentInfoCapabilitiesSchema2, listKindSchema2, listInsertPositionSchema2, capabilityReasonsSchema2, capabilityFlagSchema2, operationRuntimeCapabilitySchema2, operationCapabilitiesSchema2, formatCapabilitiesSchema2, GROUP_METADATA2, CAPABILITY_REASON_CODES2, CREATE_COMMENT_ALLOWED_KEYS2, PATCH_COMMENT_ALLOWED_KEYS2, DELETE_INPUT_ALLOWED_KEYS2, INSERT_INPUT_ALLOWED_KEYS2, REPLACE_INPUT_ALLOWED_KEYS2, SUPPORTED_DELETE_NODE_TYPES2, REJECTED_DELETE_NODE_TYPES2, REQUIRED_COMMANDS, VALID_CAPABILITY_REASON_CODES, REQUIRED_HELPERS, STYLE_MARK_SCHEMA_NAMES, INLINE_FORMAT_OPERATIONS, SUPPORTED_STEP_OPS, SUPPORTED_NON_UNIFORM_STRATEGIES, SUPPORTED_SET_MARKS, REGEX_MAX_PATTERN_LENGTH = 1024, DocumentApiAdapterError, LINK_MARK_NAME = "link", COMMENT_MARK_NAME, SUPPORTED_INLINE_TYPES, ALIAS_ELIGIBLE_TYPES, cacheByEditor, PlanError, revisionMap, subscribedEditors, registry, CORE_MARK_NAMES, METADATA_MARK_NAMES, SNIPPET_PADDING = 30, DUAL_KIND_TYPES, KNOWN_BLOCK_PM_NODE_TYPES, KNOWN_INLINE_PM_NODE_TYPES, MAX_PATTERN_LENGTH = 1024, VALID_CREATE_POSITIONS, REF_HANDLERS, STEP_INTERACTION_MATRIX, MATRIX_EXEMPT_OPS, DEFAULT_INLINE_POLICY, OBJECT_REPLACEMENT_CHAR = "", STUB_WHERE, MARK_KEY_TO_SCHEMA_NAME, FALLBACK_STORE_KEY = "__documentApiComments", SUPPORTED_NODE_TYPES, REJECTED_NODE_TYPES, DERIVED_ID_LENGTH = 24, groupedCache, CSS_NAMED_COLORS, registered = false, empty_exports, init_empty, PIXELS_PER_INCH$1 = 96, MAX_HEIGHT_BUFFER_PX = 50, MAX_WIDTH_BUFFER_PX = 20, Editor, ContextMenuPluginKey, MENU_OFFSET_X = 0, MENU_OFFSET_Y = 28, CONTEXT_MENU_OFFSET_X = 10, CONTEXT_MENU_OFFSET_Y = 10, SLASH_COOLDOWN_MS = 5000, ContextMenu, SearchQuery = class {
134954
135148
  constructor(config2) {
134955
135149
  this.search = config2.search;
134956
135150
  this.caseSensitive = !!config2.caseSensitive;
@@ -153021,9 +153215,9 @@ var Node$13 = class Node$14 {
153021
153215
  trackedChanges: context.trackedChanges ?? []
153022
153216
  });
153023
153217
  }, _hoisted_1$6, _hoisted_2$1, _hoisted_3, _hoisted_4, ContextMenu_default, _hoisted_1$5, BasicUpload_default, _hoisted_1$4, MIN_WIDTH = 200, PPI = 96, alignment = "flex-end", Ruler_default, GenericPopover_default, _hoisted_1$3, RESIZE_HANDLE_WIDTH_PX = 9, RESIZE_HANDLE_OFFSET_PX = 4, DRAG_OVERLAY_EXTENSION_PX = 1000, MIN_DRAG_OVERLAY_WIDTH_PX = 2000, THROTTLE_INTERVAL_MS = 16, MIN_RESIZE_DELTA_PX = 1, TableResizeOverlay_default, _hoisted_1$2, OVERLAY_EXPANSION_PX = 2000, RESIZE_HANDLE_SIZE_PX = 12, MOUSE_MOVE_THROTTLE_MS = 16, DIMENSION_CHANGE_THRESHOLD_PX = 1, Z_INDEX_OVERLAY = 10, Z_INDEX_HANDLE = 15, Z_INDEX_GUIDELINE = 20, ImageResizeOverlay_default, LINK_CLICK_DEBOUNCE_MS = 300, CURSOR_UPDATE_TIMEOUT_MS = 10, LinkClickHandler_default, _hoisted_1$1, _hoisted_2, DOCX2 = "application/vnd.openxmlformats-officedocument.wordprocessingml.document", TABLE_RESIZE_HOVER_THRESHOLD = 8, TABLE_RESIZE_THROTTLE_MS = 16, SuperEditor_default, _hoisted_1, SuperInput_default, SlashMenu, Extensions;
153024
- var init_src_B6O9kkNF_es = __esm(() => {
153218
+ var init_src_Cl9CKlDG_es = __esm(() => {
153025
153219
  init_rolldown_runtime_B2q5OVn9_es();
153026
- init_SuperConverter_BxBclpFg_es();
153220
+ init_SuperConverter_DFpPWkcl_es();
153027
153221
  init_jszip_ChlR43oI_es();
153028
153222
  init_uuid_2IzDu5nl_es();
153029
153223
  init_constants_DBKi0Amm_es();
@@ -161141,6 +161335,9 @@ function print() { __p += __j.call(arguments, '') }
161141
161335
  "TARGET_MOVED",
161142
161336
  "PLAN_CONFLICT_OVERLAP",
161143
161337
  "INVALID_STEP_COMBINATION",
161338
+ "REVISION_CHANGED_SINCE_COMPILE",
161339
+ "INVALID_INSERTION_CONTEXT",
161340
+ "DOCUMENT_IDENTITY_CONFLICT",
161144
161341
  "CAPABILITY_UNAVAILABLE"
161145
161342
  ];
161146
161343
  T_QUERY_MATCH2 = [
@@ -162654,6 +162851,7 @@ function print() { __p += __j.call(arguments, '') }
162654
162851
  "commentRangeStart",
162655
162852
  "commentRangeEnd"
162656
162853
  ]);
162854
+ VALID_CREATE_POSITIONS = ["before", "after"];
162657
162855
  REF_HANDLERS = [
162658
162856
  {
162659
162857
  prefix: "text:",
@@ -162676,6 +162874,34 @@ function print() { __p += __j.call(arguments, '') }
162676
162874
  handler: resolveBlockRef
162677
162875
  }
162678
162876
  ];
162877
+ STEP_INTERACTION_MATRIX = new Map([
162878
+ ["text.rewrite::format.apply::same_target", "allow"],
162879
+ ["text.rewrite::text.rewrite::same_target", "reject"],
162880
+ ["text.rewrite::text.delete::overlapping", "reject"],
162881
+ ["text.rewrite::create.*::same_block", "allow"],
162882
+ ["text.rewrite::text.insert::same_target", "reject"],
162883
+ ["format.apply::format.apply::same_target", "allow"],
162884
+ ["format.apply::text.rewrite::same_target", "reject"],
162885
+ ["format.apply::text.delete::overlapping", "reject"],
162886
+ ["format.apply::create.*::same_block", "allow"],
162887
+ ["format.apply::text.insert::same_target", "allow"],
162888
+ ["text.delete::text.rewrite::overlapping", "reject"],
162889
+ ["text.delete::text.delete::overlapping", "reject"],
162890
+ ["text.delete::format.apply::overlapping", "reject"],
162891
+ ["text.delete::create.*::same_block", "allow"],
162892
+ ["text.delete::text.insert::overlapping", "reject"],
162893
+ ["create.*::text.rewrite::same_block", "allow"],
162894
+ ["create.*::format.apply::same_block", "allow"],
162895
+ ["create.*::text.delete::same_block", "allow"],
162896
+ ["create.*::create.*::same_block", "allow"],
162897
+ ["create.*::text.insert::same_block", "allow"],
162898
+ ["text.insert::format.apply::same_target", "allow"],
162899
+ ["text.insert::text.rewrite::same_target", "reject"],
162900
+ ["text.insert::text.delete::overlapping", "reject"],
162901
+ ["text.insert::create.*::same_block", "allow"],
162902
+ ["text.insert::text.insert::same_target", "reject"]
162903
+ ]);
162904
+ MATRIX_EXEMPT_OPS = new Set(["assert"]);
162679
162905
  DEFAULT_INLINE_POLICY = {
162680
162906
  mode: "preserve",
162681
162907
  onNonUniform: "majority"
@@ -184692,8 +184918,8 @@ function print() { __p += __j.call(arguments, '') }
184692
184918
  return isObjectLike_default(value) && hasOwnProperty$8.call(value, "callee") && !propertyIsEnumerable$1.call(value, "callee");
184693
184919
  };
184694
184920
  stubFalse_default = stubFalse;
184695
- freeExports$2 = typeof exports_src_B6O9kkNF_es == "object" && exports_src_B6O9kkNF_es && !exports_src_B6O9kkNF_es.nodeType && exports_src_B6O9kkNF_es;
184696
- freeModule$2 = freeExports$2 && typeof module_src_B6O9kkNF_es == "object" && module_src_B6O9kkNF_es && !module_src_B6O9kkNF_es.nodeType && module_src_B6O9kkNF_es;
184921
+ freeExports$2 = typeof exports_src_Cl9CKlDG_es == "object" && exports_src_Cl9CKlDG_es && !exports_src_Cl9CKlDG_es.nodeType && exports_src_Cl9CKlDG_es;
184922
+ freeModule$2 = freeExports$2 && typeof module_src_Cl9CKlDG_es == "object" && module_src_Cl9CKlDG_es && !module_src_Cl9CKlDG_es.nodeType && module_src_Cl9CKlDG_es;
184697
184923
  Buffer$1 = freeModule$2 && freeModule$2.exports === freeExports$2 ? _root_default.Buffer : undefined;
184698
184924
  isBuffer_default = (Buffer$1 ? Buffer$1.isBuffer : undefined) || stubFalse_default;
184699
184925
  typedArrayTags = {};
@@ -184701,8 +184927,8 @@ function print() { __p += __j.call(arguments, '') }
184701
184927
  typedArrayTags[argsTag$1] = typedArrayTags[arrayTag$1] = typedArrayTags[arrayBufferTag$1] = typedArrayTags[boolTag$1] = typedArrayTags[dataViewTag$2] = typedArrayTags[dateTag$1] = typedArrayTags[errorTag$1] = typedArrayTags[funcTag] = typedArrayTags[mapTag$2] = typedArrayTags[numberTag$1] = typedArrayTags[objectTag$3] = typedArrayTags[regexpTag$1] = typedArrayTags[setTag$2] = typedArrayTags[stringTag$1] = typedArrayTags[weakMapTag$1] = false;
184702
184928
  _baseIsTypedArray_default = baseIsTypedArray;
184703
184929
  _baseUnary_default = baseUnary;
184704
- freeExports$1 = typeof exports_src_B6O9kkNF_es == "object" && exports_src_B6O9kkNF_es && !exports_src_B6O9kkNF_es.nodeType && exports_src_B6O9kkNF_es;
184705
- freeModule$1 = freeExports$1 && typeof module_src_B6O9kkNF_es == "object" && module_src_B6O9kkNF_es && !module_src_B6O9kkNF_es.nodeType && module_src_B6O9kkNF_es;
184930
+ freeExports$1 = typeof exports_src_Cl9CKlDG_es == "object" && exports_src_Cl9CKlDG_es && !exports_src_Cl9CKlDG_es.nodeType && exports_src_Cl9CKlDG_es;
184931
+ freeModule$1 = freeExports$1 && typeof module_src_Cl9CKlDG_es == "object" && module_src_Cl9CKlDG_es && !module_src_Cl9CKlDG_es.nodeType && module_src_Cl9CKlDG_es;
184706
184932
  freeProcess = freeModule$1 && freeModule$1.exports === freeExports$1 && _freeGlobal_default.process;
184707
184933
  _nodeUtil_default = function() {
184708
184934
  try {
@@ -184807,8 +185033,8 @@ function print() { __p += __j.call(arguments, '') }
184807
185033
  Stack.prototype.has = _stackHas_default;
184808
185034
  Stack.prototype.set = _stackSet_default;
184809
185035
  _Stack_default = Stack;
184810
- freeExports = typeof exports_src_B6O9kkNF_es == "object" && exports_src_B6O9kkNF_es && !exports_src_B6O9kkNF_es.nodeType && exports_src_B6O9kkNF_es;
184811
- freeModule = freeExports && typeof module_src_B6O9kkNF_es == "object" && module_src_B6O9kkNF_es && !module_src_B6O9kkNF_es.nodeType && module_src_B6O9kkNF_es;
185036
+ freeExports = typeof exports_src_Cl9CKlDG_es == "object" && exports_src_Cl9CKlDG_es && !exports_src_Cl9CKlDG_es.nodeType && exports_src_Cl9CKlDG_es;
185037
+ freeModule = freeExports && typeof module_src_Cl9CKlDG_es == "object" && module_src_Cl9CKlDG_es && !module_src_Cl9CKlDG_es.nodeType && module_src_Cl9CKlDG_es;
184812
185038
  Buffer4 = freeModule && freeModule.exports === freeExports ? _root_default.Buffer : undefined;
184813
185039
  allocUnsafe = Buffer4 ? Buffer4.allocUnsafe : undefined;
184814
185040
  _cloneBuffer_default = cloneBuffer;
@@ -192427,8 +192653,8 @@ var init_zipper_BJHqrQMq_es = __esm(() => {
192427
192653
 
192428
192654
  // ../../packages/superdoc/dist/super-editor.es.js
192429
192655
  var init_super_editor_es = __esm(() => {
192430
- init_src_B6O9kkNF_es();
192431
- init_SuperConverter_BxBclpFg_es();
192656
+ init_src_Cl9CKlDG_es();
192657
+ init_SuperConverter_DFpPWkcl_es();
192432
192658
  init_jszip_ChlR43oI_es();
192433
192659
  init_xml_js_DLE8mr0n_es();
192434
192660
  init_constants_DBKi0Amm_es();
@@ -193116,7 +193342,7 @@ function addNode2(child, target) {
193116
193342
  else
193117
193343
  target.push(child);
193118
193344
  }
193119
- function addRange3($start, $end, depth, target) {
193345
+ function addRange2($start, $end, depth, target) {
193120
193346
  let node3 = ($end || $start).node(depth);
193121
193347
  let startIndex = 0, endIndex = $end ? $end.index(depth) : node3.childCount;
193122
193348
  if ($start) {
@@ -193141,28 +193367,28 @@ function replaceThreeWay2($from, $start, $end, $to, depth) {
193141
193367
  let openStart = $from.depth > depth && joinable2($from, $start, depth + 1);
193142
193368
  let openEnd = $to.depth > depth && joinable2($end, $to, depth + 1);
193143
193369
  let content2 = [];
193144
- addRange3(null, $from, depth, content2);
193370
+ addRange2(null, $from, depth, content2);
193145
193371
  if (openStart && openEnd && $start.index(depth) == $end.index(depth)) {
193146
193372
  checkJoin2(openStart, openEnd);
193147
193373
  addNode2(close2(openStart, replaceThreeWay2($from, $start, $end, $to, depth + 1)), content2);
193148
193374
  } else {
193149
193375
  if (openStart)
193150
193376
  addNode2(close2(openStart, replaceTwoWay2($from, $start, depth + 1)), content2);
193151
- addRange3($start, $end, depth, content2);
193377
+ addRange2($start, $end, depth, content2);
193152
193378
  if (openEnd)
193153
193379
  addNode2(close2(openEnd, replaceTwoWay2($end, $to, depth + 1)), content2);
193154
193380
  }
193155
- addRange3($to, null, depth, content2);
193381
+ addRange2($to, null, depth, content2);
193156
193382
  return new Fragment4(content2);
193157
193383
  }
193158
193384
  function replaceTwoWay2($from, $to, depth) {
193159
193385
  let content2 = [];
193160
- addRange3(null, $from, depth, content2);
193386
+ addRange2(null, $from, depth, content2);
193161
193387
  if ($from.depth > depth) {
193162
193388
  let type = joinable2($from, $to, depth + 1);
193163
193389
  addNode2(close2(type, replaceTwoWay2($from, $to, depth + 1)), content2);
193164
193390
  }
193165
- addRange3($to, null, depth, content2);
193391
+ addRange2($to, null, depth, content2);
193166
193392
  return new Fragment4(content2);
193167
193393
  }
193168
193394
  function prepareSliceForReplace2(slice2, $along) {
@@ -197829,7 +198055,12 @@ function checkRevision2(editor, expectedRevision) {
197829
198055
  return;
197830
198056
  const current = getRevision2(editor);
197831
198057
  if (expectedRevision !== current) {
197832
- throw new PlanError2("REVISION_MISMATCH", `REVISION_MISMATCH — expected revision "${expectedRevision}" but document is at "${current}"`, undefined, { expectedRevision, currentRevision: current });
198058
+ throw new PlanError2("REVISION_MISMATCH", `REVISION_MISMATCH — expected revision "${expectedRevision}" but document is at "${current}". Re-run query.match to obtain a fresh ref.`, undefined, {
198059
+ expectedRevision,
198060
+ currentRevision: current,
198061
+ refStability: "ephemeral",
198062
+ remediation: "Re-run query.match() to obtain a fresh ref valid for the current revision."
198063
+ });
197833
198064
  }
197834
198065
  }
197835
198066
  var revisionMap2, subscribedEditors2;
@@ -198091,7 +198322,9 @@ function captureRunsInRange2(editor, blockPos, from3, to) {
198091
198322
  return;
198092
198323
  }
198093
198324
  if (node3.isLeaf) {
198325
+ const start2 = offset2;
198094
198326
  offset2 += 1;
198327
+ maybePushRun(start2, offset2, []);
198095
198328
  return;
198096
198329
  }
198097
198330
  let isFirstChild = true;
@@ -198604,12 +198837,73 @@ var init_block_strategy = __esm(() => {
198604
198837
  function isAssertStep2(step) {
198605
198838
  return step.op === "assert";
198606
198839
  }
198840
+ function isCreateOp2(op) {
198841
+ return op === "create.heading" || op === "create.paragraph";
198842
+ }
198607
198843
  function isSelectWhere2(where) {
198608
198844
  return where.by === "select";
198609
198845
  }
198610
198846
  function isRefWhere2(where) {
198611
198847
  return where.by === "ref";
198612
198848
  }
198849
+ function validateCreateStepPosition2(step) {
198850
+ const args3 = step.args;
198851
+ if (args3.position === undefined || args3.position === null) {
198852
+ args3.position = "after";
198853
+ return;
198854
+ }
198855
+ if (!VALID_CREATE_POSITIONS2.includes(args3.position)) {
198856
+ throw planError2("INVALID_INPUT", `create step requires args.position to be 'before' or 'after'`, step.id, {
198857
+ receivedPosition: args3.position,
198858
+ allowedValues: [...VALID_CREATE_POSITIONS2],
198859
+ default: "after"
198860
+ });
198861
+ }
198862
+ }
198863
+ function resolveCreateAnchorFromTargets2(targets, position4, stepId) {
198864
+ const target = targets[0];
198865
+ if (!target)
198866
+ throw planError2("INVALID_INPUT", "create step has no resolved targets", stepId);
198867
+ if (target.kind === "range")
198868
+ return target.blockId;
198869
+ const segments = target.segments;
198870
+ if (!segments.length)
198871
+ throw planError2("INVALID_INPUT", "span target has no segments", stepId);
198872
+ return position4 === "before" ? segments[0].blockId : segments[segments.length - 1].blockId;
198873
+ }
198874
+ function validateInsertionContext2(editor, index2, step, stepIndex, anchorBlockId, position4) {
198875
+ const candidate = index2.candidates.find((c2) => c2.nodeId === anchorBlockId);
198876
+ if (!candidate)
198877
+ return;
198878
+ const paragraphType = editor.state.schema?.nodes?.paragraph;
198879
+ if (!paragraphType)
198880
+ return;
198881
+ const resolvedPos = editor.state.doc.resolve(candidate.pos);
198882
+ const parent = resolvedPos.parent;
198883
+ const anchorIndex = resolvedPos.index();
198884
+ const insertionIndex = position4 === "before" ? anchorIndex : anchorIndex + 1;
198885
+ const canInsert = typeof parent.canReplaceWith === "function" ? parent.canReplaceWith(insertionIndex, insertionIndex, paragraphType) : parent.type.contentMatch.matchType(paragraphType);
198886
+ if (!canInsert) {
198887
+ const allowedChildTypes = [];
198888
+ const match2 = parent.type.contentMatch;
198889
+ for (const nodeType of Object.values(editor.state.schema.nodes)) {
198890
+ if (match2.matchType(nodeType)) {
198891
+ allowedChildTypes.push(nodeType.name);
198892
+ }
198893
+ }
198894
+ throw planError2("INVALID_INSERTION_CONTEXT", `Cannot create ${step.op} inside ${parent.type.name}`, step.id, {
198895
+ stepIndex,
198896
+ stepId: step.id,
198897
+ operation: step.op,
198898
+ anchorBlockId,
198899
+ parentType: parent.type.name,
198900
+ allowedChildTypes,
198901
+ insertionIndex,
198902
+ requestedChildType: "paragraph",
198903
+ requestedSemanticType: step.op === "create.heading" ? "heading" : "paragraph"
198904
+ });
198905
+ }
198906
+ }
198613
198907
  function isV3Ref2(payload) {
198614
198908
  return typeof payload === "object" && payload !== null && "v" in payload && payload.v === 3;
198615
198909
  }
@@ -198837,7 +199131,14 @@ function decodeTextRefPayload2(encoded, stepId) {
198837
199131
  function resolveV3TextRef2(editor, index2, step, refData) {
198838
199132
  const currentRevision = getRevision2(editor);
198839
199133
  if (refData.rev !== currentRevision) {
198840
- throw planError2("REVISION_MISMATCH", `text ref was created at revision "${refData.rev}" but document is at "${currentRevision}"`, step.id, { refRevision: refData.rev, currentRevision });
199134
+ throw planError2("REVISION_MISMATCH", `Text ref is ephemeral and revision-scoped. Re-run query.match to obtain a fresh handle.ref for revision ${currentRevision}.`, step.id, {
199135
+ refRevision: refData.rev,
199136
+ currentRevision,
199137
+ refStability: "ephemeral",
199138
+ refScope: refData.scope,
199139
+ blockId: refData.segments?.[0]?.blockId,
199140
+ remediation: `Re-run query.match() to obtain a fresh ref valid for the current revision.`
199141
+ });
198841
199142
  }
198842
199143
  if (!refData.segments?.length)
198843
199144
  return [];
@@ -198936,7 +199237,11 @@ function resolveStepTargets2(editor, index2, step) {
198936
199237
  });
198937
199238
  if (refWhere) {
198938
199239
  if (targets.length === 0) {
198939
- throw planError2("MATCH_NOT_FOUND", `ref "${refWhere.ref}" did not resolve to any targets`, step.id);
199240
+ throw planError2("MATCH_NOT_FOUND", `ref "${refWhere.ref}" did not resolve to any targets`, step.id, {
199241
+ selectorType: "ref",
199242
+ selectorPattern: refWhere.ref,
199243
+ candidateCount: 0
199244
+ });
198940
199245
  }
198941
199246
  if (targets.length > 1) {
198942
199247
  throw planError2("AMBIGUOUS_MATCH", `ref "${refWhere.ref}" resolved to ${targets.length} targets`, step.id, {
@@ -198955,6 +199260,18 @@ function resolveStepTargets2(editor, index2, step) {
198955
199260
  }
198956
199261
  return targets;
198957
199262
  }
199263
+ function buildMatchNotFoundDetails2(step) {
199264
+ const where = step.where;
199265
+ const select2 = "select" in where ? where.select : undefined;
199266
+ const within2 = "within" in where ? where.within : undefined;
199267
+ return {
199268
+ selectorType: select2?.type ?? "unknown",
199269
+ selectorPattern: select2?.pattern ?? "",
199270
+ selectorMode: select2?.mode ?? "contains",
199271
+ searchScope: within2?.blockId ?? "document",
199272
+ candidateCount: 0
199273
+ };
199274
+ }
198958
199275
  function applyCardinalityCheck2(step, targets) {
198959
199276
  const where = step.where;
198960
199277
  if (!("require" in where) || where.require === undefined)
@@ -198962,11 +199279,11 @@ function applyCardinalityCheck2(step, targets) {
198962
199279
  const require2 = where.require;
198963
199280
  if (require2 === "first") {
198964
199281
  if (targets.length === 0) {
198965
- throw planError2("MATCH_NOT_FOUND", "selector matched zero ranges", step.id);
199282
+ throw planError2("MATCH_NOT_FOUND", "selector matched zero ranges", step.id, buildMatchNotFoundDetails2(step));
198966
199283
  }
198967
199284
  } else if (require2 === "exactlyOne") {
198968
199285
  if (targets.length === 0) {
198969
- throw planError2("MATCH_NOT_FOUND", "selector matched zero ranges", step.id);
199286
+ throw planError2("MATCH_NOT_FOUND", "selector matched zero ranges", step.id, buildMatchNotFoundDetails2(step));
198970
199287
  }
198971
199288
  if (targets.length > 1) {
198972
199289
  throw planError2("AMBIGUOUS_MATCH", `selector matched ${targets.length} ranges, expected exactly one`, step.id, {
@@ -198975,47 +199292,119 @@ function applyCardinalityCheck2(step, targets) {
198975
199292
  }
198976
199293
  } else if (require2 === "all") {
198977
199294
  if (targets.length === 0) {
198978
- throw planError2("MATCH_NOT_FOUND", "selector matched zero ranges", step.id);
199295
+ throw planError2("MATCH_NOT_FOUND", "selector matched zero ranges", step.id, buildMatchNotFoundDetails2(step));
198979
199296
  }
198980
199297
  }
198981
199298
  }
198982
- function detectOverlaps2(steps) {
198983
- const rangesByBlock = new Map;
198984
- for (const compiled of steps) {
198985
- for (const target of compiled.targets) {
198986
- if (target.kind === "range") {
198987
- addRange4(rangesByBlock, target.blockId, target.stepId, target.from, target.to);
198988
- } else {
198989
- for (const seg of target.segments) {
198990
- addRange4(rangesByBlock, seg.blockId, target.stepId, seg.from, seg.to);
199299
+ function normalizeOpForMatrix2(op) {
199300
+ return op.startsWith("create.") ? "create.*" : op;
199301
+ }
199302
+ function classifyOverlap2(stepA, stepB) {
199303
+ const rangesA = extractBlockRanges2(stepA);
199304
+ const rangesB = extractBlockRanges2(stepB);
199305
+ const opA = normalizeOpForMatrix2(stepA.step.op);
199306
+ const opB = normalizeOpForMatrix2(stepB.step.op);
199307
+ const isCreateA = opA === "create.*";
199308
+ const isCreateB = opB === "create.*";
199309
+ for (const [blockId, aEntries] of rangesA) {
199310
+ const bEntries = rangesB.get(blockId);
199311
+ if (!bEntries)
199312
+ continue;
199313
+ for (const a2 of aEntries) {
199314
+ for (const b3 of bEntries) {
199315
+ if (isCreateA || isCreateB) {
199316
+ return { overlapClass: "same_block", blockId, rangeA: a2, rangeB: b3 };
198991
199317
  }
199318
+ if (a2.to <= b3.from || b3.to <= a2.from)
199319
+ continue;
199320
+ if (a2.from === b3.from && a2.to === b3.to) {
199321
+ return { overlapClass: "same_target", blockId, rangeA: a2, rangeB: b3 };
199322
+ }
199323
+ return { overlapClass: "overlapping", blockId, rangeA: a2, rangeB: b3 };
199324
+ }
199325
+ }
199326
+ }
199327
+ return;
199328
+ }
199329
+ function extractBlockRanges2(compiled) {
199330
+ const result = new Map;
199331
+ for (const target of compiled.targets) {
199332
+ if (target.kind === "range") {
199333
+ pushBlockRange2(result, target.blockId, target.from, target.to);
199334
+ } else {
199335
+ for (const seg of target.segments) {
199336
+ pushBlockRange2(result, seg.blockId, seg.from, seg.to);
198992
199337
  }
198993
199338
  }
198994
199339
  }
198995
- for (const [blockId, ranges] of rangesByBlock) {
198996
- ranges.sort((a2, b3) => a2.from - b3.from);
198997
- for (let i4 = 1;i4 < ranges.length; i4++) {
198998
- const prev = ranges[i4 - 1];
198999
- const curr = ranges[i4];
199000
- if (prev.stepId !== curr.stepId && prev.to > curr.from) {
199001
- throw planError2("PLAN_CONFLICT_OVERLAP", `steps "${prev.stepId}" and "${curr.stepId}" target overlapping ranges in block "${blockId}"`, curr.stepId, { blockId, rangeA: { from: prev.from, to: prev.to }, rangeB: { from: curr.from, to: curr.to } });
199340
+ return result;
199341
+ }
199342
+ function pushBlockRange2(map6, blockId, from3, to) {
199343
+ let entries = map6.get(blockId);
199344
+ if (!entries) {
199345
+ entries = [];
199346
+ map6.set(blockId, entries);
199347
+ }
199348
+ entries.push({ from: from3, to });
199349
+ }
199350
+ function validateStepInteractions2(steps) {
199351
+ for (let i4 = 0;i4 < steps.length; i4++) {
199352
+ for (let j2 = i4 + 1;j2 < steps.length; j2++) {
199353
+ const stepA = steps[i4];
199354
+ const stepB = steps[j2];
199355
+ if (MATRIX_EXEMPT_OPS2.has(stepA.step.op) || MATRIX_EXEMPT_OPS2.has(stepB.step.op))
199356
+ continue;
199357
+ const overlap = classifyOverlap2(stepA, stepB);
199358
+ if (!overlap)
199359
+ continue;
199360
+ const opA = normalizeOpForMatrix2(stepA.step.op);
199361
+ const opB = normalizeOpForMatrix2(stepB.step.op);
199362
+ const matrixKey = `${opA}::${opB}::${overlap.overlapClass}`;
199363
+ const verdict = STEP_INTERACTION_MATRIX2.get(matrixKey) ?? "reject";
199364
+ if (verdict === "reject") {
199365
+ throw planError2("PLAN_CONFLICT_OVERLAP", `steps "${stepA.step.id}" and "${stepB.step.id}" target overlapping ranges in block "${overlap.blockId}"`, stepB.step.id, {
199366
+ blockId: overlap.blockId,
199367
+ stepIdA: stepA.step.id,
199368
+ stepIdB: stepB.step.id,
199369
+ opKeyA: stepA.step.op,
199370
+ opKeyB: stepB.step.op,
199371
+ rangeA: overlap.rangeA,
199372
+ rangeB: overlap.rangeB,
199373
+ overlapRegion: {
199374
+ from: Math.max(overlap.rangeA.from, overlap.rangeB.from),
199375
+ to: Math.min(overlap.rangeA.to, overlap.rangeB.to)
199376
+ },
199377
+ matrixVerdict: verdict,
199378
+ matrixKey
199379
+ });
199002
199380
  }
199003
199381
  }
199004
199382
  }
199005
199383
  }
199006
- function addRange4(map6, blockId, stepId, from3, to) {
199007
- let blockRanges = map6.get(blockId);
199008
- if (!blockRanges) {
199009
- blockRanges = [];
199010
- map6.set(blockId, blockRanges);
199384
+ function assertNoDuplicateBlockIds2(index2) {
199385
+ const seen = new Map;
199386
+ const duplicates = [];
199387
+ for (const candidate of index2.candidates) {
199388
+ const count = seen.get(candidate.nodeId) ?? 0;
199389
+ seen.set(candidate.nodeId, count + 1);
199390
+ if (count === 1)
199391
+ duplicates.push(candidate.nodeId);
199392
+ }
199393
+ if (duplicates.length > 0) {
199394
+ throw planError2("DOCUMENT_IDENTITY_CONFLICT", "Document contains blocks with duplicate identities. This must be resolved before mutations can be applied.", undefined, {
199395
+ duplicateBlockIds: duplicates,
199396
+ blockCount: duplicates.length,
199397
+ remediation: "Re-import the document or call document.repair() to assign unique identities."
199398
+ });
199011
199399
  }
199012
- blockRanges.push({ stepId, from: from3, to });
199013
199400
  }
199014
199401
  function compilePlan2(editor, steps) {
199015
199402
  if (steps.length > MAX_PLAN_STEPS) {
199016
199403
  throw planError2("INVALID_INPUT", `plan contains ${steps.length} steps, maximum is ${MAX_PLAN_STEPS}`);
199017
199404
  }
199405
+ const compiledRevision = getRevision2(editor);
199018
199406
  const index2 = getBlockIndex2(editor);
199407
+ assertNoDuplicateBlockIds2(index2);
199019
199408
  const mutationSteps = [];
199020
199409
  const assertSteps = [];
199021
199410
  const seenIds = new Set;
@@ -199029,25 +199418,36 @@ function compilePlan2(editor, steps) {
199029
199418
  seenIds.add(step.id);
199030
199419
  }
199031
199420
  let totalTargets = 0;
199421
+ let stepIndex = 0;
199032
199422
  for (const step of steps) {
199033
199423
  if (isAssertStep2(step)) {
199034
199424
  assertSteps.push(step);
199425
+ stepIndex++;
199035
199426
  continue;
199036
199427
  }
199037
199428
  if (!hasStepExecutor2(step.op)) {
199038
199429
  throw planError2("INVALID_INPUT", `unknown step op "${step.op}"`, step.id);
199039
199430
  }
199431
+ if (isCreateOp2(step.op)) {
199432
+ validateCreateStepPosition2(step);
199433
+ }
199040
199434
  const targets = resolveStepTargets2(editor, index2, step);
199435
+ if (isCreateOp2(step.op) && targets.length > 0) {
199436
+ const position4 = step.args.position ?? "after";
199437
+ const anchorBlockId = resolveCreateAnchorFromTargets2(targets, position4, step.id);
199438
+ validateInsertionContext2(editor, index2, step, stepIndex, anchorBlockId, position4);
199439
+ }
199041
199440
  totalTargets += targets.length;
199042
199441
  mutationSteps.push({ step, targets });
199442
+ stepIndex++;
199043
199443
  }
199044
199444
  if (totalTargets > MAX_PLAN_RESOLVED_TARGETS) {
199045
199445
  throw planError2("INVALID_INPUT", `plan resolved ${totalTargets} total targets, maximum is ${MAX_PLAN_RESOLVED_TARGETS}`);
199046
199446
  }
199047
- detectOverlaps2(mutationSteps);
199048
- return { mutationSteps, assertSteps };
199447
+ validateStepInteractions2(mutationSteps);
199448
+ return { mutationSteps, assertSteps, compiledRevision };
199049
199449
  }
199050
- var REF_HANDLERS2;
199450
+ var VALID_CREATE_POSITIONS2, REF_HANDLERS2, STEP_INTERACTION_MATRIX2, MATRIX_EXEMPT_OPS2;
199051
199451
  var init_compiler = __esm(() => {
199052
199452
  init_src();
199053
199453
  init_errors4();
@@ -199058,6 +199458,7 @@ var init_compiler = __esm(() => {
199058
199458
  init_text_strategy();
199059
199459
  init_block_strategy();
199060
199460
  init_node_address_resolver();
199461
+ VALID_CREATE_POSITIONS2 = ["before", "after"];
199061
199462
  REF_HANDLERS2 = [
199062
199463
  { prefix: "text:", handler: resolveTextRef2 },
199063
199464
  {
@@ -199074,6 +199475,48 @@ var init_compiler = __esm(() => {
199074
199475
  },
199075
199476
  { prefix: "", handler: resolveBlockRef2 }
199076
199477
  ];
199478
+ STEP_INTERACTION_MATRIX2 = new Map([
199479
+ ["text.rewrite::format.apply::same_target", "allow"],
199480
+ ["text.rewrite::text.rewrite::same_target", "reject"],
199481
+ ["text.rewrite::text.delete::overlapping", "reject"],
199482
+ ["text.rewrite::create.*::same_block", "allow"],
199483
+ ["text.rewrite::text.insert::same_target", "reject"],
199484
+ ["format.apply::format.apply::same_target", "allow"],
199485
+ ["format.apply::text.rewrite::same_target", "reject"],
199486
+ ["format.apply::text.delete::overlapping", "reject"],
199487
+ ["format.apply::create.*::same_block", "allow"],
199488
+ ["format.apply::text.insert::same_target", "allow"],
199489
+ ["text.delete::text.rewrite::overlapping", "reject"],
199490
+ ["text.delete::text.delete::overlapping", "reject"],
199491
+ ["text.delete::format.apply::overlapping", "reject"],
199492
+ ["text.delete::create.*::same_block", "allow"],
199493
+ ["text.delete::text.insert::overlapping", "reject"],
199494
+ ["create.*::text.rewrite::same_block", "allow"],
199495
+ ["create.*::format.apply::same_block", "allow"],
199496
+ ["create.*::text.delete::same_block", "allow"],
199497
+ ["create.*::create.*::same_block", "allow"],
199498
+ ["create.*::text.insert::same_block", "allow"],
199499
+ ["text.insert::format.apply::same_target", "allow"],
199500
+ ["text.insert::text.rewrite::same_target", "reject"],
199501
+ ["text.insert::text.delete::overlapping", "reject"],
199502
+ ["text.insert::create.*::same_block", "allow"],
199503
+ ["text.insert::text.insert::same_target", "reject"]
199504
+ ]);
199505
+ MATRIX_EXEMPT_OPS2 = new Set(["assert"]);
199506
+ });
199507
+
199508
+ // ../../packages/super-editor/src/document-api-adapters/plan-engine/create-insertion.ts
199509
+ function resolveBlockInsertionPos2(editor, anchorBlockId, position4, stepId) {
199510
+ const index2 = getBlockIndex2(editor);
199511
+ const candidate = index2.candidates.find((c2) => c2.nodeId === anchorBlockId);
199512
+ if (!candidate) {
199513
+ throw planError2("TARGET_NOT_FOUND", `block "${anchorBlockId}" not found`, stepId);
199514
+ }
199515
+ return position4 === "before" ? candidate.pos : candidate.end;
199516
+ }
199517
+ var init_create_insertion = __esm(() => {
199518
+ init_index_cache();
199519
+ init_errors4();
199077
199520
  });
199078
199521
 
199079
199522
  // ../../packages/super-editor/src/document-api-adapters/helpers/transaction-meta.ts
@@ -199141,12 +199584,36 @@ function buildMarksFromSetMarks2(editor, setMarks) {
199141
199584
  marks.push(schema.marks.strike.create());
199142
199585
  return marks;
199143
199586
  }
199144
- function toAbsoluteBlockInsertPos2(editor, blockId, offset2, stepId) {
199145
- const index2 = getBlockIndex2(editor);
199146
- const candidate = index2.candidates.find((c2) => c2.nodeId === blockId);
199147
- if (!candidate)
199148
- throw planError2("TARGET_NOT_FOUND", `block "${blockId}" not found`, stepId);
199149
- return candidate.pos + offset2;
199587
+ function applyInlineMarkPatches2(editor, tr, absFrom, absTo, inline) {
199588
+ const { schema } = editor.state;
199589
+ let changed = false;
199590
+ const markEntries = [
199591
+ [inline.bold, schema.marks.bold],
199592
+ [inline.italic, schema.marks.italic],
199593
+ [inline.underline, schema.marks.underline],
199594
+ [inline.strike, schema.marks.strike]
199595
+ ];
199596
+ for (const [value, markType] of markEntries) {
199597
+ if (value === undefined || !markType)
199598
+ continue;
199599
+ if (value) {
199600
+ tr.addMark(absFrom, absTo, markType.create());
199601
+ } else {
199602
+ tr.removeMark(absFrom, absTo, markType);
199603
+ }
199604
+ changed = true;
199605
+ }
199606
+ return changed;
199607
+ }
199608
+ function resolveCreateAnchorBlockId2(target, position4, stepId) {
199609
+ if (target.kind === "range") {
199610
+ return target.blockId;
199611
+ }
199612
+ const segments = target.segments;
199613
+ if (!segments.length) {
199614
+ throw planError2("INVALID_INPUT", "span target has no segments", stepId);
199615
+ }
199616
+ return position4 === "before" ? segments[0].blockId : segments[segments.length - 1].blockId;
199150
199617
  }
199151
199618
  function executeTextRewrite2(editor, tr, target, step, mapping) {
199152
199619
  const absFrom = mapping.map(target.absFrom);
@@ -199193,25 +199660,7 @@ function executeTextDelete2(_editor, tr, target, _step, mapping) {
199193
199660
  function executeStyleApply3(editor, tr, target, step, mapping) {
199194
199661
  const absFrom = mapping.map(target.absFrom);
199195
199662
  const absTo = mapping.map(target.absTo);
199196
- const { schema } = editor.state;
199197
- let changed = false;
199198
- const markEntries = [
199199
- ["bold", step.args.inline.bold, schema.marks.bold],
199200
- ["italic", step.args.inline.italic, schema.marks.italic],
199201
- ["underline", step.args.inline.underline, schema.marks.underline],
199202
- ["strike", step.args.inline.strike, schema.marks.strike]
199203
- ];
199204
- for (const [, value, markType] of markEntries) {
199205
- if (value === undefined || !markType)
199206
- continue;
199207
- if (value) {
199208
- tr.addMark(absFrom, absTo, markType.create());
199209
- } else {
199210
- tr.removeMark(absFrom, absTo, markType);
199211
- }
199212
- changed = true;
199213
- }
199214
- return { changed };
199663
+ return { changed: applyInlineMarkPatches2(editor, tr, absFrom, absTo, step.args.inline) };
199215
199664
  }
199216
199665
  function validateMappedSpanContiguity2(target, mapping, stepId) {
199217
199666
  let lastMappedEnd = -1;
@@ -199282,29 +199731,11 @@ function executeSpanTextDelete2(_editor, tr, target, step, mapping) {
199282
199731
  }
199283
199732
  function executeSpanStyleApply2(editor, tr, target, step, mapping) {
199284
199733
  validateMappedSpanContiguity2(target, mapping, step.id);
199285
- const { schema } = editor.state;
199286
- let changed = false;
199287
199734
  const firstSeg = target.segments[0];
199288
199735
  const lastSeg = target.segments[target.segments.length - 1];
199289
199736
  const absFrom = mapping.map(firstSeg.absFrom, 1);
199290
199737
  const absTo = mapping.map(lastSeg.absTo, -1);
199291
- const markEntries = [
199292
- ["bold", step.args.inline.bold, schema.marks.bold],
199293
- ["italic", step.args.inline.italic, schema.marks.italic],
199294
- ["underline", step.args.inline.underline, schema.marks.underline],
199295
- ["strike", step.args.inline.strike, schema.marks.strike]
199296
- ];
199297
- for (const [, value, markType] of markEntries) {
199298
- if (value === undefined || !markType)
199299
- continue;
199300
- if (value) {
199301
- tr.addMark(absFrom, absTo, markType.create());
199302
- } else {
199303
- tr.removeMark(absFrom, absTo, markType);
199304
- }
199305
- changed = true;
199306
- }
199307
- return { changed };
199738
+ return { changed: applyInlineMarkPatches2(editor, tr, absFrom, absTo, step.args.inline) };
199308
199739
  }
199309
199740
  function getReplacementText2(replacement) {
199310
199741
  if (replacement.blocks !== undefined) {
@@ -199503,11 +199934,14 @@ function executeAssertStep2(_editor, tr, step) {
199503
199934
  }
199504
199935
  function executeCreateStep2(editor, tr, step, targets, mapping) {
199505
199936
  const target = targets[0];
199506
- if (!target || target.kind !== "range") {
199507
- throw planError2("INVALID_INPUT", `${step.op} step requires exactly one range target`, step.id);
199937
+ if (!target) {
199938
+ throw planError2("INVALID_INPUT", `${step.op} step requires at least one target`, step.id);
199508
199939
  }
199509
199940
  const args3 = step.args;
199510
- const pos = mapping.map(toAbsoluteBlockInsertPos2(editor, target.blockId, target.from, step.id));
199941
+ const position4 = args3.position ?? "after";
199942
+ const anchorBlockId = resolveCreateAnchorBlockId2(target, position4, step.id);
199943
+ const anchorPos = resolveBlockInsertionPos2(editor, anchorBlockId, position4, step.id);
199944
+ const pos = mapping.map(anchorPos);
199511
199945
  const paragraphType = editor.state.schema?.nodes?.paragraph;
199512
199946
  if (!paragraphType) {
199513
199947
  throw planError2("INVALID_INPUT", "paragraph node type not in schema", step.id);
@@ -199530,6 +199964,7 @@ function executeCreateStep2(editor, tr, step, targets, mapping) {
199530
199964
  throw planError2("INVALID_INPUT", `could not create ${step.op} node`, step.id);
199531
199965
  }
199532
199966
  tr.insert(pos, node3);
199967
+ assertNoPostInsertDuplicateIds2(tr.doc, step.id);
199533
199968
  return {
199534
199969
  stepId: step.id,
199535
199970
  op: step.op,
@@ -199538,6 +199973,32 @@ function executeCreateStep2(editor, tr, step, targets, mapping) {
199538
199973
  data: { domain: "text", resolutions: [] }
199539
199974
  };
199540
199975
  }
199976
+ function assertNoPostInsertDuplicateIds2(doc4, stepId) {
199977
+ const seen = new Set;
199978
+ const duplicateSet = new Set;
199979
+ doc4.descendants((node3) => {
199980
+ if (!node3.isTextblock)
199981
+ return true;
199982
+ const attrs = node3.attrs ?? {};
199983
+ const id2 = typeof attrs.paraId === "string" && attrs.paraId || typeof attrs.sdBlockId === "string" && attrs.sdBlockId || typeof attrs.nodeId === "string" && attrs.nodeId;
199984
+ if (!id2)
199985
+ return true;
199986
+ if (seen.has(id2)) {
199987
+ duplicateSet.add(id2);
199988
+ } else {
199989
+ seen.add(id2);
199990
+ }
199991
+ return true;
199992
+ });
199993
+ if (duplicateSet.size > 0) {
199994
+ const duplicates = [...duplicateSet];
199995
+ throw planError2("INTERNAL_ERROR", `create step produced duplicate block identities: [${duplicates.join(", ")}]`, stepId, {
199996
+ source: "executor:checkPostInsertIdentityUniqueness",
199997
+ invariant: "post-insert block IDs must be unique",
199998
+ duplicateBlockIds: duplicates
199999
+ });
200000
+ }
200001
+ }
199541
200002
  function runMutationsOnTransaction2(editor, tr, compiled, options) {
199542
200003
  const mapping = tr.mapping;
199543
200004
  const stepOutcomes = [];
@@ -199586,6 +200047,15 @@ function executeCompiledPlan2(editor, compiled, options = {}) {
199586
200047
  const startTime = performance.now();
199587
200048
  const revisionBefore = getRevision2(editor);
199588
200049
  checkRevision2(editor, options.expectedRevision);
200050
+ if (compiled.compiledRevision !== revisionBefore) {
200051
+ throw planError2("REVISION_CHANGED_SINCE_COMPILE", `Document revision changed between compile and execute. Compiled at "${compiled.compiledRevision}", now at "${revisionBefore}".`, undefined, {
200052
+ compiledRevision: compiled.compiledRevision,
200053
+ currentRevision: revisionBefore,
200054
+ stepCount: compiled.mutationSteps.length,
200055
+ failedAtStep: "pre-execution",
200056
+ remediation: "Re-compile the plan against the current document state."
200057
+ });
200058
+ }
199589
200059
  const tr = editor.state.tr;
199590
200060
  const changeMode = options.changeMode ?? "direct";
199591
200061
  if (changeMode === "tracked") {
@@ -199626,6 +200096,7 @@ var init_executor = __esm(() => {
199626
200096
  init_revision_tracker();
199627
200097
  init_compiler();
199628
200098
  init_index_cache();
200099
+ init_create_insertion();
199629
200100
  init_style_resolver();
199630
200101
  init_node_address_resolver();
199631
200102
  init_adapter_utils();
@@ -199795,7 +200266,11 @@ function executeDomainCommand2(editor, handler2, options) {
199795
200266
  args: {},
199796
200267
  _handler: handler2
199797
200268
  };
199798
- const compiled = { mutationSteps: [{ step, targets: [] }], assertSteps: [] };
200269
+ const compiled = {
200270
+ mutationSteps: [{ step, targets: [] }],
200271
+ assertSteps: [],
200272
+ compiledRevision: getRevision2(editor)
200273
+ };
199799
200274
  return executeCompiledPlan2(editor, compiled, { expectedRevision: options?.expectedRevision });
199800
200275
  }
199801
200276
  function validateWriteRequest2(request, resolved) {
@@ -199871,7 +200346,8 @@ function writeWrapper2(editor, request, options) {
199871
200346
  const target = toCompiledTarget2(stepId, op, resolved);
199872
200347
  const compiled = {
199873
200348
  mutationSteps: [{ step, targets: [target] }],
199874
- assertSteps: []
200349
+ assertSteps: [],
200350
+ compiledRevision: getRevision2(editor)
199875
200351
  };
199876
200352
  const receipt2 = executeCompiledPlan2(editor, compiled, {
199877
200353
  changeMode: mode,
@@ -199935,7 +200411,8 @@ function styleApplyWrapper2(editor, input2, options) {
199935
200411
  };
199936
200412
  const compiled = {
199937
200413
  mutationSteps: [{ step, targets: [target] }],
199938
- assertSteps: []
200414
+ assertSteps: [],
200415
+ compiledRevision: getRevision2(editor)
199939
200416
  };
199940
200417
  const receipt2 = executeCompiledPlan2(editor, compiled, {
199941
200418
  changeMode: mode,
@@ -199947,6 +200424,7 @@ var STUB_WHERE2, MARK_KEY_TO_SCHEMA_NAME2;
199947
200424
  var init_plan_wrappers = __esm(() => {
199948
200425
  init_wrapper();
199949
200426
  init_executor();
200427
+ init_revision_tracker();
199950
200428
  init_errors3();
199951
200429
  init_adapter_utils();
199952
200430
  init_mutation_helpers();
@@ -201067,14 +201545,7 @@ function resolveCreateInsertPosition2(editor, at, operationLabel) {
201067
201545
  return 0;
201068
201546
  if (location3.kind === "documentEnd")
201069
201547
  return editor.state.doc.content.size;
201070
- const index2 = getBlockIndex2(editor);
201071
- const target = findBlockById2(index2, location3.target);
201072
- if (!target) {
201073
- throw new DocumentApiAdapterError3("TARGET_NOT_FOUND", `Create ${operationLabel} target block was not found.`, {
201074
- target: location3.target
201075
- });
201076
- }
201077
- return location3.kind === "before" ? target.pos : target.end;
201548
+ return resolveBlockInsertionPos2(editor, location3.target.nodeId, location3.kind);
201078
201549
  }
201079
201550
  function resolveCreatedBlock2(editor, nodeType, blockId) {
201080
201551
  const index2 = getBlockIndex2(editor);
@@ -201180,7 +201651,10 @@ function createParagraphWrapper2(editor, input2, options) {
201180
201651
  if (mode === "tracked") {
201181
201652
  trackedChangeRefs = collectTrackInsertRefsInRange2(editor, paragraph2.pos, paragraph2.end);
201182
201653
  }
201183
- } catch {}
201654
+ } catch (e) {
201655
+ if (!(e instanceof DocumentApiAdapterError3))
201656
+ throw e;
201657
+ }
201184
201658
  }
201185
201659
  return didApply;
201186
201660
  }, { expectedRevision: options?.expectedRevision });
@@ -201249,7 +201723,10 @@ function createHeadingWrapper2(editor, input2, options) {
201249
201723
  if (mode === "tracked") {
201250
201724
  trackedChangeRefs = collectTrackInsertRefsInRange2(editor, heading3.pos, heading3.end);
201251
201725
  }
201252
- } catch {}
201726
+ } catch (e) {
201727
+ if (!(e instanceof DocumentApiAdapterError3))
201728
+ throw e;
201729
+ }
201253
201730
  }
201254
201731
  return didApply;
201255
201732
  }, { expectedRevision: options?.expectedRevision });
@@ -201267,7 +201744,7 @@ function createHeadingWrapper2(editor, input2, options) {
201267
201744
  var init_create_wrappers = __esm(() => {
201268
201745
  init_wrapper();
201269
201746
  init_index_cache();
201270
- init_node_address_resolver();
201747
+ init_create_insertion();
201271
201748
  init_tracked_change_refs();
201272
201749
  init_errors3();
201273
201750
  init_mutation_helpers();
@@ -209435,7 +209912,9 @@ function decodeProperties2(params3, translatorsBySdName, properties) {
209435
209912
  if (translator5) {
209436
209913
  const result = translator5.decode({ ...params3, node: { attrs: { [key2]: properties[key2] } } });
209437
209914
  if (result != null) {
209438
- result.name = translator5.xmlName;
209915
+ if (result.name == null) {
209916
+ result.name = translator5.xmlName;
209917
+ }
209439
209918
  elements.push(result);
209440
209919
  }
209441
209920
  }
@@ -235692,7 +236171,6 @@ var init_track_changes_wrappers = __esm(() => {
235692
236171
 
235693
236172
  // ../../packages/super-editor/src/document-api-adapters/plan-engine/preview.ts
235694
236173
  function previewPlan2(editor, input2) {
235695
- const evaluatedRevision = getRevision2(editor);
235696
236174
  checkRevision2(editor, input2.expectedRevision);
235697
236175
  if (!input2.steps?.length) {
235698
236176
  throw planError2("INVALID_INPUT", "plan must contain at least one step");
@@ -235700,8 +236178,10 @@ function previewPlan2(editor, input2) {
235700
236178
  const failures = [];
235701
236179
  const stepPreviews = [];
235702
236180
  let currentPhase = "compile";
236181
+ let evaluatedRevision = getRevision2(editor);
235703
236182
  try {
235704
236183
  const compiled = compilePlan2(editor, input2.steps);
236184
+ evaluatedRevision = compiled.compiledRevision;
235705
236185
  currentPhase = "execute";
235706
236186
  const tr = editor.state.tr;
235707
236187
  const { stepOutcomes, assertFailures } = runMutationsOnTransaction2(editor, tr, compiled, {
@@ -236269,7 +236749,13 @@ function queryMatchAdapter2(editor, input2) {
236269
236749
  const paginatedMatches = isTextSelector ? applyPagination2(rawMatches, userOffset, input2.limit) : rawMatches;
236270
236750
  if (require2 === "first" || require2 === "exactlyOne" || require2 === "all") {
236271
236751
  if (totalMatches === 0) {
236272
- throw planError2("MATCH_NOT_FOUND", "selector matched zero ranges");
236752
+ throw planError2("MATCH_NOT_FOUND", "selector matched zero ranges", undefined, {
236753
+ selectorType: input2.select?.type ?? "unknown",
236754
+ selectorPattern: input2.select?.pattern ?? "",
236755
+ selectorMode: input2.select?.mode ?? "contains",
236756
+ searchScope: (input2.within?.kind === "block" ? input2.within.nodeId : undefined) ?? "document",
236757
+ candidateCount: 0
236758
+ });
236273
236759
  }
236274
236760
  }
236275
236761
  if (require2 === "exactlyOne" && totalMatches > 1) {
@@ -236282,7 +236768,11 @@ function queryMatchAdapter2(editor, input2) {
236282
236768
  if (isTextSelector && raw.textRanges?.length) {
236283
236769
  const blocks2 = buildMatchBlocks2(editor, raw.textRanges, evaluatedRevision, id2);
236284
236770
  if (blocks2.length === 0) {
236285
- throw planError2("INTERNAL_ERROR", `text match produced no blocks for ${id2}`);
236771
+ throw planError2("INTERNAL_ERROR", `text match produced no blocks for ${id2}`, undefined, {
236772
+ source: "query-match-adapter:buildMatchEntries",
236773
+ invariant: "text match must have at least one block after zero-width filtering",
236774
+ context: { matchId: id2 }
236775
+ });
236286
236776
  }
236287
236777
  const snippetResult = buildBlocksSnippet2(editor, blocks2);
236288
236778
  const segments = blocks2.map((b4) => ({ blockId: b4.blockId, start: b4.range.start, end: b4.range.end }));
@@ -239496,6 +239986,9 @@ function mapListsError(operationId, error, code7) {
239496
239986
  function mapTextMutationError(operationId, error, code7) {
239497
239987
  const message = extractErrorMessage(error);
239498
239988
  const details = extractErrorDetails(error);
239989
+ const planEngineError = tryMapPlanEngineError(operationId, error, code7);
239990
+ if (planEngineError)
239991
+ return planEngineError;
239499
239992
  if (code7 === "TARGET_NOT_FOUND") {
239500
239993
  return new CliError("TARGET_NOT_FOUND", message, { operationId, details });
239501
239994
  }
@@ -239515,6 +240008,9 @@ function mapTextMutationError(operationId, error, code7) {
239515
240008
  function mapCreateError(operationId, error, code7) {
239516
240009
  const message = extractErrorMessage(error);
239517
240010
  const details = extractErrorDetails(error);
240011
+ const planEngineError = tryMapPlanEngineError(operationId, error, code7);
240012
+ if (planEngineError)
240013
+ return planEngineError;
239518
240014
  if (code7 === "TARGET_NOT_FOUND") {
239519
240015
  return new CliError("TARGET_NOT_FOUND", message, { operationId, details });
239520
240016
  }
@@ -239571,6 +240067,14 @@ function mapQueryError(operationId, error, code7) {
239571
240067
  return error;
239572
240068
  return new CliError("COMMAND_FAILED", message, { operationId, details });
239573
240069
  }
240070
+ function tryMapPlanEngineError(operationId, error, code7) {
240071
+ if (!code7 || !PLAN_ENGINE_PASSTHROUGH_CODES.has(code7))
240072
+ return null;
240073
+ return new CliError(code7, extractErrorMessage(error), {
240074
+ operationId,
240075
+ details: extractErrorDetails(error)
240076
+ });
240077
+ }
239574
240078
  function mapInvokeError(operationId, error) {
239575
240079
  if (error instanceof CliError)
239576
240080
  return error;
@@ -239595,6 +240099,9 @@ function mapFailedReceipt(operationId, result) {
239595
240099
  }
239596
240100
  const failureCode = failure.code;
239597
240101
  const failureMessage = failure.message ?? `${operationId}: operation failed.`;
240102
+ if (failureCode && PLAN_ENGINE_PASSTHROUGH_CODES.has(failureCode)) {
240103
+ return new CliError(failureCode, failureMessage, { operationId, failure });
240104
+ }
239598
240105
  if (family === "trackChanges") {
239599
240106
  if (failureCode === "TRACK_CHANGE_COMMAND_UNAVAILABLE") {
239600
240107
  return new CliError("TRACK_CHANGE_COMMAND_UNAVAILABLE", failureMessage, { operationId, failure });
@@ -239648,10 +240155,23 @@ function mapFailedReceipt(operationId, result) {
239648
240155
  }
239649
240156
  return new CliError("COMMAND_FAILED", failureMessage, { operationId, failure });
239650
240157
  }
239651
- var FAMILY_MAPPERS;
240158
+ var PLAN_ENGINE_PASSTHROUGH_CODES, FAMILY_MAPPERS;
239652
240159
  var init_error_mapping = __esm(() => {
239653
240160
  init_operation_hints();
239654
240161
  init_errors();
240162
+ PLAN_ENGINE_PASSTHROUGH_CODES = new Set([
240163
+ "REVISION_MISMATCH",
240164
+ "REVISION_CHANGED_SINCE_COMPILE",
240165
+ "PLAN_CONFLICT_OVERLAP",
240166
+ "DOCUMENT_IDENTITY_CONFLICT",
240167
+ "INVALID_INSERTION_CONTEXT",
240168
+ "INVALID_INPUT",
240169
+ "INVALID_STEP_COMBINATION",
240170
+ "MATCH_NOT_FOUND",
240171
+ "PRECONDITION_FAILED",
240172
+ "CROSS_BLOCK_MATCH",
240173
+ "SPAN_FRAGMENTED"
240174
+ ]);
239655
240175
  FAMILY_MAPPERS = {
239656
240176
  trackChanges: mapTrackChangesError,
239657
240177
  comments: mapCommentsError,
@@ -239660,7 +240180,10 @@ var init_error_mapping = __esm(() => {
239660
240180
  create: mapCreateError,
239661
240181
  blocks: mapBlocksError,
239662
240182
  query: mapQueryError,
239663
- general: (operationId, error) => {
240183
+ general: (operationId, error, code7) => {
240184
+ const planEngineError = tryMapPlanEngineError(operationId, error, code7);
240185
+ if (planEngineError)
240186
+ return planEngineError;
239664
240187
  if (error instanceof CliError)
239665
240188
  return error;
239666
240189
  return new CliError("COMMAND_FAILED", extractErrorMessage(error), { operationId });