@superdoc/mcp 1.9.0-next.14 → 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.
- package/dist/index.js +106 -3
- 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.
|
|
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.
|
|
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.
|
|
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.
|
|
33
|
-
"@superdoc/docx-engine": "0.24.0-next.
|
|
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",
|