@superdoc-dev/mcp 0.7.0-next.9 → 0.7.1-next.1

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 +166 -55
  2. package/package.json +4 -4
package/dist/index.js CHANGED
@@ -29420,7 +29420,7 @@ superdoc_search({select: {type: "text", pattern: "target phrase"}, require: "fir
29420
29420
  superdoc_comment({
29421
29421
  action: "create",
29422
29422
  text: "Please review this section.",
29423
- target: {kind: "text", blockId: "<blocks[0].blockId>", range: {start: <highlightRange.start>, end: <highlightRange.end>}}
29423
+ target: {kind: "text", blockId: "<items[0].blocks[0].blockId>", range: {start: <items[0].blocks[0].range.start>, end: <items[0].blocks[0].range.end>}}
29424
29424
  })
29425
29425
  \`\`\`
29426
29426
 
@@ -51891,7 +51891,7 @@ var init_remark_gfm_BhnWr3yf_es = __esm(() => {
51891
51891
  emptyOptions2 = {};
51892
51892
  });
51893
51893
 
51894
- // ../../packages/superdoc/dist/chunks/SuperConverter-UqLu6KQU.es.js
51894
+ // ../../packages/superdoc/dist/chunks/SuperConverter-opYK-HD4.es.js
51895
51895
  function getExtensionConfigField(extension$1, field, context = { name: "" }) {
51896
51896
  const fieldValue = extension$1.config[field];
51897
51897
  if (typeof fieldValue === "function")
@@ -72409,7 +72409,7 @@ function generateNewListDefinition(numbering, options) {
72409
72409
  }
72410
72410
  if (level != null && start != null && text$2 != null && fmt != null) {
72411
72411
  if (numbering.definitions[numId]) {
72412
- const abstractId = numbering.definitions[numId]?.elements[0]?.attributes["w:val"];
72412
+ const abstractId = numbering.definitions[numId]?.elements?.[0]?.attributes?.["w:val"];
72413
72413
  newAbstractId = abstractId;
72414
72414
  newAbstractDef = { ...numbering.abstracts[abstractId] };
72415
72415
  skipAddingNewAbstract = true;
@@ -105833,7 +105833,7 @@ var isRegExp = (value) => {
105833
105833
  if (id)
105834
105834
  return trackedChanges.filter(({ mark }) => mark.attrs.id === id);
105835
105835
  return trackedChanges;
105836
- }, DERIVED_ID_LENGTH = 24, groupedCache, SDT_NODE_NAMES, SDT_BLOCK_NAME = "structuredContentBlock", SDT_INLINE_NAME = "structuredContent", SDT_NODE_TYPES, VALID_CONTROL_TYPES, VALID_LOCK_MODES, VALID_APPEARANCES, FIELD_LIKE_SDT_TYPES, liveDocumentCountsCache, BIBLIOGRAPHY_NAMESPACE_URI = "http://schemas.openxmlformats.org/officeDocument/2006/bibliography", CUSTOM_XML_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml", CUSTOM_XML_PROPS_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps", DEFAULT_SELECTED_STYLE = "/APA.XSL", DEFAULT_STYLE_NAME = "APA", DEFAULT_VERSION = "6", API_TO_OOXML_SOURCE_TYPE, OOXML_TO_API_SOURCE_TYPE, SIMPLE_FIELD_TO_XML_TAG, XML_TAG_TO_SIMPLE_FIELD, import_lib2, FONT_FAMILY_FALLBACKS, DEFAULT_GENERIC_FALLBACK = "sans-serif", DEFAULT_FONT_SIZE_PT = 10, CURRENT_APP_VERSION = "1.34.0", collectRunDefaultProperties = (runProps, { allowOverrideTypeface = true, allowOverrideSize = true, themeResolver, state }) => {
105836
+ }, DERIVED_ID_LENGTH = 24, groupedCache, SDT_NODE_NAMES, SDT_BLOCK_NAME = "structuredContentBlock", SDT_INLINE_NAME = "structuredContent", SDT_NODE_TYPES, VALID_CONTROL_TYPES, VALID_LOCK_MODES, VALID_APPEARANCES, FIELD_LIKE_SDT_TYPES, liveDocumentCountsCache, BIBLIOGRAPHY_NAMESPACE_URI = "http://schemas.openxmlformats.org/officeDocument/2006/bibliography", CUSTOM_XML_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml", CUSTOM_XML_PROPS_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps", DEFAULT_SELECTED_STYLE = "/APA.XSL", DEFAULT_STYLE_NAME = "APA", DEFAULT_VERSION = "6", API_TO_OOXML_SOURCE_TYPE, OOXML_TO_API_SOURCE_TYPE, SIMPLE_FIELD_TO_XML_TAG, XML_TAG_TO_SIMPLE_FIELD, import_lib2, FONT_FAMILY_FALLBACKS, DEFAULT_GENERIC_FALLBACK = "sans-serif", DEFAULT_FONT_SIZE_PT = 10, CURRENT_APP_VERSION = "1.35.0", collectRunDefaultProperties = (runProps, { allowOverrideTypeface = true, allowOverrideSize = true, themeResolver, state }) => {
105837
105837
  if (!runProps?.elements?.length || !state)
105838
105838
  return;
105839
105839
  const fontsNode = runProps.elements.find((el) => el.name === "w:rFonts");
@@ -105867,7 +105867,7 @@ var isRegExp = (value) => {
105867
105867
  state.kern = kernNode.attributes["w:val"];
105868
105868
  }
105869
105869
  }, SuperConverter;
105870
- var init_SuperConverter_UqLu6KQU_es = __esm(() => {
105870
+ var init_SuperConverter_opYK_HD4_es = __esm(() => {
105871
105871
  init_rolldown_runtime_Bg48TavK_es();
105872
105872
  init_jszip_C49i9kUs_es();
105873
105873
  init_xml_js_CqGKpaft_es();
@@ -144047,7 +144047,7 @@ var init_SuperConverter_UqLu6KQU_es = __esm(() => {
144047
144047
  };
144048
144048
  });
144049
144049
 
144050
- // ../../packages/superdoc/dist/chunks/create-headless-toolbar-QcQvy-nD.es.js
144050
+ // ../../packages/superdoc/dist/chunks/create-headless-toolbar-xjqjtPWl.es.js
144051
144051
  function parseSizeUnit(val = "0") {
144052
144052
  const length = val.toString() || "0";
144053
144053
  const value = Number.parseFloat(length);
@@ -153241,6 +153241,10 @@ var CSS_DIMENSION_REGEX, DOM_SIZE_UNITS, Extension = class Extension2 {
153241
153241
  if (typeof checker !== "function")
153242
153242
  return false;
153243
153243
  return Boolean(checker(attrs));
153244
+ }, hasFormattingAttrs = (entry) => {
153245
+ return typeof entry.attrs === "object" && entry.attrs !== null;
153246
+ }, getFormattingAttr = (entries, name, attr) => {
153247
+ return entries.filter((entry) => entry.name === name && hasFormattingAttrs(entry)).map((entry) => entry.attrs[attr]).filter((value) => value != null);
153244
153248
  }, normalizeFontSizeValue = (value) => {
153245
153249
  if (typeof value === "number")
153246
153250
  return `${value}pt`;
@@ -153269,7 +153273,9 @@ var CSS_DIMENSION_REGEX, DOM_SIZE_UNITS, Extension = class Extension2 {
153269
153273
  return Boolean(linkedStyle?.definition?.styles && styleKey in linkedStyle.definition.styles);
153270
153274
  }, hasNegatedFormattingMark = (formatting, markName) => {
153271
153275
  const rawActiveMark = formatting.find((mark) => mark.name === markName);
153272
- return rawActiveMark ? isNegatedMark(rawActiveMark.name, rawActiveMark.attrs) : false;
153276
+ if (!rawActiveMark || !hasFormattingAttrs(rawActiveMark))
153277
+ return false;
153278
+ return isNegatedMark(rawActiveMark.name, rawActiveMark.attrs);
153273
153279
  }, isFormatCommandsStorage = (value) => {
153274
153280
  return typeof value === "object" && value !== null && "storedStyle" in value;
153275
153281
  }, hasStoredCopyFormat = (context) => {
@@ -153340,7 +153346,7 @@ var CSS_DIMENSION_REGEX, DOM_SIZE_UNITS, Extension = class Extension2 {
153340
153346
  disabled: true,
153341
153347
  value: null
153342
153348
  };
153343
- const normalizedValues = formatting.filter((mark) => mark.name === "fontSize").map((mark) => mark.attrs?.fontSize).filter((value$1) => value$1 != null).map((value$1) => normalizeFontSizeValue(value$1));
153349
+ const normalizedValues = getFormattingAttr(formatting, "fontSize", "fontSize").map((value$1) => normalizeFontSizeValue(value$1));
153344
153350
  const uniqueValues = [...new Set(normalizedValues)];
153345
153351
  const hasDirectValue = uniqueValues.length > 0;
153346
153352
  const canUseLinkedStyle = !hasDirectValue && isFormattingActivatedFromLinkedStyle(context, "font-size");
@@ -153362,7 +153368,7 @@ var CSS_DIMENSION_REGEX, DOM_SIZE_UNITS, Extension = class Extension2 {
153362
153368
  disabled: true,
153363
153369
  value: null
153364
153370
  };
153365
- const normalizedValues = formatting.filter((mark) => mark.name === "fontFamily").map((mark) => mark.attrs?.fontFamily).filter((value$1) => value$1 != null).map((value$1) => normalizeFontFamilyValue(value$1));
153371
+ const normalizedValues = getFormattingAttr(formatting, "fontFamily", "fontFamily").map((value$1) => normalizeFontFamilyValue(value$1));
153366
153372
  const uniqueValues = [...new Set(normalizedValues)];
153367
153373
  const canUseLinkedStyle = !(uniqueValues.length > 0) && isFormattingActivatedFromLinkedStyle(context, "font-family");
153368
153374
  const paragraphProps = canUseLinkedStyle ? getCurrentResolvedParagraphProperties(context) : null;
@@ -153383,7 +153389,7 @@ var CSS_DIMENSION_REGEX, DOM_SIZE_UNITS, Extension = class Extension2 {
153383
153389
  disabled: true,
153384
153390
  value: null
153385
153391
  };
153386
- const values = formatting.filter((mark) => mark.name === "color").map((mark) => mark.attrs?.color).filter((value$1) => value$1 != null);
153392
+ const values = getFormattingAttr(formatting, "color", "color");
153387
153393
  const markNegated = hasNegatedFormattingMark(formatting, "color");
153388
153394
  const normalizedValues = values.map((value$1) => normalizeColorValue(value$1));
153389
153395
  const uniqueValues = [...new Set(normalizedValues)];
@@ -153402,7 +153408,7 @@ var CSS_DIMENSION_REGEX, DOM_SIZE_UNITS, Extension = class Extension2 {
153402
153408
  disabled: true,
153403
153409
  value: null
153404
153410
  };
153405
- const values = formatting.filter((mark) => mark.name === "highlight").map((mark) => mark.attrs?.color).filter((value$1) => value$1 != null);
153411
+ const values = getFormattingAttr(formatting, "highlight", "color");
153406
153412
  const markNegated = hasNegatedFormattingMark(formatting, "highlight");
153407
153413
  const normalizedValues = values.map((value$1) => normalizeColorValue(value$1));
153408
153414
  const uniqueValues = [...new Set(normalizedValues)];
@@ -153421,7 +153427,7 @@ var CSS_DIMENSION_REGEX, DOM_SIZE_UNITS, Extension = class Extension2 {
153421
153427
  disabled: true,
153422
153428
  value: null
153423
153429
  };
153424
- const normalizedValues = formatting.filter((mark) => mark.name === "link").map((mark) => mark.attrs?.href).filter((value$1) => value$1 != null).map((value$1) => normalizeLinkHrefValue(value$1));
153430
+ const normalizedValues = getFormattingAttr(formatting, "link", "href").map((value$1) => normalizeLinkHrefValue(value$1));
153425
153431
  const uniqueValues = [...new Set(normalizedValues)];
153426
153432
  const value = uniqueValues.length === 1 ? uniqueValues[0] : null;
153427
153433
  return {
@@ -154064,8 +154070,8 @@ var CSS_DIMENSION_REGEX, DOM_SIZE_UNITS, Extension = class Extension2 {
154064
154070
  }
154065
154071
  };
154066
154072
  };
154067
- var init_create_headless_toolbar_QcQvy_nD_es = __esm(() => {
154068
- init_SuperConverter_UqLu6KQU_es();
154073
+ var init_create_headless_toolbar_xjqjtPWl_es = __esm(() => {
154074
+ init_SuperConverter_opYK_HD4_es();
154069
154075
  init_uuid_qzgm05fK_es();
154070
154076
  init_constants_DrU4EASo_es();
154071
154077
  init_dist_B8HfvhaK_es();
@@ -208791,7 +208797,7 @@ var init_remark_gfm_eZN6yzWQ_es = __esm(() => {
208791
208797
  init_remark_gfm_BhnWr3yf_es();
208792
208798
  });
208793
208799
 
208794
- // ../../packages/superdoc/dist/chunks/src-DXlYP0an.es.js
208800
+ // ../../packages/superdoc/dist/chunks/src-BI5eBQvD.es.js
208795
208801
  function deleteProps(obj, propOrProps) {
208796
208802
  const props = typeof propOrProps === "string" ? [propOrProps] : propOrProps;
208797
208803
  const removeNested = (target, pathParts, index2 = 0) => {
@@ -209574,7 +209580,7 @@ function prosemirrorToYXmlFragment(doc$12, xmlFragment) {
209574
209580
  }
209575
209581
  function getSuperdocVersion() {
209576
209582
  try {
209577
- return "1.34.0";
209583
+ return "1.35.0";
209578
209584
  } catch {
209579
209585
  return "unknown";
209580
209586
  }
@@ -225149,6 +225155,15 @@ function listCommentAnchorsSafe(editor) {
225149
225155
  return [];
225150
225156
  }
225151
225157
  }
225158
+ function emitCommentLifecycleUpdate(editor, type, comment2) {
225159
+ const emitter = editor.emit;
225160
+ if (typeof emitter !== "function")
225161
+ return;
225162
+ emitter.call(editor, "commentsUpdate", {
225163
+ type,
225164
+ comment: comment2
225165
+ });
225166
+ }
225152
225167
  function applyTextSelection(editor, from$1, to) {
225153
225168
  const setTextSelection$1 = editor.commands?.setTextSelection;
225154
225169
  if (typeof setTextSelection$1 === "function") {
@@ -225637,17 +225652,20 @@ function resolveCommentHandler(editor, input2, options) {
225637
225652
  message: "Comment is already resolved."
225638
225653
  }
225639
225654
  };
225655
+ let resolvedTimestamp = null;
225640
225656
  if (executeDomainCommand(editor, () => {
225641
225657
  const didResolve = resolveComment({
225642
225658
  commentId: identity.commentId,
225643
225659
  importedId: identity.importedId
225644
225660
  });
225645
- if (didResolve)
225661
+ if (didResolve) {
225662
+ resolvedTimestamp = Date.now();
225646
225663
  upsertCommentEntity(store, identity.commentId, {
225647
225664
  importedId: identity.importedId,
225648
225665
  isDone: true,
225649
- resolvedTime: Date.now()
225666
+ resolvedTime: resolvedTimestamp
225650
225667
  });
225668
+ }
225651
225669
  return Boolean(didResolve);
225652
225670
  }, { expectedRevision: options?.expectedRevision }).steps[0]?.effect !== "changed")
225653
225671
  return {
@@ -225657,6 +225675,12 @@ function resolveCommentHandler(editor, input2, options) {
225657
225675
  message: "Comment resolve produced no change."
225658
225676
  }
225659
225677
  };
225678
+ emitCommentLifecycleUpdate(editor, "resolved", {
225679
+ commentId: identity.commentId,
225680
+ importedId: identity.importedId,
225681
+ isDone: true,
225682
+ resolvedTime: resolvedTimestamp
225683
+ });
225660
225684
  return {
225661
225685
  success: true,
225662
225686
  updated: [toCommentAddress(identity.commentId)]
@@ -225701,6 +225725,12 @@ function reopenCommentHandler(editor, input2, options) {
225701
225725
  message: "Comment reopen produced no change."
225702
225726
  }
225703
225727
  };
225728
+ emitCommentLifecycleUpdate(editor, "update", {
225729
+ commentId: identity.commentId,
225730
+ importedId: identity.importedId,
225731
+ isDone: false,
225732
+ resolvedTime: null
225733
+ });
225704
225734
  return {
225705
225735
  success: true,
225706
225736
  updated: [toCommentAddress(identity.commentId)]
@@ -225735,6 +225765,11 @@ function removeCommentHandler(editor, input2, options) {
225735
225765
  }
225736
225766
  if (!removedIds.size && didRemove)
225737
225767
  removedIds.add(identity.commentId);
225768
+ for (const removedId of removedIds)
225769
+ emitCommentLifecycleUpdate(editor, "deleted", {
225770
+ commentId: removedId,
225771
+ importedId: removedId === identity.commentId ? identity.importedId : undefined
225772
+ });
225738
225773
  return {
225739
225774
  success: true,
225740
225775
  removed: Array.from(removedIds).map((id2) => toCommentAddress(id2))
@@ -235482,15 +235517,16 @@ function getPayloadVersionForCoverage(coverage) {
235482
235517
  return coverage.headerFooters ? PAYLOAD_VERSION_V2 : PAYLOAD_VERSION_V1;
235483
235518
  }
235484
235519
  function createDiffAdapter(editor) {
235520
+ const diffEditor = editor;
235485
235521
  return {
235486
235522
  capture() {
235487
- return wrapServiceCall(() => captureSnapshot(editor));
235523
+ return wrapServiceCall(() => captureSnapshot(diffEditor));
235488
235524
  },
235489
235525
  compare(input2) {
235490
- return wrapServiceCall(() => compareToSnapshot(editor, input2.targetSnapshot));
235526
+ return wrapServiceCall(() => compareToSnapshot(diffEditor, input2.targetSnapshot));
235491
235527
  },
235492
235528
  apply(input2, options) {
235493
- const { result, tr } = wrapServiceCall(() => applyDiffPayload(editor, input2.diff, options));
235529
+ const { result, tr } = wrapServiceCall(() => applyDiffPayload(diffEditor, input2.diff, options));
235494
235530
  if (tr.docChanged || result.appliedOperations > 0)
235495
235531
  editor.dispatch(tr);
235496
235532
  editor.emit("commentsUpdate", { type: "replayCompleted" });
@@ -280183,7 +280219,7 @@ var Node$13 = class Node$14 {
280183
280219
  domAvailabilityCache = false;
280184
280220
  return false;
280185
280221
  }
280186
- }, summaryVersion = "1.34.0", nodeKeys, markKeys, transformListsInCopiedContent = (html3) => {
280222
+ }, summaryVersion = "1.35.0", nodeKeys, markKeys, transformListsInCopiedContent = (html3) => {
280187
280223
  const container = document.createElement("div");
280188
280224
  container.innerHTML = html3;
280189
280225
  const result = [];
@@ -281358,7 +281394,7 @@ var Node$13 = class Node$14 {
281358
281394
  return () => {};
281359
281395
  const handle3 = setInterval(callback, intervalMs);
281360
281396
  return () => clearInterval(handle3);
281361
- }, HISTORY_UNSAFE_OPS, CANONICAL_COMMENT_IGNORED_KEYS, INITIAL_HASH, ROUND_CONSTANTS, V1_COVERAGE, V2_COVERAGE, SNAPSHOT_VERSION_V2 = "sd-diff-snapshot/v2", PAYLOAD_VERSION_V1 = "sd-diff-payload/v1", PAYLOAD_VERSION_V2 = "sd-diff-payload/v2", ENGINE_ID = "super-editor", STAGED_CONVERTER_KEYS, DiffServiceError, TC_LEVEL_MIN = 1, TC_LEVEL_MAX = 9, ALLOWED_WRAP_ATTRS, WRAP_TYPES_SUPPORTING_SIDE, WRAP_TYPES_SUPPORTING_DISTANCES, RELATIVE_HEIGHT_MIN = 0, RELATIVE_HEIGHT_MAX = 4294967295, FORBIDDEN_RAW_PATCH_NAMES, CONTROL_TYPE_SDT_PR_ELEMENTS, DEFAULT_CHECKBOX_SYMBOL_FONT2 = "MS Gothic", DEFAULT_CHECKBOX_CHECKED_HEX2 = "2612", DEFAULT_CHECKBOX_UNCHECKED_HEX2 = "2610", VARIANT_ORDER, KIND_ORDER, HEADER_RELATIONSHIP_TYPE3 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", FOOTER_RELATIONSHIP_TYPE3 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", DOCUMENT_RELS_PATH2 = "word/_rels/document.xml.rels", HEADER_FILE_PATTERN2, FOOTER_FILE_PATTERN2, SPECIAL_NOTE_TYPES, BOOKMARK_SCAN_REVISION_PREFIX = "bookmark-scan:", import_lib4, CUSTOM_XML_DATA_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml", CUSTOM_XML_PROPS_RELATIONSHIP_TYPE2 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps", CUSTOM_XML_DATASTORE_NAMESPACE = "http://schemas.openxmlformats.org/officeDocument/2006/customXml", SETTINGS_PART, RESTART_POLICY_TO_OOXML, VALID_DISPLAYS, REFERENCE_BLOCK_PREFIX, CAPTION_STYLE_NAMES, CAPTION_PARAGRAPH_STYLE_ID = "Caption", CAPTION_FORMAT_TO_OOXML, DOCUMENT_STAT_FIELD_TYPES, TOA_LEADER_REVERSE_MAP, EDGE_NODE_TYPES, CONTENT_TYPES_PART_ID = "[Content_Types].xml", CONTENT_TYPES_NS = "http://schemas.openxmlformats.org/package/2006/content-types", contentTypesPartDescriptor, empty_exports, init_empty, CURRENT_APP_VERSION2 = "1.34.0", PIXELS_PER_INCH2 = 96, MAX_HEIGHT_BUFFER_PX = 50, MAX_WIDTH_BUFFER_PX = 20, cloneExtensionInstance = (extension2) => {
281397
+ }, HISTORY_UNSAFE_OPS, CANONICAL_COMMENT_IGNORED_KEYS, INITIAL_HASH, ROUND_CONSTANTS, V1_COVERAGE, V2_COVERAGE, SNAPSHOT_VERSION_V2 = "sd-diff-snapshot/v2", PAYLOAD_VERSION_V1 = "sd-diff-payload/v1", PAYLOAD_VERSION_V2 = "sd-diff-payload/v2", ENGINE_ID = "super-editor", STAGED_CONVERTER_KEYS, DiffServiceError, TC_LEVEL_MIN = 1, TC_LEVEL_MAX = 9, ALLOWED_WRAP_ATTRS, WRAP_TYPES_SUPPORTING_SIDE, WRAP_TYPES_SUPPORTING_DISTANCES, RELATIVE_HEIGHT_MIN = 0, RELATIVE_HEIGHT_MAX = 4294967295, FORBIDDEN_RAW_PATCH_NAMES, CONTROL_TYPE_SDT_PR_ELEMENTS, DEFAULT_CHECKBOX_SYMBOL_FONT2 = "MS Gothic", DEFAULT_CHECKBOX_CHECKED_HEX2 = "2612", DEFAULT_CHECKBOX_UNCHECKED_HEX2 = "2610", VARIANT_ORDER, KIND_ORDER, HEADER_RELATIONSHIP_TYPE3 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", FOOTER_RELATIONSHIP_TYPE3 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", DOCUMENT_RELS_PATH2 = "word/_rels/document.xml.rels", HEADER_FILE_PATTERN2, FOOTER_FILE_PATTERN2, SPECIAL_NOTE_TYPES, BOOKMARK_SCAN_REVISION_PREFIX = "bookmark-scan:", import_lib4, CUSTOM_XML_DATA_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml", CUSTOM_XML_PROPS_RELATIONSHIP_TYPE2 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps", CUSTOM_XML_DATASTORE_NAMESPACE = "http://schemas.openxmlformats.org/officeDocument/2006/customXml", SETTINGS_PART, RESTART_POLICY_TO_OOXML, VALID_DISPLAYS, REFERENCE_BLOCK_PREFIX, CAPTION_STYLE_NAMES, CAPTION_PARAGRAPH_STYLE_ID = "Caption", CAPTION_FORMAT_TO_OOXML, DOCUMENT_STAT_FIELD_TYPES, TOA_LEADER_REVERSE_MAP, EDGE_NODE_TYPES, CONTENT_TYPES_PART_ID = "[Content_Types].xml", CONTENT_TYPES_NS = "http://schemas.openxmlformats.org/package/2006/content-types", contentTypesPartDescriptor, empty_exports, init_empty, CURRENT_APP_VERSION2 = "1.35.0", PIXELS_PER_INCH2 = 96, MAX_HEIGHT_BUFFER_PX = 50, MAX_WIDTH_BUFFER_PX = 20, cloneExtensionInstance = (extension2) => {
281362
281398
  const extensionLike = extension2;
281363
281399
  const config3 = extensionLike?.config;
281364
281400
  const ExtensionCtor = extensionLike?.constructor;
@@ -297180,13 +297216,13 @@ menclose::after {
297180
297216
  return;
297181
297217
  console.log(...args$1);
297182
297218
  }, HEADER_FOOTER_INIT_BUDGET_MS = 200, MAX_ZOOM_WARNING_THRESHOLD = 10, MAX_SELECTION_RECTS_PER_USER = 100, SEMANTIC_RESIZE_DEBOUNCE_MS = 120, MIN_SEMANTIC_CONTENT_WIDTH_PX = 1, GLOBAL_PERFORMANCE, PresentationEditor, ICONS, TEXTS, tableActionsOptions;
297183
- var init_src_DXlYP0an_es = __esm(() => {
297219
+ var init_src_BI5eBQvD_es = __esm(() => {
297184
297220
  init_rolldown_runtime_Bg48TavK_es();
297185
- init_SuperConverter_UqLu6KQU_es();
297221
+ init_SuperConverter_opYK_HD4_es();
297186
297222
  init_jszip_C49i9kUs_es();
297187
297223
  init_xml_js_CqGKpaft_es();
297188
297224
  init_uuid_qzgm05fK_es();
297189
- init_create_headless_toolbar_QcQvy_nD_es();
297225
+ init_create_headless_toolbar_xjqjtPWl_es();
297190
297226
  init_constants_DrU4EASo_es();
297191
297227
  init_dist_B8HfvhaK_es();
297192
297228
  init_unified_Dsuw2be5_es();
@@ -308551,20 +308587,31 @@ ${err.toString()}`);
308551
308587
  tr = tr.removeMark(from$1, to, linkMarkType);
308552
308588
  if (underlineMarkType) {
308553
308589
  const rangesMissingUnderline = [];
308590
+ const negationMarksToRemove = [];
308554
308591
  tr.doc.nodesBetween(from$1, to, (node2, pos) => {
308555
308592
  if (!node2.isText || node2.nodeSize <= 0)
308556
308593
  return;
308557
- if (node2.marks.some((mark2) => mark2.type === underlineMarkType))
308594
+ const existing = node2.marks.find((mark2) => mark2.type === underlineMarkType);
308595
+ if (existing && existing.attrs?.underlineType !== "none")
308558
308596
  return;
308559
308597
  const rangeFrom = Math.max(pos, from$1);
308560
308598
  const rangeTo = Math.min(pos + node2.nodeSize, to);
308561
308599
  if (rangeFrom >= rangeTo)
308562
308600
  return;
308601
+ if (existing && existing.attrs?.underlineType === "none")
308602
+ negationMarksToRemove.push({
308603
+ from: rangeFrom,
308604
+ to: rangeTo,
308605
+ mark: existing
308606
+ });
308563
308607
  rangesMissingUnderline.push({
308564
308608
  from: rangeFrom,
308565
308609
  to: rangeTo
308566
308610
  });
308567
308611
  });
308612
+ negationMarksToRemove.forEach((range) => {
308613
+ tr = tr.removeMark(range.from, range.to, range.mark);
308614
+ });
308568
308615
  rangesMissingUnderline.forEach((range) => {
308569
308616
  tr = tr.addMark(range.from, range.to, underlineMarkType.create({ autoAdded: true }));
308570
308617
  });
@@ -308595,13 +308642,35 @@ ${err.toString()}`);
308595
308642
  const underlineMarkType = editor.schema.marks.underline;
308596
308643
  let { from: from$1, to } = selection;
308597
308644
  if (selection.empty && linkMarkType) {
308598
- const range = getMarkRange(selection.$from, linkMarkType);
308599
- if (range) {
308600
- from$1 = range.from;
308601
- to = range.to;
308645
+ const initialRange = getMarkRange(selection.$from, linkMarkType);
308646
+ if (initialRange) {
308647
+ from$1 = initialRange.from;
308648
+ to = initialRange.to;
308649
+ } else {
308650
+ const doc$12 = state.doc;
308651
+ const docSize = doc$12.content.size;
308652
+ const probePositions = [
308653
+ selection.from - 1,
308654
+ selection.from,
308655
+ selection.from + 1
308656
+ ].filter((pos) => pos >= 0 && pos <= docSize);
308657
+ for (const pos of probePositions) {
308658
+ const range = getMarkRange(doc$12.resolve(pos), linkMarkType);
308659
+ if (range) {
308660
+ from$1 = range.from;
308661
+ to = range.to;
308662
+ break;
308663
+ }
308664
+ }
308602
308665
  }
308603
308666
  }
308604
- return chain().unsetColor().unsetMark("link", { extendEmptyMarkRange: true }).command(({ tr }) => {
308667
+ const commandChain = chain();
308668
+ if (selection.empty && linkMarkType && from$1 !== to)
308669
+ commandChain.command(({ tr }) => {
308670
+ tr.setSelection(TextSelection.create(tr.doc, from$1, to));
308671
+ return true;
308672
+ });
308673
+ return commandChain.unsetColor().unsetMark("link", { extendEmptyMarkRange: true }).command(({ tr }) => {
308605
308674
  if (underlineMarkType)
308606
308675
  tr.doc.nodesBetween(from$1, to, (node2, pos) => {
308607
308676
  if (!node2.isText)
@@ -308653,6 +308722,23 @@ ${err.toString()}`);
308653
308722
  }
