@superdoc-dev/cli 0.2.0-next.6 → 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 +1193 -267
  2. package/package.json +8 -8
package/dist/index.js CHANGED
@@ -408,7 +408,7 @@ var init_args = __esm(() => {
408
408
  });
409
409
 
410
410
  // ../../packages/document-api/src/types/base.ts
411
- var NODE_KINDS, NODE_TYPES, BLOCK_NODE_TYPES, INLINE_NODE_TYPES;
411
+ var NODE_KINDS, NODE_TYPES, BLOCK_NODE_TYPES, DELETABLE_BLOCK_NODE_TYPES, INLINE_NODE_TYPES;
412
412
  var init_base = __esm(() => {
413
413
  NODE_KINDS = ["block", "inline"];
414
414
  NODE_TYPES = [
@@ -438,6 +438,13 @@ var init_base = __esm(() => {
438
438
  "image",
439
439
  "sdt"
440
440
  ];
441
+ DELETABLE_BLOCK_NODE_TYPES = [
442
+ "paragraph",
443
+ "heading",
444
+ "listItem",
445
+ "table",
446
+ "sdt"
447
+ ];
441
448
  INLINE_NODE_TYPES = [
442
449
  "run",
443
450
  "bookmark",
@@ -480,7 +487,6 @@ function buildDiscoveryResult(params) {
480
487
  page: params.page
481
488
  };
482
489
  }
483
-
484
490
  // ../../packages/document-api/src/types/index.ts
485
491
  var init_types = __esm(() => {
486
492
  init_base();
@@ -542,6 +548,9 @@ var init_operation_definitions = __esm(() => {
542
548
  "TARGET_MOVED",
543
549
  "PLAN_CONFLICT_OVERLAP",
544
550
  "INVALID_STEP_COMBINATION",
551
+ "REVISION_CHANGED_SINCE_COMPILE",
552
+ "INVALID_INSERTION_CONTEXT",
553
+ "DOCUMENT_IDENTITY_CONFLICT",
545
554
  "CAPABILITY_UNAVAILABLE"
546
555
  ];
547
556
  T_QUERY_MATCH = ["MATCH_NOT_FOUND", "AMBIGUOUS_MATCH", "INVALID_INPUT", "INTERNAL_ERROR"];
@@ -638,6 +647,27 @@ var init_operation_definitions = __esm(() => {
638
647
  referenceDocPath: "delete.mdx",
639
648
  referenceGroup: "core"
640
649
  },
650
+ "blocks.delete": {
651
+ memberPath: "blocks.delete",
652
+ description: "Delete an entire block node (paragraph, heading, list item, table, image, or sdt) deterministically.",
653
+ requiresDocumentContext: true,
654
+ metadata: mutationOperation({
655
+ idempotency: "conditional",
656
+ supportsDryRun: true,
657
+ supportsTrackedMode: false,
658
+ possibleFailureCodes: NONE_FAILURES,
659
+ throws: [
660
+ "TARGET_NOT_FOUND",
661
+ "AMBIGUOUS_TARGET",
662
+ "CAPABILITY_UNAVAILABLE",
663
+ "INVALID_TARGET",
664
+ "INVALID_INPUT",
665
+ "INTERNAL_ERROR"
666
+ ]
667
+ }),
668
+ referenceDocPath: "blocks/delete.mdx",
669
+ referenceGroup: "blocks"
670
+ },
641
671
  "format.apply": {
642
672
  memberPath: "format.apply",
643
673
  description: "Apply explicit inline style changes (bold, italic, underline, strike) to the target range using boolean patch semantics.",
@@ -1400,7 +1430,7 @@ function buildInternalContractSchemas() {
1400
1430
  operations
1401
1431
  };
1402
1432
  }
1403
- var nodeTypeValues, blockNodeTypeValues, inlineNodeTypeValues, knownTargetKindValues, SHARED_DEFS, rangeSchema, positionSchema, inlineAnchorSchema, targetKindSchema, textAddressSchema, textTargetSchema, blockNodeAddressSchema, paragraphAddressSchema, headingAddressSchema, listItemAddressSchema, inlineNodeAddressSchema, nodeAddressSchema, commentAddressSchema, trackedChangeAddressSchema, entityAddressSchema, resolvedHandleSchema, pageInfoSchema, receiptSuccessSchema, textMutationRangeSchema, textMutationResolutionSchema, textMutationSuccessSchema, matchRunSchema, matchBlockSchema, trackChangeRefSchema, createParagraphSuccessSchema, createHeadingSuccessSchema, headingLevelSchema, listsInsertSuccessSchema, listsMutateItemSuccessSchema, listsExitSuccessSchema, nodeSummarySchema, nodeInfoSchema, matchContextSchema, unknownNodeDiagnosticSchema, textSelectorSchema, nodeSelectorSchema, selectorShorthandSchema, selectSchema, findInputSchema, findItemDomainSchema, findOutputSchema, documentInfoCountsSchema, documentInfoOutlineItemSchema, documentInfoCapabilitiesSchema, documentInfoSchema, listKindSchema, listInsertPositionSchema, listItemInfoSchema, listItemDomainItemSchema, listsListResultSchema, commentInfoSchema, commentDomainItemSchema, commentsListResultSchema, trackChangeInfoSchema, trackChangeDomainItemSchema, trackChangesListResultSchema, capabilityReasonCodeSchema, capabilityReasonsSchema, capabilityFlagSchema, operationRuntimeCapabilitySchema, operationCapabilitiesSchema, formatCapabilitiesSchema, capabilitiesOutputSchema, strictEmptyObjectSchema, insertInputSchema, operationSchemas;
1433
+ var nodeTypeValues, blockNodeTypeValues, deletableBlockNodeTypeValues, inlineNodeTypeValues, knownTargetKindValues, SHARED_DEFS, rangeSchema, positionSchema, inlineAnchorSchema, targetKindSchema, textAddressSchema, textTargetSchema, blockNodeAddressSchema, deletableBlockNodeAddressSchema, paragraphAddressSchema, headingAddressSchema, listItemAddressSchema, inlineNodeAddressSchema, nodeAddressSchema, commentAddressSchema, trackedChangeAddressSchema, entityAddressSchema, resolvedHandleSchema, pageInfoSchema, receiptSuccessSchema, textMutationRangeSchema, textMutationResolutionSchema, textMutationSuccessSchema, matchRunSchema, matchBlockSchema, trackChangeRefSchema, createParagraphSuccessSchema, createHeadingSuccessSchema, headingLevelSchema, listsInsertSuccessSchema, listsMutateItemSuccessSchema, listsExitSuccessSchema, nodeSummarySchema, nodeInfoSchema, matchContextSchema, unknownNodeDiagnosticSchema, textSelectorSchema, nodeSelectorSchema, selectorShorthandSchema, selectSchema, findInputSchema, findItemDomainSchema, findOutputSchema, documentInfoCountsSchema, documentInfoOutlineItemSchema, documentInfoCapabilitiesSchema, documentInfoSchema, listKindSchema, listInsertPositionSchema, listItemInfoSchema, listItemDomainItemSchema, listsListResultSchema, commentInfoSchema, commentDomainItemSchema, commentsListResultSchema, trackChangeInfoSchema, trackChangeDomainItemSchema, trackChangesListResultSchema, capabilityReasonCodeSchema, capabilityReasonsSchema, capabilityFlagSchema, operationRuntimeCapabilitySchema, operationCapabilitiesSchema, formatCapabilitiesSchema, capabilitiesOutputSchema, strictEmptyObjectSchema, insertInputSchema, operationSchemas;
1404
1434
  var init_schemas = __esm(() => {
1405
1435
  init_command_catalog();
1406
1436
  init_types2();
@@ -1409,6 +1439,7 @@ var init_schemas = __esm(() => {
1409
1439
  init_format();
1410
1440
  nodeTypeValues = NODE_TYPES;
1411
1441
  blockNodeTypeValues = BLOCK_NODE_TYPES;
1442
+ deletableBlockNodeTypeValues = DELETABLE_BLOCK_NODE_TYPES;
1412
1443
  inlineNodeTypeValues = INLINE_NODE_TYPES;
1413
1444
  knownTargetKindValues = [
1414
1445
  "text",
@@ -1456,6 +1487,11 @@ var init_schemas = __esm(() => {
1456
1487
  nodeType: { enum: [...blockNodeTypeValues] },
1457
1488
  nodeId: { type: "string" }
1458
1489
  }, ["kind", "nodeType", "nodeId"]),
1490
+ DeletableBlockNodeAddress: objectSchema({
1491
+ kind: { const: "block" },
1492
+ nodeType: { enum: [...deletableBlockNodeTypeValues] },
1493
+ nodeId: { type: "string" }
1494
+ }, ["kind", "nodeType", "nodeId"]),
1459
1495
  ParagraphAddress: objectSchema({
1460
1496
  kind: { const: "block" },
1461
1497
  nodeType: { const: "paragraph" },
@@ -1562,6 +1598,7 @@ var init_schemas = __esm(() => {
1562
1598
  textAddressSchema = ref("TextAddress");
1563
1599
  textTargetSchema = ref("TextTarget");
1564
1600
  blockNodeAddressSchema = ref("BlockNodeAddress");
1601
+ deletableBlockNodeAddressSchema = ref("DeletableBlockNodeAddress");
1565
1602
  paragraphAddressSchema = ref("ParagraphAddress");
1566
1603
  headingAddressSchema = ref("HeadingAddress");
1567
1604
  listItemAddressSchema = ref("ListItemAddress");
@@ -1770,6 +1807,7 @@ var init_schemas = __esm(() => {
1770
1807
  capabilityReasonCodeSchema = {
1771
1808
  enum: [
1772
1809
  "COMMAND_UNAVAILABLE",
1810
+ "HELPER_UNAVAILABLE",
1773
1811
  "OPERATION_UNAVAILABLE",
1774
1812
  "TRACKED_MODE_UNAVAILABLE",
1775
1813
  "DRY_RUN_UNAVAILABLE",
@@ -1906,6 +1944,20 @@ var init_schemas = __esm(() => {
1906
1944
  success: textMutationSuccessSchema,
1907
1945
  failure: textMutationFailureSchemaFor("format.align")
1908
1946
  },
1947
+ "blocks.delete": {
1948
+ input: objectSchema({
1949
+ target: deletableBlockNodeAddressSchema
1950
+ }, ["target"]),
1951
+ output: objectSchema({
1952
+ success: { const: true },
1953
+ deleted: deletableBlockNodeAddressSchema
1954
+ }, ["success", "deleted"]),
1955
+ success: objectSchema({
1956
+ success: { const: true },
1957
+ deleted: deletableBlockNodeAddressSchema
1958
+ }, ["success", "deleted"]),
1959
+ failure: preApplyFailureResultSchemaFor("blocks.delete")
1960
+ },
1909
1961
  "create.paragraph": {
1910
1962
  input: objectSchema({
1911
1963
  at: {
@@ -2178,6 +2230,11 @@ var init_reference_doc_map = __esm(() => {
2178
2230
  description: "Primary read and write operations.",
2179
2231
  pagePath: "core/index.mdx"
2180
2232
  },
2233
+ blocks: {
2234
+ title: "Blocks",
2235
+ description: "Block-level structural operations.",
2236
+ pagePath: "blocks/index.mdx"
2237
+ },
2181
2238
  capabilities: {
2182
2239
  title: "Capabilities",
2183
2240
  description: "Runtime support discovery for capability-aware branching.",
@@ -2246,6 +2303,7 @@ var CAPABILITY_REASON_CODES;
2246
2303
  var init_capabilities = __esm(() => {
2247
2304
  CAPABILITY_REASON_CODES = [
2248
2305
  "COMMAND_UNAVAILABLE",
2306
+ "HELPER_UNAVAILABLE",
2249
2307
  "OPERATION_UNAVAILABLE",
2250
2308
  "TRACKED_MODE_UNAVAILABLE",
2251
2309
  "DRY_RUN_UNAVAILABLE",
@@ -2605,6 +2663,51 @@ var init_create = __esm(() => {
2605
2663
  init_errors2();
2606
2664
  });
2607
2665
 
2666
+ // ../../packages/document-api/src/blocks/blocks.ts
2667
+ function validateBlocksDeleteInput(input) {
2668
+ if (!input || typeof input !== "object") {
2669
+ throw new DocumentApiValidationError("INVALID_INPUT", "blocks.delete requires an input object.", {
2670
+ fields: ["input"]
2671
+ });
2672
+ }
2673
+ if (!input.target) {
2674
+ throw new DocumentApiValidationError("INVALID_INPUT", "blocks.delete requires a target.", {
2675
+ fields: ["target"]
2676
+ });
2677
+ }
2678
+ if (input.target.kind !== "block") {
2679
+ throw new DocumentApiValidationError("INVALID_INPUT", 'blocks.delete target must have kind "block".', {
2680
+ fields: ["target.kind"]
2681
+ });
2682
+ }
2683
+ if (!input.target.nodeId || typeof input.target.nodeId !== "string") {
2684
+ throw new DocumentApiValidationError("INVALID_INPUT", "blocks.delete target requires a nodeId string.", {
2685
+ fields: ["target.nodeId"]
2686
+ });
2687
+ }
2688
+ const { nodeType } = input.target;
2689
+ if (REJECTED_DELETE_NODE_TYPES.has(nodeType)) {
2690
+ throw new DocumentApiValidationError("INVALID_TARGET", `blocks.delete does not support "${nodeType}" targets. Table row/column operations are out of scope.`, { fields: ["target.nodeType"], nodeType });
2691
+ }
2692
+ if (!SUPPORTED_DELETE_NODE_TYPES.has(nodeType)) {
2693
+ throw new DocumentApiValidationError("INVALID_TARGET", `blocks.delete does not support "${nodeType}" targets.`, {
2694
+ fields: ["target.nodeType"],
2695
+ nodeType
2696
+ });
2697
+ }
2698
+ }
2699
+ function executeBlocksDelete(adapter, input, options) {
2700
+ validateBlocksDeleteInput(input);
2701
+ return adapter.delete(input, normalizeMutationOptions(options));
2702
+ }
2703
+ var SUPPORTED_DELETE_NODE_TYPES, REJECTED_DELETE_NODE_TYPES;
2704
+ var init_blocks = __esm(() => {
2705
+ init_base();
2706
+ init_errors2();
2707
+ SUPPORTED_DELETE_NODE_TYPES = new Set(DELETABLE_BLOCK_NODE_TYPES);
2708
+ REJECTED_DELETE_NODE_TYPES = new Set(["tableRow", "tableCell"]);
2709
+ });
2710
+
2608
2711
  // ../../packages/document-api/src/track-changes/track-changes.ts
2609
2712
  function executeTrackChangesList(adapter, input) {
2610
2713
  return adapter.list(input);
@@ -2657,6 +2760,7 @@ function buildDispatchTable(api) {
2657
2760
  insert: (input, options) => api.insert(input, options),
2658
2761
  replace: (input, options) => api.replace(input, options),
2659
2762
  delete: (input, options) => api.delete(input, options),
2763
+ "blocks.delete": (input, options) => api.blocks.delete(input, options),
2660
2764
  "format.apply": (input, options) => api.format.apply(input, options),
2661
2765
  "format.fontSize": (input, options) => api.format.fontSize(input, options),
2662
2766
  "format.fontFamily": (input, options) => api.format.fontFamily(input, options),
@@ -2780,6 +2884,11 @@ function createDocumentApi(adapters) {
2780
2884
  return executeTrackChangesDecide(adapters.trackChanges, input, options);
2781
2885
  }
2782
2886
  },
2887
+ blocks: {
2888
+ delete(input, options) {
2889
+ return executeBlocksDelete(adapters.blocks, input, options);
2890
+ }
2891
+ },
2783
2892
  create: {
2784
2893
  paragraph(input, options) {
2785
2894
  return executeCreateParagraph(adapters.create, input, options);
@@ -2847,6 +2956,7 @@ var init_src = __esm(() => {
2847
2956
  init_lists();
2848
2957
  init_replace();
2849
2958
  init_create();
2959
+ init_blocks();
2850
2960
  init_track_changes();
2851
2961
  init_capabilities();
2852
2962
  init_format();
@@ -3481,6 +3591,7 @@ var init_operation_hints = __esm(() => {
3481
3591
  insert: "inserted text",
3482
3592
  replace: "replaced text",
3483
3593
  delete: "deleted text",
3594
+ "blocks.delete": "deleted block",
3484
3595
  "format.apply": "applied style",
3485
3596
  "format.fontSize": "set font size",
3486
3597
  "format.fontFamily": "set font family",
@@ -3518,6 +3629,7 @@ var init_operation_hints = __esm(() => {
3518
3629
  insert: "mutationReceipt",
3519
3630
  replace: "mutationReceipt",
3520
3631
  delete: "mutationReceipt",
3632
+ "blocks.delete": "plain",
3521
3633
  "format.apply": "mutationReceipt",
3522
3634
  "format.fontSize": "mutationReceipt",
3523
3635
  "format.fontFamily": "mutationReceipt",
@@ -3555,6 +3667,7 @@ var init_operation_hints = __esm(() => {
3555
3667
  insert: null,
3556
3668
  replace: null,
3557
3669
  delete: null,
3670
+ "blocks.delete": "result",
3558
3671
  "format.apply": null,
3559
3672
  "format.fontSize": null,
3560
3673
  "format.fontFamily": null,
@@ -3602,6 +3715,7 @@ var init_operation_hints = __esm(() => {
3602
3715
  insert: "textMutation",
3603
3716
  replace: "textMutation",
3604
3717
  delete: "textMutation",
3718
+ "blocks.delete": "blocks",
3605
3719
  "format.apply": "textMutation",
3606
3720
  "format.fontSize": "textMutation",
3607
3721
  "format.fontFamily": "textMutation",
@@ -87393,9 +87507,9 @@ var init_remark_gfm_RDxetNVS_es = __esm(() => {
87393
87507
  emptyOptions4 = {};
87394
87508
  });
87395
87509
 
87396
- // ../../packages/superdoc/dist/chunks/src-DVVC7vA7.es.js
87397
- var exports_src_DVVC7vA7_es = {};
87398
- __export(exports_src_DVVC7vA7_es, {
87510
+ // ../../packages/superdoc/dist/chunks/src-0UjFcd91.es.js
87511
+ var exports_src_0UjFcd91_es = {};
87512
+ __export(exports_src_0UjFcd91_es, {
87399
87513
  zt: () => defineMark,
87400
87514
  z: () => cM,
87401
87515
  yt: () => removeAwarenessStates,
@@ -94586,6 +94700,31 @@ function executeCreateHeading2(adapter, input2, options) {
94586
94700
  validateCreateLocation2(normalized.at, "create.heading");
94587
94701
  return adapter.heading(normalized, normalizeMutationOptions2(options));
94588
94702
  }
94703
+ function validateBlocksDeleteInput2(input2) {
94704
+ if (!input2 || typeof input2 !== "object")
94705
+ throw new DocumentApiValidationError2("INVALID_INPUT", "blocks.delete requires an input object.", { fields: ["input"] });
94706
+ if (!input2.target)
94707
+ throw new DocumentApiValidationError2("INVALID_INPUT", "blocks.delete requires a target.", { fields: ["target"] });
94708
+ if (input2.target.kind !== "block")
94709
+ throw new DocumentApiValidationError2("INVALID_INPUT", 'blocks.delete target must have kind "block".', { fields: ["target.kind"] });
94710
+ if (!input2.target.nodeId || typeof input2.target.nodeId !== "string")
94711
+ throw new DocumentApiValidationError2("INVALID_INPUT", "blocks.delete target requires a nodeId string.", { fields: ["target.nodeId"] });
94712
+ const { nodeType } = input2.target;
94713
+ if (REJECTED_DELETE_NODE_TYPES2.has(nodeType))
94714
+ throw new DocumentApiValidationError2("INVALID_TARGET", `blocks.delete does not support "${nodeType}" targets. Table row/column operations are out of scope.`, {
94715
+ fields: ["target.nodeType"],
94716
+ nodeType
94717
+ });
94718
+ if (!SUPPORTED_DELETE_NODE_TYPES2.has(nodeType))
94719
+ throw new DocumentApiValidationError2("INVALID_TARGET", `blocks.delete does not support "${nodeType}" targets.`, {
94720
+ fields: ["target.nodeType"],
94721
+ nodeType
94722
+ });
94723
+ }
94724
+ function executeBlocksDelete2(adapter, input2, options) {
94725
+ validateBlocksDeleteInput2(input2);
94726
+ return adapter.delete(input2, normalizeMutationOptions2(options));
94727
+ }
94589
94728
  function executeTrackChangesList2(adapter, input2) {
94590
94729
  return adapter.list(input2);
94591
94730
  }
@@ -94635,6 +94774,7 @@ function buildDispatchTable2(api) {
94635
94774
  insert: (input2, options) => api.insert(input2, options),
94636
94775
  replace: (input2, options) => api.replace(input2, options),
94637
94776
  delete: (input2, options) => api.delete(input2, options),
94777
+ "blocks.delete": (input2, options) => api.blocks.delete(input2, options),
94638
94778
  "format.apply": (input2, options) => api.format.apply(input2, options),
94639
94779
  "format.fontSize": (input2, options) => api.format.fontSize(input2, options),
94640
94780
  "format.fontFamily": (input2, options) => api.format.fontFamily(input2, options),
@@ -94760,6 +94900,9 @@ function createDocumentApi2(adapters) {
94760
94900
  return executeTrackChangesDecide2(adapters.trackChanges, input2, options);
94761
94901
  }
94762
94902
  },
94903
+ blocks: { delete(input2, options) {
94904
+ return executeBlocksDelete2(adapters.blocks, input2, options);
94905
+ } },
94763
94906
  create: {
94764
94907
  paragraph(input2, options) {
94765
94908
  return executeCreateParagraph2(adapters.create, input2, options);
@@ -94825,6 +94968,12 @@ function hasAllCommands(editor, operationId) {
94825
94968
  return true;
94826
94969
  return required.every((command$1) => hasCommand(editor, command$1));
94827
94970
  }
94971
+ function hasRequiredHelpers(editor, operationId) {
94972
+ const check = REQUIRED_HELPERS[operationId];
94973
+ if (!check)
94974
+ return true;
94975
+ return check(editor);
94976
+ }
94828
94977
  function hasMarkCapability(editor, markName) {
94829
94978
  return Boolean(editor.schema?.marks?.[markName]);
94830
94979
  }
@@ -94866,7 +95015,7 @@ function isOperationAvailable(editor, operationId) {
94866
95015
  return MARK_KEYS2.some((key$1) => hasMarkCapability(editor, STYLE_MARK_SCHEMA_NAMES[key$1] ?? key$1));
94867
95016
  if (INLINE_FORMAT_OPERATIONS.has(operationId))
94868
95017
  return hasAllCommands(editor, operationId) && hasMarkCapability(editor, "textStyle");
94869
- return hasAllCommands(editor, operationId);
95018
+ return hasAllCommands(editor, operationId) && hasRequiredHelpers(editor, operationId);
94870
95019
  }
94871
95020
  function isCommandBackedAvailability(operationId) {
94872
95021
  return !isMarkBackedOperation(operationId) && !INLINE_FORMAT_OPERATIONS.has(operationId);
@@ -94880,8 +95029,12 @@ function buildOperationCapabilities(editor) {
94880
95029
  const dryRun = metadata.supportsDryRun && available;
94881
95030
  const reasons = [];
94882
95031
  if (!available) {
94883
- if (isCommandBackedAvailability(operationId))
94884
- pushReason(reasons, "COMMAND_UNAVAILABLE");
95032
+ if (isCommandBackedAvailability(operationId)) {
95033
+ if (!hasAllCommands(editor, operationId))
95034
+ pushReason(reasons, "COMMAND_UNAVAILABLE");
95035
+ if (!hasRequiredHelpers(editor, operationId))
95036
+ pushReason(reasons, "HELPER_UNAVAILABLE");
95037
+ }
94885
95038
  pushReason(reasons, "OPERATION_UNAVAILABLE");
94886
95039
  }
94887
95040
  if (metadata.supportsTrackedMode && !tracked)
@@ -95391,7 +95544,8 @@ function buildBlockIndex(editor) {
95391
95544
  });
95392
95545
  return {
95393
95546
  candidates,
95394
- byId
95547
+ byId,
95548
+ ambiguous
95395
95549
  };
95396
95550
  }
95397
95551
  function findBlockById(index2, address2) {
@@ -95399,6 +95553,15 @@ function findBlockById(index2, address2) {
95399
95553
  return;
95400
95554
  return index2.byId.get(`${address2.nodeType}:${address2.nodeId}`);
95401
95555
  }
95556
+ function findBlockByIdStrict(index2, address2) {
95557
+ const key$1 = `${address2.nodeType}:${address2.nodeId}`;
95558
+ if (index2.ambiguous.has(key$1))
95559
+ throw new DocumentApiAdapterError("AMBIGUOUS_TARGET", `Multiple blocks share key "${key$1}".`, { target: address2 });
95560
+ const candidate = index2.byId.get(key$1);
95561
+ if (!candidate)
95562
+ throw new DocumentApiAdapterError("TARGET_NOT_FOUND", `Block "${key$1}" was not found.`, { target: address2 });
95563
+ return candidate;
95564
+ }
95402
95565
  function isTextBlockCandidate(candidate) {
95403
95566
  const node3 = candidate.node;
95404
95567
  return Boolean(node3?.inlineContent || node3?.isTextblock);
@@ -95479,9 +95642,11 @@ function checkRevision(editor, expectedRevision) {
95479
95642
  return;
95480
95643
  const current = getRevision(editor);
95481
95644
  if (expectedRevision !== current)
95482
- 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, {
95483
95646
  expectedRevision,
95484
- currentRevision: current
95647
+ currentRevision: current,
95648
+ refStability: "ephemeral",
95649
+ remediation: "Re-run query.match() to obtain a fresh ref valid for the current revision."
95485
95650
  });
95486
95651
  }
95487
95652
  function resolveSegmentPosition(targetOffset, segmentStart, segmentLength, docFrom, docTo) {
@@ -95737,7 +95902,9 @@ function captureRunsInRange(editor, blockPos, from$12, to) {
95737
95902
  return;
95738
95903
  }
95739
95904
  if (node3.isLeaf) {
95905
+ const start$1 = offset$1;
95740
95906
  offset$1 += 1;
95907
+ maybePushRun(start$1, offset$1, []);
95741
95908
  return;
95742
95909
  }
95743
95910
  let isFirstChild = true;
@@ -96175,12 +96342,69 @@ function executeBlockSelector(index2, query2, diagnostics) {
96175
96342
  function isAssertStep(step) {
96176
96343
  return step.op === "assert";
96177
96344
  }
96345
+ function isCreateOp(op) {
96346
+ return op === "create.heading" || op === "create.paragraph";
96347
+ }
96178
96348
  function isSelectWhere(where) {
96179
96349
  return where.by === "select";
96180
96350
  }
96181
96351
  function isRefWhere(where) {
96182
96352
  return where.by === "ref";
96183
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
+ }
96184
96408
  function isV3Ref(payload) {
96185
96409
  return typeof payload === "object" && payload !== null && "v" in payload && payload.v === 3;
96186
96410
  }
@@ -96415,9 +96639,13 @@ function decodeTextRefPayload(encoded, stepId) {
96415
96639
  function resolveV3TextRef(editor, index2, step, refData) {
96416
96640
  const currentRevision = getRevision(editor);
96417
96641
  if (refData.rev !== currentRevision)
96418
- 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, {
96419
96643
  refRevision: refData.rev,
96420
- 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.`
96421
96649
  });
96422
96650
  if (!refData.segments?.length)
96423
96651
  return [];
@@ -96508,7 +96736,11 @@ function resolveStepTargets(editor, index2, step) {
96508
96736
  });
96509
96737
  if (refWhere) {
96510
96738
  if (targets.length === 0)
96511
- 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
+ });
96512
96744
  if (targets.length > 1)
96513
96745
  throw planError("AMBIGUOUS_MATCH", `ref "${refWhere.ref}" resolved to ${targets.length} targets`, step.id, { matchCount: targets.length });
96514
96746
  return targets;
@@ -96520,6 +96752,18 @@ function resolveStepTargets(editor, index2, step) {
96520
96752
  targets = [targets[0]];
96521
96753
  return targets;
96522
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
+ }
96523
96767
  function applyCardinalityCheck(step, targets) {
96524
96768
  const where = step.where;
96525
96769
  if (!("require" in where) || where.require === undefined)
@@ -96527,62 +96771,131 @@ function applyCardinalityCheck(step, targets) {
96527
96771
  const require$1 = where.require;
96528
96772
  if (require$1 === "first") {
96529
96773
  if (targets.length === 0)
96530
- 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));
96531
96775
  } else if (require$1 === "exactlyOne") {
96532
96776
  if (targets.length === 0)
96533
- 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));
96534
96778
  if (targets.length > 1)
96535
96779
  throw planError("AMBIGUOUS_MATCH", `selector matched ${targets.length} ranges, expected exactly one`, step.id, { matchCount: targets.length });
96536
96780
  } else if (require$1 === "all") {
96537
96781
  if (targets.length === 0)
96538
- throw planError("MATCH_NOT_FOUND", "selector matched zero ranges", step.id);
96539
- }
96540
- }
96541
- function detectOverlaps(steps) {
96542
- const rangesByBlock = /* @__PURE__ */ new Map;
96543
- for (const compiled of steps)
96544
- for (const target of compiled.targets)
96545
- if (target.kind === "range")
96546
- addRange2(rangesByBlock, target.blockId, target.stepId, target.from, target.to);
96547
- else
96548
- for (const seg of target.segments)
96549
- addRange2(rangesByBlock, seg.blockId, target.stepId, seg.from, seg.to);
96550
- for (const [blockId, ranges] of rangesByBlock) {
96551
- ranges.sort((a2, b$1) => a2.from - b$1.from);
96552
- for (let i$1 = 1;i$1 < ranges.length; i$1++) {
96553
- const prev = ranges[i$1 - 1];
96554
- const curr = ranges[i$1];
96555
- if (prev.stepId !== curr.stepId && prev.to > curr.from)
96556
- 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",
96557
96819
  blockId,
96558
- rangeA: {
96559
- from: prev.from,
96560
- to: prev.to
96561
- },
96562
- rangeB: {
96563
- from: curr.from,
96564
- to: curr.to
96565
- }
96566
- });
96567
- }
96820
+ rangeA: a2,
96821
+ rangeB: b$1
96822
+ };
96823
+ }
96568
96824
  }
96569
96825
  }
96570
- function addRange2(map$22, blockId, stepId, from$12, to) {
96571
- let blockRanges = map$22.get(blockId);
96572
- if (!blockRanges) {
96573
- blockRanges = [];
96574
- 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);
96575
96841
  }
96576
- blockRanges.push({
96577
- stepId,
96842
+ entries.push({
96578
96843
  from: from$12,
96579
96844
  to
96580
96845
  });
96581
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
+ }
96582
96893
  function compilePlan(editor, steps) {
96583
96894
  if (steps.length > 200)
96584
96895
  throw planError("INVALID_INPUT", `plan contains ${steps.length} steps, maximum is 200`);
96896
+ const compiledRevision = getRevision(editor);
96585
96897
  const index2 = getBlockIndex(editor);
96898
+ assertNoDuplicateBlockIds(index2);
96586
96899
  const mutationSteps = [];
96587
96900
  const assertSteps = [];
96588
96901
  const seenIds = /* @__PURE__ */ new Set;
@@ -96594,28 +96907,45 @@ function compilePlan(editor, steps) {
96594
96907
  seenIds.add(step.id);
96595
96908
  }
96596
96909
  let totalTargets = 0;
96910
+ let stepIndex = 0;
96597
96911
  for (const step of steps) {
96598
96912
  if (isAssertStep(step)) {
96599
96913
  assertSteps.push(step);
96914
+ stepIndex++;
96600
96915
  continue;
96601
96916
  }
96602
96917
  if (!hasStepExecutor(step.op))
96603
96918
  throw planError("INVALID_INPUT", `unknown step op "${step.op}"`, step.id);
96919
+ if (isCreateOp(step.op))
96920
+ validateCreateStepPosition(step);
96604
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
+ }
96605
96927
  totalTargets += targets.length;
96606
96928
  mutationSteps.push({
96607
96929
  step,
96608
96930
  targets
96609
96931
  });
96932
+ stepIndex++;
96610
96933
  }
96611
96934
  if (totalTargets > 500)
96612
96935
  throw planError("INVALID_INPUT", `plan resolved ${totalTargets} total targets, maximum is 500`);
96613
- detectOverlaps(mutationSteps);
96936
+ validateStepInteractions(mutationSteps);
96614
96937
  return {
96615
96938
  mutationSteps,
96616
- assertSteps
96939
+ assertSteps,
96940
+ compiledRevision
96617
96941
  };
96618
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
+ }
96619
96949
  function applyDirectMutationMeta(tr) {
96620
96950
  tr.setMeta("inputType", "programmatic");
96621
96951
  tr.setMeta("skipTrackChanges", true);
@@ -96668,11 +96998,33 @@ function buildMarksFromSetMarks(editor, setMarks) {
96668
96998
  marks.push(schema.marks.strike.create());
96669
96999
  return marks;
96670
97000
  }
96671
- function toAbsoluteBlockInsertPos(editor, blockId, offset$1, stepId) {
96672
- const candidate = getBlockIndex(editor).candidates.find((c$3) => c$3.nodeId === blockId);
96673
- if (!candidate)
96674
- throw planError("TARGET_NOT_FOUND", `block "${blockId}" not found`, stepId);
96675
- 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;
96676
97028
  }
96677
97029
  function executeTextRewrite(editor, tr, target, step, mapping) {
96678
97030
  const absFrom = mapping.map(target.absFrom);
@@ -96713,42 +97065,7 @@ function executeTextDelete(_editor, tr, target, _step, mapping) {
96713
97065
  return { changed: true };
96714
97066
  }
96715
97067
  function executeStyleApply2(editor, tr, target, step, mapping) {
96716
- const absFrom = mapping.map(target.absFrom);
96717
- const absTo = mapping.map(target.absTo);
96718
- const { schema } = editor.state;
96719
- let changed = false;
96720
- const markEntries = [
96721
- [
96722
- "bold",
96723
- step.args.inline.bold,
96724
- schema.marks.bold
96725
- ],
96726
- [
96727
- "italic",
96728
- step.args.inline.italic,
96729
- schema.marks.italic
96730
- ],
96731
- [
96732
- "underline",
96733
- step.args.inline.underline,
96734
- schema.marks.underline
96735
- ],
96736
- [
96737
- "strike",
96738
- step.args.inline.strike,
96739
- schema.marks.strike
96740
- ]
96741
- ];
96742
- for (const [, value, markType] of markEntries) {
96743
- if (value === undefined || !markType)
96744
- continue;
96745
- if (value)
96746
- tr.addMark(absFrom, absTo, markType.create());
96747
- else
96748
- tr.removeMark(absFrom, absTo, markType);
96749
- changed = true;
96750
- }
96751
- return { changed };
97068
+ return { changed: applyInlineMarkPatches(editor, tr, mapping.map(target.absFrom), mapping.map(target.absTo), step.args.inline) };
96752
97069
  }
96753
97070
  function validateMappedSpanContiguity(target, mapping, stepId) {
96754
97071
  let lastMappedEnd = -1;
@@ -96814,44 +97131,9 @@ function executeSpanTextDelete(_editor, tr, target, step, mapping) {
96814
97131
  }
96815
97132
  function executeSpanStyleApply(editor, tr, target, step, mapping) {
96816
97133
  validateMappedSpanContiguity(target, mapping, step.id);
96817
- const { schema } = editor.state;
96818
- let changed = false;
96819
97134
  const firstSeg = target.segments[0];
96820
97135
  const lastSeg = target.segments[target.segments.length - 1];
96821
- const absFrom = mapping.map(firstSeg.absFrom, 1);
96822
- const absTo = mapping.map(lastSeg.absTo, -1);
96823
- const markEntries = [
96824
- [
96825
- "bold",
96826
- step.args.inline.bold,
96827
- schema.marks.bold
96828
- ],
96829
- [
96830
- "italic",
96831
- step.args.inline.italic,
96832
- schema.marks.italic
96833
- ],
96834
- [
96835
- "underline",
96836
- step.args.inline.underline,
96837
- schema.marks.underline
96838
- ],
96839
- [
96840
- "strike",
96841
- step.args.inline.strike,
96842
- schema.marks.strike
96843
- ]
96844
- ];
96845
- for (const [, value, markType] of markEntries) {
96846
- if (value === undefined || !markType)
96847
- continue;
96848
- if (value)
96849
- tr.addMark(absFrom, absTo, markType.create());
96850
- else
96851
- tr.removeMark(absFrom, absTo, markType);
96852
- changed = true;
96853
- }
96854
- return { changed };
97136
+ return { changed: applyInlineMarkPatches(editor, tr, mapping.map(firstSeg.absFrom, 1), mapping.map(lastSeg.absTo, -1), step.args.inline) };
96855
97137
  }
96856
97138
  function getReplacementText(replacement) {
96857
97139
  if (replacement.blocks !== undefined)
@@ -96984,7 +97266,8 @@ function buildAssertIndex(doc$2) {
96984
97266
  });
96985
97267
  return {
96986
97268
  candidates,
96987
- byId
97269
+ byId,
97270
+ ambiguous
96988
97271
  };
96989
97272
  }
96990
97273
  function resolveAssertScope(index2, select2, within$1) {
@@ -97051,10 +97334,12 @@ function executeAssertStep(_editor, tr, step) {
97051
97334
  }
97052
97335
  function executeCreateStep(editor, tr, step, targets, mapping) {
97053
97336
  const target = targets[0];
97054
- if (!target || target.kind !== "range")
97055
- 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);
97056
97339
  const args$1 = step.args;
97057
- 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);
97058
97343
  const paragraphType = editor.state.schema?.nodes?.paragraph;
97059
97344
  if (!paragraphType)
97060
97345
  throw planError("INVALID_INPUT", "paragraph node type not in schema", step.id);
@@ -97074,6 +97359,7 @@ function executeCreateStep(editor, tr, step, targets, mapping) {
97074
97359
  if (!node3)
97075
97360
  throw planError("INVALID_INPUT", `could not create ${step.op} node`, step.id);
97076
97361
  tr.insert(pos, node3);
97362
+ assertNoPostInsertDuplicateIds(tr.doc, step.id);
97077
97363
  return {
97078
97364
  stepId: step.id,
97079
97365
  op: step.op,
@@ -97085,6 +97371,31 @@ function executeCreateStep(editor, tr, step, targets, mapping) {
97085
97371
  }
97086
97372
  };
97087
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
+ }
97088
97399
  function runMutationsOnTransaction(editor, tr, compiled, options) {
97089
97400
  const mapping = tr.mapping;
97090
97401
  const stepOutcomes = [];
@@ -97142,6 +97453,14 @@ function executeCompiledPlan(editor, compiled, options = {}) {
97142
97453
  const startTime = performance.now();
97143
97454
  const revisionBefore = getRevision(editor);
97144
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
+ });
97145
97464
  const tr = editor.state.tr;
97146
97465
  if ((options.changeMode ?? "direct") === "tracked")
97147
97466
  applyTrackedMutationMeta(tr);
@@ -97361,7 +97680,8 @@ function executeDomainCommand(editor, handler2, options) {
97361
97680
  },
97362
97681
  targets: []
97363
97682
  }],
97364
- assertSteps: []
97683
+ assertSteps: [],
97684
+ compiledRevision: getRevision(editor)
97365
97685
  }, { expectedRevision: options?.expectedRevision });
97366
97686
  }
97367
97687
  function validateWriteRequest(request, resolved) {
@@ -97457,7 +97777,8 @@ function writeWrapper(editor, request, options) {
97457
97777
  step: stepDef,
97458
97778
  targets: [toCompiledTarget(stepId, op, resolved)]
97459
97779
  }],
97460
- assertSteps: []
97780
+ assertSteps: [],
97781
+ compiledRevision: getRevision(editor)
97461
97782
  }, {
97462
97783
  changeMode: mode,
97463
97784
  expectedRevision: options?.expectedRevision
@@ -97522,7 +97843,8 @@ function styleApplyWrapper(editor, input2, options) {
97522
97843
  marks: []
97523
97844
  }]
97524
97845
  }],
97525
- assertSteps: []
97846
+ assertSteps: [],
97847
+ compiledRevision: getRevision(editor)
97526
97848
  }, {
97527
97849
  changeMode: mode,
97528
97850
  expectedRevision: options?.expectedRevision
@@ -98358,6 +98680,58 @@ function createCommentsWrapper(editor) {
98358
98680
  list: (query2) => listCommentsHandler(editor, query2)
98359
98681
  };
98360
98682
  }
98683
+ function validateTargetNodeType(nodeType) {
98684
+ if (REJECTED_NODE_TYPES.has(nodeType))
98685
+ throw new DocumentApiAdapterError("INVALID_TARGET", `blocks.delete does not support "${nodeType}" targets. Table row/column operations are out of scope.`, { nodeType });
98686
+ if (!SUPPORTED_NODE_TYPES.has(nodeType))
98687
+ throw new DocumentApiAdapterError("INVALID_TARGET", `blocks.delete does not support "${nodeType}" targets.`, { nodeType });
98688
+ }
98689
+ function resolveSdBlockId(candidate) {
98690
+ const sdBlockId = candidate.node.attrs?.sdBlockId;
98691
+ if (typeof sdBlockId === "string" && sdBlockId.length > 0)
98692
+ return sdBlockId;
98693
+ throw new DocumentApiAdapterError("INTERNAL_ERROR", "Resolved block candidate is missing sdBlockId attribute. This indicates a schema/extension invariant violation.", { attrs: candidate.node.attrs });
98694
+ }
98695
+ function validateCommandLayerUniqueness(editor, sdBlockId) {
98696
+ const getBlockNodeById = editor.helpers?.blockNode?.getBlockNodeById;
98697
+ if (typeof getBlockNodeById !== "function")
98698
+ throw new DocumentApiAdapterError("CAPABILITY_UNAVAILABLE", "blocks.delete requires the blockNode helper to be registered.", { reason: "missing_helper" });
98699
+ const matches2 = getBlockNodeById(sdBlockId);
98700
+ if (!matches2 || Array.isArray(matches2) && matches2.length === 0)
98701
+ throw new DocumentApiAdapterError("TARGET_NOT_FOUND", `Block with sdBlockId "${sdBlockId}" was not found at the command layer.`, { sdBlockId });
98702
+ if (Array.isArray(matches2) && matches2.length > 1)
98703
+ throw new DocumentApiAdapterError("AMBIGUOUS_TARGET", `Multiple blocks share sdBlockId "${sdBlockId}" at the command layer.`, {
98704
+ sdBlockId,
98705
+ count: matches2.length
98706
+ });
98707
+ }
98708
+ function blocksDeleteWrapper(editor, input2, options) {
98709
+ rejectTrackedMode("blocks.delete", options);
98710
+ const candidate = findBlockByIdStrict(getBlockIndex(editor), input2.target);
98711
+ validateTargetNodeType(candidate.nodeType);
98712
+ const sdBlockId = resolveSdBlockId(candidate);
98713
+ const deleteBlockNodeById = requireEditorCommand(editor.commands?.deleteBlockNodeById, "blocks.delete");
98714
+ validateCommandLayerUniqueness(editor, sdBlockId);
98715
+ if (options?.dryRun)
98716
+ return {
98717
+ success: true,
98718
+ deleted: input2.target
98719
+ };
98720
+ if (executeDomainCommand(editor, () => {
98721
+ const didApply = deleteBlockNodeById(sdBlockId);
98722
+ if (didApply)
98723
+ clearIndexCache(editor);
98724
+ return didApply;
98725
+ }, { expectedRevision: options?.expectedRevision }).steps[0]?.effect !== "changed")
98726
+ throw new DocumentApiAdapterError("INTERNAL_ERROR", "blocks.delete command returned false despite passing all pre-apply checks. This is an internal invariant violation.", {
98727
+ sdBlockId,
98728
+ target: input2.target
98729
+ });
98730
+ return {
98731
+ success: true,
98732
+ deleted: input2.target
98733
+ };
98734
+ }
98361
98735
  function getRawTrackedMarks(editor) {
98362
98736
  try {
98363
98737
  const marks = getTrackChanges(editor.state);
@@ -98492,10 +98866,7 @@ function resolveCreateInsertPosition(editor, at, operationLabel) {
98492
98866
  return 0;
98493
98867
  if (location$1.kind === "documentEnd")
98494
98868
  return editor.state.doc.content.size;
98495
- const target = findBlockById(getBlockIndex(editor), location$1.target);
98496
- if (!target)
98497
- throw new DocumentApiAdapterError("TARGET_NOT_FOUND", `Create ${operationLabel} target block was not found.`, { target: location$1.target });
98498
- return location$1.kind === "before" ? target.pos : target.end;
98869
+ return resolveBlockInsertionPos(editor, location$1.target.nodeId, location$1.kind);
98499
98870
  }
98500
98871
  function resolveCreatedBlock(editor, nodeType, blockId) {
98501
98872
  const index2 = getBlockIndex(editor);
@@ -98604,7 +98975,10 @@ function createParagraphWrapper(editor, input2, options) {
98604
98975
  const paragraph2 = resolveCreatedBlock(editor, "paragraph", paragraphId);
98605
98976
  if (mode === "tracked")
98606
98977
  trackedChangeRefs = collectTrackInsertRefsInRange(editor, paragraph2.pos, paragraph2.end);
98607
- } catch {}
98978
+ } catch (e) {
98979
+ if (!(e instanceof DocumentApiAdapterError))
98980
+ throw e;
98981
+ }
98608
98982
  }
98609
98983
  return didApply;
98610
98984
  }, { expectedRevision: options?.expectedRevision }).steps[0]?.effect !== "changed")
@@ -98670,7 +99044,10 @@ function createHeadingWrapper(editor, input2, options) {
98670
99044
  const heading3 = resolveCreatedBlock(editor, "heading", headingId);
98671
99045
  if (mode === "tracked")
98672
99046
  trackedChangeRefs = collectTrackInsertRefsInRange(editor, heading3.pos, heading3.end);
98673
- } catch {}
99047
+ } catch (e) {
99048
+ if (!(e instanceof DocumentApiAdapterError))
99049
+ throw e;
99050
+ }
98674
99051
  }
98675
99052
  return didApply;
98676
99053
  }, { expectedRevision: options?.expectedRevision }).steps[0]?.effect !== "changed")
@@ -100029,15 +100406,16 @@ function trackChangesRejectAllWrapper(editor, _input, options) {
100029
100406
  return { success: true };
100030
100407
  }
100031
100408
  function previewPlan(editor, input2) {
100032
- const evaluatedRevision = getRevision(editor);
100033
100409
  checkRevision(editor, input2.expectedRevision);
100034
100410
  if (!input2.steps?.length)
100035
100411
  throw planError("INVALID_INPUT", "plan must contain at least one step");
100036
100412
  const failures = [];
100037
100413
  const stepPreviews = [];
100038
100414
  let currentPhase = "compile";
100415
+ let evaluatedRevision = getRevision(editor);
100039
100416
  try {
100040
100417
  const compiled = compilePlan(editor, input2.steps);
100418
+ evaluatedRevision = compiled.compiledRevision;
100041
100419
  currentPhase = "execute";
100042
100420
  const tr = editor.state.tr;
100043
100421
  const { stepOutcomes, assertFailures } = runMutationsOnTransaction(editor, tr, compiled, { throwOnAssertFailure: false });
@@ -100449,7 +100827,13 @@ function queryMatchAdapter(editor, input2) {
100449
100827
  const paginatedMatches = isTextSelector ? applyPagination(rawMatches, userOffset, input2.limit) : rawMatches;
100450
100828
  if (require$1 === "first" || require$1 === "exactlyOne" || require$1 === "all") {
100451
100829
  if (totalMatches === 0)
100452
- 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
+ });
100453
100837
  }
100454
100838
  if (require$1 === "exactlyOne" && totalMatches > 1)
100455
100839
  throw planError("AMBIGUOUS_MATCH", `selector matched ${totalMatches} ranges, expected exactly one`, undefined, { matchCount: totalMatches });
@@ -100458,7 +100842,11 @@ function queryMatchAdapter(editor, input2) {
100458
100842
  if (isTextSelector && raw.textRanges?.length) {
100459
100843
  const blocks2 = buildMatchBlocks(editor, raw.textRanges, evaluatedRevision, id2);
100460
100844
  if (blocks2.length === 0)
100461
- 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
+ });
100462
100850
  const snippetResult = buildBlocksSnippet(editor, blocks2);
100463
100851
  return {
100464
100852
  id: id2,
@@ -100681,6 +101069,7 @@ function getDocumentApiAdapters(editor) {
100681
101069
  acceptAll: (input2, options) => trackChangesAcceptAllWrapper(editor, input2, options),
100682
101070
  rejectAll: (input2, options) => trackChangesRejectAllWrapper(editor, input2, options)
100683
101071
  },
101072
+ blocks: { delete: (input2, options) => blocksDeleteWrapper(editor, input2, options) },
100684
101073
  create: {
100685
101074
  paragraph: (input2, options) => createParagraphWrapper(editor, input2, options),
100686
101075
  heading: (input2, options) => createHeadingWrapper(editor, input2, options)
@@ -134736,7 +135125,7 @@ var Node$13 = class Node$14 {
134736
135125
  console.warn("Failed to initialize developer tools:", error);
134737
135126
  }
134738
135127
  }
134739
- }, BLANK_DOCX_DATA_URI = `data:application/vnd.openxmlformats-officedocument.wordprocessingml.document;base64,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`, NODE_TYPES2, 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, inlineNodeTypeValues2, rangeSchema2, textAddressSchema2, textTargetSchema2, blockNodeAddressSchema2, 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, REQUIRED_COMMANDS, VALID_CAPABILITY_REASON_CODES, 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", 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 {
134740
135129
  constructor(config2) {
134741
135130
  this.search = config2.search;
134742
135131
  this.caseSensitive = !!config2.caseSensitive;
@@ -152807,7 +153196,7 @@ var Node$13 = class Node$14 {
152807
153196
  trackedChanges: context.trackedChanges ?? []
152808
153197
  });
152809
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;
152810
- var init_src_DVVC7vA7_es = __esm(() => {
153199
+ var init_src_0UjFcd91_es = __esm(() => {
152811
153200
  init_rolldown_runtime_B2q5OVn9_es();
152812
153201
  init_SuperConverter_BxBclpFg_es();
152813
153202
  init_jszip_ChlR43oI_es();
@@ -160886,6 +161275,13 @@ function print() { __p += __j.call(arguments, '') }
160886
161275
  "image",
160887
161276
  "sdt"
160888
161277
  ];
161278
+ DELETABLE_BLOCK_NODE_TYPES2 = [
161279
+ "paragraph",
161280
+ "heading",
161281
+ "listItem",
161282
+ "table",
161283
+ "sdt"
161284
+ ];
160889
161285
  INLINE_NODE_TYPES2 = [
160890
161286
  "run",
160891
161287
  "bookmark",
@@ -160920,6 +161316,9 @@ function print() { __p += __j.call(arguments, '') }
160920
161316
  "TARGET_MOVED",
160921
161317
  "PLAN_CONFLICT_OVERLAP",
160922
161318
  "INVALID_STEP_COMBINATION",
161319
+ "REVISION_CHANGED_SINCE_COMPILE",
161320
+ "INVALID_INSERTION_CONTEXT",
161321
+ "DOCUMENT_IDENTITY_CONFLICT",
160923
161322
  "CAPABILITY_UNAVAILABLE"
160924
161323
  ];
160925
161324
  T_QUERY_MATCH2 = [
@@ -161021,6 +161420,27 @@ function print() { __p += __j.call(arguments, '') }
161021
161420
  referenceDocPath: "delete.mdx",
161022
161421
  referenceGroup: "core"
161023
161422
  },
161423
+ "blocks.delete": {
161424
+ memberPath: "blocks.delete",
161425
+ description: "Delete an entire block node (paragraph, heading, list item, table, image, or sdt) deterministically.",
161426
+ requiresDocumentContext: true,
161427
+ metadata: mutationOperation2({
161428
+ idempotency: "conditional",
161429
+ supportsDryRun: true,
161430
+ supportsTrackedMode: false,
161431
+ possibleFailureCodes: NONE_FAILURES2,
161432
+ throws: [
161433
+ "TARGET_NOT_FOUND",
161434
+ "AMBIGUOUS_TARGET",
161435
+ "CAPABILITY_UNAVAILABLE",
161436
+ "INVALID_TARGET",
161437
+ "INVALID_INPUT",
161438
+ "INTERNAL_ERROR"
161439
+ ]
161440
+ }),
161441
+ referenceDocPath: "blocks/delete.mdx",
161442
+ referenceGroup: "blocks"
161443
+ },
161024
161444
  "format.apply": {
161025
161445
  memberPath: "format.apply",
161026
161446
  description: "Apply explicit inline style changes (bold, italic, underline, strike) to the target range using boolean patch semantics.",
@@ -161446,6 +161866,7 @@ function print() { __p += __j.call(arguments, '') }
161446
161866
  ALIGN_ALLOWED_KEYS2 = new Set(["target", "alignment"]);
161447
161867
  nodeTypeValues2 = NODE_TYPES2;
161448
161868
  blockNodeTypeValues2 = BLOCK_NODE_TYPES2;
161869
+ deletableBlockNodeTypeValues2 = DELETABLE_BLOCK_NODE_TYPES2;
161449
161870
  inlineNodeTypeValues2 = INLINE_NODE_TYPES2;
161450
161871
  objectSchema2({
161451
161872
  start: { type: "integer" },
@@ -161482,6 +161903,14 @@ function print() { __p += __j.call(arguments, '') }
161482
161903
  "kind",
161483
161904
  "nodeType",
161484
161905
  "nodeId"
161906
+ ]), objectSchema2({
161907
+ kind: { const: "block" },
161908
+ nodeType: { enum: [...deletableBlockNodeTypeValues2] },
161909
+ nodeId: { type: "string" }
161910
+ }, [
161911
+ "kind",
161912
+ "nodeType",
161913
+ "nodeId"
161485
161914
  ]), objectSchema2({
161486
161915
  kind: { const: "block" },
161487
161916
  nodeType: { const: "paragraph" },
@@ -161633,6 +162062,7 @@ function print() { __p += __j.call(arguments, '') }
161633
162062
  textAddressSchema2 = ref$1("TextAddress");
161634
162063
  textTargetSchema2 = ref$1("TextTarget");
161635
162064
  blockNodeAddressSchema2 = ref$1("BlockNodeAddress");
162065
+ deletableBlockNodeAddressSchema2 = ref$1("DeletableBlockNodeAddress");
161636
162066
  paragraphAddressSchema2 = ref$1("ParagraphAddress");
161637
162067
  headingAddressSchema2 = ref$1("HeadingAddress");
161638
162068
  listItemAddressSchema2 = ref$1("ListItemAddress");
@@ -161890,6 +162320,7 @@ function print() { __p += __j.call(arguments, '') }
161890
162320
  }, ["address", "type"]));
161891
162321
  capabilityReasonsSchema2 = arraySchema2({ enum: [
161892
162322
  "COMMAND_UNAVAILABLE",
162323
+ "HELPER_UNAVAILABLE",
161893
162324
  "OPERATION_UNAVAILABLE",
161894
162325
  "TRACKED_MODE_UNAVAILABLE",
161895
162326
  "DRY_RUN_UNAVAILABLE",
@@ -161979,7 +162410,13 @@ function print() { __p += __j.call(arguments, '') }
161979
162410
  }, ["target", "value"]), textMutationResultSchemaFor2("format.color"), textMutationFailureSchemaFor2("format.color"), objectSchema2({
161980
162411
  target: textAddressSchema2,
161981
162412
  alignment: { oneOf: [{ enum: [...ALIGNMENTS2] }, { type: "null" }] }
161982
- }, ["target", "alignment"]), textMutationResultSchemaFor2("format.align"), textMutationFailureSchemaFor2("format.align"), objectSchema2({
162413
+ }, ["target", "alignment"]), textMutationResultSchemaFor2("format.align"), textMutationFailureSchemaFor2("format.align"), objectSchema2({ target: deletableBlockNodeAddressSchema2 }, ["target"]), objectSchema2({
162414
+ success: { const: true },
162415
+ deleted: deletableBlockNodeAddressSchema2
162416
+ }, ["success", "deleted"]), objectSchema2({
162417
+ success: { const: true },
162418
+ deleted: deletableBlockNodeAddressSchema2
162419
+ }, ["success", "deleted"]), preApplyFailureResultSchemaFor2("blocks.delete"), objectSchema2({
161983
162420
  at: { oneOf: [
161984
162421
  objectSchema2({ kind: { const: "documentStart" } }, ["kind"]),
161985
162422
  objectSchema2({ kind: { const: "documentEnd" } }, ["kind"]),
@@ -162157,6 +162594,11 @@ function print() { __p += __j.call(arguments, '') }
162157
162594
  description: "Primary read and write operations.",
162158
162595
  pagePath: "core/index.mdx"
162159
162596
  },
162597
+ blocks: {
162598
+ title: "Blocks",
162599
+ description: "Block-level structural operations.",
162600
+ pagePath: "blocks/index.mdx"
162601
+ },
162160
162602
  capabilities: {
162161
162603
  title: "Capabilities",
162162
162604
  description: "Runtime support discovery for capability-aware branching.",
@@ -162205,6 +162647,7 @@ function print() { __p += __j.call(arguments, '') }
162205
162647
  }));
162206
162648
  CAPABILITY_REASON_CODES2 = [
162207
162649
  "COMMAND_UNAVAILABLE",
162650
+ "HELPER_UNAVAILABLE",
162208
162651
  "OPERATION_UNAVAILABLE",
162209
162652
  "TRACKED_MODE_UNAVAILABLE",
162210
162653
  "DRY_RUN_UNAVAILABLE",
@@ -162225,6 +162668,8 @@ function print() { __p += __j.call(arguments, '') }
162225
162668
  DELETE_INPUT_ALLOWED_KEYS2 = new Set(["target"]);
162226
162669
  INSERT_INPUT_ALLOWED_KEYS2 = new Set(["text", "target"]);
162227
162670
  REPLACE_INPUT_ALLOWED_KEYS2 = new Set(["text", "target"]);
162671
+ SUPPORTED_DELETE_NODE_TYPES2 = new Set(DELETABLE_BLOCK_NODE_TYPES2);
162672
+ REJECTED_DELETE_NODE_TYPES2 = new Set(["tableRow", "tableCell"]);
162228
162673
  REQUIRED_COMMANDS = {
162229
162674
  "format.fontSize": [
162230
162675
  "setTextSelection",
@@ -162254,6 +162699,7 @@ function print() { __p += __j.call(arguments, '') }
162254
162699
  "lists.outdent": ["setTextSelection", "decreaseListIndent"],
162255
162700
  "lists.restart": ["setTextSelection", "restartNumbering"],
162256
162701
  "lists.exit": ["exitListItemAt"],
162702
+ "blocks.delete": ["deleteBlockNodeById"],
162257
162703
  "comments.create": [
162258
162704
  "addComment",
162259
162705
  "setTextSelection",
@@ -162274,6 +162720,7 @@ function print() { __p += __j.call(arguments, '') }
162274
162720
  ]
162275
162721
  };
162276
162722
  VALID_CAPABILITY_REASON_CODES = new Set(CAPABILITY_REASON_CODES2);
162723
+ REQUIRED_HELPERS = { "blocks.delete": (editor) => typeof editor.helpers?.blockNode?.getBlockNodeById === "function" };
162277
162724
  STYLE_MARK_SCHEMA_NAMES = {
162278
162725
  bold: "bold",
162279
162726
  italic: "italic",
@@ -162385,6 +162832,7 @@ function print() { __p += __j.call(arguments, '') }
162385
162832
  "commentRangeStart",
162386
162833
  "commentRangeEnd"
162387
162834
  ]);
162835
+ VALID_CREATE_POSITIONS = ["before", "after"];
162388
162836
  REF_HANDLERS = [
162389
162837
  {
162390
162838
  prefix: "text:",
@@ -162407,6 +162855,34 @@ function print() { __p += __j.call(arguments, '') }
162407
162855
  handler: resolveBlockRef
162408
162856
  }
162409
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"]);
162410
162886
  DEFAULT_INLINE_POLICY = {
162411
162887
  mode: "preserve",
162412
162888
  onNonUniform: "majority"
@@ -162426,6 +162902,8 @@ function print() { __p += __j.call(arguments, '') }
162426
162902
  underline: "underline",
162427
162903
  strike: "strike"
162428
162904
  };
162905
+ SUPPORTED_NODE_TYPES = new Set(DELETABLE_BLOCK_NODE_TYPES2);
162906
+ REJECTED_NODE_TYPES = new Set(["tableRow", "tableCell"]);
162429
162907
  groupedCache = /* @__PURE__ */ new WeakMap;
162430
162908
  CSS_NAMED_COLORS = {
162431
162909
  aliceblue: "#f0f8ff",
@@ -184421,8 +184899,8 @@ function print() { __p += __j.call(arguments, '') }
184421
184899
  return isObjectLike_default(value) && hasOwnProperty$8.call(value, "callee") && !propertyIsEnumerable$1.call(value, "callee");
184422
184900
  };
184423
184901
  stubFalse_default = stubFalse;
184424
- freeExports$2 = typeof exports_src_DVVC7vA7_es == "object" && exports_src_DVVC7vA7_es && !exports_src_DVVC7vA7_es.nodeType && exports_src_DVVC7vA7_es;
184425
- freeModule$2 = freeExports$2 && typeof module_src_DVVC7vA7_es == "object" && module_src_DVVC7vA7_es && !module_src_DVVC7vA7_es.nodeType && module_src_DVVC7vA7_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;
184426
184904
  Buffer$1 = freeModule$2 && freeModule$2.exports === freeExports$2 ? _root_default.Buffer : undefined;
184427
184905
  isBuffer_default = (Buffer$1 ? Buffer$1.isBuffer : undefined) || stubFalse_default;
184428
184906
  typedArrayTags = {};
@@ -184430,8 +184908,8 @@ function print() { __p += __j.call(arguments, '') }
184430
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;
184431
184909
  _baseIsTypedArray_default = baseIsTypedArray;
184432
184910
  _baseUnary_default = baseUnary;
184433
- freeExports$1 = typeof exports_src_DVVC7vA7_es == "object" && exports_src_DVVC7vA7_es && !exports_src_DVVC7vA7_es.nodeType && exports_src_DVVC7vA7_es;
184434
- freeModule$1 = freeExports$1 && typeof module_src_DVVC7vA7_es == "object" && module_src_DVVC7vA7_es && !module_src_DVVC7vA7_es.nodeType && module_src_DVVC7vA7_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;
184435
184913
  freeProcess = freeModule$1 && freeModule$1.exports === freeExports$1 && _freeGlobal_default.process;
184436
184914
  _nodeUtil_default = function() {
184437
184915
  try {
@@ -184536,8 +185014,8 @@ function print() { __p += __j.call(arguments, '') }
184536
185014
  Stack.prototype.has = _stackHas_default;
184537
185015
  Stack.prototype.set = _stackSet_default;
184538
185016
  _Stack_default = Stack;
184539
- freeExports = typeof exports_src_DVVC7vA7_es == "object" && exports_src_DVVC7vA7_es && !exports_src_DVVC7vA7_es.nodeType && exports_src_DVVC7vA7_es;
184540
- freeModule = freeExports && typeof module_src_DVVC7vA7_es == "object" && module_src_DVVC7vA7_es && !module_src_DVVC7vA7_es.nodeType && module_src_DVVC7vA7_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;
184541
185019
  Buffer4 = freeModule && freeModule.exports === freeExports ? _root_default.Buffer : undefined;
184542
185020
  allocUnsafe = Buffer4 ? Buffer4.allocUnsafe : undefined;
184543
185021
  _cloneBuffer_default = cloneBuffer;
@@ -192156,7 +192634,7 @@ var init_zipper_BJHqrQMq_es = __esm(() => {
192156
192634
 
192157
192635
  // ../../packages/superdoc/dist/super-editor.es.js
192158
192636
  var init_super_editor_es = __esm(() => {
192159
- init_src_DVVC7vA7_es();
192637
+ init_src_0UjFcd91_es();
192160
192638
  init_SuperConverter_BxBclpFg_es();
192161
192639
  init_jszip_ChlR43oI_es();
192162
192640
  init_xml_js_DLE8mr0n_es();
@@ -192186,6 +192664,12 @@ function hasAllCommands2(editor, operationId) {
192186
192664
  return true;
192187
192665
  return required.every((command2) => hasCommand2(editor, command2));
192188
192666
  }
192667
+ function hasRequiredHelpers2(editor, operationId) {
192668
+ const check = REQUIRED_HELPERS2[operationId];
192669
+ if (!check)
192670
+ return true;
192671
+ return check(editor);
192672
+ }
192189
192673
  function hasMarkCapability2(editor, markName) {
192190
192674
  return Boolean(editor.schema?.marks?.[markName]);
192191
192675
  }
@@ -192230,7 +192714,7 @@ function isOperationAvailable2(editor, operationId) {
192230
192714
  if (INLINE_FORMAT_OPERATIONS2.has(operationId)) {
192231
192715
  return hasAllCommands2(editor, operationId) && hasMarkCapability2(editor, "textStyle");
192232
192716
  }
192233
- return hasAllCommands2(editor, operationId);
192717
+ return hasAllCommands2(editor, operationId) && hasRequiredHelpers2(editor, operationId);
192234
192718
  }
192235
192719
  function isCommandBackedAvailability2(operationId) {
192236
192720
  return !isMarkBackedOperation2(operationId) && !INLINE_FORMAT_OPERATIONS2.has(operationId);
@@ -192245,7 +192729,12 @@ function buildOperationCapabilities2(editor) {
192245
192729
  const reasons = [];
192246
192730
  if (!available) {
192247
192731
  if (isCommandBackedAvailability2(operationId)) {
192248
- pushReason2(reasons, "COMMAND_UNAVAILABLE");
192732
+ if (!hasAllCommands2(editor, operationId)) {
192733
+ pushReason2(reasons, "COMMAND_UNAVAILABLE");
192734
+ }
192735
+ if (!hasRequiredHelpers2(editor, operationId)) {
192736
+ pushReason2(reasons, "HELPER_UNAVAILABLE");
192737
+ }
192249
192738
  }
192250
192739
  pushReason2(reasons, "OPERATION_UNAVAILABLE");
192251
192740
  }
@@ -192308,7 +192797,7 @@ function getDocumentApiCapabilities2(editor) {
192308
192797
  planEngine: buildPlanEngineCapabilities2()
192309
192798
  };
192310
192799
  }
192311
- var REQUIRED_COMMANDS2, VALID_CAPABILITY_REASON_CODES2, STYLE_MARK_SCHEMA_NAMES2, INLINE_FORMAT_OPERATIONS2, SUPPORTED_STEP_OPS2, SUPPORTED_NON_UNIFORM_STRATEGIES2, SUPPORTED_SET_MARKS2, REGEX_MAX_PATTERN_LENGTH2 = 1024;
192800
+ var REQUIRED_COMMANDS2, VALID_CAPABILITY_REASON_CODES2, REQUIRED_HELPERS2, STYLE_MARK_SCHEMA_NAMES2, INLINE_FORMAT_OPERATIONS2, SUPPORTED_STEP_OPS2, SUPPORTED_NON_UNIFORM_STRATEGIES2, SUPPORTED_SET_MARKS2, REGEX_MAX_PATTERN_LENGTH2 = 1024;
192312
192801
  var init_capabilities_adapter = __esm(() => {
192313
192802
  init_src();
192314
192803
  REQUIRED_COMMANDS2 = {
@@ -192324,6 +192813,7 @@ var init_capabilities_adapter = __esm(() => {
192324
192813
  "lists.outdent": ["setTextSelection", "decreaseListIndent"],
192325
192814
  "lists.restart": ["setTextSelection", "restartNumbering"],
192326
192815
  "lists.exit": ["exitListItemAt"],
192816
+ "blocks.delete": ["deleteBlockNodeById"],
192327
192817
  "comments.create": ["addComment", "setTextSelection", "addCommentReply"],
192328
192818
  "comments.patch": ["editComment", "moveComment", "resolveComment", "setCommentInternal"],
192329
192819
  "comments.delete": ["removeComment"],
@@ -192335,6 +192825,9 @@ var init_capabilities_adapter = __esm(() => {
192335
192825
  ]
192336
192826
  };
192337
192827
  VALID_CAPABILITY_REASON_CODES2 = new Set(CAPABILITY_REASON_CODES);
192828
+ REQUIRED_HELPERS2 = {
192829
+ "blocks.delete": (editor) => typeof editor.helpers?.blockNode?.getBlockNodeById === "function"
192830
+ };
192338
192831
  STYLE_MARK_SCHEMA_NAMES2 = {
192339
192832
  bold: "bold",
192340
192833
  italic: "italic",
@@ -192830,7 +193323,7 @@ function addNode2(child, target) {
192830
193323
  else
192831
193324
  target.push(child);
192832
193325
  }
192833
- function addRange3($start, $end, depth, target) {
193326
+ function addRange2($start, $end, depth, target) {
192834
193327
  let node3 = ($end || $start).node(depth);
192835
193328
  let startIndex = 0, endIndex = $end ? $end.index(depth) : node3.childCount;
192836
193329
  if ($start) {
@@ -192855,28 +193348,28 @@ function replaceThreeWay2($from, $start, $end, $to, depth) {
192855
193348
  let openStart = $from.depth > depth && joinable2($from, $start, depth + 1);
192856
193349
  let openEnd = $to.depth > depth && joinable2($end, $to, depth + 1);
192857
193350
  let content2 = [];
192858
- addRange3(null, $from, depth, content2);
193351
+ addRange2(null, $from, depth, content2);
192859
193352
  if (openStart && openEnd && $start.index(depth) == $end.index(depth)) {
192860
193353
  checkJoin2(openStart, openEnd);
192861
193354
  addNode2(close2(openStart, replaceThreeWay2($from, $start, $end, $to, depth + 1)), content2);
192862
193355
  } else {
192863
193356
  if (openStart)
192864
193357
  addNode2(close2(openStart, replaceTwoWay2($from, $start, depth + 1)), content2);
192865
- addRange3($start, $end, depth, content2);
193358
+ addRange2($start, $end, depth, content2);
192866
193359
  if (openEnd)
192867
193360
  addNode2(close2(openEnd, replaceTwoWay2($end, $to, depth + 1)), content2);
192868
193361
  }
192869
- addRange3($to, null, depth, content2);
193362
+ addRange2($to, null, depth, content2);
192870
193363
  return new Fragment4(content2);
192871
193364
  }
192872
193365
  function replaceTwoWay2($from, $to, depth) {
192873
193366
  let content2 = [];
192874
- addRange3(null, $from, depth, content2);
193367
+ addRange2(null, $from, depth, content2);
192875
193368
  if ($from.depth > depth) {
192876
193369
  let type = joinable2($from, $to, depth + 1);
192877
193370
  addNode2(close2(type, replaceTwoWay2($from, $to, depth + 1)), content2);
192878
193371
  }
192879
- addRange3($to, null, depth, content2);
193372
+ addRange2($to, null, depth, content2);
192880
193373
  return new Fragment4(content2);
192881
193374
  }
192882
193375
  function prepareSliceForReplace2(slice2, $along) {
@@ -197394,13 +197887,28 @@ function buildBlockIndex2(editor) {
197394
197887
  registerKey(`${nodeType}:${aliasId}`, candidate);
197395
197888
  }
197396
197889
  });
197397
- return { candidates, byId };
197890
+ return { candidates, byId, ambiguous };
197398
197891
  }
197399
197892
  function findBlockById2(index2, address2) {
197400
197893
  if (address2.kind !== "block")
197401
197894
  return;
197402
197895
  return index2.byId.get(`${address2.nodeType}:${address2.nodeId}`);
197403
197896
  }
197897
+ function findBlockByIdStrict2(index2, address2) {
197898
+ const key2 = `${address2.nodeType}:${address2.nodeId}`;
197899
+ if (index2.ambiguous.has(key2)) {
197900
+ throw new DocumentApiAdapterError3("AMBIGUOUS_TARGET", `Multiple blocks share key "${key2}".`, {
197901
+ target: address2
197902
+ });
197903
+ }
197904
+ const candidate = index2.byId.get(key2);
197905
+ if (!candidate) {
197906
+ throw new DocumentApiAdapterError3("TARGET_NOT_FOUND", `Block "${key2}" was not found.`, {
197907
+ target: address2
197908
+ });
197909
+ }
197910
+ return candidate;
197911
+ }
197404
197912
  function isTextBlockCandidate2(candidate) {
197405
197913
  const node3 = candidate.node;
197406
197914
  return Boolean(node3?.inlineContent || node3?.isTextblock);
@@ -197528,7 +198036,12 @@ function checkRevision2(editor, expectedRevision) {
197528
198036
  return;
197529
198037
  const current = getRevision2(editor);
197530
198038
  if (expectedRevision !== current) {
197531
- 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
+ });
197532
198045
  }
197533
198046
  }
197534
198047
  var revisionMap2, subscribedEditors2;
@@ -197790,7 +198303,9 @@ function captureRunsInRange2(editor, blockPos, from3, to) {
197790
198303
  return;
197791
198304
  }
197792
198305
  if (node3.isLeaf) {
198306
+ const start2 = offset2;
197793
198307
  offset2 += 1;
198308
+ maybePushRun(start2, offset2, []);
197794
198309
  return;
197795
198310
  }
197796
198311
  let isFirstChild = true;
@@ -198303,12 +198818,73 @@ var init_block_strategy = __esm(() => {
198303
198818
  function isAssertStep2(step) {
198304
198819
  return step.op === "assert";
198305
198820
  }
198821
+ function isCreateOp2(op) {
198822
+ return op === "create.heading" || op === "create.paragraph";
198823
+ }
198306
198824
  function isSelectWhere2(where) {
198307
198825
  return where.by === "select";
198308
198826
  }
198309
198827
  function isRefWhere2(where) {
198310
198828
  return where.by === "ref";
198311
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
+ }
198312
198888
  function isV3Ref2(payload) {
198313
198889
  return typeof payload === "object" && payload !== null && "v" in payload && payload.v === 3;
198314
198890
  }
@@ -198536,7 +199112,14 @@ function decodeTextRefPayload2(encoded, stepId) {
198536
199112
  function resolveV3TextRef2(editor, index2, step, refData) {
198537
199113
  const currentRevision = getRevision2(editor);
198538
199114
  if (refData.rev !== currentRevision) {
198539
- 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
+ });
198540
199123
  }
198541
199124
  if (!refData.segments?.length)
198542
199125
  return [];
@@ -198635,7 +199218,11 @@ function resolveStepTargets2(editor, index2, step) {
198635
199218
  });
198636
199219
  if (refWhere) {
198637
199220
  if (targets.length === 0) {
198638
- 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
+ });
198639
199226
  }
198640
199227
  if (targets.length > 1) {
198641
199228
  throw planError2("AMBIGUOUS_MATCH", `ref "${refWhere.ref}" resolved to ${targets.length} targets`, step.id, {
@@ -198654,6 +199241,18 @@ function resolveStepTargets2(editor, index2, step) {
198654
199241
  }
198655
199242
  return targets;
198656
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
+ }
198657
199256
  function applyCardinalityCheck2(step, targets) {
198658
199257
  const where = step.where;
198659
199258
  if (!("require" in where) || where.require === undefined)
@@ -198661,11 +199260,11 @@ function applyCardinalityCheck2(step, targets) {
198661
199260
  const require2 = where.require;
198662
199261
  if (require2 === "first") {
198663
199262
  if (targets.length === 0) {
198664
- 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));
198665
199264
  }
198666
199265
  } else if (require2 === "exactlyOne") {
198667
199266
  if (targets.length === 0) {
198668
- 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));
198669
199268
  }
198670
199269
  if (targets.length > 1) {
198671
199270
  throw planError2("AMBIGUOUS_MATCH", `selector matched ${targets.length} ranges, expected exactly one`, step.id, {
@@ -198674,47 +199273,119 @@ function applyCardinalityCheck2(step, targets) {
198674
199273
  }
198675
199274
  } else if (require2 === "all") {
198676
199275
  if (targets.length === 0) {
198677
- 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));
198678
199277
  }
198679
199278
  }
198680
199279
  }
198681
- function detectOverlaps2(steps) {
198682
- const rangesByBlock = new Map;
198683
- for (const compiled of steps) {
198684
- for (const target of compiled.targets) {
198685
- if (target.kind === "range") {
198686
- addRange4(rangesByBlock, target.blockId, target.stepId, target.from, target.to);
198687
- } else {
198688
- for (const seg of target.segments) {
198689
- 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 };
198690
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 };
199303
+ }
199304
+ return { overlapClass: "overlapping", blockId, rangeA: a2, rangeB: b3 };
198691
199305
  }
198692
199306
  }
198693
199307
  }
198694
- for (const [blockId, ranges] of rangesByBlock) {
198695
- ranges.sort((a2, b3) => a2.from - b3.from);
198696
- for (let i4 = 1;i4 < ranges.length; i4++) {
198697
- const prev = ranges[i4 - 1];
198698
- const curr = ranges[i4];
198699
- if (prev.stepId !== curr.stepId && prev.to > curr.from) {
198700
- 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);
198701
199318
  }
198702
199319
  }
198703
199320
  }
199321
+ return result;
199322
+ }
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 });
198704
199330
  }
198705
- function addRange4(map6, blockId, stepId, from3, to) {
198706
- let blockRanges = map6.get(blockId);
198707
- if (!blockRanges) {
198708
- blockRanges = [];
198709
- map6.set(blockId, blockRanges);
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
+ });
198710
199380
  }
198711
- blockRanges.push({ stepId, from: from3, to });
198712
199381
  }
198713
199382
  function compilePlan2(editor, steps) {
198714
199383
  if (steps.length > MAX_PLAN_STEPS) {
198715
199384
  throw planError2("INVALID_INPUT", `plan contains ${steps.length} steps, maximum is ${MAX_PLAN_STEPS}`);
198716
199385
  }
199386
+ const compiledRevision = getRevision2(editor);
198717
199387
  const index2 = getBlockIndex2(editor);
199388
+ assertNoDuplicateBlockIds2(index2);
198718
199389
  const mutationSteps = [];
198719
199390
  const assertSteps = [];
198720
199391
  const seenIds = new Set;
@@ -198728,25 +199399,36 @@ function compilePlan2(editor, steps) {
198728
199399
  seenIds.add(step.id);
198729
199400
  }
198730
199401
  let totalTargets = 0;
199402
+ let stepIndex = 0;
198731
199403
  for (const step of steps) {
198732
199404
  if (isAssertStep2(step)) {
198733
199405
  assertSteps.push(step);
199406
+ stepIndex++;
198734
199407
  continue;
198735
199408
  }
198736
199409
  if (!hasStepExecutor2(step.op)) {
198737
199410
  throw planError2("INVALID_INPUT", `unknown step op "${step.op}"`, step.id);
198738
199411
  }
199412
+ if (isCreateOp2(step.op)) {
199413
+ validateCreateStepPosition2(step);
199414
+ }
198739
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
+ }
198740
199421
  totalTargets += targets.length;
198741
199422
  mutationSteps.push({ step, targets });
199423
+ stepIndex++;
198742
199424
  }
198743
199425
  if (totalTargets > MAX_PLAN_RESOLVED_TARGETS) {
198744
199426
  throw planError2("INVALID_INPUT", `plan resolved ${totalTargets} total targets, maximum is ${MAX_PLAN_RESOLVED_TARGETS}`);
198745
199427
  }
198746
- detectOverlaps2(mutationSteps);
198747
- return { mutationSteps, assertSteps };
199428
+ validateStepInteractions2(mutationSteps);
199429
+ return { mutationSteps, assertSteps, compiledRevision };
198748
199430
  }
198749
- var REF_HANDLERS2;
199431
+ var VALID_CREATE_POSITIONS2, REF_HANDLERS2, STEP_INTERACTION_MATRIX2, MATRIX_EXEMPT_OPS2;
198750
199432
  var init_compiler = __esm(() => {
198751
199433
  init_src();
198752
199434
  init_errors4();
@@ -198757,6 +199439,7 @@ var init_compiler = __esm(() => {
198757
199439
  init_text_strategy();
198758
199440
  init_block_strategy();
198759
199441
  init_node_address_resolver();
199442
+ VALID_CREATE_POSITIONS2 = ["before", "after"];
198760
199443
  REF_HANDLERS2 = [
198761
199444
  { prefix: "text:", handler: resolveTextRef2 },
198762
199445
  {
@@ -198773,6 +199456,48 @@ var init_compiler = __esm(() => {
198773
199456
  },
198774
199457
  { prefix: "", handler: resolveBlockRef2 }
198775
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();
198776
199501
  });
198777
199502
 
198778
199503
  // ../../packages/super-editor/src/document-api-adapters/helpers/transaction-meta.ts
@@ -198840,12 +199565,36 @@ function buildMarksFromSetMarks2(editor, setMarks) {
198840
199565
  marks.push(schema.marks.strike.create());
198841
199566
  return marks;
198842
199567
  }
198843
- function toAbsoluteBlockInsertPos2(editor, blockId, offset2, stepId) {
198844
- const index2 = getBlockIndex2(editor);
198845
- const candidate = index2.candidates.find((c2) => c2.nodeId === blockId);
198846
- if (!candidate)
198847
- throw planError2("TARGET_NOT_FOUND", `block "${blockId}" not found`, stepId);
198848
- 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;
198849
199598
  }
198850
199599
  function executeTextRewrite2(editor, tr, target, step, mapping) {
198851
199600
  const absFrom = mapping.map(target.absFrom);
@@ -198892,25 +199641,7 @@ function executeTextDelete2(_editor, tr, target, _step, mapping) {
198892
199641
  function executeStyleApply3(editor, tr, target, step, mapping) {
198893
199642
  const absFrom = mapping.map(target.absFrom);
198894
199643
  const absTo = mapping.map(target.absTo);
198895
- const { schema } = editor.state;
198896
- let changed = false;
198897
- const markEntries = [
198898
- ["bold", step.args.inline.bold, schema.marks.bold],
198899
- ["italic", step.args.inline.italic, schema.marks.italic],
198900
- ["underline", step.args.inline.underline, schema.marks.underline],
198901
- ["strike", step.args.inline.strike, schema.marks.strike]
198902
- ];
198903
- for (const [, value, markType] of markEntries) {
198904
- if (value === undefined || !markType)
198905
- continue;
198906
- if (value) {
198907
- tr.addMark(absFrom, absTo, markType.create());
198908
- } else {
198909
- tr.removeMark(absFrom, absTo, markType);
198910
- }
198911
- changed = true;
198912
- }
198913
- return { changed };
199644
+ return { changed: applyInlineMarkPatches2(editor, tr, absFrom, absTo, step.args.inline) };
198914
199645
  }
198915
199646
  function validateMappedSpanContiguity2(target, mapping, stepId) {
198916
199647
  let lastMappedEnd = -1;
@@ -198981,29 +199712,11 @@ function executeSpanTextDelete2(_editor, tr, target, step, mapping) {
198981
199712
  }
198982
199713
  function executeSpanStyleApply2(editor, tr, target, step, mapping) {
198983
199714
  validateMappedSpanContiguity2(target, mapping, step.id);
198984
- const { schema } = editor.state;
198985
- let changed = false;
198986
199715
  const firstSeg = target.segments[0];
198987
199716
  const lastSeg = target.segments[target.segments.length - 1];
198988
199717
  const absFrom = mapping.map(firstSeg.absFrom, 1);
198989
199718
  const absTo = mapping.map(lastSeg.absTo, -1);
198990
- const markEntries = [
198991
- ["bold", step.args.inline.bold, schema.marks.bold],
198992
- ["italic", step.args.inline.italic, schema.marks.italic],
198993
- ["underline", step.args.inline.underline, schema.marks.underline],
198994
- ["strike", step.args.inline.strike, schema.marks.strike]
198995
- ];
198996
- for (const [, value, markType] of markEntries) {
198997
- if (value === undefined || !markType)
198998
- continue;
198999
- if (value) {
199000
- tr.addMark(absFrom, absTo, markType.create());
199001
- } else {
199002
- tr.removeMark(absFrom, absTo, markType);
199003
- }
199004
- changed = true;
199005
- }
199006
- return { changed };
199719
+ return { changed: applyInlineMarkPatches2(editor, tr, absFrom, absTo, step.args.inline) };
199007
199720
  }
199008
199721
  function getReplacementText2(replacement) {
199009
199722
  if (replacement.blocks !== undefined) {
@@ -199146,7 +199859,7 @@ function buildAssertIndex2(doc4) {
199146
199859
  }
199147
199860
  return true;
199148
199861
  });
199149
- return { candidates, byId };
199862
+ return { candidates, byId, ambiguous };
199150
199863
  }
199151
199864
  function resolveAssertScope2(index2, select2, within2) {
199152
199865
  if (!within2)
@@ -199202,11 +199915,14 @@ function executeAssertStep2(_editor, tr, step) {
199202
199915
  }
199203
199916
  function executeCreateStep2(editor, tr, step, targets, mapping) {
199204
199917
  const target = targets[0];
199205
- if (!target || target.kind !== "range") {
199206
- 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);
199207
199920
  }
199208
199921
  const args3 = step.args;
199209
- 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);
199210
199926
  const paragraphType = editor.state.schema?.nodes?.paragraph;
199211
199927
  if (!paragraphType) {
199212
199928
  throw planError2("INVALID_INPUT", "paragraph node type not in schema", step.id);
@@ -199229,6 +199945,7 @@ function executeCreateStep2(editor, tr, step, targets, mapping) {
199229
199945
  throw planError2("INVALID_INPUT", `could not create ${step.op} node`, step.id);
199230
199946
  }
199231
199947
  tr.insert(pos, node3);
199948
+ assertNoPostInsertDuplicateIds2(tr.doc, step.id);
199232
199949
  return {
199233
199950
  stepId: step.id,
199234
199951
  op: step.op,
@@ -199237,6 +199954,32 @@ function executeCreateStep2(editor, tr, step, targets, mapping) {
199237
199954
  data: { domain: "text", resolutions: [] }
199238
199955
  };
199239
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
+ }
199240
199983
  function runMutationsOnTransaction2(editor, tr, compiled, options) {
199241
199984
  const mapping = tr.mapping;
199242
199985
  const stepOutcomes = [];
@@ -199285,6 +200028,15 @@ function executeCompiledPlan2(editor, compiled, options = {}) {
199285
200028
  const startTime = performance.now();
199286
200029
  const revisionBefore = getRevision2(editor);
199287
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
+ }
199288
200040
  const tr = editor.state.tr;
199289
200041
  const changeMode = options.changeMode ?? "direct";
199290
200042
  if (changeMode === "tracked") {
@@ -199325,6 +200077,7 @@ var init_executor = __esm(() => {
199325
200077
  init_revision_tracker();
199326
200078
  init_compiler();
199327
200079
  init_index_cache();
200080
+ init_create_insertion();
199328
200081
  init_style_resolver();
199329
200082
  init_node_address_resolver();
199330
200083
  init_adapter_utils();
@@ -199494,7 +200247,11 @@ function executeDomainCommand2(editor, handler2, options) {
199494
200247
  args: {},
199495
200248
  _handler: handler2
199496
200249
  };
199497
- const compiled = { mutationSteps: [{ step, targets: [] }], assertSteps: [] };
200250
+ const compiled = {
200251
+ mutationSteps: [{ step, targets: [] }],
200252
+ assertSteps: [],
200253
+ compiledRevision: getRevision2(editor)
200254
+ };
199498
200255
  return executeCompiledPlan2(editor, compiled, { expectedRevision: options?.expectedRevision });
199499
200256
  }
199500
200257
  function validateWriteRequest2(request, resolved) {
@@ -199570,7 +200327,8 @@ function writeWrapper2(editor, request, options) {
199570
200327
  const target = toCompiledTarget2(stepId, op, resolved);
199571
200328
  const compiled = {
199572
200329
  mutationSteps: [{ step, targets: [target] }],
199573
- assertSteps: []
200330
+ assertSteps: [],
200331
+ compiledRevision: getRevision2(editor)
199574
200332
  };
199575
200333
  const receipt2 = executeCompiledPlan2(editor, compiled, {
199576
200334
  changeMode: mode,
@@ -199634,7 +200392,8 @@ function styleApplyWrapper2(editor, input2, options) {
199634
200392
  };
199635
200393
  const compiled = {
199636
200394
  mutationSteps: [{ step, targets: [target] }],
199637
- assertSteps: []
200395
+ assertSteps: [],
200396
+ compiledRevision: getRevision2(editor)
199638
200397
  };
199639
200398
  const receipt2 = executeCompiledPlan2(editor, compiled, {
199640
200399
  changeMode: mode,
@@ -199646,6 +200405,7 @@ var STUB_WHERE2, MARK_KEY_TO_SCHEMA_NAME2;
199646
200405
  var init_plan_wrappers = __esm(() => {
199647
200406
  init_wrapper();
199648
200407
  init_executor();
200408
+ init_revision_tracker();
199649
200409
  init_errors3();
199650
200410
  init_adapter_utils();
199651
200411
  init_mutation_helpers();
@@ -200505,6 +201265,71 @@ var init_comments_wrappers = __esm(() => {
200505
201265
  init_comment_target_resolver();
200506
201266
  });
200507
201267
 
201268
+ // ../../packages/super-editor/src/document-api-adapters/plan-engine/blocks-wrappers.ts
201269
+ function validateTargetNodeType2(nodeType) {
201270
+ if (REJECTED_NODE_TYPES2.has(nodeType)) {
201271
+ throw new DocumentApiAdapterError3("INVALID_TARGET", `blocks.delete does not support "${nodeType}" targets. Table row/column operations are out of scope.`, { nodeType });
201272
+ }
201273
+ if (!SUPPORTED_NODE_TYPES2.has(nodeType)) {
201274
+ throw new DocumentApiAdapterError3("INVALID_TARGET", `blocks.delete does not support "${nodeType}" targets.`, {
201275
+ nodeType
201276
+ });
201277
+ }
201278
+ }
201279
+ function resolveSdBlockId2(candidate) {
201280
+ const sdBlockId = candidate.node.attrs?.sdBlockId;
201281
+ if (typeof sdBlockId === "string" && sdBlockId.length > 0)
201282
+ return sdBlockId;
201283
+ throw new DocumentApiAdapterError3("INTERNAL_ERROR", "Resolved block candidate is missing sdBlockId attribute. This indicates a schema/extension invariant violation.", { attrs: candidate.node.attrs });
201284
+ }
201285
+ function validateCommandLayerUniqueness2(editor, sdBlockId) {
201286
+ const getBlockNodeById = editor.helpers?.blockNode?.getBlockNodeById;
201287
+ if (typeof getBlockNodeById !== "function") {
201288
+ throw new DocumentApiAdapterError3("CAPABILITY_UNAVAILABLE", "blocks.delete requires the blockNode helper to be registered.", { reason: "missing_helper" });
201289
+ }
201290
+ const matches3 = getBlockNodeById(sdBlockId);
201291
+ if (!matches3 || Array.isArray(matches3) && matches3.length === 0) {
201292
+ throw new DocumentApiAdapterError3("TARGET_NOT_FOUND", `Block with sdBlockId "${sdBlockId}" was not found at the command layer.`, { sdBlockId });
201293
+ }
201294
+ if (Array.isArray(matches3) && matches3.length > 1) {
201295
+ throw new DocumentApiAdapterError3("AMBIGUOUS_TARGET", `Multiple blocks share sdBlockId "${sdBlockId}" at the command layer.`, { sdBlockId, count: matches3.length });
201296
+ }
201297
+ }
201298
+ function blocksDeleteWrapper2(editor, input2, options) {
201299
+ rejectTrackedMode2("blocks.delete", options);
201300
+ const index2 = getBlockIndex2(editor);
201301
+ const candidate = findBlockByIdStrict2(index2, input2.target);
201302
+ validateTargetNodeType2(candidate.nodeType);
201303
+ const sdBlockId = resolveSdBlockId2(candidate);
201304
+ const deleteBlockNodeById = requireEditorCommand2(editor.commands?.deleteBlockNodeById, "blocks.delete");
201305
+ validateCommandLayerUniqueness2(editor, sdBlockId);
201306
+ if (options?.dryRun) {
201307
+ return { success: true, deleted: input2.target };
201308
+ }
201309
+ const receipt2 = executeDomainCommand2(editor, () => {
201310
+ const didApply = deleteBlockNodeById(sdBlockId);
201311
+ if (didApply) {
201312
+ clearIndexCache2(editor);
201313
+ }
201314
+ return didApply;
201315
+ }, { expectedRevision: options?.expectedRevision });
201316
+ if (receipt2.steps[0]?.effect !== "changed") {
201317
+ throw new DocumentApiAdapterError3("INTERNAL_ERROR", "blocks.delete command returned false despite passing all pre-apply checks. This is an internal invariant violation.", { sdBlockId, target: input2.target });
201318
+ }
201319
+ return { success: true, deleted: input2.target };
201320
+ }
201321
+ var SUPPORTED_NODE_TYPES2, REJECTED_NODE_TYPES2;
201322
+ var init_blocks_wrappers = __esm(() => {
201323
+ init_src();
201324
+ init_index_cache();
201325
+ init_node_address_resolver();
201326
+ init_errors3();
201327
+ init_mutation_helpers();
201328
+ init_plan_wrappers();
201329
+ SUPPORTED_NODE_TYPES2 = new Set(DELETABLE_BLOCK_NODE_TYPES);
201330
+ REJECTED_NODE_TYPES2 = new Set(["tableRow", "tableCell"]);
201331
+ });
201332
+
200508
201333
  // ../../packages/super-editor/src/extensions/track-changes/trackChangesHelpers/documentHelpers.js
200509
201334
  var flatten3 = (node3, descend = true) => {
200510
201335
  if (!node3) {
@@ -200701,14 +201526,7 @@ function resolveCreateInsertPosition2(editor, at, operationLabel) {
200701
201526
  return 0;
200702
201527
  if (location3.kind === "documentEnd")
200703
201528
  return editor.state.doc.content.size;
200704
- const index2 = getBlockIndex2(editor);
200705
- const target = findBlockById2(index2, location3.target);
200706
- if (!target) {
200707
- throw new DocumentApiAdapterError3("TARGET_NOT_FOUND", `Create ${operationLabel} target block was not found.`, {
200708
- target: location3.target
200709
- });
200710
- }
200711
- return location3.kind === "before" ? target.pos : target.end;
201529
+ return resolveBlockInsertionPos2(editor, location3.target.nodeId, location3.kind);
200712
201530
  }
200713
201531
  function resolveCreatedBlock2(editor, nodeType, blockId) {
200714
201532
  const index2 = getBlockIndex2(editor);
@@ -200814,7 +201632,10 @@ function createParagraphWrapper2(editor, input2, options) {
200814
201632
  if (mode === "tracked") {
200815
201633
  trackedChangeRefs = collectTrackInsertRefsInRange2(editor, paragraph2.pos, paragraph2.end);
200816
201634
  }
200817
- } catch {}
201635
+ } catch (e) {
201636
+ if (!(e instanceof DocumentApiAdapterError3))
201637
+ throw e;
201638
+ }
200818
201639
  }
200819
201640
  return didApply;
200820
201641
  }, { expectedRevision: options?.expectedRevision });
@@ -200883,7 +201704,10 @@ function createHeadingWrapper2(editor, input2, options) {
200883
201704
  if (mode === "tracked") {
200884
201705
  trackedChangeRefs = collectTrackInsertRefsInRange2(editor, heading3.pos, heading3.end);
200885
201706
  }
200886
- } catch {}
201707
+ } catch (e) {
201708
+ if (!(e instanceof DocumentApiAdapterError3))
201709
+ throw e;
201710
+ }
200887
201711
  }
200888
201712
  return didApply;
200889
201713
  }, { expectedRevision: options?.expectedRevision });
@@ -200901,7 +201725,7 @@ function createHeadingWrapper2(editor, input2, options) {
200901
201725
  var init_create_wrappers = __esm(() => {
200902
201726
  init_wrapper();
200903
201727
  init_index_cache();
200904
- init_node_address_resolver();
201728
+ init_create_insertion();
200905
201729
  init_tracked_change_refs();
200906
201730
  init_errors3();
200907
201731
  init_mutation_helpers();
@@ -235326,7 +236150,6 @@ var init_track_changes_wrappers = __esm(() => {
235326
236150
 
235327
236151
  // ../../packages/super-editor/src/document-api-adapters/plan-engine/preview.ts
235328
236152
  function previewPlan2(editor, input2) {
235329
- const evaluatedRevision = getRevision2(editor);
235330
236153
  checkRevision2(editor, input2.expectedRevision);
235331
236154
  if (!input2.steps?.length) {
235332
236155
  throw planError2("INVALID_INPUT", "plan must contain at least one step");
@@ -235334,8 +236157,10 @@ function previewPlan2(editor, input2) {
235334
236157
  const failures = [];
235335
236158
  const stepPreviews = [];
235336
236159
  let currentPhase = "compile";
236160
+ let evaluatedRevision = getRevision2(editor);
235337
236161
  try {
235338
236162
  const compiled = compilePlan2(editor, input2.steps);
236163
+ evaluatedRevision = compiled.compiledRevision;
235339
236164
  currentPhase = "execute";
235340
236165
  const tr = editor.state.tr;
235341
236166
  const { stepOutcomes, assertFailures } = runMutationsOnTransaction2(editor, tr, compiled, {
@@ -235903,7 +236728,13 @@ function queryMatchAdapter2(editor, input2) {
235903
236728
  const paginatedMatches = isTextSelector ? applyPagination2(rawMatches, userOffset, input2.limit) : rawMatches;
235904
236729
  if (require2 === "first" || require2 === "exactlyOne" || require2 === "all") {
235905
236730
  if (totalMatches === 0) {
235906
- 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
+ });
235907
236738
  }
235908
236739
  }
235909
236740
  if (require2 === "exactlyOne" && totalMatches > 1) {
@@ -235916,7 +236747,11 @@ function queryMatchAdapter2(editor, input2) {
235916
236747
  if (isTextSelector && raw.textRanges?.length) {
235917
236748
  const blocks2 = buildMatchBlocks2(editor, raw.textRanges, evaluatedRevision, id2);
235918
236749
  if (blocks2.length === 0) {
235919
- 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
+ });
235920
236755
  }
235921
236756
  const snippetResult = buildBlocksSnippet2(editor, blocks2);
235922
236757
  const segments = blocks2.map((b4) => ({ blockId: b4.blockId, start: b4.range.start, end: b4.range.end }));
@@ -236151,6 +236986,9 @@ function getDocumentApiAdapters2(editor) {
236151
236986
  acceptAll: (input2, options) => trackChangesAcceptAllWrapper2(editor, input2, options),
236152
236987
  rejectAll: (input2, options) => trackChangesRejectAllWrapper2(editor, input2, options)
236153
236988
  },
236989
+ blocks: {
236990
+ delete: (input2, options) => blocksDeleteWrapper2(editor, input2, options)
236991
+ },
236154
236992
  create: {
236155
236993
  paragraph: (input2, options) => createParagraphWrapper2(editor, input2, options),
236156
236994
  heading: (input2, options) => createHeadingWrapper2(editor, input2, options)
@@ -236177,6 +237015,7 @@ function getDocumentApiAdapters2(editor) {
236177
237015
  var init_document_api_adapters = __esm(() => {
236178
237016
  init_capabilities_adapter();
236179
237017
  init_comments_wrappers();
237018
+ init_blocks_wrappers();
236180
237019
  init_create_wrappers();
236181
237020
  init_find_adapter();
236182
237021
  init_plan_wrappers();
@@ -239126,6 +239965,9 @@ function mapListsError(operationId, error, code7) {
239126
239965
  function mapTextMutationError(operationId, error, code7) {
239127
239966
  const message = extractErrorMessage(error);
239128
239967
  const details = extractErrorDetails(error);
239968
+ const planEngineError = tryMapPlanEngineError(operationId, error, code7);
239969
+ if (planEngineError)
239970
+ return planEngineError;
239129
239971
  if (code7 === "TARGET_NOT_FOUND") {
239130
239972
  return new CliError("TARGET_NOT_FOUND", message, { operationId, details });
239131
239973
  }
@@ -239145,15 +239987,48 @@ function mapTextMutationError(operationId, error, code7) {
239145
239987
  function mapCreateError(operationId, error, code7) {
239146
239988
  const message = extractErrorMessage(error);
239147
239989
  const details = extractErrorDetails(error);
239990
+ const planEngineError = tryMapPlanEngineError(operationId, error, code7);
239991
+ if (planEngineError)
239992
+ return planEngineError;
239148
239993
  if (code7 === "TARGET_NOT_FOUND") {
239149
239994
  return new CliError("TARGET_NOT_FOUND", message, { operationId, details });
239150
239995
  }
239151
239996
  if (code7 === "AMBIGUOUS_TARGET" || code7 === "INVALID_TARGET") {
239152
239997
  return new CliError("INVALID_ARGUMENT", message, { operationId, details });
239153
239998
  }
239154
- if (code7 === "TRACK_CHANGE_COMMAND_UNAVAILABLE" || code7 === "CAPABILITY_UNAVAILABLE") {
239999
+ if (code7 === "TRACK_CHANGE_COMMAND_UNAVAILABLE") {
239155
240000
  return new CliError("TRACK_CHANGE_COMMAND_UNAVAILABLE", message, { operationId, details });
239156
240001
  }
240002
+ if (code7 === "CAPABILITY_UNAVAILABLE") {
240003
+ const reason = details?.reason;
240004
+ if (reason === "tracked_mode_unsupported") {
240005
+ return new CliError("TRACK_CHANGE_COMMAND_UNAVAILABLE", message, { operationId, details });
240006
+ }
240007
+ return new CliError("COMMAND_FAILED", message, { operationId, details });
240008
+ }
240009
+ if (code7 === "COMMAND_UNAVAILABLE") {
240010
+ return new CliError("COMMAND_FAILED", message, { operationId, details });
240011
+ }
240012
+ if (error instanceof CliError)
240013
+ return error;
240014
+ return new CliError("COMMAND_FAILED", message, { operationId, details });
240015
+ }
240016
+ function mapBlocksError(operationId, error, code7) {
240017
+ const message = extractErrorMessage(error);
240018
+ const details = extractErrorDetails(error);
240019
+ if (code7 === "TARGET_NOT_FOUND") {
240020
+ return new CliError("TARGET_NOT_FOUND", message, { operationId, details });
240021
+ }
240022
+ if (code7 === "AMBIGUOUS_TARGET" || code7 === "INVALID_TARGET" || code7 === "INVALID_INPUT") {
240023
+ return new CliError("INVALID_ARGUMENT", message, { operationId, details });
240024
+ }
240025
+ if (code7 === "CAPABILITY_UNAVAILABLE") {
240026
+ const reason = details?.reason;
240027
+ if (reason === "tracked_mode_unsupported") {
240028
+ return new CliError("TRACK_CHANGE_COMMAND_UNAVAILABLE", message, { operationId, details });
240029
+ }
240030
+ return new CliError("COMMAND_FAILED", message, { operationId, details });
240031
+ }
239157
240032
  if (code7 === "COMMAND_UNAVAILABLE") {
239158
240033
  return new CliError("COMMAND_FAILED", message, { operationId, details });
239159
240034
  }
@@ -239171,6 +240046,14 @@ function mapQueryError(operationId, error, code7) {
239171
240046
  return error;
239172
240047
  return new CliError("COMMAND_FAILED", message, { operationId, details });
239173
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
+ }
239174
240057
  function mapInvokeError(operationId, error) {
239175
240058
  if (error instanceof CliError)
239176
240059
  return error;
@@ -239195,6 +240078,9 @@ function mapFailedReceipt(operationId, result) {
239195
240078
  }
239196
240079
  const failureCode = failure.code;
239197
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
+ }
239198
240084
  if (family === "trackChanges") {
239199
240085
  if (failureCode === "TRACK_CHANGE_COMMAND_UNAVAILABLE") {
239200
240086
  return new CliError("TRACK_CHANGE_COMMAND_UNAVAILABLE", failureMessage, { operationId, failure });
@@ -239231,6 +240117,12 @@ function mapFailedReceipt(operationId, result) {
239231
240117
  }
239232
240118
  return new CliError("COMMAND_FAILED", failureMessage, { operationId, failure });
239233
240119
  }
240120
+ if (family === "blocks") {
240121
+ if (failureCode === "INVALID_TARGET") {
240122
+ return new CliError("INVALID_ARGUMENT", failureMessage, { operationId, failure });
240123
+ }
240124
+ return new CliError("COMMAND_FAILED", failureMessage, { operationId, failure });
240125
+ }
239234
240126
  if (family === "create") {
239235
240127
  if (failureCode === "TRACK_CHANGE_COMMAND_UNAVAILABLE") {
239236
240128
  return new CliError("TRACK_CHANGE_COMMAND_UNAVAILABLE", failureMessage, { operationId, failure });
@@ -239242,18 +240134,35 @@ function mapFailedReceipt(operationId, result) {
239242
240134
  }
239243
240135
  return new CliError("COMMAND_FAILED", failureMessage, { operationId, failure });
239244
240136
  }
239245
- var FAMILY_MAPPERS;
240137
+ var PLAN_ENGINE_PASSTHROUGH_CODES, FAMILY_MAPPERS;
239246
240138
  var init_error_mapping = __esm(() => {
239247
240139
  init_operation_hints();
239248
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
+ ]);
239249
240154
  FAMILY_MAPPERS = {
239250
240155
  trackChanges: mapTrackChangesError,
239251
240156
  comments: mapCommentsError,
239252
240157
  lists: mapListsError,
239253
240158
  textMutation: mapTextMutationError,
239254
240159
  create: mapCreateError,
240160
+ blocks: mapBlocksError,
239255
240161
  query: mapQueryError,
239256
- general: (operationId, error) => {
240162
+ general: (operationId, error, code7) => {
240163
+ const planEngineError = tryMapPlanEngineError(operationId, error, code7);
240164
+ if (planEngineError)
240165
+ return planEngineError;
239257
240166
  if (error instanceof CliError)
239258
240167
  return error;
239259
240168
  return new CliError("COMMAND_FAILED", extractErrorMessage(error), { operationId });
@@ -240140,6 +241049,18 @@ function normalizeFlatTargetFlags(operationId, apiInput) {
240140
241049
  }
240141
241050
  return apiInput;
240142
241051
  }
241052
+ if (operationId === "blocks.delete") {
241053
+ const nodeType = apiInput.nodeType;
241054
+ const nodeId = apiInput.nodeId;
241055
+ if (typeof nodeType === "string" && typeof nodeId === "string") {
241056
+ const { nodeType: _4, nodeId: _n, ...rest } = apiInput;
241057
+ return {
241058
+ ...rest,
241059
+ target: { kind: "block", nodeType, nodeId }
241060
+ };
241061
+ }
241062
+ return apiInput;
241063
+ }
240143
241064
  if (LIST_TARGET_OPERATIONS.has(operationId)) {
240144
241065
  const nodeId = apiInput.nodeId;
240145
241066
  if (typeof nodeId === "string") {
@@ -240927,6 +241848,7 @@ function buildHelpText() {
240927
241848
  "mutation",
240928
241849
  "format",
240929
241850
  "create",
241851
+ "blocks",
240930
241852
  "lists",
240931
241853
  "comments",
240932
241854
  "trackChanges",
@@ -241368,6 +242290,10 @@ var init_operation_params = __esm(() => {
241368
242290
  ...LIST_TARGET_FLAT_PARAMS
241369
242291
  ],
241370
242292
  "doc.lists.exit": [{ name: "input", kind: "jsonFlag", flag: "input-json", type: "json" }, ...LIST_TARGET_FLAT_PARAMS],
242293
+ "doc.blocks.delete": [
242294
+ { name: "nodeType", kind: "flag", flag: "node-type", type: "string" },
242295
+ { name: "nodeId", kind: "flag", flag: "node-id", type: "string" }
242296
+ ],
241371
242297
  "doc.create.paragraph": [{ name: "input", kind: "jsonFlag", flag: "input-json", type: "json" }],
241372
242298
  "doc.create.heading": [{ name: "input", kind: "jsonFlag", flag: "input-json", type: "json" }]
241373
242299
  };