@eigenpal/docx-js-editor 0.0.20 → 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 (200) hide show
  1. package/dist/{ClipboardManager-EZ0C6Onq.d.cts → ClipboardManager-B1jZrC6h.d.cts} +1 -1
  2. package/dist/{ClipboardManager-D6dkOFg6.d.ts → ClipboardManager-jqJVxB6g.d.ts} +1 -1
  3. package/dist/{DocumentAgent-BcCDg7i2.d.ts → DocumentAgent-CnJ9AEl_.d.cts} +31 -3
  4. package/dist/{DocumentAgent-B0EC8lPC.d.cts → DocumentAgent-CrbsDniO.d.ts} +31 -3
  5. package/dist/{FindReplaceDialog-AWQXKEUQ.js → FindReplaceDialog-AQFR4OCT.js} +1 -2
  6. package/dist/FindReplaceDialog-J3DI3U5I.cjs +1 -0
  7. package/dist/{FootnotePropertiesDialog-73VT2ZVZ.cjs → FootnotePropertiesDialog-DO5DCAW6.cjs} +1 -2
  8. package/dist/{FootnotePropertiesDialog-ZM3EF3EF.js → FootnotePropertiesDialog-YYIZU5U6.js} +1 -2
  9. package/dist/{HyperlinkDialog-BA25XUT5.js → HyperlinkDialog-HGZ2S37Z.js} +1 -2
  10. package/dist/HyperlinkDialog-PEPS3C2G.cjs +1 -0
  11. package/dist/{ImagePositionDialog-AIAMKPFK.js → ImagePositionDialog-DQ4JWS4F.js} +1 -2
  12. package/dist/{ImagePositionDialog-KMK7ROV2.cjs → ImagePositionDialog-UYXYHSP4.cjs} +1 -2
  13. package/dist/{ImagePropertiesDialog-ERFCUVCW.js → ImagePropertiesDialog-GJMGLM6G.js} +1 -2
  14. package/dist/{ImagePropertiesDialog-USMMRK6X.cjs → ImagePropertiesDialog-V6SVKINO.cjs} +1 -2
  15. package/dist/{TablePropertiesDialog-72CIUAZT.cjs → TablePropertiesDialog-A36OXG3A.cjs} +1 -2
  16. package/dist/{TablePropertiesDialog-EMUEVYB3.js → TablePropertiesDialog-STZOGHJB.js} +1 -2
  17. package/dist/{agentApi-BFVyKagE.d.cts → agentApi-DfsWRyrP.d.cts} +1 -1
  18. package/dist/{agentApi-BFVyKagE.d.ts → agentApi-DfsWRyrP.d.ts} +1 -1
  19. package/dist/{chunk-FDANI5P4.cjs → chunk-2VHQ7YOQ.cjs} +1 -2
  20. package/dist/chunk-2Y6FLZ5Q.js +3 -0
  21. package/dist/chunk-32HMU2UV.js +111 -0
  22. package/dist/chunk-4CUGBNL2.cjs +1 -0
  23. package/dist/chunk-5GFXHUMP.js +1 -0
  24. package/dist/chunk-6NDMKJIE.js +9 -0
  25. package/dist/chunk-6NYA53QC.cjs +258 -0
  26. package/dist/chunk-7KJ3YVDQ.js +10 -0
  27. package/dist/{chunk-JOYPFQW2.js → chunk-AARNCPWR.js} +1 -2
  28. package/dist/{chunk-4QT5LPBA.cjs → chunk-B7TICMXD.cjs} +16 -17
  29. package/dist/{chunk-2QOEHCBX.js → chunk-BUEMG4NW.js} +1 -2
  30. package/dist/{chunk-CV5WFE7K.js → chunk-CLDB6TL7.js} +2 -3
  31. package/dist/{chunk-M2T6XKT5.js → chunk-CTYOM6BE.js} +1 -2
  32. package/dist/chunk-EH3NY2DQ.cjs +26 -0
  33. package/dist/{chunk-FGVGZLBL.js → chunk-FVUGBRDD.js} +1 -2
  34. package/dist/chunk-FXJAIFPR.js +59 -0
  35. package/dist/chunk-GICVJSFJ.cjs +9 -0
  36. package/dist/{chunk-Y6VCTLCJ.js → chunk-H5NTJZO4.js} +1 -2
  37. package/dist/chunk-HT2Z33YM.cjs +111 -0
  38. package/dist/chunk-JRRTZZ72.cjs +1 -0
  39. package/dist/{chunk-T2HQYRA7.cjs → chunk-NVAQQYBJ.cjs} +1 -2
  40. package/dist/chunk-P3AEZKQO.cjs +3 -0
  41. package/dist/{chunk-GWBTKVFD.cjs → chunk-P7ZF45KZ.cjs} +1 -2
  42. package/dist/{chunk-QEBO3EQP.cjs → chunk-PCJ5ACUV.cjs} +1 -2
  43. package/dist/{chunk-Q6HUGWO6.js → chunk-PJVI53AH.js} +1 -2
  44. package/dist/chunk-Q7YYC75E.js +258 -0
  45. package/dist/{chunk-7JSPKVOW.js → chunk-QVPR2W5S.js} +1 -2
  46. package/dist/{chunk-XZNOV52K.cjs → chunk-TAF6KYDM.cjs} +4 -5
  47. package/dist/chunk-USRMBYI6.js +3 -0
  48. package/dist/chunk-UTWPV2I4.js +26 -0
  49. package/dist/{chunk-DJAEBZ33.cjs → chunk-VTAS7VZ6.cjs} +1 -2
  50. package/dist/chunk-XQNCLN4T.cjs +3 -0
  51. package/dist/{chunk-S26DZVRQ.cjs → chunk-XS2AQFMF.cjs} +1 -2
  52. package/dist/chunk-Y6QBJGMO.cjs +59 -0
  53. package/dist/{chunk-WD2HTKRR.cjs → chunk-YS7FDEZ4.cjs} +1 -2
  54. package/dist/chunk-ZTVQA46Q.js +1 -0
  55. package/dist/{clipboard-beGtyabO.d.ts → clipboard-BE8E-szx.d.ts} +1 -1
  56. package/dist/{clipboard-CqE-UZ2d.d.cts → clipboard-DkfAv07F.d.cts} +1 -1
  57. package/dist/{colorResolver-B5YbO_a4.d.ts → colorResolver-CYttioMe.d.ts} +46 -3
  58. package/dist/{colorResolver-Cu46bSKr.d.cts → colorResolver-Dr8kQZAQ.d.cts} +46 -3
  59. package/dist/core-plugins-reexport.cjs +1 -2
  60. package/dist/core-plugins-reexport.d.cts +4 -4
  61. package/dist/core-plugins-reexport.d.ts +4 -4
  62. package/dist/core-plugins-reexport.js +1 -2
  63. package/dist/core-reexport.cjs +1 -2
  64. package/dist/core-reexport.d.cts +10 -10
  65. package/dist/core-reexport.d.ts +10 -10
  66. package/dist/core-reexport.js +1 -2
  67. package/dist/executor-JGWZ7S6Z.cjs +1 -0
  68. package/dist/executor-L2MVKMXO.js +1 -0
  69. package/dist/{fontLoader-CFKpg0Ri.d.ts → fontLoader-BsqQnB4v.d.ts} +1 -1
  70. package/dist/{fontLoader-HZYfILUm.d.cts → fontLoader-DECXIoMr.d.cts} +1 -1
  71. package/dist/headless-reexport.cjs +4 -5
  72. package/dist/headless-reexport.d.cts +7 -7
  73. package/dist/headless-reexport.d.ts +7 -7
  74. package/dist/headless-reexport.js +4 -5
  75. package/dist/index.cjs +6 -7
  76. package/dist/index.css +0 -1
  77. package/dist/index.d.cts +12 -12
  78. package/dist/index.d.ts +12 -12
  79. package/dist/index.js +6 -7
  80. package/dist/lib-GD2QD2JK.js +1 -0
  81. package/dist/lib-HOLGQI5K.cjs +1 -0
  82. package/dist/mcp-reexport.cjs +9 -10
  83. package/dist/mcp-reexport.d.cts +2 -2
  84. package/dist/mcp-reexport.d.ts +2 -2
  85. package/dist/mcp-reexport.js +4 -5
  86. package/dist/{processTemplate-G37IM66O.js → processTemplate-3HN7Q3KT.js} +1 -2
  87. package/dist/processTemplate-BXZKWRQD.cjs +1 -0
  88. package/dist/{react-BjOCdeTs.d.ts → react-C6bgHDFl.d.ts} +8 -6
  89. package/dist/{react-UzAn4o7l.d.cts → react-CAlVCYa4.d.cts} +8 -6
  90. package/dist/react.cjs +1 -2
  91. package/dist/react.css +0 -1
  92. package/dist/react.d.cts +5 -5
  93. package/dist/react.d.ts +5 -5
  94. package/dist/react.js +1 -2
  95. package/dist/{registry-DjacfR6Q.d.cts → registry-BU-FbHh-.d.cts} +1 -1
  96. package/dist/{registry-CV6nYWqP.d.ts → registry-gRbkCooh.d.ts} +1 -1
  97. package/dist/selectionRects-7QU337P5.cjs +1 -0
  98. package/dist/selectionRects-V5RC2BYX.js +1 -0
  99. package/dist/styles.css +1 -1
  100. package/dist/{types-DwZ3xysp.d.ts → types-7wjInVMW.d.ts} +1 -1
  101. package/dist/{types-Bnp8rvJn.d.cts → types-DEEpBL9H.d.cts} +1 -1
  102. package/dist/ui.cjs +1 -2
  103. package/dist/ui.d.cts +32 -85
  104. package/dist/ui.d.ts +32 -85
  105. package/dist/ui.js +1 -2
  106. package/dist/{variableDetector-CMhJtM96.d.cts → variableDetector-B4oQJa2e.d.cts} +33 -2
  107. package/dist/{variableDetector-BaDeXz7D.d.ts → variableDetector-BXJaTkiB.d.ts} +33 -2
  108. package/package.json +1 -1
  109. package/dist/FindReplaceDialog-AWQXKEUQ.js.map +0 -1
  110. package/dist/FindReplaceDialog-I4SZDSVP.cjs +0 -2
  111. package/dist/FindReplaceDialog-I4SZDSVP.cjs.map +0 -1
  112. package/dist/FootnotePropertiesDialog-73VT2ZVZ.cjs.map +0 -1
  113. package/dist/FootnotePropertiesDialog-ZM3EF3EF.js.map +0 -1
  114. package/dist/HyperlinkDialog-BA25XUT5.js.map +0 -1
  115. package/dist/HyperlinkDialog-V63LPOT2.cjs +0 -2
  116. package/dist/HyperlinkDialog-V63LPOT2.cjs.map +0 -1
  117. package/dist/ImagePositionDialog-AIAMKPFK.js.map +0 -1
  118. package/dist/ImagePositionDialog-KMK7ROV2.cjs.map +0 -1
  119. package/dist/ImagePropertiesDialog-ERFCUVCW.js.map +0 -1
  120. package/dist/ImagePropertiesDialog-USMMRK6X.cjs.map +0 -1
  121. package/dist/TablePropertiesDialog-72CIUAZT.cjs.map +0 -1
  122. package/dist/TablePropertiesDialog-EMUEVYB3.js.map +0 -1
  123. package/dist/chunk-2CHPKB5A.cjs +0 -112
  124. package/dist/chunk-2CHPKB5A.cjs.map +0 -1
  125. package/dist/chunk-2QOEHCBX.js.map +0 -1
  126. package/dist/chunk-4QT5LPBA.cjs.map +0 -1
  127. package/dist/chunk-5DYSI4O4.cjs +0 -60
  128. package/dist/chunk-5DYSI4O4.cjs.map +0 -1
  129. package/dist/chunk-5FJXHXFV.cjs +0 -2
  130. package/dist/chunk-5FJXHXFV.cjs.map +0 -1
  131. package/dist/chunk-6FEWNF6B.js +0 -4
  132. package/dist/chunk-6FEWNF6B.js.map +0 -1
  133. package/dist/chunk-6LF5HZCV.js +0 -10
  134. package/dist/chunk-6LF5HZCV.js.map +0 -1
  135. package/dist/chunk-7JSPKVOW.js.map +0 -1
  136. package/dist/chunk-C33XDRDJ.cjs +0 -28
  137. package/dist/chunk-C33XDRDJ.cjs.map +0 -1
  138. package/dist/chunk-CV5WFE7K.js.map +0 -1
  139. package/dist/chunk-CXJRNISO.js +0 -2
  140. package/dist/chunk-CXJRNISO.js.map +0 -1
  141. package/dist/chunk-DJAEBZ33.cjs.map +0 -1
  142. package/dist/chunk-DP6Q75ZD.js +0 -28
  143. package/dist/chunk-DP6Q75ZD.js.map +0 -1
  144. package/dist/chunk-FDANI5P4.cjs.map +0 -1
  145. package/dist/chunk-FGVGZLBL.js.map +0 -1
  146. package/dist/chunk-GJ4GKSDU.cjs +0 -2
  147. package/dist/chunk-GJ4GKSDU.cjs.map +0 -1
  148. package/dist/chunk-GWBTKVFD.cjs.map +0 -1
  149. package/dist/chunk-JOYPFQW2.js.map +0 -1
  150. package/dist/chunk-L54YNLSE.js +0 -2
  151. package/dist/chunk-L54YNLSE.js.map +0 -1
  152. package/dist/chunk-LPGMLJMO.js +0 -259
  153. package/dist/chunk-LPGMLJMO.js.map +0 -1
  154. package/dist/chunk-M2T6XKT5.js.map +0 -1
  155. package/dist/chunk-OHG7ROFC.js +0 -11
  156. package/dist/chunk-OHG7ROFC.js.map +0 -1
  157. package/dist/chunk-PANKMCFX.cjs +0 -4
  158. package/dist/chunk-PANKMCFX.cjs.map +0 -1
  159. package/dist/chunk-Q6HUGWO6.js.map +0 -1
  160. package/dist/chunk-QDV75OJ4.js +0 -112
  161. package/dist/chunk-QDV75OJ4.js.map +0 -1
  162. package/dist/chunk-QEBO3EQP.cjs.map +0 -1
  163. package/dist/chunk-QVIZ775M.cjs +0 -259
  164. package/dist/chunk-QVIZ775M.cjs.map +0 -1
  165. package/dist/chunk-RMUMR42R.cjs +0 -10
  166. package/dist/chunk-RMUMR42R.cjs.map +0 -1
  167. package/dist/chunk-S26DZVRQ.cjs.map +0 -1
  168. package/dist/chunk-T2HQYRA7.cjs.map +0 -1
  169. package/dist/chunk-ULXNEG66.js +0 -60
  170. package/dist/chunk-ULXNEG66.js.map +0 -1
  171. package/dist/chunk-WD2HTKRR.cjs.map +0 -1
  172. package/dist/chunk-XZNOV52K.cjs.map +0 -1
  173. package/dist/chunk-Y6VCTLCJ.js.map +0 -1
  174. package/dist/core-plugins-reexport.cjs.map +0 -1
  175. package/dist/core-plugins-reexport.js.map +0 -1
  176. package/dist/core-reexport.cjs.map +0 -1
  177. package/dist/core-reexport.js.map +0 -1
  178. package/dist/executor-K5RXUTTR.js +0 -2
  179. package/dist/executor-K5RXUTTR.js.map +0 -1
  180. package/dist/executor-XIPIU3H4.cjs +0 -2
  181. package/dist/executor-XIPIU3H4.cjs.map +0 -1
  182. package/dist/headless-reexport.cjs.map +0 -1
  183. package/dist/headless-reexport.js.map +0 -1
  184. package/dist/index.cjs.map +0 -1
  185. package/dist/index.css.map +0 -1
  186. package/dist/index.js.map +0 -1
  187. package/dist/mcp-reexport.cjs.map +0 -1
  188. package/dist/mcp-reexport.js.map +0 -1
  189. package/dist/processTemplate-G37IM66O.js.map +0 -1
  190. package/dist/processTemplate-RFBGVH7T.cjs +0 -2
  191. package/dist/processTemplate-RFBGVH7T.cjs.map +0 -1
  192. package/dist/react.cjs.map +0 -1
  193. package/dist/react.css.map +0 -1
  194. package/dist/react.js.map +0 -1
  195. package/dist/selectionRects-6DU7HN7E.js +0 -2
  196. package/dist/selectionRects-6DU7HN7E.js.map +0 -1
  197. package/dist/selectionRects-YZSC24ZP.cjs +0 -2
  198. package/dist/selectionRects-YZSC24ZP.cjs.map +0 -1
  199. package/dist/ui.cjs.map +0 -1
  200. package/dist/ui.js.map +0 -1