308654
308723
  }, node2.marks);
308655
308724
  });
308725
+ if (linkMarkType) {
308726
+ const runNodeMarkRemovals = [];
308727
+ tr.doc.nodesBetween(from$1, to, (node2, pos) => {
308728
+ if (node2.type.name !== "run")
308729
+ return;
308730
+ if (!node2.marks.some((mark2) => mark2.type === linkMarkType))
308731
+ return;
308732
+ runNodeMarkRemovals.push(pos);
308733
+ });
308734
+ runNodeMarkRemovals.reverse().forEach((pos) => {
308735
+ const mappedPos = tr.mapping.map(pos);
308736
+ const runNode = tr.doc.nodeAt(mappedPos);
308737
+ if (!runNode)
308738
+ return;
308739
+ tr.setNodeMarkup(mappedPos, runNode.type, runNode.attrs, runNode.marks.filter((mark2) => mark2.type !== linkMarkType));
308740
+ });
308741
+ }
308656
308742
  return true;
308657
308743
  }).run();
308658
308744
  },
@@ -319075,6 +319161,7 @@ function print() { __p += __j.call(arguments, '') }
319075
319161
  role = "editor";
319076
319162
  superdoc;
319077
319163
  toolbarContainer = null;
319164
+ toolbar = null;
319078
319165
  constructor(config3) {
319079
319166
  super();
319080
319167
  this.config = {
@@ -321337,7 +321424,7 @@ function print() { __p += __j.call(arguments, '') }
321337
321424
  if (!this.#telemetry || this.#documentOpenTracked)
321338
321425
  return;
321339
321426
  try {
321340
- const documentCreatedAt = this.converter?.getDocumentCreatedTimestamp?.() || null;
321427
+ const documentCreatedAt = this.converter?.getDocumentCreatedTimestamp?.() ?? null;
321341
321428
  this.#telemetry.trackDocumentOpen(documentId, documentCreatedAt);
321342
321429
  this.#documentOpenTracked = true;
321343
321430
  } catch {}
@@ -334908,11 +334995,11 @@ function print() { __p += __j.call(arguments, '') }
334908
334995
  ];
334909
334996
  });
