@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 +0,0 @@
1
- {"version":3,"sources":["../../core/src/core-plugins/registry.ts"],"names":["PluginRegistry","__publicField","plugin","options","warnings","depId","commandType","handler","existing","result","err","pluginId","id","p","pid","tools","toolName","tool","t","listener","event","pluginRegistry","registerPlugins","plugins","createPluginRegistrar"],"mappings":"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","file":"chunk-WD2HTKRR.cjs","sourcesContent":["/**\n * Plugin Registry\n *\n * Central registry for core plugins. Manages plugin lifecycle,\n * collects command handlers from all plugins, and aggregates\n * MCP tool definitions for the MCP server.\n */\n\nimport type {\n CorePlugin,\n CommandHandler,\n McpToolDefinition,\n PluginEvent,\n PluginEventListener,\n PluginRegistrationResult,\n PluginOptions,\n} from './types';\n\n// ============================================================================\n// PLUGIN REGISTRY\n// ============================================================================\n\n/**\n * Plugin Registry - manages core plugins\n *\n * @example\n * ```ts\n * import { pluginRegistry, docxtemplaterPlugin } from '@eigenpal/docx-editor/core-plugins';\n *\n * // Register plugins\n * pluginRegistry.register(docxtemplaterPlugin);\n *\n * // Get all MCP tools for MCP server\n * const tools = pluginRegistry.getMcpTools();\n *\n * // Get command handler for executor\n * const handler = pluginRegistry.getCommandHandler('insertTemplateVariable');\n * ```\n */\nexport class PluginRegistry {\n private plugins: Map<string, CorePlugin> = new Map();\n private commandHandlers: Map<string, { pluginId: string; handler: CommandHandler }> = new Map();\n private eventListeners: Set<PluginEventListener> = new Set();\n private initialized: Set<string> = new Set();\n\n // ==========================================================================\n // REGISTRATION\n // ==========================================================================\n\n /**\n * Register a plugin\n *\n * @param plugin - The plugin to register\n * @param options - Optional configuration\n * @returns Registration result\n */\n register(plugin: CorePlugin, options?: PluginOptions): PluginRegistrationResult {\n const warnings: string[] = [];\n\n // Validate plugin\n if (!plugin.id) {\n return { success: false, error: 'Plugin must have an id' };\n }\n\n if (this.plugins.has(plugin.id)) {\n return { success: false, error: `Plugin '${plugin.id}' is already registered` };\n }\n\n // Check dependencies\n if (plugin.dependencies) {\n for (const depId of plugin.dependencies) {\n if (!this.plugins.has(depId)) {\n return {\n success: false,\n error: `Plugin '${plugin.id}' requires '${depId}' which is not registered`,\n };\n }\n }\n }\n\n // Register command handlers\n if (plugin.commandHandlers) {\n for (const [commandType, handler] of Object.entries(plugin.commandHandlers)) {\n if (this.commandHandlers.has(commandType)) {\n const existing = this.commandHandlers.get(commandType)!;\n warnings.push(\n `Command '${commandType}' from '${plugin.id}' overrides handler from '${existing.pluginId}'`\n );\n }\n this.commandHandlers.set(commandType, { pluginId: plugin.id, handler });\n }\n }\n\n // Store plugin\n this.plugins.set(plugin.id, plugin);\n\n // Initialize if needed\n if (plugin.initialize && !this.initialized.has(plugin.id)) {\n try {\n const result = plugin.initialize();\n if (result instanceof Promise) {\n // Handle async initialization\n result\n .then(() => {\n this.initialized.add(plugin.id);\n })\n .catch((err) => {\n this.emit({ type: 'error', pluginId: plugin.id, error: err as Error });\n });\n } else {\n this.initialized.add(plugin.id);\n }\n } catch (err) {\n this.emit({ type: 'error', pluginId: plugin.id, error: err as Error });\n }\n }\n\n // Log if debug enabled\n if (options?.debug) {\n console.log(`[PluginRegistry] Registered plugin: ${plugin.id}`);\n }\n\n // Emit event\n this.emit({ type: 'registered', plugin });\n\n return {\n success: true,\n plugin,\n warnings: warnings.length > 0 ? warnings : undefined,\n };\n }\n\n /**\n * Unregister a plugin\n *\n * @param pluginId - ID of the plugin to unregister\n * @returns Whether unregistration succeeded\n */\n unregister(pluginId: string): boolean {\n const plugin = this.plugins.get(pluginId);\n if (!plugin) {\n return false;\n }\n\n // Check if other plugins depend on this one\n for (const [id, p] of this.plugins) {\n if (p.dependencies?.includes(pluginId)) {\n console.warn(`Cannot unregister '${pluginId}': '${id}' depends on it`);\n return false;\n }\n }\n\n // Remove command handlers\n for (const [commandType, { pluginId: pid }] of this.commandHandlers) {\n if (pid === pluginId) {\n this.commandHandlers.delete(commandType);\n }\n }\n\n // Call destroy if available\n if (plugin.destroy) {\n try {\n const result = plugin.destroy();\n if (result instanceof Promise) {\n result.catch((err) => {\n this.emit({ type: 'error', pluginId, error: err as Error });\n });\n }\n } catch (err) {\n this.emit({ type: 'error', pluginId, error: err as Error });\n }\n }\n\n // Remove plugin\n this.plugins.delete(pluginId);\n this.initialized.delete(pluginId);\n\n // Emit event\n this.emit({ type: 'unregistered', pluginId });\n\n return true;\n }\n\n // ==========================================================================\n // QUERIES\n // ==========================================================================\n\n /**\n * Get a registered plugin by ID\n *\n * @param id - Plugin ID\n * @returns The plugin or undefined\n */\n get(id: string): CorePlugin | undefined {\n return this.plugins.get(id);\n }\n\n /**\n * Get all registered plugins\n *\n * @returns Array of all plugins\n */\n getAll(): CorePlugin[] {\n return Array.from(this.plugins.values());\n }\n\n /**\n * Check if a plugin is registered\n *\n * @param id - Plugin ID\n * @returns Whether the plugin is registered\n */\n has(id: string): boolean {\n return this.plugins.has(id);\n }\n\n /**\n * Get number of registered plugins\n */\n get size(): number {\n return this.plugins.size;\n }\n\n // ==========================================================================\n // COMMAND HANDLERS\n // ==========================================================================\n\n /**\n * Get a command handler for a command type\n *\n * @param commandType - The command type\n * @returns The handler or undefined\n */\n getCommandHandler(commandType: string): CommandHandler | undefined {\n const entry = this.commandHandlers.get(commandType);\n return entry?.handler;\n }\n\n /**\n * Get all registered command types\n *\n * @returns Array of command type strings\n */\n getCommandTypes(): string[] {\n return Array.from(this.commandHandlers.keys());\n }\n\n /**\n * Check if a command type has a handler\n *\n * @param commandType - The command type\n * @returns Whether a handler exists\n */\n hasCommandHandler(commandType: string): boolean {\n return this.commandHandlers.has(commandType);\n }\n\n // ==========================================================================\n // MCP TOOLS\n // ==========================================================================\n\n /**\n * Get all MCP tools from all registered plugins\n *\n * @returns Array of MCP tool definitions\n */\n getMcpTools(): McpToolDefinition[] {\n const tools: McpToolDefinition[] = [];\n\n for (const plugin of this.plugins.values()) {\n if (plugin.mcpTools) {\n tools.push(...plugin.mcpTools);\n }\n }\n\n return tools;\n }\n\n /**\n * Get MCP tools from a specific plugin\n *\n * @param pluginId - Plugin ID\n * @returns Array of MCP tool definitions\n */\n getMcpToolsForPlugin(pluginId: string): McpToolDefinition[] {\n const plugin = this.plugins.get(pluginId);\n return plugin?.mcpTools || [];\n }\n\n /**\n * Get an MCP tool by name\n *\n * @param toolName - Tool name\n * @returns The tool definition or undefined\n */\n getMcpTool(toolName: string): McpToolDefinition | undefined {\n for (const plugin of this.plugins.values()) {\n if (plugin.mcpTools) {\n const tool = plugin.mcpTools.find((t) => t.name === toolName);\n if (tool) return tool;\n }\n }\n return undefined;\n }\n\n // ==========================================================================\n // EVENTS\n // ==========================================================================\n\n /**\n * Add an event listener\n *\n * @param listener - Event listener function\n */\n addEventListener(listener: PluginEventListener): void {\n this.eventListeners.add(listener);\n }\n\n /**\n * Remove an event listener\n *\n * @param listener - Event listener function\n */\n removeEventListener(listener: PluginEventListener): void {\n this.eventListeners.delete(listener);\n }\n\n /**\n * Emit an event to all listeners\n */\n private emit(event: PluginEvent): void {\n for (const listener of this.eventListeners) {\n try {\n listener(event);\n } catch (err) {\n console.error('[PluginRegistry] Event listener error:', err);\n }\n }\n }\n\n // ==========================================================================\n // UTILITIES\n // ==========================================================================\n\n /**\n * Clear all registered plugins\n *\n * Useful for testing or resetting state.\n */\n clear(): void {\n // Call destroy on all plugins\n for (const plugin of this.plugins.values()) {\n if (plugin.destroy) {\n try {\n plugin.destroy();\n } catch {\n // Ignore errors during clear\n }\n }\n }\n\n this.plugins.clear();\n this.commandHandlers.clear();\n this.initialized.clear();\n }\n\n /**\n * Get registry state for debugging\n */\n getDebugInfo(): {\n plugins: string[];\n commandTypes: string[];\n mcpTools: string[];\n initialized: string[];\n } {\n return {\n plugins: Array.from(this.plugins.keys()),\n commandTypes: Array.from(this.commandHandlers.keys()),\n mcpTools: this.getMcpTools().map((t) => t.name),\n initialized: Array.from(this.initialized),\n };\n }\n}\n\n// ============================================================================\n// GLOBAL INSTANCE\n// ============================================================================\n\n/**\n * Global plugin registry instance\n *\n * Use this for registering plugins and accessing their capabilities.\n */\nexport const pluginRegistry = new PluginRegistry();\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Register multiple plugins at once\n *\n * @param plugins - Array of plugins to register\n * @returns Array of registration results\n */\nexport function registerPlugins(\n plugins: CorePlugin[],\n options?: PluginOptions\n): PluginRegistrationResult[] {\n return plugins.map((plugin) => pluginRegistry.register(plugin, options));\n}\n\n/**\n * Create a plugin registration helper with options pre-configured\n *\n * @param options - Default options for plugin registration\n * @returns Registration function\n */\nexport function createPluginRegistrar(options: PluginOptions) {\n return (plugin: CorePlugin) => pluginRegistry.register(plugin, options);\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../core/src/utils/variableDetector.ts","../../core/src/core-plugins/types.ts","../../core/src/core-plugins/docxtemplater/handlers.ts","../../core/src/core-plugins/docxtemplater/mcp-tools.ts","../../core/src/core-plugins/docxtemplater/index.ts"],"names":["detectVariables","doc","detectVariablesDetailed","occurrences","byLocation","bodyVars","detectVariablesInBody","v","section","_sectionIndex","_headerRef","footnoteVars","detectVariablesInNotes","endnoteVars","allVariables","o","body","variables","detectVariablesInBlockContent","content","block","detectVariablesInParagraph","detectVariablesInTable","paragraph","item","detectVariablesInRun","detectVariablesInHyperlink","detectVariablesInSimpleField","detectVariablesInComplexField","run","extractVariablesFromText","hyperlink","child","field","table","row","cell","detectVariablesInCell","notes","note","VARIABLE_PATTERN","VARIABLE_PATTERN_RELAXED","text","pattern","match","hasTemplateVariables","isValidVariableName","name","sanitizeVariableName","sanitized","formatVariable","parseVariable","variable","replaceVariables","values","varName","removeVariables","placeholder","documentHasVariables","isZodSchema","schema","handleInsertTemplateVariable","command","cmd","position","variableName","newDoc","paragraphs","variableText","insertTextAtOffset","handleReplaceWithTemplateVariable","range","deleteTextInRange","offset","currentOffset","inserted","i","runText","getRunText","runStart","runEnd","insertPos","beforeText","afterText","newContent","j","startOffset","endOffset","newText","c","documentIdSchema","positionSchema","getVariablesTool","input","context","documentId","loaded","result","error","insertVariableTool","executeCommand","applyTemplateTool","keepUnmatchedVariables","processTemplateDetailed","parseDocx","validateTemplateTool","validateTemplate","e","docxtemplaterMcpTools","docxtemplaterPlugin"],"mappings":"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","file":"chunk-XZNOV52K.cjs","sourcesContent":["/**\n * Variable Detector Utility\n *\n * Scans a DOCX document for template variables in the format {variable_name}\n * (standard docxtemplater syntax).\n * Returns a unique, sorted list of variable names found in the document.\n */\n\nimport type {\n Document,\n DocumentBody,\n Paragraph,\n Table,\n TableCell,\n Run,\n Hyperlink,\n SimpleField,\n ComplexField,\n BlockContent,\n HeaderFooter,\n Footnote,\n Endnote,\n TextBox,\n} from '../types/document';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Result of variable detection\n */\nexport interface VariableDetectionResult {\n /** Unique variable names sorted alphabetically */\n variables: string[];\n /** Total count of variable occurrences */\n totalOccurrences: number;\n /** Variables by location */\n byLocation: {\n body: string[];\n headers: string[];\n footers: string[];\n footnotes: string[];\n endnotes: string[];\n textBoxes: string[];\n };\n /** Variable occurrences with positions */\n occurrences: VariableOccurrence[];\n}\n\n/**\n * A single variable occurrence with location info\n */\nexport interface VariableOccurrence {\n /** Variable name (without braces) */\n name: string;\n /** Location type */\n location: 'body' | 'header' | 'footer' | 'footnote' | 'endnote' | 'textBox';\n /** Paragraph index within location */\n paragraphIndex?: number;\n /** Section index (for headers/footers) */\n sectionIndex?: number;\n}\n\n// ============================================================================\n// MAIN FUNCTIONS\n// ============================================================================\n\n/**\n * Detect all template variables in a document\n *\n * @param doc - The parsed document\n * @returns Array of unique variable names sorted alphabetically\n */\nexport function detectVariables(doc: Document): string[] {\n const result = detectVariablesDetailed(doc);\n return result.variables;\n}\n\n/**\n * Detect variables with detailed information\n *\n * @param doc - The parsed document\n * @returns Detailed detection result\n */\nexport function detectVariablesDetailed(doc: Document): VariableDetectionResult {\n const occurrences: VariableOccurrence[] = [];\n const byLocation: VariableDetectionResult['byLocation'] = {\n body: [],\n headers: [],\n footers: [],\n footnotes: [],\n endnotes: [],\n textBoxes: [],\n };\n\n // Scan main body\n if (doc.package?.document) {\n const bodyVars = detectVariablesInBody(doc.package.document);\n bodyVars.forEach((v) => {\n occurrences.push({ name: v, location: 'body' });\n });\n byLocation.body = Array.from(new Set(bodyVars)).sort();\n }\n\n // Scan headers and footers\n if (doc.package?.document?.sections) {\n doc.package.document.sections.forEach((section, _sectionIndex) => {\n // Headers\n if (section.properties.headerReferences) {\n section.properties.headerReferences.forEach((_headerRef) => {\n // If we have actual header content, scan it\n // Note: Headers are stored separately in the package\n });\n }\n });\n }\n\n // Scan footers from package\n // (Actual footer content would be accessed from pkg.headers/pkg.footers if available)\n\n // Scan footnotes\n if (doc.package?.footnotes) {\n const footnoteVars = detectVariablesInNotes(doc.package.footnotes);\n footnoteVars.forEach((v) => {\n occurrences.push({ name: v, location: 'footnote' });\n });\n byLocation.footnotes = Array.from(new Set(footnoteVars)).sort();\n }\n\n // Scan endnotes\n if (doc.package?.endnotes) {\n const endnoteVars = detectVariablesInNotes(doc.package.endnotes);\n endnoteVars.forEach((v) => {\n occurrences.push({ name: v, location: 'endnote' });\n });\n byLocation.endnotes = Array.from(new Set(endnoteVars)).sort();\n }\n\n // Also check templateVariables from document if already detected\n if (doc.templateVariables) {\n doc.templateVariables.forEach((v) => {\n if (!occurrences.some((o) => o.name === v)) {\n occurrences.push({ name: v, location: 'body' });\n }\n });\n }\n\n // Collect all unique variables\n const allVariables = new Set<string>();\n occurrences.forEach((o) => allVariables.add(o.name));\n\n return {\n variables: Array.from(allVariables).sort(),\n totalOccurrences: occurrences.length,\n byLocation,\n occurrences,\n };\n}\n\n/**\n * Detect variables in document body\n */\nexport function detectVariablesInBody(body: DocumentBody): string[] {\n const variables: string[] = [];\n\n // Scan content array\n if (body.content) {\n variables.push(...detectVariablesInBlockContent(body.content));\n }\n\n // Scan sections\n if (body.sections) {\n for (const section of body.sections) {\n if (section.content) {\n variables.push(...detectVariablesInBlockContent(section.content));\n }\n }\n }\n\n return variables;\n}\n\n/**\n * Detect variables in block content (paragraphs and tables)\n */\nexport function detectVariablesInBlockContent(content: BlockContent[]): string[] {\n const variables: string[] = [];\n\n for (const block of content) {\n if (block.type === 'paragraph') {\n variables.push(...detectVariablesInParagraph(block));\n } else if (block.type === 'table') {\n variables.push(...detectVariablesInTable(block));\n }\n }\n\n return variables;\n}\n\n/**\n * Detect variables in a paragraph\n */\nexport function detectVariablesInParagraph(paragraph: Paragraph): string[] {\n const variables: string[] = [];\n\n if (!paragraph.content) return variables;\n\n for (const item of paragraph.content) {\n if (item.type === 'run') {\n variables.push(...detectVariablesInRun(item));\n } else if (item.type === 'hyperlink') {\n variables.push(...detectVariablesInHyperlink(item));\n } else if (item.type === 'simpleField') {\n variables.push(...detectVariablesInSimpleField(item));\n } else if (item.type === 'complexField') {\n variables.push(...detectVariablesInComplexField(item));\n }\n }\n\n return variables;\n}\n\n/**\n * Detect variables in a text run\n */\nexport function detectVariablesInRun(run: Run): string[] {\n const variables: string[] = [];\n\n if (!run.content) return variables;\n\n for (const item of run.content) {\n if (item.type === 'text' && item.text) {\n variables.push(...extractVariablesFromText(item.text));\n }\n }\n\n return variables;\n}\n\n/**\n * Detect variables in a hyperlink\n */\nexport function detectVariablesInHyperlink(hyperlink: Hyperlink): string[] {\n const variables: string[] = [];\n\n if (!hyperlink.children) return variables;\n\n for (const child of hyperlink.children) {\n if (child.type === 'run') {\n variables.push(...detectVariablesInRun(child));\n }\n }\n\n return variables;\n}\n\n/**\n * Detect variables in a simple field\n */\nexport function detectVariablesInSimpleField(field: SimpleField): string[] {\n const variables: string[] = [];\n\n // Check field instruction\n if (field.instruction) {\n variables.push(...extractVariablesFromText(field.instruction));\n }\n\n // Check field content runs\n if (field.content) {\n for (const run of field.content) {\n if (run.type === 'run') {\n variables.push(...detectVariablesInRun(run));\n }\n }\n }\n\n return variables;\n}\n\n/**\n * Detect variables in a complex field\n */\nexport function detectVariablesInComplexField(field: ComplexField): string[] {\n const variables: string[] = [];\n\n // Check field code runs\n if (field.fieldCode) {\n for (const run of field.fieldCode) {\n if (run.type === 'run') {\n variables.push(...detectVariablesInRun(run));\n }\n }\n }\n\n // Check field result runs\n if (field.fieldResult) {\n for (const run of field.fieldResult) {\n if (run.type === 'run') {\n variables.push(...detectVariablesInRun(run));\n }\n }\n }\n\n return variables;\n}\n\n/**\n * Detect variables in a table\n */\nexport function detectVariablesInTable(table: Table): string[] {\n const variables: string[] = [];\n\n if (!table.rows) return variables;\n\n for (const row of table.rows) {\n if (!row.cells) continue;\n\n for (const cell of row.cells) {\n variables.push(...detectVariablesInCell(cell));\n }\n }\n\n return variables;\n}\n\n/**\n * Detect variables in a table cell\n */\nexport function detectVariablesInCell(cell: TableCell): string[] {\n const variables: string[] = [];\n\n if (!cell.content) return variables;\n\n for (const block of cell.content) {\n if (block.type === 'paragraph') {\n variables.push(...detectVariablesInParagraph(block));\n } else if (block.type === 'table') {\n // Nested tables\n variables.push(...detectVariablesInTable(block));\n }\n }\n\n return variables;\n}\n\n/**\n * Detect variables in footnotes/endnotes\n */\nexport function detectVariablesInNotes(notes: (Footnote | Endnote)[]): string[] {\n const variables: string[] = [];\n\n for (const note of notes) {\n if (!note.content) continue;\n\n for (const paragraph of note.content) {\n variables.push(...detectVariablesInParagraph(paragraph));\n }\n }\n\n return variables;\n}\n\n/**\n * Detect variables in headers/footers\n */\nexport function detectVariablesInHeaderFooter(hf: HeaderFooter): string[] {\n const variables: string[] = [];\n\n if (!hf.content) return variables;\n\n for (const block of hf.content) {\n if (block.type === 'paragraph') {\n variables.push(...detectVariablesInParagraph(block));\n } else if (block.type === 'table') {\n variables.push(...detectVariablesInTable(block));\n }\n }\n\n return variables;\n}\n\n/**\n * Detect variables in a text box\n */\nexport function detectVariablesInTextBox(textBox: TextBox): string[] {\n const variables: string[] = [];\n\n if (!textBox.content) return variables;\n\n // TextBox.content is Paragraph[]\n for (const paragraph of textBox.content) {\n variables.push(...detectVariablesInParagraph(paragraph));\n }\n\n return variables;\n}\n\n// ============================================================================\n// TEXT EXTRACTION\n// ============================================================================\n\n/**\n * Regular expression for matching template variables\n * Matches {variable_name} (standard docxtemplater syntax) where variable_name can contain:\n * - Letters (a-z, A-Z)\n * - Numbers (0-9)\n * - Underscores (_)\n * - Hyphens (-)\n * - Dots (.)\n */\nconst VARIABLE_PATTERN = /\\{([a-zA-Z_][a-zA-Z0-9_\\-\\.]*)\\}/g;\n\n/**\n * Alternative pattern allowing any content between braces\n */\nconst VARIABLE_PATTERN_RELAXED = /\\{(.+?)\\}/g;\n\n/**\n * Extract variable names from text\n *\n * @param text - The text to search\n * @returns Array of variable names (without braces)\n */\nexport function extractVariablesFromText(text: string): string[] {\n if (!text) return [];\n\n const variables: string[] = [];\n const pattern = new RegExp(VARIABLE_PATTERN);\n let match: RegExpExecArray | null;\n\n while ((match = pattern.exec(text)) !== null) {\n variables.push(match[1]);\n }\n\n return variables;\n}\n\n/**\n * Extract all variables from text (relaxed matching)\n * Allows any content between { and }\n */\nexport function extractVariablesFromTextRelaxed(text: string): string[] {\n if (!text) return [];\n\n const variables: string[] = [];\n const pattern = new RegExp(VARIABLE_PATTERN_RELAXED);\n let match: RegExpExecArray | null;\n\n while ((match = pattern.exec(text)) !== null) {\n const varName = match[1].trim();\n if (varName) {\n variables.push(varName);\n }\n }\n\n return variables;\n}\n\n/**\n * Check if text contains template variables\n */\nexport function hasTemplateVariables(text: string): boolean {\n return VARIABLE_PATTERN.test(text);\n}\n\n/**\n * Count template variables in text\n */\nexport function countVariables(text: string): number {\n const matches = text.match(VARIABLE_PATTERN);\n return matches ? matches.length : 0;\n}\n\n/**\n * Get unique variable names from text\n */\nexport function getUniqueVariables(text: string): string[] {\n const variables = extractVariablesFromText(text);\n return Array.from(new Set(variables)).sort();\n}\n\n// ============================================================================\n// VALIDATION\n// ============================================================================\n\n/**\n * Check if a variable name is valid\n */\nexport function isValidVariableName(name: string): boolean {\n if (!name || typeof name !== 'string') return false;\n if (name.length === 0 || name.length > 100) return false;\n\n // Must start with letter or underscore\n if (!/^[a-zA-Z_]/.test(name)) return false;\n\n // Can contain letters, numbers, underscores, hyphens, dots\n if (!/^[a-zA-Z_][a-zA-Z0-9_\\-\\.]*$/.test(name)) return false;\n\n return true;\n}\n\n/**\n * Sanitize a variable name\n */\nexport function sanitizeVariableName(name: string): string {\n if (!name) return '';\n\n // Replace spaces with underscores\n let sanitized = name.replace(/\\s+/g, '_');\n\n // Remove invalid characters\n sanitized = sanitized.replace(/[^a-zA-Z0-9_\\-\\.]/g, '');\n\n // Ensure starts with letter or underscore\n if (sanitized && !/^[a-zA-Z_]/.test(sanitized)) {\n sanitized = '_' + sanitized;\n }\n\n // Limit length\n return sanitized.substring(0, 100);\n}\n\n/**\n * Format a variable name with braces (standard docxtemplater syntax)\n */\nexport function formatVariable(name: string): string {\n return `{${name}}`;\n}\n\n/**\n * Parse a variable string to get the name\n */\nexport function parseVariable(variable: string): string | null {\n const match = variable.match(/^\\{(.+?)\\}$/);\n return match ? match[1] : null;\n}\n\n// ============================================================================\n// REPLACEMENT\n// ============================================================================\n\n/**\n * Replace variables in text with values\n *\n * @param text - The text containing variables\n * @param values - Map of variable name to replacement value\n * @returns Text with variables replaced\n */\nexport function replaceVariables(text: string, values: Record<string, string>): string {\n if (!text) return text;\n\n return text.replace(VARIABLE_PATTERN_RELAXED, (match, varName) => {\n const name = varName.trim();\n if (name in values) {\n return values[name];\n }\n return match; // Keep original if not in values\n });\n}\n\n/**\n * Replace all variables in text with a placeholder\n *\n * @param text - The text containing variables\n * @param placeholder - Placeholder to use (default: empty string)\n * @returns Text with variables replaced\n */\nexport function removeVariables(text: string, placeholder = ''): string {\n if (!text) return text;\n return text.replace(VARIABLE_PATTERN_RELAXED, placeholder);\n}\n\n/**\n * Highlight variables in text for display\n *\n * @param text - The text containing variables\n * @param wrapper - Function to wrap variable text\n * @returns Array of text segments\n */\nexport function highlightVariables(\n text: string,\n wrapper: (varName: string) => string = (v) => `[${v}]`\n): string {\n if (!text) return text;\n\n return text.replace(VARIABLE_PATTERN_RELAXED, (_match, varName) => {\n return wrapper(varName.trim());\n });\n}\n\n// ============================================================================\n// DOCUMENT-LEVEL HELPERS\n// ============================================================================\n\n/**\n * Get total variable count in document (including duplicates)\n */\nexport function getVariableCount(doc: Document): number {\n const result = detectVariablesDetailed(doc);\n return result.totalOccurrences;\n}\n\n/**\n * Get unique variable count in document\n */\nexport function getUniqueVariableCount(doc: Document): number {\n return detectVariables(doc).length;\n}\n\n/**\n * Check if document has any template variables\n */\nexport function documentHasVariables(doc: Document): boolean {\n return detectVariables(doc).length > 0;\n}\n\n/**\n * Get variables grouped by first letter for large lists\n */\nexport function groupVariablesByLetter(variables: string[]): Record<string, string[]> {\n const groups: Record<string, string[]> = {};\n\n for (const variable of variables) {\n const letter = variable.charAt(0).toUpperCase();\n if (!groups[letter]) {\n groups[letter] = [];\n }\n groups[letter].push(variable);\n }\n\n return groups;\n}\n\nexport default detectVariables;\n","/**\n * Core Plugin System Types\n *\n * Defines the interfaces for headless plugins that work in Node.js\n * without React/DOM dependencies. These plugins extend DocumentAgent\n * with additional commands and expose MCP tools for AI integration.\n */\n\nimport type { Document } from '../types/document';\nimport type { AgentCommand, Position, Range } from '../types/agentApi';\n\n// ============================================================================\n// PLUGIN INTERFACE\n// ============================================================================\n\n/**\n * Core plugin interface - headless, works in Node.js\n *\n * Plugins can:\n * - Register command handlers that DocumentAgent dispatches to\n * - Declare MCP tools that the MCP server exposes to AI clients\n * - Have optional initialization logic\n * - Declare dependencies on other plugins\n */\nexport interface CorePlugin {\n /** Unique plugin identifier */\n id: string;\n\n /** Human-readable plugin name */\n name: string;\n\n /** Plugin version (semver) */\n version?: string;\n\n /** Plugin description */\n description?: string;\n\n /**\n * Command handlers this plugin provides.\n * DocumentAgent dispatches commands to these handlers.\n *\n * @example\n * ```ts\n * commandHandlers: {\n * 'insertTemplateVariable': (doc, cmd) => {\n * // Transform document\n * return modifiedDoc;\n * },\n * }\n * ```\n */\n commandHandlers?: Record<string, CommandHandler>;\n\n /**\n * MCP tools this plugin exposes.\n * MCP server collects these from all plugins.\n */\n mcpTools?: McpToolDefinition[];\n\n /**\n * Optional setup when plugin is registered.\n * Called once during plugin registration.\n */\n initialize?: () => void | Promise<void>;\n\n /**\n * Optional cleanup when plugin is unregistered.\n */\n destroy?: () => void | Promise<void>;\n\n /**\n * Dependencies on other plugins (by ID).\n * The registry ensures dependencies are loaded first.\n */\n dependencies?: string[];\n}\n\n// ============================================================================\n// COMMAND TYPES\n// ============================================================================\n\n/**\n * Command handler function type\n *\n * Receives a document and a command, returns a modified document.\n * Must be pure/immutable - always return a new document.\n */\nexport type CommandHandler = (doc: Document, command: PluginCommand) => Document;\n\n/**\n * Extended command type for plugins\n *\n * Plugins can define custom command types beyond the built-in AgentCommand types.\n */\nexport interface PluginCommand {\n /** Command type identifier */\n type: string;\n\n /** Unique command ID (for undo tracking) */\n id?: string;\n\n /** Position for positional commands */\n position?: Position;\n\n /** Range for range-based commands */\n range?: Range;\n\n /** Additional command-specific data */\n [key: string]: unknown;\n}\n\n/**\n * Result of command execution\n */\nexport interface CommandResult {\n /** The modified document */\n document: Document;\n\n /** Whether the command succeeded */\n success: boolean;\n\n /** Error message if failed */\n error?: string;\n\n /** Metadata about the operation */\n metadata?: Record<string, unknown>;\n}\n\n// ============================================================================\n// MCP TOOL TYPES\n// ============================================================================\n\n/**\n * MCP tool definition\n *\n * Describes a tool that can be called by AI clients through the MCP server.\n */\nexport interface McpToolDefinition {\n /** Tool name (used in MCP protocol) */\n name: string;\n\n /** Human-readable description for AI */\n description: string;\n\n /**\n * JSON Schema for tool input validation.\n * Can be a Zod schema or plain JSON Schema object.\n */\n inputSchema: JsonSchema | ZodSchemaLike;\n\n /**\n * Handler function for the tool.\n * Receives validated input and returns a result.\n */\n handler: McpToolHandler;\n\n /**\n * Optional annotations for the tool\n */\n annotations?: McpToolAnnotations;\n}\n\n/**\n * MCP tool handler function\n */\nexport type McpToolHandler = (\n input: unknown,\n context: McpToolContext\n) => Promise<McpToolResult> | McpToolResult;\n\n/**\n * Context passed to MCP tool handlers\n */\nexport interface McpToolContext {\n /** Current document (if loaded) */\n document?: Document;\n\n /** Document buffer (if loaded) */\n documentBuffer?: ArrayBuffer;\n\n /** Session state */\n session: McpSession;\n\n /** Logger for debugging */\n log: (message: string, data?: unknown) => void;\n}\n\n/**\n * MCP session state\n *\n * Maintains state across tool calls within a session.\n */\nexport interface McpSession {\n /** Session ID */\n id: string;\n\n /** Loaded documents by ID */\n documents: Map<string, LoadedDocument>;\n\n /** Custom session data */\n data: Map<string, unknown>;\n}\n\n/**\n * A loaded document in the session\n */\nexport interface LoadedDocument {\n /** Document ID */\n id: string;\n\n /** Parsed document */\n document: Document;\n\n /** Original buffer (for repacking) */\n buffer?: ArrayBuffer;\n\n /** Source filename or path */\n source?: string;\n\n /** Last modified timestamp */\n lastModified: number;\n}\n\n/**\n * MCP tool result\n */\nexport interface McpToolResult {\n /** Result content */\n content: McpToolContent[];\n\n /** Whether this is an error result */\n isError?: boolean;\n}\n\n/**\n * MCP tool content types\n */\nexport type McpToolContent =\n | { type: 'text'; text: string }\n | { type: 'image'; data: string; mimeType: string }\n | { type: 'resource'; uri: string; mimeType?: string; text?: string };\n\n/**\n * MCP tool annotations\n */\nexport interface McpToolAnnotations {\n /** Tool category for organization */\n category?: string;\n\n /** Whether this tool modifies the document */\n readOnly?: boolean;\n\n /** Estimated cost/complexity */\n complexity?: 'low' | 'medium' | 'high';\n\n /** Example usage */\n examples?: McpToolExample[];\n}\n\n/**\n * MCP tool example\n */\nexport interface McpToolExample {\n /** Example description */\n description: string;\n\n /** Example input */\n input: unknown;\n\n /** Expected output description */\n output?: string;\n}\n\n// ============================================================================\n// JSON SCHEMA TYPES\n// ============================================================================\n\n/**\n * JSON Schema definition (subset)\n */\nexport interface JsonSchema {\n type?: string | string[];\n properties?: Record<string, JsonSchema>;\n items?: JsonSchema;\n required?: string[];\n description?: string;\n enum?: unknown[];\n default?: unknown;\n minimum?: number;\n maximum?: number;\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n format?: string;\n additionalProperties?: boolean | JsonSchema;\n anyOf?: JsonSchema[];\n oneOf?: JsonSchema[];\n allOf?: JsonSchema[];\n $ref?: string;\n}\n\n/**\n * Zod-like schema interface for compatibility\n */\nexport interface ZodSchemaLike {\n _def?: unknown;\n parse?: (data: unknown) => unknown;\n safeParse?: (data: unknown) => { success: boolean; data?: unknown; error?: unknown };\n}\n\n/**\n * Check if a schema is Zod-like\n */\nexport function isZodSchema(schema: unknown): schema is ZodSchemaLike {\n return (\n typeof schema === 'object' &&\n schema !== null &&\n ('_def' in schema || 'parse' in schema || 'safeParse' in schema)\n );\n}\n\n// ============================================================================\n// PLUGIN EVENTS\n// ============================================================================\n\n/**\n * Plugin lifecycle events\n */\nexport type PluginEvent =\n | { type: 'registered'; plugin: CorePlugin }\n | { type: 'unregistered'; pluginId: string }\n | { type: 'error'; pluginId: string; error: Error };\n\n/**\n * Plugin event listener\n */\nexport type PluginEventListener = (event: PluginEvent) => void;\n\n// ============================================================================\n// UTILITY TYPES\n// ============================================================================\n\n/**\n * Extract command type from a union\n */\nexport type ExtractCommand<T extends AgentCommand, Type extends string> = T extends { type: Type }\n ? T\n : never;\n\n/**\n * Create a typed command handler\n */\nexport type TypedCommandHandler<T extends PluginCommand> = (doc: Document, command: T) => Document;\n\n/**\n * Plugin configuration options\n */\nexport interface PluginOptions {\n /** Enable debug logging */\n debug?: boolean;\n\n /** Custom configuration */\n config?: Record<string, unknown>;\n}\n\n/**\n * Result of plugin registration\n */\nexport interface PluginRegistrationResult {\n /** Whether registration succeeded */\n success: boolean;\n\n /** Registered plugin (if successful) */\n plugin?: CorePlugin;\n\n /** Error message (if failed) */\n error?: string;\n\n /** Warning messages */\n warnings?: string[];\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport type {\n CorePlugin as Plugin,\n CommandHandler as PluginCommandHandler,\n McpToolDefinition as ToolDefinition,\n McpToolHandler as ToolHandler,\n McpToolResult as ToolResult,\n};\n","/**\n * Docxtemplater Plugin Command Handlers\n *\n * Handles template-related commands for DocumentAgent.\n */\n\nimport type { Document, Paragraph, Run, TextContent } from '../../types/document';\nimport type { PluginCommand } from '../types';\n\n// ============================================================================\n// COMMAND TYPES\n// ============================================================================\n\n/**\n * Insert a template variable at a position\n */\nexport interface InsertTemplateVariableCommand extends PluginCommand {\n type: 'insertTemplateVariable';\n position: {\n paragraphIndex: number;\n offset: number;\n };\n variableName: string;\n}\n\n/**\n * Replace text with a template variable\n */\nexport interface ReplaceWithTemplateVariableCommand extends PluginCommand {\n type: 'replaceWithTemplateVariable';\n range: {\n start: { paragraphIndex: number; offset: number };\n end: { paragraphIndex: number; offset: number };\n };\n variableName: string;\n}\n\n// ============================================================================\n// HANDLERS\n// ============================================================================\n\n/**\n * Handle insertTemplateVariable command\n *\n * Inserts {variableName} at the specified position.\n */\nexport function handleInsertTemplateVariable(doc: Document, command: PluginCommand): Document {\n const cmd = command as InsertTemplateVariableCommand;\n const { position, variableName } = cmd;\n\n // Clone document for immutability\n const newDoc: Document = JSON.parse(JSON.stringify(doc));\n const body = newDoc.package.document;\n\n // Find the paragraph\n const paragraphs = body.content.filter((block): block is Paragraph => block.type === 'paragraph');\n\n if (position.paragraphIndex >= paragraphs.length) {\n throw new Error(`Paragraph index ${position.paragraphIndex} out of bounds`);\n }\n\n const paragraph = paragraphs[position.paragraphIndex];\n\n // Create the variable text\n const variableText = `{${variableName}}`;\n\n // Insert the variable at the offset\n insertTextAtOffset(paragraph, position.offset, variableText);\n\n // Track the variable in document metadata\n if (!newDoc.templateVariables) {\n newDoc.templateVariables = [];\n }\n if (!newDoc.templateVariables.includes(variableName)) {\n newDoc.templateVariables.push(variableName);\n }\n\n return newDoc;\n}\n\n/**\n * Handle replaceWithTemplateVariable command\n *\n * Replaces the text in the range with {variableName}.\n */\nexport function handleReplaceWithTemplateVariable(doc: Document, command: PluginCommand): Document {\n const cmd = command as ReplaceWithTemplateVariableCommand;\n const { range, variableName } = cmd;\n\n // Clone document for immutability\n const newDoc: Document = JSON.parse(JSON.stringify(doc));\n const body = newDoc.package.document;\n\n // Find the paragraphs\n const paragraphs = body.content.filter((block): block is Paragraph => block.type === 'paragraph');\n\n if (range.start.paragraphIndex !== range.end.paragraphIndex) {\n throw new Error('Template variable replacement cannot span multiple paragraphs');\n }\n\n if (range.start.paragraphIndex >= paragraphs.length) {\n throw new Error(`Paragraph index ${range.start.paragraphIndex} out of bounds`);\n }\n\n const paragraph = paragraphs[range.start.paragraphIndex];\n\n // Delete the range first\n deleteTextInRange(paragraph, range.start.offset, range.end.offset);\n\n // Insert the variable at the start position\n const variableText = `{${variableName}}`;\n insertTextAtOffset(paragraph, range.start.offset, variableText);\n\n // Track the variable\n if (!newDoc.templateVariables) {\n newDoc.templateVariables = [];\n }\n if (!newDoc.templateVariables.includes(variableName)) {\n newDoc.templateVariables.push(variableName);\n }\n\n return newDoc;\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Insert text at a specific offset in a paragraph\n */\nfunction insertTextAtOffset(paragraph: Paragraph, offset: number, text: string): void {\n let currentOffset = 0;\n let inserted = false;\n\n for (let i = 0; i < paragraph.content.length; i++) {\n const item = paragraph.content[i];\n\n if (item.type === 'run') {\n const runText = getRunText(item);\n const runStart = currentOffset;\n const runEnd = currentOffset + runText.length;\n\n if (!inserted && offset >= runStart && offset <= runEnd) {\n const insertPos = offset - runStart;\n\n // Split the run at the insertion point\n const beforeText = runText.slice(0, insertPos);\n const afterText = runText.slice(insertPos);\n\n const newContent: Paragraph['content'] = [];\n\n // Add items before this run\n for (let j = 0; j < i; j++) {\n newContent.push(paragraph.content[j]);\n }\n\n // Add text before insertion point (if any)\n if (beforeText) {\n newContent.push({\n type: 'run',\n formatting: item.formatting,\n content: [{ type: 'text', text: beforeText }],\n });\n }\n\n // Add the new text\n newContent.push({\n type: 'run',\n formatting: item.formatting,\n content: [{ type: 'text', text }],\n });\n\n // Add text after insertion point (if any)\n if (afterText) {\n newContent.push({\n type: 'run',\n formatting: item.formatting,\n content: [{ type: 'text', text: afterText }],\n });\n }\n\n // Add remaining items\n for (let j = i + 1; j < paragraph.content.length; j++) {\n newContent.push(paragraph.content[j]);\n }\n\n paragraph.content = newContent;\n inserted = true;\n break;\n }\n\n currentOffset = runEnd;\n } else if (item.type === 'hyperlink') {\n // Handle hyperlink text\n for (const child of item.children) {\n if (child.type === 'run') {\n currentOffset += getRunText(child).length;\n }\n }\n }\n }\n\n // If not inserted (empty paragraph or offset at end), append\n if (!inserted) {\n paragraph.content.push({\n type: 'run',\n content: [{ type: 'text', text }],\n });\n }\n}\n\n/**\n * Delete text in a range within a paragraph\n */\nfunction deleteTextInRange(paragraph: Paragraph, startOffset: number, endOffset: number): void {\n const newContent: Paragraph['content'] = [];\n let currentOffset = 0;\n\n for (const item of paragraph.content) {\n if (item.type === 'run') {\n const runText = getRunText(item);\n const runStart = currentOffset;\n const runEnd = currentOffset + runText.length;\n\n // Check overlap with deletion range\n if (runEnd <= startOffset || runStart >= endOffset) {\n // No overlap, keep entire run\n newContent.push(item);\n } else {\n // Partial overlap\n let newText = '';\n\n if (runStart < startOffset) {\n // Keep text before start\n newText += runText.slice(0, startOffset - runStart);\n }\n\n if (runEnd > endOffset) {\n // Keep text after end\n newText += runText.slice(endOffset - runStart);\n }\n\n if (newText.length > 0) {\n newContent.push({\n type: 'run',\n formatting: item.formatting,\n content: [{ type: 'text', text: newText }],\n });\n }\n }\n\n currentOffset = runEnd;\n } else {\n newContent.push(item);\n }\n }\n\n paragraph.content = newContent;\n}\n\n/**\n * Get plain text from a run\n */\nfunction getRunText(run: Run): string {\n return run.content\n .filter((c): c is TextContent => c.type === 'text')\n .map((c) => c.text)\n .join('');\n}\n","/**\n * Docxtemplater Plugin MCP Tools\n *\n * MCP tool definitions for template operations that can be called by AI clients.\n */\n\nimport type { McpToolDefinition, McpToolContext, McpToolResult, JsonSchema } from '../types';\n\nimport { detectVariablesDetailed } from '../../utils/variableDetector';\nimport { processTemplateDetailed, validateTemplate } from '../../utils/processTemplate';\nimport { parseDocx } from '../../docx/parser';\n\n// ============================================================================\n// SCHEMAS\n// ============================================================================\n\nconst documentIdSchema: JsonSchema = {\n type: 'string',\n description: 'Document ID from a previous docx_load call',\n};\n\nconst positionSchema: JsonSchema = {\n type: 'object',\n properties: {\n paragraphIndex: {\n type: 'number',\n description: 'Index of the paragraph (0-indexed)',\n },\n offset: {\n type: 'number',\n description: 'Character offset within the paragraph',\n },\n },\n required: ['paragraphIndex', 'offset'],\n};\n\n// ============================================================================\n// TOOL DEFINITIONS\n// ============================================================================\n\n/**\n * Get template variables from a document\n */\nexport const getVariablesTool: McpToolDefinition = {\n name: 'docx_get_variables',\n description: `List all template variables ({name} format) found in the document.\nReturns variable names without braces, along with their locations (body, headers, footers, etc.).\nUse this to discover what data fields a template document expects.`,\n\n inputSchema: {\n type: 'object',\n properties: {\n documentId: documentIdSchema,\n },\n required: ['documentId'],\n },\n\n handler: async (input: unknown, context: McpToolContext): Promise<McpToolResult> => {\n const { documentId } = input as { documentId: string };\n\n const loaded = context.session.documents.get(documentId);\n if (!loaded) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Document not found: ${documentId}` }],\n };\n }\n\n try {\n const result = detectVariablesDetailed(loaded.document);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(\n {\n variables: result.variables,\n count: result.variables.length,\n totalOccurrences: result.totalOccurrences,\n byLocation: result.byLocation,\n },\n null,\n 2\n ),\n },\n ],\n };\n } catch (error) {\n return {\n isError: true,\n content: [\n { type: 'text', text: `Failed to detect variables: ${(error as Error).message}` },\n ],\n };\n }\n },\n\n annotations: {\n category: 'template',\n readOnly: true,\n complexity: 'low',\n examples: [\n {\n description: 'Get all variables from a loaded document',\n input: { documentId: 'doc_123' },\n output: '{\"variables\": [\"customer_name\", \"invoice_date\"], \"count\": 2}',\n },\n ],\n },\n};\n\n/**\n * Insert a template variable at a position\n */\nexport const insertVariableTool: McpToolDefinition = {\n name: 'docx_insert_variable',\n description: `Insert a template variable placeholder ({name}) at a specific position in the document.\nThe variable can later be substituted with actual values using docx_apply_template.\nVariable names should follow the pattern: letters, numbers, underscores, starting with a letter.`,\n\n inputSchema: {\n type: 'object',\n properties: {\n documentId: documentIdSchema,\n position: positionSchema,\n variableName: {\n type: 'string',\n description:\n 'Variable name without braces (e.g., \"customer_name\"). Will be inserted as {customer_name}',\n pattern: '^[a-zA-Z_][a-zA-Z0-9_]*$',\n },\n },\n required: ['documentId', 'position', 'variableName'],\n },\n\n handler: async (input: unknown, context: McpToolContext): Promise<McpToolResult> => {\n const { documentId, position, variableName } = input as {\n documentId: string;\n position: { paragraphIndex: number; offset: number };\n variableName: string;\n };\n\n const loaded = context.session.documents.get(documentId);\n if (!loaded) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Document not found: ${documentId}` }],\n };\n }\n\n // Validate variable name\n if (!/^[a-zA-Z_][a-zA-Z0-9_\\-.]*$/.test(variableName)) {\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: `Invalid variable name: ${variableName}. Must start with letter/underscore and contain only alphanumeric, underscore, hyphen, or dot.`,\n },\n ],\n };\n }\n\n try {\n // Import the executor to run the command\n const { executeCommand } = await import('../../agent/executor');\n\n // Execute the insert command\n const newDoc = executeCommand(loaded.document, {\n type: 'insertText',\n position,\n text: `{${variableName}}`,\n });\n\n // Update the document in the session\n loaded.document = newDoc;\n loaded.lastModified = Date.now();\n\n // Track the variable\n if (!newDoc.templateVariables) {\n newDoc.templateVariables = [];\n }\n if (!newDoc.templateVariables.includes(variableName)) {\n newDoc.templateVariables.push(variableName);\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n variable: variableName,\n insertedAs: `{${variableName}}`,\n position,\n }),\n },\n ],\n };\n } catch (error) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Failed to insert variable: ${(error as Error).message}` }],\n };\n }\n },\n\n annotations: {\n category: 'template',\n readOnly: false,\n complexity: 'low',\n examples: [\n {\n description: 'Insert customer name variable at start of first paragraph',\n input: {\n documentId: 'doc_123',\n position: { paragraphIndex: 0, offset: 0 },\n variableName: 'customer_name',\n },\n },\n ],\n },\n};\n\n/**\n * Apply template substitution\n */\nexport const applyTemplateTool: McpToolDefinition = {\n name: 'docx_apply_template',\n description: `Substitute template variables with actual values in the document.\nReplaces all {variable} placeholders with the corresponding values provided.\nPreserves all formatting (fonts, styles, colors, tables).\nUse docx_get_variables first to discover what variables exist in the document.`,\n\n inputSchema: {\n type: 'object',\n properties: {\n documentId: documentIdSchema,\n variables: {\n type: 'object',\n description:\n 'Map of variable names to values (e.g., {\"customer_name\": \"John Doe\", \"date\": \"2024-01-15\"})',\n additionalProperties: {\n type: 'string',\n },\n },\n keepUnmatchedVariables: {\n type: 'boolean',\n description:\n 'If true, keep {variable} placeholders for variables not in the map. If false, replace with empty string. Default: true',\n default: true,\n },\n },\n required: ['documentId', 'variables'],\n },\n\n handler: async (input: unknown, context: McpToolContext): Promise<McpToolResult> => {\n const {\n documentId,\n variables,\n keepUnmatchedVariables = true,\n } = input as {\n documentId: string;\n variables: Record<string, string>;\n keepUnmatchedVariables?: boolean;\n };\n\n const loaded = context.session.documents.get(documentId);\n if (!loaded) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Document not found: ${documentId}` }],\n };\n }\n\n if (!loaded.buffer) {\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: 'Cannot apply template: document was not loaded from a DOCX buffer',\n },\n ],\n };\n }\n\n try {\n // Process the template\n const result = processTemplateDetailed(loaded.buffer, variables, {\n nullGetter: keepUnmatchedVariables ? 'keep' : 'empty',\n });\n\n // Re-parse the processed document\n const newDoc = await parseDocx(result.buffer);\n\n // Update session\n loaded.document = newDoc;\n loaded.buffer = result.buffer;\n loaded.lastModified = Date.now();\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n replacedVariables: result.replacedVariables,\n unreplacedVariables: result.unreplacedVariables,\n warnings: result.warnings,\n }),\n },\n ],\n };\n } catch (error) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Failed to apply template: ${(error as Error).message}` }],\n };\n }\n },\n\n annotations: {\n category: 'template',\n readOnly: false,\n complexity: 'medium',\n examples: [\n {\n description: 'Fill in customer and date values',\n input: {\n documentId: 'doc_123',\n variables: {\n customer_name: 'Jane Smith',\n invoice_date: '2024-02-15',\n amount: '$1,234.56',\n },\n },\n },\n ],\n },\n};\n\n/**\n * Validate a template document\n */\nexport const validateTemplateTool: McpToolDefinition = {\n name: 'docx_validate_template',\n description: `Validate that a document is a valid docxtemplater template.\nChecks for syntax errors like unclosed braces, invalid tag names, etc.\nReturns validation result with any errors found and list of valid tags.`,\n\n inputSchema: {\n type: 'object',\n properties: {\n documentId: documentIdSchema,\n },\n required: ['documentId'],\n },\n\n handler: async (input: unknown, context: McpToolContext): Promise<McpToolResult> => {\n const { documentId } = input as { documentId: string };\n\n const loaded = context.session.documents.get(documentId);\n if (!loaded) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Document not found: ${documentId}` }],\n };\n }\n\n if (!loaded.buffer) {\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: 'Cannot validate template: document was not loaded from a DOCX buffer',\n },\n ],\n };\n }\n\n try {\n const result = validateTemplate(loaded.buffer);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(\n {\n valid: result.valid,\n tags: result.tags,\n errors: result.errors.map((e) => ({\n message: e.message,\n variable: e.variable,\n type: e.type,\n })),\n },\n null,\n 2\n ),\n },\n ],\n };\n } catch (error) {\n return {\n isError: true,\n content: [\n { type: 'text', text: `Failed to validate template: ${(error as Error).message}` },\n ],\n };\n }\n },\n\n annotations: {\n category: 'template',\n readOnly: true,\n complexity: 'low',\n },\n};\n\n// ============================================================================\n// EXPORT ALL TOOLS\n// ============================================================================\n\nexport const docxtemplaterMcpTools: McpToolDefinition[] = [\n getVariablesTool,\n insertVariableTool,\n applyTemplateTool,\n validateTemplateTool,\n];\n","/**\n * Docxtemplater Plugin\n *\n * Core plugin for template variable functionality using docxtemplater.\n *\n * **Command handlers** — `insertTemplateVariable` and `replaceWithTemplateVariable`\n * allow DocumentAgent to programmatically insert `{variable}` placeholders.\n *\n * @example\n * ```ts\n * import { pluginRegistry } from '@eigenpal/docx-editor/core-plugins';\n * import { docxtemplaterPlugin } from '@eigenpal/docx-editor/core-plugins/docxtemplater';\n *\n * pluginRegistry.register(docxtemplaterPlugin);\n * ```\n */\n\nimport type { CorePlugin } from '../types';\nimport { handleInsertTemplateVariable, handleReplaceWithTemplateVariable } from './handlers';\nimport { docxtemplaterMcpTools } from './mcp-tools';\n\n// ============================================================================\n// PLUGIN DEFINITION\n// ============================================================================\n\n/**\n * Docxtemplater plugin for template variable functionality.\n *\n * Dependency validation is handled lazily by `processTemplate` at call time,\n * so no eager `initialize()` is needed.\n */\nexport const docxtemplaterPlugin: CorePlugin = {\n id: 'docxtemplater',\n name: 'Docxtemplater',\n version: '1.0.0',\n description: 'Template variable support using standard docxtemplater syntax ({variable})',\n\n /**\n * Command handlers for template operations.\n * DocumentAgent dispatches `insertTemplateVariable` and\n * `replaceWithTemplateVariable` commands to these handlers.\n */\n commandHandlers: {\n insertTemplateVariable: handleInsertTemplateVariable,\n replaceWithTemplateVariable: handleReplaceWithTemplateVariable,\n },\n\n /** MCP tools for AI integration (optional, used by the MCP server if running) */\n mcpTools: docxtemplaterMcpTools,\n};\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\n// Export handlers for direct use\nexport {\n handleInsertTemplateVariable,\n handleReplaceWithTemplateVariable,\n type InsertTemplateVariableCommand,\n type ReplaceWithTemplateVariableCommand,\n} from './handlers';\n\n// Export MCP tools for customization\nexport {\n docxtemplaterMcpTools,\n getVariablesTool,\n insertVariableTool,\n applyTemplateTool,\n validateTemplateTool,\n} from './mcp-tools';\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-Y6VCTLCJ.js"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"core-plugins-reexport.cjs"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"core-plugins-reexport.js"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"core-reexport.cjs"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"core-reexport.js"}
@@ -1,2 +0,0 @@
1
- export{a as executeCommand,b as executeCommands}from'./chunk-JOYPFQW2.js';import'./chunk-2QOEHCBX.js';import'./chunk-Y6VCTLCJ.js';//# sourceMappingURL=executor-K5RXUTTR.js.map
2
- //# sourceMappingURL=executor-K5RXUTTR.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"executor-K5RXUTTR.js"}
@@ -1,2 +0,0 @@
1
- 'use strict';var chunkGWBTKVFD_cjs=require('./chunk-GWBTKVFD.cjs');require('./chunk-WD2HTKRR.cjs'),require('./chunk-QEBO3EQP.cjs');Object.defineProperty(exports,"executeCommand",{enumerable:true,get:function(){return chunkGWBTKVFD_cjs.a}});Object.defineProperty(exports,"executeCommands",{enumerable:true,get:function(){return chunkGWBTKVFD_cjs.b}});//# sourceMappingURL=executor-XIPIU3H4.cjs.map
2
- //# sourceMappingURL=executor-XIPIU3H4.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"executor-XIPIU3H4.cjs"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../core/src/agent/text-utils.ts","../../core/src/headless.ts"],"names":["getParagraphText","paragraph","texts","item","getRunText","getHyperlinkText","run","c","hyperlink","child","getTableText","table","row","cell","block","getBodyText","body","countWords","text","w","countCharacters","includeSpaces","getBodyWordCount","count","getTableWordCount","getBodyCharacterCount","getTableCharacterCount","getTextBefore","paragraphs","position","maxChars","totalChars","currentPara","beforeText","i","para","combined","getTextAfter","afterText","getFormattingAtPosition","offset","currentOffset","runEnd","linkEnd","isPositionInHyperlink","linkStart","getHyperlinkAtPosition","isHeadingStyle","styleId","parseHeadingLevel","match","hasImages","content","hasHyperlinks","hasTables","getParagraphs","getParagraphAtIndex","index","getBlockIndexForParagraph","paragraphIndex","currentParagraphIndex","VERSION"],"mappings":"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","file":"headless-reexport.cjs","sourcesContent":["/**\n * Shared Text Utilities for Agent Module\n *\n * Common text extraction and manipulation utilities used by\n * context.ts, selectionContext.ts, and other agent-related code.\n *\n * Consolidates duplicated helper functions into a single location.\n */\n\nimport type {\n DocumentBody,\n Paragraph,\n Run,\n Hyperlink,\n Table,\n TextFormatting,\n} from '../types/document';\n\nimport type { Position } from '../types/agentApi';\n\n// ============================================================================\n// TEXT EXTRACTION\n// ============================================================================\n\n/**\n * Get plain text from a paragraph\n */\nexport function 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 a run\n */\nexport function 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 */\nexport function 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 * Get plain text from a table\n */\nexport function 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(getParagraphText(block));\n }\n }\n }\n }\n\n return texts.join('\\t');\n}\n\n/**\n * Get plain text from document body\n */\nexport function getBodyText(body: DocumentBody): string {\n const texts: string[] = [];\n\n for (const block of body.content) {\n if (block.type === 'paragraph') {\n texts.push(getParagraphText(block));\n } else if (block.type === 'table') {\n texts.push(getTableText(block));\n }\n }\n\n return texts.join('\\n');\n}\n\n// ============================================================================\n// WORD COUNTING\n// ============================================================================\n\n/**\n * Count words in text\n */\nexport function countWords(text: string): number {\n const words = text.split(/\\s+/).filter((w) => w.length > 0);\n return words.length;\n}\n\n/**\n * Count characters in text\n */\nexport function countCharacters(text: string, includeSpaces = true): number {\n if (includeSpaces) {\n return text.length;\n }\n return text.replace(/\\s/g, '').length;\n}\n\n/**\n * Get word count from document body\n */\nexport function getBodyWordCount(body: DocumentBody): number {\n let count = 0;\n for (const block of body.content) {\n if (block.type === 'paragraph') {\n count += countWords(getParagraphText(block));\n } else if (block.type === 'table') {\n count += getTableWordCount(block);\n }\n }\n return count;\n}\n\n/**\n * Get word count from table\n */\nexport function 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 count += countWords(getParagraphText(block));\n }\n }\n }\n }\n return count;\n}\n\n/**\n * Get character count from document body\n */\nexport function getBodyCharacterCount(body: DocumentBody): number {\n let count = 0;\n for (const block of body.content) {\n if (block.type === 'paragraph') {\n count += getParagraphText(block).length;\n } else if (block.type === 'table') {\n count += getTableCharacterCount(block);\n }\n }\n return count;\n}\n\n/**\n * Get character count from table\n */\nexport function 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 count += getParagraphText(block).length;\n }\n }\n }\n }\n return count;\n}\n\n// ============================================================================\n// CONTEXT EXTRACTION\n// ============================================================================\n\n/**\n * Get text before a position\n *\n * @param paragraphs - Array of paragraphs\n * @param position - Position to get text before\n * @param maxChars - Maximum characters to return\n * @returns Text before the position\n */\nexport function getTextBefore(\n paragraphs: Paragraph[],\n position: Position,\n maxChars: number\n): 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 *\n * @param paragraphs - Array of paragraphs\n * @param position - Position to get text after\n * @param maxChars - Maximum characters to return\n * @returns Text after the position\n */\nexport function getTextAfter(\n paragraphs: Paragraph[],\n position: Position,\n maxChars: number\n): 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// FORMATTING QUERIES\n// ============================================================================\n\n/**\n * Get formatting at a specific position in a paragraph\n *\n * @param paragraph - The paragraph to check\n * @param offset - Character offset in the paragraph\n * @returns Formatting at that position\n */\nexport function getFormattingAtPosition(\n paragraph: Paragraph,\n offset: number\n): 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 // 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 *\n * @param paragraph - The paragraph to check\n * @param offset - Character offset in the paragraph\n * @returns True if position is in a hyperlink\n */\nexport function 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 hyperlink at position\n *\n * @param paragraph - The paragraph to check\n * @param offset - Character offset in the paragraph\n * @returns The hyperlink at that position, or undefined\n */\nexport function getHyperlinkAtPosition(\n paragraph: Paragraph,\n offset: number\n): Hyperlink | undefined {\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 item;\n }\n\n currentOffset = linkEnd;\n }\n }\n\n return undefined;\n}\n\n// ============================================================================\n// STYLE HELPERS\n// ============================================================================\n\n/**\n * Check if style ID represents a heading\n *\n * @param styleId - Style ID to check\n * @returns True if it's a heading style\n */\nexport function 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 *\n * @param styleId - Style ID to parse\n * @returns Heading level (1-9) or undefined\n */\nexport function 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// DOCUMENT QUERIES\n// ============================================================================\n\n/**\n * Check if document body has images\n *\n * @param body - Document body to check\n * @returns True if contains images\n */\nexport function hasImages(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 body has hyperlinks\n *\n * @param body - Document body to check\n * @returns True if contains hyperlinks\n */\nexport function hasHyperlinks(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 document body has tables\n *\n * @param body - Document body to check\n * @returns True if contains tables\n */\nexport function hasTables(body: DocumentBody): boolean {\n return body.content.some((block) => block.type === 'table');\n}\n\n// ============================================================================\n// PARAGRAPH HELPERS\n// ============================================================================\n\n/**\n * Get all paragraphs from document body\n *\n * @param body - Document body\n * @returns Array of paragraphs\n */\nexport function getParagraphs(body: DocumentBody): Paragraph[] {\n return body.content.filter((block): block is Paragraph => block.type === 'paragraph');\n}\n\n/**\n * Get paragraph at index from document body\n *\n * @param body - Document body\n * @param index - Paragraph index (0-indexed)\n * @returns Paragraph or undefined\n */\nexport function getParagraphAtIndex(body: DocumentBody, index: number): Paragraph | undefined {\n const paragraphs = getParagraphs(body);\n return paragraphs[index];\n}\n\n/**\n * Get block index for a paragraph index\n *\n * @param body - Document body\n * @param paragraphIndex - Paragraph index\n * @returns Block index or -1 if not found\n */\nexport function getBlockIndexForParagraph(body: DocumentBody, paragraphIndex: number): number {\n let currentParagraphIndex = 0;\n for (let i = 0; i < body.content.length; i++) {\n if (body.content[i].type === 'paragraph') {\n if (currentParagraphIndex === paragraphIndex) {\n return i;\n }\n currentParagraphIndex++;\n }\n }\n return -1;\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default {\n getParagraphText,\n getRunText,\n getHyperlinkText,\n getTableText,\n getBodyText,\n countWords,\n countCharacters,\n getBodyWordCount,\n getBodyCharacterCount,\n getTextBefore,\n getTextAfter,\n getFormattingAtPosition,\n isPositionInHyperlink,\n getHyperlinkAtPosition,\n isHeadingStyle,\n parseHeadingLevel,\n hasImages,\n hasHyperlinks,\n hasTables,\n getParagraphs,\n getParagraphAtIndex,\n getBlockIndexForParagraph,\n};\n","/**\n * Headless API Entry Point\n *\n * Provides document manipulation functionality without React/DOM dependencies.\n * Suitable for Node.js scripts, CLI tools, and server-side processing.\n *\n * @example\n * ```ts\n * import { DocumentAgent, parseDocx, pluginRegistry } from '@eigenpal/docx-editor/headless';\n * import { docxtemplaterPlugin } from '@eigenpal/docx-editor/core-plugins';\n *\n * // Register plugins\n * pluginRegistry.register(docxtemplaterPlugin);\n *\n * // Load and manipulate document\n * const buffer = fs.readFileSync('template.docx');\n * const agent = await DocumentAgent.fromBuffer(buffer);\n *\n * // Get document info\n * console.log('Word count:', agent.getWordCount());\n * console.log('Variables:', agent.getVariables());\n *\n * // Edit document\n * const newAgent = agent\n * .insertText({ paragraphIndex: 0, offset: 0 }, 'Hello ')\n * .applyStyle(0, 'Heading1');\n *\n * // Apply template variables\n * const finalAgent = await newAgent.applyVariables({\n * customer_name: 'Jane Doe',\n * date: '2024-02-15',\n * });\n *\n * // Export\n * const output = await finalAgent.toBuffer();\n * fs.writeFileSync('output.docx', Buffer.from(output));\n * ```\n */\n\n// ============================================================================\n// VERSION\n// ============================================================================\n\nexport const VERSION = '0.0.2';\n\n// ============================================================================\n// DOCUMENT AGENT\n// ============================================================================\n\nexport { DocumentAgent, createAgent, createAgentFromDocument } from './agent/DocumentAgent';\nexport type {\n InsertTextOptions,\n InsertTableOptions,\n InsertImageOptions,\n InsertHyperlinkOptions,\n FormattedTextSegment,\n} from './agent/DocumentAgent';\n\n// ============================================================================\n// COMMAND EXECUTION\n// ============================================================================\n\nexport { executeCommand, executeCommands } from './agent/executor';\n\n// ============================================================================\n// CONTEXT BUILDERS\n// ============================================================================\n\nexport {\n getAgentContext,\n getDocumentSummary,\n buildSelectionContext as buildSelectionContextFromContext,\n type AgentContextOptions,\n type SelectionContextOptions as ContextSelectionOptions,\n} from './agent/context';\n\nexport {\n buildSelectionContext,\n buildExtendedSelectionContext,\n getSelectionFormattingSummary,\n type SelectionContextOptions,\n type ExtendedSelectionContext,\n type FormattingSummary,\n} from './agent/selectionContext';\n\n// ============================================================================\n// TEXT UTILITIES\n// ============================================================================\n\nexport {\n getParagraphText,\n getRunText,\n getHyperlinkText,\n getTableText,\n getBodyText,\n countWords,\n countCharacters,\n getBodyWordCount,\n getBodyCharacterCount,\n getTextBefore,\n getTextAfter,\n getFormattingAtPosition,\n isPositionInHyperlink,\n getHyperlinkAtPosition,\n isHeadingStyle,\n parseHeadingLevel,\n hasImages,\n hasHyperlinks,\n hasTables,\n getParagraphs,\n getParagraphAtIndex,\n getBlockIndexForParagraph,\n} from './agent/text-utils';\n\n// ============================================================================\n// PARSER / SERIALIZER\n// ============================================================================\n\nexport { parseDocx } from './docx/parser';\nexport {\n serializeDocument as serializeDocx,\n serializeDocumentBody,\n serializeSectionProperties,\n} from './docx/serializer/documentSerializer';\nexport { repackDocx, createDocx } from './docx/rezip';\n\n// ============================================================================\n// TEMPLATE PROCESSING\n// ============================================================================\n\nexport {\n processTemplate,\n processTemplateDetailed,\n processTemplateAsBlob,\n processTemplateAdvanced,\n getTemplateTags,\n validateTemplate,\n getMissingVariables,\n previewTemplate,\n createTemplateProcessor,\n type ProcessTemplateOptions,\n type ProcessTemplateResult,\n type TemplateError,\n} from './utils/processTemplate';\n\n// ============================================================================\n// VARIABLE DETECTION\n// ============================================================================\n\nexport {\n detectVariables,\n detectVariablesDetailed,\n detectVariablesInBody,\n detectVariablesInParagraph,\n extractVariablesFromText,\n hasTemplateVariables,\n isValidVariableName,\n sanitizeVariableName,\n formatVariable,\n parseVariable,\n replaceVariables,\n removeVariables,\n documentHasVariables,\n type VariableDetectionResult,\n type VariableOccurrence,\n} from './utils/variableDetector';\n\n// ============================================================================\n// DOCUMENT CREATION\n// ============================================================================\n\nexport {\n createEmptyDocument,\n createDocumentWithText,\n type CreateEmptyDocumentOptions,\n} from './utils/createDocument';\n\n// ============================================================================\n// UTILITIES\n// ============================================================================\n\nexport {\n twipsToPixels,\n pixelsToTwips,\n formatPx,\n emuToPixels,\n pointsToPixels,\n halfPointsToPixels,\n pixelsToEmu,\n emuToTwips,\n twipsToEmu,\n} from './utils/units';\n\nexport {\n resolveColor,\n resolveHighlightColor,\n resolveShadingColor,\n parseColorString,\n createThemeColor,\n createRgbColor,\n darkenColor,\n lightenColor,\n blendColors,\n getContrastingColor,\n isBlack,\n isWhite,\n colorsEqual,\n} from './utils/colorResolver';\n\n// ============================================================================\n// PLUGIN SYSTEM\n// ============================================================================\n\nexport {\n pluginRegistry,\n PluginRegistry,\n registerPlugins,\n createPluginRegistrar,\n isZodSchema,\n type CorePlugin,\n type Plugin,\n type PluginCommand,\n type CommandHandler,\n type PluginCommandHandler,\n type CommandResult,\n type PluginOptions,\n type PluginRegistrationResult,\n type McpToolDefinition,\n type ToolDefinition,\n type McpToolHandler,\n type ToolHandler,\n type McpToolResult,\n type ToolResult,\n type McpToolContent,\n type McpToolContext,\n type McpToolAnnotations,\n type McpSession,\n type LoadedDocument,\n type JsonSchema,\n type ZodSchemaLike,\n type PluginEvent,\n type PluginEventListener,\n} from './core-plugins';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n// Document types\nexport type {\n Document,\n DocxPackage,\n DocumentBody,\n BlockContent,\n Paragraph,\n Run,\n RunContent,\n TextContent,\n Table,\n TableRow,\n TableCell,\n Image,\n Hyperlink,\n Theme,\n Style,\n StyleDefinitions,\n TextFormatting,\n ParagraphFormatting,\n SectionProperties,\n Footnote,\n Endnote,\n ListLevel,\n NumberingDefinitions,\n Relationship,\n} from './types/document';\n\n// Agent API types\nexport type {\n AIAction,\n AIActionRequest,\n AgentResponse,\n AgentContext,\n SelectionContext,\n Range,\n Position,\n ParagraphContext,\n ParagraphOutline,\n SectionInfo,\n StyleInfo,\n SuggestedAction,\n AgentCommand,\n InsertTextCommand,\n ReplaceTextCommand,\n DeleteTextCommand,\n FormatTextCommand,\n FormatParagraphCommand,\n InsertTableCommand,\n InsertImageCommand,\n InsertHyperlinkCommand,\n SetVariableCommand,\n ApplyStyleCommand,\n ApplyVariablesCommand,\n} from './types/agentApi';\n\n// API functions\nexport {\n createCollapsedRange,\n createRange,\n isPositionInRange,\n comparePositions,\n getActionLabel,\n getActionDescription,\n createCommand,\n DEFAULT_AI_ACTIONS,\n} from './types/agentApi';\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../core/src/agent/text-utils.ts","../../core/src/headless.ts"],"names":["getParagraphText","paragraph","texts","item","getRunText","getHyperlinkText","run","c","hyperlink","child","getTableText","table","row","cell","block","getBodyText","body","countWords","text","w","countCharacters","includeSpaces","getBodyWordCount","count","getTableWordCount","getBodyCharacterCount","getTableCharacterCount","getTextBefore","paragraphs","position","maxChars","totalChars","currentPara","beforeText","i","para","combined","getTextAfter","afterText","getFormattingAtPosition","offset","currentOffset","runEnd","linkEnd","isPositionInHyperlink","linkStart","getHyperlinkAtPosition","isHeadingStyle","styleId","parseHeadingLevel","match","hasImages","content","hasHyperlinks","hasTables","getParagraphs","getParagraphAtIndex","index","getBlockIndexForParagraph","paragraphIndex","currentParagraphIndex","VERSION"],"mappings":"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","file":"headless-reexport.js","sourcesContent":["/**\n * Shared Text Utilities for Agent Module\n *\n * Common text extraction and manipulation utilities used by\n * context.ts, selectionContext.ts, and other agent-related code.\n *\n * Consolidates duplicated helper functions into a single location.\n */\n\nimport type {\n DocumentBody,\n Paragraph,\n Run,\n Hyperlink,\n Table,\n TextFormatting,\n} from '../types/document';\n\nimport type { Position } from '../types/agentApi';\n\n// ============================================================================\n// TEXT EXTRACTION\n// ============================================================================\n\n/**\n * Get plain text from a paragraph\n */\nexport function 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 a run\n */\nexport function 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 */\nexport function 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 * Get plain text from a table\n */\nexport function 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(getParagraphText(block));\n }\n }\n }\n }\n\n return texts.join('\\t');\n}\n\n/**\n * Get plain text from document body\n */\nexport function getBodyText(body: DocumentBody): string {\n const texts: string[] = [];\n\n for (const block of body.content) {\n if (block.type === 'paragraph') {\n texts.push(getParagraphText(block));\n } else if (block.type === 'table') {\n texts.push(getTableText(block));\n }\n }\n\n return texts.join('\\n');\n}\n\n// ============================================================================\n// WORD COUNTING\n// ============================================================================\n\n/**\n * Count words in text\n */\nexport function countWords(text: string): number {\n const words = text.split(/\\s+/).filter((w) => w.length > 0);\n return words.length;\n}\n\n/**\n * Count characters in text\n */\nexport function countCharacters(text: string, includeSpaces = true): number {\n if (includeSpaces) {\n return text.length;\n }\n return text.replace(/\\s/g, '').length;\n}\n\n/**\n * Get word count from document body\n */\nexport function getBodyWordCount(body: DocumentBody): number {\n let count = 0;\n for (const block of body.content) {\n if (block.type === 'paragraph') {\n count += countWords(getParagraphText(block));\n } else if (block.type === 'table') {\n count += getTableWordCount(block);\n }\n }\n return count;\n}\n\n/**\n * Get word count from table\n */\nexport function 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 count += countWords(getParagraphText(block));\n }\n }\n }\n }\n return count;\n}\n\n/**\n * Get character count from document body\n */\nexport function getBodyCharacterCount(body: DocumentBody): number {\n let count = 0;\n for (const block of body.content) {\n if (block.type === 'paragraph') {\n count += getParagraphText(block).length;\n } else if (block.type === 'table') {\n count += getTableCharacterCount(block);\n }\n }\n return count;\n}\n\n/**\n * Get character count from table\n */\nexport function 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 count += getParagraphText(block).length;\n }\n }\n }\n }\n return count;\n}\n\n// ============================================================================\n// CONTEXT EXTRACTION\n// ============================================================================\n\n/**\n * Get text before a position\n *\n * @param paragraphs - Array of paragraphs\n * @param position - Position to get text before\n * @param maxChars - Maximum characters to return\n * @returns Text before the position\n */\nexport function getTextBefore(\n paragraphs: Paragraph[],\n position: Position,\n maxChars: number\n): 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 *\n * @param paragraphs - Array of paragraphs\n * @param position - Position to get text after\n * @param maxChars - Maximum characters to return\n * @returns Text after the position\n */\nexport function getTextAfter(\n paragraphs: Paragraph[],\n position: Position,\n maxChars: number\n): 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// FORMATTING QUERIES\n// ============================================================================\n\n/**\n * Get formatting at a specific position in a paragraph\n *\n * @param paragraph - The paragraph to check\n * @param offset - Character offset in the paragraph\n * @returns Formatting at that position\n */\nexport function getFormattingAtPosition(\n paragraph: Paragraph,\n offset: number\n): 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 // 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 *\n * @param paragraph - The paragraph to check\n * @param offset - Character offset in the paragraph\n * @returns True if position is in a hyperlink\n */\nexport function 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 hyperlink at position\n *\n * @param paragraph - The paragraph to check\n * @param offset - Character offset in the paragraph\n * @returns The hyperlink at that position, or undefined\n */\nexport function getHyperlinkAtPosition(\n paragraph: Paragraph,\n offset: number\n): Hyperlink | undefined {\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 item;\n }\n\n currentOffset = linkEnd;\n }\n }\n\n return undefined;\n}\n\n// ============================================================================\n// STYLE HELPERS\n// ============================================================================\n\n/**\n * Check if style ID represents a heading\n *\n * @param styleId - Style ID to check\n * @returns True if it's a heading style\n */\nexport function 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 *\n * @param styleId - Style ID to parse\n * @returns Heading level (1-9) or undefined\n */\nexport function 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// DOCUMENT QUERIES\n// ============================================================================\n\n/**\n * Check if document body has images\n *\n * @param body - Document body to check\n * @returns True if contains images\n */\nexport function hasImages(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 body has hyperlinks\n *\n * @param body - Document body to check\n * @returns True if contains hyperlinks\n */\nexport function hasHyperlinks(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 document body has tables\n *\n * @param body - Document body to check\n * @returns True if contains tables\n */\nexport function hasTables(body: DocumentBody): boolean {\n return body.content.some((block) => block.type === 'table');\n}\n\n// ============================================================================\n// PARAGRAPH HELPERS\n// ============================================================================\n\n/**\n * Get all paragraphs from document body\n *\n * @param body - Document body\n * @returns Array of paragraphs\n */\nexport function getParagraphs(body: DocumentBody): Paragraph[] {\n return body.content.filter((block): block is Paragraph => block.type === 'paragraph');\n}\n\n/**\n * Get paragraph at index from document body\n *\n * @param body - Document body\n * @param index - Paragraph index (0-indexed)\n * @returns Paragraph or undefined\n */\nexport function getParagraphAtIndex(body: DocumentBody, index: number): Paragraph | undefined {\n const paragraphs = getParagraphs(body);\n return paragraphs[index];\n}\n\n/**\n * Get block index for a paragraph index\n *\n * @param body - Document body\n * @param paragraphIndex - Paragraph index\n * @returns Block index or -1 if not found\n */\nexport function getBlockIndexForParagraph(body: DocumentBody, paragraphIndex: number): number {\n let currentParagraphIndex = 0;\n for (let i = 0; i < body.content.length; i++) {\n if (body.content[i].type === 'paragraph') {\n if (currentParagraphIndex === paragraphIndex) {\n return i;\n }\n currentParagraphIndex++;\n }\n }\n return -1;\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default {\n getParagraphText,\n getRunText,\n getHyperlinkText,\n getTableText,\n getBodyText,\n countWords,\n countCharacters,\n getBodyWordCount,\n getBodyCharacterCount,\n getTextBefore,\n getTextAfter,\n getFormattingAtPosition,\n isPositionInHyperlink,\n getHyperlinkAtPosition,\n isHeadingStyle,\n parseHeadingLevel,\n hasImages,\n hasHyperlinks,\n hasTables,\n getParagraphs,\n getParagraphAtIndex,\n getBlockIndexForParagraph,\n};\n","/**\n * Headless API Entry Point\n *\n * Provides document manipulation functionality without React/DOM dependencies.\n * Suitable for Node.js scripts, CLI tools, and server-side processing.\n *\n * @example\n * ```ts\n * import { DocumentAgent, parseDocx, pluginRegistry } from '@eigenpal/docx-editor/headless';\n * import { docxtemplaterPlugin } from '@eigenpal/docx-editor/core-plugins';\n *\n * // Register plugins\n * pluginRegistry.register(docxtemplaterPlugin);\n *\n * // Load and manipulate document\n * const buffer = fs.readFileSync('template.docx');\n * const agent = await DocumentAgent.fromBuffer(buffer);\n *\n * // Get document info\n * console.log('Word count:', agent.getWordCount());\n * console.log('Variables:', agent.getVariables());\n *\n * // Edit document\n * const newAgent = agent\n * .insertText({ paragraphIndex: 0, offset: 0 }, 'Hello ')\n * .applyStyle(0, 'Heading1');\n *\n * // Apply template variables\n * const finalAgent = await newAgent.applyVariables({\n * customer_name: 'Jane Doe',\n * date: '2024-02-15',\n * });\n *\n * // Export\n * const output = await finalAgent.toBuffer();\n * fs.writeFileSync('output.docx', Buffer.from(output));\n * ```\n */\n\n// ============================================================================\n// VERSION\n// ============================================================================\n\nexport const VERSION = '0.0.2';\n\n// ============================================================================\n// DOCUMENT AGENT\n// ============================================================================\n\nexport { DocumentAgent, createAgent, createAgentFromDocument } from './agent/DocumentAgent';\nexport type {\n InsertTextOptions,\n InsertTableOptions,\n InsertImageOptions,\n InsertHyperlinkOptions,\n FormattedTextSegment,\n} from './agent/DocumentAgent';\n\n// ============================================================================\n// COMMAND EXECUTION\n// ============================================================================\n\nexport { executeCommand, executeCommands } from './agent/executor';\n\n// ============================================================================\n// CONTEXT BUILDERS\n// ============================================================================\n\nexport {\n getAgentContext,\n getDocumentSummary,\n buildSelectionContext as buildSelectionContextFromContext,\n type AgentContextOptions,\n type SelectionContextOptions as ContextSelectionOptions,\n} from './agent/context';\n\nexport {\n buildSelectionContext,\n buildExtendedSelectionContext,\n getSelectionFormattingSummary,\n type SelectionContextOptions,\n type ExtendedSelectionContext,\n type FormattingSummary,\n} from './agent/selectionContext';\n\n// ============================================================================\n// TEXT UTILITIES\n// ============================================================================\n\nexport {\n getParagraphText,\n getRunText,\n getHyperlinkText,\n getTableText,\n getBodyText,\n countWords,\n countCharacters,\n getBodyWordCount,\n getBodyCharacterCount,\n getTextBefore,\n getTextAfter,\n getFormattingAtPosition,\n isPositionInHyperlink,\n getHyperlinkAtPosition,\n isHeadingStyle,\n parseHeadingLevel,\n hasImages,\n hasHyperlinks,\n hasTables,\n getParagraphs,\n getParagraphAtIndex,\n getBlockIndexForParagraph,\n} from './agent/text-utils';\n\n// ============================================================================\n// PARSER / SERIALIZER\n// ============================================================================\n\nexport { parseDocx } from './docx/parser';\nexport {\n serializeDocument as serializeDocx,\n serializeDocumentBody,\n serializeSectionProperties,\n} from './docx/serializer/documentSerializer';\nexport { repackDocx, createDocx } from './docx/rezip';\n\n// ============================================================================\n// TEMPLATE PROCESSING\n// ============================================================================\n\nexport {\n processTemplate,\n processTemplateDetailed,\n processTemplateAsBlob,\n processTemplateAdvanced,\n getTemplateTags,\n validateTemplate,\n getMissingVariables,\n previewTemplate,\n createTemplateProcessor,\n type ProcessTemplateOptions,\n type ProcessTemplateResult,\n type TemplateError,\n} from './utils/processTemplate';\n\n// ============================================================================\n// VARIABLE DETECTION\n// ============================================================================\n\nexport {\n detectVariables,\n detectVariablesDetailed,\n detectVariablesInBody,\n detectVariablesInParagraph,\n extractVariablesFromText,\n hasTemplateVariables,\n isValidVariableName,\n sanitizeVariableName,\n formatVariable,\n parseVariable,\n replaceVariables,\n removeVariables,\n documentHasVariables,\n type VariableDetectionResult,\n type VariableOccurrence,\n} from './utils/variableDetector';\n\n// ============================================================================\n// DOCUMENT CREATION\n// ============================================================================\n\nexport {\n createEmptyDocument,\n createDocumentWithText,\n type CreateEmptyDocumentOptions,\n} from './utils/createDocument';\n\n// ============================================================================\n// UTILITIES\n// ============================================================================\n\nexport {\n twipsToPixels,\n pixelsToTwips,\n formatPx,\n emuToPixels,\n pointsToPixels,\n halfPointsToPixels,\n pixelsToEmu,\n emuToTwips,\n twipsToEmu,\n} from './utils/units';\n\nexport {\n resolveColor,\n resolveHighlightColor,\n resolveShadingColor,\n parseColorString,\n createThemeColor,\n createRgbColor,\n darkenColor,\n lightenColor,\n blendColors,\n getContrastingColor,\n isBlack,\n isWhite,\n colorsEqual,\n} from './utils/colorResolver';\n\n// ============================================================================\n// PLUGIN SYSTEM\n// ============================================================================\n\nexport {\n pluginRegistry,\n PluginRegistry,\n registerPlugins,\n createPluginRegistrar,\n isZodSchema,\n type CorePlugin,\n type Plugin,\n type PluginCommand,\n type CommandHandler,\n type PluginCommandHandler,\n type CommandResult,\n type PluginOptions,\n type PluginRegistrationResult,\n type McpToolDefinition,\n type ToolDefinition,\n type McpToolHandler,\n type ToolHandler,\n type McpToolResult,\n type ToolResult,\n type McpToolContent,\n type McpToolContext,\n type McpToolAnnotations,\n type McpSession,\n type LoadedDocument,\n type JsonSchema,\n type ZodSchemaLike,\n type PluginEvent,\n type PluginEventListener,\n} from './core-plugins';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n// Document types\nexport type {\n Document,\n DocxPackage,\n DocumentBody,\n BlockContent,\n Paragraph,\n Run,\n RunContent,\n TextContent,\n Table,\n TableRow,\n TableCell,\n Image,\n Hyperlink,\n Theme,\n Style,\n StyleDefinitions,\n TextFormatting,\n ParagraphFormatting,\n SectionProperties,\n Footnote,\n Endnote,\n ListLevel,\n NumberingDefinitions,\n Relationship,\n} from './types/document';\n\n// Agent API types\nexport type {\n AIAction,\n AIActionRequest,\n AgentResponse,\n AgentContext,\n SelectionContext,\n Range,\n Position,\n ParagraphContext,\n ParagraphOutline,\n SectionInfo,\n StyleInfo,\n SuggestedAction,\n AgentCommand,\n InsertTextCommand,\n ReplaceTextCommand,\n DeleteTextCommand,\n FormatTextCommand,\n FormatParagraphCommand,\n InsertTableCommand,\n InsertImageCommand,\n InsertHyperlinkCommand,\n SetVariableCommand,\n ApplyStyleCommand,\n ApplyVariablesCommand,\n} from './types/agentApi';\n\n// API functions\nexport {\n createCollapsedRange,\n createRange,\n isPositionInRange,\n comparePositions,\n getActionLabel,\n getActionDescription,\n createCommand,\n DEFAULT_AI_ACTIONS,\n} from './types/agentApi';\n"]}