@superdoc/mcp 1.9.0-next.13 → 1.9.0-next.15

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 +106 -3
  2. package/package.json +4 -4
package/dist/index.js CHANGED
@@ -31620,7 +31620,7 @@ var init_host = __esm(() => {
31620
31620
  });
31621
31621
 
31622
31622
  // ../../packages/sdk/langs/node/src/runtime/sdk-version.generated.ts
31623
- var SDK_VERSION = "2.22.0-next.13";
31623
+ var SDK_VERSION = "2.22.0-next.15";
31624
31624
 
31625
31625
  // ../../packages/sdk/langs/node/src/runtime/embedded-platform.ts
31626
31626
  import { accessSync, chmodSync, constants, existsSync, statSync } from "node:fs";
@@ -142047,7 +142047,7 @@ function* scanFragmentsWork(xml, partUri, storyId, sourceByteBase = 0, initialNa
142047
142047
  const textIdentityOrder = paragraphWindow ? [...fragments] : undefined;
142048
142048
  fragments.sort((left, right) => left.byteStart - right.byteStart || left.byteEnd - right.byteEnd);
142049
142049
  const endFullParagraphs = beginSDCooperativeReadPhase("catalog.raw.full-paragraphs");
142050
- yield* markFullParagraphInsertionsWork(xml, fragments, structural, elementIndex, namespaceBindingsByTagStart);
142050
+ yield* markFullParagraphInsertionsWork(xml, fragments, structural, elementIndex, namespaceBindingsByTagStart, structuralScan.bookmarkBoundaries);
142051
142051
  endFullParagraphs();
142052
142052
  const endCoordinates = beginSDCooperativeReadPhase("catalog.raw.coordinates");
142053
142053
  const trackedLength = yield* populateFragmentSourceCoordinatesWork(xml, fragments, formatting, structural, sourceByteBase, shared, paragraphLengths ? { token: paragraphLengths, partUri, storyId } : undefined, initialNamespaceBindings);
@@ -142079,7 +142079,9 @@ function readEnclosingParagraphRsid(xml, paragraphStart, index, namespaceBinding
142079
142079
  const rsid = readNamespacedAttr(tag.attrs, namespaceBindingsByTagStart.get(paragraphStart), "rsidR");
142080
142080
  return rsid ? { enclosingParagraphRsid: rsid } : {};
142081
142081
  }
142082
- function* markFullParagraphInsertionsWork(xml, fragments, structural, index, namespaceBindingsByTagStart) {
142082
+ function* markFullParagraphInsertionsWork(xml, fragments, structural, index, namespaceBindingsByTagStart, bookmarkBoundaries) {
142083
+ if (!structural.some((fragment3) => fragment3.structuralKind === "paragraph-mark-insertion" || fragment3.structuralKind === "section-break-insertion"))
142084
+ return;
142083
142085
  const contentRevisions = [...fragments];
142084
142086
  for (const fragment3 of structural) {
142085
142087
  yield;
@@ -142108,6 +142110,47 @@ function* markFullParagraphInsertionsWork(xml, fragments, structural, index, nam
142108
142110
  fragments2.push(fragment3);
142109
142111
  structuralByParagraph.set(key2, fragments2);
142110
142112
  }
142113
+ const paragraphs = bookmarkBoundaries.length ? index.entries.filter((entry) => entry.namespaceUri === NS_W && entry.localName === "p") : [];
142114
+ let paragraphCursor = 0;
142115
+ const activeParagraphs = [];
142116
+ const bookmarksById = new Map;
142117
+ const bookmarksByParagraphStart = new Map;
142118
+ for (const boundary of bookmarkBoundaries) {
142119
+ yield;
142120
+ const tag = parseRawXmlElementTag(xml.slice(boundary.start, boundary.openEnd));
142121
+ const rawId = tag ? readNamespacedAttr(tag.attrs, boundary.namespaceBindings, "id") : null;
142122
+ const id = rawId == null ? null : parseRevisionWId(decodeXmlText(rawId));
142123
+ if (id != null) {
142124
+ const boundaries2 = bookmarksById.get(String(id)) ?? [];
142125
+ boundaries2.push(boundary);
142126
+ bookmarksById.set(String(id), boundaries2);
142127
+ }
142128
+ while (paragraphCursor < paragraphs.length && paragraphs[paragraphCursor].start < boundary.start) {
142129
+ const paragraph2 = paragraphs[paragraphCursor++];
142130
+ while (activeParagraphs.length && activeParagraphs.at(-1).end <= paragraph2.start)
142131
+ activeParagraphs.pop();
142132
+ activeParagraphs.push(paragraph2);
142133
+ }
142134
+ while (activeParagraphs.length && activeParagraphs.at(-1).end <= boundary.start)
142135
+ activeParagraphs.pop();
142136
+ const paragraph = activeParagraphs.at(-1);
142137
+ if (!paragraph)
142138
+ continue;
142139
+ const boundaries = bookmarksByParagraphStart.get(paragraph.start) ?? [];
142140
+ boundaries.push(boundary);
142141
+ bookmarksByParagraphStart.set(paragraph.start, boundaries);
142142
+ }
142143
+ const bookmarkPairs = new Map;
142144
+ for (const boundaries of bookmarksById.values()) {
142145
+ yield;
142146
+ if (boundaries.length !== 2)
142147
+ continue;
142148
+ const [start, end] = boundaries;
142149
+ if (start.localName !== "bookmarkStart" || end.localName !== "bookmarkEnd" || start.start >= end.start || boundaries.some((boundary) => xml.slice(boundary.openEnd, boundary.closeStart).trim()))
142150
+ continue;
142151
+ bookmarkPairs.set(start, boundaries);
142152
+ bookmarkPairs.set(end, boundaries);
142153
+ }
142111
142154
  const hyperlinksByParagraphStart = new Map;
142112
142155
  let hyperlinkIndexChecks = 0;
142113
142156
  for (const entry of index.entries) {
@@ -142152,6 +142195,35 @@ function* markFullParagraphInsertionsWork(xml, fragments, structural, index, nam
142152
142195
  continue;
142153
142196
  const propertyBlock = index.entries.find((entry) => entry.localName === "pPr" && entry.start >= paragraph.openEnd && entry.end <= paragraph.closeStart && findImmediateParentElement(index, entry.start)?.start === paragraph.start);
142154
142197
  let coverage = paragraphFragments.map((candidate) => ({ start: candidate.byteStart, end: candidate.byteEnd }));
142198
+ const boundaries = bookmarksByParagraphStart.get(paragraph.start) ?? [];
142199
+ const insertedBoundaries = new Set;
142200
+ let contentCursor = 0;
142201
+ for (const boundary of boundaries) {
142202
+ while (contentCursor < paragraphFragments.length && paragraphFragments[contentCursor].byteEnd <= boundary.start)
142203
+ contentCursor += 1;
142204
+ const owner = paragraphFragments[contentCursor];
142205
+ if (owner && boundary.start >= owner.byteStart && boundary.end <= owner.byteEnd)
142206
+ insertedBoundaries.add(boundary);
142207
+ }
142208
+ const visitedPairs = new Set;
142209
+ for (const boundary of boundaries) {
142210
+ if (!insertedBoundaries.has(boundary))
142211
+ continue;
142212
+ const pair = bookmarkPairs.get(boundary);
142213
+ if (!pair || pair.some((endpoint) => endpoint.start < paragraph.openEnd || endpoint.end > paragraph.closeStart))
142214
+ continue;
142215
+ if (visitedPairs.has(pair))
142216
+ continue;
142217
+ visitedPairs.add(pair);
142218
+ if (pair.some((endpoint) => !insertedBoundaries.has(endpoint) && endpoint.parentStart !== paragraph.start))
142219
+ continue;
142220
+ for (const endpoint of pair) {
142221
+ if (insertedBoundaries.has(endpoint))
142222
+ continue;
142223
+ coverage.push({ start: endpoint.start, end: endpoint.end });
142224
+ }
142225
+ }
142226
+ coverage.sort((left, right) => left.start - right.start);
142155
142227
  for (const hyperlink of hyperlinksByParagraphStart.get(paragraph.start) ?? []) {
142156
142228
  const tag = parseRawXmlElementTag(xml.slice(hyperlink.start, hyperlink.openEnd));
142157
142229
  const bindings2 = namespaceBindingsByTagStart.get(hyperlink.start);
@@ -142497,6 +142569,7 @@ function* buildElementRangeIndexWork(xml, initialNamespaceBindings = {}, sharedR
142497
142569
  const wordTrackedMarkupTags = [];
142498
142570
  const trackedTextTokens = [];
142499
142571
  const emptyPropertyRevisionEnds = new Map;
142572
+ const bookmarkBoundaries = [];
142500
142573
  const namespaceBindingsByTagStart = new Map;
142501
142574
  const stack = [];
142502
142575
  const accumulators = {
@@ -142541,6 +142614,18 @@ function* buildElementRangeIndexWork(xml, initialNamespaceBindings = {}, sharedR
142541
142614
  trackedTextTokens.push(tag);
142542
142615
  }
142543
142616
  const marker = !isClose && isMoveRangeMarkerLocalName(localName) && namespaceBindings[prefix] === NS_W ? readMoveRangeMarker(attrs, namespaceBindings, localName, tag.start, tag.end) : undefined;
142617
+ if (!isClose && selfClose && namespaceBindings[prefix] === NS_W && (localName === "bookmarkStart" || localName === "bookmarkEnd")) {
142618
+ bookmarkBoundaries.push({
142619
+ localName,
142620
+ namespaceUri: NS_W,
142621
+ namespaceBindings,
142622
+ start: tag.start,
142623
+ openEnd: tag.end,
142624
+ closeStart: tag.end,
142625
+ end: tag.end,
142626
+ parentStart: stack.at(-1)?.start
142627
+ });
142628
+ }
142544
142629
  if (!isClose && !selfClose) {
142545
142630
  stack.push({
142546
142631
  localName,
@@ -142577,6 +142662,18 @@ function* buildElementRangeIndexWork(xml, initialNamespaceBindings = {}, sharedR
142577
142662
  if (isTrackedTextWrapperLocalName(localName))
142578
142663
  trackedTextTokens.push(tag);
142579
142664
  }
142665
+ if (open2.namespaceBindings[open2.prefix] === NS_W && (localName === "bookmarkStart" || localName === "bookmarkEnd")) {
142666
+ bookmarkBoundaries.push({
142667
+ localName,
142668
+ namespaceUri: NS_W,
142669
+ namespaceBindings: open2.namespaceBindings,
142670
+ start: open2.start,
142671
+ openEnd: open2.openEnd,
142672
+ closeStart: tag.start,
142673
+ end: tag.end,
142674
+ parentStart: parent?.start
142675
+ });
142676
+ }
142580
142677
  entries.push({
142581
142678
  localName,
142582
142679
  namespaceUri: open2.namespaceBindings[open2.prefix],
@@ -142615,6 +142712,7 @@ function* buildElementRangeIndexWork(xml, initialNamespaceBindings = {}, sharedR
142615
142712
  textContainers: { entries: containers, starts: containers.map((entry) => entry.start), maxEnds }
142616
142713
  },
142617
142714
  moveRangeMarkers,
142715
+ bookmarkBoundaries: bookmarkBoundaries.sort((left, right) => left.start - right.start),
142618
142716
  wordTrackedMarkupTagStarts,
142619
142717
  wordTrackedMarkupTags,
142620
142718
  trackedTextTokens,
@@ -142654,6 +142752,7 @@ function* projectCanonicalElementRangesWork(xml, ranges, sharedTopology) {
142654
142752
  const wordTrackedMarkupTags = [];
142655
142753
  const trackedTextTokens = [];
142656
142754
  const emptyPropertyRevisionEnds = new Map;
142755
+ const bookmarkBoundaries = [];
142657
142756
  const namespaceBindingsByTagStart = new Map;
142658
142757
  const ancestors = [];
142659
142758
  const markerEvents = [];
@@ -142728,6 +142827,9 @@ function* projectCanonicalElementRangesWork(xml, ranges, sharedTopology) {
142728
142827
  markerEvents.push({ marker, end });
142729
142828
  }
142730
142829
  }
142830
+ if (namespaceUri === NS_W && (localName === "bookmarkStart" || localName === "bookmarkEnd")) {
142831
+ bookmarkBoundaries.push({ localName, namespaceUri, namespaceBindings, start, openEnd, closeStart, end, parentStart: parent?.start });
142832
+ }
142731
142833
  if (!isSelfClosing) {
142732
142834
  const entry = { localName, namespaceUri, namespaceBindings, start, openEnd, closeStart, end };
142733
142835
  entries.push(entry);
@@ -142760,6 +142862,7 @@ function* projectCanonicalElementRangesWork(xml, ranges, sharedTopology) {
142760
142862
  return {
142761
142863
  elementIndex: { entries, starts, byStart, textContainers: { entries: containers, starts: containerStarts, maxEnds } },
142762
142864
  moveRangeMarkers,
142865
+ bookmarkBoundaries,
142763
142866
  wordTrackedMarkupTagStarts,
142764
142867
  wordTrackedMarkupTags,
142765
142868
  trackedTextTokens,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@superdoc/mcp",
3
- "version": "1.9.0-next.13",
3
+ "version": "1.9.0-next.15",
4
4
  "description": "Model Context Protocol server for SuperDoc, giving an AI agent tools to read and edit .docx files.",
5
5
  "type": "module",
6
6
  "license": "AGPL-3.0",
@@ -24,13 +24,13 @@
24
24
  ],
25
25
  "dependencies": {
26
26
  "@modelcontextprotocol/sdk": "^1.26.0",
27
- "@superdoc/sdk": "2.22.0-next.13",
27
+ "@superdoc/sdk": "2.22.0-next.15",
28
28
  "debug": "^4.4.3",
29
29
  "zod": "^4.3.6"
30
30
  },
31
31
  "devDependencies": {
32
- "superdoc": "2.25.0-next.13",
33
- "@superdoc/docx-engine": "0.24.0-next.13",
32
+ "superdoc": "2.25.0-next.15",
33
+ "@superdoc/docx-engine": "0.24.0-next.15",
34
34
  "@superdoc/document-api": "0.1.0-alpha.0",
35
35
  "@types/bun": "^1.3.8",
36
36
  "@types/node": "22.19.2",