@eigenpal/docx-js-editor 0.0.19 → 0.0.21

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 (201) hide show
  1. package/README.md +83 -0
  2. package/dist/{ClipboardManager-EZ0C6Onq.d.cts → ClipboardManager-B1jZrC6h.d.cts} +1 -1
  3. package/dist/{ClipboardManager-D6dkOFg6.d.ts → ClipboardManager-jqJVxB6g.d.ts} +1 -1
  4. package/dist/{DocumentAgent-BcCDg7i2.d.ts → DocumentAgent-CnJ9AEl_.d.cts} +31 -3
  5. package/dist/{DocumentAgent-B0EC8lPC.d.cts → DocumentAgent-CrbsDniO.d.ts} +31 -3
  6. package/dist/{FindReplaceDialog-AWQXKEUQ.js → FindReplaceDialog-AQFR4OCT.js} +1 -2
  7. package/dist/FindReplaceDialog-J3DI3U5I.cjs +1 -0
  8. package/dist/{FootnotePropertiesDialog-73VT2ZVZ.cjs → FootnotePropertiesDialog-DO5DCAW6.cjs} +1 -2
  9. package/dist/{FootnotePropertiesDialog-ZM3EF3EF.js → FootnotePropertiesDialog-YYIZU5U6.js} +1 -2
  10. package/dist/{HyperlinkDialog-BA25XUT5.js → HyperlinkDialog-HGZ2S37Z.js} +1 -2
  11. package/dist/HyperlinkDialog-PEPS3C2G.cjs +1 -0
  12. package/dist/{ImagePositionDialog-AIAMKPFK.js → ImagePositionDialog-DQ4JWS4F.js} +1 -2
  13. package/dist/{ImagePositionDialog-KMK7ROV2.cjs → ImagePositionDialog-UYXYHSP4.cjs} +1 -2
  14. package/dist/{ImagePropertiesDialog-ERFCUVCW.js → ImagePropertiesDialog-GJMGLM6G.js} +1 -2
  15. package/dist/{ImagePropertiesDialog-USMMRK6X.cjs → ImagePropertiesDialog-V6SVKINO.cjs} +1 -2
  16. package/dist/{TablePropertiesDialog-72CIUAZT.cjs → TablePropertiesDialog-A36OXG3A.cjs} +1 -2
  17. package/dist/{TablePropertiesDialog-EMUEVYB3.js → TablePropertiesDialog-STZOGHJB.js} +1 -2
  18. package/dist/{agentApi-BFVyKagE.d.cts → agentApi-DfsWRyrP.d.cts} +1 -1
  19. package/dist/{agentApi-BFVyKagE.d.ts → agentApi-DfsWRyrP.d.ts} +1 -1
  20. package/dist/{chunk-FDANI5P4.cjs → chunk-2VHQ7YOQ.cjs} +1 -2
  21. package/dist/chunk-2Y6FLZ5Q.js +3 -0
  22. package/dist/chunk-32HMU2UV.js +111 -0
  23. package/dist/chunk-4CUGBNL2.cjs +1 -0
  24. package/dist/chunk-5GFXHUMP.js +1 -0
  25. package/dist/chunk-6NDMKJIE.js +9 -0
  26. package/dist/chunk-6NYA53QC.cjs +258 -0
  27. package/dist/chunk-7KJ3YVDQ.js +10 -0
  28. package/dist/{chunk-JOYPFQW2.js → chunk-AARNCPWR.js} +1 -2
  29. package/dist/{chunk-4QT5LPBA.cjs → chunk-B7TICMXD.cjs} +16 -17
  30. package/dist/{chunk-2QOEHCBX.js → chunk-BUEMG4NW.js} +1 -2
  31. package/dist/{chunk-CV5WFE7K.js → chunk-CLDB6TL7.js} +2 -3
  32. package/dist/{chunk-M2T6XKT5.js → chunk-CTYOM6BE.js} +1 -2
  33. package/dist/chunk-EH3NY2DQ.cjs +26 -0
  34. package/dist/{chunk-FGVGZLBL.js → chunk-FVUGBRDD.js} +1 -2
  35. package/dist/chunk-FXJAIFPR.js +59 -0
  36. package/dist/chunk-GICVJSFJ.cjs +9 -0
  37. package/dist/{chunk-Y6VCTLCJ.js → chunk-H5NTJZO4.js} +1 -2
  38. package/dist/chunk-HT2Z33YM.cjs +111 -0
  39. package/dist/chunk-JRRTZZ72.cjs +1 -0
  40. package/dist/{chunk-T2HQYRA7.cjs → chunk-NVAQQYBJ.cjs} +1 -2
  41. package/dist/chunk-P3AEZKQO.cjs +3 -0
  42. package/dist/{chunk-GWBTKVFD.cjs → chunk-P7ZF45KZ.cjs} +1 -2
  43. package/dist/{chunk-QEBO3EQP.cjs → chunk-PCJ5ACUV.cjs} +1 -2
  44. package/dist/{chunk-Q6HUGWO6.js → chunk-PJVI53AH.js} +1 -2
  45. package/dist/chunk-Q7YYC75E.js +258 -0
  46. package/dist/{chunk-7JSPKVOW.js → chunk-QVPR2W5S.js} +1 -2
  47. package/dist/{chunk-XZNOV52K.cjs → chunk-TAF6KYDM.cjs} +4 -5
  48. package/dist/chunk-USRMBYI6.js +3 -0
  49. package/dist/chunk-UTWPV2I4.js +26 -0
  50. package/dist/{chunk-DJAEBZ33.cjs → chunk-VTAS7VZ6.cjs} +1 -2
  51. package/dist/chunk-XQNCLN4T.cjs +3 -0
  52. package/dist/{chunk-S26DZVRQ.cjs → chunk-XS2AQFMF.cjs} +1 -2
  53. package/dist/chunk-Y6QBJGMO.cjs +59 -0
  54. package/dist/{chunk-WD2HTKRR.cjs → chunk-YS7FDEZ4.cjs} +1 -2
  55. package/dist/chunk-ZTVQA46Q.js +1 -0
  56. package/dist/{clipboard-beGtyabO.d.ts → clipboard-BE8E-szx.d.ts} +1 -1
  57. package/dist/{clipboard-CqE-UZ2d.d.cts → clipboard-DkfAv07F.d.cts} +1 -1
  58. package/dist/{colorResolver-B5YbO_a4.d.ts → colorResolver-CYttioMe.d.ts} +46 -3
  59. package/dist/{colorResolver-Cu46bSKr.d.cts → colorResolver-Dr8kQZAQ.d.cts} +46 -3
  60. package/dist/core-plugins-reexport.cjs +1 -2
  61. package/dist/core-plugins-reexport.d.cts +4 -4
  62. package/dist/core-plugins-reexport.d.ts +4 -4
  63. package/dist/core-plugins-reexport.js +1 -2
  64. package/dist/core-reexport.cjs +1 -2
  65. package/dist/core-reexport.d.cts +10 -10
  66. package/dist/core-reexport.d.ts +10 -10
  67. package/dist/core-reexport.js +1 -2
  68. package/dist/executor-JGWZ7S6Z.cjs +1 -0
  69. package/dist/executor-L2MVKMXO.js +1 -0
  70. package/dist/{fontLoader-CFKpg0Ri.d.ts → fontLoader-BsqQnB4v.d.ts} +1 -1
  71. package/dist/{fontLoader-HZYfILUm.d.cts → fontLoader-DECXIoMr.d.cts} +1 -1
  72. package/dist/headless-reexport.cjs +4 -5
  73. package/dist/headless-reexport.d.cts +7 -7
  74. package/dist/headless-reexport.d.ts +7 -7
  75. package/dist/headless-reexport.js +4 -5
  76. package/dist/index.cjs +6 -7
  77. package/dist/index.css +0 -1
  78. package/dist/index.d.cts +12 -12
  79. package/dist/index.d.ts +12 -12
  80. package/dist/index.js +6 -7
  81. package/dist/lib-GD2QD2JK.js +1 -0
  82. package/dist/lib-HOLGQI5K.cjs +1 -0
  83. package/dist/mcp-reexport.cjs +9 -10
  84. package/dist/mcp-reexport.d.cts +2 -2
  85. package/dist/mcp-reexport.d.ts +2 -2
  86. package/dist/mcp-reexport.js +4 -5
  87. package/dist/{processTemplate-G37IM66O.js → processTemplate-3HN7Q3KT.js} +1 -2
  88. package/dist/processTemplate-BXZKWRQD.cjs +1 -0
  89. package/dist/{react-BjOCdeTs.d.ts → react-C6bgHDFl.d.ts} +8 -6
  90. package/dist/{react-UzAn4o7l.d.cts → react-CAlVCYa4.d.cts} +8 -6
  91. package/dist/react.cjs +1 -2
  92. package/dist/react.css +0 -1
  93. package/dist/react.d.cts +5 -5
  94. package/dist/react.d.ts +5 -5
  95. package/dist/react.js +1 -2
  96. package/dist/{registry-DjacfR6Q.d.cts → registry-BU-FbHh-.d.cts} +1 -1
  97. package/dist/{registry-CV6nYWqP.d.ts → registry-gRbkCooh.d.ts} +1 -1
  98. package/dist/selectionRects-7QU337P5.cjs +1 -0
  99. package/dist/selectionRects-V5RC2BYX.js +1 -0
  100. package/dist/styles.css +1 -1
  101. package/dist/{types-DwZ3xysp.d.ts → types-7wjInVMW.d.ts} +1 -1
  102. package/dist/{types-Bnp8rvJn.d.cts → types-DEEpBL9H.d.cts} +1 -1
  103. package/dist/ui.cjs +1 -2
  104. package/dist/ui.d.cts +32 -85
  105. package/dist/ui.d.ts +32 -85
  106. package/dist/ui.js +1 -2
  107. package/dist/{variableDetector-CMhJtM96.d.cts → variableDetector-B4oQJa2e.d.cts} +33 -2
  108. package/dist/{variableDetector-BaDeXz7D.d.ts → variableDetector-BXJaTkiB.d.ts} +33 -2
  109. package/package.json +2 -1
  110. package/dist/FindReplaceDialog-AWQXKEUQ.js.map +0 -1
  111. package/dist/FindReplaceDialog-I4SZDSVP.cjs +0 -2
  112. package/dist/FindReplaceDialog-I4SZDSVP.cjs.map +0 -1
  113. package/dist/FootnotePropertiesDialog-73VT2ZVZ.cjs.map +0 -1
  114. package/dist/FootnotePropertiesDialog-ZM3EF3EF.js.map +0 -1
  115. package/dist/HyperlinkDialog-BA25XUT5.js.map +0 -1
  116. package/dist/HyperlinkDialog-V63LPOT2.cjs +0 -2
  117. package/dist/HyperlinkDialog-V63LPOT2.cjs.map +0 -1
  118. package/dist/ImagePositionDialog-AIAMKPFK.js.map +0 -1
  119. package/dist/ImagePositionDialog-KMK7ROV2.cjs.map +0 -1
  120. package/dist/ImagePropertiesDialog-ERFCUVCW.js.map +0 -1
  121. package/dist/ImagePropertiesDialog-USMMRK6X.cjs.map +0 -1
  122. package/dist/TablePropertiesDialog-72CIUAZT.cjs.map +0 -1
  123. package/dist/TablePropertiesDialog-EMUEVYB3.js.map +0 -1
  124. package/dist/chunk-2CHPKB5A.cjs +0 -112
  125. package/dist/chunk-2CHPKB5A.cjs.map +0 -1
  126. package/dist/chunk-2QOEHCBX.js.map +0 -1
  127. package/dist/chunk-4QT5LPBA.cjs.map +0 -1
  128. package/dist/chunk-5DYSI4O4.cjs +0 -60
  129. package/dist/chunk-5DYSI4O4.cjs.map +0 -1
  130. package/dist/chunk-5FJXHXFV.cjs +0 -2
  131. package/dist/chunk-5FJXHXFV.cjs.map +0 -1
  132. package/dist/chunk-6FEWNF6B.js +0 -4
  133. package/dist/chunk-6FEWNF6B.js.map +0 -1
  134. package/dist/chunk-6LF5HZCV.js +0 -10
  135. package/dist/chunk-6LF5HZCV.js.map +0 -1
  136. package/dist/chunk-7JSPKVOW.js.map +0 -1
  137. package/dist/chunk-C33XDRDJ.cjs +0 -28
  138. package/dist/chunk-C33XDRDJ.cjs.map +0 -1
  139. package/dist/chunk-CV5WFE7K.js.map +0 -1
  140. package/dist/chunk-CXJRNISO.js +0 -2
  141. package/dist/chunk-CXJRNISO.js.map +0 -1
  142. package/dist/chunk-DJAEBZ33.cjs.map +0 -1
  143. package/dist/chunk-DP6Q75ZD.js +0 -28
  144. package/dist/chunk-DP6Q75ZD.js.map +0 -1
  145. package/dist/chunk-FDANI5P4.cjs.map +0 -1
  146. package/dist/chunk-FGVGZLBL.js.map +0 -1
  147. package/dist/chunk-GJ4GKSDU.cjs +0 -2
  148. package/dist/chunk-GJ4GKSDU.cjs.map +0 -1
  149. package/dist/chunk-GWBTKVFD.cjs.map +0 -1
  150. package/dist/chunk-JOYPFQW2.js.map +0 -1
  151. package/dist/chunk-L54YNLSE.js +0 -2
  152. package/dist/chunk-L54YNLSE.js.map +0 -1
  153. package/dist/chunk-LPGMLJMO.js +0 -259
  154. package/dist/chunk-LPGMLJMO.js.map +0 -1
  155. package/dist/chunk-M2T6XKT5.js.map +0 -1
  156. package/dist/chunk-OHG7ROFC.js +0 -11
  157. package/dist/chunk-OHG7ROFC.js.map +0 -1
  158. package/dist/chunk-PANKMCFX.cjs +0 -4
  159. package/dist/chunk-PANKMCFX.cjs.map +0 -1
  160. package/dist/chunk-Q6HUGWO6.js.map +0 -1
  161. package/dist/chunk-QDV75OJ4.js +0 -112
  162. package/dist/chunk-QDV75OJ4.js.map +0 -1
  163. package/dist/chunk-QEBO3EQP.cjs.map +0 -1
  164. package/dist/chunk-QVIZ775M.cjs +0 -259
  165. package/dist/chunk-QVIZ775M.cjs.map +0 -1
  166. package/dist/chunk-RMUMR42R.cjs +0 -10
  167. package/dist/chunk-RMUMR42R.cjs.map +0 -1
  168. package/dist/chunk-S26DZVRQ.cjs.map +0 -1
  169. package/dist/chunk-T2HQYRA7.cjs.map +0 -1
  170. package/dist/chunk-ULXNEG66.js +0 -60
  171. package/dist/chunk-ULXNEG66.js.map +0 -1
  172. package/dist/chunk-WD2HTKRR.cjs.map +0 -1
  173. package/dist/chunk-XZNOV52K.cjs.map +0 -1
  174. package/dist/chunk-Y6VCTLCJ.js.map +0 -1
  175. package/dist/core-plugins-reexport.cjs.map +0 -1
  176. package/dist/core-plugins-reexport.js.map +0 -1
  177. package/dist/core-reexport.cjs.map +0 -1
  178. package/dist/core-reexport.js.map +0 -1
  179. package/dist/executor-K5RXUTTR.js +0 -2
  180. package/dist/executor-K5RXUTTR.js.map +0 -1
  181. package/dist/executor-XIPIU3H4.cjs +0 -2
  182. package/dist/executor-XIPIU3H4.cjs.map +0 -1
  183. package/dist/headless-reexport.cjs.map +0 -1
  184. package/dist/headless-reexport.js.map +0 -1
  185. package/dist/index.cjs.map +0 -1
  186. package/dist/index.css.map +0 -1
  187. package/dist/index.js.map +0 -1
  188. package/dist/mcp-reexport.cjs.map +0 -1
  189. package/dist/mcp-reexport.js.map +0 -1
  190. package/dist/processTemplate-G37IM66O.js.map +0 -1
  191. package/dist/processTemplate-RFBGVH7T.cjs +0 -2
  192. package/dist/processTemplate-RFBGVH7T.cjs.map +0 -1
  193. package/dist/react.cjs.map +0 -1
  194. package/dist/react.css.map +0 -1
  195. package/dist/react.js.map +0 -1
  196. package/dist/selectionRects-6DU7HN7E.js +0 -2
  197. package/dist/selectionRects-6DU7HN7E.js.map +0 -1
  198. package/dist/selectionRects-YZSC24ZP.cjs +0 -2
  199. package/dist/selectionRects-YZSC24ZP.cjs.map +0 -1
  200. package/dist/ui.cjs.map +0 -1
  201. package/dist/ui.js.map +0 -1
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../core/src/utils/textSelection.ts","../../core/src/utils/keyboardNavigation.ts","../src/plugins/template/prosemirror-plugin.ts","../src/plugins/template/components/AnnotationPanel.tsx","../src/plugins/template/components/TemplateHighlightOverlay.tsx","../src/plugins/template/index.ts","../src/index.ts"],"names":["WORD_CHAR_REGEX","WHITESPACE_REGEX","isWordCharacter","char","isWhitespace","findWordBoundaries","text","position","charAtPosition","start","end","getWordAt","findWordAt","selectWordAtCursor","selection","range","container","wordStart","wordEnd","element","textNodes","getTextNodesIn","offset","targetNode","targetOffset","child","childTextNodes","newRange","selectWordInTextNode","textNode","expandSelectionToWordBoundaries","startContainer","endContainer","newStartOffset","newEndOffset","e","selectParagraphAtCursor","paragraphElement","findParagraphElement","node","current","walker","clickCount","clickTimer","lastClickTarget","MULTI_CLICK_TIMEOUT","resetClickCount","handleClickForMultiClick","event","createDoubleClickWordSelector","createTripleClickParagraphSelector","isPunctuation","findWordStart","pos","findWordEnd","findNextWordStart","findPreviousWordStart","findVisualLineStart","currentTop","mid","rect","findVisualLineEnd","textLength","getSelectionInfo","setSelectionPosition","maxOffset","extendSelectionTo","moveByWord","direction","extend","focusNode","currentOffset","newOffset","moveToLineEdge","edge","result","parseNavigationAction","key","ctrlKey","metaKey","shiftKey","_altKey","isModifier","handleNavigationKey","options","action","isNavigationKey","expandSelectionToWord","getWordAtCursor","matchesShortcut","shortcut","eventModifier","shortcutModifier","NAVIGATION_SHORTCUTS","describeShortcut","parts","isMac","keyName","getNavigationShortcutDescriptions","TAG_REGEX","templatePluginKey","PluginKey","stableId","type","name","occurrence","findTags","doc","combined","posMap","i","tags","sectionStack","occurrences","match","rawTag","prefix","from","to","occ","tag","getColor","createDecorations","hoveredId","selectedId","decorations","isHovered","isSelected","color","classes","Decoration","DecorationSet","tagsStructureEqual","a","b","createTemplatePlugin","Plugin","_","state","tr","value","_oldState","newState","newTags","structureSame","meta","newHovered","newSelected","view","clicked","t","id","getTemplateTags","setHoveredElement","setSelectedElement","TEMPLATE_DECORATION_STYLES","COLORS","getLabel","AnnotationPanel","editorView","pluginState","renderedDomContext","layoutVersion","setLayoutVersion","useState","containerRef","useRef","chipRefs","lastPositionsRef","visibleTags","useMemo","computePositions","useCallback","newPositions","containerOffset","lastPosMap","rects","top","lastTop","minGap","prev","curr","prevChipEl","prevHeight","positions","useEffect","observer","v","handleResize","lastMeasuredTagsKey","tagsKey","timer","handleHover","handleClick","TextSelection","jsx","label","isSection","jsxs","el","ANNOTATION_PANEL_STYLES","HIGHLIGHT_COLORS","HOVER_COLORS","TemplateHighlightOverlay","context","onHover","onSelect","computeHighlights","tagRects","highlights","index","TEMPLATE_HIGHLIGHT_OVERLAY_STYLES","MemoizedAnnotationPanel","React","next","prevState","nextState","prevTags","nextTags","createPlugin","_view","templatePlugin","VERSION"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Text Selection Utilities\n *\n * Utilities for word-level and paragraph-level text selection.\n * Used for double-click (word) and triple-click (paragraph) selection.\n */\n\n// ============================================================================\n// WORD BOUNDARY DETECTION\n// ============================================================================\n\n/**\n * Regular expression for word characters.\n * Includes letters, numbers, and common word-internal punctuation (apostrophes, hyphens).\n */\nconst WORD_CHAR_REGEX = /[\\p{L}\\p{N}''\\-]/u;\n\n/**\n * Regular expression for whitespace characters\n */\nconst WHITESPACE_REGEX = /\\s/;\n\n/**\n * Check if a character is a word character\n */\nexport function isWordCharacter(char: string): boolean {\n if (!char || char.length === 0) return false;\n return WORD_CHAR_REGEX.test(char);\n}\n\n/**\n * Check if a character is whitespace\n */\nexport function isWhitespace(char: string): boolean {\n if (!char || char.length === 0) return false;\n return WHITESPACE_REGEX.test(char);\n}\n\n/**\n * Find word boundaries around a position in text\n * Returns [startIndex, endIndex] inclusive start, exclusive end\n */\nexport function findWordBoundaries(text: string, position: number): [number, number] {\n if (!text || text.length === 0) {\n return [0, 0];\n }\n\n // Clamp position to valid range\n position = Math.max(0, Math.min(position, text.length - 1));\n\n const charAtPosition = text[position];\n\n // If on whitespace, select the whitespace run\n if (isWhitespace(charAtPosition)) {\n let start = position;\n let end = position;\n\n // Expand backwards through whitespace\n while (start > 0 && isWhitespace(text[start - 1])) {\n start--;\n }\n\n // Expand forwards through whitespace\n while (end < text.length && isWhitespace(text[end])) {\n end++;\n }\n\n return [start, end];\n }\n\n // If on a word character, find the word\n if (isWordCharacter(charAtPosition)) {\n let start = position;\n let end = position;\n\n // Expand backwards through word characters\n while (start > 0 && isWordCharacter(text[start - 1])) {\n start--;\n }\n\n // Expand forwards through word characters\n while (end < text.length && isWordCharacter(text[end])) {\n end++;\n }\n\n return [start, end];\n }\n\n // On punctuation or other non-word character, just select that character\n return [position, position + 1];\n}\n\n/**\n * Get the word at a position in text\n */\nexport function getWordAt(text: string, position: number): string {\n const [start, end] = findWordBoundaries(text, position);\n return text.slice(start, end);\n}\n\n/**\n * Word selection result\n */\nexport interface WordSelectionResult {\n /** The selected word */\n word: string;\n /** Start index in the text (inclusive) */\n startIndex: number;\n /** End index in the text (exclusive) */\n endIndex: number;\n}\n\n/**\n * Find the word at a position and return detailed info\n */\nexport function findWordAt(text: string, position: number): WordSelectionResult {\n const [start, end] = findWordBoundaries(text, position);\n return {\n word: text.slice(start, end),\n startIndex: start,\n endIndex: end,\n };\n}\n\n// ============================================================================\n// DOM-BASED SELECTION\n// ============================================================================\n\n/**\n * Select a word at the current cursor position using the browser's native APIs.\n * This works reliably across different browsers and handles contentEditable well.\n */\nexport function selectWordAtCursor(): boolean {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) {\n return false;\n }\n\n // Get the current range (cursor position)\n const range = selection.getRangeAt(0);\n\n // The container node where the selection is\n const container = range.startContainer;\n\n // If we're in a text node, we can select the word\n if (container.nodeType === Node.TEXT_NODE) {\n const text = container.textContent || '';\n const position = range.startOffset;\n\n // Find word boundaries\n const [wordStart, wordEnd] = findWordBoundaries(text, position);\n\n // If we found a word, select it\n if (wordEnd > wordStart) {\n range.setStart(container, wordStart);\n range.setEnd(container, wordEnd);\n\n selection.removeAllRanges();\n selection.addRange(range);\n return true;\n }\n }\n\n // For element nodes or other cases, try to find the text node\n if (container.nodeType === Node.ELEMENT_NODE) {\n // Try to get the text content and find the text node\n const element = container as Element;\n const textNodes = getTextNodesIn(element);\n\n if (textNodes.length > 0) {\n // Find which text node we're near\n const offset = range.startOffset;\n let targetNode: Text | null = null;\n let targetOffset = offset;\n\n // If offset is a child index, get that child's text node\n if (offset < element.childNodes.length) {\n const child = element.childNodes[offset];\n if (child.nodeType === Node.TEXT_NODE) {\n targetNode = child as Text;\n targetOffset = 0;\n } else if (child instanceof Element) {\n const childTextNodes = getTextNodesIn(child);\n if (childTextNodes.length > 0) {\n targetNode = childTextNodes[0];\n targetOffset = 0;\n }\n }\n }\n\n // Fallback to first text node\n if (!targetNode && textNodes.length > 0) {\n targetNode = textNodes[0];\n targetOffset = 0;\n }\n\n if (targetNode) {\n const text = targetNode.textContent || '';\n const [wordStart, wordEnd] = findWordBoundaries(text, targetOffset);\n\n if (wordEnd > wordStart) {\n const newRange = document.createRange();\n newRange.setStart(targetNode, wordStart);\n newRange.setEnd(targetNode, wordEnd);\n\n selection.removeAllRanges();\n selection.addRange(newRange);\n return true;\n }\n }\n }\n }\n\n return false;\n}\n\n/**\n * Select a word in a specific text node at the given offset\n */\nexport function selectWordInTextNode(textNode: Text, offset: number): boolean {\n const selection = window.getSelection();\n if (!selection) return false;\n\n const text = textNode.textContent || '';\n const [wordStart, wordEnd] = findWordBoundaries(text, offset);\n\n if (wordEnd > wordStart) {\n const range = document.createRange();\n range.setStart(textNode, wordStart);\n range.setEnd(textNode, wordEnd);\n\n selection.removeAllRanges();\n selection.addRange(range);\n return true;\n }\n\n return false;\n}\n\n/**\n * Expand the current selection to word boundaries.\n * If there's a collapsed selection (cursor), selects the word at cursor.\n * If there's an existing selection, expands to include complete words.\n */\nexport function expandSelectionToWordBoundaries(): boolean {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) {\n return false;\n }\n\n const range = selection.getRangeAt(0);\n\n // If collapsed, use selectWordAtCursor\n if (range.collapsed) {\n return selectWordAtCursor();\n }\n\n // For non-collapsed selections, expand both ends to word boundaries\n const startContainer = range.startContainer;\n const endContainer = range.endContainer;\n\n let newStartOffset = range.startOffset;\n let newEndOffset = range.endOffset;\n\n // Expand start to word boundary\n if (startContainer.nodeType === Node.TEXT_NODE) {\n const text = startContainer.textContent || '';\n const [wordStart] = findWordBoundaries(text, range.startOffset);\n newStartOffset = wordStart;\n }\n\n // Expand end to word boundary\n if (endContainer.nodeType === Node.TEXT_NODE) {\n const text = endContainer.textContent || '';\n const position = Math.max(0, range.endOffset - 1);\n const [, wordEnd] = findWordBoundaries(text, position);\n newEndOffset = wordEnd;\n }\n\n // Apply the expanded selection\n try {\n range.setStart(startContainer, newStartOffset);\n range.setEnd(endContainer, newEndOffset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n return true;\n } catch (e) {\n // Selection manipulation can throw in some edge cases\n console.warn('Could not expand selection to word boundaries:', e);\n return false;\n }\n}\n\n// ============================================================================\n// PARAGRAPH SELECTION\n// ============================================================================\n\n/**\n * Select the entire paragraph containing the current selection.\n * Looks for the nearest element with [data-paragraph-index] attribute.\n */\nexport function selectParagraphAtCursor(): boolean {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) {\n return false;\n }\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n\n // Find the paragraph element\n const paragraphElement = findParagraphElement(container);\n\n if (paragraphElement) {\n const newRange = document.createRange();\n newRange.selectNodeContents(paragraphElement);\n\n selection.removeAllRanges();\n selection.addRange(newRange);\n return true;\n }\n\n return false;\n}\n\n/**\n * Find the paragraph element containing a node.\n * Looks for elements with [data-paragraph-index] attribute.\n */\nfunction findParagraphElement(node: Node | null): Element | null {\n if (!node) return null;\n\n let current: Node | null = node;\n while (current) {\n if (current instanceof Element) {\n if (current.hasAttribute('data-paragraph-index')) {\n return current;\n }\n }\n current = current.parentNode;\n }\n\n return null;\n}\n\n/**\n * Get all text nodes within an element\n */\nfunction getTextNodesIn(element: Element): Text[] {\n const textNodes: Text[] = [];\n const walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT, null);\n\n let node: Node | null;\n while ((node = walker.nextNode())) {\n if (node.nodeType === Node.TEXT_NODE) {\n textNodes.push(node as Text);\n }\n }\n\n return textNodes;\n}\n\n// ============================================================================\n// DOUBLE/TRIPLE CLICK HANDLERS\n// ============================================================================\n\n/**\n * Track click count for double/triple click detection\n */\nlet clickCount = 0;\nlet clickTimer: ReturnType<typeof setTimeout> | null = null;\nlet lastClickTarget: EventTarget | null = null;\n\nconst MULTI_CLICK_TIMEOUT = 500; // ms\n\n/**\n * Reset click count\n */\nfunction resetClickCount(): void {\n clickCount = 0;\n lastClickTarget = null;\n if (clickTimer) {\n clearTimeout(clickTimer);\n clickTimer = null;\n }\n}\n\n/**\n * Handle click event for multi-click detection.\n * Call this in your click handler.\n * Returns the click count (1 = single, 2 = double, 3 = triple).\n */\nexport function handleClickForMultiClick(event: MouseEvent): number {\n // Reset if clicking different target\n if (event.target !== lastClickTarget) {\n resetClickCount();\n }\n\n clickCount++;\n lastClickTarget = event.target;\n\n // Reset timer\n if (clickTimer) {\n clearTimeout(clickTimer);\n }\n\n clickTimer = setTimeout(resetClickCount, MULTI_CLICK_TIMEOUT);\n\n // Cap at 3 clicks\n return Math.min(clickCount, 3);\n}\n\n/**\n * Create a double-click handler that selects words.\n * Returns a function that should be called on dblclick events.\n */\nexport function createDoubleClickWordSelector(): (event: MouseEvent) => void {\n return (event: MouseEvent) => {\n // Prevent default double-click behavior (which might be too aggressive)\n // We'll implement our own word selection\n\n // Don't interfere if user is holding modifiers\n if (event.ctrlKey || event.metaKey || event.altKey) {\n return;\n }\n\n // Select the word at the click position\n selectWordAtCursor();\n };\n}\n\n/**\n * Create a triple-click handler that selects paragraphs.\n * This uses our custom click counting since browsers have inconsistent triple-click.\n */\nexport function createTripleClickParagraphSelector(): (event: MouseEvent) => void {\n return (event: MouseEvent) => {\n const clickNum = handleClickForMultiClick(event);\n\n if (clickNum === 3) {\n // Don't interfere with modifier keys\n if (event.ctrlKey || event.metaKey || event.altKey) {\n return;\n }\n\n // Select the paragraph\n selectParagraphAtCursor();\n }\n };\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default {\n isWordCharacter,\n isWhitespace,\n findWordBoundaries,\n getWordAt,\n findWordAt,\n selectWordAtCursor,\n selectWordInTextNode,\n expandSelectionToWordBoundaries,\n selectParagraphAtCursor,\n handleClickForMultiClick,\n createDoubleClickWordSelector,\n createTripleClickParagraphSelector,\n};\n","/**\n * Keyboard Navigation Utilities\n *\n * Provides enhanced keyboard navigation for the editor:\n * - Ctrl+Left/Right: Move by word\n * - Home/End: Move to start/end of line\n * - Ctrl+Home/End: Move to start/end of document\n * - Ctrl+Shift+Left/Right: Select by word\n * - Shift+Home/End: Select to start/end of line\n */\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Navigation direction\n */\nexport type NavigationDirection = 'left' | 'right' | 'up' | 'down';\n\n/**\n * Navigation unit\n */\nexport type NavigationUnit = 'character' | 'word' | 'line' | 'paragraph' | 'document';\n\n/**\n * Keyboard navigation action\n */\nexport interface NavigationAction {\n /** Direction to navigate */\n direction: NavigationDirection;\n /** Unit of movement */\n unit: NavigationUnit;\n /** Whether to extend selection */\n extend: boolean;\n}\n\n/**\n * Keyboard shortcut definition\n */\nexport interface KeyboardShortcut {\n key: string;\n ctrlKey?: boolean;\n metaKey?: boolean;\n shiftKey?: boolean;\n altKey?: boolean;\n}\n\n// ============================================================================\n// WORD BOUNDARY DETECTION\n// ============================================================================\n\n/**\n * Check if a character is a word character (letter, digit, or underscore)\n */\nexport function isWordCharacter(char: string): boolean {\n if (!char) return false;\n // Word characters: letters (including unicode), digits, underscore\n return /[\\p{L}\\p{N}_]/u.test(char);\n}\n\n/**\n * Check if a character is whitespace\n */\nexport function isWhitespace(char: string): boolean {\n if (!char) return false;\n return /\\s/.test(char);\n}\n\n/**\n * Check if a character is a punctuation character\n */\nexport function isPunctuation(char: string): boolean {\n if (!char) return false;\n return /[\\p{P}]/u.test(char);\n}\n\n/**\n * Find the start of the current or previous word\n */\nexport function findWordStart(text: string, position: number): number {\n if (position <= 0) return 0;\n if (position > text.length) position = text.length;\n\n let pos = position;\n\n // If we're in the middle of whitespace, skip to the end of whitespace\n while (pos > 0 && isWhitespace(text[pos - 1])) {\n pos--;\n }\n\n // If we hit the start while skipping whitespace, return 0\n if (pos === 0) return 0;\n\n // Now find the start of the word\n while (pos > 0 && isWordCharacter(text[pos - 1])) {\n pos--;\n }\n\n return pos;\n}\n\n/**\n * Find the end of the current or next word\n */\nexport function findWordEnd(text: string, position: number): number {\n if (position >= text.length) return text.length;\n if (position < 0) position = 0;\n\n let pos = position;\n\n // If we're at a word character, find the end of this word\n while (pos < text.length && isWordCharacter(text[pos])) {\n pos++;\n }\n\n // Skip whitespace to reach the start of next word\n while (pos < text.length && isWhitespace(text[pos])) {\n pos++;\n }\n\n return pos;\n}\n\n/**\n * Find the next word start (for Ctrl+Right navigation)\n */\nexport function findNextWordStart(text: string, position: number): number {\n if (position >= text.length) return text.length;\n\n let pos = position;\n\n // If we're on a word character, move to end of current word\n while (pos < text.length && isWordCharacter(text[pos])) {\n pos++;\n }\n\n // Skip whitespace and punctuation to reach next word\n while (pos < text.length && !isWordCharacter(text[pos])) {\n pos++;\n }\n\n return pos;\n}\n\n/**\n * Find the previous word start (for Ctrl+Left navigation)\n */\nexport function findPreviousWordStart(text: string, position: number): number {\n if (position <= 0) return 0;\n\n let pos = position;\n\n // Skip whitespace and punctuation going backwards\n while (pos > 0 && !isWordCharacter(text[pos - 1])) {\n pos--;\n }\n\n // Move to start of word\n while (pos > 0 && isWordCharacter(text[pos - 1])) {\n pos--;\n }\n\n return pos;\n}\n\n// ============================================================================\n// LINE BOUNDARY DETECTION\n// ============================================================================\n\n/**\n * Find the start of the current line in a text node\n * Uses visual line detection based on bounding rectangles\n */\nexport function findVisualLineStart(\n container: Node,\n offset: number\n): { node: Node; offset: number } | null {\n const selection = window.getSelection();\n if (!selection) return null;\n\n // Get the current caret position's bounding rect\n const range = document.createRange();\n\n if (container.nodeType === Node.TEXT_NODE) {\n // Handle text node\n range.setStart(container, Math.min(offset, container.textContent?.length || 0));\n range.collapse(true);\n\n const currentRect = range.getBoundingClientRect();\n const currentTop = currentRect.top;\n\n // Binary search to find line start\n let start = 0;\n let end = offset;\n\n while (start < end) {\n const mid = Math.floor((start + end) / 2);\n range.setStart(container, mid);\n range.collapse(true);\n const rect = range.getBoundingClientRect();\n\n if (Math.abs(rect.top - currentTop) < 2) {\n // Same line, search left\n end = mid;\n } else {\n // Different line, search right\n start = mid + 1;\n }\n }\n\n return { node: container, offset: start };\n }\n\n return null;\n}\n\n/**\n * Find the end of the current line in a text node\n * Uses visual line detection based on bounding rectangles\n */\nexport function findVisualLineEnd(\n container: Node,\n offset: number\n): { node: Node; offset: number } | null {\n const selection = window.getSelection();\n if (!selection) return null;\n\n const textLength = container.textContent?.length || 0;\n\n // Get the current caret position's bounding rect\n const range = document.createRange();\n\n if (container.nodeType === Node.TEXT_NODE) {\n range.setStart(container, Math.min(offset, textLength));\n range.collapse(true);\n\n const currentRect = range.getBoundingClientRect();\n const currentTop = currentRect.top;\n\n // Binary search to find line end\n let start = offset;\n let end = textLength;\n\n while (start < end) {\n const mid = Math.ceil((start + end) / 2);\n range.setStart(container, mid);\n range.collapse(true);\n const rect = range.getBoundingClientRect();\n\n if (Math.abs(rect.top - currentTop) < 2) {\n // Same line, search right\n start = mid;\n } else {\n // Different line, search left\n end = mid - 1;\n }\n }\n\n return { node: container, offset: start };\n }\n\n return null;\n}\n\n// ============================================================================\n// DOM SELECTION UTILITIES\n// ============================================================================\n\n/**\n * Get the current selection info\n */\nexport function getSelectionInfo(): {\n node: Node;\n offset: number;\n anchorNode: Node | null;\n anchorOffset: number;\n focusNode: Node | null;\n focusOffset: number;\n isCollapsed: boolean;\n text: string;\n} | null {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return null;\n\n const range = selection.getRangeAt(0);\n\n return {\n node: range.startContainer,\n offset: range.startOffset,\n anchorNode: selection.anchorNode,\n anchorOffset: selection.anchorOffset,\n focusNode: selection.focusNode,\n focusOffset: selection.focusOffset,\n isCollapsed: selection.isCollapsed,\n text: selection.toString(),\n };\n}\n\n/**\n * Set the selection to a specific position\n */\nexport function setSelectionPosition(node: Node, offset: number): void {\n const selection = window.getSelection();\n if (!selection) return;\n\n const range = document.createRange();\n const maxOffset =\n node.nodeType === Node.TEXT_NODE ? node.textContent?.length || 0 : node.childNodes.length;\n\n range.setStart(node, Math.min(offset, maxOffset));\n range.collapse(true);\n\n selection.removeAllRanges();\n selection.addRange(range);\n}\n\n/**\n * Extend selection to a specific position\n */\nexport function extendSelectionTo(node: Node, offset: number): void {\n const selection = window.getSelection();\n if (!selection || !selection.anchorNode) return;\n\n try {\n selection.extend(node, Math.min(offset, node.textContent?.length || 0));\n } catch {\n // If extend fails (e.g., different containers), fall back to setBaseAndExtent\n const maxOffset =\n node.nodeType === Node.TEXT_NODE ? node.textContent?.length || 0 : node.childNodes.length;\n\n selection.setBaseAndExtent(\n selection.anchorNode,\n selection.anchorOffset,\n node,\n Math.min(offset, maxOffset)\n );\n }\n}\n\n/**\n * Move selection by word in a text node\n */\nexport function moveByWord(direction: 'left' | 'right', extend: boolean = false): boolean {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n\n const focusNode = selection.focusNode;\n if (!focusNode || focusNode.nodeType !== Node.TEXT_NODE) return false;\n\n const text = focusNode.textContent || '';\n const currentOffset = selection.focusOffset;\n\n let newOffset: number;\n if (direction === 'left') {\n newOffset = findPreviousWordStart(text, currentOffset);\n } else {\n newOffset = findNextWordStart(text, currentOffset);\n }\n\n if (extend) {\n extendSelectionTo(focusNode, newOffset);\n } else {\n setSelectionPosition(focusNode, newOffset);\n }\n\n return true;\n}\n\n/**\n * Move to start/end of line\n */\nexport function moveToLineEdge(edge: 'start' | 'end', extend: boolean = false): boolean {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n\n const focusNode = selection.focusNode;\n if (!focusNode) return false;\n\n // For text nodes, find visual line boundaries\n if (focusNode.nodeType === Node.TEXT_NODE) {\n const result =\n edge === 'start'\n ? findVisualLineStart(focusNode, selection.focusOffset)\n : findVisualLineEnd(focusNode, selection.focusOffset);\n\n if (result) {\n if (extend) {\n extendSelectionTo(result.node, result.offset);\n } else {\n setSelectionPosition(result.node, result.offset);\n }\n return true;\n }\n }\n\n // Fallback: move to start/end of the focus node's text content\n const text = focusNode.textContent || '';\n const newOffset = edge === 'start' ? 0 : text.length;\n\n if (extend) {\n extendSelectionTo(focusNode, newOffset);\n } else {\n setSelectionPosition(focusNode, newOffset);\n }\n\n return true;\n}\n\n// ============================================================================\n// KEYBOARD EVENT HANDLING\n// ============================================================================\n\n/**\n * Parse a keyboard event into a navigation action\n */\nexport function parseNavigationAction(event: KeyboardEvent): NavigationAction | null {\n const { key, ctrlKey, metaKey, shiftKey, altKey: _altKey } = event;\n\n // Use Ctrl on Windows/Linux, Meta (Cmd) on Mac\n const isModifier = ctrlKey || metaKey;\n\n switch (key) {\n case 'ArrowLeft':\n if (isModifier) {\n return {\n direction: 'left',\n unit: 'word',\n extend: shiftKey,\n };\n }\n break;\n\n case 'ArrowRight':\n if (isModifier) {\n return {\n direction: 'right',\n unit: 'word',\n extend: shiftKey,\n };\n }\n break;\n\n case 'Home':\n if (isModifier) {\n return {\n direction: 'left',\n unit: 'document',\n extend: shiftKey,\n };\n }\n return {\n direction: 'left',\n unit: 'line',\n extend: shiftKey,\n };\n\n case 'End':\n if (isModifier) {\n return {\n direction: 'right',\n unit: 'document',\n extend: shiftKey,\n };\n }\n return {\n direction: 'right',\n unit: 'line',\n extend: shiftKey,\n };\n }\n\n return null;\n}\n\n/**\n * Handle a keyboard navigation event\n * Returns true if the event was handled\n */\nexport function handleNavigationKey(\n event: KeyboardEvent,\n options?: {\n onDocumentStart?: () => void;\n onDocumentEnd?: () => void;\n }\n): boolean {\n const action = parseNavigationAction(event);\n if (!action) return false;\n\n switch (action.unit) {\n case 'word':\n // moveByWord only supports horizontal directions\n if (\n (action.direction === 'left' || action.direction === 'right') &&\n moveByWord(action.direction, action.extend)\n ) {\n event.preventDefault();\n return true;\n }\n break;\n\n case 'line':\n const edge = action.direction === 'left' ? 'start' : 'end';\n if (moveToLineEdge(edge, action.extend)) {\n event.preventDefault();\n return true;\n }\n break;\n\n case 'document':\n // Document navigation needs to be handled by the editor component\n // as it involves cross-paragraph movement\n if (action.direction === 'left' && options?.onDocumentStart) {\n event.preventDefault();\n options.onDocumentStart();\n return true;\n }\n if (action.direction === 'right' && options?.onDocumentEnd) {\n event.preventDefault();\n options.onDocumentEnd();\n return true;\n }\n break;\n }\n\n return false;\n}\n\n/**\n * Check if an event is a navigation key event\n */\nexport function isNavigationKey(event: KeyboardEvent): boolean {\n const { key, ctrlKey, metaKey } = event;\n const isModifier = ctrlKey || metaKey;\n\n // Arrow keys with Ctrl/Cmd\n if (isModifier && (key === 'ArrowLeft' || key === 'ArrowRight')) {\n return true;\n }\n\n // Home/End keys\n if (key === 'Home' || key === 'End') {\n return true;\n }\n\n return false;\n}\n\n// ============================================================================\n// SELECTION WORD EXPANSION\n// ============================================================================\n\n/**\n * Expand selection to word boundaries\n * Used for double-click word selection\n */\nexport function expandSelectionToWord(): boolean {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n\n const focusNode = selection.focusNode;\n if (!focusNode || focusNode.nodeType !== Node.TEXT_NODE) return false;\n\n const text = focusNode.textContent || '';\n const offset = selection.focusOffset;\n\n // Find word boundaries around the cursor\n let start = offset;\n let end = offset;\n\n // Expand backwards to word start\n while (start > 0 && isWordCharacter(text[start - 1])) {\n start--;\n }\n\n // Expand forwards to word end\n while (end < text.length && isWordCharacter(text[end])) {\n end++;\n }\n\n // If we didn't find a word (cursor on whitespace), don't expand\n if (start === end) return false;\n\n // Create the selection\n const range = document.createRange();\n range.setStart(focusNode, start);\n range.setEnd(focusNode, end);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n return true;\n}\n\n/**\n * Get the word at the current cursor position\n */\nexport function getWordAtCursor(): string | null {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return null;\n\n const focusNode = selection.focusNode;\n if (!focusNode || focusNode.nodeType !== Node.TEXT_NODE) return null;\n\n const text = focusNode.textContent || '';\n const offset = selection.focusOffset;\n\n let start = offset;\n let end = offset;\n\n while (start > 0 && isWordCharacter(text[start - 1])) {\n start--;\n }\n\n while (end < text.length && isWordCharacter(text[end])) {\n end++;\n }\n\n if (start === end) return null;\n\n return text.slice(start, end);\n}\n\n// ============================================================================\n// KEYBOARD SHORTCUT MATCHING\n// ============================================================================\n\n/**\n * Check if a keyboard event matches a shortcut definition\n */\nexport function matchesShortcut(event: KeyboardEvent, shortcut: KeyboardShortcut): boolean {\n // Handle both Ctrl and Meta (Cmd on Mac)\n const eventModifier = event.ctrlKey || event.metaKey;\n const shortcutModifier = shortcut.ctrlKey || shortcut.metaKey;\n\n return (\n event.key.toLowerCase() === shortcut.key.toLowerCase() &&\n eventModifier === !!shortcutModifier &&\n event.shiftKey === !!shortcut.shiftKey &&\n event.altKey === !!shortcut.altKey\n );\n}\n\n/**\n * Common navigation shortcuts\n */\nexport const NAVIGATION_SHORTCUTS = {\n // Word navigation\n wordLeft: { key: 'ArrowLeft', ctrlKey: true } as KeyboardShortcut,\n wordRight: { key: 'ArrowRight', ctrlKey: true } as KeyboardShortcut,\n selectWordLeft: { key: 'ArrowLeft', ctrlKey: true, shiftKey: true } as KeyboardShortcut,\n selectWordRight: { key: 'ArrowRight', ctrlKey: true, shiftKey: true } as KeyboardShortcut,\n\n // Line navigation\n lineStart: { key: 'Home' } as KeyboardShortcut,\n lineEnd: { key: 'End' } as KeyboardShortcut,\n selectToLineStart: { key: 'Home', shiftKey: true } as KeyboardShortcut,\n selectToLineEnd: { key: 'End', shiftKey: true } as KeyboardShortcut,\n\n // Document navigation\n documentStart: { key: 'Home', ctrlKey: true } as KeyboardShortcut,\n documentEnd: { key: 'End', ctrlKey: true } as KeyboardShortcut,\n selectToDocumentStart: { key: 'Home', ctrlKey: true, shiftKey: true } as KeyboardShortcut,\n selectToDocumentEnd: { key: 'End', ctrlKey: true, shiftKey: true } as KeyboardShortcut,\n} as const;\n\n/**\n * Get a human-readable description of a shortcut\n */\nexport function describeShortcut(shortcut: KeyboardShortcut): string {\n const parts: string[] = [];\n\n if (shortcut.ctrlKey || shortcut.metaKey) {\n // Use Cmd symbol on Mac, Ctrl on others\n const isMac = typeof navigator !== 'undefined' && /Mac/i.test(navigator.platform);\n parts.push(isMac ? '⌘' : 'Ctrl');\n }\n if (shortcut.shiftKey) parts.push('Shift');\n if (shortcut.altKey) parts.push('Alt');\n\n // Format the key\n let keyName = shortcut.key;\n if (keyName === 'ArrowLeft') keyName = '←';\n else if (keyName === 'ArrowRight') keyName = '→';\n else if (keyName === 'ArrowUp') keyName = '↑';\n else if (keyName === 'ArrowDown') keyName = '↓';\n\n parts.push(keyName);\n\n return parts.join('+');\n}\n\n/**\n * Get all navigation shortcuts with descriptions\n */\nexport function getNavigationShortcutDescriptions(): Array<{\n action: string;\n shortcut: string;\n}> {\n return [\n { action: 'Move by word (left)', shortcut: describeShortcut(NAVIGATION_SHORTCUTS.wordLeft) },\n { action: 'Move by word (right)', shortcut: describeShortcut(NAVIGATION_SHORTCUTS.wordRight) },\n {\n action: 'Select word (left)',\n shortcut: describeShortcut(NAVIGATION_SHORTCUTS.selectWordLeft),\n },\n {\n action: 'Select word (right)',\n shortcut: describeShortcut(NAVIGATION_SHORTCUTS.selectWordRight),\n },\n { action: 'Go to line start', shortcut: describeShortcut(NAVIGATION_SHORTCUTS.lineStart) },\n { action: 'Go to line end', shortcut: describeShortcut(NAVIGATION_SHORTCUTS.lineEnd) },\n {\n action: 'Select to line start',\n shortcut: describeShortcut(NAVIGATION_SHORTCUTS.selectToLineStart),\n },\n {\n action: 'Select to line end',\n shortcut: describeShortcut(NAVIGATION_SHORTCUTS.selectToLineEnd),\n },\n {\n action: 'Go to document start',\n shortcut: describeShortcut(NAVIGATION_SHORTCUTS.documentStart),\n },\n { action: 'Go to document end', shortcut: describeShortcut(NAVIGATION_SHORTCUTS.documentEnd) },\n {\n action: 'Select to document start',\n shortcut: describeShortcut(NAVIGATION_SHORTCUTS.selectToDocumentStart),\n },\n {\n action: 'Select to document end',\n shortcut: describeShortcut(NAVIGATION_SHORTCUTS.selectToDocumentEnd),\n },\n ];\n}\n","/**\n * Template ProseMirror Plugin\n *\n * Simple plugin that finds template tags using regex and creates decorations.\n * No separate parsing layer - everything happens here.\n */\n\nimport { Plugin, PluginKey } from 'prosemirror-state';\nimport type { EditorView } from 'prosemirror-view';\nimport { Decoration, DecorationSet } from 'prosemirror-view';\nimport type { Node as ProseMirrorNode } from 'prosemirror-model';\n\n/**\n * Template tag types\n */\nexport type TagType = 'variable' | 'sectionStart' | 'sectionEnd' | 'invertedStart' | 'raw';\n\n/**\n * A found template tag\n */\nexport interface TemplateTag {\n id: string;\n type: TagType;\n name: string;\n rawTag: string;\n from: number;\n to: number;\n /** For sections: nested variable names */\n nestedVars?: string[];\n /** True if this variable is inside a section (shown in section's nested vars) */\n insideSection?: boolean;\n}\n\n/**\n * Plugin state\n */\ninterface TemplatePluginState {\n tags: TemplateTag[];\n decorations: DecorationSet;\n hoveredId?: string;\n selectedId?: string;\n}\n\n/**\n * Regex to match template tags: {name}, {#name}, {/name}, {^name}, {@name}\n */\nconst TAG_REGEX = /\\{([#/^@]?)([a-zA-Z_][a-zA-Z0-9_]*(?:\\.[a-zA-Z_][a-zA-Z0-9_]*)*)\\}/g;\n\n/**\n * Plugin key\n */\nexport const templatePluginKey = new PluginKey<TemplatePluginState>('template');\n\n/**\n * Generate a stable tag ID based on content, not a counter.\n * This ensures React keys remain stable across re-parses,\n * preventing DOM destruction/recreation (which causes blinking).\n */\nfunction stableId(type: TagType, name: string, occurrence: number): string {\n return `${type}:${name}:${occurrence}`;\n}\n\n/**\n * Find all template tags in the document\n */\nfunction findTags(doc: ProseMirrorNode): TemplateTag[] {\n // Collect all text with positions\n const parts: { text: string; pos: number }[] = [];\n doc.descendants((node, pos) => {\n if (node.isText && node.text) {\n parts.push({ text: node.text, pos });\n }\n return true;\n });\n\n // Build combined text and position map\n let combined = '';\n const posMap: number[] = [];\n for (const p of parts) {\n for (let i = 0; i < p.text.length; i++) {\n posMap.push(p.pos + i);\n }\n combined += p.text;\n }\n\n // Find tags\n const tags: TemplateTag[] = [];\n const sectionStack: TemplateTag[] = [];\n const occurrences = new Map<string, number>();\n let match: RegExpExecArray | null;\n\n TAG_REGEX.lastIndex = 0;\n while ((match = TAG_REGEX.exec(combined)) !== null) {\n const [rawTag, prefix, name] = match;\n const from = posMap[match.index];\n const to = posMap[match.index + rawTag.length - 1] + 1;\n\n let type: TagType;\n if (prefix === '#') type = 'sectionStart';\n else if (prefix === '/') type = 'sectionEnd';\n else if (prefix === '^') type = 'invertedStart';\n else if (prefix === '@') type = 'raw';\n else type = 'variable';\n\n const key = `${type}:${name}`;\n const occ = occurrences.get(key) ?? 0;\n occurrences.set(key, occ + 1);\n\n const tag: TemplateTag = { id: stableId(type, name, occ), type, name, rawTag, from, to };\n\n // Track nested variables in sections\n if (type === 'sectionStart' || type === 'invertedStart') {\n tag.nestedVars = [];\n sectionStack.push(tag);\n } else if (type === 'sectionEnd') {\n // Pop matching section\n for (let i = sectionStack.length - 1; i >= 0; i--) {\n if (sectionStack[i].name === name) {\n sectionStack.splice(i, 1);\n break;\n }\n }\n } else if (type === 'variable' && sectionStack.length > 0) {\n // Add to nearest section's nested vars and mark as inside section\n const section = sectionStack[sectionStack.length - 1];\n section.nestedVars?.push(name);\n tag.insideSection = true;\n }\n\n tags.push(tag);\n }\n\n return tags;\n}\n\n/**\n * Get color for tag type\n */\nfunction getColor(type: TagType): string {\n switch (type) {\n case 'sectionStart':\n case 'sectionEnd':\n return '#3b82f6';\n case 'invertedStart':\n return '#8b5cf6';\n case 'raw':\n return '#ef4444';\n default:\n return '#f59e0b';\n }\n}\n\n/**\n * Create decorations for tags\n */\nfunction createDecorations(\n doc: ProseMirrorNode,\n tags: TemplateTag[],\n hoveredId?: string,\n selectedId?: string\n): DecorationSet {\n const decorations: Decoration[] = [];\n\n for (const tag of tags) {\n const isHovered = tag.id === hoveredId;\n const isSelected = tag.id === selectedId;\n const color = getColor(tag.type);\n\n const classes = ['docx-template-tag'];\n if (isHovered) classes.push('hovered');\n if (isSelected) classes.push('selected');\n\n decorations.push(\n Decoration.inline(tag.from, tag.to, {\n class: classes.join(' '),\n 'data-tag-id': tag.id,\n style: `background-color: ${color}22; border-radius: 2px;`,\n })\n );\n }\n\n return DecorationSet.create(doc, decorations);\n}\n\n/**\n * Compare two tag arrays for structural equality (same tag IDs in same order).\n * Position shifts (from/to) are expected during typing and don't count as structural changes.\n */\nfunction tagsStructureEqual(a: TemplateTag[], b: TemplateTag[]): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i].id !== b[i].id) return false;\n }\n return true;\n}\n\n/**\n * Create the template plugin\n */\nexport function createTemplatePlugin(): Plugin<TemplatePluginState> {\n return new Plugin<TemplatePluginState>({\n key: templatePluginKey,\n\n state: {\n init(_, state) {\n const tags = findTags(state.doc);\n return {\n tags,\n decorations: createDecorations(state.doc, tags),\n };\n },\n\n apply(tr, value, _oldState, newState) {\n // Re-parse on doc change\n if (tr.docChanged) {\n const newTags = findTags(newState.doc);\n\n // When tag structure is unchanged (same IDs, just shifted positions),\n // map existing decorations instead of rebuilding from scratch.\n // Tags still get updated positions for overlay rendering.\n const structureSame = tagsStructureEqual(value.tags, newTags);\n\n return {\n tags: newTags,\n decorations: structureSame\n ? value.decorations.map(tr.mapping, tr.doc)\n : createDecorations(newState.doc, newTags, value.hoveredId, value.selectedId),\n hoveredId: value.hoveredId,\n selectedId: value.selectedId,\n };\n }\n\n // Handle hover/select changes\n const meta = tr.getMeta(templatePluginKey);\n if (meta) {\n const newHovered = meta.hoveredId ?? value.hoveredId;\n const newSelected = meta.selectedId ?? value.selectedId;\n return {\n ...value,\n hoveredId: newHovered,\n selectedId: newSelected,\n decorations: createDecorations(newState.doc, value.tags, newHovered, newSelected),\n };\n }\n\n // Map decorations\n return {\n ...value,\n decorations: value.decorations.map(tr.mapping, tr.doc),\n };\n },\n },\n\n props: {\n decorations(state) {\n return templatePluginKey.getState(state)?.decorations ?? DecorationSet.empty;\n },\n\n handleClick(view: EditorView, pos: number) {\n const tags = templatePluginKey.getState(view.state)?.tags ?? [];\n const clicked = tags.find((t) => pos >= t.from && pos <= t.to);\n\n if (clicked) {\n view.dispatch(view.state.tr.setMeta(templatePluginKey, { selectedId: clicked.id }));\n return true;\n }\n\n const current = templatePluginKey.getState(view.state)?.selectedId;\n if (current) {\n view.dispatch(view.state.tr.setMeta(templatePluginKey, { selectedId: undefined }));\n }\n return false;\n },\n\n handleDOMEvents: {\n mouseover(view: EditorView, event) {\n const el = (event.target as HTMLElement).closest?.('[data-tag-id]');\n const id = el?.getAttribute('data-tag-id') || undefined;\n const current = templatePluginKey.getState(view.state)?.hoveredId;\n\n if (id !== current) {\n view.dispatch(view.state.tr.setMeta(templatePluginKey, { hoveredId: id }));\n }\n return false;\n },\n\n mouseout(view: EditorView, event: MouseEvent) {\n const related = event.relatedTarget as HTMLElement;\n if (!related?.closest?.('[data-tag-id]')) {\n const current = templatePluginKey.getState(view.state)?.hoveredId;\n if (current) {\n view.dispatch(view.state.tr.setMeta(templatePluginKey, { hoveredId: undefined }));\n }\n }\n return false;\n },\n },\n },\n });\n}\n\n/**\n * Get tags from editor state\n */\nexport function getTemplateTags(state: import('prosemirror-state').EditorState): TemplateTag[] {\n return templatePluginKey.getState(state)?.tags ?? [];\n}\n\n/**\n * Set hovered tag\n */\nexport function setHoveredElement(view: EditorView, id: string | undefined): void {\n view.dispatch(view.state.tr.setMeta(templatePluginKey, { hoveredId: id }));\n}\n\n/**\n * Set selected tag\n */\nexport function setSelectedElement(view: EditorView, id: string | undefined): void {\n view.dispatch(view.state.tr.setMeta(templatePluginKey, { selectedId: id }));\n}\n\n/**\n * CSS styles for template decorations\n */\nexport const TEMPLATE_DECORATION_STYLES = `\n.docx-template-tag {\n cursor: pointer;\n transition: background-color 0.1s;\n}\n\n.docx-template-tag:hover,\n.docx-template-tag.hovered {\n filter: brightness(0.95);\n}\n\n.docx-template-tag.selected {\n box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.5);\n}\n`;\n","/**\n * Annotation Panel Component\n *\n * Displays template tags anchored to their positions in the document.\n */\n\nimport { useMemo, useEffect, useState, useRef, useCallback } from 'react';\nimport { TextSelection } from 'prosemirror-state';\nimport type { PluginPanelProps } from '../../../plugin-api/types';\nimport type { TemplateTag, TagType } from '../prosemirror-plugin';\nimport { setHoveredElement, setSelectedElement } from '../prosemirror-plugin';\n\ninterface PluginState {\n tags: TemplateTag[];\n hoveredId?: string;\n selectedId?: string;\n}\n\nexport interface AnnotationPanelProps extends PluginPanelProps<PluginState> {}\n\ninterface TagPosition {\n tag: TemplateTag;\n top: number;\n}\n\n/** Colors for tag types */\nconst COLORS: Record<TagType, string> = {\n variable: '#f59e0b',\n sectionStart: '#3b82f6',\n sectionEnd: '#3b82f6',\n invertedStart: '#8b5cf6',\n raw: '#ef4444',\n};\n\n/** Labels for tag types */\nfunction getLabel(type: TagType): string {\n switch (type) {\n case 'sectionStart':\n return 'LOOP / IF';\n case 'invertedStart':\n return 'IF NOT';\n case 'raw':\n return 'HTML';\n default:\n return '';\n }\n}\n\nexport function AnnotationPanel({\n editorView,\n pluginState,\n renderedDomContext,\n}: AnnotationPanelProps) {\n const tags = pluginState?.tags ?? [];\n const hoveredId = pluginState?.hoveredId;\n const selectedId = pluginState?.selectedId;\n\n const [layoutVersion, setLayoutVersion] = useState(0);\n const containerRef = useRef<HTMLDivElement>(null);\n const chipRefs = useRef<Map<string, HTMLDivElement>>(new Map());\n // Cache last known good positions so chips never disappear during layout transitions\n const lastPositionsRef = useRef<TagPosition[]>([]);\n\n // Filter to show only variables and section starts (not ends or vars inside sections)\n const visibleTags = useMemo(() => {\n return tags.filter((t) => t.type !== 'sectionEnd' && !t.insideSection);\n }, [tags]);\n\n // Compute positions synchronously to avoid blank-frame blink\n const computePositions = useCallback((): TagPosition[] => {\n if (visibleTags.length === 0 || !renderedDomContext) {\n return lastPositionsRef.current;\n }\n\n const newPositions: TagPosition[] = [];\n const containerOffset = renderedDomContext.getContainerOffset();\n // Build lookup of last known positions by tag ID\n const lastPosMap = new Map<string, number>();\n for (const pos of lastPositionsRef.current) {\n lastPosMap.set(pos.tag.id, pos.top);\n }\n\n for (const tag of visibleTags) {\n const rects = renderedDomContext.getRectsForRange(tag.from, tag.from + 1);\n if (rects.length > 0) {\n const top = rects[0].y + containerOffset.y - 40;\n newPositions.push({ tag, top });\n } else {\n // Fallback: keep last known position so chip doesn't disappear\n const lastTop = lastPosMap.get(tag.id);\n if (lastTop !== undefined) {\n newPositions.push({ tag, top: lastTop });\n }\n }\n }\n\n // Sort and prevent overlaps using measured heights\n newPositions.sort((a, b) => a.top - b.top);\n const minGap = 6;\n\n for (let i = 1; i < newPositions.length; i++) {\n const prev = newPositions[i - 1];\n const curr = newPositions[i];\n\n const prevChipEl = chipRefs.current.get(prev.tag.id);\n let prevHeight = 32;\n if (prevChipEl) {\n prevHeight = prevChipEl.offsetHeight;\n } else if (prev.tag.nestedVars && prev.tag.nestedVars.length > 0) {\n prevHeight = 32 + 10 + prev.tag.nestedVars.length * 26;\n }\n\n if (curr.top < prev.top + prevHeight + minGap) {\n curr.top = prev.top + prevHeight + minGap;\n }\n }\n\n lastPositionsRef.current = newPositions;\n return newPositions;\n }, [visibleTags, renderedDomContext]);\n\n const positions = useMemo(() => computePositions(), [computePositions, layoutVersion]);\n\n // ResizeObserver for zoom/layout changes\n useEffect(() => {\n if (!renderedDomContext) return;\n\n const observer = new ResizeObserver(() => {\n requestAnimationFrame(() => setLayoutVersion((v) => v + 1));\n });\n observer.observe(renderedDomContext.pagesContainer);\n return () => observer.disconnect();\n }, [renderedDomContext]);\n\n // Window resize handler\n useEffect(() => {\n const handleResize = () => {\n requestAnimationFrame(() => setLayoutVersion((v) => v + 1));\n };\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n // Second pass: recalculate once after initial render to use measured chip heights\n const lastMeasuredTagsKey = useRef<string>('');\n useEffect(() => {\n const tagsKey = visibleTags.map((t) => t.id).join(',');\n if (tagsKey && lastMeasuredTagsKey.current !== tagsKey) {\n const timer = setTimeout(() => {\n lastMeasuredTagsKey.current = tagsKey;\n setLayoutVersion((v) => v + 1);\n }, 50);\n return () => clearTimeout(timer);\n }\n }, [visibleTags]);\n\n const handleHover = (id: string | undefined) => {\n if (editorView) setHoveredElement(editorView, id);\n };\n\n const handleClick = (tag: TemplateTag) => {\n if (!editorView) return;\n setSelectedElement(editorView, tag.id);\n // Select the tag in editor\n const { state } = editorView;\n const tr = state.tr.setSelection(TextSelection.near(state.doc.resolve(tag.from)));\n editorView.dispatch(tr);\n editorView.focus();\n };\n\n if (visibleTags.length === 0) return null;\n\n return (\n <div className=\"template-panel\" ref={containerRef}>\n <div className=\"template-panel-annotations\">\n {positions.map(({ tag, top }) => {\n const label = getLabel(tag.type);\n const color = COLORS[tag.type];\n const isSection = tag.type === 'sectionStart' || tag.type === 'invertedStart';\n const isHovered = tag.id === hoveredId;\n const isSelected = tag.id === selectedId;\n\n return (\n <div key={tag.id} className=\"template-annotation-anchor\" style={{ top: `${top}px` }}>\n <div className=\"template-annotation-connector\" />\n <div\n ref={(el) => {\n if (el) chipRefs.current.set(tag.id, el);\n else chipRefs.current.delete(tag.id);\n }}\n className={`template-annotation-chip ${isHovered ? 'hovered' : ''} ${isSelected ? 'selected' : ''}`}\n style={{ borderLeftColor: color }}\n onMouseEnter={() => handleHover(tag.id)}\n onMouseLeave={() => handleHover(undefined)}\n onClick={() => handleClick(tag)}\n title={\n isSection\n ? `${tag.rawTag}\\nIterates over ${tag.name}[]. Access nested properties via ${tag.name}.property`\n : tag.rawTag\n }\n >\n {label && (\n <span className=\"template-chip-badge\" style={{ background: color }}>\n {label}\n </span>\n )}\n {!label && (\n <span className=\"template-chip-dot\" style={{ color }}>\n ●\n </span>\n )}\n <span className=\"template-chip-name\">{tag.name}</span>\n\n {isSection && tag.nestedVars && tag.nestedVars.length > 0 && (\n <div className=\"template-chip-nested\">\n {tag.nestedVars.map((v, i) => (\n <span\n key={i}\n className=\"template-nested-var\"\n title={`Access: ${tag.name}.${v}`}\n >\n {v.includes('.') ? v.split('.').pop() : v}\n </span>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nexport const ANNOTATION_PANEL_STYLES = `\n.template-panel {\n display: flex;\n min-height: 100%;\n background: transparent;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n position: relative;\n}\n\n.template-panel-annotations {\n flex: 1;\n position: relative;\n overflow: visible;\n min-height: 100%;\n pointer-events: none;\n will-change: transform;\n}\n\n.template-panel-annotations > * {\n pointer-events: auto;\n}\n\n.template-annotation-anchor {\n position: absolute;\n left: 0;\n right: 0;\n display: flex;\n align-items: flex-start;\n transition: top 0.15s ease-out;\n}\n\n.template-annotation-connector {\n width: 20px;\n height: 1px;\n background: #d0d0d0;\n margin-top: 12px;\n margin-right: 4px;\n flex-shrink: 0;\n}\n\n.template-annotation-anchor:hover .template-annotation-connector {\n background: #3b82f6;\n}\n\n.template-annotation-chip {\n display: inline-flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 4px;\n padding: 5px 10px;\n background: white;\n border: 1px solid #e2e8f0;\n border-left: 3px solid #6c757d;\n border-radius: 4px;\n font-size: 11px;\n cursor: pointer;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);\n max-width: 200px;\n}\n\n.template-annotation-chip:hover,\n.template-annotation-chip.hovered {\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);\n border-color: #cbd5e1;\n}\n\n.template-annotation-chip.selected {\n box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.5);\n}\n\n.template-chip-badge {\n font-size: 9px;\n font-weight: 600;\n padding: 1px 5px;\n border-radius: 3px;\n color: white;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.template-chip-dot {\n font-size: 8px;\n}\n\n.template-chip-name {\n color: #334155;\n font-weight: 500;\n}\n\n.template-chip-nested {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n width: 100%;\n margin-top: 4px;\n padding-top: 4px;\n border-top: 1px solid rgba(0, 0, 0, 0.06);\n}\n\n.template-nested-var {\n font-size: 10px;\n color: #64748b;\n background: rgba(0, 0, 0, 0.04);\n padding: 2px 6px;\n border-radius: 3px;\n}\n\n.template-nested-var:hover {\n background: rgba(59, 130, 246, 0.15);\n color: #1e40af;\n}\n`;\n","/**\n * Template Highlight Overlay Component\n *\n * Renders highlight rectangles for template tags on the visible pages.\n * Uses RenderedDomContext to get accurate positioning.\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport type { RenderedDomContext } from '../../../plugin-api/types';\nimport type { TemplateTag, TagType } from '../prosemirror-plugin';\n\ninterface TemplateHighlightOverlayProps {\n context: RenderedDomContext;\n tags: TemplateTag[];\n hoveredId?: string;\n selectedId?: string;\n onHover?: (id: string | undefined) => void;\n onSelect?: (id: string) => void;\n}\n\n/** Colors for tag types (matching AnnotationPanel) */\nconst HIGHLIGHT_COLORS: Record<TagType, string> = {\n variable: 'rgba(245, 158, 11, 0.3)',\n sectionStart: 'rgba(59, 130, 246, 0.3)',\n sectionEnd: 'rgba(59, 130, 246, 0.3)',\n invertedStart: 'rgba(139, 92, 246, 0.3)',\n raw: 'rgba(239, 68, 68, 0.3)',\n};\n\nconst HOVER_COLORS: Record<TagType, string> = {\n variable: 'rgba(245, 158, 11, 0.5)',\n sectionStart: 'rgba(59, 130, 246, 0.5)',\n sectionEnd: 'rgba(59, 130, 246, 0.5)',\n invertedStart: 'rgba(139, 92, 246, 0.5)',\n raw: 'rgba(239, 68, 68, 0.5)',\n};\n\ninterface HighlightRect {\n tagId: string;\n tagType: TagType;\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport function TemplateHighlightOverlay({\n context,\n tags,\n hoveredId,\n selectedId,\n onHover,\n onSelect,\n}: TemplateHighlightOverlayProps) {\n // Version counter bumped by resize/layout changes to trigger recompute\n const [layoutVersion, setLayoutVersion] = useState(0);\n\n // Compute highlight rectangles synchronously during render (no blank frames)\n const computeHighlights = useCallback((): HighlightRect[] => {\n const containerOffset = context.getContainerOffset();\n const rects: HighlightRect[] = [];\n\n for (const tag of tags) {\n const tagRects = context.getRectsForRange(tag.from, tag.to);\n for (const rect of tagRects) {\n rects.push({\n tagId: tag.id,\n tagType: tag.type,\n x: rect.x + containerOffset.x,\n y: rect.y + containerOffset.y,\n width: rect.width,\n height: rect.height,\n });\n }\n }\n\n return rects;\n }, [context, tags]);\n\n // Compute synchronously — no useEffect gap that causes blinking\n\n const highlights = useMemo(() => computeHighlights(), [computeHighlights, layoutVersion]);\n\n // Recompute on window resize\n useEffect(() => {\n const handleResize = () => {\n requestAnimationFrame(() => setLayoutVersion((v) => v + 1));\n };\n\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n // Also observe the pagesContainer for size changes (zoom, layout changes)\n useEffect(() => {\n const observer = new ResizeObserver(() => {\n requestAnimationFrame(() => setLayoutVersion((v) => v + 1));\n });\n observer.observe(context.pagesContainer);\n return () => observer.disconnect();\n }, [context.pagesContainer]);\n\n // Show all highlights, with enhanced styling for hovered/selected\n if (highlights.length === 0) {\n return null;\n }\n\n return (\n <div className=\"template-highlight-overlay\">\n {highlights.map((rect, index) => {\n const isHovered = rect.tagId === hoveredId;\n const isSelected = rect.tagId === selectedId;\n const color =\n isHovered || isSelected ? HOVER_COLORS[rect.tagType] : HIGHLIGHT_COLORS[rect.tagType];\n\n return (\n <div\n key={`${rect.tagId}-${index}`}\n className={`template-highlight ${isHovered ? 'hovered' : ''} ${isSelected ? 'selected' : ''}`}\n style={{\n position: 'absolute',\n left: rect.x,\n top: rect.y,\n width: rect.width,\n height: rect.height,\n backgroundColor: color,\n borderRadius: 2,\n cursor: 'pointer',\n }}\n onMouseEnter={() => onHover?.(rect.tagId)}\n onMouseLeave={() => onHover?.(undefined)}\n onClick={() => onSelect?.(rect.tagId)}\n />\n );\n })}\n </div>\n );\n}\n\nexport const TEMPLATE_HIGHLIGHT_OVERLAY_STYLES = `\n.template-highlight-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n overflow: visible;\n}\n\n.template-highlight {\n pointer-events: auto;\n transition: background-color 0.1s ease;\n}\n\n.template-highlight:hover,\n.template-highlight.hovered {\n filter: brightness(0.9);\n}\n\n.template-highlight.selected {\n box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.6);\n}\n`;\n","/**\n * Template Plugin\n *\n * Docxtemplater template support as a plugin for the DOCX Editor.\n *\n * Features:\n * - Full docxtemplater syntax detection (variables, loops, conditionals)\n * - Schema annotation panel showing template structure\n * - Differentiated visual highlighting by element type\n *\n * @example\n * ```tsx\n * import { PluginHost } from '@docx-editor/plugin-api';\n * import { templatePlugin } from '@docx-editor/plugins/template';\n *\n * function MyEditor() {\n * return (\n * <PluginHost plugins={[templatePlugin]}>\n * <DocxEditor document={doc} onChange={handleChange} />\n * </PluginHost>\n * );\n * }\n * ```\n */\n\nimport React from 'react';\nimport { TextSelection } from 'prosemirror-state';\nimport type { ReactEditorPlugin, RenderedDomContext } from '../../plugin-api/types';\nimport type { EditorView } from 'prosemirror-view';\nimport type { TemplateTag } from './prosemirror-plugin';\nimport {\n createTemplatePlugin,\n templatePluginKey,\n setHoveredElement,\n setSelectedElement,\n TEMPLATE_DECORATION_STYLES,\n} from './prosemirror-plugin';\nimport { AnnotationPanel, ANNOTATION_PANEL_STYLES } from './components/AnnotationPanel';\nimport type { AnnotationPanelProps } from './components/AnnotationPanel';\nimport {\n TemplateHighlightOverlay,\n TEMPLATE_HIGHLIGHT_OVERLAY_STYLES,\n} from './components/TemplateHighlightOverlay';\n\n/**\n * Memoized AnnotationPanel that only re-renders when tag structure\n * or hover/selected state changes — not on every keystroke position shift.\n */\nconst MemoizedAnnotationPanel = React.memo<AnnotationPanelProps>(AnnotationPanel, (prev, next) => {\n const prevState = prev.pluginState;\n const nextState = next.pluginState;\n\n // Re-render if hover/selected changed\n if (prevState?.hoveredId !== nextState?.hoveredId) return false;\n if (prevState?.selectedId !== nextState?.selectedId) return false;\n\n // Re-render if tag structure changed (different count or IDs)\n const prevTags = prevState?.tags ?? [];\n const nextTags = nextState?.tags ?? [];\n if (prevTags.length !== nextTags.length) return false;\n for (let i = 0; i < prevTags.length; i++) {\n if (prevTags[i].id !== nextTags[i].id) return false;\n }\n\n // Re-render if rendered DOM context changed (initial load)\n if (prev.renderedDomContext !== next.renderedDomContext) return false;\n\n // Otherwise skip re-render (positions shifted but structure is the same)\n return true;\n});\n\n/**\n * Plugin state interface\n */\ninterface TemplatePluginState {\n tags: TemplateTag[];\n hoveredId?: string;\n selectedId?: string;\n}\n\n/**\n * Create the template plugin instance.\n *\n * @param options - Plugin configuration options\n */\nexport function createPlugin(\n options: {\n /** Initial panel collapsed state */\n defaultCollapsed?: boolean;\n\n /** Panel position */\n panelPosition?: 'left' | 'right';\n\n /** Panel default width */\n panelWidth?: number;\n } = {}\n): ReactEditorPlugin<TemplatePluginState> {\n // Create the ProseMirror plugin\n const pmPlugin = createTemplatePlugin();\n\n return {\n id: 'template',\n name: 'Template',\n\n proseMirrorPlugins: [pmPlugin],\n\n Panel: MemoizedAnnotationPanel,\n\n panelConfig: {\n position: options.panelPosition ?? 'right',\n defaultSize: options.panelWidth ?? 280,\n minSize: 200,\n maxSize: 400,\n resizable: true,\n collapsible: true,\n defaultCollapsed: options.defaultCollapsed ?? false,\n },\n\n onStateChange: (view: EditorView): TemplatePluginState | undefined => {\n const pluginState = templatePluginKey.getState(view.state);\n if (!pluginState) return undefined;\n\n return {\n tags: pluginState.tags,\n hoveredId: pluginState.hoveredId,\n selectedId: pluginState.selectedId,\n };\n },\n\n initialize: (_view: EditorView | null): TemplatePluginState => {\n return {\n tags: [],\n };\n },\n\n renderOverlay: (\n context: RenderedDomContext,\n state: TemplatePluginState | undefined,\n editorView: EditorView | null\n ): React.ReactNode => {\n if (!state || state.tags.length === 0) {\n return null;\n }\n\n return React.createElement(TemplateHighlightOverlay, {\n context,\n tags: state.tags,\n hoveredId: state.hoveredId,\n selectedId: state.selectedId,\n onHover: (id: string | undefined) => {\n if (editorView) setHoveredElement(editorView, id);\n },\n onSelect: (id: string) => {\n if (editorView) {\n setSelectedElement(editorView, id);\n // Find the tag and scroll to it\n const tag = state.tags.find((t) => t.id === id);\n if (tag) {\n const tr = editorView.state.tr.setSelection(\n TextSelection.near(editorView.state.doc.resolve(tag.from))\n );\n editorView.dispatch(tr);\n editorView.focus();\n }\n }\n },\n });\n },\n\n styles: `\n${TEMPLATE_DECORATION_STYLES}\n${ANNOTATION_PANEL_STYLES}\n${TEMPLATE_HIGHLIGHT_OVERLAY_STYLES}\n`,\n };\n}\n\n/**\n * Default template plugin instance.\n * Use this for quick setup without custom configuration.\n */\nexport const templatePlugin = createPlugin();\n\n// Re-export types and utilities from prosemirror-plugin\nexport type { TemplateTag, TagType } from './prosemirror-plugin';\nexport {\n createTemplatePlugin,\n templatePluginKey,\n getTemplateTags,\n setHoveredElement,\n setSelectedElement,\n TEMPLATE_DECORATION_STYLES,\n} from './prosemirror-plugin';\n\nexport { AnnotationPanel, ANNOTATION_PANEL_STYLES } from './components/AnnotationPanel';\n","/**\n * @eigenpal/docx-js-editor\n *\n * A complete WYSIWYG DOCX editor with full Microsoft Word fidelity.\n *\n * Features:\n * - Full text and paragraph formatting\n * - Tables, images, shapes, text boxes\n * - Hyperlinks, bookmarks, fields\n * - Footnotes, lists, headers/footers\n * - Page layout with margins and columns\n * - DocumentAgent API for programmatic editing\n * - Template variable substitution\n * - AI-powered context menu\n *\n * CSS Styles:\n * For optimal cursor visibility and selection highlighting, import the editor styles:\n * ```\n * import '@eigenpal/docx-js-editor/styles/editor.css';\n * ```\n */\n\n// ============================================================================\n// VERSION\n// ============================================================================\n\nexport const VERSION = '0.0.2';\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\nexport { DocxEditor, type DocxEditorProps, type DocxEditorRef } from './components/DocxEditor';\nexport { renderAsync, type RenderAsyncOptions, type DocxEditorHandle } from './renderAsync';\nexport { type DocxInput, toArrayBuffer } from '@eigenpal/docx-core/utils/docxInput';\n\n// ============================================================================\n// AGENT API\n// ============================================================================\n\nexport { DocumentAgent } from '@eigenpal/docx-core/agent/DocumentAgent';\nexport { executeCommand, executeCommands } from '@eigenpal/docx-core/agent/executor';\nexport {\n getAgentContext,\n getDocumentSummary,\n type AgentContextOptions,\n} from '@eigenpal/docx-core/agent/context';\nexport {\n buildSelectionContext,\n buildExtendedSelectionContext,\n type SelectionContextOptions,\n type ExtendedSelectionContext,\n} from '@eigenpal/docx-core/agent/selectionContext';\n\n// ============================================================================\n// PARSER / SERIALIZER\n// ============================================================================\n\nexport { parseDocx } from '@eigenpal/docx-core/docx/parser';\nexport {\n serializeDocument as serializeDocx,\n serializeDocumentBody,\n serializeSectionProperties,\n} from '@eigenpal/docx-core/docx/serializer/documentSerializer';\nexport {\n processTemplate,\n processTemplateDetailed,\n processTemplateAsBlob,\n getTemplateTags,\n validateTemplate,\n type ProcessTemplateOptions,\n type ProcessTemplateResult,\n} from '@eigenpal/docx-core/utils/processTemplate';\n\n// ============================================================================\n// DOCUMENT CREATION\n// ============================================================================\n\nexport {\n createEmptyDocument,\n createDocumentWithText,\n type CreateEmptyDocumentOptions,\n} from '@eigenpal/docx-core/utils/createDocument';\n\n// ============================================================================\n// FONT LOADER\n// ============================================================================\n\nexport {\n loadFont,\n loadFonts,\n loadFontFromBuffer,\n isFontLoaded,\n isLoading as isFontsLoading,\n getLoadedFonts,\n onFontsLoaded,\n canRenderFont,\n preloadCommonFonts,\n} from '@eigenpal/docx-core/utils/fontLoader';\n\n// ============================================================================\n// UI COMPONENTS\n// ============================================================================\n\nexport {\n Toolbar,\n type ToolbarProps,\n ToolbarButton,\n ToolbarGroup,\n ToolbarSeparator,\n} from './components/Toolbar';\nexport {\n ContextMenu,\n type ContextMenuProps,\n useContextMenu,\n getActionShortcut,\n isActionAvailable,\n getDefaultActions,\n getAllActions,\n} from './components/ContextMenu';\nexport {\n ResponsePreview,\n type ResponsePreviewProps,\n useResponsePreview,\n type ResponsePreviewState,\n createMockResponse,\n createErrorResponse,\n} from './components/ResponsePreview';\nexport {\n TextContextMenu,\n type TextContextMenuProps,\n type TextContextAction,\n type TextContextMenuItem,\n type UseTextContextMenuOptions,\n type UseTextContextMenuReturn,\n useTextContextMenu,\n getTextActionLabel,\n getTextActionShortcut,\n getDefaultTextContextMenuItems,\n isTextActionAvailable,\n} from './components/TextContextMenu';\n\n// ============================================================================\n// ERROR HANDLING\n// ============================================================================\n\nexport {\n ErrorBoundary,\n type ErrorBoundaryProps,\n ErrorProvider,\n useErrorNotifications,\n type ErrorContextValue,\n type ErrorNotification,\n type ErrorSeverity,\n ParseErrorDisplay,\n type ParseErrorDisplayProps,\n UnsupportedFeatureWarning,\n type UnsupportedFeatureWarningProps,\n isParseError,\n getUserFriendlyMessage,\n} from './components/ErrorBoundary';\n\n// ============================================================================\n// UI CONTROLS\n// ============================================================================\n\nexport { ZoomControl, type ZoomControlProps } from './components/ui/ZoomControl';\nexport {\n PageNumberIndicator,\n type PageNumberIndicatorProps,\n type PageIndicatorPosition,\n type PageIndicatorVariant,\n formatPageOrdinal,\n createPageFormat,\n getPageProgress,\n isFirstPage,\n isLastPage,\n calculateVisiblePage,\n calculateScrollToPage,\n} from './components/ui/PageNumberIndicator';\nexport {\n PageNavigator,\n type PageNavigatorProps,\n type PageNavigatorPosition,\n type PageNavigatorVariant,\n parsePageInput,\n isValidPageNumber,\n clampPageNumber,\n getNavigationShortcuts,\n formatPageRange,\n calculateProgress,\n} from './components/ui/PageNavigator';\nexport { FontPicker, type FontPickerProps, type FontOption } from './components/ui/FontPicker';\nexport { FontSizePicker, type FontSizePickerProps } from './components/ui/FontSizePicker';\nexport {\n LineSpacingPicker,\n type LineSpacingPickerProps,\n type LineSpacingOption,\n} from './components/ui/LineSpacingPicker';\nexport { ColorPicker, type ColorPickerProps, type ColorOption } from './components/ui/ColorPicker';\nexport { StylePicker, type StylePickerProps, type StyleOption } from './components/ui/StylePicker';\nexport { AlignmentButtons, type AlignmentButtonsProps } from './components/ui/AlignmentButtons';\nexport {\n ListButtons,\n type ListButtonsProps,\n type ListState,\n createDefaultListState,\n} from './components/ui/ListButtons';\nexport {\n TableToolbar,\n type TableToolbarProps,\n type TableContext,\n type TableSelection,\n type TableAction,\n createTableContext,\n addRow,\n deleteRow,\n addColumn,\n deleteColumn,\n mergeCells,\n splitCell,\n getColumnCount,\n getCellAt,\n} from './components/ui/TableToolbar';\nexport {\n HorizontalRuler,\n type HorizontalRulerProps,\n getRulerDimensions,\n getMarginInUnits,\n parseMarginFromUnits,\n positionToMargin,\n} from './components/ui/HorizontalRuler';\nexport {\n PrintButton,\n type PrintButtonProps,\n PrintStyles,\n type PrintOptions,\n triggerPrint,\n openPrintWindow,\n getDefaultPrintOptions,\n parsePageRange,\n formatPageRange as formatPrintPageRange,\n isPrintSupported,\n} from './components/ui/PrintPreview';\nexport { TableBorderPicker, type TableBorderPickerProps } from './components/ui/TableBorderPicker';\nexport {\n TableBorderColorPicker,\n type TableBorderColorPickerProps,\n} from './components/ui/TableBorderColorPicker';\nexport {\n TableBorderWidthPicker,\n type TableBorderWidthPickerProps,\n} from './components/ui/TableBorderWidthPicker';\nexport {\n TableCellFillPicker,\n type TableCellFillPickerProps,\n} from './components/ui/TableCellFillPicker';\nexport { TableMergeButton, type TableMergeButtonProps } from './components/ui/TableMergeButton';\nexport {\n TableInsertButtons,\n type TableInsertButtonsProps,\n} from './components/ui/TableInsertButtons';\nexport { TableMoreDropdown, type TableMoreDropdownProps } from './components/ui/TableMoreDropdown';\nexport {\n CellBackgroundPicker,\n type CellBackgroundPickerProps,\n type CellColorOption,\n getDefaultCellColors,\n createCellColorOption,\n isDefaultCellColor,\n getCellColorName,\n createShadingFromColor,\n getColorFromShading,\n getContrastingTextColor,\n DEFAULT_CELL_COLORS,\n} from './components/ui/CellBackgroundPicker';\nexport {\n UnsavedIndicator,\n type UnsavedIndicatorProps,\n type IndicatorVariant,\n type IndicatorPosition,\n type UseUnsavedChangesOptions,\n type UseUnsavedChangesReturn,\n useUnsavedChanges,\n getVariantLabel,\n getAllVariants as getAllIndicatorVariants,\n getAllPositions as getAllIndicatorPositions,\n createChangeTracker,\n} from './components/ui/UnsavedIndicator';\nexport {\n LoadingIndicator,\n type LoadingIndicatorProps,\n type LoadingVariant,\n type LoadingSize,\n type UseLoadingOptions,\n type UseLoadingReturn,\n type LoadingOperation,\n useLoading,\n useLoadingOperations,\n getLoadingVariantLabel,\n getAllLoadingVariants,\n getAllLoadingSizes,\n delay,\n} from './components/ui/LoadingIndicator';\nexport {\n ResponsiveToolbar,\n type ResponsiveToolbarProps,\n type ToolbarItem,\n type ToolbarItemPriority,\n type UseResponsiveToolbarOptions,\n type UseResponsiveToolbarReturn,\n ToolbarGroup as ResponsiveToolbarGroup,\n type ToolbarGroupProps as ResponsiveToolbarGroupProps,\n useResponsiveToolbar,\n createToolbarItem,\n createToolbarItems,\n getRecommendedPriority,\n} from './components/ui/ResponsiveToolbar';\n\n// ============================================================================\n// DIALOGS\n// ============================================================================\n\nexport {\n FindReplaceDialog,\n type FindReplaceDialogProps,\n type FindReplaceOptions,\n type FindOptions,\n type FindMatch,\n type FindResult,\n type FindReplaceState,\n type UseFindReplaceReturn,\n useFindReplace,\n findInDocument,\n findInParagraph,\n findAllMatches,\n scrollToMatch,\n createDefaultFindOptions,\n createSearchPattern,\n replaceAllInContent,\n replaceFirstInContent,\n getMatchCountText,\n isEmptySearch,\n escapeRegexString,\n getDefaultHighlightOptions,\n type HighlightOptions,\n} from './components/dialogs/FindReplaceDialog';\nexport {\n HyperlinkDialog,\n type HyperlinkDialogProps,\n type HyperlinkData,\n useHyperlinkDialog,\n} from './components/dialogs/HyperlinkDialog';\nexport {\n InsertTableDialog,\n type InsertTableDialogProps,\n type TableConfig,\n useInsertTableDialog,\n createDefaultTableConfig,\n isValidTableConfig,\n clampTableConfig,\n formatTableDimensions,\n getTablePresets,\n} from './components/dialogs/InsertTableDialog';\nexport {\n InsertImageDialog,\n type InsertImageDialogProps,\n type ImageData,\n useInsertImageDialog,\n isValidImageFile,\n getSupportedImageExtensions,\n getImageAcceptString,\n calculateFitDimensions,\n dataUrlToBlob,\n getImageDimensions,\n formatFileSize,\n} from './components/dialogs/InsertImageDialog';\nexport {\n InsertSymbolDialog,\n type InsertSymbolDialogProps,\n type SymbolCategory,\n useInsertSymbolDialog,\n getSymbolCategories,\n getSymbolsByCategory,\n getSymbolInfo as getSymbolUnicodeInfo,\n searchSymbols,\n symbolFromCodePoint,\n SYMBOL_CATEGORIES,\n} from './components/dialogs/InsertSymbolDialog';\nexport {\n PasteSpecialDialog,\n type PasteSpecialDialogProps,\n type PasteOption,\n type UsePasteSpecialReturn,\n type UsePasteSpecialOptions,\n usePasteSpecial,\n getPasteOption,\n getAllPasteOptions,\n getDefaultPasteOption,\n isPasteSpecialShortcut,\n} from './components/dialogs/PasteSpecialDialog';\nexport {\n KeyboardShortcutsDialog,\n type KeyboardShortcutsDialogProps,\n type KeyboardShortcut as DialogKeyboardShortcut,\n type ShortcutCategory,\n type UseKeyboardShortcutsDialogOptions,\n type UseKeyboardShortcutsDialogReturn,\n useKeyboardShortcutsDialog,\n getDefaultShortcuts,\n getShortcutsByCategory,\n getCommonShortcuts,\n getCategoryLabel,\n getAllCategories,\n formatShortcutKeys,\n} from './components/dialogs/KeyboardShortcutsDialog';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n// Document types\nexport type {\n Document,\n DocxPackage,\n DocumentBody,\n BlockContent,\n Paragraph,\n Run,\n RunContent,\n TextContent,\n Table,\n TableRow,\n TableCell,\n Image,\n Shape,\n TextBox,\n Hyperlink,\n BookmarkStart,\n BookmarkEnd,\n Field,\n Theme,\n ThemeColorScheme,\n ThemeFont,\n ThemeFontScheme,\n Style,\n StyleDefinitions,\n TextFormatting,\n ParagraphFormatting,\n SectionProperties,\n HeaderFooter,\n HeaderReference,\n FooterReference,\n Footnote,\n Endnote,\n ListLevel,\n NumberingDefinitions,\n Relationship,\n} from '@eigenpal/docx-core/types/document';\n\n// Agent API types\nexport type {\n AIAction,\n AIActionRequest,\n AgentResponse,\n AgentContext,\n SelectionContext,\n Range,\n Position,\n ParagraphContext,\n SuggestedAction,\n AgentCommand,\n InsertTextCommand,\n ReplaceTextCommand,\n DeleteTextCommand,\n FormatTextCommand,\n InsertTableCommand,\n InsertImageCommand,\n InsertHyperlinkCommand,\n SetVariableCommand,\n ApplyStyleCommand,\n} from '@eigenpal/docx-core/types/agentApi';\n\n// ============================================================================\n// HOOKS\n// ============================================================================\n\nexport {\n useTableSelection,\n TABLE_DATA_ATTRIBUTES,\n type TableSelectionState,\n type UseTableSelectionReturn,\n type UseTableSelectionOptions,\n} from './hooks/useTableSelection';\n\nexport {\n useAutoSave,\n formatLastSaveTime,\n getAutoSaveStatusLabel,\n getAutoSaveStorageSize,\n formatStorageSize,\n isAutoSaveSupported,\n type AutoSaveStatus,\n type UseAutoSaveOptions,\n type UseAutoSaveReturn,\n type SavedDocumentData,\n} from './hooks/useAutoSave';\n\nexport {\n useWheelZoom,\n getZoomPresets,\n findNearestZoomPreset,\n getNextZoomPreset,\n getPreviousZoomPreset,\n formatZoom,\n parseZoom,\n isZoomPreset,\n clampZoom,\n ZOOM_PRESETS,\n type UseWheelZoomOptions,\n type UseWheelZoomReturn,\n} from './hooks/useWheelZoom';\n\n// ============================================================================\n// UTILITIES\n// ============================================================================\n\nexport {\n twipsToPixels,\n pixelsToTwips,\n formatPx,\n emuToPixels,\n pointsToPixels,\n halfPointsToPixels,\n pixelsToEmu,\n emuToTwips,\n twipsToEmu,\n} from '@eigenpal/docx-core/utils/units';\nexport {\n resolveColor,\n resolveHighlightColor,\n resolveShadingColor,\n parseColorString,\n createThemeColor,\n createRgbColor,\n darkenColor,\n lightenColor,\n blendColors,\n getContrastingColor,\n isBlack,\n isWhite,\n colorsEqual,\n} from '@eigenpal/docx-core/utils/colorResolver';\nexport {\n createPageBreak,\n createColumnBreak,\n createLineBreak,\n createPageBreakRun,\n createPageBreakParagraph,\n insertPageBreak,\n createHorizontalRule,\n insertHorizontalRule,\n isPageBreak,\n isColumnBreak,\n isLineBreak,\n isBreakContent,\n hasPageBreakBefore,\n countPageBreaks,\n findPageBreaks,\n removePageBreak,\n type InsertPosition,\n} from '@eigenpal/docx-core/utils/insertOperations';\n\n// Selection highlighting\nexport {\n useSelectionHighlight,\n generateOverlayElements,\n type UseSelectionHighlightOptions,\n type UseSelectionHighlightReturn,\n type SelectionOverlayProps,\n} from './hooks/useSelectionHighlight';\n\nexport {\n DEFAULT_SELECTION_STYLE,\n HIGH_CONTRAST_SELECTION_STYLE,\n SELECTION_CSS_VARS,\n getSelectionRects,\n mergeAdjacentRects,\n getMergedSelectionRects,\n getHighlightRectStyle,\n generateSelectionCSS,\n hasActiveSelection,\n getSelectedText,\n isSelectionWithin,\n getSelectionBoundingRect,\n highlightTextRange,\n selectRange,\n clearSelection,\n isSelectionBackwards,\n normalizeSelectionDirection,\n injectSelectionStyles,\n removeSelectionStyles,\n areSelectionStylesInjected,\n createSelectionChangeHandler,\n type HighlightRect,\n type SelectionHighlightConfig,\n type SelectionRange,\n} from '@eigenpal/docx-core/utils/selectionHighlight';\n\n// Text selection utilities for word/paragraph selection\nexport {\n isWordCharacter,\n isWhitespace,\n findWordBoundaries,\n getWordAt,\n findWordAt,\n selectWordAtCursor,\n selectWordInTextNode,\n expandSelectionToWordBoundaries,\n selectParagraphAtCursor,\n handleClickForMultiClick,\n createDoubleClickWordSelector,\n createTripleClickParagraphSelector,\n type WordSelectionResult,\n} from '@eigenpal/docx-core/utils/textSelection';\n\n// Keyboard navigation\nexport {\n // Types\n type NavigationDirection,\n type NavigationUnit,\n type NavigationAction,\n type KeyboardShortcut,\n // Word boundary detection\n isWordCharacter as isWordChar,\n isWhitespace as isWhitespaceChar,\n isPunctuation,\n findWordStart,\n findWordEnd,\n findNextWordStart,\n findPreviousWordStart,\n // Line boundary detection\n findVisualLineStart,\n findVisualLineEnd,\n // DOM selection utilities\n getSelectionInfo,\n setSelectionPosition,\n extendSelectionTo,\n moveByWord,\n moveToLineEdge,\n // Keyboard event handling\n parseNavigationAction,\n handleNavigationKey,\n isNavigationKey,\n // Selection word expansion\n expandSelectionToWord,\n getWordAtCursor,\n // Keyboard shortcut utilities\n matchesShortcut,\n NAVIGATION_SHORTCUTS,\n describeShortcut,\n getNavigationShortcutDescriptions,\n} from '@eigenpal/docx-core/utils/keyboardNavigation';\n\n// Clipboard utilities\nexport {\n useClipboard,\n createSelectionFromDOM,\n getSelectionRuns,\n type ClipboardSelection,\n type UseClipboardOptions,\n type UseClipboardReturn,\n} from './hooks/useClipboard';\n\nexport {\n copyRuns,\n copyParagraphs,\n readFromClipboard,\n handlePasteEvent,\n htmlToRuns,\n cleanWordHtml,\n isWordHtml,\n isEditorHtml,\n createClipboardHandlers,\n runsToClipboardContent,\n paragraphsToClipboardContent,\n writeToClipboard,\n parseClipboardHtml,\n INTERNAL_CLIPBOARD_TYPE,\n CLIPBOARD_TYPES,\n type ClipboardContent,\n type ParsedClipboardContent,\n type ClipboardOptions,\n} from '@eigenpal/docx-core/utils/clipboard';\n\n// ============================================================================\n// PLUGIN API\n// ============================================================================\n\nexport {\n PluginHost,\n PLUGIN_HOST_STYLES,\n type EditorPlugin,\n type PluginPanelProps,\n type PanelConfig,\n type PluginContext,\n type PluginHostProps,\n type PluginHostRef,\n type RenderedDomContext,\n type PositionCoordinates,\n} from './plugin-api';\n\n// ============================================================================\n// PLUGINS\n// ============================================================================\n\n// Template Plugin (Editor UI)\nexport {\n templatePlugin,\n createPlugin as createTemplatePlugin,\n createTemplatePlugin as createTemplateProseMirrorPlugin,\n templatePluginKey,\n getTemplateTags as getTemplatePluginTags,\n setHoveredElement,\n setSelectedElement,\n TEMPLATE_DECORATION_STYLES,\n AnnotationPanel,\n ANNOTATION_PANEL_STYLES,\n type TemplateTag,\n type TagType,\n} from './plugins/template';\n\n// ============================================================================\n// CORE PLUGIN SYSTEM\n// ============================================================================\n\nexport {\n pluginRegistry,\n PluginRegistry,\n registerPlugins,\n docxtemplaterPlugin,\n type CorePlugin,\n type McpToolDefinition,\n type McpToolHandler,\n type McpToolResult,\n type McpSession,\n} from '@eigenpal/docx-core/core-plugins';\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../core/src/mcp/core-tools.ts","../../core/src/mcp/server.ts"],"names":["documentIdSchema","positionSchema","rangeSchema","loadDocumentTool","input","context","content","source","binaryString","bytes","i","buffer","document","parseDocx","docId","paragraphCount","b","error","saveDocumentTool","documentId","loaded","repackDocx","createDocx","binary","base64","closeDocumentTool","getDocumentInfoTool","doc","body","paragraphs","tables","wordCount","para","text","getParagraphText","w","getDocumentTextTool","maxLength","texts","block","truncated","insertTextTool","position","newDoc","executeCommand","replaceTextTool","range","deleteTextTool","formatTextTool","formatting","applyStyleTool","paragraphIndex","styleId","paragraph","item","getRunText","getHyperlinkText","run","c","hyperlink","child","coreMcpTools","createMcpServer","config","name","version","includeCoreTools","debug","additionalTools","tools","session","tool","pluginTools","pluginRegistry","log","message","data","handleToolCall","toolName","result","listTools","convertToJsonSchema","getInfo","handleJsonRpcRequest","server","request","id","method","params","t","args","startStdioServer","rl","line","response","schema"],"mappings":"yPAqBA,IAAMA,CAAAA,CAA+B,CACnC,IAAA,CAAM,QAAA,CACN,WAAA,CAAa,qCACf,CAAA,CAEMC,CAAAA,CAA6B,CACjC,IAAA,CAAM,QAAA,CACN,UAAA,CAAY,CACV,cAAA,CAAgB,CACd,IAAA,CAAM,QAAA,CACN,WAAA,CAAa,oCAAA,CACb,OAAA,CAAS,CACX,CAAA,CACA,MAAA,CAAQ,CACN,IAAA,CAAM,QAAA,CACN,WAAA,CAAa,uCAAA,CACb,OAAA,CAAS,CACX,CACF,CAAA,CACA,QAAA,CAAU,CAAC,gBAAA,CAAkB,QAAQ,CACvC,CAAA,CAEMC,CAAAA,CAA0B,CAC9B,IAAA,CAAM,QAAA,CACN,UAAA,CAAY,CACV,KAAA,CAAOD,CAAAA,CACP,GAAA,CAAKA,CACP,CAAA,CACA,QAAA,CAAU,CAAC,OAAA,CAAS,KAAK,CAC3B,CAAA,CASaE,CAAAA,CAAsC,CACjD,IAAA,CAAM,WAAA,CACN,WAAA,CAAa,CAAA;AAAA;AAAA,oDAAA,CAAA,CAIb,YAAa,CACX,IAAA,CAAM,SACN,UAAA,CAAY,CACV,QAAS,CACP,IAAA,CAAM,SACN,WAAA,CAAa,kCACf,EACA,MAAA,CAAQ,CACN,KAAM,QAAA,CACN,WAAA,CAAa,sDACf,CACF,CAAA,CACA,SAAU,CAAC,SAAS,CACtB,CAAA,CAEA,OAAA,CAAS,MAAOC,CAAAA,CAAgBC,CAAAA,GAAoD,CAClF,GAAM,CAAE,QAAAC,CAAAA,CAAS,MAAA,CAAAC,CAAO,CAAA,CAAIH,CAAAA,CAE5B,GAAI,CAEF,IAAMI,EAAe,IAAA,CAAKF,CAAO,CAAA,CAC3BG,CAAAA,CAAQ,IAAI,UAAA,CAAWD,CAAAA,CAAa,MAAM,CAAA,CAChD,IAAA,IAASE,EAAI,CAAA,CAAGA,CAAAA,CAAIF,EAAa,MAAA,CAAQE,CAAAA,EAAAA,CACvCD,EAAMC,CAAC,CAAA,CAAIF,EAAa,UAAA,CAAWE,CAAC,EAEtC,IAAMC,CAAAA,CAASF,EAAM,MAAA,CAGfG,CAAAA,CAAW,MAAMC,mBAAAA,CAAUF,CAAM,EAGjCG,CAAAA,CAAQ,CAAA,IAAA,EAAO,KAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,MAAA,CAAO,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,CAG1ET,CAAAA,CAAQ,OAAA,CAAQ,UAAU,GAAA,CAAIS,CAAAA,CAAO,CACnC,EAAA,CAAIA,CAAAA,CACJ,SAAAF,CAAAA,CACA,MAAA,CAAAD,EACA,MAAA,CAAAJ,CAAAA,CACA,aAAc,IAAA,CAAK,GAAA,EACrB,CAAC,CAAA,CAGD,IAAMQ,CAAAA,CAAiBH,CAAAA,CAAS,QAAQ,QAAA,CAAS,OAAA,CAAQ,OACtDI,CAAAA,EAAMA,CAAAA,CAAE,OAAS,WACpB,CAAA,CAAE,OAEF,OAAO,CACL,QAAS,CACP,CACE,KAAM,MAAA,CACN,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,WAAYF,CAAAA,CACZ,MAAA,CAAAP,EACA,cAAA,CAAAQ,CAAAA,CACA,QAAS,8BACX,CAAC,CACH,CACF,CACF,CACF,CAAA,MAASE,CAAAA,CAAO,CACd,OAAO,CACL,QAAS,IAAA,CACT,OAAA,CAAS,CAAC,CAAE,IAAA,CAAM,OAAQ,IAAA,CAAM,CAAA,yBAAA,EAA6BA,EAAgB,OAAO,CAAA,CAAG,CAAC,CAC1F,CACF,CACF,CAAA,CAEA,WAAA,CAAa,CACX,QAAA,CAAU,MAAA,CACV,SAAU,KAAA,CACV,UAAA,CAAY,KACd,CACF,CAAA,CAKaC,EAAsC,CACjD,IAAA,CAAM,YACN,WAAA,CAAa,CAAA;AAAA,oEAAA,CAAA,CAGb,YAAa,CACX,IAAA,CAAM,QAAA,CACN,UAAA,CAAY,CACV,UAAA,CAAYlB,CACd,CAAA,CACA,QAAA,CAAU,CAAC,YAAY,CACzB,CAAA,CAEA,OAAA,CAAS,MAAOI,CAAAA,CAAgBC,CAAAA,GAAoD,CAClF,GAAM,CAAE,UAAA,CAAAc,CAAW,CAAA,CAAIf,CAAAA,CAEjBgB,EAASf,CAAAA,CAAQ,OAAA,CAAQ,SAAA,CAAU,GAAA,CAAIc,CAAU,CAAA,CACvD,GAAI,CAACC,CAAAA,CACH,OAAO,CACL,OAAA,CAAS,IAAA,CACT,OAAA,CAAS,CAAC,CAAE,IAAA,CAAM,MAAA,CAAQ,IAAA,CAAM,uBAAuBD,CAAU,CAAA,CAAG,CAAC,CACvE,EAGF,GAAI,CAEF,IAAIR,CAAAA,CACAS,EAAO,MAAA,CAETT,CAAAA,CAAS,MAAMU,mBAAAA,CAAWD,EAAO,QAAQ,CAAA,CAGzCT,CAAAA,CAAS,MAAMW,oBAAWF,CAAAA,CAAO,QAAQ,CAAA,CAI3C,IAAMX,EAAQ,IAAI,UAAA,CAAWE,CAAM,CAAA,CAC/BY,EAAS,EAAA,CACb,IAAA,IAASb,CAAAA,CAAI,CAAA,CAAGA,EAAID,CAAAA,CAAM,MAAA,CAAQC,CAAAA,EAAAA,CAChCa,CAAAA,EAAU,OAAO,YAAA,CAAad,CAAAA,CAAMC,CAAC,CAAC,EAExC,IAAMc,CAAAA,CAAS,IAAA,CAAKD,CAAM,EAE1B,OAAO,CACL,OAAA,CAAS,CACP,CACE,IAAA,CAAM,MAAA,CACN,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,UAAA,CAAAJ,CAAAA,CACA,MAAA,CAAAK,EACA,IAAA,CAAMb,CAAAA,CAAO,UAAA,CACb,OAAA,CAAS,gCACX,CAAC,CACH,CACF,CACF,CACF,CAAA,MAASM,CAAAA,CAAO,CACd,OAAO,CACL,OAAA,CAAS,IAAA,CACT,OAAA,CAAS,CAAC,CAAE,IAAA,CAAM,MAAA,CAAQ,IAAA,CAAM,CAAA,yBAAA,EAA6BA,EAAgB,OAAO,CAAA,CAAG,CAAC,CAC1F,CACF,CACF,CAAA,CAEA,WAAA,CAAa,CACX,SAAU,MAAA,CACV,QAAA,CAAU,IAAA,CACV,UAAA,CAAY,KACd,CACF,CAAA,CAKaQ,EAAuC,CAClD,IAAA,CAAM,aACN,WAAA,CAAa,CAAA;AAAA,2CAAA,CAAA,CAGb,YAAa,CACX,IAAA,CAAM,SACN,UAAA,CAAY,CACV,WAAYzB,CACd,CAAA,CACA,QAAA,CAAU,CAAC,YAAY,CACzB,CAAA,CAEA,QAAS,MAAOI,CAAAA,CAAgBC,IAAoD,CAClF,GAAM,CAAE,UAAA,CAAAc,CAAW,CAAA,CAAIf,CAAAA,CAEvB,OAAKC,CAAAA,CAAQ,OAAA,CAAQ,UAAU,GAAA,CAAIc,CAAU,GAO7Cd,CAAAA,CAAQ,OAAA,CAAQ,UAAU,MAAA,CAAOc,CAAU,EAEpC,CACL,OAAA,CAAS,CACP,CACE,IAAA,CAAM,MAAA,CACN,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,WAAAA,CAAAA,CACA,OAAA,CAAS,iBACX,CAAC,CACH,CACF,CACF,CAAA,EAlBS,CACL,OAAA,CAAS,IAAA,CACT,QAAS,CAAC,CAAE,KAAM,MAAA,CAAQ,IAAA,CAAM,CAAA,oBAAA,EAAuBA,CAAU,EAAG,CAAC,CACvE,CAgBJ,CAAA,CAEA,WAAA,CAAa,CACX,QAAA,CAAU,MAAA,CACV,SAAU,KAAA,CACV,UAAA,CAAY,KACd,CACF,CAAA,CASaO,EAAyC,CACpD,IAAA,CAAM,gBACN,WAAA,CAAa,CAAA;AAAA,wEAAA,CAAA,CAGb,YAAa,CACX,IAAA,CAAM,QAAA,CACN,UAAA,CAAY,CACV,UAAA,CAAY1B,CACd,CAAA,CACA,QAAA,CAAU,CAAC,YAAY,CACzB,EAEA,OAAA,CAAS,MAAOI,EAAgBC,CAAAA,GAAoD,CAClF,GAAM,CAAE,WAAAc,CAAW,CAAA,CAAIf,CAAAA,CAEjBgB,CAAAA,CAASf,EAAQ,OAAA,CAAQ,SAAA,CAAU,GAAA,CAAIc,CAAU,EACvD,GAAI,CAACC,EACH,OAAO,CACL,QAAS,IAAA,CACT,OAAA,CAAS,CAAC,CAAE,KAAM,MAAA,CAAQ,IAAA,CAAM,CAAA,oBAAA,EAAuBD,CAAU,EAAG,CAAC,CACvE,CAAA,CAGF,IAAMQ,EAAMP,CAAAA,CAAO,QAAA,CACbQ,EAAOD,CAAAA,CAAI,OAAA,CAAQ,SAEnBE,CAAAA,CAAaD,CAAAA,CAAK,OAAA,CAAQ,MAAA,CAAQZ,GAAMA,CAAAA,CAAE,IAAA,GAAS,WAAW,CAAA,CAC9Dc,EAASF,CAAAA,CAAK,OAAA,CAAQ,MAAA,CAAQZ,CAAAA,EAAMA,EAAE,IAAA,GAAS,OAAO,EAGxDe,CAAAA,CAAY,CAAA,CAChB,QAAWC,CAAAA,IAAQH,CAAAA,CACjB,GAAIG,CAAAA,CAAK,OAAS,WAAA,CAAa,CAC7B,IAAMC,CAAAA,CAAOC,EAAiBF,CAAI,CAAA,CAClCD,CAAAA,EAAaE,CAAAA,CAAK,MAAM,KAAK,CAAA,CAAE,OAAQE,CAAAA,EAAMA,CAAAA,CAAE,OAAS,CAAC,CAAA,CAAE,OAC7D,CAGF,OAAO,CACL,OAAA,CAAS,CACP,CACE,KAAM,MAAA,CACN,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CACnB,UAAA,CAAAhB,CAAAA,CACA,eAAgBU,CAAAA,CAAW,MAAA,CAC3B,WAAYC,CAAAA,CAAO,MAAA,CACnB,SAAA,CAAAC,CAAAA,CACA,UAAW,CAAC,CAACJ,CAAAA,CAAI,OAAA,CAAQ,OACzB,QAAA,CAAU,CAAC,CAACA,CAAAA,CAAI,QAAQ,KAAA,CACxB,MAAA,CAAQP,EAAO,MAAA,CACf,YAAA,CAAcA,EAAO,YACvB,CAAC,CACH,CACF,CACF,CACF,CAAA,CAEA,WAAA,CAAa,CACX,SAAU,MAAA,CACV,QAAA,CAAU,IAAA,CACV,UAAA,CAAY,KACd,CACF,CAAA,CAKagB,EAAyC,CACpD,IAAA,CAAM,gBACN,WAAA,CAAa,CAAA;AAAA;AAAA,8DAAA,CAAA,CAIb,WAAA,CAAa,CACX,IAAA,CAAM,QAAA,CACN,WAAY,CACV,UAAA,CAAYpC,EACZ,SAAA,CAAW,CACT,KAAM,QAAA,CACN,WAAA,CAAa,gDACb,OAAA,CAAS,GACX,CACF,CAAA,CACA,QAAA,CAAU,CAAC,YAAY,CACzB,EAEA,OAAA,CAAS,MAAOI,EAAgBC,CAAAA,GAAoD,CAClF,GAAM,CAAE,UAAA,CAAAc,EAAY,SAAA,CAAAkB,CAAAA,CAAY,GAAM,CAAA,CAAIjC,CAAAA,CAKpCgB,EAASf,CAAAA,CAAQ,OAAA,CAAQ,UAAU,GAAA,CAAIc,CAAU,CAAA,CACvD,GAAI,CAACC,CAAAA,CACH,OAAO,CACL,OAAA,CAAS,KACT,OAAA,CAAS,CAAC,CAAE,IAAA,CAAM,MAAA,CAAQ,KAAM,CAAA,oBAAA,EAAuBD,CAAU,EAAG,CAAC,CACvE,EAGF,IAAMS,CAAAA,CAAOR,EAAO,QAAA,CAAS,OAAA,CAAQ,QAAA,CAC/BkB,CAAAA,CAAkB,EAAC,CAEzB,QAAWC,CAAAA,IAASX,CAAAA,CAAK,QACnBW,CAAAA,CAAM,IAAA,GAAS,YACjBD,CAAAA,CAAM,IAAA,CAAKJ,EAAiBK,CAAK,CAAC,EACzBA,CAAAA,CAAM,IAAA,GAAS,SACxBD,CAAAA,CAAM,IAAA,CAAK,SAAS,CAAA,CAIxB,IAAIL,CAAAA,CAAOK,CAAAA,CAAM,IAAA,CAAK;AAAA,CAAI,CAAA,CACpBE,CAAAA,CAAYP,CAAAA,CAAK,MAAA,CAASI,EAChC,OAAIG,CAAAA,GACFP,CAAAA,CAAOA,CAAAA,CAAK,KAAA,CAAM,CAAA,CAAGI,CAAS,CAAA,CAAI,OAG7B,CACL,OAAA,CAAS,CACP,CACE,IAAA,CAAM,MAAA,CACN,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,UAAA,CAAAlB,CAAAA,CACA,IAAA,CAAAc,EACA,SAAA,CAAAO,CAAAA,CACA,WAAA,CAAaA,CAAAA,CAAYF,EAAM,IAAA,CAAK;AAAA,CAAI,CAAA,CAAE,MAAA,CAASL,CAAAA,CAAK,MAC1D,CAAC,CACH,CACF,CACF,CACF,CAAA,CAEA,WAAA,CAAa,CACX,SAAU,MAAA,CACV,QAAA,CAAU,IAAA,CACV,UAAA,CAAY,KACd,CACF,EASaQ,CAAAA,CAAoC,CAC/C,IAAA,CAAM,kBAAA,CACN,WAAA,CAAa,CAAA;AAAA,0EAAA,CAAA,CAGb,WAAA,CAAa,CACX,IAAA,CAAM,QAAA,CACN,WAAY,CACV,UAAA,CAAYzC,CAAAA,CACZ,QAAA,CAAUC,EACV,IAAA,CAAM,CACJ,IAAA,CAAM,QAAA,CACN,YAAa,gBACf,CACF,CAAA,CACA,QAAA,CAAU,CAAC,YAAA,CAAc,UAAA,CAAY,MAAM,CAC7C,CAAA,CAEA,OAAA,CAAS,MAAOG,CAAAA,CAAgBC,IAAoD,CAClF,GAAM,CAAE,UAAA,CAAAc,EAAY,QAAA,CAAAuB,CAAAA,CAAU,IAAA,CAAAT,CAAK,CAAA,CAAI7B,CAAAA,CAMjCgB,CAAAA,CAASf,CAAAA,CAAQ,QAAQ,SAAA,CAAU,GAAA,CAAIc,CAAU,CAAA,CACvD,GAAI,CAACC,CAAAA,CACH,OAAO,CACL,QAAS,IAAA,CACT,OAAA,CAAS,CAAC,CAAE,IAAA,CAAM,MAAA,CAAQ,IAAA,CAAM,CAAA,oBAAA,EAAuBD,CAAU,CAAA,CAAG,CAAC,CACvE,CAAA,CAGF,GAAI,CACF,IAAMwB,CAAAA,CAASC,mBAAAA,CAAexB,EAAO,QAAA,CAAU,CAC7C,IAAA,CAAM,YAAA,CACN,QAAA,CAAAsB,CAAAA,CACA,IAAA,CAAAT,CACF,CAAC,CAAA,CAED,OAAAb,CAAAA,CAAO,QAAA,CAAWuB,EAClBvB,CAAAA,CAAO,YAAA,CAAe,IAAA,CAAK,GAAA,GAEpB,CACL,OAAA,CAAS,CACP,CACE,IAAA,CAAM,MAAA,CACN,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,OAAA,CAAS,CAAA,CAAA,CACT,cAAA,CAAgBa,EAAK,MAAA,CACrB,QAAA,CAAAS,CACF,CAAC,CACH,CACF,CACF,CACF,CAAA,MAASzB,CAAAA,CAAO,CACd,OAAO,CACL,QAAS,IAAA,CACT,OAAA,CAAS,CAAC,CAAE,KAAM,MAAA,CAAQ,IAAA,CAAM,CAAA,uBAAA,EAA2BA,CAAAA,CAAgB,OAAO,CAAA,CAAG,CAAC,CACxF,CACF,CACF,CAAA,CAEA,WAAA,CAAa,CACX,QAAA,CAAU,OACV,QAAA,CAAU,KAAA,CACV,UAAA,CAAY,KACd,CACF,CAAA,CAKa4B,CAAAA,CAAqC,CAChD,IAAA,CAAM,oBACN,WAAA,CAAa,CAAA;AAAA,+DAAA,CAAA,CAGb,WAAA,CAAa,CACX,IAAA,CAAM,QAAA,CACN,WAAY,CACV,UAAA,CAAY7C,CAAAA,CACZ,KAAA,CAAOE,EACP,IAAA,CAAM,CACJ,IAAA,CAAM,QAAA,CACN,YAAa,kBACf,CACF,CAAA,CACA,QAAA,CAAU,CAAC,YAAA,CAAc,OAAA,CAAS,MAAM,CAC1C,CAAA,CAEA,OAAA,CAAS,MAAOE,CAAAA,CAAgBC,IAAoD,CAClF,GAAM,CAAE,UAAA,CAAAc,EAAY,KAAA,CAAA2B,CAAAA,CAAO,IAAA,CAAAb,CAAK,CAAA,CAAI7B,CAAAA,CAS9BgB,CAAAA,CAASf,CAAAA,CAAQ,QAAQ,SAAA,CAAU,GAAA,CAAIc,CAAU,CAAA,CACvD,GAAI,CAACC,CAAAA,CACH,OAAO,CACL,QAAS,IAAA,CACT,OAAA,CAAS,CAAC,CAAE,IAAA,CAAM,MAAA,CAAQ,IAAA,CAAM,CAAA,oBAAA,EAAuBD,CAAU,CAAA,CAAG,CAAC,CACvE,CAAA,CAGF,GAAI,CACF,IAAMwB,CAAAA,CAASC,mBAAAA,CAAexB,EAAO,QAAA,CAAU,CAC7C,IAAA,CAAM,aAAA,CACN,KAAA,CAAA0B,CAAAA,CACA,IAAA,CAAAb,CACF,CAAC,CAAA,CAED,OAAAb,CAAAA,CAAO,QAAA,CAAWuB,EAClBvB,CAAAA,CAAO,YAAA,CAAe,IAAA,CAAK,GAAA,GAEpB,CACL,OAAA,CAAS,CACP,CACE,IAAA,CAAM,MAAA,CACN,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,OAAA,CAAS,CAAA,CAAA,CACT,aAAA,CAAe0B,EACf,aAAA,CAAeb,CAAAA,CAAK,MACtB,CAAC,CACH,CACF,CACF,CACF,CAAA,MAAShB,CAAAA,CAAO,CACd,OAAO,CACL,QAAS,IAAA,CACT,OAAA,CAAS,CAAC,CAAE,KAAM,MAAA,CAAQ,IAAA,CAAM,CAAA,wBAAA,EAA4BA,CAAAA,CAAgB,OAAO,CAAA,CAAG,CAAC,CACzF,CACF,CACF,CAAA,CAEA,WAAA,CAAa,CACX,QAAA,CAAU,OACV,QAAA,CAAU,KAAA,CACV,UAAA,CAAY,KACd,CACF,CAAA,CAKa8B,CAAAA,CAAoC,CAC/C,IAAA,CAAM,mBACN,WAAA,CAAa,CAAA;AAAA,8DAAA,CAAA,CAGb,WAAA,CAAa,CACX,IAAA,CAAM,QAAA,CACN,UAAA,CAAY,CACV,UAAA,CAAY/C,CAAAA,CACZ,KAAA,CAAOE,CACT,CAAA,CACA,QAAA,CAAU,CAAC,YAAA,CAAc,OAAO,CAClC,CAAA,CAEA,OAAA,CAAS,MAAOE,CAAAA,CAAgBC,CAAAA,GAAoD,CAClF,GAAM,CAAE,UAAA,CAAAc,CAAAA,CAAY,KAAA,CAAA2B,CAAM,CAAA,CAAI1C,EAQxBgB,CAAAA,CAASf,CAAAA,CAAQ,OAAA,CAAQ,SAAA,CAAU,GAAA,CAAIc,CAAU,CAAA,CACvD,GAAI,CAACC,CAAAA,CACH,OAAO,CACL,OAAA,CAAS,IAAA,CACT,OAAA,CAAS,CAAC,CAAE,IAAA,CAAM,MAAA,CAAQ,IAAA,CAAM,CAAA,oBAAA,EAAuBD,CAAU,CAAA,CAAG,CAAC,CACvE,EAGF,GAAI,CACF,IAAMwB,CAAAA,CAASC,mBAAAA,CAAexB,CAAAA,CAAO,QAAA,CAAU,CAC7C,KAAM,YAAA,CACN,KAAA,CAAA0B,CACF,CAAC,CAAA,CAED,OAAA1B,CAAAA,CAAO,QAAA,CAAWuB,CAAAA,CAClBvB,CAAAA,CAAO,YAAA,CAAe,IAAA,CAAK,GAAA,EAAI,CAExB,CACL,OAAA,CAAS,CACP,CACE,IAAA,CAAM,MAAA,CACN,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CACnB,OAAA,CAAS,CAAA,CAAA,CACT,YAAA,CAAc0B,CAChB,CAAC,CACH,CACF,CACF,CACF,OAAS7B,CAAAA,CAAO,CACd,OAAO,CACL,OAAA,CAAS,IAAA,CACT,OAAA,CAAS,CAAC,CAAE,IAAA,CAAM,MAAA,CAAQ,IAAA,CAAM,CAAA,uBAAA,EAA2BA,CAAAA,CAAgB,OAAO,CAAA,CAAG,CAAC,CACxF,CACF,CACF,CAAA,CAEA,WAAA,CAAa,CACX,QAAA,CAAU,MAAA,CACV,SAAU,KAAA,CACV,UAAA,CAAY,KACd,CACF,CAAA,CASa+B,CAAAA,CAAoC,CAC/C,IAAA,CAAM,mBACN,WAAA,CAAa,CAAA;AAAA,+EAAA,CAAA,CAGb,WAAA,CAAa,CACX,IAAA,CAAM,QAAA,CACN,WAAY,CACV,UAAA,CAAYhD,EACZ,KAAA,CAAOE,CAAAA,CACP,WAAY,CACV,IAAA,CAAM,SACN,WAAA,CAAa,6BAAA,CACb,WAAY,CACV,IAAA,CAAM,CAAE,IAAA,CAAM,SAAU,CAAA,CACxB,OAAQ,CAAE,IAAA,CAAM,SAAU,CAAA,CAC1B,SAAA,CAAW,CAAE,IAAA,CAAM,SAAU,EAC7B,aAAA,CAAe,CAAE,KAAM,SAAU,CAAA,CACjC,SAAU,CAAE,IAAA,CAAM,SAAU,WAAA,CAAa,qBAAsB,CAAA,CAC/D,UAAA,CAAY,CAAE,IAAA,CAAM,QAAS,CAAA,CAC7B,KAAA,CAAO,CAAE,IAAA,CAAM,QAAA,CAAU,YAAa,6BAA8B,CAAA,CACpE,UAAW,CAAE,IAAA,CAAM,SAAU,WAAA,CAAa,sBAAuB,CACnE,CACF,CACF,EACA,QAAA,CAAU,CAAC,YAAA,CAAc,OAAA,CAAS,YAAY,CAChD,EAEA,OAAA,CAAS,MAAOE,EAAgBC,CAAAA,GAAoD,CAClF,GAAM,CAAE,UAAA,CAAAc,EAAY,KAAA,CAAA2B,CAAAA,CAAO,WAAAG,CAAW,CAAA,CAAI7C,EASpCgB,CAAAA,CAASf,CAAAA,CAAQ,QAAQ,SAAA,CAAU,GAAA,CAAIc,CAAU,CAAA,CACvD,GAAI,CAACC,EACH,OAAO,CACL,QAAS,IAAA,CACT,OAAA,CAAS,CAAC,CAAE,IAAA,CAAM,OAAQ,IAAA,CAAM,CAAA,oBAAA,EAAuBD,CAAU,CAAA,CAAG,CAAC,CACvE,CAAA,CAGF,GAAI,CACF,IAAMwB,CAAAA,CAASC,mBAAAA,CAAexB,CAAAA,CAAO,QAAA,CAAU,CAC7C,KAAM,YAAA,CACN,KAAA,CAAA0B,EACA,UAAA,CAAAG,CACF,CAAC,CAAA,CAED,OAAA7B,EAAO,QAAA,CAAWuB,CAAAA,CAClBvB,EAAO,YAAA,CAAe,IAAA,CAAK,KAAI,CAExB,CACL,QAAS,CACP,CACE,IAAA,CAAM,MAAA,CACN,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,OAAA,CAAS,GACT,KAAA,CAAA0B,CAAAA,CACA,kBAAmBG,CACrB,CAAC,CACH,CACF,CACF,CACF,CAAA,MAAShC,CAAAA,CAAO,CACd,OAAO,CACL,QAAS,IAAA,CACT,OAAA,CAAS,CAAC,CAAE,IAAA,CAAM,MAAA,CAAQ,KAAM,CAAA,uBAAA,EAA2BA,CAAAA,CAAgB,OAAO,CAAA,CAAG,CAAC,CACxF,CACF,CACF,CAAA,CAEA,WAAA,CAAa,CACX,QAAA,CAAU,OACV,QAAA,CAAU,KAAA,CACV,WAAY,QACd,CACF,EAKaiC,CAAAA,CAAoC,CAC/C,IAAA,CAAM,kBAAA,CACN,WAAA,CAAa,CAAA;AAAA,+DAAA,CAAA,CAGb,YAAa,CACX,IAAA,CAAM,SACN,UAAA,CAAY,CACV,WAAYlD,CAAAA,CACZ,cAAA,CAAgB,CACd,IAAA,CAAM,QAAA,CACN,YAAa,oCAAA,CACb,OAAA,CAAS,CACX,CAAA,CACA,OAAA,CAAS,CACP,IAAA,CAAM,QAAA,CACN,YAAa,uCACf,CACF,EACA,QAAA,CAAU,CAAC,aAAc,gBAAA,CAAkB,SAAS,CACtD,CAAA,CAEA,OAAA,CAAS,MAAOI,CAAAA,CAAgBC,CAAAA,GAAoD,CAClF,GAAM,CAAE,WAAAc,CAAAA,CAAY,cAAA,CAAAgC,EAAgB,OAAA,CAAAC,CAAQ,CAAA,CAAIhD,CAAAA,CAM1CgB,EAASf,CAAAA,CAAQ,OAAA,CAAQ,UAAU,GAAA,CAAIc,CAAU,EACvD,GAAI,CAACC,EACH,OAAO,CACL,QAAS,IAAA,CACT,OAAA,CAAS,CAAC,CAAE,IAAA,CAAM,OAAQ,IAAA,CAAM,CAAA,oBAAA,EAAuBD,CAAU,CAAA,CAAG,CAAC,CACvE,CAAA,CAGF,GAAI,CACF,IAAMwB,CAAAA,CAASC,oBAAexB,CAAAA,CAAO,QAAA,CAAU,CAC7C,IAAA,CAAM,YAAA,CACN,eAAA+B,CAAAA,CACA,OAAA,CAAAC,CACF,CAAC,CAAA,CAED,OAAAhC,CAAAA,CAAO,QAAA,CAAWuB,CAAAA,CAClBvB,CAAAA,CAAO,aAAe,IAAA,CAAK,GAAA,GAEpB,CACL,OAAA,CAAS,CACP,CACE,IAAA,CAAM,OACN,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,OAAA,CAAS,GACT,cAAA,CAAA+B,CAAAA,CACA,QAAAC,CACF,CAAC,CACH,CACF,CACF,CACF,CAAA,MAASnC,CAAAA,CAAO,CACd,OAAO,CACL,QAAS,IAAA,CACT,OAAA,CAAS,CAAC,CAAE,IAAA,CAAM,OAAQ,IAAA,CAAM,CAAA,uBAAA,EAA2BA,EAAgB,OAAO,CAAA,CAAG,CAAC,CACxF,CACF,CACF,CAAA,CAEA,YAAa,CACX,QAAA,CAAU,OACV,QAAA,CAAU,KAAA,CACV,WAAY,KACd,CACF,EAQA,SAASiB,CAAAA,CAAiBmB,EAA8B,CACtD,IAAMf,EAAkB,EAAC,CAEzB,QAAWgB,CAAAA,IAAQD,CAAAA,CAAU,QACvBC,CAAAA,CAAK,IAAA,GAAS,MAChBhB,CAAAA,CAAM,IAAA,CAAKiB,EAAWD,CAAI,CAAC,EAClBA,CAAAA,CAAK,IAAA,GAAS,aACvBhB,CAAAA,CAAM,IAAA,CAAKkB,EAAiBF,CAAI,CAAC,EAIrC,OAAOhB,CAAAA,CAAM,KAAK,EAAE,CACtB,CAEA,SAASiB,EAAWE,CAAAA,CAAkB,CACpC,OAAOA,CAAAA,CAAI,OAAA,CACR,OAAQC,CAAAA,EAAMA,CAAAA,CAAE,OAAS,MAAM,CAAA,CAC/B,IAAKA,CAAAA,EAAOA,CAAAA,CAAqC,IAAI,CAAA,CACrD,IAAA,CAAK,EAAE,CACZ,CAEA,SAASF,CAAAA,CAAiBG,CAAAA,CAA8B,CACtD,IAAMrB,CAAAA,CAAkB,EAAC,CACzB,IAAA,IAAWsB,KAASD,CAAAA,CAAU,QAAA,CACxBC,EAAM,IAAA,GAAS,KAAA,EACjBtB,EAAM,IAAA,CAAKiB,CAAAA,CAAWK,CAAK,CAAC,CAAA,CAGhC,OAAOtB,CAAAA,CAAM,IAAA,CAAK,EAAE,CACtB,CAMO,IAAMuB,CAAAA,CAAoC,CAE/C1D,CAAAA,CACAe,CAAAA,CACAO,EAGAC,CAAAA,CACAU,CAAAA,CAGAK,EACAI,CAAAA,CACAE,CAAAA,CAGAC,EACAE,CACF,EC5vBO,SAASY,CAAAA,CAAgBC,CAAAA,CAA0B,EAAC,CAAc,CACvE,GAAM,CACJ,IAAA,CAAAC,EAAO,aAAA,CACP,OAAA,CAAAC,EAAU,OAAA,CACV,gBAAA,CAAAC,EAAmB,IAAA,CACnB,KAAA,CAAAC,EAAQ,KAAA,CACR,eAAA,CAAAC,EAAkB,EACpB,EAAIL,CAAAA,CAEEM,CAAAA,CAAQ,IAAI,GAAA,CAGZC,CAAAA,CAAsB,CAC1B,EAAA,CAAI,WAAW,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,QAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,MAAA,CAAO,EAAG,CAAC,CAAC,GACpE,SAAA,CAAW,IAAI,IACf,IAAA,CAAM,IAAI,GACZ,CAAA,CAGA,GAAIJ,EACF,IAAA,IAAWK,CAAAA,IAAQV,EACjBQ,CAAAA,CAAM,GAAA,CAAIE,EAAK,IAAA,CAAMA,CAAI,EACrBJ,CAAAA,EACF,OAAA,CAAQ,IAAI,CAAA,4BAAA,EAA+BI,CAAAA,CAAK,IAAI,CAAA,CAAE,CAAA,CAM5D,IAAMC,CAAAA,CAAcC,mBAAAA,CAAe,aAAY,CAC/C,IAAA,IAAWF,KAAQC,CAAAA,CACbH,CAAAA,CAAM,IAAIE,CAAAA,CAAK,IAAI,GACrB,OAAA,CAAQ,IAAA,CAAK,eAAeA,CAAAA,CAAK,IAAI,uCAAuC,CAAA,CAE9EF,CAAAA,CAAM,IAAIE,CAAAA,CAAK,IAAA,CAAMA,CAAI,CAAA,CACrBJ,CAAAA,EACF,QAAQ,GAAA,CAAI,CAAA,8BAAA,EAAiCI,EAAK,IAAI,CAAA,CAAE,EAK5D,IAAA,IAAWA,CAAAA,IAAQH,EACjBC,CAAAA,CAAM,GAAA,CAAIE,EAAK,IAAA,CAAMA,CAAI,EACrBJ,CAAAA,EACF,OAAA,CAAQ,IAAI,CAAA,kCAAA,EAAqCI,CAAAA,CAAK,IAAI,CAAA,CAAE,CAAA,CAKhE,IAAMG,CAAAA,CAAMP,EACR,CAACQ,CAAAA,CAAiBC,IAAmB,CACnC,OAAA,CAAQ,IAAI,CAAA,MAAA,EAASD,CAAO,GAAIC,CAAAA,EAAQ,EAAE,EAC5C,CAAA,CACA,IAAM,CAAC,CAAA,CAGX,eAAeC,EAAeC,CAAAA,CAAkB1E,CAAAA,CAAkC,CAChF,IAAMmE,CAAAA,CAAOF,EAAM,GAAA,CAAIS,CAAQ,EAC/B,GAAI,CAACP,EACH,MAAM,IAAI,MAAM,CAAA,cAAA,EAAiBO,CAAQ,EAAE,CAAA,CAG7CJ,CAAAA,CAAI,iBAAiBI,CAAQ,CAAA,CAAA,CAAI1E,CAAK,CAAA,CAGtC,IAAMC,CAAAA,CAA0B,CAC9B,QAAAiE,CAAAA,CACA,GAAA,CAAAI,CACF,CAAA,CAGA,GAAI,CACF,IAAMK,CAAAA,CAAS,MAAMR,CAAAA,CAAK,OAAA,CAAQnE,EAAOC,CAAO,CAAA,CAChD,OAAAqE,CAAAA,CAAI,CAAA,KAAA,EAAQI,CAAQ,CAAA,UAAA,CAAA,CAAcC,CAAM,EACjCA,CACT,CAAA,MAAS9D,EAAO,CACd,MAAAyD,EAAI,CAAA,KAAA,EAAQI,CAAQ,UAAW7D,CAAK,CAAA,CAC9BA,CACR,CACF,CAGA,SAAS+D,CAAAA,EAA2B,CAClC,OAAO,KAAA,CAAM,IAAA,CAAKX,EAAM,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAKE,IAAU,CAC/C,IAAA,CAAMA,EAAK,IAAA,CACX,WAAA,CAAaA,EAAK,WAAA,CAClB,WAAA,CAAaU,EAAoBV,CAAAA,CAAK,WAAW,EACjD,QAAA,CAAUA,CAAAA,CAAK,aAAa,QAC9B,CAAA,CAAE,CACJ,CAGA,SAASW,GAAU,CACjB,OAAO,CACL,IAAA,CAAAlB,CAAAA,CACA,QAAAC,CAAAA,CACA,SAAA,CAAWI,EAAM,IACnB,CACF,CAEA,OAAO,CACL,MAAAA,CAAAA,CACA,OAAA,CAAAC,EACA,cAAA,CAAAO,CAAAA,CACA,UAAAG,CAAAA,CACA,OAAA,CAAAE,CACF,CACF,CAiCA,eAAsBC,CAAAA,CACpBC,EACAC,CAAAA,CAC0B,CAC1B,GAAM,CAAE,EAAA,CAAAC,EAAI,MAAA,CAAAC,CAAAA,CAAQ,OAAAC,CAAO,CAAA,CAAIH,EAE/B,GAAI,CACF,OAAQE,CAAAA,EACN,KAAK,YAAA,CACH,OAAO,CACL,OAAA,CAAS,KAAA,CACT,GAAAD,CAAAA,CACA,MAAA,CAAQ,CACN,eAAA,CAAiB,YAAA,CACjB,aAAc,CACZ,KAAA,CAAO,EACT,CAAA,CACA,WAAYF,CAAAA,CAAO,OAAA,EACrB,CACF,CAAA,CAGF,KAAK,YAAA,CAAc,CACjB,IAAMf,CAAAA,CAAQe,EAAO,SAAA,EAAU,CAC/B,OAAO,CACL,OAAA,CAAS,MACT,EAAA,CAAAE,CAAAA,CACA,OAAQ,CACN,KAAA,CAAOjB,EAAM,GAAA,CAAKoB,CAAAA,GAAO,CACvB,IAAA,CAAMA,CAAAA,CAAE,KACR,WAAA,CAAaA,CAAAA,CAAE,YACf,WAAA,CAAaA,CAAAA,CAAE,WACjB,CAAA,CAAE,CACJ,CACF,CACF,CAEA,KAAK,YAAA,CAAc,CACjB,GAAM,CAAE,IAAA,CAAAzB,EAAM,SAAA,CAAW0B,CAAK,EAAIF,CAAAA,CAI5BT,CAAAA,CAAS,MAAMK,CAAAA,CAAO,eAAepB,CAAAA,CAAM0B,CAAI,EACrD,OAAO,CACL,QAAS,KAAA,CACT,EAAA,CAAAJ,EACA,MAAA,CAAAP,CACF,CACF,CAEA,QACE,OAAO,CACL,OAAA,CAAS,MACT,EAAA,CAAAO,CAAAA,CACA,MAAO,CACL,IAAA,CAAM,OACN,OAAA,CAAS,CAAA,kBAAA,EAAqBC,CAAM,CAAA,CACtC,CACF,CACJ,CACF,CAAA,MAAStE,EAAO,CACd,OAAO,CACL,OAAA,CAAS,KAAA,CACT,GAAAqE,CAAAA,CACA,KAAA,CAAO,CACL,IAAA,CAAM,KAAA,CACN,OAAA,CAAUrE,CAAAA,CAAgB,OAC5B,CACF,CACF,CACF,CAYA,eAAsB0E,EAAiB5B,CAAAA,CAA0B,GAAmB,CAClF,IAAMqB,EAAStB,CAAAA,CAAgBC,CAAM,EAEjCA,CAAAA,CAAO,KAAA,GACT,QAAQ,KAAA,CAAM,CAAA,sBAAA,EAAyBqB,EAAO,OAAA,EAAQ,CAAE,IAAI,CAAA,EAAA,EAAKA,CAAAA,CAAO,SAAQ,CAAE,OAAO,EAAE,CAAA,CAC3F,OAAA,CAAQ,MAAM,CAAA,wBAAA,EAA2BA,CAAAA,CAAO,MAAM,IAAI,CAAA,CAAE,GAK9D,IAAMQ,CAAAA,CAAAA,CADW,MAAM,OAAO,UAAU,GACpB,eAAA,CAAgB,CAClC,MAAO,OAAA,CAAQ,KAAA,CACf,OAAQ,OAAA,CAAQ,MAAA,CAChB,SAAU,KACZ,CAAC,EAEGjF,CAAAA,CAAS,EAAA,CAEbiF,EAAG,EAAA,CAAG,MAAA,CAAQ,MAAOC,CAAAA,EAAS,CAC5BlF,GAAUkF,CAAAA,CAGV,GAAI,CACF,IAAMR,CAAAA,CAAU,KAAK,KAAA,CAAM1E,CAAM,EACjCA,CAAAA,CAAS,EAAA,CAET,IAAMmF,CAAAA,CAAW,MAAMX,EAAqBC,CAAAA,CAAQC,CAAO,EAG3D,OAAA,CAAQ,MAAA,CAAO,MAAM,IAAA,CAAK,SAAA,CAAUS,CAAQ,CAAA,CAAI;AAAA,CAAI,EACtD,MAAQ,CAER,CACF,CAAC,CAAA,CAEDF,CAAAA,CAAG,GAAG,OAAA,CAAS,IAAM,CACf7B,CAAAA,CAAO,KAAA,EACT,QAAQ,KAAA,CAAM,qBAAqB,EAErC,OAAA,CAAQ,IAAA,CAAK,CAAC,EAChB,CAAC,EACH,CASA,SAASkB,EAAoBc,CAAAA,CAA0C,CAErE,OACE,OAAOA,CAAAA,EAAW,UAClBA,CAAAA,GAAW,IAAA,GACV,SAAUA,CAAAA,EAAU,YAAA,GAAgBA,GAE9BA,CAAAA,CAKF,CACL,KAAM,QAAA,CACN,UAAA,CAAY,EACd,CACF","file":"mcp-reexport.cjs","sourcesContent":["/**\n * Core MCP Tools\n *\n * Built-in MCP tools for document operations that are always available.\n * These provide basic document manipulation without requiring plugins.\n */\n\nimport type {\n McpToolDefinition,\n McpToolContext,\n McpToolResult,\n JsonSchema,\n} from '../core-plugins/types';\nimport { parseDocx } from '../docx/parser';\nimport { repackDocx, createDocx } from '../docx/rezip';\nimport { executeCommand } from '../agent/executor';\n\n// ============================================================================\n// SCHEMAS\n// ============================================================================\n\nconst documentIdSchema: JsonSchema = {\n type: 'string',\n description: 'Document ID returned from docx_load',\n};\n\nconst positionSchema: JsonSchema = {\n type: 'object',\n properties: {\n paragraphIndex: {\n type: 'number',\n description: 'Index of the paragraph (0-indexed)',\n minimum: 0,\n },\n offset: {\n type: 'number',\n description: 'Character offset within the paragraph',\n minimum: 0,\n },\n },\n required: ['paragraphIndex', 'offset'],\n};\n\nconst rangeSchema: JsonSchema = {\n type: 'object',\n properties: {\n start: positionSchema,\n end: positionSchema,\n },\n required: ['start', 'end'],\n};\n\n// ============================================================================\n// DOCUMENT LOADING/SAVING\n// ============================================================================\n\n/**\n * Load a DOCX document from base64\n */\nexport const loadDocumentTool: McpToolDefinition = {\n name: 'docx_load',\n description: `Load a DOCX document from base64-encoded content.\nReturns a document ID that can be used with other tools.\nThe document remains in session memory until closed.`,\n\n inputSchema: {\n type: 'object',\n properties: {\n content: {\n type: 'string',\n description: 'Base64-encoded DOCX file content',\n },\n source: {\n type: 'string',\n description: 'Optional source filename or identifier for reference',\n },\n },\n required: ['content'],\n },\n\n handler: async (input: unknown, context: McpToolContext): Promise<McpToolResult> => {\n const { content, source } = input as { content: string; source?: string };\n\n try {\n // Decode base64 to ArrayBuffer\n const binaryString = atob(content);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n const buffer = bytes.buffer;\n\n // Parse the document\n const document = await parseDocx(buffer);\n\n // Generate document ID\n const docId = `doc_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n\n // Store in session\n context.session.documents.set(docId, {\n id: docId,\n document,\n buffer,\n source,\n lastModified: Date.now(),\n });\n\n // Get basic info\n const paragraphCount = document.package.document.content.filter(\n (b) => b.type === 'paragraph'\n ).length;\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n documentId: docId,\n source,\n paragraphCount,\n message: 'Document loaded successfully',\n }),\n },\n ],\n };\n } catch (error) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Failed to load document: ${(error as Error).message}` }],\n };\n }\n },\n\n annotations: {\n category: 'core',\n readOnly: false,\n complexity: 'low',\n },\n};\n\n/**\n * Save a document to base64\n */\nexport const saveDocumentTool: McpToolDefinition = {\n name: 'docx_save',\n description: `Export the document to base64-encoded DOCX format.\nReturns the document as a base64 string that can be saved to a file.`,\n\n inputSchema: {\n type: 'object',\n properties: {\n documentId: documentIdSchema,\n },\n required: ['documentId'],\n },\n\n handler: async (input: unknown, context: McpToolContext): Promise<McpToolResult> => {\n const { documentId } = input as { documentId: string };\n\n const loaded = context.session.documents.get(documentId);\n if (!loaded) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Document not found: ${documentId}` }],\n };\n }\n\n try {\n // Repack or create the DOCX\n let buffer: ArrayBuffer;\n if (loaded.buffer) {\n // Preserve original structure\n buffer = await repackDocx(loaded.document);\n } else {\n // Create from scratch\n buffer = await createDocx(loaded.document);\n }\n\n // Encode to base64\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n const base64 = btoa(binary);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n documentId,\n base64,\n size: buffer.byteLength,\n message: 'Document exported successfully',\n }),\n },\n ],\n };\n } catch (error) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Failed to save document: ${(error as Error).message}` }],\n };\n }\n },\n\n annotations: {\n category: 'core',\n readOnly: true,\n complexity: 'low',\n },\n};\n\n/**\n * Close a document\n */\nexport const closeDocumentTool: McpToolDefinition = {\n name: 'docx_close',\n description: `Close a document and free its memory.\nUse this when done working with a document.`,\n\n inputSchema: {\n type: 'object',\n properties: {\n documentId: documentIdSchema,\n },\n required: ['documentId'],\n },\n\n handler: async (input: unknown, context: McpToolContext): Promise<McpToolResult> => {\n const { documentId } = input as { documentId: string };\n\n if (!context.session.documents.has(documentId)) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Document not found: ${documentId}` }],\n };\n }\n\n context.session.documents.delete(documentId);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n documentId,\n message: 'Document closed',\n }),\n },\n ],\n };\n },\n\n annotations: {\n category: 'core',\n readOnly: false,\n complexity: 'low',\n },\n};\n\n// ============================================================================\n// DOCUMENT INFORMATION\n// ============================================================================\n\n/**\n * Get document information\n */\nexport const getDocumentInfoTool: McpToolDefinition = {\n name: 'docx_get_info',\n description: `Get metadata and statistics about a document.\nReturns paragraph count, word count, table count, and other useful info.`,\n\n inputSchema: {\n type: 'object',\n properties: {\n documentId: documentIdSchema,\n },\n required: ['documentId'],\n },\n\n handler: async (input: unknown, context: McpToolContext): Promise<McpToolResult> => {\n const { documentId } = input as { documentId: string };\n\n const loaded = context.session.documents.get(documentId);\n if (!loaded) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Document not found: ${documentId}` }],\n };\n }\n\n const doc = loaded.document;\n const body = doc.package.document;\n\n const paragraphs = body.content.filter((b) => b.type === 'paragraph');\n const tables = body.content.filter((b) => b.type === 'table');\n\n // Count words\n let wordCount = 0;\n for (const para of paragraphs) {\n if (para.type === 'paragraph') {\n const text = getParagraphText(para);\n wordCount += text.split(/\\s+/).filter((w) => w.length > 0).length;\n }\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n documentId,\n paragraphCount: paragraphs.length,\n tableCount: tables.length,\n wordCount,\n hasStyles: !!doc.package.styles,\n hasTheme: !!doc.package.theme,\n source: loaded.source,\n lastModified: loaded.lastModified,\n }),\n },\n ],\n };\n },\n\n annotations: {\n category: 'core',\n readOnly: true,\n complexity: 'low',\n },\n};\n\n/**\n * Get document plain text\n */\nexport const getDocumentTextTool: McpToolDefinition = {\n name: 'docx_get_text',\n description: `Get the plain text content of the document.\nReturns all text concatenated with paragraph breaks.\nUseful for understanding document content before making edits.`,\n\n inputSchema: {\n type: 'object',\n properties: {\n documentId: documentIdSchema,\n maxLength: {\n type: 'number',\n description: 'Maximum characters to return (default: 10000)',\n default: 10000,\n },\n },\n required: ['documentId'],\n },\n\n handler: async (input: unknown, context: McpToolContext): Promise<McpToolResult> => {\n const { documentId, maxLength = 10000 } = input as {\n documentId: string;\n maxLength?: number;\n };\n\n const loaded = context.session.documents.get(documentId);\n if (!loaded) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Document not found: ${documentId}` }],\n };\n }\n\n const body = loaded.document.package.document;\n const texts: string[] = [];\n\n for (const block of body.content) {\n if (block.type === 'paragraph') {\n texts.push(getParagraphText(block));\n } else if (block.type === 'table') {\n texts.push('[TABLE]');\n }\n }\n\n let text = texts.join('\\n');\n const truncated = text.length > maxLength;\n if (truncated) {\n text = text.slice(0, maxLength) + '...';\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n documentId,\n text,\n truncated,\n totalLength: truncated ? texts.join('\\n').length : text.length,\n }),\n },\n ],\n };\n },\n\n annotations: {\n category: 'core',\n readOnly: true,\n complexity: 'low',\n },\n};\n\n// ============================================================================\n// TEXT MANIPULATION\n// ============================================================================\n\n/**\n * Insert text at a position\n */\nexport const insertTextTool: McpToolDefinition = {\n name: 'docx_insert_text',\n description: `Insert text at a specific position in the document.\nPosition is specified by paragraph index (0-indexed) and character offset.`,\n\n inputSchema: {\n type: 'object',\n properties: {\n documentId: documentIdSchema,\n position: positionSchema,\n text: {\n type: 'string',\n description: 'Text to insert',\n },\n },\n required: ['documentId', 'position', 'text'],\n },\n\n handler: async (input: unknown, context: McpToolContext): Promise<McpToolResult> => {\n const { documentId, position, text } = input as {\n documentId: string;\n position: { paragraphIndex: number; offset: number };\n text: string;\n };\n\n const loaded = context.session.documents.get(documentId);\n if (!loaded) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Document not found: ${documentId}` }],\n };\n }\n\n try {\n const newDoc = executeCommand(loaded.document, {\n type: 'insertText',\n position,\n text,\n });\n\n loaded.document = newDoc;\n loaded.lastModified = Date.now();\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n insertedLength: text.length,\n position,\n }),\n },\n ],\n };\n } catch (error) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Failed to insert text: ${(error as Error).message}` }],\n };\n }\n },\n\n annotations: {\n category: 'core',\n readOnly: false,\n complexity: 'low',\n },\n};\n\n/**\n * Replace text in a range\n */\nexport const replaceTextTool: McpToolDefinition = {\n name: 'docx_replace_text',\n description: `Replace text in a range with new text.\nSpecify start and end positions to define the range to replace.`,\n\n inputSchema: {\n type: 'object',\n properties: {\n documentId: documentIdSchema,\n range: rangeSchema,\n text: {\n type: 'string',\n description: 'Replacement text',\n },\n },\n required: ['documentId', 'range', 'text'],\n },\n\n handler: async (input: unknown, context: McpToolContext): Promise<McpToolResult> => {\n const { documentId, range, text } = input as {\n documentId: string;\n range: {\n start: { paragraphIndex: number; offset: number };\n end: { paragraphIndex: number; offset: number };\n };\n text: string;\n };\n\n const loaded = context.session.documents.get(documentId);\n if (!loaded) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Document not found: ${documentId}` }],\n };\n }\n\n try {\n const newDoc = executeCommand(loaded.document, {\n type: 'replaceText',\n range,\n text,\n });\n\n loaded.document = newDoc;\n loaded.lastModified = Date.now();\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n replacedRange: range,\n newTextLength: text.length,\n }),\n },\n ],\n };\n } catch (error) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Failed to replace text: ${(error as Error).message}` }],\n };\n }\n },\n\n annotations: {\n category: 'core',\n readOnly: false,\n complexity: 'low',\n },\n};\n\n/**\n * Delete text in a range\n */\nexport const deleteTextTool: McpToolDefinition = {\n name: 'docx_delete_text',\n description: `Delete text in a range.\nSpecify start and end positions to define the range to delete.`,\n\n inputSchema: {\n type: 'object',\n properties: {\n documentId: documentIdSchema,\n range: rangeSchema,\n },\n required: ['documentId', 'range'],\n },\n\n handler: async (input: unknown, context: McpToolContext): Promise<McpToolResult> => {\n const { documentId, range } = input as {\n documentId: string;\n range: {\n start: { paragraphIndex: number; offset: number };\n end: { paragraphIndex: number; offset: number };\n };\n };\n\n const loaded = context.session.documents.get(documentId);\n if (!loaded) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Document not found: ${documentId}` }],\n };\n }\n\n try {\n const newDoc = executeCommand(loaded.document, {\n type: 'deleteText',\n range,\n });\n\n loaded.document = newDoc;\n loaded.lastModified = Date.now();\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n deletedRange: range,\n }),\n },\n ],\n };\n } catch (error) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Failed to delete text: ${(error as Error).message}` }],\n };\n }\n },\n\n annotations: {\n category: 'core',\n readOnly: false,\n complexity: 'low',\n },\n};\n\n// ============================================================================\n// FORMATTING\n// ============================================================================\n\n/**\n * Apply text formatting\n */\nexport const formatTextTool: McpToolDefinition = {\n name: 'docx_format_text',\n description: `Apply formatting to text in a range.\nSupports bold, italic, underline, font size, font family, color, and highlight.`,\n\n inputSchema: {\n type: 'object',\n properties: {\n documentId: documentIdSchema,\n range: rangeSchema,\n formatting: {\n type: 'object',\n description: 'Formatting options to apply',\n properties: {\n bold: { type: 'boolean' },\n italic: { type: 'boolean' },\n underline: { type: 'boolean' },\n strikethrough: { type: 'boolean' },\n fontSize: { type: 'number', description: 'Font size in points' },\n fontFamily: { type: 'string' },\n color: { type: 'string', description: 'Hex color (e.g., \"#FF0000\")' },\n highlight: { type: 'string', description: 'Highlight color name' },\n },\n },\n },\n required: ['documentId', 'range', 'formatting'],\n },\n\n handler: async (input: unknown, context: McpToolContext): Promise<McpToolResult> => {\n const { documentId, range, formatting } = input as {\n documentId: string;\n range: {\n start: { paragraphIndex: number; offset: number };\n end: { paragraphIndex: number; offset: number };\n };\n formatting: Record<string, unknown>;\n };\n\n const loaded = context.session.documents.get(documentId);\n if (!loaded) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Document not found: ${documentId}` }],\n };\n }\n\n try {\n const newDoc = executeCommand(loaded.document, {\n type: 'formatText',\n range,\n formatting,\n });\n\n loaded.document = newDoc;\n loaded.lastModified = Date.now();\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n range,\n appliedFormatting: formatting,\n }),\n },\n ],\n };\n } catch (error) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Failed to format text: ${(error as Error).message}` }],\n };\n }\n },\n\n annotations: {\n category: 'core',\n readOnly: false,\n complexity: 'medium',\n },\n};\n\n/**\n * Apply paragraph style\n */\nexport const applyStyleTool: McpToolDefinition = {\n name: 'docx_apply_style',\n description: `Apply a named style to a paragraph.\nUse document styles like \"Heading1\", \"Heading2\", \"Normal\", etc.`,\n\n inputSchema: {\n type: 'object',\n properties: {\n documentId: documentIdSchema,\n paragraphIndex: {\n type: 'number',\n description: 'Index of the paragraph (0-indexed)',\n minimum: 0,\n },\n styleId: {\n type: 'string',\n description: 'Style ID (e.g., \"Heading1\", \"Normal\")',\n },\n },\n required: ['documentId', 'paragraphIndex', 'styleId'],\n },\n\n handler: async (input: unknown, context: McpToolContext): Promise<McpToolResult> => {\n const { documentId, paragraphIndex, styleId } = input as {\n documentId: string;\n paragraphIndex: number;\n styleId: string;\n };\n\n const loaded = context.session.documents.get(documentId);\n if (!loaded) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Document not found: ${documentId}` }],\n };\n }\n\n try {\n const newDoc = executeCommand(loaded.document, {\n type: 'applyStyle',\n paragraphIndex,\n styleId,\n });\n\n loaded.document = newDoc;\n loaded.lastModified = Date.now();\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n paragraphIndex,\n styleId,\n }),\n },\n ],\n };\n } catch (error) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Failed to apply style: ${(error as Error).message}` }],\n };\n }\n },\n\n annotations: {\n category: 'core',\n readOnly: false,\n complexity: 'low',\n },\n};\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\nimport type { Paragraph, Run, Hyperlink } from '../types/document';\n\nfunction getParagraphText(paragraph: Paragraph): string {\n const texts: string[] = [];\n\n for (const item of paragraph.content) {\n if (item.type === 'run') {\n texts.push(getRunText(item));\n } else if (item.type === 'hyperlink') {\n texts.push(getHyperlinkText(item));\n }\n }\n\n return texts.join('');\n}\n\nfunction getRunText(run: Run): string {\n return run.content\n .filter((c) => c.type === 'text')\n .map((c) => (c as { type: 'text'; text: string }).text)\n .join('');\n}\n\nfunction getHyperlinkText(hyperlink: Hyperlink): string {\n const texts: string[] = [];\n for (const child of hyperlink.children) {\n if (child.type === 'run') {\n texts.push(getRunText(child));\n }\n }\n return texts.join('');\n}\n\n// ============================================================================\n// EXPORT ALL CORE TOOLS\n// ============================================================================\n\nexport const coreMcpTools: McpToolDefinition[] = [\n // Document loading/saving\n loadDocumentTool,\n saveDocumentTool,\n closeDocumentTool,\n\n // Document information\n getDocumentInfoTool,\n getDocumentTextTool,\n\n // Text manipulation\n insertTextTool,\n replaceTextTool,\n deleteTextTool,\n\n // Formatting\n formatTextTool,\n applyStyleTool,\n];\n","/**\n * MCP Server\n *\n * Model Context Protocol server that exposes document editing tools to AI clients.\n * Discovers and registers tools from the plugin system plus core built-in tools.\n *\n * @example\n * ```ts\n * import { createMcpServer, startStdioServer } from '@eigenpal/docx-editor/mcp';\n * import { pluginRegistry, docxtemplaterPlugin } from '@eigenpal/docx-editor/core-plugins';\n *\n * // Register plugins\n * pluginRegistry.register(docxtemplaterPlugin);\n *\n * // Start MCP server\n * startStdioServer();\n * ```\n */\n\nimport type {\n McpToolDefinition,\n McpToolContext,\n McpSession,\n LoadedDocument,\n JsonSchema,\n} from '../core-plugins/types';\nimport { pluginRegistry } from '../core-plugins/registry';\nimport { coreMcpTools } from './core-tools';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * MCP Server configuration\n */\nexport interface McpServerConfig {\n /** Server name */\n name?: string;\n\n /** Server version */\n version?: string;\n\n /** Include core tools (default: true) */\n includeCoreTools?: boolean;\n\n /** Enable debug logging */\n debug?: boolean;\n\n /** Custom tools to add */\n additionalTools?: McpToolDefinition[];\n}\n\n/**\n * MCP Server instance\n */\nexport interface McpServer {\n /** All registered tools */\n tools: Map<string, McpToolDefinition>;\n\n /** Active session */\n session: McpSession;\n\n /** Handle a tool call */\n handleToolCall(toolName: string, input: unknown): Promise<unknown>;\n\n /** List available tools */\n listTools(): McpToolInfo[];\n\n /** Get server info */\n getInfo(): { name: string; version: string; toolCount: number };\n}\n\n/**\n * Tool info for listing\n */\nexport interface McpToolInfo {\n name: string;\n description: string;\n inputSchema: JsonSchema;\n category?: string;\n}\n\n// ============================================================================\n// SERVER CREATION\n// ============================================================================\n\n/**\n * Create an MCP server instance\n *\n * @param config - Server configuration\n * @returns MCP server instance\n */\nexport function createMcpServer(config: McpServerConfig = {}): McpServer {\n const {\n name = 'docx-editor',\n version = '0.1.0',\n includeCoreTools = true,\n debug = false,\n additionalTools = [],\n } = config;\n\n const tools = new Map<string, McpToolDefinition>();\n\n // Create session\n const session: McpSession = {\n id: `session_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n documents: new Map<string, LoadedDocument>(),\n data: new Map<string, unknown>(),\n };\n\n // Register core tools\n if (includeCoreTools) {\n for (const tool of coreMcpTools) {\n tools.set(tool.name, tool);\n if (debug) {\n console.log(`[MCP] Registered core tool: ${tool.name}`);\n }\n }\n }\n\n // Register plugin tools\n const pluginTools = pluginRegistry.getMcpTools();\n for (const tool of pluginTools) {\n if (tools.has(tool.name)) {\n console.warn(`[MCP] Tool '${tool.name}' from plugin overrides existing tool`);\n }\n tools.set(tool.name, tool);\n if (debug) {\n console.log(`[MCP] Registered plugin tool: ${tool.name}`);\n }\n }\n\n // Register additional tools\n for (const tool of additionalTools) {\n tools.set(tool.name, tool);\n if (debug) {\n console.log(`[MCP] Registered additional tool: ${tool.name}`);\n }\n }\n\n // Create logger\n const log = debug\n ? (message: string, data?: unknown) => {\n console.log(`[MCP] ${message}`, data ?? '');\n }\n : () => {};\n\n // Handle tool call\n async function handleToolCall(toolName: string, input: unknown): Promise<unknown> {\n const tool = tools.get(toolName);\n if (!tool) {\n throw new Error(`Unknown tool: ${toolName}`);\n }\n\n log(`Calling tool: ${toolName}`, input);\n\n // Create context\n const context: McpToolContext = {\n session,\n log,\n };\n\n // Execute handler\n try {\n const result = await tool.handler(input, context);\n log(`Tool ${toolName} completed`, result);\n return result;\n } catch (error) {\n log(`Tool ${toolName} failed`, error);\n throw error;\n }\n }\n\n // List tools\n function listTools(): McpToolInfo[] {\n return Array.from(tools.values()).map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: convertToJsonSchema(tool.inputSchema),\n category: tool.annotations?.category,\n }));\n }\n\n // Get info\n function getInfo() {\n return {\n name,\n version,\n toolCount: tools.size,\n };\n }\n\n return {\n tools,\n session,\n handleToolCall,\n listTools,\n getInfo,\n };\n}\n\n// ============================================================================\n// JSON-RPC PROTOCOL\n// ============================================================================\n\n/**\n * JSON-RPC request\n */\ninterface JsonRpcRequest {\n jsonrpc: '2.0';\n id: string | number;\n method: string;\n params?: unknown;\n}\n\n/**\n * JSON-RPC response\n */\ninterface JsonRpcResponse {\n jsonrpc: '2.0';\n id: string | number;\n result?: unknown;\n error?: {\n code: number;\n message: string;\n data?: unknown;\n };\n}\n\n/**\n * Handle a JSON-RPC request\n */\nexport async function handleJsonRpcRequest(\n server: McpServer,\n request: JsonRpcRequest\n): Promise<JsonRpcResponse> {\n const { id, method, params } = request;\n\n try {\n switch (method) {\n case 'initialize': {\n return {\n jsonrpc: '2.0',\n id,\n result: {\n protocolVersion: '2024-11-05',\n capabilities: {\n tools: {},\n },\n serverInfo: server.getInfo(),\n },\n };\n }\n\n case 'tools/list': {\n const tools = server.listTools();\n return {\n jsonrpc: '2.0',\n id,\n result: {\n tools: tools.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n },\n };\n }\n\n case 'tools/call': {\n const { name, arguments: args } = params as {\n name: string;\n arguments: unknown;\n };\n const result = await server.handleToolCall(name, args);\n return {\n jsonrpc: '2.0',\n id,\n result,\n };\n }\n\n default:\n return {\n jsonrpc: '2.0',\n id,\n error: {\n code: -32601,\n message: `Method not found: ${method}`,\n },\n };\n }\n } catch (error) {\n return {\n jsonrpc: '2.0',\n id,\n error: {\n code: -32000,\n message: (error as Error).message,\n },\n };\n }\n}\n\n// ============================================================================\n// STDIO TRANSPORT\n// ============================================================================\n\n/**\n * Start the MCP server with stdio transport\n *\n * Reads JSON-RPC requests from stdin, writes responses to stdout.\n * This is the standard way to run an MCP server for Claude Desktop.\n */\nexport async function startStdioServer(config: McpServerConfig = {}): Promise<void> {\n const server = createMcpServer(config);\n\n if (config.debug) {\n console.error(`[MCP] Server started: ${server.getInfo().name} v${server.getInfo().version}`);\n console.error(`[MCP] Tools registered: ${server.tools.size}`);\n }\n\n // Read from stdin\n const readline = await import('readline');\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: false,\n });\n\n let buffer = '';\n\n rl.on('line', async (line) => {\n buffer += line;\n\n // Try to parse complete JSON\n try {\n const request = JSON.parse(buffer) as JsonRpcRequest;\n buffer = '';\n\n const response = await handleJsonRpcRequest(server, request);\n\n // Write response to stdout\n process.stdout.write(JSON.stringify(response) + '\\n');\n } catch {\n // Incomplete JSON, wait for more\n }\n });\n\n rl.on('close', () => {\n if (config.debug) {\n console.error('[MCP] Server closed');\n }\n process.exit(0);\n });\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Convert schema to JSON Schema format\n */\nfunction convertToJsonSchema(schema: JsonSchema | unknown): JsonSchema {\n // If it's already a JSON Schema object, return it\n if (\n typeof schema === 'object' &&\n schema !== null &&\n ('type' in schema || 'properties' in schema)\n ) {\n return schema as JsonSchema;\n }\n\n // If it's a Zod-like schema, try to convert\n // For now, just return a basic object schema\n return {\n type: 'object',\n properties: {},\n };\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport { coreMcpTools } from './core-tools';\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../core/src/mcp/core-tools.ts","../../core/src/mcp/server.ts"],"names":["documentIdSchema","positionSchema","rangeSchema","loadDocumentTool","input","context","content","source","binaryString","bytes","i","buffer","document","parseDocx","docId","paragraphCount","b","error","saveDocumentTool","documentId","loaded","repackDocx","createDocx","binary","base64","closeDocumentTool","getDocumentInfoTool","doc","body","paragraphs","tables","wordCount","para","text","getParagraphText","w","getDocumentTextTool","maxLength","texts","block","truncated","insertTextTool","position","newDoc","executeCommand","replaceTextTool","range","deleteTextTool","formatTextTool","formatting","applyStyleTool","paragraphIndex","styleId","paragraph","item","getRunText","getHyperlinkText","run","c","hyperlink","child","coreMcpTools","createMcpServer","config","name","version","includeCoreTools","debug","additionalTools","tools","session","tool","pluginTools","pluginRegistry","log","message","data","handleToolCall","toolName","result","listTools","convertToJsonSchema","getInfo","handleJsonRpcRequest","server","request","id","method","params","t","args","startStdioServer","rl","line","response","schema"],"mappings":"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","file":"mcp-reexport.js","sourcesContent":["/**\n * Core MCP Tools\n *\n * Built-in MCP tools for document operations that are always available.\n * These provide basic document manipulation without requiring plugins.\n */\n\nimport type {\n McpToolDefinition,\n McpToolContext,\n McpToolResult,\n JsonSchema,\n} from '../core-plugins/types';\nimport { parseDocx } from '../docx/parser';\nimport { repackDocx, createDocx } from '../docx/rezip';\nimport { executeCommand } from '../agent/executor';\n\n// ============================================================================\n// SCHEMAS\n// ============================================================================\n\nconst documentIdSchema: JsonSchema = {\n type: 'string',\n description: 'Document ID returned from docx_load',\n};\n\nconst positionSchema: JsonSchema = {\n type: 'object',\n properties: {\n paragraphIndex: {\n type: 'number',\n description: 'Index of the paragraph (0-indexed)',\n minimum: 0,\n },\n offset: {\n type: 'number',\n description: 'Character offset within the paragraph',\n minimum: 0,\n },\n },\n required: ['paragraphIndex', 'offset'],\n};\n\nconst rangeSchema: JsonSchema = {\n type: 'object',\n properties: {\n start: positionSchema,\n end: positionSchema,\n },\n required: ['start', 'end'],\n};\n\n// ============================================================================\n// DOCUMENT LOADING/SAVING\n// ============================================================================\n\n/**\n * Load a DOCX document from base64\n */\nexport const loadDocumentTool: McpToolDefinition = {\n name: 'docx_load',\n description: `Load a DOCX document from base64-encoded content.\nReturns a document ID that can be used with other tools.\nThe document remains in session memory until closed.`,\n\n inputSchema: {\n type: 'object',\n properties: {\n content: {\n type: 'string',\n description: 'Base64-encoded DOCX file content',\n },\n source: {\n type: 'string',\n description: 'Optional source filename or identifier for reference',\n },\n },\n required: ['content'],\n },\n\n handler: async (input: unknown, context: McpToolContext): Promise<McpToolResult> => {\n const { content, source } = input as { content: string; source?: string };\n\n try {\n // Decode base64 to ArrayBuffer\n const binaryString = atob(content);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n const buffer = bytes.buffer;\n\n // Parse the document\n const document = await parseDocx(buffer);\n\n // Generate document ID\n const docId = `doc_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n\n // Store in session\n context.session.documents.set(docId, {\n id: docId,\n document,\n buffer,\n source,\n lastModified: Date.now(),\n });\n\n // Get basic info\n const paragraphCount = document.package.document.content.filter(\n (b) => b.type === 'paragraph'\n ).length;\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n documentId: docId,\n source,\n paragraphCount,\n message: 'Document loaded successfully',\n }),\n },\n ],\n };\n } catch (error) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Failed to load document: ${(error as Error).message}` }],\n };\n }\n },\n\n annotations: {\n category: 'core',\n readOnly: false,\n complexity: 'low',\n },\n};\n\n/**\n * Save a document to base64\n */\nexport const saveDocumentTool: McpToolDefinition = {\n name: 'docx_save',\n description: `Export the document to base64-encoded DOCX format.\nReturns the document as a base64 string that can be saved to a file.`,\n\n inputSchema: {\n type: 'object',\n properties: {\n documentId: documentIdSchema,\n },\n required: ['documentId'],\n },\n\n handler: async (input: unknown, context: McpToolContext): Promise<McpToolResult> => {\n const { documentId } = input as { documentId: string };\n\n const loaded = context.session.documents.get(documentId);\n if (!loaded) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Document not found: ${documentId}` }],\n };\n }\n\n try {\n // Repack or create the DOCX\n let buffer: ArrayBuffer;\n if (loaded.buffer) {\n // Preserve original structure\n buffer = await repackDocx(loaded.document);\n } else {\n // Create from scratch\n buffer = await createDocx(loaded.document);\n }\n\n // Encode to base64\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n const base64 = btoa(binary);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n documentId,\n base64,\n size: buffer.byteLength,\n message: 'Document exported successfully',\n }),\n },\n ],\n };\n } catch (error) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Failed to save document: ${(error as Error).message}` }],\n };\n }\n },\n\n annotations: {\n category: 'core',\n readOnly: true,\n complexity: 'low',\n },\n};\n\n/**\n * Close a document\n */\nexport const closeDocumentTool: McpToolDefinition = {\n name: 'docx_close',\n description: `Close a document and free its memory.\nUse this when done working with a document.`,\n\n inputSchema: {\n type: 'object',\n properties: {\n documentId: documentIdSchema,\n },\n required: ['documentId'],\n },\n\n handler: async (input: unknown, context: McpToolContext): Promise<McpToolResult> => {\n const { documentId } = input as { documentId: string };\n\n if (!context.session.documents.has(documentId)) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Document not found: ${documentId}` }],\n };\n }\n\n context.session.documents.delete(documentId);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n documentId,\n message: 'Document closed',\n }),\n },\n ],\n };\n },\n\n annotations: {\n category: 'core',\n readOnly: false,\n complexity: 'low',\n },\n};\n\n// ============================================================================\n// DOCUMENT INFORMATION\n// ============================================================================\n\n/**\n * Get document information\n */\nexport const getDocumentInfoTool: McpToolDefinition = {\n name: 'docx_get_info',\n description: `Get metadata and statistics about a document.\nReturns paragraph count, word count, table count, and other useful info.`,\n\n inputSchema: {\n type: 'object',\n properties: {\n documentId: documentIdSchema,\n },\n required: ['documentId'],\n },\n\n handler: async (input: unknown, context: McpToolContext): Promise<McpToolResult> => {\n const { documentId } = input as { documentId: string };\n\n const loaded = context.session.documents.get(documentId);\n if (!loaded) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Document not found: ${documentId}` }],\n };\n }\n\n const doc = loaded.document;\n const body = doc.package.document;\n\n const paragraphs = body.content.filter((b) => b.type === 'paragraph');\n const tables = body.content.filter((b) => b.type === 'table');\n\n // Count words\n let wordCount = 0;\n for (const para of paragraphs) {\n if (para.type === 'paragraph') {\n const text = getParagraphText(para);\n wordCount += text.split(/\\s+/).filter((w) => w.length > 0).length;\n }\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n documentId,\n paragraphCount: paragraphs.length,\n tableCount: tables.length,\n wordCount,\n hasStyles: !!doc.package.styles,\n hasTheme: !!doc.package.theme,\n source: loaded.source,\n lastModified: loaded.lastModified,\n }),\n },\n ],\n };\n },\n\n annotations: {\n category: 'core',\n readOnly: true,\n complexity: 'low',\n },\n};\n\n/**\n * Get document plain text\n */\nexport const getDocumentTextTool: McpToolDefinition = {\n name: 'docx_get_text',\n description: `Get the plain text content of the document.\nReturns all text concatenated with paragraph breaks.\nUseful for understanding document content before making edits.`,\n\n inputSchema: {\n type: 'object',\n properties: {\n documentId: documentIdSchema,\n maxLength: {\n type: 'number',\n description: 'Maximum characters to return (default: 10000)',\n default: 10000,\n },\n },\n required: ['documentId'],\n },\n\n handler: async (input: unknown, context: McpToolContext): Promise<McpToolResult> => {\n const { documentId, maxLength = 10000 } = input as {\n documentId: string;\n maxLength?: number;\n };\n\n const loaded = context.session.documents.get(documentId);\n if (!loaded) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Document not found: ${documentId}` }],\n };\n }\n\n const body = loaded.document.package.document;\n const texts: string[] = [];\n\n for (const block of body.content) {\n if (block.type === 'paragraph') {\n texts.push(getParagraphText(block));\n } else if (block.type === 'table') {\n texts.push('[TABLE]');\n }\n }\n\n let text = texts.join('\\n');\n const truncated = text.length > maxLength;\n if (truncated) {\n text = text.slice(0, maxLength) + '...';\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n documentId,\n text,\n truncated,\n totalLength: truncated ? texts.join('\\n').length : text.length,\n }),\n },\n ],\n };\n },\n\n annotations: {\n category: 'core',\n readOnly: true,\n complexity: 'low',\n },\n};\n\n// ============================================================================\n// TEXT MANIPULATION\n// ============================================================================\n\n/**\n * Insert text at a position\n */\nexport const insertTextTool: McpToolDefinition = {\n name: 'docx_insert_text',\n description: `Insert text at a specific position in the document.\nPosition is specified by paragraph index (0-indexed) and character offset.`,\n\n inputSchema: {\n type: 'object',\n properties: {\n documentId: documentIdSchema,\n position: positionSchema,\n text: {\n type: 'string',\n description: 'Text to insert',\n },\n },\n required: ['documentId', 'position', 'text'],\n },\n\n handler: async (input: unknown, context: McpToolContext): Promise<McpToolResult> => {\n const { documentId, position, text } = input as {\n documentId: string;\n position: { paragraphIndex: number; offset: number };\n text: string;\n };\n\n const loaded = context.session.documents.get(documentId);\n if (!loaded) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Document not found: ${documentId}` }],\n };\n }\n\n try {\n const newDoc = executeCommand(loaded.document, {\n type: 'insertText',\n position,\n text,\n });\n\n loaded.document = newDoc;\n loaded.lastModified = Date.now();\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n insertedLength: text.length,\n position,\n }),\n },\n ],\n };\n } catch (error) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Failed to insert text: ${(error as Error).message}` }],\n };\n }\n },\n\n annotations: {\n category: 'core',\n readOnly: false,\n complexity: 'low',\n },\n};\n\n/**\n * Replace text in a range\n */\nexport const replaceTextTool: McpToolDefinition = {\n name: 'docx_replace_text',\n description: `Replace text in a range with new text.\nSpecify start and end positions to define the range to replace.`,\n\n inputSchema: {\n type: 'object',\n properties: {\n documentId: documentIdSchema,\n range: rangeSchema,\n text: {\n type: 'string',\n description: 'Replacement text',\n },\n },\n required: ['documentId', 'range', 'text'],\n },\n\n handler: async (input: unknown, context: McpToolContext): Promise<McpToolResult> => {\n const { documentId, range, text } = input as {\n documentId: string;\n range: {\n start: { paragraphIndex: number; offset: number };\n end: { paragraphIndex: number; offset: number };\n };\n text: string;\n };\n\n const loaded = context.session.documents.get(documentId);\n if (!loaded) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Document not found: ${documentId}` }],\n };\n }\n\n try {\n const newDoc = executeCommand(loaded.document, {\n type: 'replaceText',\n range,\n text,\n });\n\n loaded.document = newDoc;\n loaded.lastModified = Date.now();\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n replacedRange: range,\n newTextLength: text.length,\n }),\n },\n ],\n };\n } catch (error) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Failed to replace text: ${(error as Error).message}` }],\n };\n }\n },\n\n annotations: {\n category: 'core',\n readOnly: false,\n complexity: 'low',\n },\n};\n\n/**\n * Delete text in a range\n */\nexport const deleteTextTool: McpToolDefinition = {\n name: 'docx_delete_text',\n description: `Delete text in a range.\nSpecify start and end positions to define the range to delete.`,\n\n inputSchema: {\n type: 'object',\n properties: {\n documentId: documentIdSchema,\n range: rangeSchema,\n },\n required: ['documentId', 'range'],\n },\n\n handler: async (input: unknown, context: McpToolContext): Promise<McpToolResult> => {\n const { documentId, range } = input as {\n documentId: string;\n range: {\n start: { paragraphIndex: number; offset: number };\n end: { paragraphIndex: number; offset: number };\n };\n };\n\n const loaded = context.session.documents.get(documentId);\n if (!loaded) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Document not found: ${documentId}` }],\n };\n }\n\n try {\n const newDoc = executeCommand(loaded.document, {\n type: 'deleteText',\n range,\n });\n\n loaded.document = newDoc;\n loaded.lastModified = Date.now();\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n deletedRange: range,\n }),\n },\n ],\n };\n } catch (error) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Failed to delete text: ${(error as Error).message}` }],\n };\n }\n },\n\n annotations: {\n category: 'core',\n readOnly: false,\n complexity: 'low',\n },\n};\n\n// ============================================================================\n// FORMATTING\n// ============================================================================\n\n/**\n * Apply text formatting\n */\nexport const formatTextTool: McpToolDefinition = {\n name: 'docx_format_text',\n description: `Apply formatting to text in a range.\nSupports bold, italic, underline, font size, font family, color, and highlight.`,\n\n inputSchema: {\n type: 'object',\n properties: {\n documentId: documentIdSchema,\n range: rangeSchema,\n formatting: {\n type: 'object',\n description: 'Formatting options to apply',\n properties: {\n bold: { type: 'boolean' },\n italic: { type: 'boolean' },\n underline: { type: 'boolean' },\n strikethrough: { type: 'boolean' },\n fontSize: { type: 'number', description: 'Font size in points' },\n fontFamily: { type: 'string' },\n color: { type: 'string', description: 'Hex color (e.g., \"#FF0000\")' },\n highlight: { type: 'string', description: 'Highlight color name' },\n },\n },\n },\n required: ['documentId', 'range', 'formatting'],\n },\n\n handler: async (input: unknown, context: McpToolContext): Promise<McpToolResult> => {\n const { documentId, range, formatting } = input as {\n documentId: string;\n range: {\n start: { paragraphIndex: number; offset: number };\n end: { paragraphIndex: number; offset: number };\n };\n formatting: Record<string, unknown>;\n };\n\n const loaded = context.session.documents.get(documentId);\n if (!loaded) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Document not found: ${documentId}` }],\n };\n }\n\n try {\n const newDoc = executeCommand(loaded.document, {\n type: 'formatText',\n range,\n formatting,\n });\n\n loaded.document = newDoc;\n loaded.lastModified = Date.now();\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n range,\n appliedFormatting: formatting,\n }),\n },\n ],\n };\n } catch (error) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Failed to format text: ${(error as Error).message}` }],\n };\n }\n },\n\n annotations: {\n category: 'core',\n readOnly: false,\n complexity: 'medium',\n },\n};\n\n/**\n * Apply paragraph style\n */\nexport const applyStyleTool: McpToolDefinition = {\n name: 'docx_apply_style',\n description: `Apply a named style to a paragraph.\nUse document styles like \"Heading1\", \"Heading2\", \"Normal\", etc.`,\n\n inputSchema: {\n type: 'object',\n properties: {\n documentId: documentIdSchema,\n paragraphIndex: {\n type: 'number',\n description: 'Index of the paragraph (0-indexed)',\n minimum: 0,\n },\n styleId: {\n type: 'string',\n description: 'Style ID (e.g., \"Heading1\", \"Normal\")',\n },\n },\n required: ['documentId', 'paragraphIndex', 'styleId'],\n },\n\n handler: async (input: unknown, context: McpToolContext): Promise<McpToolResult> => {\n const { documentId, paragraphIndex, styleId } = input as {\n documentId: string;\n paragraphIndex: number;\n styleId: string;\n };\n\n const loaded = context.session.documents.get(documentId);\n if (!loaded) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Document not found: ${documentId}` }],\n };\n }\n\n try {\n const newDoc = executeCommand(loaded.document, {\n type: 'applyStyle',\n paragraphIndex,\n styleId,\n });\n\n loaded.document = newDoc;\n loaded.lastModified = Date.now();\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n paragraphIndex,\n styleId,\n }),\n },\n ],\n };\n } catch (error) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Failed to apply style: ${(error as Error).message}` }],\n };\n }\n },\n\n annotations: {\n category: 'core',\n readOnly: false,\n complexity: 'low',\n },\n};\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\nimport type { Paragraph, Run, Hyperlink } from '../types/document';\n\nfunction getParagraphText(paragraph: Paragraph): string {\n const texts: string[] = [];\n\n for (const item of paragraph.content) {\n if (item.type === 'run') {\n texts.push(getRunText(item));\n } else if (item.type === 'hyperlink') {\n texts.push(getHyperlinkText(item));\n }\n }\n\n return texts.join('');\n}\n\nfunction getRunText(run: Run): string {\n return run.content\n .filter((c) => c.type === 'text')\n .map((c) => (c as { type: 'text'; text: string }).text)\n .join('');\n}\n\nfunction getHyperlinkText(hyperlink: Hyperlink): string {\n const texts: string[] = [];\n for (const child of hyperlink.children) {\n if (child.type === 'run') {\n texts.push(getRunText(child));\n }\n }\n return texts.join('');\n}\n\n// ============================================================================\n// EXPORT ALL CORE TOOLS\n// ============================================================================\n\nexport const coreMcpTools: McpToolDefinition[] = [\n // Document loading/saving\n loadDocumentTool,\n saveDocumentTool,\n closeDocumentTool,\n\n // Document information\n getDocumentInfoTool,\n getDocumentTextTool,\n\n // Text manipulation\n insertTextTool,\n replaceTextTool,\n deleteTextTool,\n\n // Formatting\n formatTextTool,\n applyStyleTool,\n];\n","/**\n * MCP Server\n *\n * Model Context Protocol server that exposes document editing tools to AI clients.\n * Discovers and registers tools from the plugin system plus core built-in tools.\n *\n * @example\n * ```ts\n * import { createMcpServer, startStdioServer } from '@eigenpal/docx-editor/mcp';\n * import { pluginRegistry, docxtemplaterPlugin } from '@eigenpal/docx-editor/core-plugins';\n *\n * // Register plugins\n * pluginRegistry.register(docxtemplaterPlugin);\n *\n * // Start MCP server\n * startStdioServer();\n * ```\n */\n\nimport type {\n McpToolDefinition,\n McpToolContext,\n McpSession,\n LoadedDocument,\n JsonSchema,\n} from '../core-plugins/types';\nimport { pluginRegistry } from '../core-plugins/registry';\nimport { coreMcpTools } from './core-tools';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * MCP Server configuration\n */\nexport interface McpServerConfig {\n /** Server name */\n name?: string;\n\n /** Server version */\n version?: string;\n\n /** Include core tools (default: true) */\n includeCoreTools?: boolean;\n\n /** Enable debug logging */\n debug?: boolean;\n\n /** Custom tools to add */\n additionalTools?: McpToolDefinition[];\n}\n\n/**\n * MCP Server instance\n */\nexport interface McpServer {\n /** All registered tools */\n tools: Map<string, McpToolDefinition>;\n\n /** Active session */\n session: McpSession;\n\n /** Handle a tool call */\n handleToolCall(toolName: string, input: unknown): Promise<unknown>;\n\n /** List available tools */\n listTools(): McpToolInfo[];\n\n /** Get server info */\n getInfo(): { name: string; version: string; toolCount: number };\n}\n\n/**\n * Tool info for listing\n */\nexport interface McpToolInfo {\n name: string;\n description: string;\n inputSchema: JsonSchema;\n category?: string;\n}\n\n// ============================================================================\n// SERVER CREATION\n// ============================================================================\n\n/**\n * Create an MCP server instance\n *\n * @param config - Server configuration\n * @returns MCP server instance\n */\nexport function createMcpServer(config: McpServerConfig = {}): McpServer {\n const {\n name = 'docx-editor',\n version = '0.1.0',\n includeCoreTools = true,\n debug = false,\n additionalTools = [],\n } = config;\n\n const tools = new Map<string, McpToolDefinition>();\n\n // Create session\n const session: McpSession = {\n id: `session_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n documents: new Map<string, LoadedDocument>(),\n data: new Map<string, unknown>(),\n };\n\n // Register core tools\n if (includeCoreTools) {\n for (const tool of coreMcpTools) {\n tools.set(tool.name, tool);\n if (debug) {\n console.log(`[MCP] Registered core tool: ${tool.name}`);\n }\n }\n }\n\n // Register plugin tools\n const pluginTools = pluginRegistry.getMcpTools();\n for (const tool of pluginTools) {\n if (tools.has(tool.name)) {\n console.warn(`[MCP] Tool '${tool.name}' from plugin overrides existing tool`);\n }\n tools.set(tool.name, tool);\n if (debug) {\n console.log(`[MCP] Registered plugin tool: ${tool.name}`);\n }\n }\n\n // Register additional tools\n for (const tool of additionalTools) {\n tools.set(tool.name, tool);\n if (debug) {\n console.log(`[MCP] Registered additional tool: ${tool.name}`);\n }\n }\n\n // Create logger\n const log = debug\n ? (message: string, data?: unknown) => {\n console.log(`[MCP] ${message}`, data ?? '');\n }\n : () => {};\n\n // Handle tool call\n async function handleToolCall(toolName: string, input: unknown): Promise<unknown> {\n const tool = tools.get(toolName);\n if (!tool) {\n throw new Error(`Unknown tool: ${toolName}`);\n }\n\n log(`Calling tool: ${toolName}`, input);\n\n // Create context\n const context: McpToolContext = {\n session,\n log,\n };\n\n // Execute handler\n try {\n const result = await tool.handler(input, context);\n log(`Tool ${toolName} completed`, result);\n return result;\n } catch (error) {\n log(`Tool ${toolName} failed`, error);\n throw error;\n }\n }\n\n // List tools\n function listTools(): McpToolInfo[] {\n return Array.from(tools.values()).map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: convertToJsonSchema(tool.inputSchema),\n category: tool.annotations?.category,\n }));\n }\n\n // Get info\n function getInfo() {\n return {\n name,\n version,\n toolCount: tools.size,\n };\n }\n\n return {\n tools,\n session,\n handleToolCall,\n listTools,\n getInfo,\n };\n}\n\n// ============================================================================\n// JSON-RPC PROTOCOL\n// ============================================================================\n\n/**\n * JSON-RPC request\n */\ninterface JsonRpcRequest {\n jsonrpc: '2.0';\n id: string | number;\n method: string;\n params?: unknown;\n}\n\n/**\n * JSON-RPC response\n */\ninterface JsonRpcResponse {\n jsonrpc: '2.0';\n id: string | number;\n result?: unknown;\n error?: {\n code: number;\n message: string;\n data?: unknown;\n };\n}\n\n/**\n * Handle a JSON-RPC request\n */\nexport async function handleJsonRpcRequest(\n server: McpServer,\n request: JsonRpcRequest\n): Promise<JsonRpcResponse> {\n const { id, method, params } = request;\n\n try {\n switch (method) {\n case 'initialize': {\n return {\n jsonrpc: '2.0',\n id,\n result: {\n protocolVersion: '2024-11-05',\n capabilities: {\n tools: {},\n },\n serverInfo: server.getInfo(),\n },\n };\n }\n\n case 'tools/list': {\n const tools = server.listTools();\n return {\n jsonrpc: '2.0',\n id,\n result: {\n tools: tools.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n },\n };\n }\n\n case 'tools/call': {\n const { name, arguments: args } = params as {\n name: string;\n arguments: unknown;\n };\n const result = await server.handleToolCall(name, args);\n return {\n jsonrpc: '2.0',\n id,\n result,\n };\n }\n\n default:\n return {\n jsonrpc: '2.0',\n id,\n error: {\n code: -32601,\n message: `Method not found: ${method}`,\n },\n };\n }\n } catch (error) {\n return {\n jsonrpc: '2.0',\n id,\n error: {\n code: -32000,\n message: (error as Error).message,\n },\n };\n }\n}\n\n// ============================================================================\n// STDIO TRANSPORT\n// ============================================================================\n\n/**\n * Start the MCP server with stdio transport\n *\n * Reads JSON-RPC requests from stdin, writes responses to stdout.\n * This is the standard way to run an MCP server for Claude Desktop.\n */\nexport async function startStdioServer(config: McpServerConfig = {}): Promise<void> {\n const server = createMcpServer(config);\n\n if (config.debug) {\n console.error(`[MCP] Server started: ${server.getInfo().name} v${server.getInfo().version}`);\n console.error(`[MCP] Tools registered: ${server.tools.size}`);\n }\n\n // Read from stdin\n const readline = await import('readline');\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: false,\n });\n\n let buffer = '';\n\n rl.on('line', async (line) => {\n buffer += line;\n\n // Try to parse complete JSON\n try {\n const request = JSON.parse(buffer) as JsonRpcRequest;\n buffer = '';\n\n const response = await handleJsonRpcRequest(server, request);\n\n // Write response to stdout\n process.stdout.write(JSON.stringify(response) + '\\n');\n } catch {\n // Incomplete JSON, wait for more\n }\n });\n\n rl.on('close', () => {\n if (config.debug) {\n console.error('[MCP] Server closed');\n }\n process.exit(0);\n });\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Convert schema to JSON Schema format\n */\nfunction convertToJsonSchema(schema: JsonSchema | unknown): JsonSchema {\n // If it's already a JSON Schema object, return it\n if (\n typeof schema === 'object' &&\n schema !== null &&\n ('type' in schema || 'properties' in schema)\n ) {\n return schema as JsonSchema;\n }\n\n // If it's a Zod-like schema, try to convert\n // For now, just return a basic object schema\n return {\n type: 'object',\n properties: {},\n };\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport { coreMcpTools } from './core-tools';\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"processTemplate-G37IM66O.js"}
@@ -1,2 +0,0 @@
1
- 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var chunk4QT5LPBA_cjs=require('./chunk-4QT5LPBA.cjs');require('./chunk-QEBO3EQP.cjs');Object.defineProperty(exports,"createTemplateProcessor",{enumerable:true,get:function(){return chunk4QT5LPBA_cjs.j}});Object.defineProperty(exports,"default",{enumerable:true,get:function(){return chunk4QT5LPBA_cjs.k}});Object.defineProperty(exports,"getMissingVariables",{enumerable:true,get:function(){return chunk4QT5LPBA_cjs.g}});Object.defineProperty(exports,"getTemplateTags",{enumerable:true,get:function(){return chunk4QT5LPBA_cjs.e}});Object.defineProperty(exports,"previewTemplate",{enumerable:true,get:function(){return chunk4QT5LPBA_cjs.h}});Object.defineProperty(exports,"processTemplate",{enumerable:true,get:function(){return chunk4QT5LPBA_cjs.a}});Object.defineProperty(exports,"processTemplateAdvanced",{enumerable:true,get:function(){return chunk4QT5LPBA_cjs.i}});Object.defineProperty(exports,"processTemplateAndDownload",{enumerable:true,get:function(){return chunk4QT5LPBA_cjs.d}});Object.defineProperty(exports,"processTemplateAsBlob",{enumerable:true,get:function(){return chunk4QT5LPBA_cjs.c}});Object.defineProperty(exports,"processTemplateDetailed",{enumerable:true,get:function(){return chunk4QT5LPBA_cjs.b}});Object.defineProperty(exports,"validateTemplate",{enumerable:true,get:function(){return chunk4QT5LPBA_cjs.f}});//# sourceMappingURL=processTemplate-RFBGVH7T.cjs.map
2
- //# sourceMappingURL=processTemplate-RFBGVH7T.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"processTemplate-RFBGVH7T.cjs"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"react.cjs"}