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

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 +754 -252
  2. package/package.json +8 -8
package/dist/index.js CHANGED
@@ -548,6 +548,9 @@ var init_operation_definitions = __esm(() => {
548
548
  "TARGET_MOVED",
549
549
  "PLAN_CONFLICT_OVERLAP",
550
550
  "INVALID_STEP_COMBINATION",
551
+ "REVISION_CHANGED_SINCE_COMPILE",
552
+ "INVALID_INSERTION_CONTEXT",
553
+ "DOCUMENT_IDENTITY_CONFLICT",
551
554
  "CAPABILITY_UNAVAILABLE"
552
555
  ];
553
556
  T_QUERY_MATCH = ["MATCH_NOT_FOUND", "AMBIGUOUS_MATCH", "INVALID_INPUT", "INTERNAL_ERROR"];
@@ -87504,9 +87507,9 @@ var init_remark_gfm_RDxetNVS_es = __esm(() => {
87504
87507
  emptyOptions4 = {};
87505
87508
  });
87506
87509
 
87507
- // ../../packages/superdoc/dist/chunks/src-B6O9kkNF.es.js
87508
- var exports_src_B6O9kkNF_es = {};
87509
- __export(exports_src_B6O9kkNF_es, {
87510
+ // ../../packages/superdoc/dist/chunks/src-0UjFcd91.es.js
87511
+ var exports_src_0UjFcd91_es = {};
87512
+ __export(exports_src_0UjFcd91_es, {
87510
87513
  zt: () => defineMark,
87511
87514
  z: () => cM,
87512
87515
  yt: () => removeAwarenessStates,
@@ -95639,9 +95642,11 @@ function checkRevision(editor, expectedRevision) {
95639
95642
  return;
95640
95643
  const current = getRevision(editor);
95641
95644
  if (expectedRevision !== current)
95642
- throw new PlanError("REVISION_MISMATCH", `REVISION_MISMATCH — expected revision "${expectedRevision}" but document is at "${current}"`, undefined, {
95645
+ 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
95646
  expectedRevision,
95644
- currentRevision: current
95647
+ currentRevision: current,
95648
+ refStability: "ephemeral",
95649
+ remediation: "Re-run query.match() to obtain a fresh ref valid for the current revision."
95645
95650
  });
95646
95651
  }
95647
95652
  function resolveSegmentPosition(targetOffset, segmentStart, segmentLength, docFrom, docTo) {
@@ -95897,7 +95902,9 @@ function captureRunsInRange(editor, blockPos, from$12, to) {
95897
95902
  return;
95898
95903
  }
95899
95904
  if (node3.isLeaf) {
95905
+ const start$1 = offset$1;
95900
95906
  offset$1 += 1;
95907
+ maybePushRun(start$1, offset$1, []);
95901
95908
  return;
95902
95909
  }
95903
95910
  let isFirstChild = true;
@@ -96335,12 +96342,69 @@ function executeBlockSelector(index2, query2, diagnostics) {
96335
96342
  function isAssertStep(step) {
96336
96343
  return step.op === "assert";
96337
96344
  }
96345
+ function isCreateOp(op) {
96346
+ return op === "create.heading" || op === "create.paragraph";
96347
+ }
96338
96348
  function isSelectWhere(where) {
96339
96349
  return where.by === "select";
96340
96350
  }
96341
96351
  function isRefWhere(where) {
96342
96352
  return where.by === "ref";
96343
96353
  }
96354
+ function validateCreateStepPosition(step) {
96355
+ const args$1 = step.args;
96356
+ if (args$1.position === undefined || args$1.position === null) {
96357
+ args$1.position = "after";
96358
+ return;
96359
+ }
96360
+ if (!VALID_CREATE_POSITIONS.includes(args$1.position))
96361
+ throw planError("INVALID_INPUT", `create step requires args.position to be 'before' or 'after'`, step.id, {
96362
+ receivedPosition: args$1.position,
96363
+ allowedValues: [...VALID_CREATE_POSITIONS],
96364
+ default: "after"
96365
+ });
96366
+ }
96367
+ function resolveCreateAnchorFromTargets(targets, position4, stepId) {
96368
+ const target = targets[0];
96369
+ if (!target)
96370
+ throw planError("INVALID_INPUT", "create step has no resolved targets", stepId);
96371
+ if (target.kind === "range")
96372
+ return target.blockId;
96373
+ const segments = target.segments;
96374
+ if (!segments.length)
96375
+ throw planError("INVALID_INPUT", "span target has no segments", stepId);
96376
+ return position4 === "before" ? segments[0].blockId : segments[segments.length - 1].blockId;
96377
+ }
96378
+ function validateInsertionContext(editor, index2, step, stepIndex, anchorBlockId, position4) {
96379
+ const candidate = index2.candidates.find((c$3) => c$3.nodeId === anchorBlockId);
96380
+ if (!candidate)
96381
+ return;
96382
+ const paragraphType = editor.state.schema?.nodes?.paragraph;
96383
+ if (!paragraphType)
96384
+ return;
96385
+ const resolvedPos = editor.state.doc.resolve(candidate.pos);
96386
+ const parent = resolvedPos.parent;
96387
+ const anchorIndex = resolvedPos.index();
96388
+ const insertionIndex = position4 === "before" ? anchorIndex : anchorIndex + 1;
96389
+ if (!(typeof parent.canReplaceWith === "function" ? parent.canReplaceWith(insertionIndex, insertionIndex, paragraphType) : parent.type.contentMatch.matchType(paragraphType))) {
96390
+ const allowedChildTypes = [];
96391
+ const match$1 = parent.type.contentMatch;
96392
+ for (const nodeType of Object.values(editor.state.schema.nodes))
96393
+ if (match$1.matchType(nodeType))
96394
+ allowedChildTypes.push(nodeType.name);
96395
+ throw planError("INVALID_INSERTION_CONTEXT", `Cannot create ${step.op} inside ${parent.type.name}`, step.id, {
96396
+ stepIndex,
96397
+ stepId: step.id,
96398
+ operation: step.op,
96399
+ anchorBlockId,
96400
+ parentType: parent.type.name,
96401
+ allowedChildTypes,
96402
+ insertionIndex,
96403
+ requestedChildType: "paragraph",
96404
+ requestedSemanticType: step.op === "create.heading" ? "heading" : "paragraph"
96405
+ });
96406
+ }
96407
+ }
96344
96408
  function isV3Ref(payload) {
96345
96409
  return typeof payload === "object" && payload !== null && "v" in payload && payload.v === 3;
96346
96410
  }
@@ -96575,9 +96639,13 @@ function decodeTextRefPayload(encoded, stepId) {
96575
96639
  function resolveV3TextRef(editor, index2, step, refData) {
96576
96640
  const currentRevision = getRevision(editor);
96577
96641
  if (refData.rev !== currentRevision)
96578
- throw planError("REVISION_MISMATCH", `text ref was created at revision "${refData.rev}" but document is at "${currentRevision}"`, step.id, {
96642
+ 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
96643
  refRevision: refData.rev,
96580
- currentRevision
96644
+ currentRevision,
96645
+ refStability: "ephemeral",
96646
+ refScope: refData.scope,
96647
+ blockId: refData.segments?.[0]?.blockId,
96648
+ remediation: `Re-run query.match() to obtain a fresh ref valid for the current revision.`
96581
96649
  });
96582
96650
  if (!refData.segments?.length)
96583
96651
  return [];
@@ -96668,7 +96736,11 @@ function resolveStepTargets(editor, index2, step) {
96668
96736
  });
96669
96737
  if (refWhere) {
96670
96738
  if (targets.length === 0)
96671
- throw planError("MATCH_NOT_FOUND", `ref "${refWhere.ref}" did not resolve to any targets`, step.id);
96739
+ throw planError("MATCH_NOT_FOUND", `ref "${refWhere.ref}" did not resolve to any targets`, step.id, {
96740
+ selectorType: "ref",
96741
+ selectorPattern: refWhere.ref,
96742
+ candidateCount: 0
96743
+ });
96672
96744
  if (targets.length > 1)
96673
96745
  throw planError("AMBIGUOUS_MATCH", `ref "${refWhere.ref}" resolved to ${targets.length} targets`, step.id, { matchCount: targets.length });
96674
96746
  return targets;
@@ -96680,6 +96752,18 @@ function resolveStepTargets(editor, index2, step) {
96680
96752
  targets = [targets[0]];
96681
96753
  return targets;
96682
96754
  }
96755
+ function buildMatchNotFoundDetails(step) {
96756
+ const where = step.where;
96757
+ const select2 = "select" in where ? where.select : undefined;
96758
+ const within$1 = "within" in where ? where.within : undefined;
96759
+ return {
96760
+ selectorType: select2?.type ?? "unknown",
96761
+ selectorPattern: select2?.pattern ?? "",
96762
+ selectorMode: select2?.mode ?? "contains",
96763
+ searchScope: within$1?.blockId ?? "document",
96764
+ candidateCount: 0
96765
+ };
96766
+ }
96683
96767
  function applyCardinalityCheck(step, targets) {
96684
96768
  const where = step.where;
96685
96769
  if (!("require" in where) || where.require === undefined)
@@ -96687,62 +96771,131 @@ function applyCardinalityCheck(step, targets) {
96687
96771
  const require$1 = where.require;
96688
96772
  if (require$1 === "first") {
96689
96773
  if (targets.length === 0)
96690
- throw planError("MATCH_NOT_FOUND", "selector matched zero ranges", step.id);
96774
+ throw planError("MATCH_NOT_FOUND", "selector matched zero ranges", step.id, buildMatchNotFoundDetails(step));
96691
96775
  } else if (require$1 === "exactlyOne") {
96692
96776
  if (targets.length === 0)
96693
- throw planError("MATCH_NOT_FOUND", "selector matched zero ranges", step.id);
96777
+ throw planError("MATCH_NOT_FOUND", "selector matched zero ranges", step.id, buildMatchNotFoundDetails(step));
96694
96778
  if (targets.length > 1)
96695
96779
  throw planError("AMBIGUOUS_MATCH", `selector matched ${targets.length} ranges, expected exactly one`, step.id, { matchCount: targets.length });
96696
96780
  } else if (require$1 === "all") {
96697
96781
  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, {
96782
+ throw planError("MATCH_NOT_FOUND", "selector matched zero ranges", step.id, buildMatchNotFoundDetails(step));
96783
+ }
96784
+ }
96785
+ function normalizeOpForMatrix(op) {
96786
+ return op.startsWith("create.") ? "create.*" : op;
96787
+ }
96788
+ function classifyOverlap(stepA, stepB) {
96789
+ const rangesA = extractBlockRanges(stepA);
96790
+ const rangesB = extractBlockRanges(stepB);
96791
+ const opA = normalizeOpForMatrix(stepA.step.op);
96792
+ const opB = normalizeOpForMatrix(stepB.step.op);
96793
+ const isCreateA = opA === "create.*";
96794
+ const isCreateB = opB === "create.*";
96795
+ for (const [blockId, aEntries] of rangesA) {
96796
+ const bEntries = rangesB.get(blockId);
96797
+ if (!bEntries)
96798
+ continue;
96799
+ for (const a2 of aEntries)
96800
+ for (const b$1 of bEntries) {
96801
+ if (isCreateA || isCreateB)
96802
+ return {
96803
+ overlapClass: "same_block",
96804
+ blockId,
96805
+ rangeA: a2,
96806
+ rangeB: b$1
96807
+ };
96808
+ if (a2.to <= b$1.from || b$1.to <= a2.from)
96809
+ continue;
96810
+ if (a2.from === b$1.from && a2.to === b$1.to)
96811
+ return {
96812
+ overlapClass: "same_target",
96813
+ blockId,
96814
+ rangeA: a2,
96815
+ rangeB: b$1
96816
+ };
96817
+ return {
96818
+ overlapClass: "overlapping",
96717
96819
  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
- }
96820
+ rangeA: a2,
96821
+ rangeB: b$1
96822
+ };
96823
+ }
96728
96824
  }
96729
96825
  }
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);
96826
+ function extractBlockRanges(compiled) {
96827
+ const result = /* @__PURE__ */ new Map;
96828
+ for (const target of compiled.targets)
96829
+ if (target.kind === "range")
96830
+ pushBlockRange(result, target.blockId, target.from, target.to);
96831
+ else
96832
+ for (const seg of target.segments)
96833
+ pushBlockRange(result, seg.blockId, seg.from, seg.to);
96834
+ return result;
96835
+ }
96836
+ function pushBlockRange(map$22, blockId, from$12, to) {
96837
+ let entries = map$22.get(blockId);
96838
+ if (!entries) {
96839
+ entries = [];
96840
+ map$22.set(blockId, entries);
96735
96841
  }
96736
- blockRanges.push({
96737
- stepId,
96842
+ entries.push({
96738
96843
  from: from$12,
96739
96844
  to
96740
96845
  });
96741
96846
  }
96847
+ function validateStepInteractions(steps) {
96848
+ for (let i$1 = 0;i$1 < steps.length; i$1++)
96849
+ for (let j2 = i$1 + 1;j2 < steps.length; j2++) {
96850
+ const stepA = steps[i$1];
96851
+ const stepB = steps[j2];
96852
+ if (MATRIX_EXEMPT_OPS.has(stepA.step.op) || MATRIX_EXEMPT_OPS.has(stepB.step.op))
96853
+ continue;
96854
+ const overlap = classifyOverlap(stepA, stepB);
96855
+ if (!overlap)
96856
+ continue;
96857
+ const matrixKey = `${normalizeOpForMatrix(stepA.step.op)}::${normalizeOpForMatrix(stepB.step.op)}::${overlap.overlapClass}`;
96858
+ const verdict = STEP_INTERACTION_MATRIX.get(matrixKey) ?? "reject";
96859
+ if (verdict === "reject")
96860
+ throw planError("PLAN_CONFLICT_OVERLAP", `steps "${stepA.step.id}" and "${stepB.step.id}" target overlapping ranges in block "${overlap.blockId}"`, stepB.step.id, {
96861
+ blockId: overlap.blockId,
96862
+ stepIdA: stepA.step.id,
96863
+ stepIdB: stepB.step.id,
96864
+ opKeyA: stepA.step.op,
96865
+ opKeyB: stepB.step.op,
96866
+ rangeA: overlap.rangeA,
96867
+ rangeB: overlap.rangeB,
96868
+ overlapRegion: {
96869
+ from: Math.max(overlap.rangeA.from, overlap.rangeB.from),
96870
+ to: Math.min(overlap.rangeA.to, overlap.rangeB.to)
96871
+ },
96872
+ matrixVerdict: verdict,
96873
+ matrixKey
96874
+ });
96875
+ }
96876
+ }
96877
+ function assertNoDuplicateBlockIds(index2) {
96878
+ const seen = /* @__PURE__ */ new Map;
96879
+ const duplicates = [];
96880
+ for (const candidate of index2.candidates) {
96881
+ const count = seen.get(candidate.nodeId) ?? 0;
96882
+ seen.set(candidate.nodeId, count + 1);
96883
+ if (count === 1)
96884
+ duplicates.push(candidate.nodeId);
96885
+ }
96886
+ if (duplicates.length > 0)
96887
+ throw planError("DOCUMENT_IDENTITY_CONFLICT", "Document contains blocks with duplicate identities. This must be resolved before mutations can be applied.", undefined, {
96888
+ duplicateBlockIds: duplicates,
96889
+ blockCount: duplicates.length,
96890
+ remediation: "Re-import the document or call document.repair() to assign unique identities."
96891
+ });
96892
+ }
96742
96893
  function compilePlan(editor, steps) {
96743
96894
  if (steps.length > 200)
96744
96895
  throw planError("INVALID_INPUT", `plan contains ${steps.length} steps, maximum is 200`);
96896
+ const compiledRevision = getRevision(editor);
96745
96897
  const index2 = getBlockIndex(editor);
96898
+ assertNoDuplicateBlockIds(index2);
96746
96899
  const mutationSteps = [];
96747
96900
  const assertSteps = [];
96748
96901
  const seenIds = /* @__PURE__ */ new Set;
@@ -96754,28 +96907,45 @@ function compilePlan(editor, steps) {
96754
96907
  seenIds.add(step.id);
96755
96908
  }
96756
96909
  let totalTargets = 0;
96910
+ let stepIndex = 0;
96757
96911
  for (const step of steps) {
96758
96912
  if (isAssertStep(step)) {
96759
96913
  assertSteps.push(step);
96914
+ stepIndex++;
96760
96915
  continue;
96761
96916
  }
96762
96917
  if (!hasStepExecutor(step.op))
96763
96918
  throw planError("INVALID_INPUT", `unknown step op "${step.op}"`, step.id);
96919
+ if (isCreateOp(step.op))
96920
+ validateCreateStepPosition(step);
96764
96921
  const targets = resolveStepTargets(editor, index2, step);
96922
+ if (isCreateOp(step.op) && targets.length > 0) {
96923
+ const position4 = step.args.position ?? "after";
96924
+ const anchorBlockId = resolveCreateAnchorFromTargets(targets, position4, step.id);
96925
+ validateInsertionContext(editor, index2, step, stepIndex, anchorBlockId, position4);
96926
+ }
96765
96927
  totalTargets += targets.length;
96766
96928
  mutationSteps.push({
96767
96929
  step,
96768
96930
  targets
96769
96931
  });
96932
+ stepIndex++;
96770
96933
  }
96771
96934
  if (totalTargets > 500)
96772
96935
  throw planError("INVALID_INPUT", `plan resolved ${totalTargets} total targets, maximum is 500`);
96773
- detectOverlaps(mutationSteps);
96936
+ validateStepInteractions(mutationSteps);
96774
96937
  return {
96775
96938
  mutationSteps,
96776
- assertSteps
96939
+ assertSteps,
96940
+ compiledRevision
96777
96941
  };
96778
96942
  }
96943
+ function resolveBlockInsertionPos(editor, anchorBlockId, position4, stepId) {
96944
+ const candidate = getBlockIndex(editor).candidates.find((c$3) => c$3.nodeId === anchorBlockId);
96945
+ if (!candidate)
96946
+ throw planError("TARGET_NOT_FOUND", `block "${anchorBlockId}" not found`, stepId);
96947
+ return position4 === "before" ? candidate.pos : candidate.end;
96948
+ }
96779
96949
  function applyDirectMutationMeta(tr) {
96780
96950
  tr.setMeta("inputType", "programmatic");
96781
96951
  tr.setMeta("skipTrackChanges", true);
@@ -96828,11 +96998,33 @@ function buildMarksFromSetMarks(editor, setMarks) {
96828
96998
  marks.push(schema.marks.strike.create());
96829
96999
  return marks;
96830
97000
  }
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;
97001
+ function applyInlineMarkPatches(editor, tr, absFrom, absTo, inline) {
97002
+ const { schema } = editor.state;
97003
+ let changed = false;
97004
+ const markEntries = [
97005
+ [inline.bold, schema.marks.bold],
97006
+ [inline.italic, schema.marks.italic],
97007
+ [inline.underline, schema.marks.underline],
97008
+ [inline.strike, schema.marks.strike]
97009
+ ];
97010
+ for (const [value, markType] of markEntries) {
97011
+ if (value === undefined || !markType)
97012
+ continue;
97013
+ if (value)
97014
+ tr.addMark(absFrom, absTo, markType.create());
97015
+ else
97016
+ tr.removeMark(absFrom, absTo, markType);
97017
+ changed = true;
97018
+ }
97019
+ return changed;
97020
+ }
97021
+ function resolveCreateAnchorBlockId(target, position4, stepId) {
97022
+ if (target.kind === "range")
97023
+ return target.blockId;
97024
+ const segments = target.segments;
97025
+ if (!segments.length)
97026
+ throw planError("INVALID_INPUT", "span target has no segments", stepId);
97027
+ return position4 === "before" ? segments[0].blockId : segments[segments.length - 1].blockId;
96836
97028
  }
96837
97029
  function executeTextRewrite(editor, tr, target, step, mapping) {
96838
97030
  const absFrom = mapping.map(target.absFrom);
@@ -96873,42 +97065,7 @@ function executeTextDelete(_editor, tr, target, _step, mapping) {
96873
97065
  return { changed: true };
96874
97066
  }
96875
97067
  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 };
97068
+ return { changed: applyInlineMarkPatches(editor, tr, mapping.map(target.absFrom), mapping.map(target.absTo), step.args.inline) };
96912
97069
  }
96913
97070
  function validateMappedSpanContiguity(target, mapping, stepId) {
96914
97071
  let lastMappedEnd = -1;
@@ -96974,44 +97131,9 @@ function executeSpanTextDelete(_editor, tr, target, step, mapping) {
96974
97131
  }
96975
97132
  function executeSpanStyleApply(editor, tr, target, step, mapping) {
96976
97133
  validateMappedSpanContiguity(target, mapping, step.id);
96977
- const { schema } = editor.state;
96978
- let changed = false;
96979
97134
  const firstSeg = target.segments[0];
96980
97135
  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 };
97136
+ return { changed: applyInlineMarkPatches(editor, tr, mapping.map(firstSeg.absFrom, 1), mapping.map(lastSeg.absTo, -1), step.args.inline) };
97015
97137
  }
97016
97138
  function getReplacementText(replacement) {
97017
97139
  if (replacement.blocks !== undefined)
@@ -97212,10 +97334,12 @@ function executeAssertStep(_editor, tr, step) {
97212
97334
  }
97213
97335
  function executeCreateStep(editor, tr, step, targets, mapping) {
97214
97336
  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);
97337
+ if (!target)
97338
+ throw planError("INVALID_INPUT", `${step.op} step requires at least one target`, step.id);
97217
97339
  const args$1 = step.args;
97218
- const pos = mapping.map(toAbsoluteBlockInsertPos(editor, target.blockId, target.from, step.id));
97340
+ const position4 = args$1.position ?? "after";
97341
+ const anchorPos = resolveBlockInsertionPos(editor, resolveCreateAnchorBlockId(target, position4, step.id), position4, step.id);
97342
+ const pos = mapping.map(anchorPos);
97219
97343
  const paragraphType = editor.state.schema?.nodes?.paragraph;
97220
97344
  if (!paragraphType)
97221
97345
  throw planError("INVALID_INPUT", "paragraph node type not in schema", step.id);
@@ -97235,6 +97359,7 @@ function executeCreateStep(editor, tr, step, targets, mapping) {
97235
97359
  if (!node3)
97236
97360
  throw planError("INVALID_INPUT", `could not create ${step.op} node`, step.id);
97237
97361
  tr.insert(pos, node3);
97362
+ assertNoPostInsertDuplicateIds(tr.doc, step.id);
97238
97363
  return {
97239
97364
  stepId: step.id,
97240
97365
  op: step.op,
@@ -97246,6 +97371,31 @@ function executeCreateStep(editor, tr, step, targets, mapping) {
97246
97371
  }
97247
97372
  };
97248
97373
  }
97374
+ function assertNoPostInsertDuplicateIds(doc$2, stepId) {
97375
+ const seen = /* @__PURE__ */ new Set;
97376
+ const duplicateSet = /* @__PURE__ */ new Set;
97377
+ doc$2.descendants((node3) => {
97378
+ if (!node3.isTextblock)
97379
+ return true;
97380
+ const attrs = node3.attrs ?? {};
97381
+ const id2 = typeof attrs.paraId === "string" && attrs.paraId || typeof attrs.sdBlockId === "string" && attrs.sdBlockId || typeof attrs.nodeId === "string" && attrs.nodeId;
97382
+ if (!id2)
97383
+ return true;
97384
+ if (seen.has(id2))
97385
+ duplicateSet.add(id2);
97386
+ else
97387
+ seen.add(id2);
97388
+ return true;
97389
+ });
97390
+ if (duplicateSet.size > 0) {
97391
+ const duplicates = [...duplicateSet];
97392
+ throw planError("INTERNAL_ERROR", `create step produced duplicate block identities: [${duplicates.join(", ")}]`, stepId, {
97393
+ source: "executor:checkPostInsertIdentityUniqueness",
97394
+ invariant: "post-insert block IDs must be unique",
97395
+ duplicateBlockIds: duplicates
97396
+ });
97397
+ }
97398
+ }
97249
97399
  function runMutationsOnTransaction(editor, tr, compiled, options) {
97250
97400
  const mapping = tr.mapping;
97251
97401
  const stepOutcomes = [];
@@ -97303,6 +97453,14 @@ function executeCompiledPlan(editor, compiled, options = {}) {
97303
97453
  const startTime = performance.now();
97304
97454
  const revisionBefore = getRevision(editor);
97305
97455
  checkRevision(editor, options.expectedRevision);
97456
+ if (compiled.compiledRevision !== revisionBefore)
97457
+ throw planError("REVISION_CHANGED_SINCE_COMPILE", `Document revision changed between compile and execute. Compiled at "${compiled.compiledRevision}", now at "${revisionBefore}".`, undefined, {
97458
+ compiledRevision: compiled.compiledRevision,
97459
+ currentRevision: revisionBefore,
97460
+ stepCount: compiled.mutationSteps.length,
97461
+ failedAtStep: "pre-execution",
97462
+ remediation: "Re-compile the plan against the current document state."
97463
+ });
97306
97464
  const tr = editor.state.tr;
97307
97465
  if ((options.changeMode ?? "direct") === "tracked")
97308
97466
  applyTrackedMutationMeta(tr);
@@ -97522,7 +97680,8 @@ function executeDomainCommand(editor, handler2, options) {
97522
97680
  },
97523
97681
  targets: []
97524
97682
  }],
97525
- assertSteps: []
97683
+ assertSteps: [],
97684
+ compiledRevision: getRevision(editor)
97526
97685
  }, { expectedRevision: options?.expectedRevision });
97527
97686
  }
97528
97687
  function validateWriteRequest(request, resolved) {
@@ -97618,7 +97777,8 @@ function writeWrapper(editor, request, options) {
97618
97777
  step: stepDef,
97619
97778
  targets: [toCompiledTarget(stepId, op, resolved)]
97620
97779
  }],
97621
- assertSteps: []
97780
+ assertSteps: [],
97781
+ compiledRevision: getRevision(editor)
97622
97782
  }, {
97623
97783
  changeMode: mode,
97624
97784
  expectedRevision: options?.expectedRevision
@@ -97683,7 +97843,8 @@ function styleApplyWrapper(editor, input2, options) {
97683
97843
  marks: []
97684
97844
  }]
97685
97845
  }],
97686
- assertSteps: []
97846
+ assertSteps: [],
97847
+ compiledRevision: getRevision(editor)
97687
97848
  }, {
97688
97849
  changeMode: mode,
97689
97850
  expectedRevision: options?.expectedRevision
@@ -98705,10 +98866,7 @@ function resolveCreateInsertPosition(editor, at, operationLabel) {
98705
98866
  return 0;
98706
98867
  if (location$1.kind === "documentEnd")
98707
98868
  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;
98869
+ return resolveBlockInsertionPos(editor, location$1.target.nodeId, location$1.kind);
98712
98870
  }
98713
98871
  function resolveCreatedBlock(editor, nodeType, blockId) {
98714
98872
  const index2 = getBlockIndex(editor);
@@ -98817,7 +98975,10 @@ function createParagraphWrapper(editor, input2, options) {
98817
98975
  const paragraph2 = resolveCreatedBlock(editor, "paragraph", paragraphId);
98818
98976
  if (mode === "tracked")
98819
98977
  trackedChangeRefs = collectTrackInsertRefsInRange(editor, paragraph2.pos, paragraph2.end);
98820
- } catch {}
98978
+ } catch (e) {
98979
+ if (!(e instanceof DocumentApiAdapterError))
98980
+ throw e;
98981
+ }
98821
98982
  }
98822
98983
  return didApply;
98823
98984
  }, { expectedRevision: options?.expectedRevision }).steps[0]?.effect !== "changed")
@@ -98883,7 +99044,10 @@ function createHeadingWrapper(editor, input2, options) {
98883
99044
  const heading3 = resolveCreatedBlock(editor, "heading", headingId);
98884
99045
  if (mode === "tracked")
98885
99046
  trackedChangeRefs = collectTrackInsertRefsInRange(editor, heading3.pos, heading3.end);
98886
- } catch {}
99047
+ } catch (e) {
99048
+ if (!(e instanceof DocumentApiAdapterError))
99049
+ throw e;
99050
+ }
98887
99051
  }