334910
334997
 
334911
- // ../../packages/superdoc/dist/chunks/create-super-doc-ui-BuJIur0F.es.js
334998
+ // ../../packages/superdoc/dist/chunks/create-super-doc-ui-DqYtj3Jy.es.js
334912
334999
  var MOD_ALIASES, ALT_ALIASES, CTRL_ALIASES, SHIFT_ALIASES, BUILTIN_CONTEXT_MENU_GROUPS, BUILTIN_GROUP_ORDER, RESERVED_PROXY_PROPERTY_NAMES, ALL_TOOLBAR_COMMAND_IDS, EMPTY_ACTIVE_IDS;
334913
- var init_create_super_doc_ui_BuJIur0F_es = __esm(() => {
334914
- init_SuperConverter_UqLu6KQU_es();
334915
- init_create_headless_toolbar_QcQvy_nD_es();
335000
+ var init_create_super_doc_ui_DqYtj3Jy_es = __esm(() => {
335001
+ init_SuperConverter_opYK_HD4_es();
335002
+ init_create_headless_toolbar_xjqjtPWl_es();
334916
335003
  MOD_ALIASES = new Set([
334917
335004
  "Mod",
334918
335005
  "Meta",
@@ -334954,16 +335041,16 @@ var init_zipper_yaJVJ4z9_es = __esm(() => {
334954
335041
 
334955
335042
  // ../../packages/superdoc/dist/super-editor.es.js
334956
335043
  var init_super_editor_es = __esm(() => {
334957
- init_src_DXlYP0an_es();
334958
- init_SuperConverter_UqLu6KQU_es();
335044
+ init_src_BI5eBQvD_es();
335045
+ init_SuperConverter_opYK_HD4_es();
334959
335046
  init_jszip_C49i9kUs_es();
334960
335047
  init_xml_js_CqGKpaft_es();
334961
- init_create_headless_toolbar_QcQvy_nD_es();
335048
+ init_create_headless_toolbar_xjqjtPWl_es();
334962
335049
  init_constants_DrU4EASo_es();
334963
335050
  init_dist_B8HfvhaK_es();
334964
335051
  init_unified_Dsuw2be5_es();
334965
335052
  init_DocxZipper_CZMPWpOp_es();
334966
- init_create_super_doc_ui_BuJIur0F_es();
335053
+ init_create_super_doc_ui_DqYtj3Jy_es();
334967
335054
  init_ui_C5PAS9hY_es();
334968
335055
  init_eventemitter3_BnGqBE_Q_es();
334969
335056
  init_errors_CNaD6vcg_es();
@@ -336682,7 +336769,7 @@ More content with **bold** and *italic*.`
336682
336769
  },
336683
336770
  comment: {
336684
336771
  toolName: "superdoc_comment",
336685
- description: "Manage document comment threads: create, read, update, and delete. " + 'To create a comment, first use superdoc_search to find the target text, then pass action "create" with the comment text and a target: {kind:"text", blockId:"<blockId>", range:{start:<N>, end:<N>}} using the blockId and highlightRange from the search result. ' + 'For threaded replies, pass "parentId" with the parent comment ID. ' + 'Action "list" returns all comments with optional pagination (limit, offset) and filtering (includeResolved:true to include resolved). ' + 'Action "get" retrieves a single comment by ID. Action "update" changes status to "resolved" or marks as internal. Action "delete" removes a comment or reply by ID. ' + 'Do NOT pass "ref", "id", or "parentId" when creating a new top-level comment; only "action", "text", and "target" are needed.',
336772
+ description: "Manage document comment threads: create, read, update, and delete. " + 'To create a comment, first use superdoc_search to find the target text, then pass action "create" with the comment text and a target built from items[0].blocks. For a single-block match use {kind:"text", blockId: items[0].blocks[0].blockId, range: items[0].blocks[0].range}. For a cross-block match use {kind:"text", segments: items[0].blocks.map(b => ({blockId: b.blockId, range: b.range}))}. Do NOT use items[0].highlightRange (snippet-relative, not block-relative) or items[0].target (a SelectionTarget, not accepted by comments.create). ' + 'For threaded replies, pass "parentId" with the parent comment ID. ' + 'Action "list" returns all comments with optional pagination (limit, offset) and filtering (includeResolved:true to include resolved). ' + 'Action "get" retrieves a single comment by ID. Action "update" changes status to "resolved" or marks as internal. Action "delete" removes a comment or reply by ID. ' + 'Do NOT pass "ref", "id", or "parentId" when creating a new top-level comment; only "action", "text", and "target" are needed.',
336686
336773
  inputExamples: [
336687
336774
  {
336688
336775
  action: "create",
@@ -418153,7 +418240,10 @@ class CommandService3 {
418153
418240
  can: () => this.createCan(tr),
418154
418241
  get commands() {
418155
418242
  return Object.fromEntries(Object.entries(rawCommands).map(([name, command2]) => {
418156
- return [name, (...args3) => command2(...args3)(props)];
418243
+ return [
418244
+ name,
418245
+ (...args3) => command2(...args3)(props)
418246
+ ];
418157
418247
  }));
418158
418248
  }
418159
418249
  };
@@ -435641,7 +435731,7 @@ function generateNewListDefinition2(numbering, options) {
435641
435731
  }
435642
435732
  if (level != null && start2 != null && text9 != null && fmt != null) {
435643
435733
  if (numbering.definitions[numId]) {
435644
- const abstractId = numbering.definitions[numId]?.elements[0]?.attributes["w:val"];
435734
+ const abstractId = numbering.definitions[numId]?.elements?.[0]?.attributes?.["w:val"];
435645
435735
  newAbstractId = abstractId;
435646
435736
  const abstract = numbering.abstracts[abstractId];
435647
435737
  newAbstractDef = { ...abstract };
@@ -442720,6 +442810,12 @@ function listCommentAnchorsSafe2(editor) {
442720
442810
  return [];
442721
442811
  }
442722
442812
  }
442813
+ function emitCommentLifecycleUpdate2(editor, type, comment2) {
442814
+ const emitter = editor.emit;
442815
+ if (typeof emitter !== "function")
442816
+ return;
442817
+ emitter.call(editor, "commentsUpdate", { type, comment: comment2 });
442818
+ }
442723
442819
  function applyTextSelection2(editor, from4, to) {
442724
442820
  const setTextSelection2 = editor.commands?.setTextSelection;
442725
442821
  if (typeof setTextSelection2 === "function") {
@@ -443173,16 +443269,18 @@ function resolveCommentHandler2(editor, input2, options) {
443173
443269
  failure: { code: "NO_OP", message: "Comment is already resolved." }
443174
443270
  };
443175
443271
  }
443272
+ let resolvedTimestamp = null;
443176
443273
  const receipt2 = executeDomainCommand2(editor, () => {
443177
443274
  const didResolve = resolveComment({
443178
443275
  commentId: identity.commentId,
443179
443276
  importedId: identity.importedId
443180
443277
  });
443181
443278
  if (didResolve) {
443279
+ resolvedTimestamp = Date.now();
443182
443280
  upsertCommentEntity2(store, identity.commentId, {
443183
443281
  importedId: identity.importedId,
443184
443282
  isDone: true,
443185
- resolvedTime: Date.now()
443283
+ resolvedTime: resolvedTimestamp
443186
443284
  });
443187
443285
  }
443188
443286
  return Boolean(didResolve);
@@ -443193,6 +443291,12 @@ function resolveCommentHandler2(editor, input2, options) {
443193
443291
  failure: { code: "NO_OP", message: "Comment resolve produced no change." }
443194
443292
  };
443195
443293
  }
443294
+ emitCommentLifecycleUpdate2(editor, "resolved", {
443295
+ commentId: identity.commentId,
443296
+ importedId: identity.importedId,
443297
+ isDone: true,
443298
+ resolvedTime: resolvedTimestamp
443299
+ });
443196
443300
  return { success: true, updated: [toCommentAddress2(identity.commentId)] };
443197
443301
  }
443198
443302
  function reopenCommentHandler2(editor, input2, options) {
@@ -443232,6 +443336,12 @@ function reopenCommentHandler2(editor, input2, options) {
443232
443336
  failure: { code: "NO_OP", message: "Comment reopen produced no change." }
443233
443337
  };
443234
443338
  }
443339
+ emitCommentLifecycleUpdate2(editor, "update", {
443340
+ commentId: identity.commentId,
443341
+ importedId: identity.importedId,
443342
+ isDone: false,
443343
+ resolvedTime: null
443344
+ });
443235
443345
  return { success: true, updated: [toCommentAddress2(identity.commentId)] };
443236
443346
  }
443237
443347
  function removeCommentHandler2(editor, input2, options) {
@@ -443261,6 +443371,12 @@ function removeCommentHandler2(editor, input2, options) {
443261
443371
  if (!removedIds.size && didRemove) {
443262
443372
  removedIds.add(identity.commentId);
443263
443373
  }
443374
+ for (const removedId of removedIds) {
443375
+ emitCommentLifecycleUpdate2(editor, "deleted", {
443376
+ commentId: removedId,
443377
+ importedId: removedId === identity.commentId ? identity.importedId : undefined
443378
+ });
443379
+ }
443264
443380
  return {
443265
443381
  success: true,
443266
443382
  removed: Array.from(removedIds).map((id2) => toCommentAddress2(id2))
@@ -458789,15 +458905,16 @@ var init_service = __esm(() => {
458789
458905
 
458790
458906
  // ../../packages/super-editor/src/editors/v1/document-api-adapters/diff-adapter.ts
458791
458907
  function createDiffAdapter2(editor) {
458908
+ const diffEditor = editor;
458792
458909
  return {
458793
458910
  capture() {
458794
- return wrapServiceCall2(() => captureSnapshot2(editor));
458911
+ return wrapServiceCall2(() => captureSnapshot2(diffEditor));
458795
458912
  },
458796
458913
  compare(input2) {
458797
- return wrapServiceCall2(() => compareToSnapshot2(editor, input2.targetSnapshot));
458914
+ return wrapServiceCall2(() => compareToSnapshot2(diffEditor, input2.targetSnapshot));
458798
458915
  },
458799
458916
  apply(input2, options) {
458800
- const { result, tr } = wrapServiceCall2(() => applyDiffPayload2(editor, input2.diff, options));
458917
+ const { result, tr } = wrapServiceCall2(() => applyDiffPayload2(diffEditor, input2.diff, options));
458801
458918
  if (tr.docChanged || result.appliedOperations > 0) {
458802
458919
  editor.dispatch(tr);
458803
458920
  }
@@ -471783,13 +471900,7 @@ EXAMPLES:
471783
471900
  },
471784
471901
  {
471785
471902
  toolName: "superdoc_comment",
471786
- description: `Manage document comment threads: create, read, update, and delete. To create a comment, first use superdoc_search to find the target text, then pass action "create" with the comment text and a target: {kind:"text", blockId:"<blockId>", range:{start:<N>, end:<N>}} using the blockId and highlightRange from the search result. For threaded replies, pass "parentId" with the parent comment ID. Action "list" returns all comments with optional pagination (limit, offset) and filtering (includeResolved:true to include resolved). Action "get" retrieves a single comment by ID. Action "update" changes status to "resolved" or marks as internal. Action "delete" removes a comment or reply by ID. Do NOT pass "ref", "id", or "parentId" when creating a new top-level comment; only "action", "text", and "target" are needed.
471787
-
471788
- EXAMPLES:
471789
- 1. {"action":"create","text":"Please review this section.","target":{"kind":"text","blockId":"<blockId>","range":{"start":5,"end":25}}}
471790
- 2. {"action":"list","limit":20,"offset":0}
471791
- 3. {"action":"update","id":"<commentId>","status":"resolved"}
471792
- 4. {"action":"delete","id":"<commentId>"}`,
471903
+ description: 'Manage document comment threads: create, read, update, and delete. To create a comment, first use superdoc_search to find the target text, then pass action "create" with the comment text and a target built from items[0].blocks. For a single-block match use {kind:"text", blockId: items[0].blocks[0].blockId, range: items[0].blocks[0].range}. For a cross-block match use {kind:"text", segments: items[0].blocks.map(b => ({blockId: b.blockId, range: b.range}))}. Do NOT use items[0].highlightRange (snippet-relative, not block-relative) or items[0].target (a SelectionTarget, not accepted by comments.create). For threaded replies, pass "parentId" with the parent comment ID. Action "list" returns all comments with optional pagination (limit, offset) and filtering (includeResolved:true to include resolved). Action "get" retrieves a single comment by ID. Action "update" changes status to "resolved" or marks as internal. Action "delete" removes a comment or reply by ID. Do NOT pass "ref", "id", or "parentId" when creating a new top-level comment; only "action", "text", and "target" are needed.\n\nEXAMPLES:\n 1. {"action":"create","text":"Please review this section.","target":{"kind":"text","blockId":"<blockId>","range":{"start":5,"end":25}}}\n 2. {"action":"list","limit":20,"offset":0}\n 3. {"action":"update","id":"<commentId>","status":"resolved"}\n 4. {"action":"delete","id":"<commentId>"}',
471793
471904
  inputSchema: {
471794
471905
  type: "object",
471795
471906
  properties: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@superdoc-dev/mcp",
3
- "version": "0.7.0-next.9",
3
+ "version": "0.7.1-next.1",
4
4
  "type": "module",
5
5
  "engines": {
6
6
  "node": ">=20"
@@ -19,9 +19,9 @@
19
19
  "@types/bun": "^1.3.8",
20
20
  "@types/node": "22.19.2",
21
21
  "typescript": "^5.9.2",
22
- "@superdoc/super-editor": "0.0.1",
23
- "superdoc": "1.34.0",
24
- "@superdoc/document-api": "0.0.1"
22
+ "@superdoc/document-api": "0.0.1",
23
+ "superdoc": "1.35.0",
24
+ "@superdoc/super-editor": "0.0.1"
25
25
  },
26
26
  "publishConfig": {
27
27
  "access": "public"