@@ -1,10 +0,0 @@
1
- import {a}from'./chunk-OHG7ROFC.js';import {d as d$2,e}from'./chunk-ULXNEG66.js';import {b,a as a$1}from'./chunk-JOYPFQW2.js';import {q as q$1}from'./chunk-DP6Q75ZD.js';import {d as d$1}from'./chunk-Y6VCTLCJ.js';function L(){return [{styleId:"Normal",type:"paragraph",name:"Normal",default:true,qFormat:true,uiPriority:0,rPr:{fontSize:22,fontFamily:{ascii:"Arial",hAnsi:"Arial"}},pPr:{lineSpacing:276}},{styleId:"Title",type:"paragraph",name:"Title",basedOn:"Normal",next:"Normal",qFormat:true,uiPriority:10,rPr:{fontSize:52,bold:true,fontFamily:{ascii:"Arial",hAnsi:"Arial"}},pPr:{lineSpacing:240}},{styleId:"Subtitle",type:"paragraph",name:"Subtitle",basedOn:"Normal",next:"Normal",qFormat:true,uiPriority:11,rPr:{fontSize:30,color:{rgb:"666666"},fontFamily:{ascii:"Arial",hAnsi:"Arial"}},pPr:{lineSpacing:240}},{styleId:"Heading1",type:"paragraph",name:"Heading 1",basedOn:"Normal",next:"Normal",qFormat:true,uiPriority:9,rPr:{fontSize:40,bold:true,fontFamily:{ascii:"Arial",hAnsi:"Arial"}},pPr:{spaceBefore:400,spaceAfter:120,lineSpacing:240}},{styleId:"Heading2",type:"paragraph",name:"Heading 2",basedOn:"Normal",next:"Normal",qFormat:true,uiPriority:9,rPr:{fontSize:32,bold:true,fontFamily:{ascii:"Arial",hAnsi:"Arial"}},pPr:{spaceBefore:360,spaceAfter:80,lineSpacing:240}},{styleId:"Heading3",type:"paragraph",name:"Heading 3",basedOn:"Normal",next:"Normal",qFormat:true,uiPriority:9,rPr:{fontSize:28,bold:true,fontFamily:{ascii:"Arial",hAnsi:"Arial"}},pPr:{spaceBefore:320,spaceAfter:80,lineSpacing:240}},{styleId:"Heading4",type:"paragraph",name:"Heading 4",basedOn:"Normal",next:"Normal",qFormat:true,uiPriority:9,rPr:{fontSize:24,bold:true,fontFamily:{ascii:"Arial",hAnsi:"Arial"}},pPr:{spaceBefore:280,spaceAfter:80,lineSpacing:240}}]}function z(){return {pageWidth:12240,pageHeight:15840,orientation:"portrait",marginTop:1440,marginBottom:1440,marginLeft:1440,marginRight:1440,headerDistance:720,footerDistance:720,gutter:0,columnCount:1,columnSpace:720,equalWidth:true,sectionStart:"nextPage",verticalAlign:"top"}}function W(r={}){let t=z();r.pageWidth!==void 0&&(t.pageWidth=r.pageWidth),r.pageHeight!==void 0&&(t.pageHeight=r.pageHeight),r.orientation!==void 0&&(t.orientation=r.orientation),r.marginTop!==void 0&&(t.marginTop=r.marginTop),r.marginBottom!==void 0&&(t.marginBottom=r.marginBottom),r.marginLeft!==void 0&&(t.marginLeft=r.marginLeft),r.marginRight!==void 0&&(t.marginRight=r.marginRight);let e={type:"text",text:r.initialText||""};return {package:{document:{content:[{type:"paragraph",content:[{type:"run",content:r.initialText?[e]:[],formatting:{fontSize:22,fontFamily:{ascii:"Arial",hAnsi:"Arial"}}}],formatting:{lineSpacing:276}}],finalSectionProperties:t},styles:{docDefaults:{rPr:{fontSize:22,fontFamily:{ascii:"Arial",hAnsi:"Arial"}},pPr:{lineSpacing:276}},styles:L()}},templateVariables:[],warnings:[]}}function yt(r,t={}){return W({...t,initialText:r})}var A=class r{constructor(t){d$1(this,"_document");d$1(this,"_pendingVariables");t instanceof ArrayBuffer||ArrayBuffer.isView(t)?this._document={package:{document:{content:[]}},originalBuffer:t instanceof ArrayBuffer?t:t.buffer}:this._document=t,this._pendingVariables={};}static async fromBuffer(t){let e=await q$1(t);return new r(e)}static fromDocument(t){return new r(t)}getDocument(){return this._document}getText(){let t=this._document.package.document;return this._getBodyText(t)}getFormattedText(){let t=[],e=this._document.package.document;for(let n of e.content)n.type==="paragraph"&&this._extractParagraphSegments(n,t);return t}getVariables(){return a(this._document)}getStyles(){let t=this._document.package.styles;if(!t?.styles)return [];let e=[];for(let[n,a]of Object.entries(t.styles))if(typeof a=="object"&&a!==null){let o=a;e.push({id:n,name:o.name||n,type:o.type==="numbering"?"paragraph":o.type||"paragraph",builtIn:o.default});}return e}getPageCount(){let t=this.getWordCount();return Math.max(1,Math.ceil(t/500))}getWordCount(){return this.getText().split(/\s+/).filter(n=>n.length>0).length}getCharacterCount(t=true){let e=this.getText();return t?e.length:e.replace(/\s/g,"").length}getParagraphCount(){return this._document.package.document.content.filter(t=>t.type==="paragraph").length}getTableCount(){return this._document.package.document.content.filter(t=>t.type==="table").length}getAgentContext(t=100){let e=this._document.package.document,n=e.content.filter(i=>i.type==="paragraph"),a=n.map((i,s)=>{let c=this._getParagraphText(i),p=i.formatting?.styleId;return {index:s,preview:c.slice(0,t),style:p,isHeading:p?.toLowerCase().includes("heading")||false,headingLevel:this._parseHeadingLevel(p),isListItem:!!i.listRendering,isEmpty:c.trim().length===0}}),o=(e.sections||[]).map((i,s)=>({index:s,paragraphCount:i.content?.length||0,pageSize:i.properties?.pageWidth&&i.properties?.pageHeight?{width:i.properties.pageWidth,height:i.properties.pageHeight}:void 0,isLandscape:i.properties?.orientation==="landscape",hasHeader:!!i.properties?.headerReferences?.length,hasFooter:!!i.properties?.footerReferences?.length}));return {paragraphCount:n.length,wordCount:this.getWordCount(),characterCount:this.getCharacterCount(),variables:this.getVariables(),variableCount:this.getVariables().length,availableStyles:this.getStyles(),outline:a,sections:o,hasTables:this.getTableCount()>0,hasImages:this._hasImages(),hasHyperlinks:this._hasHyperlinks()}}insertText(t,e,n={}){let a={type:"insertText",position:t,text:e,formatting:n.formatting};return this._executeCommand(a)}replaceRange(t,e,n={}){let a={type:"replaceText",range:t,text:e,formatting:n.formatting};return this._executeCommand(a)}deleteRange(t){let e={type:"deleteText",range:t};return this._executeCommand(e)}applyFormatting(t,e){let n={type:"formatText",range:t,formatting:e};return this._executeCommand(n)}applyStyle(t,e){let n={type:"applyStyle",paragraphIndex:t,styleId:e};return this._executeCommand(n)}applyParagraphFormatting(t,e){let n={type:"formatParagraph",paragraphIndex:t,formatting:e};return this._executeCommand(n)}insertTable(t,e,n,a={}){let o={type:"insertTable",position:t,rows:e,columns:n,data:a.data,hasHeader:a.hasHeader};return this._executeCommand(o)}insertImage(t,e,n={}){let a={type:"insertImage",position:t,src:e,width:n.width,height:n.height,alt:n.alt};return this._executeCommand(a)}insertHyperlink(t,e,n={}){let a={type:"insertHyperlink",range:t,url:e,displayText:n.displayText,tooltip:n.tooltip};return this._executeCommand(a)}removeHyperlink(t){let e={type:"removeHyperlink",range:t};return this._executeCommand(e)}insertParagraphBreak(t){let e={type:"insertParagraphBreak",position:t};return this._executeCommand(e)}mergeParagraphs(t,e){let n={type:"mergeParagraphs",paragraphIndex:t,count:e};return this._executeCommand(n)}setVariable(t,e){return this._pendingVariables[t]=e,this}setVariables(t){for(let[e,n]of Object.entries(t))this._pendingVariables[e]=n;return this}getPendingVariables(){return {...this._pendingVariables}}clearPendingVariables(){return this._pendingVariables={},this}async applyVariables(t){let e={...this._pendingVariables,...t};if(Object.keys(e).length===0)return this;let n=this._document.originalBuffer;if(!n)throw new Error("Cannot apply variables: no original buffer for processing");let{processTemplate:a}=await import('./processTemplate-G37IM66O.js'),o=a(n,e),i=await q$1(o),s=new r(i);return s._pendingVariables={},s}async toBuffer(){return this._document.originalBuffer?d$2(this._document):e(this._document)}async toBlob(t="application/vnd.openxmlformats-officedocument.wordprocessingml.document"){let e=await this.toBuffer();return new Blob([e],{type:t})}executeCommands(t){return new r(b(this._document,t))}_executeCommand(t){let e=new r(a$1(this._document,t));return e._pendingVariables={...this._pendingVariables},e}_getBodyText(t){let e=[];for(let n of t.content)n.type==="paragraph"?e.push(this._getParagraphText(n)):n.type==="table"&&e.push(this._getTableText(n));return e.join(`
2
- `)}_getParagraphText(t){let e=[];for(let n of t.content)n.type==="run"?e.push(this._getRunText(n)):n.type==="hyperlink"&&e.push(this._getHyperlinkText(n));return e.join("")}_getRunText(t){return t.content.filter(e=>e.type==="text").map(e=>e.text).join("")}_getHyperlinkText(t){let e=[];for(let n of t.children)n.type==="run"&&e.push(this._getRunText(n));return e.join("")}_getTableText(t){let e=[];for(let n of t.rows)for(let a of n.cells)for(let o of a.content)o.type==="paragraph"&&e.push(this._getParagraphText(o));return e.join(" ")}_extractParagraphSegments(t,e){for(let n of t.content)if(n.type==="run"){let a=this._getRunText(n);a&&e.push({text:a,formatting:n.formatting});}else if(n.type==="hyperlink"){let a=n.href||"";for(let o of n.children)if(o.type==="run"){let i=this._getRunText(o);i&&e.push({text:i,formatting:o.formatting,isHyperlink:true,hyperlinkUrl:a});}}}_parseHeadingLevel(t){if(!t)return;let e=t.match(/heading\s*(\d)/i);if(e)return parseInt(e[1],10)}_hasImages(){let t=this._document.package.document;for(let e of t.content)if(e.type==="paragraph"){for(let n of e.content)if(n.type==="run"){for(let a of n.content)if(a.type==="drawing")return true}}return false}_hasHyperlinks(){let t=this._document.package.document;for(let e of t.content)if(e.type==="paragraph"){for(let n of e.content)if(n.type==="hyperlink")return true}return false}};async function Tt(r){return A.fromBuffer(r)}function St(r){return A.fromDocument(r)}function N(r,t={}){let{outlineMaxChars:e=100,maxOutlineParagraphs:n=50}=t,a$1=r.package.document,o=a$1.content.filter(x=>x.type==="paragraph"),i=M(o,e,n),s=a(r),c=q(r),p=$(a$1),u=U(a$1),h=G(a$1),m=a$1.content.some(x=>x.type==="table"),y=Q(a$1),l=X(a$1);return {paragraphCount:o.length,wordCount:u,characterCount:h,variables:s,variableCount:s.length,availableStyles:c,outline:i,sections:p,hasTables:m,hasImages:y,hasHyperlinks:l}}function Ft(r,t,e={}){let{contextChars:n=200,includeSuggestions:a=true}=e,i=r.package.document.content.filter(f=>f.type==="paragraph"),s=i[t.start.paragraphIndex];if(!s)throw new Error(`Paragraph not found at index ${t.start.paragraphIndex}`);let c=g(s),p="";if(t.start.paragraphIndex===t.end.paragraphIndex)p=c.slice(t.start.offset,t.end.offset);else {let f=[];for(let b=t.start.paragraphIndex;b<=t.end.paragraphIndex;b++){let B=i[b];if(!B)continue;let D=g(B);b===t.start.paragraphIndex?f.push(D.slice(t.start.offset)):b===t.end.paragraphIndex?f.push(D.slice(0,t.end.offset)):f.push(D);}p=f.join(`
3
- `);}let u=tt(i,t.start.paragraphIndex,t.start.offset,n),h=et(i,t.end.paragraphIndex,t.end.offset,n),m=nt(s,t.start.offset),y=s.formatting||{},l={index:t.start.paragraphIndex,fullText:c,style:s.formatting?.styleId,wordCount:w(c)},x=false,k=rt(s,t.start.offset),I=a?at(p):[];return {selectedText:p,range:t,formatting:m,paragraphFormatting:y,textBefore:u,textAfter:h,paragraph:l,inTable:x,inHyperlink:k,suggestedActions:I}}function V(r){let t=N(r,{outlineMaxChars:50,maxOutlineParagraphs:10}),e=[`Document with ${t.paragraphCount} paragraphs, ${t.wordCount} words.`];t.hasTables&&e.push("Contains tables."),t.hasImages&&e.push("Contains images."),t.hasHyperlinks&&e.push("Contains hyperlinks."),t.variableCount>0&&e.push(`Has ${t.variableCount} template variables: ${t.variables.join(", ")}`);let n=t.outline.filter(a=>a.isHeading);if(n.length>0){e.push(`
4
- Headings:`);for(let a of n.slice(0,5)){let o=a.headingLevel||1;e.push(`${" ".repeat(o-1)}- ${a.preview}`);}n.length>5&&e.push(` ... and ${n.length-5} more headings`);}return e.join(" ")}function M(r,t,e){let n=[];for(let a=0;a<Math.min(r.length,e);a++){let o=r[a],i=g(o),s=o.formatting?.styleId;n.push({index:a,preview:i.slice(0,t),style:s,isHeading:Y(s),headingLevel:Z(s),isListItem:!!o.listRendering,isEmpty:i.trim().length===0});}return n}function q(r){let t=r.package.styles;if(!t?.styles)return [];let e=[];for(let[n,a]of Object.entries(t.styles))if(typeof a=="object"&&a!==null){let o=a;e.push({id:n,name:o.name||n,type:o.type==="numbering"?"paragraph":o.type||"paragraph",builtIn:o.default});}return e}function $(r){return r.sections?r.sections.map((t,e)=>({index:e,paragraphCount:t.content?.length||0,pageSize:t.properties?.pageWidth&&t.properties?.pageHeight?{width:t.properties.pageWidth,height:t.properties.pageHeight}:void 0,isLandscape:t.properties?.orientation==="landscape",hasHeader:!!t.properties?.headerReferences?.length,hasFooter:!!t.properties?.footerReferences?.length})):[]}function U(r){let t=0;for(let e of r.content)if(e.type==="paragraph"){let n=g(e);t+=w(n);}else e.type==="table"&&(t+=J(e));return t}function w(r){return r.split(/\s+/).filter(e=>e.length>0).length}function G(r){let t=0;for(let e of r.content)if(e.type==="paragraph"){let n=g(e);t+=n.length;}else e.type==="table"&&(t+=K(e));return t}function J(r){let t=0;for(let e of r.rows)for(let n of e.cells)for(let a of n.content)if(a.type==="paragraph"){let o=g(a);t+=w(o);}return t}function K(r){let t=0;for(let e of r.rows)for(let n of e.cells)for(let a of n.content)if(a.type==="paragraph"){let o=g(a);t+=o.length;}return t}function g(r){let t=[];for(let e of r.content)e.type==="run"?t.push(T(e)):e.type==="hyperlink"&&t.push(H(e));return t.join("")}function T(r){return r.content.filter(t=>t.type==="text").map(t=>t.text).join("")}function H(r){let t=[];for(let e of r.children)e.type==="run"&&t.push(T(e));return t.join("")}function Q(r){for(let t of r.content)if(t.type==="paragraph"){for(let e of t.content)if(e.type==="run"){for(let n of e.content)if(n.type==="drawing")return true}}return false}function X(r){for(let t of r.content)if(t.type==="paragraph"){for(let e of t.content)if(e.type==="hyperlink")return true}return false}function Y(r){return r?r.toLowerCase().includes("heading"):false}function Z(r){if(!r)return;let t=r.match(/heading\s*(\d)/i);if(t)return parseInt(t[1],10)}function tt(r,t,e,n){let a=[],o=0,i=r[t];if(i){let p=g(i).slice(0,e);a.unshift(p),o+=p.length;}for(let c=t-1;c>=0&&o<n;c--){let p=r[c];if(!p)continue;let u=g(p);a.unshift(u),o+=u.length;}let s=a.join(`
5
- `);return s.length>n?"..."+s.slice(-n):s}function et(r,t,e,n){let a=[],o=0,i=r[t];if(i){let p=g(i).slice(e);a.push(p),o+=p.length;}for(let c=t+1;c<r.length&&o<n;c++){let p=r[c];if(!p)continue;let u=g(p);a.push(u),o+=u.length;}let s=a.join(`
6
- `);return s.length>n?s.slice(0,n)+"...":s}function nt(r,t){let e=0;for(let n of r.content)if(n.type==="run"){let a=T(n),o=e,i=e+a.length;if(t>=o&&t<i)return n.formatting||{};e=i;}else if(n.type==="hyperlink"){let a=H(n),o=e,i=e+a.length;if(t>=o&&t<i){for(let s of n.children)if(s.type==="run")return s.formatting||{}}e=i;}return {}}function rt(r,t){let e=0;for(let n of r.content)if(n.type==="run"){let a=T(n);e+=a.length;}else if(n.type==="hyperlink"){let a=H(n),o=e,i=e+a.length;if(t>=o&&t<i)return true;e=i;}return false}function at(r,t,e){let n=[];return r.length>0&&(n.push({id:"rewrite",label:"Rewrite",description:"Rewrite this text",priority:10},{id:"summarize",label:"Summarize",description:"Summarize this text",priority:9}),r.length>200&&n.push({id:"summarize",label:"Summarize",description:"Create a shorter version",priority:8}),r.length<50&&r.split(/\s+/).length<10&&n.push({id:"expand",label:"Expand",description:"Add more details",priority:8}),n.push({id:"fixGrammar",label:"Fix Grammar",description:"Fix grammar and spelling",priority:7}),n.push({id:"translate",label:"Translate",description:"Translate to another language",priority:6}),n.push({id:"makeFormal",label:"Make Formal",description:"Use formal tone",priority:5},{id:"makeCasual",label:"Make Casual",description:"Use casual tone",priority:4})),n.sort((a,o)=>(o.priority||0)-(a.priority||0)),n}function ot(r,t,e={}){let{contextCharsBefore:n=200,contextCharsAfter:a=200,includeSuggestions:o=true}=e,i=r.package.document,s=i.content.filter(f=>f.type==="paragraph");if(t.start.paragraphIndex>=s.length)throw new Error(`Invalid start paragraph index: ${t.start.paragraphIndex}`);let c=s[t.start.paragraphIndex],p=it(s,t),u=st(s,t.start,n),h=ct(s,t.end,a),m=pt(c,t.start.offset),y=c.formatting||{},l={index:t.start.paragraphIndex,fullText:d(c),style:c.formatting?.styleId,wordCount:R(d(c))},x=lt(i,t.start),k=gt(c,t.start.offset),I=o?mt(p):[];return {selectedText:p,range:t,formatting:m,paragraphFormatting:y,textBefore:u,textAfter:h,paragraph:l,inTable:x,inHyperlink:k,suggestedActions:I}}function Ht(r,t,e={}){let n=ot(r,t,e),{includeDocumentSummary:a=true}=e,i=r.package.document.content.filter(l=>l.type==="paragraph"),s=R(n.selectedText),c=n.selectedText.length,p=t.start.paragraphIndex!==t.end.paragraphIndex,u=[];for(let l=t.start.paragraphIndex;l<=t.end.paragraphIndex;l++)u.push(l);let h=ft(i,t),m=a?V(r):void 0,y=dt(n.selectedText);return {...n,documentSummary:m,wordCount:s,characterCount:c,isMultiParagraph:p,paragraphIndices:u,detectedLanguage:y,contentType:h}}function Rt(r,t){let n=r.package.document.content.filter(s=>s.type==="paragraph"),a=[];for(let s=t.start.paragraphIndex;s<=t.end.paragraphIndex;s++){let c=n[s];if(!c)continue;let p=s===t.start.paragraphIndex?t.start.offset:0,u=s===t.end.paragraphIndex?t.end.offset:1/0;ut(c,p,u,a);}let o=a.length<=1||a.every(s=>ht(s,a[0]));return {predominant:a.length>0?a[0]:{},isConsistent:o,allFormatting:a}}function it(r,t){if(t.start.paragraphIndex===t.end.paragraphIndex){let n=r[t.start.paragraphIndex];return n?d(n).slice(t.start.offset,t.end.offset):""}let e=[];for(let n=t.start.paragraphIndex;n<=t.end.paragraphIndex;n++){let a=r[n];if(!a)continue;let o=d(a);n===t.start.paragraphIndex?e.push(o.slice(t.start.offset)):n===t.end.paragraphIndex?e.push(o.slice(0,t.end.offset)):e.push(o);}return e.join(`
7
- `)}function st(r,t,e){let n=[],a=0,o=r[t.paragraphIndex];if(o){let c=d(o).slice(0,t.offset);n.unshift(c),a+=c.length;}for(let s=t.paragraphIndex-1;s>=0&&a<e;s--){let c=r[s];if(!c)continue;let p=d(c);n.unshift(p),a+=p.length;}let i=n.join(`
8
- `);return i.length>e?"..."+i.slice(-e):i}function ct(r,t,e){let n=[],a=0,o=r[t.paragraphIndex];if(o){let c=d(o).slice(t.offset);n.push(c),a+=c.length;}for(let s=t.paragraphIndex+1;s<r.length&&a<e;s++){let c=r[s];if(!c)continue;let p=d(c);n.push(p),a+=p.length;}let i=n.join(`
9
- `);return i.length>e?i.slice(0,e)+"...":i}function pt(r,t){let e=0;for(let n of r.content)if(n.type==="run"){let a=C(n),o=e+a.length;if(t>=e&&t<o)return n.formatting||{};e=o;}else if(n.type==="hyperlink"){let a=S(n),o=e+a.length;if(t>=e&&t<o){for(let i of n.children)if(i.type==="run")return i.formatting||{}}e=o;}return {}}function ut(r,t,e,n){let a=0;for(let o of r.content)if(o.type==="run"){let i=C(o),s=a,c=a+i.length;c>t&&s<e&&o.formatting&&n.push({...o.formatting}),a=c;}else if(o.type==="hyperlink"){let i=S(o),s=a,c=a+i.length;if(c>t&&s<e)for(let p of o.children)p.type==="run"&&p.formatting&&n.push({...p.formatting});a=c;}}function lt(r,t){return false}function gt(r,t){let e=0;for(let n of r.content)if(n.type==="run"){let a=C(n);e+=a.length;}else if(n.type==="hyperlink"){let a=S(n),o=e,i=e+a.length;if(t>=o&&t<i)return true;e=i;}return false}function mt(r,t,e){let n=[];if(!r||r.trim().length===0)return n;n.push({id:"askAI",label:"Ask AI",description:"Ask AI about this text",priority:11},{id:"rewrite",label:"Rewrite",description:"Rewrite this text differently",priority:10});let a=R(r);return a>50&&n.push({id:"summarize",label:"Summarize",description:"Create a shorter version",priority:9}),a<20&&n.push({id:"expand",label:"Expand",description:"Add more details",priority:9}),n.push({id:"fixGrammar",label:"Fix Grammar",description:"Fix grammar and spelling",priority:7},{id:"translate",label:"Translate",description:"Translate to another language",priority:6},{id:"explain",label:"Explain",description:"Explain what this means",priority:5}),n.push({id:"makeFormal",label:"Make Formal",description:"Use formal tone",priority:4},{id:"makeCasual",label:"Make Casual",description:"Use casual tone",priority:3}),n.sort((o,i)=>(i.priority||0)-(o.priority||0)),n}function ft(r,t){let e=new Set;for(let n=t.start.paragraphIndex;n<=t.end.paragraphIndex;n++){let a=r[n];a&&(a.listRendering?e.add("list"):a.formatting?.styleId?.toLowerCase().includes("heading")?e.add("heading"):e.add("prose"));}return e.size>1?"mixed":e.has("list")?"list":e.has("heading")?"heading":"prose"}function dt(r){return /[а-яА-ЯёЁ]/.test(r)?"ru":/[一-龯]/.test(r)?"zh":/[ひらがなカタカナ]/.test(r)||/[\u3040-\u309F\u30A0-\u30FF]/.test(r)?"ja":/[가-힣]/.test(r)?"ko":/[àâäéèêëïîôùûüç]/i.test(r)?"fr":/[äöüß]/i.test(r)?"de":/[áéíóúñ]/i.test(r)?"es":"en"}function d(r){let t=[];for(let e of r.content)e.type==="run"?t.push(C(e)):e.type==="hyperlink"&&t.push(S(e));return t.join("")}function C(r){return r.content.filter(t=>t.type==="text").map(t=>t.text).join("")}function S(r){let t=[];for(let e of r.children)e.type==="run"&&t.push(C(e));return t.join("")}function R(r){return r.split(/\s+/).filter(t=>t.length>0).length}function ht(r,t){let e=Object.keys(r),n=Object.keys(t);return e.length!==n.length?false:e.every(a=>{let o=r[a],i=t[a];return o===i})}export{W as a,yt as b,A as c,Tt as d,St as e,N as f,Ft as g,V as h,ot as i,Ht as j,Rt as k};//# sourceMappingURL=chunk-6LF5HZCV.js.map
10
- //# sourceMappingURL=chunk-6LF5HZCV.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../core/src/utils/createDocument.ts","../../core/src/agent/DocumentAgent.ts","../../core/src/agent/context.ts","../../core/src/agent/selectionContext.ts"],"names":["getDefaultStyles","getDefaultSectionProperties","createEmptyDocument","options","sectionProps","textContent","createDocumentWithText","text","DocumentAgent","_DocumentAgent","source","__publicField","buffer","document","parseDocx","body","segments","block","detectVariables","styleDefinitions","styleInfos","styleId","style","styleObj","wordCount","w","includeSpaces","outlineMaxChars","paragraphs","b","outline","para","index","sections","section","position","command","range","formatting","paragraphIndex","rows","cols","src","url","startParagraphIndex","count","name","value","variables","allVariables","processTemplate","processedBuffer","processedDoc","newAgent","repackDocx","createDocx","mimeType","commands","executeCommands","executeCommand","texts","paragraph","item","run","c","hyperlink","child","table","row","cell","match","content","createAgent","createAgentFromDocument","getAgentContext","doc","maxOutlineParagraphs","buildOutline","availableStyles","getStylesFromDoc","getSectionsInfo","calculateWordCount","characterCount","calculateCharacterCount","hasTables","hasImages","hasDocImages","hasHyperlinks","hasDocHyperlinks","buildSelectionContext","contextChars","includeSuggestions","paragraphText","getParagraphText","selectedText","i","textBefore","getTextBefore","textAfter","getTextAfter","getFormattingAtPosition","paragraphFormatting","paragraphContext","countWords","inTable","inHyperlink","isInHyperlink","suggestedActions","getSuggestedActions","getDocumentSummary","context","parts","headings","p","heading","level","maxChars","maxParagraphs","isHeadingStyle","parseHeadingLevel","getTableWordCount","getTableCharacterCount","getRunText","getHyperlinkText","offset","totalChars","currentPara","beforeText","combined","afterText","currentOffset","runStart","runEnd","linkStart","linkEnd","_formatting","_paragraphContext","actions","contextCharsBefore","contextCharsAfter","startParagraph","extractSelectedText","isPositionInTable","isPositionInHyperlink","buildExtendedSelectionContext","baseContext","includeDocumentSummary","isMultiParagraph","paragraphIndices","contentType","detectContentType","documentSummary","detectedLanguage","detectLanguage","getSelectionFormattingSummary","allFormatting","paraIdx","startOffset","endOffset","collectFormattingInRange","isConsistent","f","formatEqual","result","_body","_position","a","types","keysA","keysB","key","valA","valB"],"mappings":"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","file":"chunk-6LF5HZCV.js","sourcesContent":["/**\n * Create Document Utility\n *\n * Provides functions to create new documents programmatically.\n */\n\nimport type {\n Document,\n DocxPackage,\n DocumentBody,\n Paragraph,\n Run,\n TextContent,\n SectionProperties,\n Style,\n} from '../types/document';\n\n// ============================================================================\n// DEFAULT STYLES\n// ============================================================================\n\n/**\n * Get default paragraph styles (matching Google Docs defaults)\n *\n * Font sizes are in half-points (e.g., 22 = 11pt, 40 = 20pt)\n * Colors are RGB hex without # prefix\n */\nfunction getDefaultStyles(): Style[] {\n return [\n // Normal - base style for body text (11pt Arial)\n {\n styleId: 'Normal',\n type: 'paragraph',\n name: 'Normal',\n default: true,\n qFormat: true,\n uiPriority: 0,\n rPr: {\n fontSize: 22, // 11pt\n fontFamily: {\n ascii: 'Arial',\n hAnsi: 'Arial',\n },\n },\n pPr: {\n lineSpacing: 276, // 1.15 spacing\n },\n },\n // Title - document title (26pt, bold)\n {\n styleId: 'Title',\n type: 'paragraph',\n name: 'Title',\n basedOn: 'Normal',\n next: 'Normal',\n qFormat: true,\n uiPriority: 10,\n rPr: {\n fontSize: 52, // 26pt\n bold: true,\n fontFamily: {\n ascii: 'Arial',\n hAnsi: 'Arial',\n },\n },\n pPr: {\n lineSpacing: 240, // Single spacing\n },\n },\n // Subtitle (15pt, gray)\n {\n styleId: 'Subtitle',\n type: 'paragraph',\n name: 'Subtitle',\n basedOn: 'Normal',\n next: 'Normal',\n qFormat: true,\n uiPriority: 11,\n rPr: {\n fontSize: 30, // 15pt\n color: { rgb: '666666' }, // Gray\n fontFamily: {\n ascii: 'Arial',\n hAnsi: 'Arial',\n },\n },\n pPr: {\n lineSpacing: 240,\n },\n },\n // Heading 1 (20pt, bold)\n {\n styleId: 'Heading1',\n type: 'paragraph',\n name: 'Heading 1',\n basedOn: 'Normal',\n next: 'Normal',\n qFormat: true,\n uiPriority: 9,\n rPr: {\n fontSize: 40, // 20pt\n bold: true,\n fontFamily: {\n ascii: 'Arial',\n hAnsi: 'Arial',\n },\n },\n pPr: {\n spaceBefore: 400, // 20pt before\n spaceAfter: 120, // 6pt after\n lineSpacing: 240,\n },\n },\n // Heading 2 (16pt, bold)\n {\n styleId: 'Heading2',\n type: 'paragraph',\n name: 'Heading 2',\n basedOn: 'Normal',\n next: 'Normal',\n qFormat: true,\n uiPriority: 9,\n rPr: {\n fontSize: 32, // 16pt\n bold: true,\n fontFamily: {\n ascii: 'Arial',\n hAnsi: 'Arial',\n },\n },\n pPr: {\n spaceBefore: 360, // 18pt before\n spaceAfter: 80, // 4pt after\n lineSpacing: 240,\n },\n },\n // Heading 3 (14pt, bold)\n {\n styleId: 'Heading3',\n type: 'paragraph',\n name: 'Heading 3',\n basedOn: 'Normal',\n next: 'Normal',\n qFormat: true,\n uiPriority: 9,\n rPr: {\n fontSize: 28, // 14pt\n bold: true,\n fontFamily: {\n ascii: 'Arial',\n hAnsi: 'Arial',\n },\n },\n pPr: {\n spaceBefore: 320, // 16pt before\n spaceAfter: 80, // 4pt after\n lineSpacing: 240,\n },\n },\n // Heading 4 (12pt, bold)\n {\n styleId: 'Heading4',\n type: 'paragraph',\n name: 'Heading 4',\n basedOn: 'Normal',\n next: 'Normal',\n qFormat: true,\n uiPriority: 9,\n rPr: {\n fontSize: 24, // 12pt\n bold: true,\n fontFamily: {\n ascii: 'Arial',\n hAnsi: 'Arial',\n },\n },\n pPr: {\n spaceBefore: 280, // 14pt before\n spaceAfter: 80, // 4pt after\n lineSpacing: 240,\n },\n },\n ];\n}\n\n// ============================================================================\n// DEFAULT SECTION PROPERTIES\n// ============================================================================\n\n/**\n * Get default section properties (US Letter, 1 inch margins)\n */\nfunction getDefaultSectionProperties(): SectionProperties {\n return {\n pageWidth: 12240, // 8.5 inches in twips\n pageHeight: 15840, // 11 inches in twips\n orientation: 'portrait',\n marginTop: 1440, // 1 inch\n marginBottom: 1440,\n marginLeft: 1440,\n marginRight: 1440,\n headerDistance: 720, // 0.5 inch\n footerDistance: 720,\n gutter: 0,\n columnCount: 1,\n columnSpace: 720,\n equalWidth: true,\n sectionStart: 'nextPage',\n verticalAlign: 'top',\n };\n}\n\n// ============================================================================\n// EMPTY DOCUMENT\n// ============================================================================\n\n/**\n * Options for creating an empty document\n */\nexport interface CreateEmptyDocumentOptions {\n /** Page width in twips (default: 12240 = 8.5 inches) */\n pageWidth?: number;\n /** Page height in twips (default: 15840 = 11 inches) */\n pageHeight?: number;\n /** Page orientation (default: 'portrait') */\n orientation?: 'portrait' | 'landscape';\n /** Top margin in twips (default: 1440 = 1 inch) */\n marginTop?: number;\n /** Bottom margin in twips (default: 1440 = 1 inch) */\n marginBottom?: number;\n /** Left margin in twips (default: 1440 = 1 inch) */\n marginLeft?: number;\n /** Right margin in twips (default: 1440 = 1 inch) */\n marginRight?: number;\n /** Initial text content (default: empty string) */\n initialText?: string;\n}\n\n/**\n * Create an empty document with a single paragraph\n *\n * @param options - Optional configuration for the document\n * @returns A new empty Document object\n *\n * @example\n * ```ts\n * // Create a blank document\n * const doc = createEmptyDocument();\n *\n * // Create with custom margins\n * const doc = createEmptyDocument({\n * marginTop: 720, // 0.5 inch\n * marginBottom: 720,\n * });\n *\n * // Create with initial text\n * const doc = createEmptyDocument({\n * initialText: 'Hello, World!'\n * });\n * ```\n */\nexport function createEmptyDocument(options: CreateEmptyDocumentOptions = {}): Document {\n const sectionProps = getDefaultSectionProperties();\n\n // Apply custom options\n if (options.pageWidth !== undefined) sectionProps.pageWidth = options.pageWidth;\n if (options.pageHeight !== undefined) sectionProps.pageHeight = options.pageHeight;\n if (options.orientation !== undefined) sectionProps.orientation = options.orientation;\n if (options.marginTop !== undefined) sectionProps.marginTop = options.marginTop;\n if (options.marginBottom !== undefined) sectionProps.marginBottom = options.marginBottom;\n if (options.marginLeft !== undefined) sectionProps.marginLeft = options.marginLeft;\n if (options.marginRight !== undefined) sectionProps.marginRight = options.marginRight;\n\n // Create initial paragraph content\n const textContent: TextContent = {\n type: 'text',\n text: options.initialText || '',\n };\n\n const run: Run = {\n type: 'run',\n content: options.initialText ? [textContent] : [],\n formatting: {\n fontSize: 22, // 11pt (half-points) - Google Docs default\n fontFamily: {\n ascii: 'Arial',\n hAnsi: 'Arial',\n },\n },\n };\n\n const paragraph: Paragraph = {\n type: 'paragraph',\n content: [run],\n formatting: {\n lineSpacing: 276, // 1.15 line spacing (default Word)\n },\n };\n\n // Create document body\n const documentBody: DocumentBody = {\n content: [paragraph],\n finalSectionProperties: sectionProps,\n };\n\n // Create package with default styles\n const docxPackage: DocxPackage = {\n document: documentBody,\n styles: {\n docDefaults: {\n rPr: {\n fontSize: 22, // 11pt (Google Docs default)\n fontFamily: {\n ascii: 'Arial',\n hAnsi: 'Arial',\n },\n },\n pPr: {\n lineSpacing: 276, // 1.15 line spacing\n },\n },\n styles: getDefaultStyles(),\n },\n };\n\n // Create document\n const document: Document = {\n package: docxPackage,\n templateVariables: [],\n warnings: [],\n };\n\n return document;\n}\n\n/**\n * Create a document with a single paragraph containing the given text\n *\n * @param text - The text content for the document\n * @param options - Optional configuration for the document\n * @returns A new Document object with the specified text\n */\nexport function createDocumentWithText(\n text: string,\n options: Omit<CreateEmptyDocumentOptions, 'initialText'> = {}\n): Document {\n return createEmptyDocument({ ...options, initialText: text });\n}\n","/**\n * DocumentAgent - High-level fluent API for programmatic document manipulation\n *\n * Provides a convenient interface for:\n * - Reading document content and metadata\n * - Editing text with formatting\n * - Inserting tables, images, and hyperlinks\n * - Managing template variables\n * - Exporting to DOCX buffer\n *\n * All operations are immutable - they return a new DocumentAgent instance\n * or don't modify the underlying document.\n */\n\nimport type {\n Document,\n DocumentBody,\n Paragraph,\n Table,\n Run,\n TextFormatting,\n ParagraphFormatting,\n Style,\n Hyperlink,\n} from '../types/document';\n\nimport type {\n Position,\n Range,\n AgentContext,\n StyleInfo,\n ParagraphOutline,\n SectionInfo,\n} from '../types/agentApi';\n\nimport { executeCommand, executeCommands } from './executor';\nimport type { AgentCommand } from '../types/agentApi';\nimport { repackDocx, createDocx } from '../docx/rezip';\nimport { detectVariables } from '../utils/variableDetector';\nimport { parseDocx } from '../docx/parser';\nimport type { DocxInput } from '../utils/docxInput';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Options for inserting text\n */\nexport interface InsertTextOptions {\n /** Text formatting */\n formatting?: TextFormatting;\n}\n\n/**\n * Options for inserting table\n */\nexport interface InsertTableOptions {\n /** Table data (2D array of strings) */\n data?: string[][];\n /** Whether first row is a header */\n hasHeader?: boolean;\n}\n\n/**\n * Options for inserting image\n */\nexport interface InsertImageOptions {\n /** Image width in pixels */\n width?: number;\n /** Image height in pixels */\n height?: number;\n /** Alt text for accessibility */\n alt?: string;\n}\n\n/**\n * Options for inserting hyperlink\n */\nexport interface InsertHyperlinkOptions {\n /** Display text (overrides selected text) */\n displayText?: string;\n /** Tooltip on hover */\n tooltip?: string;\n}\n\n/**\n * Formatted text segment\n */\nexport interface FormattedTextSegment {\n /** Text content */\n text: string;\n /** Applied formatting */\n formatting?: TextFormatting;\n /** Is part of a hyperlink */\n isHyperlink?: boolean;\n /** Hyperlink URL if applicable */\n hyperlinkUrl?: string;\n}\n\n// ============================================================================\n// DOCUMENT AGENT CLASS\n// ============================================================================\n\n/**\n * DocumentAgent provides a fluent API for document manipulation\n *\n * @example\n * ```ts\n * const agent = new DocumentAgent(buffer);\n *\n * // Read operations\n * const text = agent.getText();\n * const wordCount = agent.getWordCount();\n * const variables = agent.getVariables();\n *\n * // Write operations (returns new agent)\n * const newAgent = agent\n * .insertText({ paragraphIndex: 0, offset: 0 }, 'Hello ', { formatting: { bold: true } })\n * .applyStyle({ paragraphIndex: 0, offset: 0 }, { paragraphIndex: 0, offset: 5 }, 'Heading1');\n *\n * // Export\n * const newBuffer = await newAgent.toBuffer();\n * ```\n */\nexport class DocumentAgent {\n private _document: Document;\n private _pendingVariables: Record<string, string>;\n\n /**\n * Create a new DocumentAgent\n *\n * @param source - Document object or ArrayBuffer to parse\n */\n constructor(source: Document | ArrayBuffer) {\n if (source instanceof ArrayBuffer || ArrayBuffer.isView(source)) {\n // Will be loaded asynchronously - store buffer for now\n this._document = {\n package: {\n document: { content: [] },\n },\n originalBuffer: source instanceof ArrayBuffer ? source : (source.buffer as ArrayBuffer),\n };\n } else {\n this._document = source;\n }\n this._pendingVariables = {};\n }\n\n /**\n * Create a DocumentAgent from a DOCX buffer (async)\n *\n * @param buffer - DOCX file as ArrayBuffer, Uint8Array, Blob, or File\n * @returns Promise resolving to DocumentAgent\n */\n static async fromBuffer(buffer: DocxInput): Promise<DocumentAgent> {\n const document = await parseDocx(buffer);\n return new DocumentAgent(document);\n }\n\n /**\n * Create a DocumentAgent from a Document object\n *\n * @param document - Parsed Document\n * @returns DocumentAgent\n */\n static fromDocument(document: Document): DocumentAgent {\n return new DocumentAgent(document);\n }\n\n // ==========================================================================\n // READING METHODS\n // ==========================================================================\n\n /**\n * Get the underlying document\n */\n getDocument(): Document {\n return this._document;\n }\n\n /**\n * Get plain text content of the document\n *\n * @returns All document text concatenated\n */\n getText(): string {\n const body = this._document.package.document;\n return this._getBodyText(body);\n }\n\n /**\n * Get formatted text segments\n *\n * @returns Array of text segments with formatting info\n */\n getFormattedText(): FormattedTextSegment[] {\n const segments: FormattedTextSegment[] = [];\n const body = this._document.package.document;\n\n for (const block of body.content) {\n if (block.type === 'paragraph') {\n this._extractParagraphSegments(block, segments);\n }\n }\n\n return segments;\n }\n\n /**\n * Get detected template variables\n *\n * @returns Array of variable names (without braces)\n */\n getVariables(): string[] {\n return detectVariables(this._document);\n }\n\n /**\n * Get available styles from the document\n *\n * @returns Array of style info\n */\n getStyles(): StyleInfo[] {\n const styleDefinitions = this._document.package.styles;\n if (!styleDefinitions?.styles) {\n return [];\n }\n\n const styleInfos: StyleInfo[] = [];\n\n for (const [styleId, style] of Object.entries(styleDefinitions.styles)) {\n if (typeof style === 'object' && style !== null) {\n const styleObj = style as Style;\n styleInfos.push({\n id: styleId,\n name: styleObj.name || styleId,\n type: styleObj.type === 'numbering' ? 'paragraph' : styleObj.type || 'paragraph',\n builtIn: styleObj.default, // Use default property as proxy for built-in\n });\n }\n }\n\n return styleInfos;\n }\n\n /**\n * Get approximate page count\n *\n * Note: This is an estimate based on content length.\n * Actual page count requires full layout computation.\n *\n * @returns Estimated page count\n */\n getPageCount(): number {\n // Estimate: ~500 words per page\n const wordCount = this.getWordCount();\n return Math.max(1, Math.ceil(wordCount / 500));\n }\n\n /**\n * Get word count\n *\n * @returns Number of words in the document\n */\n getWordCount(): number {\n const text = this.getText();\n // Split by whitespace and filter empty strings\n const words = text.split(/\\s+/).filter((w) => w.length > 0);\n return words.length;\n }\n\n /**\n * Get character count\n *\n * @param includeSpaces - Whether to include whitespace\n * @returns Number of characters\n */\n getCharacterCount(includeSpaces = true): number {\n const text = this.getText();\n if (includeSpaces) {\n return text.length;\n }\n return text.replace(/\\s/g, '').length;\n }\n\n /**\n * Get paragraph count\n *\n * @returns Number of paragraphs\n */\n getParagraphCount(): number {\n return this._document.package.document.content.filter((block) => block.type === 'paragraph')\n .length;\n }\n\n /**\n * Get table count\n *\n * @returns Number of tables\n */\n getTableCount(): number {\n return this._document.package.document.content.filter((block) => block.type === 'table').length;\n }\n\n /**\n * Get document context for AI agents\n *\n * @param outlineMaxChars - Max characters per paragraph in outline\n * @returns Agent context\n */\n getAgentContext(outlineMaxChars = 100): AgentContext {\n const body = this._document.package.document;\n const paragraphs = body.content.filter((b): b is Paragraph => b.type === 'paragraph');\n\n const outline: ParagraphOutline[] = paragraphs.map((para, index) => {\n const text = this._getParagraphText(para);\n const styleId = para.formatting?.styleId;\n\n return {\n index,\n preview: text.slice(0, outlineMaxChars),\n style: styleId,\n isHeading: styleId?.toLowerCase().includes('heading') || false,\n headingLevel: this._parseHeadingLevel(styleId),\n isListItem: !!para.listRendering,\n isEmpty: text.trim().length === 0,\n };\n });\n\n const sections: SectionInfo[] = (body.sections || []).map((section, index) => ({\n index,\n paragraphCount: section.content?.length || 0,\n pageSize:\n section.properties?.pageWidth && section.properties?.pageHeight\n ? {\n width: section.properties.pageWidth,\n height: section.properties.pageHeight,\n }\n : undefined,\n isLandscape: section.properties?.orientation === 'landscape',\n hasHeader: !!section.properties?.headerReferences?.length,\n hasFooter: !!section.properties?.footerReferences?.length,\n }));\n\n return {\n paragraphCount: paragraphs.length,\n wordCount: this.getWordCount(),\n characterCount: this.getCharacterCount(),\n variables: this.getVariables(),\n variableCount: this.getVariables().length,\n availableStyles: this.getStyles(),\n outline,\n sections,\n hasTables: this.getTableCount() > 0,\n hasImages: this._hasImages(),\n hasHyperlinks: this._hasHyperlinks(),\n };\n }\n\n // ==========================================================================\n // WRITING METHODS\n // ==========================================================================\n\n /**\n * Insert text at a position\n *\n * @param position - Where to insert\n * @param text - Text to insert\n * @param options - Insert options\n * @returns New DocumentAgent with text inserted\n */\n insertText(position: Position, text: string, options: InsertTextOptions = {}): DocumentAgent {\n const command: AgentCommand = {\n type: 'insertText',\n position,\n text,\n formatting: options.formatting,\n };\n return this._executeCommand(command);\n }\n\n /**\n * Replace text in a range\n *\n * @param range - Range to replace\n * @param text - Replacement text\n * @param options - Replace options\n * @returns New DocumentAgent with text replaced\n */\n replaceRange(range: Range, text: string, options: InsertTextOptions = {}): DocumentAgent {\n const command: AgentCommand = {\n type: 'replaceText',\n range,\n text,\n formatting: options.formatting,\n };\n return this._executeCommand(command);\n }\n\n /**\n * Delete text in a range\n *\n * @param range - Range to delete\n * @returns New DocumentAgent with text deleted\n */\n deleteRange(range: Range): DocumentAgent {\n const command: AgentCommand = {\n type: 'deleteText',\n range,\n };\n return this._executeCommand(command);\n }\n\n /**\n * Apply text formatting to a range\n *\n * @param range - Range to format\n * @param formatting - Formatting to apply\n * @returns New DocumentAgent with formatting applied\n */\n applyFormatting(range: Range, formatting: Partial<TextFormatting>): DocumentAgent {\n const command: AgentCommand = {\n type: 'formatText',\n range,\n formatting,\n };\n return this._executeCommand(command);\n }\n\n /**\n * Apply a named style to a paragraph\n *\n * @param paragraphIndex - Index of the paragraph\n * @param styleId - Style ID to apply\n * @returns New DocumentAgent with style applied\n */\n applyStyle(paragraphIndex: number, styleId: string): DocumentAgent {\n const command: AgentCommand = {\n type: 'applyStyle',\n paragraphIndex,\n styleId,\n };\n return this._executeCommand(command);\n }\n\n /**\n * Apply paragraph formatting\n *\n * @param paragraphIndex - Index of the paragraph\n * @param formatting - Formatting to apply\n * @returns New DocumentAgent with formatting applied\n */\n applyParagraphFormatting(\n paragraphIndex: number,\n formatting: Partial<ParagraphFormatting>\n ): DocumentAgent {\n const command: AgentCommand = {\n type: 'formatParagraph',\n paragraphIndex,\n formatting,\n };\n return this._executeCommand(command);\n }\n\n // ==========================================================================\n // COMPLEX OPERATIONS\n // ==========================================================================\n\n /**\n * Insert a table at a position\n *\n * @param position - Where to insert the table\n * @param rows - Number of rows\n * @param cols - Number of columns\n * @param options - Table options\n * @returns New DocumentAgent with table inserted\n */\n insertTable(\n position: Position,\n rows: number,\n cols: number,\n options: InsertTableOptions = {}\n ): DocumentAgent {\n const command: AgentCommand = {\n type: 'insertTable',\n position,\n rows,\n columns: cols,\n data: options.data,\n hasHeader: options.hasHeader,\n };\n return this._executeCommand(command);\n }\n\n /**\n * Insert an image at a position\n *\n * @param position - Where to insert the image\n * @param src - Image source (base64 data URL or URL)\n * @param options - Image options\n * @returns New DocumentAgent with image inserted\n */\n insertImage(position: Position, src: string, options: InsertImageOptions = {}): DocumentAgent {\n const command: AgentCommand = {\n type: 'insertImage',\n position,\n src,\n width: options.width,\n height: options.height,\n alt: options.alt,\n };\n return this._executeCommand(command);\n }\n\n /**\n * Insert a hyperlink\n *\n * @param range - Range to make into a hyperlink\n * @param url - URL of the hyperlink\n * @param options - Hyperlink options\n * @returns New DocumentAgent with hyperlink inserted\n */\n insertHyperlink(range: Range, url: string, options: InsertHyperlinkOptions = {}): DocumentAgent {\n const command: AgentCommand = {\n type: 'insertHyperlink',\n range,\n url,\n displayText: options.displayText,\n tooltip: options.tooltip,\n };\n return this._executeCommand(command);\n }\n\n /**\n * Remove a hyperlink but keep the text\n *\n * @param range - Range containing the hyperlink\n * @returns New DocumentAgent with hyperlink removed\n */\n removeHyperlink(range: Range): DocumentAgent {\n const command: AgentCommand = {\n type: 'removeHyperlink',\n range,\n };\n return this._executeCommand(command);\n }\n\n /**\n * Insert a paragraph break\n *\n * @param position - Where to break the paragraph\n * @returns New DocumentAgent with paragraph broken\n */\n insertParagraphBreak(position: Position): DocumentAgent {\n const command: AgentCommand = {\n type: 'insertParagraphBreak',\n position,\n };\n return this._executeCommand(command);\n }\n\n /**\n * Merge consecutive paragraphs\n *\n * @param startParagraphIndex - First paragraph index\n * @param count - Number of paragraphs to merge with the first\n * @returns New DocumentAgent with paragraphs merged\n */\n mergeParagraphs(startParagraphIndex: number, count: number): DocumentAgent {\n const command: AgentCommand = {\n type: 'mergeParagraphs',\n paragraphIndex: startParagraphIndex,\n count,\n };\n return this._executeCommand(command);\n }\n\n // ==========================================================================\n // TEMPLATE VARIABLE METHODS\n // ==========================================================================\n\n /**\n * Set a template variable value\n *\n * Note: Variables are not applied until `applyVariables()` is called\n *\n * @param name - Variable name (without braces)\n * @param value - Variable value\n * @returns This DocumentAgent (for chaining)\n */\n setVariable(name: string, value: string): DocumentAgent {\n this._pendingVariables[name] = value;\n return this;\n }\n\n /**\n * Set multiple template variables\n *\n * @param variables - Map of variable names to values\n * @returns This DocumentAgent (for chaining)\n */\n setVariables(variables: Record<string, string>): DocumentAgent {\n for (const [name, value] of Object.entries(variables)) {\n this._pendingVariables[name] = value;\n }\n return this;\n }\n\n /**\n * Get pending variable values\n *\n * @returns Map of pending variable values\n */\n getPendingVariables(): Record<string, string> {\n return { ...this._pendingVariables };\n }\n\n /**\n * Clear pending variables\n *\n * @returns This DocumentAgent (for chaining)\n */\n clearPendingVariables(): DocumentAgent {\n this._pendingVariables = {};\n return this;\n }\n\n /**\n * Apply all pending template variables\n *\n * Uses docxtemplater to substitute variables while preserving formatting.\n *\n * @param variables - Optional additional variables (merged with pending)\n * @returns New DocumentAgent with variables applied\n */\n async applyVariables(variables?: Record<string, string>): Promise<DocumentAgent> {\n const allVariables = { ...this._pendingVariables, ...variables };\n\n if (Object.keys(allVariables).length === 0) {\n // No variables to apply\n return this;\n }\n\n // Get the original buffer\n const buffer = this._document.originalBuffer;\n if (!buffer) {\n throw new Error('Cannot apply variables: no original buffer for processing');\n }\n\n // Process template using docxtemplater (dynamic import to keep it off critical path)\n const { processTemplate } = await import('../utils/processTemplate');\n const processedBuffer = processTemplate(buffer, allVariables);\n\n // Parse the processed document\n const processedDoc = await parseDocx(processedBuffer);\n\n // Create new agent with processed document\n const newAgent = new DocumentAgent(processedDoc);\n newAgent._pendingVariables = {};\n\n return newAgent;\n }\n\n // ==========================================================================\n // EXPORT METHODS\n // ==========================================================================\n\n /**\n * Export document to DOCX ArrayBuffer\n *\n * @returns Promise resolving to DOCX file as ArrayBuffer\n */\n async toBuffer(): Promise<ArrayBuffer> {\n if (this._document.originalBuffer) {\n return repackDocx(this._document);\n }\n return createDocx(this._document);\n }\n\n /**\n * Export document to Blob\n *\n * @param mimeType - MIME type for the blob\n * @returns Promise resolving to DOCX file as Blob\n */\n async toBlob(\n mimeType = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'\n ): Promise<Blob> {\n const buffer = await this.toBuffer();\n return new Blob([buffer], { type: mimeType });\n }\n\n /**\n * Execute multiple commands in sequence\n *\n * @param commands - Commands to execute\n * @returns New DocumentAgent with all commands applied\n */\n executeCommands(commands: AgentCommand[]): DocumentAgent {\n return new DocumentAgent(executeCommands(this._document, commands));\n }\n\n // ==========================================================================\n // PRIVATE HELPERS\n // ==========================================================================\n\n /**\n * Execute a single command and return new agent\n */\n private _executeCommand(command: AgentCommand): DocumentAgent {\n const newAgent = new DocumentAgent(executeCommand(this._document, command));\n newAgent._pendingVariables = { ...this._pendingVariables };\n return newAgent;\n }\n\n /**\n * Get plain text from document body\n */\n private _getBodyText(body: DocumentBody): string {\n const texts: string[] = [];\n\n for (const block of body.content) {\n if (block.type === 'paragraph') {\n texts.push(this._getParagraphText(block));\n } else if (block.type === 'table') {\n texts.push(this._getTableText(block));\n }\n }\n\n return texts.join('\\n');\n }\n\n /**\n * Get plain text from a paragraph\n */\n private _getParagraphText(paragraph: Paragraph): string {\n const texts: string[] = [];\n\n for (const item of paragraph.content) {\n if (item.type === 'run') {\n texts.push(this._getRunText(item));\n } else if (item.type === 'hyperlink') {\n texts.push(this._getHyperlinkText(item));\n }\n }\n\n return texts.join('');\n }\n\n /**\n * Get plain text from a run\n */\n private _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\n /**\n * Get plain text from a hyperlink\n */\n private _getHyperlinkText(hyperlink: Hyperlink): string {\n const texts: string[] = [];\n for (const child of hyperlink.children) {\n if (child.type === 'run') {\n texts.push(this._getRunText(child));\n }\n }\n return texts.join('');\n }\n\n /**\n * Get plain text from a table\n */\n private _getTableText(table: Table): string {\n const texts: string[] = [];\n\n for (const row of table.rows) {\n for (const cell of row.cells) {\n for (const block of cell.content) {\n if (block.type === 'paragraph') {\n texts.push(this._getParagraphText(block));\n }\n }\n }\n }\n\n return texts.join('\\t');\n }\n\n /**\n * Extract formatted text segments from a paragraph\n */\n private _extractParagraphSegments(paragraph: Paragraph, segments: FormattedTextSegment[]): void {\n for (const item of paragraph.content) {\n if (item.type === 'run') {\n const text = this._getRunText(item);\n if (text) {\n segments.push({\n text,\n formatting: item.formatting,\n });\n }\n } else if (item.type === 'hyperlink') {\n const url = item.href || '';\n for (const child of item.children) {\n if (child.type === 'run') {\n const text = this._getRunText(child);\n if (text) {\n segments.push({\n text,\n formatting: child.formatting,\n isHyperlink: true,\n hyperlinkUrl: url,\n });\n }\n }\n }\n }\n }\n }\n\n /**\n * Parse heading level from style ID\n */\n private _parseHeadingLevel(styleId?: string): number | undefined {\n if (!styleId) return undefined;\n const match = styleId.match(/heading\\s*(\\d)/i);\n if (match) {\n return parseInt(match[1], 10);\n }\n return undefined;\n }\n\n /**\n * Check if document has images\n */\n private _hasImages(): boolean {\n const body = this._document.package.document;\n\n for (const block of body.content) {\n if (block.type === 'paragraph') {\n for (const item of block.content) {\n if (item.type === 'run') {\n for (const content of item.content) {\n if (content.type === 'drawing') {\n return true;\n }\n }\n }\n }\n }\n }\n\n return false;\n }\n\n /**\n * Check if document has hyperlinks\n */\n private _hasHyperlinks(): boolean {\n const body = this._document.package.document;\n\n for (const block of body.content) {\n if (block.type === 'paragraph') {\n for (const item of block.content) {\n if (item.type === 'hyperlink') {\n return true;\n }\n }\n }\n }\n\n return false;\n }\n}\n\n// ============================================================================\n// CONVENIENCE FUNCTIONS\n// ============================================================================\n\n/**\n * Create a DocumentAgent from a DOCX buffer\n *\n * @param buffer - DOCX file as ArrayBuffer\n * @returns Promise resolving to DocumentAgent\n */\nexport async function createAgent(buffer: ArrayBuffer): Promise<DocumentAgent> {\n return DocumentAgent.fromBuffer(buffer);\n}\n\n/**\n * Create a DocumentAgent from a parsed Document\n *\n * @param document - Parsed Document\n * @returns DocumentAgent\n */\nexport function createAgentFromDocument(document: Document): DocumentAgent {\n return DocumentAgent.fromDocument(document);\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default DocumentAgent;\n","/**\n * Agent Context Builder\n *\n * Generates context objects for AI/LLM consumption from DOCX documents.\n * The context provides a structured summary of the document that can be\n * used by AI agents to understand the document structure and content.\n *\n * All outputs are JSON serializable for easy transmission to AI backends.\n */\n\nimport type {\n Document,\n DocumentBody,\n Paragraph,\n Table,\n Run,\n Hyperlink,\n Style,\n} from '../types/document';\n\nimport type {\n AgentContext,\n StyleInfo,\n ParagraphOutline,\n SectionInfo,\n SelectionContext,\n ParagraphContext,\n SuggestedAction,\n Range,\n} from '../types/agentApi';\n\nimport { detectVariables } from '../utils/variableDetector';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Options for building agent context\n */\nexport interface AgentContextOptions {\n /** Maximum characters per paragraph in outline (default: 100) */\n outlineMaxChars?: number;\n /** Maximum paragraphs to include in outline (default: 50) */\n maxOutlineParagraphs?: number;\n /** Include table content in context (default: false) */\n includeTableContent?: boolean;\n /** Include detailed formatting info (default: false) */\n includeFormatting?: boolean;\n}\n\n/**\n * Options for building selection context\n */\nexport interface SelectionContextOptions {\n /** Characters of context before/after selection (default: 200) */\n contextChars?: number;\n /** Include suggested actions (default: true) */\n includeSuggestions?: boolean;\n}\n\n// ============================================================================\n// MAIN FUNCTIONS\n// ============================================================================\n\n/**\n * Build agent context from a document\n *\n * @param doc - The parsed document\n * @param options - Context building options\n * @returns AgentContext object (JSON serializable)\n */\nexport function getAgentContext(doc: Document, options: AgentContextOptions = {}): AgentContext {\n const { outlineMaxChars = 100, maxOutlineParagraphs = 50 } = options;\n\n const body = doc.package.document;\n\n // Get paragraphs\n const paragraphs = body.content.filter((block): block is Paragraph => block.type === 'paragraph');\n\n // Build outline\n const outline = buildOutline(paragraphs, outlineMaxChars, maxOutlineParagraphs);\n\n // Get variables\n const variables = detectVariables(doc);\n\n // Get styles\n const availableStyles = getStylesFromDoc(doc);\n\n // Get sections\n const sections = getSectionsInfo(body);\n\n // Calculate counts\n const wordCount = calculateWordCount(body);\n const characterCount = calculateCharacterCount(body);\n\n // Check for features\n const hasTables = body.content.some((b) => b.type === 'table');\n const hasImages = hasDocImages(body);\n const hasHyperlinks = hasDocHyperlinks(body);\n\n return {\n paragraphCount: paragraphs.length,\n wordCount,\n characterCount,\n variables,\n variableCount: variables.length,\n availableStyles,\n outline,\n sections,\n hasTables,\n hasImages,\n hasHyperlinks,\n };\n}\n\n/**\n * Build selection context for AI operations\n *\n * @param doc - The parsed document\n * @param range - The selected range\n * @param options - Selection context options\n * @returns SelectionContext object (JSON serializable)\n */\nexport function buildSelectionContext(\n doc: Document,\n range: Range,\n options: SelectionContextOptions = {}\n): SelectionContext {\n const { contextChars = 200, includeSuggestions = true } = options;\n\n const body = doc.package.document;\n const paragraphs = body.content.filter((block): block is Paragraph => block.type === 'paragraph');\n\n // Get the paragraph at the start of the selection\n const paragraph = paragraphs[range.start.paragraphIndex];\n if (!paragraph) {\n throw new Error(`Paragraph not found at index ${range.start.paragraphIndex}`);\n }\n\n // Get paragraph text\n const paragraphText = getParagraphText(paragraph);\n\n // Extract selected text\n let selectedText = '';\n if (range.start.paragraphIndex === range.end.paragraphIndex) {\n selectedText = paragraphText.slice(range.start.offset, range.end.offset);\n } else {\n // Multi-paragraph selection\n const texts: string[] = [];\n for (let i = range.start.paragraphIndex; i <= range.end.paragraphIndex; i++) {\n const para = paragraphs[i];\n if (!para) continue;\n const text = getParagraphText(para);\n if (i === range.start.paragraphIndex) {\n texts.push(text.slice(range.start.offset));\n } else if (i === range.end.paragraphIndex) {\n texts.push(text.slice(0, range.end.offset));\n } else {\n texts.push(text);\n }\n }\n selectedText = texts.join('\\n');\n }\n\n // Get context before and after selection\n const textBefore = getTextBefore(\n paragraphs,\n range.start.paragraphIndex,\n range.start.offset,\n contextChars\n );\n const textAfter = getTextAfter(\n paragraphs,\n range.end.paragraphIndex,\n range.end.offset,\n contextChars\n );\n\n // Get formatting from first run in selection\n const formatting = getFormattingAtPosition(paragraph, range.start.offset);\n const paragraphFormatting = paragraph.formatting || {};\n\n // Build paragraph context\n const paragraphContext: ParagraphContext = {\n index: range.start.paragraphIndex,\n fullText: paragraphText,\n style: paragraph.formatting?.styleId,\n wordCount: countWords(paragraphText),\n };\n\n // Check if in table or hyperlink\n const inTable = false; // TODO: detect if selection is in a table\n const inHyperlink = isInHyperlink(paragraph, range.start.offset);\n\n // Build suggested actions\n const suggestedActions = includeSuggestions\n ? getSuggestedActions(selectedText, formatting, paragraphContext)\n : [];\n\n return {\n selectedText,\n range,\n formatting,\n paragraphFormatting,\n textBefore,\n textAfter,\n paragraph: paragraphContext,\n inTable,\n inHyperlink,\n suggestedActions,\n };\n}\n\n/**\n * Get a simple document summary for quick context\n *\n * @param doc - The parsed document\n * @returns Summary string\n */\nexport function getDocumentSummary(doc: Document): string {\n const context = getAgentContext(doc, {\n outlineMaxChars: 50,\n maxOutlineParagraphs: 10,\n });\n\n const parts: string[] = [\n `Document with ${context.paragraphCount} paragraphs, ${context.wordCount} words.`,\n ];\n\n if (context.hasTables) {\n parts.push('Contains tables.');\n }\n if (context.hasImages) {\n parts.push('Contains images.');\n }\n if (context.hasHyperlinks) {\n parts.push('Contains hyperlinks.');\n }\n if (context.variableCount > 0) {\n parts.push(`Has ${context.variableCount} template variables: ${context.variables.join(', ')}`);\n }\n\n // Add headings outline\n const headings = context.outline.filter((p) => p.isHeading);\n if (headings.length > 0) {\n parts.push('\\nHeadings:');\n for (const heading of headings.slice(0, 5)) {\n const level = heading.headingLevel || 1;\n parts.push(`${' '.repeat(level - 1)}- ${heading.preview}`);\n }\n if (headings.length > 5) {\n parts.push(` ... and ${headings.length - 5} more headings`);\n }\n }\n\n return parts.join(' ');\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Build document outline\n */\nfunction buildOutline(\n paragraphs: Paragraph[],\n maxChars: number,\n maxParagraphs: number\n): ParagraphOutline[] {\n const outline: ParagraphOutline[] = [];\n\n for (let i = 0; i < Math.min(paragraphs.length, maxParagraphs); i++) {\n const para = paragraphs[i];\n const text = getParagraphText(para);\n const styleId = para.formatting?.styleId;\n\n outline.push({\n index: i,\n preview: text.slice(0, maxChars),\n style: styleId,\n isHeading: isHeadingStyle(styleId),\n headingLevel: parseHeadingLevel(styleId),\n isListItem: !!para.listRendering,\n isEmpty: text.trim().length === 0,\n });\n }\n\n return outline;\n}\n\n/**\n * Get styles from document\n */\nfunction getStylesFromDoc(doc: Document): StyleInfo[] {\n const styleDefinitions = doc.package.styles;\n if (!styleDefinitions?.styles) {\n return [];\n }\n\n const styleInfos: StyleInfo[] = [];\n\n for (const [styleId, style] of Object.entries(styleDefinitions.styles)) {\n if (typeof style === 'object' && style !== null) {\n const styleObj = style as Style;\n styleInfos.push({\n id: styleId,\n name: styleObj.name || styleId,\n type: styleObj.type === 'numbering' ? 'paragraph' : styleObj.type || 'paragraph',\n builtIn: styleObj.default, // Use default property as proxy for built-in\n });\n }\n }\n\n return styleInfos;\n}\n\n/**\n * Get sections info\n */\nfunction getSectionsInfo(body: DocumentBody): SectionInfo[] {\n if (!body.sections) {\n return [];\n }\n\n return body.sections.map((section, index) => ({\n index,\n paragraphCount: section.content?.length || 0,\n pageSize:\n section.properties?.pageWidth && section.properties?.pageHeight\n ? {\n width: section.properties.pageWidth,\n height: section.properties.pageHeight,\n }\n : undefined,\n isLandscape: section.properties?.orientation === 'landscape',\n hasHeader: !!section.properties?.headerReferences?.length,\n hasFooter: !!section.properties?.footerReferences?.length,\n }));\n}\n\n/**\n * Calculate word count for document body\n */\nfunction calculateWordCount(body: DocumentBody): number {\n let count = 0;\n for (const block of body.content) {\n if (block.type === 'paragraph') {\n const text = getParagraphText(block);\n count += countWords(text);\n } else if (block.type === 'table') {\n count += getTableWordCount(block);\n }\n }\n return count;\n}\n\n/**\n * Count words in text\n */\nfunction countWords(text: string): number {\n const words = text.split(/\\s+/).filter((w) => w.length > 0);\n return words.length;\n}\n\n/**\n * Calculate character count for document body\n */\nfunction calculateCharacterCount(body: DocumentBody): number {\n let count = 0;\n for (const block of body.content) {\n if (block.type === 'paragraph') {\n const text = getParagraphText(block);\n count += text.length;\n } else if (block.type === 'table') {\n count += getTableCharacterCount(block);\n }\n }\n return count;\n}\n\n/**\n * Get word count from table\n */\nfunction getTableWordCount(table: Table): number {\n let count = 0;\n for (const row of table.rows) {\n for (const cell of row.cells) {\n for (const block of cell.content) {\n if (block.type === 'paragraph') {\n const text = getParagraphText(block);\n count += countWords(text);\n }\n }\n }\n }\n return count;\n}\n\n/**\n * Get character count from table\n */\nfunction getTableCharacterCount(table: Table): number {\n let count = 0;\n for (const row of table.rows) {\n for (const cell of row.cells) {\n for (const block of cell.content) {\n if (block.type === 'paragraph') {\n const text = getParagraphText(block);\n count += text.length;\n }\n }\n }\n }\n return count;\n}\n\n/**\n * Get plain text from paragraph\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\n/**\n * Get plain text from run\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\n/**\n * Get plain text from hyperlink\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 * Check if document has images\n */\nfunction hasDocImages(body: DocumentBody): boolean {\n for (const block of body.content) {\n if (block.type === 'paragraph') {\n for (const item of block.content) {\n if (item.type === 'run') {\n for (const content of item.content) {\n if (content.type === 'drawing') {\n return true;\n }\n }\n }\n }\n }\n }\n return false;\n}\n\n/**\n * Check if document has hyperlinks\n */\nfunction hasDocHyperlinks(body: DocumentBody): boolean {\n for (const block of body.content) {\n if (block.type === 'paragraph') {\n for (const item of block.content) {\n if (item.type === 'hyperlink') {\n return true;\n }\n }\n }\n }\n return false;\n}\n\n/**\n * Check if style is a heading\n */\nfunction isHeadingStyle(styleId?: string): boolean {\n if (!styleId) return false;\n return styleId.toLowerCase().includes('heading');\n}\n\n/**\n * Parse heading level from style ID\n */\nfunction parseHeadingLevel(styleId?: string): number | undefined {\n if (!styleId) return undefined;\n const match = styleId.match(/heading\\s*(\\d)/i);\n if (match) {\n return parseInt(match[1], 10);\n }\n return undefined;\n}\n\n/**\n * Get text before a position\n */\nfunction getTextBefore(\n paragraphs: Paragraph[],\n paragraphIndex: number,\n offset: number,\n maxChars: number\n): string {\n const texts: string[] = [];\n let totalChars = 0;\n\n // Get text before offset in current paragraph\n const currentPara = paragraphs[paragraphIndex];\n if (currentPara) {\n const text = getParagraphText(currentPara);\n const beforeText = text.slice(0, offset);\n texts.unshift(beforeText);\n totalChars += beforeText.length;\n }\n\n // Get text from previous paragraphs if needed\n for (let i = paragraphIndex - 1; i >= 0 && totalChars < maxChars; i--) {\n const para = paragraphs[i];\n if (!para) continue;\n const text = getParagraphText(para);\n texts.unshift(text);\n totalChars += text.length;\n }\n\n const combined = texts.join('\\n');\n if (combined.length > maxChars) {\n return '...' + combined.slice(-maxChars);\n }\n return combined;\n}\n\n/**\n * Get text after a position\n */\nfunction getTextAfter(\n paragraphs: Paragraph[],\n paragraphIndex: number,\n offset: number,\n maxChars: number\n): string {\n const texts: string[] = [];\n let totalChars = 0;\n\n // Get text after offset in current paragraph\n const currentPara = paragraphs[paragraphIndex];\n if (currentPara) {\n const text = getParagraphText(currentPara);\n const afterText = text.slice(offset);\n texts.push(afterText);\n totalChars += afterText.length;\n }\n\n // Get text from following paragraphs if needed\n for (let i = paragraphIndex + 1; i < paragraphs.length && totalChars < maxChars; i++) {\n const para = paragraphs[i];\n if (!para) continue;\n const text = getParagraphText(para);\n texts.push(text);\n totalChars += text.length;\n }\n\n const combined = texts.join('\\n');\n if (combined.length > maxChars) {\n return combined.slice(0, maxChars) + '...';\n }\n return combined;\n}\n\n/**\n * Get formatting at a specific position in a paragraph\n */\nfunction getFormattingAtPosition(\n paragraph: Paragraph,\n offset: number\n): Partial<import('../types/document').TextFormatting> {\n let currentOffset = 0;\n\n for (const item of paragraph.content) {\n if (item.type === 'run') {\n const text = getRunText(item);\n const runStart = currentOffset;\n const runEnd = currentOffset + text.length;\n\n if (offset >= runStart && offset < runEnd) {\n return item.formatting || {};\n }\n\n currentOffset = runEnd;\n } else if (item.type === 'hyperlink') {\n const text = getHyperlinkText(item);\n const linkStart = currentOffset;\n const linkEnd = currentOffset + text.length;\n\n if (offset >= linkStart && offset < linkEnd) {\n // Return formatting from first child run\n for (const child of item.children) {\n if (child.type === 'run') {\n return child.formatting || {};\n }\n }\n }\n\n currentOffset = linkEnd;\n }\n }\n\n return {};\n}\n\n/**\n * Check if position is within a hyperlink\n */\nfunction isInHyperlink(paragraph: Paragraph, offset: number): boolean {\n let currentOffset = 0;\n\n for (const item of paragraph.content) {\n if (item.type === 'run') {\n const text = getRunText(item);\n currentOffset += text.length;\n } else if (item.type === 'hyperlink') {\n const text = getHyperlinkText(item);\n const linkStart = currentOffset;\n const linkEnd = currentOffset + text.length;\n\n if (offset >= linkStart && offset < linkEnd) {\n return true;\n }\n\n currentOffset = linkEnd;\n }\n }\n\n return false;\n}\n\n/**\n * Get suggested actions for selection\n */\nfunction getSuggestedActions(\n selectedText: string,\n _formatting: Partial<import('../types/document').TextFormatting>,\n _paragraphContext: ParagraphContext\n): SuggestedAction[] {\n const actions: SuggestedAction[] = [];\n\n // Basic actions for any text\n if (selectedText.length > 0) {\n actions.push(\n { id: 'rewrite', label: 'Rewrite', description: 'Rewrite this text', priority: 10 },\n { id: 'summarize', label: 'Summarize', description: 'Summarize this text', priority: 9 }\n );\n\n // Long text suggestions\n if (selectedText.length > 200) {\n actions.push({\n id: 'summarize',\n label: 'Summarize',\n description: 'Create a shorter version',\n priority: 8,\n });\n }\n\n // Short text suggestions\n if (selectedText.length < 50 && selectedText.split(/\\s+/).length < 10) {\n actions.push({\n id: 'expand',\n label: 'Expand',\n description: 'Add more details',\n priority: 8,\n });\n }\n\n // Grammar fix is always useful\n actions.push({\n id: 'fixGrammar',\n label: 'Fix Grammar',\n description: 'Fix grammar and spelling',\n priority: 7,\n });\n\n // Translate\n actions.push({\n id: 'translate',\n label: 'Translate',\n description: 'Translate to another language',\n priority: 6,\n });\n\n // Tone adjustments\n actions.push(\n { id: 'makeFormal', label: 'Make Formal', description: 'Use formal tone', priority: 5 },\n { id: 'makeCasual', label: 'Make Casual', description: 'Use casual tone', priority: 4 }\n );\n }\n\n // Sort by priority (descending)\n actions.sort((a, b) => (b.priority || 0) - (a.priority || 0));\n\n return actions;\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport {\n getAgentContext as default,\n getParagraphText,\n getRunText,\n calculateWordCount,\n calculateCharacterCount,\n countWords,\n};\n","/**\n * Selection Context Builder\n *\n * Builds rich context objects from document selections for AI operations.\n * Includes selected text, formatting, surrounding context, and suggested actions.\n */\n\nimport type {\n Document,\n DocumentBody,\n Paragraph,\n Run,\n Hyperlink,\n TextFormatting,\n} from '../types/document';\n\nimport type {\n SelectionContext,\n ParagraphContext,\n SuggestedAction,\n Range,\n Position,\n} from '../types/agentApi';\n\nimport { getDocumentSummary } from './context';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Options for building selection context\n */\nexport interface SelectionContextOptions {\n /** Characters of context before selection (default: 200) */\n contextCharsBefore?: number;\n /** Characters of context after selection (default: 200) */\n contextCharsAfter?: number;\n /** Include suggested actions (default: true) */\n includeSuggestions?: boolean;\n /** Include document summary (default: true) */\n includeDocumentSummary?: boolean;\n /** Maximum suggested actions (default: 8) */\n maxSuggestions?: number;\n}\n\n/**\n * Extended selection context with additional details\n */\nexport interface ExtendedSelectionContext extends SelectionContext {\n /** Document summary for additional context */\n documentSummary?: string;\n /** Selection word count */\n wordCount?: number;\n /** Selection character count */\n characterCount?: number;\n /** Is selection multi-paragraph */\n isMultiParagraph?: boolean;\n /** Selected paragraph indices */\n paragraphIndices?: number[];\n /** Language detection hint */\n detectedLanguage?: string;\n /** Content type hints */\n contentType?: 'prose' | 'list' | 'heading' | 'table' | 'mixed';\n}\n\n/**\n * Selection formatting summary\n */\nexport interface FormattingSummary {\n /** Predominant formatting */\n predominant: Partial<TextFormatting>;\n /** Is formatting consistent across selection */\n isConsistent: boolean;\n /** All formatting found */\n allFormatting: Partial<TextFormatting>[];\n}\n\n// ============================================================================\n// MAIN FUNCTIONS\n// ============================================================================\n\n/**\n * Build selection context for AI operations\n *\n * @param doc - The parsed document\n * @param range - The selected range\n * @param options - Selection context options\n * @returns SelectionContext object\n */\nexport function buildSelectionContext(\n doc: Document,\n range: Range,\n options: SelectionContextOptions = {}\n): SelectionContext {\n const { contextCharsBefore = 200, contextCharsAfter = 200, includeSuggestions = true } = options;\n\n const body = doc.package.document;\n const paragraphs = body.content.filter((block): block is Paragraph => block.type === 'paragraph');\n\n // Validate range\n if (range.start.paragraphIndex >= paragraphs.length) {\n throw new Error(`Invalid start paragraph index: ${range.start.paragraphIndex}`);\n }\n\n const startParagraph = paragraphs[range.start.paragraphIndex];\n\n // Extract selected text\n const selectedText = extractSelectedText(paragraphs, range);\n\n // Get context before and after\n const textBefore = getTextBefore(paragraphs, range.start, contextCharsBefore);\n const textAfter = getTextAfter(paragraphs, range.end, contextCharsAfter);\n\n // Get formatting at selection start\n const formatting = getFormattingAtPosition(startParagraph, range.start.offset);\n const paragraphFormatting = startParagraph.formatting || {};\n\n // Build paragraph context\n const paragraphContext: ParagraphContext = {\n index: range.start.paragraphIndex,\n fullText: getParagraphText(startParagraph),\n style: startParagraph.formatting?.styleId,\n wordCount: countWords(getParagraphText(startParagraph)),\n };\n\n // Check special contexts\n const inTable = isPositionInTable(body, range.start);\n const inHyperlink = isPositionInHyperlink(startParagraph, range.start.offset);\n\n // Build suggested actions\n const suggestedActions = includeSuggestions\n ? getSuggestedActions(selectedText, formatting, paragraphContext)\n : [];\n\n return {\n selectedText,\n range,\n formatting,\n paragraphFormatting,\n textBefore,\n textAfter,\n paragraph: paragraphContext,\n inTable,\n inHyperlink,\n suggestedActions,\n };\n}\n\n/**\n * Build extended selection context with additional details\n *\n * @param doc - The parsed document\n * @param range - The selected range\n * @param options - Selection context options\n * @returns ExtendedSelectionContext object\n */\nexport function buildExtendedSelectionContext(\n doc: Document,\n range: Range,\n options: SelectionContextOptions = {}\n): ExtendedSelectionContext {\n const baseContext = buildSelectionContext(doc, range, options);\n\n const { includeDocumentSummary = true } = options;\n\n const body = doc.package.document;\n const paragraphs = body.content.filter((block): block is Paragraph => block.type === 'paragraph');\n\n // Calculate additional stats\n const wordCount = countWords(baseContext.selectedText);\n const characterCount = baseContext.selectedText.length;\n const isMultiParagraph = range.start.paragraphIndex !== range.end.paragraphIndex;\n\n // Get paragraph indices\n const paragraphIndices: number[] = [];\n for (let i = range.start.paragraphIndex; i <= range.end.paragraphIndex; i++) {\n paragraphIndices.push(i);\n }\n\n // Detect content type\n const contentType = detectContentType(paragraphs, range);\n\n // Get document summary if requested\n const documentSummary = includeDocumentSummary ? getDocumentSummary(doc) : undefined;\n\n // Detect language (simple heuristic)\n const detectedLanguage = detectLanguage(baseContext.selectedText);\n\n return {\n ...baseContext,\n documentSummary,\n wordCount,\n characterCount,\n isMultiParagraph,\n paragraphIndices,\n detectedLanguage,\n contentType,\n };\n}\n\n/**\n * Get formatting summary for a selection\n *\n * @param doc - The parsed document\n * @param range - The selected range\n * @returns FormattingSummary object\n */\nexport function getSelectionFormattingSummary(doc: Document, range: Range): FormattingSummary {\n const body = doc.package.document;\n const paragraphs = body.content.filter((block): block is Paragraph => block.type === 'paragraph');\n\n const allFormatting: Partial<TextFormatting>[] = [];\n\n for (let paraIdx = range.start.paragraphIndex; paraIdx <= range.end.paragraphIndex; paraIdx++) {\n const paragraph = paragraphs[paraIdx];\n if (!paragraph) continue;\n\n const startOffset = paraIdx === range.start.paragraphIndex ? range.start.offset : 0;\n const endOffset = paraIdx === range.end.paragraphIndex ? range.end.offset : Infinity;\n\n collectFormattingInRange(paragraph, startOffset, endOffset, allFormatting);\n }\n\n // Check if formatting is consistent\n const isConsistent =\n allFormatting.length <= 1 || allFormatting.every((f) => formatEqual(f, allFormatting[0]));\n\n // Get predominant formatting (first one or merge)\n const predominant = allFormatting.length > 0 ? allFormatting[0] : {};\n\n return {\n predominant,\n isConsistent,\n allFormatting,\n };\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Extract selected text from paragraphs\n */\nfunction extractSelectedText(paragraphs: Paragraph[], range: Range): string {\n if (range.start.paragraphIndex === range.end.paragraphIndex) {\n const paragraph = paragraphs[range.start.paragraphIndex];\n if (!paragraph) return '';\n const text = getParagraphText(paragraph);\n return text.slice(range.start.offset, range.end.offset);\n }\n\n const texts: string[] = [];\n for (let i = range.start.paragraphIndex; i <= range.end.paragraphIndex; i++) {\n const paragraph = paragraphs[i];\n if (!paragraph) continue;\n const text = getParagraphText(paragraph);\n\n if (i === range.start.paragraphIndex) {\n texts.push(text.slice(range.start.offset));\n } else if (i === range.end.paragraphIndex) {\n texts.push(text.slice(0, range.end.offset));\n } else {\n texts.push(text);\n }\n }\n\n return texts.join('\\n');\n}\n\n/**\n * Get text before a position\n */\nfunction getTextBefore(paragraphs: Paragraph[], position: Position, maxChars: number): string {\n const texts: string[] = [];\n let totalChars = 0;\n\n // Text before offset in current paragraph\n const currentPara = paragraphs[position.paragraphIndex];\n if (currentPara) {\n const text = getParagraphText(currentPara);\n const beforeText = text.slice(0, position.offset);\n texts.unshift(beforeText);\n totalChars += beforeText.length;\n }\n\n // Text from previous paragraphs\n for (let i = position.paragraphIndex - 1; i >= 0 && totalChars < maxChars; i--) {\n const para = paragraphs[i];\n if (!para) continue;\n const text = getParagraphText(para);\n texts.unshift(text);\n totalChars += text.length;\n }\n\n const combined = texts.join('\\n');\n if (combined.length > maxChars) {\n return '...' + combined.slice(-maxChars);\n }\n return combined;\n}\n\n/**\n * Get text after a position\n */\nfunction getTextAfter(paragraphs: Paragraph[], position: Position, maxChars: number): string {\n const texts: string[] = [];\n let totalChars = 0;\n\n // Text after offset in current paragraph\n const currentPara = paragraphs[position.paragraphIndex];\n if (currentPara) {\n const text = getParagraphText(currentPara);\n const afterText = text.slice(position.offset);\n texts.push(afterText);\n totalChars += afterText.length;\n }\n\n // Text from following paragraphs\n for (let i = position.paragraphIndex + 1; i < paragraphs.length && totalChars < maxChars; i++) {\n const para = paragraphs[i];\n if (!para) continue;\n const text = getParagraphText(para);\n texts.push(text);\n totalChars += text.length;\n }\n\n const combined = texts.join('\\n');\n if (combined.length > maxChars) {\n return combined.slice(0, maxChars) + '...';\n }\n return combined;\n}\n\n/**\n * Get formatting at a specific position\n */\nfunction getFormattingAtPosition(paragraph: Paragraph, offset: number): Partial<TextFormatting> {\n let currentOffset = 0;\n\n for (const item of paragraph.content) {\n if (item.type === 'run') {\n const text = getRunText(item);\n const runEnd = currentOffset + text.length;\n\n if (offset >= currentOffset && offset < runEnd) {\n return item.formatting || {};\n }\n\n currentOffset = runEnd;\n } else if (item.type === 'hyperlink') {\n const text = getHyperlinkText(item);\n const linkEnd = currentOffset + text.length;\n\n if (offset >= currentOffset && offset < linkEnd) {\n for (const child of item.children) {\n if (child.type === 'run') {\n return child.formatting || {};\n }\n }\n }\n\n currentOffset = linkEnd;\n }\n }\n\n return {};\n}\n\n/**\n * Collect formatting in a range within a paragraph\n */\nfunction collectFormattingInRange(\n paragraph: Paragraph,\n startOffset: number,\n endOffset: number,\n result: Partial<TextFormatting>[]\n): void {\n let currentOffset = 0;\n\n for (const item of paragraph.content) {\n if (item.type === 'run') {\n const text = getRunText(item);\n const runStart = currentOffset;\n const runEnd = currentOffset + text.length;\n\n // Check if run overlaps with range\n if (runEnd > startOffset && runStart < endOffset) {\n if (item.formatting) {\n result.push({ ...item.formatting });\n }\n }\n\n currentOffset = runEnd;\n } else if (item.type === 'hyperlink') {\n const text = getHyperlinkText(item);\n const linkStart = currentOffset;\n const linkEnd = currentOffset + text.length;\n\n if (linkEnd > startOffset && linkStart < endOffset) {\n for (const child of item.children) {\n if (child.type === 'run' && child.formatting) {\n result.push({ ...child.formatting });\n }\n }\n }\n\n currentOffset = linkEnd;\n }\n }\n}\n\n/**\n * Check if position is in a table\n */\nfunction isPositionInTable(_body: DocumentBody, _position: Position): boolean {\n // Tables are block-level, so position in a table would be in cell paragraphs\n // For now, return false - full implementation would track paragraph sources\n return false;\n}\n\n/**\n * Check if position is in a hyperlink\n */\nfunction isPositionInHyperlink(paragraph: Paragraph, offset: number): boolean {\n let currentOffset = 0;\n\n for (const item of paragraph.content) {\n if (item.type === 'run') {\n const text = getRunText(item);\n currentOffset += text.length;\n } else if (item.type === 'hyperlink') {\n const text = getHyperlinkText(item);\n const linkStart = currentOffset;\n const linkEnd = currentOffset + text.length;\n\n if (offset >= linkStart && offset < linkEnd) {\n return true;\n }\n\n currentOffset = linkEnd;\n }\n }\n\n return false;\n}\n\n/**\n * Get suggested actions based on selection\n */\nfunction getSuggestedActions(\n selectedText: string,\n _formatting: Partial<TextFormatting>,\n _paragraphContext: ParagraphContext\n): SuggestedAction[] {\n const actions: SuggestedAction[] = [];\n\n if (!selectedText || selectedText.trim().length === 0) {\n return actions;\n }\n\n // Basic actions for any text\n actions.push(\n { id: 'askAI', label: 'Ask AI', description: 'Ask AI about this text', priority: 11 },\n { id: 'rewrite', label: 'Rewrite', description: 'Rewrite this text differently', priority: 10 }\n );\n\n // Length-based suggestions\n const wordCount = countWords(selectedText);\n\n if (wordCount > 50) {\n actions.push({\n id: 'summarize',\n label: 'Summarize',\n description: 'Create a shorter version',\n priority: 9,\n });\n }\n\n if (wordCount < 20) {\n actions.push({\n id: 'expand',\n label: 'Expand',\n description: 'Add more details',\n priority: 9,\n });\n }\n\n // Always useful\n actions.push(\n {\n id: 'fixGrammar',\n label: 'Fix Grammar',\n description: 'Fix grammar and spelling',\n priority: 7,\n },\n {\n id: 'translate',\n label: 'Translate',\n description: 'Translate to another language',\n priority: 6,\n },\n { id: 'explain', label: 'Explain', description: 'Explain what this means', priority: 5 }\n );\n\n // Tone adjustments\n actions.push(\n { id: 'makeFormal', label: 'Make Formal', description: 'Use formal tone', priority: 4 },\n { id: 'makeCasual', label: 'Make Casual', description: 'Use casual tone', priority: 3 }\n );\n\n // Sort by priority\n actions.sort((a, b) => (b.priority || 0) - (a.priority || 0));\n\n return actions;\n}\n\n/**\n * Detect content type of selection\n */\nfunction detectContentType(\n paragraphs: Paragraph[],\n range: Range\n): 'prose' | 'list' | 'heading' | 'table' | 'mixed' {\n const types = new Set<string>();\n\n for (let i = range.start.paragraphIndex; i <= range.end.paragraphIndex; i++) {\n const para = paragraphs[i];\n if (!para) continue;\n\n if (para.listRendering) {\n types.add('list');\n } else if (para.formatting?.styleId?.toLowerCase().includes('heading')) {\n types.add('heading');\n } else {\n types.add('prose');\n }\n }\n\n if (types.size > 1) return 'mixed';\n if (types.has('list')) return 'list';\n if (types.has('heading')) return 'heading';\n return 'prose';\n}\n\n/**\n * Simple language detection\n */\nfunction detectLanguage(text: string): string | undefined {\n // Very simple heuristic - in practice use a library\n if (/[а-яА-ЯёЁ]/.test(text)) return 'ru';\n if (/[一-龯]/.test(text)) return 'zh';\n if (/[ひらがなカタカナ]/.test(text) || /[\\u3040-\\u309F\\u30A0-\\u30FF]/.test(text)) return 'ja';\n if (/[가-힣]/.test(text)) return 'ko';\n if (/[àâäéèêëïîôùûüç]/i.test(text)) return 'fr';\n if (/[äöüß]/i.test(text)) return 'de';\n if (/[áéíóúñ]/i.test(text)) return 'es';\n return 'en'; // Default\n}\n\n/**\n * Get plain text from paragraph\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\n/**\n * Get plain text from run\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\n/**\n * Get plain text from hyperlink\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 * Count words in text\n */\nfunction countWords(text: string): number {\n return text.split(/\\s+/).filter((w) => w.length > 0).length;\n}\n\n/**\n * Check if two formatting objects are equal\n */\nfunction formatEqual(a: Partial<TextFormatting>, b: Partial<TextFormatting>): boolean {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false;\n\n return keysA.every((key) => {\n const valA = (a as Record<string, unknown>)[key];\n const valB = (b as Record<string, unknown>)[key];\n return valA === valB;\n });\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport {\n buildSelectionContext as default,\n extractSelectedText,\n getTextBefore,\n getTextAfter,\n getFormattingAtPosition,\n getSuggestedActions,\n detectContentType,\n detectLanguage,\n countWords,\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../core/src/types/agentApi.ts"],"names":["createCollapsedRange","position","createRange","start","end","isPositionInRange","range","comparePositions","a","b","getActionLabel","action","getActionDescription","DEFAULT_AI_ACTIONS","createCommand","command","generateCommandId"],"mappings":"AA4CO,SAASA,CAAAA,CAAqBC,EAA2B,CAC9D,OAAO,CACL,KAAA,CAAOA,CAAAA,CACP,IAAKA,CAAAA,CACL,SAAA,CAAW,IACb,CACF,CAKO,SAASC,CAAAA,CAAYC,CAAAA,CAAiBC,EAAsB,CACjE,OAAO,CACL,KAAA,CAAAD,CAAAA,CACA,GAAA,CAAAC,EACA,SAAA,CAAWD,CAAAA,CAAM,iBAAmBC,CAAAA,CAAI,cAAA,EAAkBD,EAAM,MAAA,GAAWC,CAAAA,CAAI,MACjF,CACF,CAKO,SAASC,EAAkBJ,CAAAA,CAAoBK,CAAAA,CAAuB,CAU3E,OAPE,EAAAL,EAAS,cAAA,CAAiBK,CAAAA,CAAM,KAAA,CAAM,cAAA,EACrCL,CAAAA,CAAS,cAAA,GAAmBK,EAAM,KAAA,CAAM,cAAA,EAAkBL,EAAS,MAAA,CAASK,CAAAA,CAAM,MAAM,MAAA,EAOzFL,CAAAA,CAAS,cAAA,CAAiBK,CAAAA,CAAM,GAAA,CAAI,cAAA,EACnCL,EAAS,cAAA,GAAmBK,CAAAA,CAAM,IAAI,cAAA,EAAkBL,CAAAA,CAAS,OAASK,CAAAA,CAAM,GAAA,CAAI,MAAA,CAMzF,CAMO,SAASC,CAAAA,CAAiBC,EAAaC,CAAAA,CAAyB,CACrE,OAAID,CAAAA,CAAE,cAAA,CAAiBC,EAAE,cAAA,CAAuB,EAAA,CAC5CD,CAAAA,CAAE,cAAA,CAAiBC,CAAAA,CAAE,cAAA,CAAuB,EAC5CD,CAAAA,CAAE,MAAA,CAASC,EAAE,MAAA,CAAe,EAAA,CAC5BD,EAAE,MAAA,CAASC,CAAAA,CAAE,MAAA,CAAe,CAAA,CACzB,CACT,CA0bO,SAASC,CAAAA,CAAeC,CAAAA,CAA0B,CAavD,OAZyC,CACvC,MAAO,QAAA,CACP,OAAA,CAAS,SAAA,CACT,MAAA,CAAQ,QAAA,CACR,SAAA,CAAW,YACX,SAAA,CAAW,WAAA,CACX,QAAS,SAAA,CACT,UAAA,CAAY,cACZ,UAAA,CAAY,aAAA,CACZ,UAAA,CAAY,aAAA,CACZ,MAAA,CAAQ,eACV,EACcA,CAAM,CACtB,CAKO,SAASC,CAAAA,CAAqBD,EAA0B,CAa7D,OAZ+C,CAC7C,KAAA,CAAO,mCAAA,CACP,OAAA,CAAS,uCACT,MAAA,CAAQ,oCAAA,CACR,UAAW,mCAAA,CACX,SAAA,CAAW,0CACX,OAAA,CAAS,8BAAA,CACT,UAAA,CAAY,iCAAA,CACZ,UAAA,CAAY,2BAAA,CACZ,WAAY,2BAAA,CACZ,MAAA,CAAQ,uBACV,CAAA,CACoBA,CAAM,CAC5B,CAKO,IAAME,CAAAA,CAAiC,CAC5C,OAAA,CACA,SAAA,CACA,SACA,WAAA,CACA,WAAA,CACA,SACF,EAqBO,SAASC,EAAsCC,CAAAA,CAA2B,CAC/E,OAAO,CACL,GAAGA,CAAAA,CACH,GAAIC,CAAAA,EACN,CACF,CAKA,SAASA,GAA4B,CACnC,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,MAAA,CAAO,CAAA,CAAG,CAAC,CAAC,CAAA,CACrE","file":"chunk-7JSPKVOW.js","sourcesContent":["/**\n * Agent API Types\n *\n * TypeScript interfaces for the agent API:\n * - Position and Range types\n * - Command types for document manipulation\n * - Context types for AI agents\n */\n\nimport type { TextFormatting, ParagraphFormatting } from './document';\n\n// ============================================================================\n// POSITION & RANGE\n// ============================================================================\n\n/**\n * Position within a document\n */\nexport interface Position {\n /** Index of the paragraph (0-indexed) */\n paragraphIndex: number;\n /** Offset within the paragraph in characters */\n offset: number;\n /** Optional: Content index within paragraph (run, hyperlink, etc.) */\n contentIndex?: number;\n /** Optional: Section index */\n sectionIndex?: number;\n}\n\n/**\n * Range within a document\n */\nexport interface Range {\n /** Start position */\n start: Position;\n /** End position */\n end: Position;\n /** Whether the range is collapsed (cursor position) */\n collapsed?: boolean;\n}\n\n/**\n * Create a collapsed range (cursor) at a position\n */\nexport function createCollapsedRange(position: Position): Range {\n return {\n start: position,\n end: position,\n collapsed: true,\n };\n}\n\n/**\n * Create a range from two positions\n */\nexport function createRange(start: Position, end: Position): Range {\n return {\n start,\n end,\n collapsed: start.paragraphIndex === end.paragraphIndex && start.offset === end.offset,\n };\n}\n\n/**\n * Check if a position is within a range\n */\nexport function isPositionInRange(position: Position, range: Range): boolean {\n // Before range start\n if (\n position.paragraphIndex < range.start.paragraphIndex ||\n (position.paragraphIndex === range.start.paragraphIndex && position.offset < range.start.offset)\n ) {\n return false;\n }\n\n // After range end\n if (\n position.paragraphIndex > range.end.paragraphIndex ||\n (position.paragraphIndex === range.end.paragraphIndex && position.offset > range.end.offset)\n ) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Compare two positions\n * Returns: -1 if a < b, 0 if equal, 1 if a > b\n */\nexport function comparePositions(a: Position, b: Position): -1 | 0 | 1 {\n if (a.paragraphIndex < b.paragraphIndex) return -1;\n if (a.paragraphIndex > b.paragraphIndex) return 1;\n if (a.offset < b.offset) return -1;\n if (a.offset > b.offset) return 1;\n return 0;\n}\n\n// ============================================================================\n// COMMANDS\n// ============================================================================\n\n/**\n * Base command interface\n */\nexport interface BaseCommand {\n /** Command type */\n type: string;\n /** Unique command ID (for undo tracking) */\n id?: string;\n}\n\n/**\n * Insert text at a position\n */\nexport interface InsertTextCommand extends BaseCommand {\n type: 'insertText';\n /** Position to insert at */\n position: Position;\n /** Text to insert */\n text: string;\n /** Optional formatting for the inserted text */\n formatting?: TextFormatting;\n}\n\n/**\n * Replace text in a range\n */\nexport interface ReplaceTextCommand extends BaseCommand {\n type: 'replaceText';\n /** Range to replace */\n range: Range;\n /** Replacement text */\n text: string;\n /** Optional formatting for the new text */\n formatting?: TextFormatting;\n}\n\n/**\n * Delete text in a range\n */\nexport interface DeleteTextCommand extends BaseCommand {\n type: 'deleteText';\n /** Range to delete */\n range: Range;\n}\n\n/**\n * Apply formatting to a range\n */\nexport interface FormatTextCommand extends BaseCommand {\n type: 'formatText';\n /** Range to format */\n range: Range;\n /** Formatting to apply */\n formatting: Partial<TextFormatting>;\n}\n\n/**\n * Apply paragraph formatting\n */\nexport interface FormatParagraphCommand extends BaseCommand {\n type: 'formatParagraph';\n /** Paragraph index */\n paragraphIndex: number;\n /** Formatting to apply */\n formatting: Partial<ParagraphFormatting>;\n}\n\n/**\n * Apply a named style to a paragraph\n */\nexport interface ApplyStyleCommand extends BaseCommand {\n type: 'applyStyle';\n /** Paragraph index */\n paragraphIndex: number;\n /** Style ID to apply */\n styleId: string;\n}\n\n/**\n * Insert a table at a position\n */\nexport interface InsertTableCommand extends BaseCommand {\n type: 'insertTable';\n /** Position to insert at */\n position: Position;\n /** Number of rows */\n rows: number;\n /** Number of columns */\n columns: number;\n /** Optional table data */\n data?: string[][];\n /** Optional header row */\n hasHeader?: boolean;\n}\n\n/**\n * Insert an image at a position\n */\nexport interface InsertImageCommand extends BaseCommand {\n type: 'insertImage';\n /** Position to insert at */\n position: Position;\n /** Image source (base64 or URL) */\n src: string;\n /** Image width in pixels */\n width?: number;\n /** Image height in pixels */\n height?: number;\n /** Alt text */\n alt?: string;\n}\n\n/**\n * Insert a hyperlink at a range\n */\nexport interface InsertHyperlinkCommand extends BaseCommand {\n type: 'insertHyperlink';\n /** Range to make into a hyperlink */\n range: Range;\n /** URL of the hyperlink */\n url: string;\n /** Display text (replaces range text if provided) */\n displayText?: string;\n /** Tooltip */\n tooltip?: string;\n}\n\n/**\n * Remove a hyperlink but keep the text\n */\nexport interface RemoveHyperlinkCommand extends BaseCommand {\n type: 'removeHyperlink';\n /** Range containing the hyperlink */\n range: Range;\n}\n\n/**\n * Insert a paragraph break\n */\nexport interface InsertParagraphBreakCommand extends BaseCommand {\n type: 'insertParagraphBreak';\n /** Position to break at */\n position: Position;\n}\n\n/**\n * Merge paragraphs\n */\nexport interface MergeParagraphsCommand extends BaseCommand {\n type: 'mergeParagraphs';\n /** First paragraph index */\n paragraphIndex: number;\n /** Number of paragraphs to merge with */\n count: number;\n}\n\n/**\n * Split a paragraph\n */\nexport interface SplitParagraphCommand extends BaseCommand {\n type: 'splitParagraph';\n /** Position to split at */\n position: Position;\n}\n\n/**\n * Set template variable value\n */\nexport interface SetVariableCommand extends BaseCommand {\n type: 'setVariable';\n /** Variable name */\n name: string;\n /** Variable value */\n value: string;\n}\n\n/**\n * Apply all template variables\n */\nexport interface ApplyVariablesCommand extends BaseCommand {\n type: 'applyVariables';\n /** Variable values */\n values: Record<string, string>;\n}\n\n/**\n * Union of all command types\n */\nexport type AgentCommand =\n | InsertTextCommand\n | ReplaceTextCommand\n | DeleteTextCommand\n | FormatTextCommand\n | FormatParagraphCommand\n | ApplyStyleCommand\n | InsertTableCommand\n | InsertImageCommand\n | InsertHyperlinkCommand\n | RemoveHyperlinkCommand\n | InsertParagraphBreakCommand\n | MergeParagraphsCommand\n | SplitParagraphCommand\n | SetVariableCommand\n | ApplyVariablesCommand;\n\n/**\n * Get command type\n */\nexport type CommandType = AgentCommand['type'];\n\n// ============================================================================\n// CONTEXT\n// ============================================================================\n\n/**\n * Document context for AI agents\n */\nexport interface AgentContext {\n /** Total paragraph count */\n paragraphCount: number;\n /** Total word count (approximate) */\n wordCount: number;\n /** Total character count */\n characterCount: number;\n /** Detected template variables */\n variables: string[];\n /** Variable count */\n variableCount: number;\n /** Available styles */\n availableStyles: StyleInfo[];\n /** Content outline (first N chars per paragraph) */\n outline: ParagraphOutline[];\n /** Document sections info */\n sections: SectionInfo[];\n /** Has tables */\n hasTables: boolean;\n /** Has images */\n hasImages: boolean;\n /** Has hyperlinks */\n hasHyperlinks: boolean;\n /** Document language */\n language?: string;\n}\n\n/**\n * Style information for context\n */\nexport interface StyleInfo {\n /** Style ID */\n id: string;\n /** Display name */\n name: string;\n /** Style type */\n type: 'paragraph' | 'character' | 'table';\n /** Is built-in style */\n builtIn?: boolean;\n}\n\n/**\n * Paragraph outline for context\n */\nexport interface ParagraphOutline {\n /** Paragraph index */\n index: number;\n /** First N characters */\n preview: string;\n /** Paragraph style */\n style?: string;\n /** Is heading */\n isHeading?: boolean;\n /** Heading level (1-9) */\n headingLevel?: number;\n /** Is list item */\n isListItem?: boolean;\n /** Is empty paragraph */\n isEmpty?: boolean;\n}\n\n/**\n * Section information\n */\nexport interface SectionInfo {\n /** Section index */\n index: number;\n /** Number of paragraphs */\n paragraphCount: number;\n /** Page size */\n pageSize?: { width: number; height: number };\n /** Is landscape */\n isLandscape?: boolean;\n /** Has header */\n hasHeader?: boolean;\n /** Has footer */\n hasFooter?: boolean;\n}\n\n// ============================================================================\n// SELECTION CONTEXT\n// ============================================================================\n\n/**\n * Context about the current selection\n */\nexport interface SelectionContext {\n /** Selected text */\n selectedText: string;\n /** Selection range */\n range: Range;\n /** Current formatting of selection */\n formatting: Partial<TextFormatting>;\n /** Current paragraph formatting */\n paragraphFormatting: Partial<ParagraphFormatting>;\n /** Text before selection (context) */\n textBefore: string;\n /** Text after selection (context) */\n textAfter: string;\n /** Paragraph containing selection */\n paragraph: ParagraphContext;\n /** Is selection within a table */\n inTable?: boolean;\n /** Is selection within a hyperlink */\n inHyperlink?: boolean;\n /** Suggested actions based on selection */\n suggestedActions?: SuggestedAction[];\n}\n\n/**\n * Paragraph context for selection\n */\nexport interface ParagraphContext {\n /** Paragraph index */\n index: number;\n /** Full paragraph text */\n fullText: string;\n /** Paragraph style */\n style?: string;\n /** Word count */\n wordCount: number;\n}\n\n/**\n * Suggested action for context menu\n */\nexport interface SuggestedAction {\n /** Action ID */\n id: string;\n /** Display label */\n label: string;\n /** Description */\n description?: string;\n /** Icon name */\n icon?: string;\n /** Priority (higher = more prominent) */\n priority?: number;\n}\n\n// ============================================================================\n// RESPONSE\n// ============================================================================\n\n/**\n * Response from an agent action\n */\nexport interface AgentResponse {\n /** Success status */\n success: boolean;\n /** New text to insert (for rewrite/expand/etc.) */\n newText?: string;\n /** New formatted content */\n newContent?: AgentContent[];\n /** Commands to execute */\n commands?: AgentCommand[];\n /** Error message if failed */\n error?: string;\n /** Warning messages */\n warnings?: string[];\n /** Metadata about the response */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Content block in agent response\n */\nexport interface AgentContent {\n /** Content type */\n type: 'text' | 'paragraph' | 'table' | 'image';\n /** Text content */\n text?: string;\n /** Formatting */\n formatting?: Partial<TextFormatting>;\n /** Paragraph formatting */\n paragraphFormatting?: Partial<ParagraphFormatting>;\n /** Table data (for table type) */\n tableData?: string[][];\n /** Image src (for image type) */\n imageSrc?: string;\n}\n\n// ============================================================================\n// AI ACTIONS\n// ============================================================================\n\n/**\n * AI action types for context menu\n */\nexport type AIAction =\n | 'askAI'\n | 'rewrite'\n | 'expand'\n | 'summarize'\n | 'translate'\n | 'explain'\n | 'fixGrammar'\n | 'makeFormal'\n | 'makeCasual'\n | 'custom';\n\n/**\n * AI action request\n */\nexport interface AIActionRequest {\n /** Action type */\n action: AIAction;\n /** Selection context */\n context: SelectionContext;\n /** Custom prompt (for 'custom' action) */\n customPrompt?: string;\n /** Target language (for 'translate' action) */\n targetLanguage?: string;\n /** Additional options */\n options?: Record<string, unknown>;\n}\n\n/**\n * Get action label\n */\nexport function getActionLabel(action: AIAction): string {\n const labels: Record<AIAction, string> = {\n askAI: 'Ask AI',\n rewrite: 'Rewrite',\n expand: 'Expand',\n summarize: 'Summarize',\n translate: 'Translate',\n explain: 'Explain',\n fixGrammar: 'Fix Grammar',\n makeFormal: 'Make Formal',\n makeCasual: 'Make Casual',\n custom: 'Custom Prompt',\n };\n return labels[action];\n}\n\n/**\n * Get action description\n */\nexport function getActionDescription(action: AIAction): string {\n const descriptions: Record<AIAction, string> = {\n askAI: 'Ask AI a question about this text',\n rewrite: 'Rewrite this text in a different way',\n expand: 'Expand this text with more details',\n summarize: 'Summarize this text to be shorter',\n translate: 'Translate this text to another language',\n explain: 'Explain what this text means',\n fixGrammar: 'Fix grammar and spelling errors',\n makeFormal: 'Make the tone more formal',\n makeCasual: 'Make the tone more casual',\n custom: 'Enter a custom prompt',\n };\n return descriptions[action];\n}\n\n/**\n * Default AI actions for context menu\n */\nexport const DEFAULT_AI_ACTIONS: AIAction[] = [\n 'askAI',\n 'rewrite',\n 'expand',\n 'summarize',\n 'translate',\n 'explain',\n];\n\n// ============================================================================\n// UTILITY TYPES\n// ============================================================================\n\n/**\n * Command handler function type\n */\nexport type CommandHandler<T extends AgentCommand = AgentCommand> = (\n command: T\n) => Promise<boolean>;\n\n/**\n * AI request handler function type\n */\nexport type AIRequestHandler = (request: AIActionRequest) => Promise<AgentResponse>;\n\n/**\n * Create a command with generated ID\n */\nexport function createCommand<T extends AgentCommand>(command: Omit<T, 'id'>): T {\n return {\n ...command,\n id: generateCommandId(),\n } as T;\n}\n\n/**\n * Generate a unique command ID\n */\nfunction generateCommandId(): string {\n return `cmd_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n}\n\nexport default {\n createCollapsedRange,\n createRange,\n isPositionInRange,\n comparePositions,\n getActionLabel,\n getActionDescription,\n createCommand,\n DEFAULT_AI_ACTIONS,\n};\n"]}