98888
99052
  return didApply;
98889
99053
  }, { expectedRevision: options?.expectedRevision }).steps[0]?.effect !== "changed")
@@ -100242,15 +100406,16 @@ function trackChangesRejectAllWrapper(editor, _input, options) {
100242
100406
  return { success: true };
100243
100407
  }
100244
100408
  function previewPlan(editor, input2) {
100245
- const evaluatedRevision = getRevision(editor);
100246
100409
  checkRevision(editor, input2.expectedRevision);
100247
100410
  if (!input2.steps?.length)
100248
100411
  throw planError("INVALID_INPUT", "plan must contain at least one step");
100249
100412
  const failures = [];
100250
100413
  const stepPreviews = [];
100251
100414
  let currentPhase = "compile";
100415
+ let evaluatedRevision = getRevision(editor);
100252
100416
  try {
100253
100417
  const compiled = compilePlan(editor, input2.steps);
100418
+ evaluatedRevision = compiled.compiledRevision;
100254
100419
  currentPhase = "execute";
100255
100420
  const tr = editor.state.tr;
100256
100421
  const { stepOutcomes, assertFailures } = runMutationsOnTransaction(editor, tr, compiled, { throwOnAssertFailure: false });
@@ -100662,7 +100827,13 @@ function queryMatchAdapter(editor, input2) {
100662
100827
  const paginatedMatches = isTextSelector ? applyPagination(rawMatches, userOffset, input2.limit) : rawMatches;
100663
100828
  if (require$1 === "first" || require$1 === "exactlyOne" || require$1 === "all") {
100664
100829
  if (totalMatches === 0)
100665
- throw planError("MATCH_NOT_FOUND", "selector matched zero ranges");
100830
+ throw planError("MATCH_NOT_FOUND", "selector matched zero ranges", undefined, {
100831
+ selectorType: input2.select?.type ?? "unknown",
100832
+ selectorPattern: input2.select?.pattern ?? "",
100833
+ selectorMode: input2.select?.mode ?? "contains",
100834
+ searchScope: (input2.within?.kind === "block" ? input2.within.nodeId : undefined) ?? "document",
100835
+ candidateCount: 0
100836
+ });
100666
100837
  }
100667
100838
  if (require$1 === "exactlyOne" && totalMatches > 1)
100668
100839
  throw planError("AMBIGUOUS_MATCH", `selector matched ${totalMatches} ranges, expected exactly one`, undefined, { matchCount: totalMatches });
@@ -100671,7 +100842,11 @@ function queryMatchAdapter(editor, input2) {
100671
100842
  if (isTextSelector && raw.textRanges?.length) {
100672
100843
  const blocks2 = buildMatchBlocks(editor, raw.textRanges, evaluatedRevision, id2);
100673
100844
  if (blocks2.length === 0)
100674
- throw planError("INTERNAL_ERROR", `text match produced no blocks for ${id2}`);
100845
+ throw planError("INTERNAL_ERROR", `text match produced no blocks for ${id2}`, undefined, {
100846
+ source: "query-match-adapter:buildMatchEntries",
100847
+ invariant: "text match must have at least one block after zero-width filtering",
100848
+ context: { matchId: id2 }
100849
+ });
100675
100850
  const snippetResult = buildBlocksSnippet(editor, blocks2);
100676
100851
  return {
100677
100852
  id: id2,
@@ -134950,7 +135125,7 @@ var Node$13 = class Node$14 {
134950
135125
  console.warn("Failed to initialize developer tools:", error);
134951
135126
  }
134952
135127
  }
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 {
135128
+ }, 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
135129
  constructor(config2) {
134955
135130
  this.search = config2.search;
134956
135131
  this.caseSensitive = !!config2.caseSensitive;
@@ -153021,7 +153196,7 @@ var Node$13 = class Node$14 {
153021
153196
  trackedChanges: context.trackedChanges ?? []
153022
153197
  });
153023
153198
  }, _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(() => {
153199
+ var init_src_0UjFcd91_es = __esm(() => {
153025
153200
  init_rolldown_runtime_B2q5OVn9_es();
153026
153201
  init_SuperConverter_BxBclpFg_es();
153027
153202
  init_jszip_ChlR43oI_es();
@@ -161141,6 +161316,9 @@ function print() { __p += __j.call(arguments, '') }
161141
161316
  "TARGET_MOVED",
161142
161317
  "PLAN_CONFLICT_OVERLAP",
161143
161318
  "INVALID_STEP_COMBINATION",
161319
+ "REVISION_CHANGED_SINCE_COMPILE",
161320
+ "INVALID_INSERTION_CONTEXT",
161321
+ "DOCUMENT_IDENTITY_CONFLICT",
161144
161322
  "CAPABILITY_UNAVAILABLE"
161145
161323
  ];
161146
161324
  T_QUERY_MATCH2 = [
@@ -162654,6 +162832,7 @@ function print() { __p += __j.call(arguments, '') }
162654
162832
  "commentRangeStart",
162655
162833
  "commentRangeEnd"
162656
162834
  ]);
162835
+ VALID_CREATE_POSITIONS = ["before", "after"];
162657
162836
  REF_HANDLERS = [
162658
162837
  {
162659
162838
  prefix: "text:",
@@ -162676,6 +162855,34 @@ function print() { __p += __j.call(arguments, '') }
162676
162855
  handler: resolveBlockRef
162677
162856
  }
162678
162857
  ];
162858
+ STEP_INTERACTION_MATRIX = new Map([
162859
+ ["text.rewrite::format.apply::same_target", "allow"],
162860
+ ["text.rewrite::text.rewrite::same_target", "reject"],
162861
+ ["text.rewrite::text.delete::overlapping", "reject"],
162862
+ ["text.rewrite::create.*::same_block", "allow"],
162863
+ ["text.rewrite::text.insert::same_target", "reject"],
162864
+ ["format.apply::format.apply::same_target", "allow"],
162865
+ ["format.apply::text.rewrite::same_target", "reject"],
162866
+ ["format.apply::text.delete::overlapping", "reject"],
162867
+ ["format.apply::create.*::same_block", "allow"],
162868
+ ["format.apply::text.insert::same_target", "allow"],
162869
+ ["text.delete::text.rewrite::overlapping", "reject"],
162870
+ ["text.delete::text.delete::overlapping", "reject"],
162871
+ ["text.delete::format.apply::overlapping", "reject"],
162872
+ ["text.delete::create.*::same_block", "allow"],
162873
+ ["text.delete::text.insert::overlapping", "reject"],
162874
+ ["create.*::text.rewrite::same_block", "allow"],
162875
+ ["create.*::format.apply::same_block", "allow"],
162876
+ ["create.*::text.delete::same_block", "allow"],
162877
+ ["create.*::create.*::same_block", "allow"],
162878
+ ["create.*::text.insert::same_block", "allow"],
162879
+ ["text.insert::format.apply::same_target", "allow"],
162880
+ ["text.insert::text.rewrite::same_target", "reject"],
162881
+ ["text.insert::text.delete::overlapping", "reject"],
162882
+ ["text.insert::create.*::same_block", "allow"],
162883
+ ["text.insert::text.insert::same_target", "reject"]
162884
+ ]);
162885
+ MATRIX_EXEMPT_OPS = new Set(["assert"]);
162679
162886
  DEFAULT_INLINE_POLICY = {
162680
162887
  mode: "preserve",
162681
162888
  onNonUniform: "majority"
@@ -184692,8 +184899,8 @@ function print() { __p += __j.call(arguments, '') }
184692
184899
  return isObjectLike_default(value) && hasOwnProperty$8.call(value, "callee") && !propertyIsEnumerable$1.call(value, "callee");
184693
184900
  };
184694
184901
  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;
184902
+ freeExports$2 = typeof exports_src_0UjFcd91_es == "object" && exports_src_0UjFcd91_es && !exports_src_0UjFcd91_es.nodeType && exports_src_0UjFcd91_es;
184903
+ freeModule$2 = freeExports$2 && typeof module_src_0UjFcd91_es == "object" && module_src_0UjFcd91_es && !module_src_0UjFcd91_es.nodeType && module_src_0UjFcd91_es;
184697
184904
  Buffer$1 = freeModule$2 && freeModule$2.exports === freeExports$2 ? _root_default.Buffer : undefined;
184698
184905
  isBuffer_default = (Buffer$1 ? Buffer$1.isBuffer : undefined) || stubFalse_default;
184699
184906
  typedArrayTags = {};
@@ -184701,8 +184908,8 @@ function print() { __p += __j.call(arguments, '') }
184701
184908
  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
184909
  _baseIsTypedArray_default = baseIsTypedArray;
184703
184910
  _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;
184911
+ freeExports$1 = typeof exports_src_0UjFcd91_es == "object" && exports_src_0UjFcd91_es && !exports_src_0UjFcd91_es.nodeType && exports_src_0UjFcd91_es;
184912
+ freeModule$1 = freeExports$1 && typeof module_src_0UjFcd91_es == "object" && module_src_0UjFcd91_es && !module_src_0UjFcd91_es.nodeType && module_src_0UjFcd91_es;
184706
184913
  freeProcess = freeModule$1 && freeModule$1.exports === freeExports$1 && _freeGlobal_default.process;
184707
184914
  _nodeUtil_default = function() {
184708
184915
  try {
@@ -184807,8 +185014,8 @@ function print() { __p += __j.call(arguments, '') }
184807
185014
  Stack.prototype.has = _stackHas_default;
184808
185015
  Stack.prototype.set = _stackSet_default;
184809
185016
  _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;
185017
+ freeExports = typeof exports_src_0UjFcd91_es == "object" && exports_src_0UjFcd91_es && !exports_src_0UjFcd91_es.nodeType && exports_src_0UjFcd91_es;
185018
+ freeModule = freeExports && typeof module_src_0UjFcd91_es == "object" && module_src_0UjFcd91_es && !module_src_0UjFcd91_es.nodeType && module_src_0UjFcd91_es;
184812
185019
  Buffer4 = freeModule && freeModule.exports === freeExports ? _root_default.Buffer : undefined;
184813
185020
  allocUnsafe = Buffer4 ? Buffer4.allocUnsafe : undefined;
184814
185021
  _cloneBuffer_default = cloneBuffer;
@@ -192427,7 +192634,7 @@ var init_zipper_BJHqrQMq_es = __esm(() => {
192427
192634
 
192428
192635
  // ../../packages/superdoc/dist/super-editor.es.js
192429
192636
  var init_super_editor_es = __esm(() => {
192430
- init_src_B6O9kkNF_es();
192637
+ init_src_0UjFcd91_es();
192431
192638
  init_SuperConverter_BxBclpFg_es();
192432
192639
  init_jszip_ChlR43oI_es();
192433
192640
  init_xml_js_DLE8mr0n_es();
@@ -193116,7 +193323,7 @@ function addNode2(child, target) {
193116
193323
  else
193117
193324
  target.push(child);
193118
193325
  }
193119
- function addRange3($start, $end, depth, target) {
193326
+ function addRange2($start, $end, depth, target) {
193120
193327
  let node3 = ($end || $start).node(depth);
193121
193328
  let startIndex = 0, endIndex = $end ? $end.index(depth) : node3.childCount;
193122
193329
  if ($start) {
@@ -193141,28 +193348,28 @@ function replaceThreeWay2($from, $start, $end, $to, depth) {
193141
193348
  let openStart = $from.depth > depth && joinable2($from, $start, depth + 1);
193142
193349
  let openEnd = $to.depth > depth && joinable2($end, $to, depth + 1);
193143
193350
  let content2 = [];
193144
- addRange3(null, $from, depth, content2);
193351
+ addRange2(null, $from, depth, content2);
193145
193352
  if (openStart && openEnd && $start.index(depth) == $end.index(depth)) {
193146
193353
  checkJoin2(openStart, openEnd);
193147
193354
  addNode2(close2(openStart, replaceThreeWay2($from, $start, $end, $to, depth + 1)), content2);
193148
193355
  } else {
193149
193356
  if (openStart)
193150
193357
  addNode2(close2(openStart, replaceTwoWay2($from, $start, depth + 1)), content2);
193151
- addRange3($start, $end, depth, content2);
193358
+ addRange2($start, $end, depth, content2);
193152
193359
  if (openEnd)
193153
193360
  addNode2(close2(openEnd, replaceTwoWay2($end, $to, depth + 1)), content2);
193154
193361
  }
193155
- addRange3($to, null, depth, content2);
193362
+ addRange2($to, null, depth, content2);
193156
193363
  return new Fragment4(content2);
193157
193364
  }
193158
193365
  function replaceTwoWay2($from, $to, depth) {
193159
193366
  let content2 = [];
193160
- addRange3(null, $from, depth, content2);
193367
+ addRange2(null, $from, depth, content2);
193161
193368
  if ($from.depth > depth) {
193162
193369
  let type = joinable2($from, $to, depth + 1);
193163
193370
  addNode2(close2(type, replaceTwoWay2($from, $to, depth + 1)), content2);
193164
193371
  }
193165
- addRange3($to, null, depth, content2);
193372
+ addRange2($to, null, depth, content2);
193166
193373
  return new Fragment4(content2);
193167
193374
  }
193168
193375
  function prepareSliceForReplace2(slice2, $along) {
@@ -197829,7 +198036,12 @@ function checkRevision2(editor, expectedRevision) {
197829
198036
  return;
197830
198037
  const current = getRevision2(editor);
197831
198038
  if (expectedRevision !== current) {
197832
- throw new PlanError2("REVISION_MISMATCH", `REVISION_MISMATCH — expected revision "${expectedRevision}" but document is at "${current}"`, undefined, { expectedRevision, currentRevision: current });
198039
+ 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, {
198040
+ expectedRevision,
198041
+ currentRevision: current,
198042
+ refStability: "ephemeral",
198043
+ remediation: "Re-run query.match() to obtain a fresh ref valid for the current revision."
198044
+ });
197833
198045
  }
197834
198046
  }
197835
198047
  var revisionMap2, subscribedEditors2;
@@ -198091,7 +198303,9 @@ function captureRunsInRange2(editor, blockPos, from3, to) {
198091
198303
  return;
198092
198304
  }
198093
198305
  if (node3.isLeaf) {
198306
+ const start2 = offset2;
198094
198307
  offset2 += 1;
198308
+ maybePushRun(start2, offset2, []);
198095
198309
  return;
198096
198310
  }
198097
198311
  let isFirstChild = true;
@@ -198604,12 +198818,73 @@ var init_block_strategy = __esm(() => {
198604
198818
  function isAssertStep2(step) {
198605
198819
  return step.op === "assert";
198606
198820
  }
198821
+ function isCreateOp2(op) {
198822
+ return op === "create.heading" || op === "create.paragraph";
198823
+ }
198607
198824
  function isSelectWhere2(where) {
198608
198825
  return where.by === "select";
198609
198826
  }
198610
198827
  function isRefWhere2(where) {
198611
198828
  return where.by === "ref";
198612
198829
  }
198830
+ function validateCreateStepPosition2(step) {
198831
+ const args3 = step.args;
198832
+ if (args3.position === undefined || args3.position === null) {
198833
+ args3.position = "after";
198834
+ return;
198835
+ }
198836
+ if (!VALID_CREATE_POSITIONS2.includes(args3.position)) {
198837
+ throw planError2("INVALID_INPUT", `create step requires args.position to be 'before' or 'after'`, step.id, {
198838
+ receivedPosition: args3.position,
198839
+ allowedValues: [...VALID_CREATE_POSITIONS2],
198840
+ default: "after"
198841
+ });
198842
+ }
198843
+ }
198844
+ function resolveCreateAnchorFromTargets2(targets, position4, stepId) {
198845
+ const target = targets[0];
198846
+ if (!target)
198847
+ throw planError2("INVALID_INPUT", "create step has no resolved targets", stepId);
198848
+ if (target.kind === "range")
198849
+ return target.blockId;
198850
+ const segments = target.segments;
198851
+ if (!segments.length)
198852
+ throw planError2("INVALID_INPUT", "span target has no segments", stepId);
198853
+ return position4 === "before" ? segments[0].blockId : segments[segments.length - 1].blockId;
198854
+ }
198855
+ function validateInsertionContext2(editor, index2, step, stepIndex, anchorBlockId, position4) {
198856
+ const candidate = index2.candidates.find((c2) => c2.nodeId === anchorBlockId);
198857
+ if (!candidate)
198858
+ return;
198859
+ const paragraphType = editor.state.schema?.nodes?.paragraph;
198860
+ if (!paragraphType)
198861
+ return;
198862
+ const resolvedPos = editor.state.doc.resolve(candidate.pos);
198863
+ const parent = resolvedPos.parent;
198864
+ const anchorIndex = resolvedPos.index();
198865
+ const insertionIndex = position4 === "before" ? anchorIndex : anchorIndex + 1;
198866
+ const canInsert = typeof parent.canReplaceWith === "function" ? parent.canReplaceWith(insertionIndex, insertionIndex, paragraphType) : parent.type.contentMatch.matchType(paragraphType);
198867
+ if (!canInsert) {
198868
+ const allowedChildTypes = [];
198869
+ const match2 = parent.type.contentMatch;
198870
+ for (const nodeType of Object.values(editor.state.schema.nodes)) {
198871
+ if (match2.matchType(nodeType)) {
198872
+ allowedChildTypes.push(nodeType.name);
198873
+ }
198874
+ }
198875
+ throw planError2("INVALID_INSERTION_CONTEXT", `Cannot create ${step.op} inside ${parent.type.name}`, step.id, {
198876
+ stepIndex,
198877
+ stepId: step.id,
198878
+ operation: step.op,
198879
+ anchorBlockId,
198880
+ parentType: parent.type.name,
198881
+ allowedChildTypes,
198882
+ insertionIndex,
198883
+ requestedChildType: "paragraph",
198884
+ requestedSemanticType: step.op === "create.heading" ? "heading" : "paragraph"
198885
+ });
198886
+ }
198887
+ }
198613
198888
  function isV3Ref2(payload) {
198614
198889
  return typeof payload === "object" && payload !== null && "v" in payload && payload.v === 3;
198615
198890
  }
@@ -198837,7 +199112,14 @@ function decodeTextRefPayload2(encoded, stepId) {
198837
199112
  function resolveV3TextRef2(editor, index2, step, refData) {
198838
199113
  const currentRevision = getRevision2(editor);
198839
199114
  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 });
199115
+ 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, {
199116
+ refRevision: refData.rev,
199117
+ currentRevision,
199118
+ refStability: "ephemeral",
199119
+ refScope: refData.scope,
199120
+ blockId: refData.segments?.[0]?.blockId,
199121
+ remediation: `Re-run query.match() to obtain a fresh ref valid for the current revision.`
199122
+ });
198841
199123
  }
198842
199124
  if (!refData.segments?.length)
198843
199125
  return [];
@@ -198936,7 +199218,11 @@ function resolveStepTargets2(editor, index2, step) {
198936
199218
  });
198937
199219
  if (refWhere) {
198938
199220
  if (targets.length === 0) {
198939
- throw planError2("MATCH_NOT_FOUND", `ref "${refWhere.ref}" did not resolve to any targets`, step.id);
199221
+ throw planError2("MATCH_NOT_FOUND", `ref "${refWhere.ref}" did not resolve to any targets`, step.id, {
199222
+ selectorType: "ref",
199223
+ selectorPattern: refWhere.ref,
199224
+ candidateCount: 0
199225
+ });
198940
199226
  }
198941
199227
  if (targets.length > 1) {
198942
199228
  throw planError2("AMBIGUOUS_MATCH", `ref "${refWhere.ref}" resolved to ${targets.length} targets`, step.id, {
@@ -198955,6 +199241,18 @@ function resolveStepTargets2(editor, index2, step) {
198955
199241
  }
198956
199242
  return targets;
198957
199243
  }
199244
+ function buildMatchNotFoundDetails2(step) {
199245
+ const where = step.where;
199246
+ const select2 = "select" in where ? where.select : undefined;
199247
+ const within2 = "within" in where ? where.within : undefined;
199248
+ return {
199249
+ selectorType: select2?.type ?? "unknown",
199250
+ selectorPattern: select2?.pattern ?? "",
199251
+ selectorMode: select2?.mode ?? "contains",
199252
+ searchScope: within2?.blockId ?? "document",
199253
+ candidateCount: 0
199254
+ };
199255
+ }
198958
199256
  function applyCardinalityCheck2(step, targets) {
198959
199257
  const where = step.where;
198960
199258
  if (!("require" in where) || where.require === undefined)
@@ -198962,11 +199260,11 @@ function applyCardinalityCheck2(step, targets) {
198962
199260
  const require2 = where.require;
198963
199261
  if (require2 === "first") {
198964
199262
  if (targets.length === 0) {
198965
- throw planError2("MATCH_NOT_FOUND", "selector matched zero ranges", step.id);
199263
+ throw planError2("MATCH_NOT_FOUND", "selector matched zero ranges", step.id, buildMatchNotFoundDetails2(step));
198966
199264
  }
198967
199265
  } else if (require2 === "exactlyOne") {
198968
199266
  if (targets.length === 0) {
198969
- throw planError2("MATCH_NOT_FOUND", "selector matched zero ranges", step.id);
199267
+ throw planError2("MATCH_NOT_FOUND", "selector matched zero ranges", step.id, buildMatchNotFoundDetails2(step));
198970
199268
  }
198971
199269
  if (targets.length > 1) {
198972
199270
  throw planError2("AMBIGUOUS_MATCH", `selector matched ${targets.length} ranges, expected exactly one`, step.id, {
@@ -198975,47 +199273,119 @@ function applyCardinalityCheck2(step, targets) {
198975
199273
  }
198976
199274
  } else if (require2 === "all") {
198977
199275
  if (targets.length === 0) {
198978
- throw planError2("MATCH_NOT_FOUND", "selector matched zero ranges", step.id);
199276
+ throw planError2("MATCH_NOT_FOUND", "selector matched zero ranges", step.id, buildMatchNotFoundDetails2(step));
198979
199277
  }
198980
199278
  }
198981
199279
  }
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);
199280
+ function normalizeOpForMatrix2(op) {
199281
+ return op.startsWith("create.") ? "create.*" : op;
199282
+ }
199283
+ function classifyOverlap2(stepA, stepB) {
199284
+ const rangesA = extractBlockRanges2(stepA);
199285
+ const rangesB = extractBlockRanges2(stepB);
199286
+ const opA = normalizeOpForMatrix2(stepA.step.op);
199287
+ const opB = normalizeOpForMatrix2(stepB.step.op);
199288
+ const isCreateA = opA === "create.*";
199289
+ const isCreateB = opB === "create.*";
199290
+ for (const [blockId, aEntries] of rangesA) {
199291
+ const bEntries = rangesB.get(blockId);
199292
+ if (!bEntries)
199293
+ continue;
199294
+ for (const a2 of aEntries) {
199295
+ for (const b3 of bEntries) {
199296
+ if (isCreateA || isCreateB) {
199297
+ return { overlapClass: "same_block", blockId, rangeA: a2, rangeB: b3 };
199298
+ }
199299
+ if (a2.to <= b3.from || b3.to <= a2.from)
199300
+ continue;
199301
+ if (a2.from === b3.from && a2.to === b3.to) {
199302
+ return { overlapClass: "same_target", blockId, rangeA: a2, rangeB: b3 };
198991
199303
  }
199304
+ return { overlapClass: "overlapping", blockId, rangeA: a2, rangeB: b3 };
198992
199305
  }
198993
199306
  }
198994
199307
  }
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 } });
199308
+ return;
199309
+ }
199310
+ function extractBlockRanges2(compiled) {
199311
+ const result = new Map;
199312
+ for (const target of compiled.targets) {
199313
+ if (target.kind === "range") {
199314
+ pushBlockRange2(result, target.blockId, target.from, target.to);
199315
+ } else {
199316
+ for (const seg of target.segments) {
199317
+ pushBlockRange2(result, seg.blockId, seg.from, seg.to);
199002
199318
  }
199003
199319
  }
199004
199320
  }
199321
+ return result;
199005
199322
  }
199006
- function addRange4(map6, blockId, stepId, from3, to) {
199007
- let blockRanges = map6.get(blockId);
199008
- if (!blockRanges) {
199009
- blockRanges = [];
199010
- map6.set(blockId, blockRanges);
199323
+ function pushBlockRange2(map6, blockId, from3, to) {
199324
+ let entries = map6.get(blockId);
199325
+ if (!entries) {
199326
+ entries = [];
199327
+ map6.set(blockId, entries);
199328
+ }
199329
+ entries.push({ from: from3, to });
199330
+ }
199331
+ function validateStepInteractions2(steps) {
199332
+ for (let i4 = 0;i4 < steps.length; i4++) {
199333
+ for (let j2 = i4 + 1;j2 < steps.length; j2++) {
199334
+ const stepA = steps[i4];
199335
+ const stepB = steps[j2];
199336
+ if (MATRIX_EXEMPT_OPS2.has(stepA.step.op) || MATRIX_EXEMPT_OPS2.has(stepB.step.op))
199337
+ continue;
199338
+ const overlap = classifyOverlap2(stepA, stepB);
199339
+ if (!overlap)
199340
+ continue;
199341
+ const opA = normalizeOpForMatrix2(stepA.step.op);
199342
+ const opB = normalizeOpForMatrix2(stepB.step.op);
199343
+ const matrixKey = `${opA}::${opB}::${overlap.overlapClass}`;
199344
+ const verdict = STEP_INTERACTION_MATRIX2.get(matrixKey) ?? "reject";
199345
+ if (verdict === "reject") {
199346
+ throw planError2("PLAN_CONFLICT_OVERLAP", `steps "${stepA.step.id}" and "${stepB.step.id}" target overlapping ranges in block "${overlap.blockId}"`, stepB.step.id, {
199347
+ blockId: overlap.blockId,
199348
+ stepIdA: stepA.step.id,
199349
+ stepIdB: stepB.step.id,
199350
+ opKeyA: stepA.step.op,
199351
+ opKeyB: stepB.step.op,
199352
+ rangeA: overlap.rangeA,
199353
+ rangeB: overlap.rangeB,
199354
+ overlapRegion: {
199355
+ from: Math.max(overlap.rangeA.from, overlap.rangeB.from),
199356
+ to: Math.min(overlap.rangeA.to, overlap.rangeB.to)
199357
+ },
199358
+ matrixVerdict: verdict,
199359
+ matrixKey
199360
+ });
199361
+ }
199362
+ }
199363
+ }
199364
+ }
199365
+ function assertNoDuplicateBlockIds2(index2) {
199366
+ const seen = new Map;
199367
+ const duplicates = [];
199368
+ for (const candidate of index2.candidates) {
199369
+ const count = seen.get(candidate.nodeId) ?? 0;
199370
+ seen.set(candidate.nodeId, count + 1);
199371
+ if (count === 1)
199372
+ duplicates.push(candidate.nodeId);
199373
+ }
199374
+ if (duplicates.length > 0) {
199375
+ throw planError2("DOCUMENT_IDENTITY_CONFLICT", "Document contains blocks with duplicate identities. This must be resolved before mutations can be applied.", undefined, {
199376
+ duplicateBlockIds: duplicates,
199377
+ blockCount: duplicates.length,
199378
+ remediation: "Re-import the document or call document.repair() to assign unique identities."
199379
+ });
199011
199380
  }
199012
- blockRanges.push({ stepId, from: from3, to });
199013
199381
  }
199014
199382
  function compilePlan2(editor, steps) {
199015
199383
  if (steps.length > MAX_PLAN_STEPS) {
199016
199384
  throw planError2("INVALID_INPUT", `plan contains ${steps.length} steps, maximum is ${MAX_PLAN_STEPS}`);
199017
199385
  }
199386
+ const compiledRevision = getRevision2(editor);
199018
199387
  const index2 = getBlockIndex2(editor);
199388
+ assertNoDuplicateBlockIds2(index2);
199019
199389
  const mutationSteps = [];
199020
199390
  const assertSteps = [];
199021
199391
  const seenIds = new Set;
@@ -199029,25 +199399,36 @@ function compilePlan2(editor, steps) {
199029
199399
  seenIds.add(step.id);
199030
199400
  }
199031
199401
  let totalTargets = 0;
199402
+ let stepIndex = 0;
199032
199403
  for (const step of steps) {
199033
199404
  if (isAssertStep2(step)) {
199034
199405
  assertSteps.push(step);
199406
+ stepIndex++;
199035
199407
  continue;
199036
199408
  }
199037
199409
  if (!hasStepExecutor2(step.op)) {
199038
199410
  throw planError2("INVALID_INPUT", `unknown step op "${step.op}"`, step.id);
199039
199411
  }
199412
+ if (isCreateOp2(step.op)) {
199413
+ validateCreateStepPosition2(step);
199414
+ }
199040
199415
  const targets = resolveStepTargets2(editor, index2, step);
199416
+ if (isCreateOp2(step.op) && targets.length > 0) {
199417
+ const position4 = step.args.position ?? "after";
199418
+ const anchorBlockId = resolveCreateAnchorFromTargets2(targets, position4, step.id);
199419
+ validateInsertionContext2(editor, index2, step, stepIndex, anchorBlockId, position4);
199420
+ }
199041
199421
  totalTargets += targets.length;
199042
199422
  mutationSteps.push({ step, targets });
199423
+ stepIndex++;
199043
199424
  }
199044
199425
  if (totalTargets > MAX_PLAN_RESOLVED_TARGETS) {
199045
199426
  throw planError2("INVALID_INPUT", `plan resolved ${totalTargets} total targets, maximum is ${MAX_PLAN_RESOLVED_TARGETS}`);
199046
199427
  }
199047
- detectOverlaps2(mutationSteps);
199048
- return { mutationSteps, assertSteps };
199428
+ validateStepInteractions2(mutationSteps);
199429
+ return { mutationSteps, assertSteps, compiledRevision };
199049
199430
  }
199050
- var REF_HANDLERS2;
199431
+ var VALID_CREATE_POSITIONS2, REF_HANDLERS2, STEP_INTERACTION_MATRIX2, MATRIX_EXEMPT_OPS2;
199051
199432
  var init_compiler = __esm(() => {
199052
199433
  init_src();
199053
199434
  init_errors4();
@@ -199058,6 +199439,7 @@ var init_compiler = __esm(() => {
199058
199439
  init_text_strategy();
199059
199440
  init_block_strategy();
199060
199441
  init_node_address_resolver();
199442
+ VALID_CREATE_POSITIONS2 = ["before", "after"];
199061
199443
  REF_HANDLERS2 = [
199062
199444
  { prefix: "text:", handler: resolveTextRef2 },
199063
199445
  {
@@ -199074,6 +199456,48 @@ var init_compiler = __esm(() => {
199074
199456
  },
199075
199457
  { prefix: "", handler: resolveBlockRef2 }
199076
199458
  ];
199459
+ STEP_INTERACTION_MATRIX2 = new Map([
199460
+ ["text.rewrite::format.apply::same_target", "allow"],
199461
+ ["text.rewrite::text.rewrite::same_target", "reject"],
199462
+ ["text.rewrite::text.delete::overlapping", "reject"],
199463
+ ["text.rewrite::create.*::same_block", "allow"],
199464
+ ["text.rewrite::text.insert::same_target", "reject"],
199465
+ ["format.apply::format.apply::same_target", "allow"],
199466
+ ["format.apply::text.rewrite::same_target", "reject"],
199467
+ ["format.apply::text.delete::overlapping", "reject"],
199468
+ ["format.apply::create.*::same_block", "allow"],
199469
+ ["format.apply::text.insert::same_target", "allow"],
199470
+ ["text.delete::text.rewrite::overlapping", "reject"],
199471
+ ["text.delete::text.delete::overlapping", "reject"],
199472
+ ["text.delete::format.apply::overlapping", "reject"],
199473
+ ["text.delete::create.*::same_block", "allow"],
199474
+ ["text.delete::text.insert::overlapping", "reject"],
199475
+ ["create.*::text.rewrite::same_block", "allow"],
199476
+ ["create.*::format.apply::same_block", "allow"],
199477
+ ["create.*::text.delete::same_block", "allow"],
199478
+ ["create.*::create.*::same_block", "allow"],
199479
+ ["create.*::text.insert::same_block", "allow"],
199480
+ ["text.insert::format.apply::same_target", "allow"],
199481
+ ["text.insert::text.rewrite::same_target", "reject"],
199482
+ ["text.insert::text.delete::overlapping", "reject"],
199483
+ ["text.insert::create.*::same_block", "allow"],
199484
+ ["text.insert::text.insert::same_target", "reject"]
199485
+ ]);
199486
+ MATRIX_EXEMPT_OPS2 = new Set(["assert"]);
199487
+ });
199488
+
199489
+ // ../../packages/super-editor/src/document-api-adapters/plan-engine/create-insertion.ts
199490
+ function resolveBlockInsertionPos2(editor, anchorBlockId, position4, stepId) {
199491
+ const index2 = getBlockIndex2(editor);
199492
+ const candidate = index2.candidates.find((c2) => c2.nodeId === anchorBlockId);
199493
+ if (!candidate) {
199494
+ throw planError2("TARGET_NOT_FOUND", `block "${anchorBlockId}" not found`, stepId);
199495
+ }
199496
+ return position4 === "before" ? candidate.pos : candidate.end;
199497
+ }
199498
+ var init_create_insertion = __esm(() => {
199499
+ init_index_cache();
199500
+ init_errors4();
199077
199501
  });
199078
199502
 
199079
199503
  // ../../packages/super-editor/src/document-api-adapters/helpers/transaction-meta.ts
@@ -199141,12 +199565,36 @@ function buildMarksFromSetMarks2(editor, setMarks) {
199141
199565
  marks.push(schema.marks.strike.create());
199142
199566
  return marks;
199143
199567
  }
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;
199568
+ function applyInlineMarkPatches2(editor, tr, absFrom, absTo, inline) {
199569
+ const { schema } = editor.state;
199570
+ let changed = false;
199571
+ const markEntries = [
199572
+ [inline.bold, schema.marks.bold],
199573
+ [inline.italic, schema.marks.italic],
199574
+ [inline.underline, schema.marks.underline],
199575
+ [inline.strike, schema.marks.strike]
199576
+ ];
199577
+ for (const [value, markType] of markEntries) {
199578
+ if (value === undefined || !markType)
199579
+ continue;
199580
+ if (value) {
199581
+ tr.addMark(absFrom, absTo, markType.create());
199582
+ } else {
199583
+ tr.removeMark(absFrom, absTo, markType);
199584
+ }
199585
+ changed = true;
199586
+ }
199587
+ return changed;
199588
+ }
199589
+ function resolveCreateAnchorBlockId2(target, position4, stepId) {
199590
+ if (target.kind === "range") {
199591
+ return target.blockId;
199592
+ }
199593
+ const segments = target.segments;
199594
+ if (!segments.length) {
199595
+ throw planError2("INVALID_INPUT", "span target has no segments", stepId);
199596
+ }
199597
+ return position4 === "before" ? segments[0].blockId : segments[segments.length - 1].blockId;
199150
199598
  }
199151
199599
  function executeTextRewrite2(editor, tr, target, step, mapping) {
199152
199600
  const absFrom = mapping.map(target.absFrom);
@@ -199193,25 +199641,7 @@ function executeTextDelete2(_editor, tr, target, _step, mapping) {
199193
199641
  function executeStyleApply3(editor, tr, target, step, mapping) {
199194
199642
  const absFrom = mapping.map(target.absFrom);
199195
199643
  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 };
199644
+ return { changed: applyInlineMarkPatches2(editor, tr, absFrom, absTo, step.args.inline) };
199215
199645
  }
199216
199646
  function validateMappedSpanContiguity2(target, mapping, stepId) {
199217
199647
  let lastMappedEnd = -1;
@@ -199282,29 +199712,11 @@ function executeSpanTextDelete2(_editor, tr, target, step, mapping) {
199282
199712
  }
199283
199713
  function executeSpanStyleApply2(editor, tr, target, step, mapping) {
199284
199714
  validateMappedSpanContiguity2(target, mapping, step.id);
199285
- const { schema } = editor.state;
199286
- let changed = false;
199287
199715
  const firstSeg = target.segments[0];
199288
199716
  const lastSeg = target.segments[target.segments.length - 1];
199289
199717
  const absFrom = mapping.map(firstSeg.absFrom, 1);
199290
199718
  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 };
199719
+ return { changed: applyInlineMarkPatches2(editor, tr, absFrom, absTo, step.args.inline) };
199308
199720
  }
199309
199721
  function getReplacementText2(replacement) {
199310
199722
  if (replacement.blocks !== undefined) {
@@ -199503,11 +199915,14 @@ function executeAssertStep2(_editor, tr, step) {
199503
199915
  }
199504
199916
  function executeCreateStep2(editor, tr, step, targets, mapping) {
199505
199917
  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);
199918
+ if (!target) {
199919
+ throw planError2("INVALID_INPUT", `${step.op} step requires at least one target`, step.id);
199508
199920
  }
199509
199921
  const args3 = step.args;
199510
- const pos = mapping.map(toAbsoluteBlockInsertPos2(editor, target.blockId, target.from, step.id));
199922
+ const position4 = args3.position ?? "after";
199923
+ const anchorBlockId = resolveCreateAnchorBlockId2(target, position4, step.id);
199924
+ const anchorPos = resolveBlockInsertionPos2(editor, anchorBlockId, position4, step.id);
199925
+ const pos = mapping.map(anchorPos);
199511
199926
  const paragraphType = editor.state.schema?.nodes?.paragraph;
199512
199927
  if (!paragraphType) {
199513
199928
  throw planError2("INVALID_INPUT", "paragraph node type not in schema", step.id);
@@ -199530,6 +199945,7 @@ function executeCreateStep2(editor, tr, step, targets, mapping) {
199530
199945
  throw planError2("INVALID_INPUT", `could not create ${step.op} node`, step.id);
199531
199946
  }
199532
199947
  tr.insert(pos, node3);
199948
+ assertNoPostInsertDuplicateIds2(tr.doc, step.id);
199533
199949
  return {
199534
199950
  stepId: step.id,
199535
199951
  op: step.op,
@@ -199538,6 +199954,32 @@ function executeCreateStep2(editor, tr, step, targets, mapping) {
199538
199954
  data: { domain: "text", resolutions: [] }
199539
199955
  };
199540
199956
  }
199957
+ function assertNoPostInsertDuplicateIds2(doc4, stepId) {
199958
+ const seen = new Set;
199959
+ const duplicateSet = new Set;
199960
+ doc4.descendants((node3) => {
199961
+ if (!node3.isTextblock)
199962
+ return true;
199963
+ const attrs = node3.attrs ?? {};
199964
+ const id2 = typeof attrs.paraId === "string" && attrs.paraId || typeof attrs.sdBlockId === "string" && attrs.sdBlockId || typeof attrs.nodeId === "string" && attrs.nodeId;
199965
+ if (!id2)
199966
+ return true;
199967
+ if (seen.has(id2)) {
199968
+ duplicateSet.add(id2);
199969
+ } else {
199970
+ seen.add(id2);
199971
+ }
199972
+ return true;
199973
+ });
199974
+ if (duplicateSet.size > 0) {
199975
+ const duplicates = [...duplicateSet];
199976
+ throw planError2("INTERNAL_ERROR", `create step produced duplicate block identities: [${duplicates.join(", ")}]`, stepId, {
199977
+ source: "executor:checkPostInsertIdentityUniqueness",
199978
+ invariant: "post-insert block IDs must be unique",
199979
+ duplicateBlockIds: duplicates
199980
+ });
199981
+ }
199982
+ }
199541
199983
  function runMutationsOnTransaction2(editor, tr, compiled, options) {
199542
199984
  const mapping = tr.mapping;
199543
199985
  const stepOutcomes = [];
@@ -199586,6 +200028,15 @@ function executeCompiledPlan2(editor, compiled, options = {}) {
199586
200028
  const startTime = performance.now();
199587
200029
  const revisionBefore = getRevision2(editor);
199588
200030
  checkRevision2(editor, options.expectedRevision);
200031
+ if (compiled.compiledRevision !== revisionBefore) {
200032
+ throw planError2("REVISION_CHANGED_SINCE_COMPILE", `Document revision changed between compile and execute. Compiled at "${compiled.compiledRevision}", now at "${revisionBefore}".`, undefined, {
200033
+ compiledRevision: compiled.compiledRevision,
200034
+ currentRevision: revisionBefore,
200035
+ stepCount: compiled.mutationSteps.length,
200036
+ failedAtStep: "pre-execution",
200037
+ remediation: "Re-compile the plan against the current document state."
200038
+ });
200039
+ }
199589
200040
  const tr = editor.state.tr;
199590
200041
  const changeMode = options.changeMode ?? "direct";
199591
200042
  if (changeMode === "tracked") {
@@ -199626,6 +200077,7 @@ var init_executor = __esm(() => {
199626
200077
  init_revision_tracker();
199627
200078
  init_compiler();
199628
200079
  init_index_cache();
200080
+ init_create_insertion();
199629
200081
  init_style_resolver();
199630
200082
  init_node_address_resolver();
199631
200083
  init_adapter_utils();
@@ -199795,7 +200247,11 @@ function executeDomainCommand2(editor, handler2, options) {
199795
200247
  args: {},
199796
200248
  _handler: handler2
199797
200249
  };
199798
- const compiled = { mutationSteps: [{ step, targets: [] }], assertSteps: [] };
200250
+ const compiled = {
200251
+ mutationSteps: [{ step, targets: [] }],
200252
+ assertSteps: [],
200253
+ compiledRevision: getRevision2(editor)
200254
+ };
199799
200255
  return executeCompiledPlan2(editor, compiled, { expectedRevision: options?.expectedRevision });
199800
200256
  }
199801
200257
  function validateWriteRequest2(request, resolved) {
@@ -199871,7 +200327,8 @@ function writeWrapper2(editor, request, options) {
199871
200327
  const target = toCompiledTarget2(stepId, op, resolved);
199872
200328
  const compiled = {
199873
200329
  mutationSteps: [{ step, targets: [target] }],
199874
- assertSteps: []
200330
+ assertSteps: [],
200331
+ compiledRevision: getRevision2(editor)
199875
200332
  };
199876
200333
  const receipt2 = executeCompiledPlan2(editor, compiled, {
199877
200334
  changeMode: mode,
@@ -199935,7 +200392,8 @@ function styleApplyWrapper2(editor, input2, options) {
199935
200392
  };
199936
200393
  const compiled = {
199937
200394
  mutationSteps: [{ step, targets: [target] }],
199938
- assertSteps: []
200395
+ assertSteps: [],
200396
+ compiledRevision: getRevision2(editor)
199939
200397
  };
199940
200398
  const receipt2 = executeCompiledPlan2(editor, compiled, {
199941
200399
  changeMode: mode,
@@ -199947,6 +200405,7 @@ var STUB_WHERE2, MARK_KEY_TO_SCHEMA_NAME2;
199947
200405
  var init_plan_wrappers = __esm(() => {
199948
200406
  init_wrapper();
199949
200407
  init_executor();
200408
+ init_revision_tracker();
199950
200409
  init_errors3();
199951
200410
  init_adapter_utils();
199952
200411
  init_mutation_helpers();
@@ -201067,14 +201526,7 @@ function resolveCreateInsertPosition2(editor, at, operationLabel) {
201067
201526
  return 0;
201068
201527
  if (location3.kind === "documentEnd")
201069
201528
  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;
201529
+ return resolveBlockInsertionPos2(editor, location3.target.nodeId, location3.kind);
201078
201530
  }
201079
201531
  function resolveCreatedBlock2(editor, nodeType, blockId) {
201080
201532
  const index2 = getBlockIndex2(editor);
@@ -201180,7 +201632,10 @@ function createParagraphWrapper2(editor, input2, options) {
201180
201632
  if (mode === "tracked") {
201181
201633
  trackedChangeRefs = collectTrackInsertRefsInRange2(editor, paragraph2.pos, paragraph2.end);
201182
201634
  }
201183
- } catch {}
201635
+ } catch (e) {
201636
+ if (!(e instanceof DocumentApiAdapterError3))
201637
+ throw e;
201638
+ }
201184
201639
  }
201185
201640
  return didApply;
201186
201641
  }, { expectedRevision: options?.expectedRevision });
@@ -201249,7 +201704,10 @@ function createHeadingWrapper2(editor, input2, options) {
201249
201704
  if (mode === "tracked") {
201250
201705
  trackedChangeRefs = collectTrackInsertRefsInRange2(editor, heading3.pos, heading3.end);
201251
201706
  }
201252
- } catch {}
201707
+ } catch (e) {
201708
+ if (!(e instanceof DocumentApiAdapterError3))
201709
+ throw e;
201710
+ }
201253
201711
  }
201254
201712
  return didApply;
201255
201713
  }, { expectedRevision: options?.expectedRevision });
@@ -201267,7 +201725,7 @@ function createHeadingWrapper2(editor, input2, options) {
201267
201725
  var init_create_wrappers = __esm(() => {
201268
201726
  init_wrapper();
201269
201727
  init_index_cache();
201270
- init_node_address_resolver();
201728
+ init_create_insertion();
201271
201729
  init_tracked_change_refs();
201272
201730
  init_errors3();
201273
201731
  init_mutation_helpers();
@@ -235692,7 +236150,6 @@ var init_track_changes_wrappers = __esm(() => {
235692
236150
 
235693
236151
  // ../../packages/super-editor/src/document-api-adapters/plan-engine/preview.ts
235694
236152
  function previewPlan2(editor, input2) {
235695
- const evaluatedRevision = getRevision2(editor);
235696
236153
  checkRevision2(editor, input2.expectedRevision);
235697
236154
  if (!input2.steps?.length) {
235698
236155
  throw planError2("INVALID_INPUT", "plan must contain at least one step");
@@ -235700,8 +236157,10 @@ function previewPlan2(editor, input2) {
235700
236157
  const failures = [];
235701
236158
  const stepPreviews = [];
235702
236159
  let currentPhase = "compile";
236160
+ let evaluatedRevision = getRevision2(editor);
235703
236161
  try {
235704
236162
  const compiled = compilePlan2(editor, input2.steps);
236163
+ evaluatedRevision = compiled.compiledRevision;
235705
236164
  currentPhase = "execute";
235706
236165
  const tr = editor.state.tr;
235707
236166
  const { stepOutcomes, assertFailures } = runMutationsOnTransaction2(editor, tr, compiled, {
@@ -236269,7 +236728,13 @@ function queryMatchAdapter2(editor, input2) {
236269
236728
  const paginatedMatches = isTextSelector ? applyPagination2(rawMatches, userOffset, input2.limit) : rawMatches;
236270
236729
  if (require2 === "first" || require2 === "exactlyOne" || require2 === "all") {
236271
236730
  if (totalMatches === 0) {
236272
- throw planError2("MATCH_NOT_FOUND", "selector matched zero ranges");
236731
+ throw planError2("MATCH_NOT_FOUND", "selector matched zero ranges", undefined, {
236732
+ selectorType: input2.select?.type ?? "unknown",
236733
+ selectorPattern: input2.select?.pattern ?? "",
236734
+ selectorMode: input2.select?.mode ?? "contains",
236735
+ searchScope: (input2.within?.kind === "block" ? input2.within.nodeId : undefined) ?? "document",
236736
+ candidateCount: 0
236737
+ });
236273
236738
  }
236274
236739
  }
236275
236740
  if (require2 === "exactlyOne" && totalMatches > 1) {
@@ -236282,7 +236747,11 @@ function queryMatchAdapter2(editor, input2) {
236282
236747
  if (isTextSelector && raw.textRanges?.length) {
236283
236748
  const blocks2 = buildMatchBlocks2(editor, raw.textRanges, evaluatedRevision, id2);
236284
236749
  if (blocks2.length === 0) {
236285
- throw planError2("INTERNAL_ERROR", `text match produced no blocks for ${id2}`);
236750
+ throw planError2("INTERNAL_ERROR", `text match produced no blocks for ${id2}`, undefined, {
236751
+ source: "query-match-adapter:buildMatchEntries",
236752
+ invariant: "text match must have at least one block after zero-width filtering",
236753
+ context: { matchId: id2 }
236754
+ });
236286
236755
  }
236287
236756
  const snippetResult = buildBlocksSnippet2(editor, blocks2);
236288
236757
  const segments = blocks2.map((b4) => ({ blockId: b4.blockId, start: b4.range.start, end: b4.range.end }));
@@ -239496,6 +239965,9 @@ function mapListsError(operationId, error, code7) {
239496
239965
  function mapTextMutationError(operationId, error, code7) {
239497
239966
  const message = extractErrorMessage(error);
239498
239967
  const details = extractErrorDetails(error);
239968
+ const planEngineError = tryMapPlanEngineError(operationId, error, code7);
239969
+ if (planEngineError)
239970
+ return planEngineError;
239499
239971
  if (code7 === "TARGET_NOT_FOUND") {
239500
239972
  return new CliError("TARGET_NOT_FOUND", message, { operationId, details });
239501
239973
  }
@@ -239515,6 +239987,9 @@ function mapTextMutationError(operationId, error, code7) {
239515
239987
  function mapCreateError(operationId, error, code7) {
239516
239988
  const message = extractErrorMessage(error);
239517
239989
  const details = extractErrorDetails(error);
239990
+ const planEngineError = tryMapPlanEngineError(operationId, error, code7);
239991
+ if (planEngineError)
239992
+ return planEngineError;
239518
239993
  if (code7 === "TARGET_NOT_FOUND") {
239519
239994
  return new CliError("TARGET_NOT_FOUND", message, { operationId, details });
239520
239995
  }
@@ -239571,6 +240046,14 @@ function mapQueryError(operationId, error, code7) {
239571
240046
  return error;
239572
240047
  return new CliError("COMMAND_FAILED", message, { operationId, details });
239573
240048
  }
240049
+ function tryMapPlanEngineError(operationId, error, code7) {
240050
+ if (!code7 || !PLAN_ENGINE_PASSTHROUGH_CODES.has(code7))
240051
+ return null;
240052
+ return new CliError(code7, extractErrorMessage(error), {
240053
+ operationId,
240054
+ details: extractErrorDetails(error)
240055
+ });
240056
+ }
239574
240057
  function mapInvokeError(operationId, error) {
239575
240058
  if (error instanceof CliError)
239576
240059
  return error;
@@ -239595,6 +240078,9 @@ function mapFailedReceipt(operationId, result) {
239595
240078
  }
239596
240079
  const failureCode = failure.code;
239597
240080
  const failureMessage = failure.message ?? `${operationId}: operation failed.`;
240081
+ if (failureCode && PLAN_ENGINE_PASSTHROUGH_CODES.has(failureCode)) {
240082
+ return new CliError(failureCode, failureMessage, { operationId, failure });
240083
+ }
239598
240084
  if (family === "trackChanges") {
239599
240085
  if (failureCode === "TRACK_CHANGE_COMMAND_UNAVAILABLE") {
239600
240086
  return new CliError("TRACK_CHANGE_COMMAND_UNAVAILABLE", failureMessage, { operationId, failure });
@@ -239648,10 +240134,23 @@ function mapFailedReceipt(operationId, result) {
239648
240134
  }
239649
240135
  return new CliError("COMMAND_FAILED", failureMessage, { operationId, failure });
239650
240136
  }
239651
- var FAMILY_MAPPERS;
240137
+ var PLAN_ENGINE_PASSTHROUGH_CODES, FAMILY_MAPPERS;
239652
240138
  var init_error_mapping = __esm(() => {
239653
240139
  init_operation_hints();
239654
240140
  init_errors();
240141
+ PLAN_ENGINE_PASSTHROUGH_CODES = new Set([
240142
+ "REVISION_MISMATCH",
240143
+ "REVISION_CHANGED_SINCE_COMPILE",
240144
+ "PLAN_CONFLICT_OVERLAP",
240145
+ "DOCUMENT_IDENTITY_CONFLICT",
240146
+ "INVALID_INSERTION_CONTEXT",
240147
+ "INVALID_INPUT",
240148
+ "INVALID_STEP_COMBINATION",
240149
+ "MATCH_NOT_FOUND",
240150
+ "PRECONDITION_FAILED",
240151
+ "CROSS_BLOCK_MATCH",
240152
+ "SPAN_FRAGMENTED"
240153
+ ]);
239655
240154
  FAMILY_MAPPERS = {
239656
240155
  trackChanges: mapTrackChangesError,
239657
240156
  comments: mapCommentsError,
@@ -239660,7 +240159,10 @@ var init_error_mapping = __esm(() => {
239660
240159
  create: mapCreateError,
239661
240160
  blocks: mapBlocksError,
239662
240161
  query: mapQueryError,
239663
- general: (operationId, error) => {
240162
+ general: (operationId, error, code7) => {
240163
+ const planEngineError = tryMapPlanEngineError(operationId, error, code7);
240164
+ if (planEngineError)
240165
+ return planEngineError;
239664
240166
  if (error instanceof CliError)
239665
240167
  return error;
239666
240168
  return new CliError("COMMAND_FAILED", extractErrorMessage(error), { operationId });