open-agreements 0.7.7 → 0.8.0

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 (704) hide show
  1. package/LICENSE +201 -21
  2. package/README.de.md +16 -29
  3. package/README.es.md +16 -29
  4. package/README.md +45 -54
  5. package/README.pt-br.md +16 -29
  6. package/README.template.md +19 -25
  7. package/README.zh.md +16 -29
  8. package/content/recipes/nvca-certificate-of-incorporation/fields/acquisition_exception_shares.json +36 -0
  9. package/content/recipes/nvca-certificate-of-incorporation/fields/adjustment_notice_days.json +22 -0
  10. package/content/recipes/nvca-certificate-of-incorporation/fields/common_shares_authorized.json +22 -0
  11. package/content/recipes/nvca-certificate-of-incorporation/fields/company_name.json +29 -0
  12. package/content/recipes/nvca-certificate-of-incorporation/fields/conversion_notice_days.json +22 -0
  13. package/content/recipes/nvca-certificate-of-incorporation/fields/dividend_formula_alt.json +22 -0
  14. package/content/recipes/nvca-certificate-of-incorporation/fields/dividend_rate_per_share.json +22 -0
  15. package/content/recipes/nvca-certificate-of-incorporation/fields/dividend_rate_percent.json +22 -0
  16. package/content/recipes/nvca-certificate-of-incorporation/fields/effective_date.json +22 -0
  17. package/content/recipes/nvca-certificate-of-incorporation/fields/number_of_classes.json +29 -0
  18. package/content/recipes/nvca-certificate-of-incorporation/fields/original_issue_price.json +22 -0
  19. package/content/recipes/nvca-certificate-of-incorporation/fields/par_value.json +36 -0
  20. package/content/recipes/nvca-certificate-of-incorporation/fields/preferred_director_seats.json +22 -0
  21. package/content/recipes/nvca-certificate-of-incorporation/fields/preferred_shares_authorized.json +22 -0
  22. package/content/recipes/nvca-certificate-of-incorporation/fields/preferred_shares_designated_portion.json +29 -0
  23. package/content/recipes/nvca-certificate-of-incorporation/fields/preferred_shares_outstanding_threshold.json +29 -0
  24. package/content/recipes/nvca-certificate-of-incorporation/fields/qualified_financing_notice_days.json +22 -0
  25. package/content/recipes/nvca-certificate-of-incorporation/fields/redemption_interest_rate.json +22 -0
  26. package/content/recipes/nvca-certificate-of-incorporation/fields/redemption_start_date.json +22 -0
  27. package/content/recipes/nvca-certificate-of-incorporation/fields/registered_agent_address.json +22 -0
  28. package/content/recipes/nvca-certificate-of-incorporation/fields/registered_agent_name.json +22 -0
  29. package/content/recipes/nvca-certificate-of-incorporation/fields/series_designation.json +22 -0
  30. package/content/recipes/nvca-certificate-of-incorporation/fields/signature_page_marker.json +22 -0
  31. package/content/recipes/nvca-certificate-of-incorporation/fields/specify_percentage.json +22 -0
  32. package/content/recipes/nvca-certificate-of-incorporation/fields/strategic_partnership_exception_shares.json +22 -0
  33. package/content/recipes/nvca-certificate-of-incorporation/fields/time_zone.json +22 -0
  34. package/content/recipes/nvca-certificate-of-incorporation/fields/total_authorized_shares.json +22 -0
  35. package/content/recipes/nvca-certificate-of-incorporation/template-manifest.json +77 -0
  36. package/content/recipes/nvca-stock-purchase-agreement/fields/agreement_date_month_day.json +27 -0
  37. package/content/recipes/nvca-stock-purchase-agreement/fields/agreement_year_two_digits.json +27 -0
  38. package/content/recipes/nvca-stock-purchase-agreement/fields/company_name.json +25 -0
  39. package/content/recipes/nvca-stock-purchase-agreement/fields/investor_counsel.json +27 -0
  40. package/content/recipes/nvca-stock-purchase-agreement/fields/minimum_shares_initial_closing.json +39 -0
  41. package/content/recipes/nvca-stock-purchase-agreement/fields/optional_plural_suffix.json +27 -0
  42. package/content/recipes/nvca-stock-purchase-agreement/fields/par_value_per_share.json +28 -0
  43. package/content/recipes/nvca-stock-purchase-agreement/fields/purchase_price_per_share.json +28 -0
  44. package/content/recipes/nvca-stock-purchase-agreement/fields/series_designation.json +159 -0
  45. package/content/recipes/nvca-stock-purchase-agreement/metadata.yaml +1 -1
  46. package/content/recipes/nvca-stock-purchase-agreement/template-manifest.json +24 -0
  47. package/content/templates/bonterms-mutual-nda/template.docx +0 -0
  48. package/content/templates/openagreements-board-consent-safe/.template.generated.json +0 -1
  49. package/content/templates/openagreements-employee-ip-inventions-assignment/.template.generated.json +9 -5
  50. package/content/templates/openagreements-employee-ip-inventions-assignment/README.md +2 -0
  51. package/content/templates/openagreements-employee-ip-inventions-assignment/metadata.yaml +8 -9
  52. package/content/templates/openagreements-employee-ip-inventions-assignment/template.docx +0 -0
  53. package/content/templates/openagreements-employee-ip-inventions-assignment/template.md +3 -4
  54. package/content/templates/openagreements-employment-confidentiality-acknowledgement/metadata.yaml +0 -9
  55. package/content/templates/openagreements-employment-confidentiality-acknowledgement/template.docx +0 -0
  56. package/content/templates/openagreements-employment-confidentiality-acknowledgement/template.json +0 -1
  57. package/content/templates/openagreements-employment-offer-letter/.template.generated.json +9 -5
  58. package/content/templates/openagreements-employment-offer-letter/README.md +17 -5
  59. package/content/templates/openagreements-employment-offer-letter/metadata.yaml +8 -9
  60. package/content/templates/openagreements-employment-offer-letter/template.docx +0 -0
  61. package/content/templates/openagreements-employment-offer-letter/template.md +3 -4
  62. package/content/templates/openagreements-restrictive-covenant-florida/.template.generated.json +9 -5
  63. package/content/templates/openagreements-restrictive-covenant-florida/README.md +2 -2
  64. package/content/templates/openagreements-restrictive-covenant-florida/metadata.yaml +10 -12
  65. package/content/templates/openagreements-restrictive-covenant-florida/template.docx +0 -0
  66. package/content/templates/openagreements-restrictive-covenant-florida/template.md +3 -4
  67. package/content/templates/openagreements-restrictive-covenant-wyoming/.template.generated.json +9 -5
  68. package/content/templates/openagreements-restrictive-covenant-wyoming/metadata.yaml +10 -12
  69. package/content/templates/openagreements-restrictive-covenant-wyoming/template.docx +0 -0
  70. package/content/templates/openagreements-restrictive-covenant-wyoming/template.md +3 -4
  71. package/content/templates/openagreements-stockholder-consent-safe/.template.generated.json +0 -1
  72. package/dist/core/checklist/format-checklist-docx.d.ts.map +1 -1
  73. package/dist/core/checklist/format-checklist-docx.js +4 -1
  74. package/dist/core/checklist/format-checklist-docx.js.map +1 -1
  75. package/dist/core/engine.d.ts.map +1 -1
  76. package/dist/core/engine.js +2 -40
  77. package/dist/core/engine.js.map +1 -1
  78. package/dist/core/fill-pipeline.d.ts +0 -8
  79. package/dist/core/fill-pipeline.d.ts.map +1 -1
  80. package/dist/core/fill-pipeline.js +54 -30
  81. package/dist/core/fill-pipeline.js.map +1 -1
  82. package/dist/core/humanize-docx.d.ts.map +1 -1
  83. package/dist/core/humanize-docx.js +16 -6
  84. package/dist/core/humanize-docx.js.map +1 -1
  85. package/dist/core/recipe/bracket-normalizer.d.ts.map +1 -1
  86. package/dist/core/recipe/bracket-normalizer.js +3 -7
  87. package/dist/core/recipe/bracket-normalizer.js.map +1 -1
  88. package/dist/core/recipe/cleaner.js +5 -5
  89. package/dist/core/recipe/cleaner.js.map +1 -1
  90. package/dist/core/recipe/index.d.ts +1 -1
  91. package/dist/core/recipe/index.d.ts.map +1 -1
  92. package/dist/core/recipe/index.js +57 -4
  93. package/dist/core/recipe/index.js.map +1 -1
  94. package/dist/core/recipe/ooxml-parts.d.ts +11 -0
  95. package/dist/core/recipe/ooxml-parts.d.ts.map +1 -1
  96. package/dist/core/recipe/ooxml-parts.js +22 -0
  97. package/dist/core/recipe/ooxml-parts.js.map +1 -1
  98. package/dist/core/recipe/patcher.d.ts.map +1 -1
  99. package/dist/core/recipe/patcher.js +2 -5
  100. package/dist/core/recipe/patcher.js.map +1 -1
  101. package/dist/core/recipe/source-drift.d.ts +19 -0
  102. package/dist/core/recipe/source-drift.d.ts.map +1 -1
  103. package/dist/core/recipe/source-drift.js +32 -2
  104. package/dist/core/recipe/source-drift.js.map +1 -1
  105. package/dist/core/selector.d.ts.map +1 -1
  106. package/dist/core/selector.js +49 -4
  107. package/dist/core/selector.js.map +1 -1
  108. package/dist/core/selectors/index.d.ts +40 -0
  109. package/dist/core/selectors/index.d.ts.map +1 -0
  110. package/dist/core/selectors/index.js +64 -0
  111. package/dist/core/selectors/index.js.map +1 -0
  112. package/dist/core/selectors/loader.d.ts +16 -0
  113. package/dist/core/selectors/loader.d.ts.map +1 -0
  114. package/dist/core/selectors/loader.js +80 -0
  115. package/dist/core/selectors/loader.js.map +1 -0
  116. package/dist/core/selectors/manifest-schema.d.ts +123 -0
  117. package/dist/core/selectors/manifest-schema.d.ts.map +1 -0
  118. package/dist/core/selectors/manifest-schema.js +93 -0
  119. package/dist/core/selectors/manifest-schema.js.map +1 -0
  120. package/dist/core/selectors/patch.d.ts +24 -0
  121. package/dist/core/selectors/patch.d.ts.map +1 -0
  122. package/dist/core/selectors/patch.js +68 -0
  123. package/dist/core/selectors/patch.js.map +1 -0
  124. package/dist/core/selectors/postconditions.d.ts +24 -0
  125. package/dist/core/selectors/postconditions.d.ts.map +1 -0
  126. package/dist/core/selectors/postconditions.js +50 -0
  127. package/dist/core/selectors/postconditions.js.map +1 -0
  128. package/dist/core/selectors/resolve.d.ts +32 -0
  129. package/dist/core/selectors/resolve.d.ts.map +1 -0
  130. package/dist/core/selectors/resolve.js +36 -0
  131. package/dist/core/selectors/resolve.js.map +1 -0
  132. package/dist/core/unified-pipeline.d.ts +3 -1
  133. package/dist/core/unified-pipeline.d.ts.map +1 -1
  134. package/dist/core/unified-pipeline.js +19 -5
  135. package/dist/core/unified-pipeline.js.map +1 -1
  136. package/gemini-extension.json +1 -1
  137. package/node_modules/@usejunior/docx-core/LICENSE +202 -21
  138. package/node_modules/@usejunior/docx-core/NOTICE +2 -0
  139. package/node_modules/@usejunior/docx-core/README.md +2 -2
  140. package/node_modules/@usejunior/docx-core/dist/.tsbuildinfo +1 -1
  141. package/node_modules/@usejunior/docx-core/dist/atomizer.d.ts +55 -0
  142. package/node_modules/@usejunior/docx-core/dist/atomizer.d.ts.map +1 -1
  143. package/node_modules/@usejunior/docx-core/dist/atomizer.js +139 -14
  144. package/node_modules/@usejunior/docx-core/dist/atomizer.js.map +1 -1
  145. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/auxiliaryIdCollision.d.ts +99 -0
  146. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/auxiliaryIdCollision.d.ts.map +1 -0
  147. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/auxiliaryIdCollision.js +415 -0
  148. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/auxiliaryIdCollision.js.map +1 -0
  149. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/documentReconstructor.d.ts.map +1 -1
  150. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/documentReconstructor.js +403 -113
  151. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/documentReconstructor.js.map +1 -1
  152. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/formattingFidelity.d.ts +99 -0
  153. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/formattingFidelity.d.ts.map +1 -0
  154. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/formattingFidelity.js +449 -0
  155. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/formattingFidelity.js.map +1 -0
  156. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier-bookmarks.d.ts +37 -0
  157. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier-bookmarks.d.ts.map +1 -0
  158. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier-bookmarks.js +189 -0
  159. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier-bookmarks.js.map +1 -0
  160. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier-containers.d.ts +74 -0
  161. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier-containers.d.ts.map +1 -0
  162. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier-containers.js +171 -0
  163. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier-containers.js.map +1 -0
  164. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier-deletion.d.ts +88 -0
  165. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier-deletion.d.ts.map +1 -0
  166. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier-deletion.js +326 -0
  167. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier-deletion.js.map +1 -0
  168. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier-postprocess.d.ts +85 -0
  169. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier-postprocess.d.ts.map +1 -0
  170. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier-postprocess.js +402 -0
  171. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier-postprocess.js.map +1 -0
  172. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier-presplit.d.ts +39 -0
  173. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier-presplit.d.ts.map +1 -0
  174. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier-presplit.js +265 -0
  175. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier-presplit.js.map +1 -0
  176. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier-shared.d.ts +62 -0
  177. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier-shared.d.ts.map +1 -0
  178. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier-shared.js +139 -0
  179. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier-shared.js.map +1 -0
  180. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier-wrappers.d.ts +198 -0
  181. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier-wrappers.d.ts.map +1 -0
  182. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier-wrappers.js +475 -0
  183. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier-wrappers.js.map +1 -0
  184. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier.d.ts +6 -290
  185. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier.d.ts.map +1 -1
  186. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier.js +23 -1828
  187. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/inPlaceModifier.js.map +1 -1
  188. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/pipeline.d.ts +36 -2
  189. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/pipeline.d.ts.map +1 -1
  190. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/pipeline.js +456 -224
  191. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/pipeline.js.map +1 -1
  192. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/trackChangesAcceptorAst.d.ts.map +1 -1
  193. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/trackChangesAcceptorAst.js +199 -173
  194. package/node_modules/@usejunior/docx-core/dist/baselines/atomizer/trackChangesAcceptorAst.js.map +1 -1
  195. package/node_modules/@usejunior/docx-core/dist/baselines/wmlcomparer/DotnetCli.d.ts.map +1 -1
  196. package/node_modules/@usejunior/docx-core/dist/baselines/wmlcomparer/DotnetCli.js +7 -0
  197. package/node_modules/@usejunior/docx-core/dist/baselines/wmlcomparer/DotnetCli.js.map +1 -1
  198. package/node_modules/@usejunior/docx-core/dist/cli/compare-two.d.ts.map +1 -1
  199. package/node_modules/@usejunior/docx-core/dist/cli/compare-two.js +3 -1
  200. package/node_modules/@usejunior/docx-core/dist/cli/compare-two.js.map +1 -1
  201. package/node_modules/@usejunior/docx-core/dist/cli/conformance-adapter.d.ts +3 -0
  202. package/node_modules/@usejunior/docx-core/dist/cli/conformance-adapter.d.ts.map +1 -0
  203. package/node_modules/@usejunior/docx-core/dist/cli/conformance-adapter.js +93 -0
  204. package/node_modules/@usejunior/docx-core/dist/cli/conformance-adapter.js.map +1 -0
  205. package/node_modules/@usejunior/docx-core/dist/cli/index.d.ts.map +1 -1
  206. package/node_modules/@usejunior/docx-core/dist/cli/index.js +5 -1
  207. package/node_modules/@usejunior/docx-core/dist/cli/index.js.map +1 -1
  208. package/node_modules/@usejunior/docx-core/dist/compare-types.d.ts +197 -0
  209. package/node_modules/@usejunior/docx-core/dist/compare-types.d.ts.map +1 -0
  210. package/node_modules/@usejunior/docx-core/dist/compare-types.js +2 -0
  211. package/node_modules/@usejunior/docx-core/dist/compare-types.js.map +1 -0
  212. package/node_modules/@usejunior/docx-core/dist/core-types.d.ts +5 -1
  213. package/node_modules/@usejunior/docx-core/dist/core-types.d.ts.map +1 -1
  214. package/node_modules/@usejunior/docx-core/dist/core-types.js +5 -1
  215. package/node_modules/@usejunior/docx-core/dist/core-types.js.map +1 -1
  216. package/node_modules/@usejunior/docx-core/dist/footnotes.d.ts +8 -3
  217. package/node_modules/@usejunior/docx-core/dist/footnotes.d.ts.map +1 -1
  218. package/node_modules/@usejunior/docx-core/dist/footnotes.js +8 -3
  219. package/node_modules/@usejunior/docx-core/dist/footnotes.js.map +1 -1
  220. package/node_modules/@usejunior/docx-core/dist/generation/compile.d.ts +22 -0
  221. package/node_modules/@usejunior/docx-core/dist/generation/compile.d.ts.map +1 -0
  222. package/node_modules/@usejunior/docx-core/dist/generation/compile.js +58 -0
  223. package/node_modules/@usejunior/docx-core/dist/generation/compile.js.map +1 -0
  224. package/node_modules/@usejunior/docx-core/dist/generation/context.d.ts +42 -0
  225. package/node_modules/@usejunior/docx-core/dist/generation/context.d.ts.map +1 -0
  226. package/node_modules/@usejunior/docx-core/dist/generation/context.js +65 -0
  227. package/node_modules/@usejunior/docx-core/dist/generation/context.js.map +1 -0
  228. package/node_modules/@usejunior/docx-core/dist/generation/emit/comments-part.d.ts +36 -0
  229. package/node_modules/@usejunior/docx-core/dist/generation/emit/comments-part.d.ts.map +1 -0
  230. package/node_modules/@usejunior/docx-core/dist/generation/emit/comments-part.js +116 -0
  231. package/node_modules/@usejunior/docx-core/dist/generation/emit/comments-part.js.map +1 -0
  232. package/node_modules/@usejunior/docx-core/dist/generation/emit/document-part.d.ts +24 -0
  233. package/node_modules/@usejunior/docx-core/dist/generation/emit/document-part.d.ts.map +1 -0
  234. package/node_modules/@usejunior/docx-core/dist/generation/emit/document-part.js +60 -0
  235. package/node_modules/@usejunior/docx-core/dist/generation/emit/document-part.js.map +1 -0
  236. package/node_modules/@usejunior/docx-core/dist/generation/emit/emit-context.d.ts +28 -0
  237. package/node_modules/@usejunior/docx-core/dist/generation/emit/emit-context.d.ts.map +1 -0
  238. package/node_modules/@usejunior/docx-core/dist/generation/emit/emit-context.js +19 -0
  239. package/node_modules/@usejunior/docx-core/dist/generation/emit/emit-context.js.map +1 -0
  240. package/node_modules/@usejunior/docx-core/dist/generation/emit/font-table-part.d.ts +16 -0
  241. package/node_modules/@usejunior/docx-core/dist/generation/emit/font-table-part.d.ts.map +1 -0
  242. package/node_modules/@usejunior/docx-core/dist/generation/emit/font-table-part.js +74 -0
  243. package/node_modules/@usejunior/docx-core/dist/generation/emit/font-table-part.js.map +1 -0
  244. package/node_modules/@usejunior/docx-core/dist/generation/emit/header-footer-part.d.ts +23 -0
  245. package/node_modules/@usejunior/docx-core/dist/generation/emit/header-footer-part.d.ts.map +1 -0
  246. package/node_modules/@usejunior/docx-core/dist/generation/emit/header-footer-part.js +57 -0
  247. package/node_modules/@usejunior/docx-core/dist/generation/emit/header-footer-part.js.map +1 -0
  248. package/node_modules/@usejunior/docx-core/dist/generation/emit/numbering-part.d.ts +29 -0
  249. package/node_modules/@usejunior/docx-core/dist/generation/emit/numbering-part.d.ts.map +1 -0
  250. package/node_modules/@usejunior/docx-core/dist/generation/emit/numbering-part.js +102 -0
  251. package/node_modules/@usejunior/docx-core/dist/generation/emit/numbering-part.js.map +1 -0
  252. package/node_modules/@usejunior/docx-core/dist/generation/emit/package-parts.d.ts +24 -0
  253. package/node_modules/@usejunior/docx-core/dist/generation/emit/package-parts.d.ts.map +1 -0
  254. package/node_modules/@usejunior/docx-core/dist/generation/emit/package-parts.js +121 -0
  255. package/node_modules/@usejunior/docx-core/dist/generation/emit/package-parts.js.map +1 -0
  256. package/node_modules/@usejunior/docx-core/dist/generation/emit/paragraph.d.ts +24 -0
  257. package/node_modules/@usejunior/docx-core/dist/generation/emit/paragraph.d.ts.map +1 -0
  258. package/node_modules/@usejunior/docx-core/dist/generation/emit/paragraph.js +63 -0
  259. package/node_modules/@usejunior/docx-core/dist/generation/emit/paragraph.js.map +1 -0
  260. package/node_modules/@usejunior/docx-core/dist/generation/emit/properties.d.ts +36 -0
  261. package/node_modules/@usejunior/docx-core/dist/generation/emit/properties.d.ts.map +1 -0
  262. package/node_modules/@usejunior/docx-core/dist/generation/emit/properties.js +157 -0
  263. package/node_modules/@usejunior/docx-core/dist/generation/emit/properties.js.map +1 -0
  264. package/node_modules/@usejunior/docx-core/dist/generation/emit/run.d.ts +16 -0
  265. package/node_modules/@usejunior/docx-core/dist/generation/emit/run.d.ts.map +1 -0
  266. package/node_modules/@usejunior/docx-core/dist/generation/emit/run.js +71 -0
  267. package/node_modules/@usejunior/docx-core/dist/generation/emit/run.js.map +1 -0
  268. package/node_modules/@usejunior/docx-core/dist/generation/emit/section.d.ts +29 -0
  269. package/node_modules/@usejunior/docx-core/dist/generation/emit/section.d.ts.map +1 -0
  270. package/node_modules/@usejunior/docx-core/dist/generation/emit/section.js +117 -0
  271. package/node_modules/@usejunior/docx-core/dist/generation/emit/section.js.map +1 -0
  272. package/node_modules/@usejunior/docx-core/dist/generation/emit/settings-part.d.ts +13 -0
  273. package/node_modules/@usejunior/docx-core/dist/generation/emit/settings-part.d.ts.map +1 -0
  274. package/node_modules/@usejunior/docx-core/dist/generation/emit/settings-part.js +68 -0
  275. package/node_modules/@usejunior/docx-core/dist/generation/emit/settings-part.js.map +1 -0
  276. package/node_modules/@usejunior/docx-core/dist/generation/emit/styles-part.d.ts +16 -0
  277. package/node_modules/@usejunior/docx-core/dist/generation/emit/styles-part.d.ts.map +1 -0
  278. package/node_modules/@usejunior/docx-core/dist/generation/emit/styles-part.js +82 -0
  279. package/node_modules/@usejunior/docx-core/dist/generation/emit/styles-part.js.map +1 -0
  280. package/node_modules/@usejunior/docx-core/dist/generation/emit/table.d.ts +26 -0
  281. package/node_modules/@usejunior/docx-core/dist/generation/emit/table.d.ts.map +1 -0
  282. package/node_modules/@usejunior/docx-core/dist/generation/emit/table.js +209 -0
  283. package/node_modules/@usejunior/docx-core/dist/generation/emit/table.js.map +1 -0
  284. package/node_modules/@usejunior/docx-core/dist/generation/emit/theme-part.d.ts +21 -0
  285. package/node_modules/@usejunior/docx-core/dist/generation/emit/theme-part.d.ts.map +1 -0
  286. package/node_modules/@usejunior/docx-core/dist/generation/emit/theme-part.js +151 -0
  287. package/node_modules/@usejunior/docx-core/dist/generation/emit/theme-part.js.map +1 -0
  288. package/node_modules/@usejunior/docx-core/dist/generation/emit/web-settings-part.d.ts +12 -0
  289. package/node_modules/@usejunior/docx-core/dist/generation/emit/web-settings-part.d.ts.map +1 -0
  290. package/node_modules/@usejunior/docx-core/dist/generation/emit/web-settings-part.js +19 -0
  291. package/node_modules/@usejunior/docx-core/dist/generation/emit/web-settings-part.js.map +1 -0
  292. package/node_modules/@usejunior/docx-core/dist/generation/errors.d.ts +22 -0
  293. package/node_modules/@usejunior/docx-core/dist/generation/errors.d.ts.map +1 -0
  294. package/node_modules/@usejunior/docx-core/dist/generation/errors.js +29 -0
  295. package/node_modules/@usejunior/docx-core/dist/generation/errors.js.map +1 -0
  296. package/node_modules/@usejunior/docx-core/dist/generation/index.d.ts +13 -0
  297. package/node_modules/@usejunior/docx-core/dist/generation/index.d.ts.map +1 -0
  298. package/node_modules/@usejunior/docx-core/dist/generation/index.js +12 -0
  299. package/node_modules/@usejunior/docx-core/dist/generation/index.js.map +1 -0
  300. package/node_modules/@usejunior/docx-core/dist/generation/ordering.d.ts +46 -0
  301. package/node_modules/@usejunior/docx-core/dist/generation/ordering.d.ts.map +1 -0
  302. package/node_modules/@usejunior/docx-core/dist/generation/ordering.js +119 -0
  303. package/node_modules/@usejunior/docx-core/dist/generation/ordering.js.map +1 -0
  304. package/node_modules/@usejunior/docx-core/dist/generation/recipes.d.ts +87 -0
  305. package/node_modules/@usejunior/docx-core/dist/generation/recipes.d.ts.map +1 -0
  306. package/node_modules/@usejunior/docx-core/dist/generation/recipes.js +232 -0
  307. package/node_modules/@usejunior/docx-core/dist/generation/recipes.js.map +1 -0
  308. package/node_modules/@usejunior/docx-core/dist/generation/structural-checks.d.ts +24 -0
  309. package/node_modules/@usejunior/docx-core/dist/generation/structural-checks.d.ts.map +1 -0
  310. package/node_modules/@usejunior/docx-core/dist/generation/structural-checks.js +318 -0
  311. package/node_modules/@usejunior/docx-core/dist/generation/structural-checks.js.map +1 -0
  312. package/node_modules/@usejunior/docx-core/dist/generation/theme-colors.d.ts +4 -0
  313. package/node_modules/@usejunior/docx-core/dist/generation/theme-colors.d.ts.map +1 -0
  314. package/node_modules/@usejunior/docx-core/dist/generation/theme-colors.js +18 -0
  315. package/node_modules/@usejunior/docx-core/dist/generation/theme-colors.js.map +1 -0
  316. package/node_modules/@usejunior/docx-core/dist/generation/types.d.ts +266 -0
  317. package/node_modules/@usejunior/docx-core/dist/generation/types.d.ts.map +1 -0
  318. package/node_modules/@usejunior/docx-core/dist/generation/types.js +63 -0
  319. package/node_modules/@usejunior/docx-core/dist/generation/types.js.map +1 -0
  320. package/node_modules/@usejunior/docx-core/dist/generation/validate-spec.d.ts +27 -0
  321. package/node_modules/@usejunior/docx-core/dist/generation/validate-spec.d.ts.map +1 -0
  322. package/node_modules/@usejunior/docx-core/dist/generation/validate-spec.js +363 -0
  323. package/node_modules/@usejunior/docx-core/dist/generation/validate-spec.js.map +1 -0
  324. package/node_modules/@usejunior/docx-core/dist/index.d.ts +9 -150
  325. package/node_modules/@usejunior/docx-core/dist/index.d.ts.map +1 -1
  326. package/node_modules/@usejunior/docx-core/dist/index.js +14 -0
  327. package/node_modules/@usejunior/docx-core/dist/index.js.map +1 -1
  328. package/node_modules/@usejunior/docx-core/dist/integration/generation-probes.d.ts +15 -0
  329. package/node_modules/@usejunior/docx-core/dist/integration/generation-probes.d.ts.map +1 -0
  330. package/node_modules/@usejunior/docx-core/dist/integration/generation-probes.js +84 -0
  331. package/node_modules/@usejunior/docx-core/dist/integration/generation-probes.js.map +1 -0
  332. package/node_modules/@usejunior/docx-core/dist/integration/libreoffice-oracle.d.ts +49 -0
  333. package/node_modules/@usejunior/docx-core/dist/integration/libreoffice-oracle.d.ts.map +1 -0
  334. package/node_modules/@usejunior/docx-core/dist/integration/libreoffice-oracle.js +290 -0
  335. package/node_modules/@usejunior/docx-core/dist/integration/libreoffice-oracle.js.map +1 -0
  336. package/node_modules/@usejunior/docx-core/dist/integration/synthetic-docx-fixture.d.ts +134 -0
  337. package/node_modules/@usejunior/docx-core/dist/integration/synthetic-docx-fixture.d.ts.map +1 -0
  338. package/node_modules/@usejunior/docx-core/dist/integration/synthetic-docx-fixture.js +298 -0
  339. package/node_modules/@usejunior/docx-core/dist/integration/synthetic-docx-fixture.js.map +1 -0
  340. package/node_modules/@usejunior/docx-core/dist/primitives/accept_changes.d.ts +4 -3
  341. package/node_modules/@usejunior/docx-core/dist/primitives/accept_changes.d.ts.map +1 -1
  342. package/node_modules/@usejunior/docx-core/dist/primitives/accept_changes.js +163 -77
  343. package/node_modules/@usejunior/docx-core/dist/primitives/accept_changes.js.map +1 -1
  344. package/node_modules/@usejunior/docx-core/dist/primitives/comments.d.ts +12 -3
  345. package/node_modules/@usejunior/docx-core/dist/primitives/comments.d.ts.map +1 -1
  346. package/node_modules/@usejunior/docx-core/dist/primitives/comments.js +374 -97
  347. package/node_modules/@usejunior/docx-core/dist/primitives/comments.js.map +1 -1
  348. package/node_modules/@usejunior/docx-core/dist/primitives/content_fingerprint.d.ts +29 -0
  349. package/node_modules/@usejunior/docx-core/dist/primitives/content_fingerprint.d.ts.map +1 -0
  350. package/node_modules/@usejunior/docx-core/dist/primitives/content_fingerprint.js +63 -0
  351. package/node_modules/@usejunior/docx-core/dist/primitives/content_fingerprint.js.map +1 -0
  352. package/node_modules/@usejunior/docx-core/dist/primitives/document.d.ts +94 -15
  353. package/node_modules/@usejunior/docx-core/dist/primitives/document.d.ts.map +1 -1
  354. package/node_modules/@usejunior/docx-core/dist/primitives/document.js +377 -234
  355. package/node_modules/@usejunior/docx-core/dist/primitives/document.js.map +1 -1
  356. package/node_modules/@usejunior/docx-core/dist/primitives/document_view-comments.d.ts +18 -0
  357. package/node_modules/@usejunior/docx-core/dist/primitives/document_view-comments.d.ts.map +1 -0
  358. package/node_modules/@usejunior/docx-core/dist/primitives/document_view-comments.js +160 -0
  359. package/node_modules/@usejunior/docx-core/dist/primitives/document_view-comments.js.map +1 -0
  360. package/node_modules/@usejunior/docx-core/dist/primitives/document_view-headings.d.ts +45 -0
  361. package/node_modules/@usejunior/docx-core/dist/primitives/document_view-headings.d.ts.map +1 -0
  362. package/node_modules/@usejunior/docx-core/dist/primitives/document_view-headings.js +247 -0
  363. package/node_modules/@usejunior/docx-core/dist/primitives/document_view-headings.js.map +1 -0
  364. package/node_modules/@usejunior/docx-core/dist/primitives/document_view-styles.d.ts +11 -0
  365. package/node_modules/@usejunior/docx-core/dist/primitives/document_view-styles.d.ts.map +1 -0
  366. package/node_modules/@usejunior/docx-core/dist/primitives/document_view-styles.js +104 -0
  367. package/node_modules/@usejunior/docx-core/dist/primitives/document_view-styles.js.map +1 -0
  368. package/node_modules/@usejunior/docx-core/dist/primitives/document_view-toon.d.ts +37 -0
  369. package/node_modules/@usejunior/docx-core/dist/primitives/document_view-toon.d.ts.map +1 -0
  370. package/node_modules/@usejunior/docx-core/dist/primitives/document_view-toon.js +199 -0
  371. package/node_modules/@usejunior/docx-core/dist/primitives/document_view-toon.js.map +1 -0
  372. package/node_modules/@usejunior/docx-core/dist/primitives/document_view-types.d.ts +165 -0
  373. package/node_modules/@usejunior/docx-core/dist/primitives/document_view-types.d.ts.map +1 -0
  374. package/node_modules/@usejunior/docx-core/dist/primitives/document_view-types.js +2 -0
  375. package/node_modules/@usejunior/docx-core/dist/primitives/document_view-types.js.map +1 -0
  376. package/node_modules/@usejunior/docx-core/dist/primitives/document_view.d.ts +50 -101
  377. package/node_modules/@usejunior/docx-core/dist/primitives/document_view.d.ts.map +1 -1
  378. package/node_modules/@usejunior/docx-core/dist/primitives/document_view.js +287 -326
  379. package/node_modules/@usejunior/docx-core/dist/primitives/document_view.js.map +1 -1
  380. package/node_modules/@usejunior/docx-core/dist/primitives/dom-helpers.d.ts +9 -0
  381. package/node_modules/@usejunior/docx-core/dist/primitives/dom-helpers.d.ts.map +1 -1
  382. package/node_modules/@usejunior/docx-core/dist/primitives/dom-helpers.js +10 -1
  383. package/node_modules/@usejunior/docx-core/dist/primitives/dom-helpers.js.map +1 -1
  384. package/node_modules/@usejunior/docx-core/dist/primitives/footnotes.d.ts +4 -3
  385. package/node_modules/@usejunior/docx-core/dist/primitives/footnotes.d.ts.map +1 -1
  386. package/node_modules/@usejunior/docx-core/dist/primitives/footnotes.js +232 -44
  387. package/node_modules/@usejunior/docx-core/dist/primitives/footnotes.js.map +1 -1
  388. package/node_modules/@usejunior/docx-core/dist/primitives/formatting_tags.d.ts +7 -0
  389. package/node_modules/@usejunior/docx-core/dist/primitives/formatting_tags.d.ts.map +1 -1
  390. package/node_modules/@usejunior/docx-core/dist/primitives/formatting_tags.js +22 -11
  391. package/node_modules/@usejunior/docx-core/dist/primitives/formatting_tags.js.map +1 -1
  392. package/node_modules/@usejunior/docx-core/dist/primitives/index.d.ts +12 -0
  393. package/node_modules/@usejunior/docx-core/dist/primitives/index.d.ts.map +1 -1
  394. package/node_modules/@usejunior/docx-core/dist/primitives/index.js +11 -0
  395. package/node_modules/@usejunior/docx-core/dist/primitives/index.js.map +1 -1
  396. package/node_modules/@usejunior/docx-core/dist/primitives/layout.d.ts +4 -3
  397. package/node_modules/@usejunior/docx-core/dist/primitives/layout.d.ts.map +1 -1
  398. package/node_modules/@usejunior/docx-core/dist/primitives/layout.js +45 -3
  399. package/node_modules/@usejunior/docx-core/dist/primitives/layout.js.map +1 -1
  400. package/node_modules/@usejunior/docx-core/dist/primitives/locator.d.ts +76 -0
  401. package/node_modules/@usejunior/docx-core/dist/primitives/locator.d.ts.map +1 -0
  402. package/node_modules/@usejunior/docx-core/dist/primitives/locator.js +223 -0
  403. package/node_modules/@usejunior/docx-core/dist/primitives/locator.js.map +1 -0
  404. package/node_modules/@usejunior/docx-core/dist/primitives/merge_runs.d.ts +21 -3
  405. package/node_modules/@usejunior/docx-core/dist/primitives/merge_runs.d.ts.map +1 -1
  406. package/node_modules/@usejunior/docx-core/dist/primitives/merge_runs.js +32 -10
  407. package/node_modules/@usejunior/docx-core/dist/primitives/merge_runs.js.map +1 -1
  408. package/node_modules/@usejunior/docx-core/dist/primitives/minimal_save.d.ts +38 -0
  409. package/node_modules/@usejunior/docx-core/dist/primitives/minimal_save.d.ts.map +1 -0
  410. package/node_modules/@usejunior/docx-core/dist/primitives/minimal_save.js +323 -0
  411. package/node_modules/@usejunior/docx-core/dist/primitives/minimal_save.js.map +1 -0
  412. package/node_modules/@usejunior/docx-core/dist/primitives/namespaces.d.ts +53 -0
  413. package/node_modules/@usejunior/docx-core/dist/primitives/namespaces.d.ts.map +1 -1
  414. package/node_modules/@usejunior/docx-core/dist/primitives/namespaces.js +59 -0
  415. package/node_modules/@usejunior/docx-core/dist/primitives/namespaces.js.map +1 -1
  416. package/node_modules/@usejunior/docx-core/dist/primitives/reject_changes.d.ts +6 -4
  417. package/node_modules/@usejunior/docx-core/dist/primitives/reject_changes.d.ts.map +1 -1
  418. package/node_modules/@usejunior/docx-core/dist/primitives/reject_changes.js +187 -91
  419. package/node_modules/@usejunior/docx-core/dist/primitives/reject_changes.js.map +1 -1
  420. package/node_modules/@usejunior/docx-core/dist/primitives/revision-parts.d.ts +7 -0
  421. package/node_modules/@usejunior/docx-core/dist/primitives/revision-parts.d.ts.map +1 -0
  422. package/node_modules/@usejunior/docx-core/dist/primitives/revision-parts.js +27 -0
  423. package/node_modules/@usejunior/docx-core/dist/primitives/revision-parts.js.map +1 -0
  424. package/node_modules/@usejunior/docx-core/dist/primitives/revision-vocabulary.d.ts +7 -0
  425. package/node_modules/@usejunior/docx-core/dist/primitives/revision-vocabulary.d.ts.map +1 -0
  426. package/node_modules/@usejunior/docx-core/dist/primitives/revision-vocabulary.js +39 -0
  427. package/node_modules/@usejunior/docx-core/dist/primitives/revision-vocabulary.js.map +1 -0
  428. package/node_modules/@usejunior/docx-core/dist/primitives/schema-corpus-capture.d.ts +19 -0
  429. package/node_modules/@usejunior/docx-core/dist/primitives/schema-corpus-capture.d.ts.map +1 -0
  430. package/node_modules/@usejunior/docx-core/dist/primitives/schema-corpus-capture.js +29 -0
  431. package/node_modules/@usejunior/docx-core/dist/primitives/schema-corpus-capture.js.map +1 -0
  432. package/node_modules/@usejunior/docx-core/dist/primitives/sectPrAudit.d.ts +19 -0
  433. package/node_modules/@usejunior/docx-core/dist/primitives/sectPrAudit.d.ts.map +1 -0
  434. package/node_modules/@usejunior/docx-core/dist/primitives/sectPrAudit.js +165 -0
  435. package/node_modules/@usejunior/docx-core/dist/primitives/sectPrAudit.js.map +1 -0
  436. package/node_modules/@usejunior/docx-core/dist/primitives/semantic_tags.d.ts +7 -0
  437. package/node_modules/@usejunior/docx-core/dist/primitives/semantic_tags.d.ts.map +1 -1
  438. package/node_modules/@usejunior/docx-core/dist/primitives/semantic_tags.js +23 -4
  439. package/node_modules/@usejunior/docx-core/dist/primitives/semantic_tags.js.map +1 -1
  440. package/node_modules/@usejunior/docx-core/dist/primitives/serialize_html.d.ts +37 -0
  441. package/node_modules/@usejunior/docx-core/dist/primitives/serialize_html.d.ts.map +1 -0
  442. package/node_modules/@usejunior/docx-core/dist/primitives/serialize_html.js +395 -0
  443. package/node_modules/@usejunior/docx-core/dist/primitives/serialize_html.js.map +1 -0
  444. package/node_modules/@usejunior/docx-core/dist/primitives/serialize_markdown.d.ts +16 -0
  445. package/node_modules/@usejunior/docx-core/dist/primitives/serialize_markdown.d.ts.map +1 -0
  446. package/node_modules/@usejunior/docx-core/dist/primitives/serialize_markdown.js +300 -0
  447. package/node_modules/@usejunior/docx-core/dist/primitives/serialize_markdown.js.map +1 -0
  448. package/node_modules/@usejunior/docx-core/dist/primitives/serialize_plaintext.d.ts +15 -0
  449. package/node_modules/@usejunior/docx-core/dist/primitives/serialize_plaintext.d.ts.map +1 -0
  450. package/node_modules/@usejunior/docx-core/dist/primitives/serialize_plaintext.js +154 -0
  451. package/node_modules/@usejunior/docx-core/dist/primitives/serialize_plaintext.js.map +1 -0
  452. package/node_modules/@usejunior/docx-core/dist/primitives/styles.d.ts +15 -0
  453. package/node_modules/@usejunior/docx-core/dist/primitives/styles.d.ts.map +1 -1
  454. package/node_modules/@usejunior/docx-core/dist/primitives/styles.js +33 -22
  455. package/node_modules/@usejunior/docx-core/dist/primitives/styles.js.map +1 -1
  456. package/node_modules/@usejunior/docx-core/dist/primitives/table_context.d.ts +19 -0
  457. package/node_modules/@usejunior/docx-core/dist/primitives/table_context.d.ts.map +1 -0
  458. package/node_modules/@usejunior/docx-core/dist/primitives/table_context.js +189 -0
  459. package/node_modules/@usejunior/docx-core/dist/primitives/table_context.js.map +1 -0
  460. package/node_modules/@usejunior/docx-core/dist/primitives/tables.d.ts.map +1 -1
  461. package/node_modules/@usejunior/docx-core/dist/primitives/tables.js +13 -3
  462. package/node_modules/@usejunior/docx-core/dist/primitives/tables.js.map +1 -1
  463. package/node_modules/@usejunior/docx-core/dist/primitives/text.d.ts +2 -1
  464. package/node_modules/@usejunior/docx-core/dist/primitives/text.d.ts.map +1 -1
  465. package/node_modules/@usejunior/docx-core/dist/primitives/text.js +116 -12
  466. package/node_modules/@usejunior/docx-core/dist/primitives/text.js.map +1 -1
  467. package/node_modules/@usejunior/docx-core/dist/primitives/track-changes-emitter.d.ts +148 -0
  468. package/node_modules/@usejunior/docx-core/dist/primitives/track-changes-emitter.d.ts.map +1 -0
  469. package/node_modules/@usejunior/docx-core/dist/primitives/track-changes-emitter.js +291 -0
  470. package/node_modules/@usejunior/docx-core/dist/primitives/track-changes-emitter.js.map +1 -0
  471. package/node_modules/@usejunior/docx-core/dist/primitives/validate_ai_revisions.d.ts +35 -0
  472. package/node_modules/@usejunior/docx-core/dist/primitives/validate_ai_revisions.d.ts.map +1 -0
  473. package/node_modules/@usejunior/docx-core/dist/primitives/validate_ai_revisions.js +323 -0
  474. package/node_modules/@usejunior/docx-core/dist/primitives/validate_ai_revisions.js.map +1 -0
  475. package/node_modules/@usejunior/docx-core/dist/primitives/xml-helpers.d.ts +29 -0
  476. package/node_modules/@usejunior/docx-core/dist/primitives/xml-helpers.d.ts.map +1 -0
  477. package/node_modules/@usejunior/docx-core/dist/primitives/xml-helpers.js +35 -0
  478. package/node_modules/@usejunior/docx-core/dist/primitives/xml-helpers.js.map +1 -0
  479. package/node_modules/@usejunior/docx-core/dist/primitives/xml.d.ts +5 -0
  480. package/node_modules/@usejunior/docx-core/dist/primitives/xml.d.ts.map +1 -1
  481. package/node_modules/@usejunior/docx-core/dist/primitives/xml.js +5 -0
  482. package/node_modules/@usejunior/docx-core/dist/primitives/xml.js.map +1 -1
  483. package/node_modules/@usejunior/docx-core/dist/primitives/zip.d.ts +1 -0
  484. package/node_modules/@usejunior/docx-core/dist/primitives/zip.d.ts.map +1 -1
  485. package/node_modules/@usejunior/docx-core/dist/primitives/zip.js +21 -3
  486. package/node_modules/@usejunior/docx-core/dist/primitives/zip.js.map +1 -1
  487. package/node_modules/@usejunior/docx-core/dist/shared/field-structure.d.ts +14 -0
  488. package/node_modules/@usejunior/docx-core/dist/shared/field-structure.d.ts.map +1 -0
  489. package/node_modules/@usejunior/docx-core/dist/shared/field-structure.js +166 -0
  490. package/node_modules/@usejunior/docx-core/dist/shared/field-structure.js.map +1 -0
  491. package/node_modules/@usejunior/docx-core/dist/shared/ooxml/namespaces.d.ts +4 -1
  492. package/node_modules/@usejunior/docx-core/dist/shared/ooxml/namespaces.d.ts.map +1 -1
  493. package/node_modules/@usejunior/docx-core/dist/shared/ooxml/namespaces.js +4 -1
  494. package/node_modules/@usejunior/docx-core/dist/shared/ooxml/namespaces.js.map +1 -1
  495. package/node_modules/@usejunior/docx-core/package.json +13 -9
  496. package/node_modules/@xmldom/xmldom/CHANGELOG.md +186 -70
  497. package/node_modules/@xmldom/xmldom/index.d.ts +144 -19
  498. package/node_modules/@xmldom/xmldom/lib/dom.js +705 -343
  499. package/node_modules/@xmldom/xmldom/lib/grammar.js +14 -0
  500. package/node_modules/@xmldom/xmldom/package.json +13 -10
  501. package/package.json +7 -7
  502. package/server.json +3 -3
  503. package/skills/{cloud-service-agreement → agreements/cloud-service-agreement}/SKILL.md +2 -2
  504. package/skills/{nda → agreements/cloud-service-agreement}/template-filling-execution.md +2 -2
  505. package/skills/{data-privacy-agreement → agreements/data-privacy-agreement}/SKILL.md +15 -4
  506. package/skills/{safe → agreements/data-privacy-agreement}/template-filling-execution.md +12 -6
  507. package/skills/{employment-contract → agreements/employment-contract}/SKILL.md +3 -3
  508. package/skills/{cloud-service-agreement → agreements/employment-contract}/template-filling-execution.md +12 -6
  509. package/skills/{nda → agreements/nda}/SKILL.md +2 -2
  510. package/skills/{open-agreements → agreements/nda}/template-filling-execution.md +12 -6
  511. package/skills/{open-agreements → agreements/open-agreements}/SKILL.md +13 -30
  512. package/skills/agreements/open-agreements/template-filling-execution.md +98 -0
  513. package/skills/{safe → agreements/safe}/SKILL.md +2 -2
  514. package/skills/agreements/safe/template-filling-execution.md +98 -0
  515. package/skills/{services-agreement → agreements/services-agreement}/SKILL.md +3 -3
  516. package/skills/agreements/services-agreement/template-filling-execution.md +98 -0
  517. package/skills/{venture-financing → agreements/venture-financing}/SKILL.md +3 -3
  518. package/skills/agreements/venture-financing/template-filling-execution.md +98 -0
  519. package/skills/{client-email → client-workflows/client-email}/SKILL.md +1 -1
  520. package/skills/{delaware-franchise-tax → client-workflows/delaware-franchise-tax}/SKILL.md +1 -1
  521. package/skills/{edit-docx-agreement → client-workflows/edit-docx-agreement}/SKILL.md +1 -1
  522. package/skills/{iso-27001-evidence-collection → compliance/iso-27001-evidence-collection}/SKILL.md +1 -1
  523. package/skills/{iso-27001-internal-audit → compliance/iso-27001-internal-audit}/SKILL.md +1 -1
  524. package/skills/{soc2-readiness → compliance/soc2-readiness}/SKILL.md +1 -1
  525. package/skills/{canonical-markdown-authoring → internal/canonical-markdown-authoring}/SKILL.md +2 -3
  526. package/skills/{recipe-quality-audit → internal/recipe-quality-audit}/SKILL.md +2 -1
  527. package/skills/{unit-test-philosophy → internal/unit-test-philosophy}/SKILL.md +2 -0
  528. package/skills/legal-explainers/data-privacy-law-explainer/CONTRIBUTING.md +7 -0
  529. package/skills/legal-explainers/data-privacy-law-explainer/LICENSE +269 -0
  530. package/skills/legal-explainers/data-privacy-law-explainer/NOTICE +7 -0
  531. package/skills/legal-explainers/data-privacy-law-explainer/SKILL.md +113 -0
  532. package/skills/legal-explainers/data-privacy-law-explainer/content/alabama.md +211 -0
  533. package/skills/legal-explainers/data-privacy-law-explainer/content/alaska.md +155 -0
  534. package/skills/legal-explainers/data-privacy-law-explainer/content/arizona.md +181 -0
  535. package/skills/legal-explainers/data-privacy-law-explainer/content/arkansas.md +219 -0
  536. package/skills/legal-explainers/data-privacy-law-explainer/content/california.md +107 -0
  537. package/skills/legal-explainers/data-privacy-law-explainer/content/colorado.md +87 -0
  538. package/skills/legal-explainers/data-privacy-law-explainer/content/connecticut.md +83 -0
  539. package/skills/legal-explainers/data-privacy-law-explainer/content/delaware.md +85 -0
  540. package/skills/legal-explainers/data-privacy-law-explainer/content/district-of-columbia.md +153 -0
  541. package/skills/legal-explainers/data-privacy-law-explainer/content/florida.md +234 -0
  542. package/skills/legal-explainers/data-privacy-law-explainer/content/georgia.md +149 -0
  543. package/skills/legal-explainers/data-privacy-law-explainer/content/hawaii.md +167 -0
  544. package/skills/legal-explainers/data-privacy-law-explainer/content/idaho.md +149 -0
  545. package/skills/legal-explainers/data-privacy-law-explainer/content/illinois.md +238 -0
  546. package/skills/legal-explainers/data-privacy-law-explainer/content/indiana.md +93 -0
  547. package/skills/legal-explainers/data-privacy-law-explainer/content/iowa.md +99 -0
  548. package/skills/legal-explainers/data-privacy-law-explainer/content/kansas.md +155 -0
  549. package/skills/legal-explainers/data-privacy-law-explainer/content/kentucky.md +87 -0
  550. package/skills/legal-explainers/data-privacy-law-explainer/content/louisiana.md +209 -0
  551. package/skills/legal-explainers/data-privacy-law-explainer/content/maine.md +163 -0
  552. package/skills/legal-explainers/data-privacy-law-explainer/content/maryland.md +85 -0
  553. package/skills/legal-explainers/data-privacy-law-explainer/content/massachusetts.md +260 -0
  554. package/skills/legal-explainers/data-privacy-law-explainer/content/michigan.md +175 -0
  555. package/skills/legal-explainers/data-privacy-law-explainer/content/minnesota.md +93 -0
  556. package/skills/legal-explainers/data-privacy-law-explainer/content/mississippi.md +132 -0
  557. package/skills/legal-explainers/data-privacy-law-explainer/content/missouri.md +179 -0
  558. package/skills/legal-explainers/data-privacy-law-explainer/content/montana.md +105 -0
  559. package/skills/legal-explainers/data-privacy-law-explainer/content/nebraska.md +83 -0
  560. package/skills/legal-explainers/data-privacy-law-explainer/content/nevada.md +212 -0
  561. package/skills/legal-explainers/data-privacy-law-explainer/content/new-hampshire.md +91 -0
  562. package/skills/legal-explainers/data-privacy-law-explainer/content/new-jersey.md +95 -0
  563. package/skills/legal-explainers/data-privacy-law-explainer/content/new-mexico.md +174 -0
  564. package/skills/legal-explainers/data-privacy-law-explainer/content/new-york.md +195 -0
  565. package/skills/legal-explainers/data-privacy-law-explainer/content/north-carolina.md +205 -0
  566. package/skills/legal-explainers/data-privacy-law-explainer/content/north-dakota.md +169 -0
  567. package/skills/legal-explainers/data-privacy-law-explainer/content/ohio.md +171 -0
  568. package/skills/legal-explainers/data-privacy-law-explainer/content/oklahoma.md +168 -0
  569. package/skills/legal-explainers/data-privacy-law-explainer/content/oregon.md +103 -0
  570. package/skills/legal-explainers/data-privacy-law-explainer/content/pennsylvania.md +99 -0
  571. package/skills/legal-explainers/data-privacy-law-explainer/content/rhode-island.md +93 -0
  572. package/skills/legal-explainers/data-privacy-law-explainer/content/south-carolina.md +175 -0
  573. package/skills/legal-explainers/data-privacy-law-explainer/content/south-dakota.md +176 -0
  574. package/skills/legal-explainers/data-privacy-law-explainer/content/tennessee.md +89 -0
  575. package/skills/legal-explainers/data-privacy-law-explainer/content/texas.md +89 -0
  576. package/skills/legal-explainers/data-privacy-law-explainer/content/utah.md +83 -0
  577. package/skills/legal-explainers/data-privacy-law-explainer/content/vermont.md +267 -0
  578. package/skills/legal-explainers/data-privacy-law-explainer/content/virginia.md +85 -0
  579. package/skills/legal-explainers/data-privacy-law-explainer/content/washington.md +247 -0
  580. package/skills/legal-explainers/data-privacy-law-explainer/content/west-virginia.md +141 -0
  581. package/skills/legal-explainers/data-privacy-law-explainer/content/wisconsin.md +156 -0
  582. package/skills/legal-explainers/data-privacy-law-explainer/content/wyoming.md +185 -0
  583. package/skills/legal-explainers/data-privacy-law-explainer/manifest.json +519 -0
  584. package/skills/legal-explainers/non-compete-contract-explainer/CONTRIBUTING.md +7 -0
  585. package/skills/legal-explainers/non-compete-contract-explainer/LICENSE +269 -0
  586. package/skills/legal-explainers/non-compete-contract-explainer/NOTICE +7 -0
  587. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/SKILL.md +1 -1
  588. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/alabama.md +5 -5
  589. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/alaska.md +5 -5
  590. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/american-samoa.md +6 -6
  591. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/arizona.md +6 -4
  592. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/arkansas.md +5 -5
  593. package/skills/legal-explainers/non-compete-contract-explainer/content/au.md +208 -0
  594. package/skills/legal-explainers/non-compete-contract-explainer/content/australian-capital-territory.md +220 -0
  595. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/california.md +5 -5
  596. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/cnmi.md +4 -4
  597. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/colorado.md +5 -5
  598. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/connecticut.md +5 -5
  599. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/delaware.md +7 -7
  600. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/district-of-columbia.md +5 -5
  601. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/florida.md +5 -5
  602. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/georgia.md +7 -7
  603. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/guam.md +4 -4
  604. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/hawaii.md +5 -5
  605. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/idaho.md +5 -5
  606. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/illinois.md +5 -5
  607. package/skills/{non-compete-contract-explainer/content/india.md → legal-explainers/non-compete-contract-explainer/content/in.md} +5 -5
  608. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/indiana.md +5 -5
  609. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/iowa.md +5 -5
  610. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/kansas.md +5 -5
  611. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/kentucky.md +5 -5
  612. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/louisiana.md +9 -9
  613. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/maine.md +6 -6
  614. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/maryland.md +5 -5
  615. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/massachusetts.md +5 -5
  616. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/michigan.md +5 -5
  617. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/minnesota.md +5 -5
  618. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/mississippi.md +5 -5
  619. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/missouri.md +5 -5
  620. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/montana.md +5 -5
  621. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/nebraska.md +5 -5
  622. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/nevada.md +5 -5
  623. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/new-hampshire.md +5 -5
  624. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/new-jersey.md +5 -5
  625. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/new-mexico.md +5 -5
  626. package/skills/legal-explainers/non-compete-contract-explainer/content/new-south-wales.md +218 -0
  627. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/new-york.md +5 -5
  628. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/north-carolina.md +5 -5
  629. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/north-dakota.md +5 -5
  630. package/skills/legal-explainers/non-compete-contract-explainer/content/northern-territory.md +214 -0
  631. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/ohio.md +5 -5
  632. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/oklahoma.md +5 -5
  633. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/oregon.md +12 -12
  634. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/pennsylvania.md +5 -5
  635. package/skills/{non-compete-contract-explainer/content/philippines.md → legal-explainers/non-compete-contract-explainer/content/ph.md} +5 -5
  636. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/puerto-rico.md +4 -4
  637. package/skills/legal-explainers/non-compete-contract-explainer/content/queensland.md +206 -0
  638. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/rhode-island.md +5 -5
  639. package/skills/{non-compete-contract-explainer/content/singapore.md → legal-explainers/non-compete-contract-explainer/content/sg.md} +5 -5
  640. package/skills/legal-explainers/non-compete-contract-explainer/content/south-australia.md +236 -0
  641. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/south-carolina.md +5 -5
  642. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/south-dakota.md +5 -5
  643. package/skills/legal-explainers/non-compete-contract-explainer/content/tasmania.md +224 -0
  644. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/tennessee.md +5 -5
  645. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/texas.md +5 -5
  646. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/utah.md +5 -5
  647. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/vermont.md +29 -11
  648. package/skills/legal-explainers/non-compete-contract-explainer/content/victoria.md +218 -0
  649. package/skills/{non-compete-contract-explainer/content/us-virgin-islands.md → legal-explainers/non-compete-contract-explainer/content/virgin-islands.md} +5 -5
  650. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/virginia.md +5 -5
  651. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/washington.md +5 -5
  652. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/west-virginia.md +5 -5
  653. package/skills/legal-explainers/non-compete-contract-explainer/content/western-australia.md +224 -0
  654. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/wisconsin.md +5 -5
  655. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/content/wyoming.md +19 -15
  656. package/skills/{non-compete-contract-explainer → legal-explainers/non-compete-contract-explainer}/manifest.json +225 -76
  657. package/content/templates/bonterms-mutual-nda/signing.yaml +0 -35
  658. package/dist/core/signing-config.d.ts +0 -46
  659. package/dist/core/signing-config.d.ts.map +0 -1
  660. package/dist/core/signing-config.js +0 -67
  661. package/dist/core/signing-config.js.map +0 -1
  662. package/skills/services-agreement/template-filling-execution.md +0 -81
  663. package/skills/shared/template-filling-execution.md +0 -92
  664. /package/skills/{cloud-service-agreement → agreements/cloud-service-agreement}/CONNECTORS.md +0 -0
  665. /package/skills/{data-privacy-agreement → agreements/data-privacy-agreement}/CONNECTORS.md +0 -0
  666. /package/skills/{employment-contract → agreements/employment-contract}/CONNECTORS.md +0 -0
  667. /package/skills/{nda → agreements/nda}/CONNECTORS.md +0 -0
  668. /package/skills/{open-agreements → agreements/open-agreements}/CONNECTORS.md +0 -0
  669. /package/skills/{safe → agreements/safe}/CONNECTORS.md +0 -0
  670. /package/skills/{services-agreement → agreements/services-agreement}/CONNECTORS.md +0 -0
  671. /package/skills/{venture-financing → agreements/venture-financing}/CONNECTORS.md +0 -0
  672. /package/skills/{delaware-franchise-tax → client-workflows/delaware-franchise-tax}/CONNECTORS.md +0 -0
  673. /package/skills/{delaware-franchise-tax → client-workflows/delaware-franchise-tax}/reference/ecorp-portal-playwright-notes.md +0 -0
  674. /package/skills/{delaware-franchise-tax → client-workflows/delaware-franchise-tax}/reference/faq.md +0 -0
  675. /package/skills/{delaware-franchise-tax → client-workflows/delaware-franchise-tax}/reference/filing-instructions.md +0 -0
  676. /package/skills/{delaware-franchise-tax → client-workflows/delaware-franchise-tax}/reference/tax-calculation.md +0 -0
  677. /package/skills/{edit-docx-agreement → client-workflows/edit-docx-agreement}/CONNECTORS.md +0 -0
  678. /package/skills/{iso-27001-evidence-collection → compliance/iso-27001-evidence-collection}/CONNECTORS.md +0 -0
  679. /package/skills/{iso-27001-evidence-collection → compliance/iso-27001-evidence-collection}/rules/api-exports.md +0 -0
  680. /package/skills/{iso-27001-evidence-collection → compliance/iso-27001-evidence-collection}/rules/evidence-types.md +0 -0
  681. /package/skills/{iso-27001-evidence-collection → compliance/iso-27001-evidence-collection}/rules/screenshot-guide.md +0 -0
  682. /package/skills/{iso-27001-internal-audit → compliance/iso-27001-internal-audit}/CONNECTORS.md +0 -0
  683. /package/skills/{iso-27001-internal-audit → compliance/iso-27001-internal-audit}/rules/access-control.md +0 -0
  684. /package/skills/{iso-27001-internal-audit → compliance/iso-27001-internal-audit}/rules/business-continuity.md +0 -0
  685. /package/skills/{iso-27001-internal-audit → compliance/iso-27001-internal-audit}/rules/change-management.md +0 -0
  686. /package/skills/{iso-27001-internal-audit → compliance/iso-27001-internal-audit}/rules/encryption.md +0 -0
  687. /package/skills/{iso-27001-internal-audit → compliance/iso-27001-internal-audit}/rules/incident-response.md +0 -0
  688. /package/skills/{iso-27001-internal-audit → compliance/iso-27001-internal-audit}/rules/isms-management.md +0 -0
  689. /package/skills/{iso-27001-internal-audit → compliance/iso-27001-internal-audit}/rules/logging-monitoring.md +0 -0
  690. /package/skills/{iso-27001-internal-audit → compliance/iso-27001-internal-audit}/rules/people-controls.md +0 -0
  691. /package/skills/{iso-27001-internal-audit → compliance/iso-27001-internal-audit}/rules/supplier-management.md +0 -0
  692. /package/skills/{soc2-readiness → compliance/soc2-readiness}/CONNECTORS.md +0 -0
  693. /package/skills/{soc2-readiness → compliance/soc2-readiness}/rules/change-vendor-management.md +0 -0
  694. /package/skills/{soc2-readiness → compliance/soc2-readiness}/rules/communication-info.md +0 -0
  695. /package/skills/{soc2-readiness → compliance/soc2-readiness}/rules/control-activities.md +0 -0
  696. /package/skills/{soc2-readiness → compliance/soc2-readiness}/rules/control-environment.md +0 -0
  697. /package/skills/{soc2-readiness → compliance/soc2-readiness}/rules/logical-access.md +0 -0
  698. /package/skills/{soc2-readiness → compliance/soc2-readiness}/rules/monitoring-activities.md +0 -0
  699. /package/skills/{soc2-readiness → compliance/soc2-readiness}/rules/optional-categories.md +0 -0
  700. /package/skills/{soc2-readiness → compliance/soc2-readiness}/rules/privacy-criteria.md +0 -0
  701. /package/skills/{soc2-readiness → compliance/soc2-readiness}/rules/risk-assessment.md +0 -0
  702. /package/skills/{soc2-readiness → compliance/soc2-readiness}/rules/system-operations.md +0 -0
  703. /package/skills/{canonical-markdown-authoring → internal/canonical-markdown-authoring}/CONNECTORS.md +0 -0
  704. /package/skills/{unit-test-philosophy → internal/unit-test-philosophy}/references/allure-test-spec-writing-guide.md +0 -0
@@ -21,6 +21,10 @@ import { modifyRevisedDocument, ContainerResolutionError } from './inPlaceModifi
21
21
  import { acceptAllChanges, rejectAllChanges, extractTextWithParagraphs, compareTexts, } from './trackChangesAcceptorAst.js';
22
22
  import { virtualizeNumberingLabels, DEFAULT_NUMBERING_OPTIONS, } from './numberingIntegration.js';
23
23
  import { premergeAdjacentRuns } from './premergeRuns.js';
24
+ export { hasFldCharInsideDel, validateFieldStructure, } from '../../shared/field-structure.js';
25
+ import { hasFldCharInsideDel, validateFieldStructure, } from '../../shared/field-structure.js';
26
+ import { AUXILIARY_PARTS, parseEntries, renumberCollidingAuxiliaryIds, restampCollidingCommentParaIds, } from './auxiliaryIdCollision.js';
27
+ import { maybeCaptureEmittedDocumentXml } from '../../primitives/schema-corpus-capture.js';
24
28
  function arraysEqual(a, b) {
25
29
  if (a.length !== b.length)
26
30
  return false;
@@ -215,70 +219,56 @@ function buildFailureSummary(failureDetails) {
215
219
  }
216
220
  return Object.keys(summary).length > 0 ? summary : undefined;
217
221
  }
222
+ // Declared above splitStories so the function body never observes an
223
+ // uninitialized binding under circular imports.
224
+ const serializer = new XMLSerializer();
218
225
  /**
219
- * Validate field structure integrity in document XML.
226
+ * Split a docx into per-story XML fragments for field-closure validation.
227
+ *
228
+ * Each footnote/endnote entry is treated as an isolated story: a complex
229
+ * field whose `begin` and `end` markers straddle stories breaks Word's
230
+ * field state machine. We therefore validate each `<w:footnote>` and
231
+ * `<w:endnote>` entry independently rather than treating the whole
232
+ * `footnotes.xml`/`endnotes.xml` as one stream.
233
+ *
234
+ * Accepts arrays of sidecar XMLs (one per source archive) so callers can
235
+ * validate the union of entries from every archive that may contribute to the
236
+ * final result. Step 12 of `compareDocumentsAtomizer` merges entries from a
237
+ * mode-dependent source archive into the base archive; passing both archives'
238
+ * sidecars guarantees that whichever path the merge takes, the entries it
239
+ * could publish have already been screened. Duplicates (same `w:id` in both
240
+ * archives) yield redundant but harmless validation work.
220
241
  *
221
- * Checks that fldChar begin/end are balanced and that w:instrText only
222
- * appears inside a proper field sequence (between begin and separate).
223
- * Orphaned instrText elements render as visible text in Word.
242
+ * Header/footer stories are not yet covered they require relationship
243
+ * walking to enumerate `headerN.xml`/`footerN.xml`.
244
+ *
245
+ * @conformance ECMA-376 edition 5, Part 4 § 17.16.5
246
+ * @see https://github.com/UseJunior/safe-docx/issues/212
224
247
  */
225
- function validateFieldStructure(documentXml) {
226
- const root = parseDocumentXml(documentXml);
227
- // Walk the document in order, tracking field nesting
228
- const allFldChars = findAllByTagName(root, 'w:fldChar');
229
- const allInstrTexts = findAllByTagName(root, 'w:instrText');
230
- // Quick balance check
231
- let begins = 0;
232
- let ends = 0;
233
- for (const fc of allFldChars) {
234
- const type = fc.getAttribute('w:fldCharType');
235
- if (type === 'begin')
236
- begins++;
237
- else if (type === 'end')
238
- ends++;
239
- }
240
- if (begins !== ends)
241
- return false;
242
- // Check that instrText elements are inside a field (between begin and separate).
243
- // Walk all elements in document order using a recursive scan.
244
- if (allInstrTexts.length === 0)
245
- return true; // No instrText, nothing to validate
246
- // Depth-first scan to check instrText placement
247
- let depth = 0;
248
- const pastSeparatorAtDepth = []; // track separator state per depth
249
- function scan(node) {
250
- for (let child = node.firstChild; child; child = child.nextSibling) {
251
- if (child.nodeType !== 1)
252
- continue; // skip non-elements
253
- const el = child;
254
- if (el.tagName === 'w:fldChar') {
255
- const type = el.getAttribute('w:fldCharType');
256
- if (type === 'begin') {
257
- depth++;
258
- pastSeparatorAtDepth[depth] = 0;
259
- }
260
- else if (type === 'separate') {
261
- if (depth > 0)
262
- pastSeparatorAtDepth[depth] = 1;
263
- }
264
- else if (type === 'end') {
265
- if (depth > 0)
266
- depth--;
267
- }
268
- }
269
- else if (el.tagName === 'w:instrText') {
270
- // instrText must be inside a field (depth > 0) and before the separator
271
- if (depth === 0 || pastSeparatorAtDepth[depth])
272
- return false;
248
+ export function splitStories(documentXml, footnotesXmls, endnotesXmls) {
249
+ const stories = [{ label: 'document', xml: documentXml }];
250
+ const collectEntries = (sidecars, entryTag, labelPrefix) => {
251
+ for (let s = 0; s < sidecars.length; s++) {
252
+ const sidecarXml = sidecars[s];
253
+ if (!sidecarXml)
254
+ continue;
255
+ const doc = parseXml(sidecarXml);
256
+ const entries = doc.getElementsByTagName(entryTag);
257
+ for (let i = 0; i < entries.length; i++) {
258
+ const entry = entries[i];
259
+ const id = entry.getAttribute('w:id') ?? String(i);
260
+ stories.push({
261
+ label: `${labelPrefix}[${s}]:${id}`,
262
+ xml: serializer.serializeToString(entry),
263
+ });
273
264
  }
274
- if (!scan(el))
275
- return false;
276
265
  }
277
- return true;
278
- }
279
- return scan(root);
266
+ };
267
+ collectEntries(footnotesXmls, 'w:footnote', 'footnote');
268
+ collectEntries(endnotesXmls, 'w:endnote', 'endnote');
269
+ return stories;
280
270
  }
281
- function evaluateSafetyChecks(originalTextForRoundTrip, revisedTextForRoundTrip, originalBookmarkDiagnostics, revisedBookmarkDiagnostics, candidateXml) {
271
+ function evaluateSafetyChecks(originalTextForRoundTrip, revisedTextForRoundTrip, originalBookmarkDiagnostics, revisedBookmarkDiagnostics, candidateXml, auxiliarySidecars) {
282
272
  const acceptedXml = acceptAllChanges(candidateXml);
283
273
  const rejectedXml = rejectAllChanges(candidateXml);
284
274
  const acceptedText = extractTextWithParagraphs(acceptedXml);
@@ -289,11 +279,28 @@ function evaluateSafetyChecks(originalTextForRoundTrip, revisedTextForRoundTrip,
289
279
  const rejectTextComparison = compareTexts(originalTextForRoundTrip, rejectedText);
290
280
  const acceptBookmarksOk = bookmarkDiagnosticsSemanticallyEqual(revisedBookmarkDiagnostics, acceptedBookmarkDiagnostics);
291
281
  const rejectBookmarksOk = bookmarkDiagnosticsSemanticallyEqual(originalBookmarkDiagnostics, rejectedBookmarkDiagnostics);
292
- // Validate field structure: after accept-all and reject-all, every
293
- // w:instrText must be inside a proper field sequence (between fldChar
294
- // begin and fldChar separate). Orphaned instrText renders as visible
295
- // text in Word.
296
- const fieldStructureOk = validateFieldStructure(acceptedXml) && validateFieldStructure(rejectedXml);
282
+ // Validate field structure per-story. Each footnote/endnote entry is its own
283
+ // ECMA-376 story; a complex field that crosses a story boundary breaks
284
+ // Word's field state machine even when global begin/end counts balance.
285
+ // Sidecars from BOTH archives are validated because Step 12's auxiliary-part
286
+ // merge picks its base and source archives by reconstruction mode (inplace
287
+ // base = revised; rebuild base = original) and validating only one side
288
+ // would miss field issues that would still ship in the merged result.
289
+ // `acceptAllChanges` / `rejectAllChanges` only transform document.xml, so
290
+ // the sidecar set is identical for both transforms.
291
+ const acceptedStories = splitStories(acceptedXml, auxiliarySidecars.footnotesXmls, auxiliarySidecars.endnotesXmls);
292
+ const rejectedStories = splitStories(rejectedXml, auxiliarySidecars.footnotesXmls, auxiliarySidecars.endnotesXmls);
293
+ // Issue #217 conformance gate on the COMBINED output: w:fldChar MUST NOT
294
+ // appear inside <w:del>. ECMA-376 Part 4 § 17.16.5 makes this fatal for
295
+ // Word's field state machine. The full validateFieldStructure check is run
296
+ // on the accept/reject projections (per-story); on the combined view we
297
+ // only gate the strict no-fldChar-in-del rule because some legacy emit
298
+ // paths (e.g. delInstrText inside <w:moveFrom>) are non-conformant in shape
299
+ // but out of scope for #217.
300
+ const combinedNoFldCharInDel = !hasFldCharInsideDel(candidateXml);
301
+ const fieldStructureOk = combinedNoFldCharInDel &&
302
+ validateFieldStructure(acceptedStories) &&
303
+ validateFieldStructure(rejectedStories);
297
304
  const checks = {
298
305
  acceptText: acceptTextComparison.normalizedIdentical,
299
306
  rejectText: rejectTextComparison.normalizedIdentical,
@@ -369,12 +376,36 @@ export async function compareDocumentsAtomizer(original, revised, options = {})
369
376
  // Step 1: Load DOCX archives
370
377
  const originalArchive = await DocxArchive.load(original);
371
378
  const revisedArchive = await DocxArchive.load(revised);
379
+ // Step 1b: Resolve auxiliary ID collisions. When both sides define
380
+ // different content under the same comment/footnote/endnote w:id or the
381
+ // same comment paraId, rewrite the revised side so no anchor or ancillary
382
+ // row in the merged output can bind to the other document's definition.
383
+ // Must run before any document.xml extraction so every downstream step sees
384
+ // the rewritten archive.
385
+ await renumberCollidingAuxiliaryIds(originalArchive, revisedArchive);
386
+ await restampCollidingCommentParaIds(originalArchive, revisedArchive);
372
387
  // Step 2: Extract document.xml
373
388
  const originalXml = await originalArchive.getDocumentXml();
374
389
  const revisedXml = await revisedArchive.getDocumentXml();
375
390
  // Extract numbering.xml if available
376
391
  const originalNumberingXml = await originalArchive.getNumberingXml() ?? undefined;
377
392
  const revisedNumberingXml = await revisedArchive.getNumberingXml() ?? undefined;
393
+ // Extract footnote/endnote sidecars from BOTH archives for per-story
394
+ // field-closure validation (issue #212). Step 12 picks the base archive by
395
+ // reconstruction mode (inplace = revised, rebuild = original) and merges
396
+ // missing referenced entries from the opposite archive. Validating both
397
+ // archives' sidecars covers the union of entries that could ship without
398
+ // having to duplicate the merge logic at safety-check time.
399
+ const [originalFootnotesXml, originalEndnotesXml, revisedFootnotesXml, revisedEndnotesXml,] = await Promise.all([
400
+ originalArchive.getFile('word/footnotes.xml'),
401
+ originalArchive.getFile('word/endnotes.xml'),
402
+ revisedArchive.getFile('word/footnotes.xml'),
403
+ revisedArchive.getFile('word/endnotes.xml'),
404
+ ]);
405
+ const auxiliarySidecars = {
406
+ footnotesXmls: [originalFootnotesXml, revisedFootnotesXml],
407
+ endnotesXmls: [originalEndnotesXml, revisedEndnotesXml],
408
+ };
378
409
  const originalPart = {
379
410
  uri: 'word/document.xml',
380
411
  contentType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml',
@@ -383,8 +414,13 @@ export async function compareDocumentsAtomizer(original, revised, options = {})
383
414
  uri: 'word/document.xml',
384
415
  contentType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml',
385
416
  };
386
- const originalTextForRoundTrip = extractTextWithParagraphs(originalXml);
387
- const revisedTextForRoundTrip = extractTextWithParagraphs(revisedXml);
417
+ // Project each input through the SAME accept/reject operation the candidate is
418
+ // checked under, so the round-trip comparison is like-for-like even when an
419
+ // input already carries its own tracked changes (pre-tracked w:ins / w:del,
420
+ // comment anchors, multi-author stacks). For a clean input these equal the raw
421
+ // extraction, so behavior on the common case is unchanged. (#347)
422
+ const originalTextForRoundTrip = extractTextWithParagraphs(rejectAllChanges(originalXml));
423
+ const revisedTextForRoundTrip = extractTextWithParagraphs(acceptAllChanges(revisedXml));
388
424
  const originalBookmarkDiagnostics = collectBookmarkDiagnostics(originalXml);
389
425
  const revisedBookmarkDiagnostics = collectBookmarkDiagnostics(revisedXml);
390
426
  const runComparisonPass = (atomizeOptions, outputMode) => {
@@ -445,7 +481,7 @@ export async function compareDocumentsAtomizer(original, revised, options = {})
445
481
  }
446
482
  return { mergedAtoms, newDocumentXml, outputMode };
447
483
  };
448
- const evaluateRoundTripSafety = (candidateXml) => evaluateSafetyChecks(originalTextForRoundTrip, revisedTextForRoundTrip, originalBookmarkDiagnostics, revisedBookmarkDiagnostics, candidateXml);
484
+ const evaluateRoundTripSafety = (candidateXml) => evaluateSafetyChecks(originalTextForRoundTrip, revisedTextForRoundTrip, originalBookmarkDiagnostics, revisedBookmarkDiagnostics, candidateXml, auxiliarySidecars);
449
485
  let comparisonResult;
450
486
  let fallbackReason;
451
487
  let fallbackDiagnostics;
@@ -530,7 +566,7 @@ export async function compareDocumentsAtomizer(original, revised, options = {})
530
566
  comparisonResult = selected;
531
567
  }
532
568
  else {
533
- comparisonResult = runComparisonPass(undefined, 'rebuild');
569
+ comparisonResult = runComparisonPass({ atomizeParagraphLevelMarkers: true }, 'rebuild');
534
570
  fallbackReason = 'round_trip_safety_check_failed';
535
571
  fallbackDiagnostics = {
536
572
  attempts: failedAttempts,
@@ -538,34 +574,56 @@ export async function compareDocumentsAtomizer(original, revised, options = {})
538
574
  }
539
575
  }
540
576
  else {
541
- comparisonResult = runComparisonPass(undefined, 'rebuild');
577
+ comparisonResult = runComparisonPass({ atomizeParagraphLevelMarkers: true }, 'rebuild');
578
+ }
579
+ // Rebuild output gets the same safety screening as inplace attempts, whether
580
+ // rebuild was requested directly or reached via inplace fallback. Rebuild is
581
+ // the terminal strategy, so failures are surfaced in diagnostics rather than
582
+ // blocking the output.
583
+ // @see https://github.com/UseJunior/safe-docx/issues/226
584
+ let rebuildSafetyDiagnostics;
585
+ if (comparisonResult.outputMode === 'rebuild') {
586
+ const safety = evaluateRoundTripSafety(comparisonResult.newDocumentXml);
587
+ if (!safety.safe) {
588
+ rebuildSafetyDiagnostics = {
589
+ checks: safety.checks,
590
+ failedChecks: safety.failedChecks,
591
+ failureDetails: safety.failureDetails,
592
+ firstDiffSummary: safety.failureSummary,
593
+ };
594
+ }
542
595
  }
543
596
  const { mergedAtoms, newDocumentXml } = comparisonResult;
544
597
  // Step 12: Clone appropriate archive and update document.xml.
545
598
  // Use the revised archive only for true inplace output.
546
599
  const baseArchive = comparisonResult.outputMode === 'inplace' ? revisedArchive : originalArchive;
600
+ // The merge source is the *opposite* archive from the base: inplace pulls
601
+ // deleted-but-still-referenced definitions from the original, rebuild pulls
602
+ // added-but-still-referenced definitions from the revised. Without this,
603
+ // rebuild output ships dangling references when the original lacks an
604
+ // auxiliary part that the revised side introduced (issue #94).
605
+ const mergeSourceArchive = comparisonResult.outputMode === 'inplace' ? originalArchive : revisedArchive;
547
606
  const resultArchive = await baseArchive.clone();
607
+ maybeCaptureEmittedDocumentXml(newDocumentXml);
548
608
  resultArchive.setDocumentXml(newDocumentXml);
549
- // Step 12b: For inplace mode, merge auxiliary part definitions (footnotes,
550
- // endnotes, comments) from the original document. Inplace reconstruction
551
- // inserts deleted content that may reference definitions not present in the
552
- // revised archive.
553
- if (comparisonResult.outputMode === 'inplace') {
554
- const mergeResults = new Map();
555
- for (const descriptor of AUXILIARY_PARTS) {
556
- const result = await mergeAuxiliaryPartDefinitions(originalArchive, resultArchive, newDocumentXml, descriptor);
557
- if (result.mergedIds.size > 0) {
558
- mergeResults.set(descriptor.label, result);
559
- }
560
- }
561
- // Post-merge hook for comment ancillary parts
562
- if (mergeResults.has('comment')) {
563
- await mergeCommentAncillaryParts(originalArchive, resultArchive, mergeResults.get('comment'));
564
- }
609
+ // Step 12b: Merge auxiliary part definitions (footnotes, endnotes, comments).
610
+ // Reconstruction may insert content (deleted in inplace, added in rebuild)
611
+ // whose definitions are missing from the base archive.
612
+ for (const descriptor of AUXILIARY_PARTS) {
613
+ await mergeAuxiliaryPartDefinitions(mergeSourceArchive, resultArchive, newDocumentXml, descriptor);
614
+ }
615
+ // Comment-specific post-pass: walk reply threads via commentsExtended.xml.
616
+ // Gated on root comment IDs in the *result* document (not on what the
617
+ // generic merge appended), so the pass runs even when the original already
618
+ // contains the root and revised only adds replies under it (issue #108).
619
+ // Comments anchored on footnote/endnote text count as roots too.
620
+ const rootCommentIds = await collectStoryReferenceIds(resultArchive, newDocumentXml, 'w:commentReference', null);
621
+ if (rootCommentIds.size > 0) {
622
+ await mergeCommentAncillaryParts(mergeSourceArchive, resultArchive, rootCommentIds);
565
623
  }
566
624
  // Step 13: Save result and compute stats
567
625
  const resultBuffer = await resultArchive.save();
568
- const stats = computeStats(mergedAtoms);
626
+ const stats = computeAtomizerStats(mergedAtoms);
569
627
  return {
570
628
  document: resultBuffer,
571
629
  stats,
@@ -574,37 +632,29 @@ export async function compareDocumentsAtomizer(original, revised, options = {})
574
632
  reconstructionModeUsed: comparisonResult.outputMode,
575
633
  fallbackReason,
576
634
  fallbackDiagnostics,
635
+ rebuildSafetyDiagnostics,
577
636
  };
578
637
  }
579
- const AUXILIARY_PARTS = [
580
- {
581
- label: 'footnote',
582
- partPath: 'word/footnotes.xml',
583
- referenceTag: 'w:footnoteReference',
584
- entryTag: 'w:footnote',
585
- rootTag: 'w:footnotes',
586
- contentType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml',
587
- relationshipType: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes',
588
- },
589
- {
590
- label: 'endnote',
591
- partPath: 'word/endnotes.xml',
592
- referenceTag: 'w:endnoteReference',
593
- entryTag: 'w:endnote',
594
- rootTag: 'w:endnotes',
595
- contentType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml',
596
- relationshipType: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/endnotes',
597
- },
598
- {
599
- label: 'comment',
600
- partPath: 'word/comments.xml',
601
- referenceTag: 'w:commentReference',
602
- entryTag: 'w:comment',
603
- rootTag: 'w:comments',
604
- contentType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml',
605
- relationshipType: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments',
606
- },
607
- ];
638
+ /**
639
+ * Collect reference IDs across every result story that can host anchors: the
640
+ * merged document.xml plus the result archive's footnote/endnote parts (Word
641
+ * allows comments anchored on note text). `excludePartPath` skips the part
642
+ * whose own definitions are being merged — entries can't reference
643
+ * themselves.
644
+ */
645
+ async function collectStoryReferenceIds(resultArchive, documentXml, referenceTag, excludePartPath) {
646
+ const ids = collectReferenceIds(documentXml, referenceTag);
647
+ for (const storyPath of ['word/footnotes.xml', 'word/endnotes.xml']) {
648
+ if (storyPath === excludePartPath)
649
+ continue;
650
+ const storyXml = await resultArchive.getFile(storyPath);
651
+ if (!storyXml)
652
+ continue;
653
+ for (const id of collectReferenceIds(storyXml, referenceTag))
654
+ ids.add(id);
655
+ }
656
+ return ids;
657
+ }
608
658
  /**
609
659
  * Collect reference IDs from document.xml using DOM parsing.
610
660
  */
@@ -619,43 +669,33 @@ function collectReferenceIds(documentXml, referenceTag) {
619
669
  }
620
670
  return ids;
621
671
  }
622
- /**
623
- * Parse an auxiliary part and extract entry elements by ID.
624
- */
625
- function parseEntries(xml, entryTag) {
626
- const doc = parseXml(xml);
627
- const entries = new Map();
628
- const elements = doc.getElementsByTagName(entryTag);
629
- for (let i = 0; i < elements.length; i++) {
630
- const el = elements[i];
631
- const id = el.getAttribute('w:id');
632
- if (id)
633
- entries.set(id, el);
634
- }
635
- return { doc, entries };
636
- }
637
- const serializer = new XMLSerializer();
638
672
  /**
639
673
  * Merge auxiliary part definitions (footnotes, endnotes, comments) from the
640
- * original archive into the result archive. When inplace mode inserts deleted
641
- * content, the corresponding definitions must exist in the auxiliary part.
674
+ * source archive into the result archive. The source archive is whichever
675
+ * side reconstruction may have introduced references to: original in inplace
676
+ * mode (deleted-but-referenced definitions), revised in rebuild mode
677
+ * (added-but-referenced definitions).
642
678
  */
643
- async function mergeAuxiliaryPartDefinitions(originalArchive, resultArchive, documentXml, descriptor) {
679
+ async function mergeAuxiliaryPartDefinitions(sourceArchive, resultArchive, documentXml, descriptor) {
644
680
  const result = { mergedIds: new Set(), createdPart: false };
645
- const referencedIds = collectReferenceIds(documentXml, descriptor.referenceTag);
681
+ // Anchors may live in the merged body or on note text in the result's
682
+ // footnote/endnote stories. AUXILIARY_PARTS merges notes before comments,
683
+ // so by the comment pass the note stories already carry any merged-in
684
+ // comment anchors.
685
+ const referencedIds = await collectStoryReferenceIds(resultArchive, documentXml, descriptor.referenceTag, descriptor.partPath);
646
686
  if (referencedIds.size === 0)
647
687
  return result;
648
- const originalPartXml = await originalArchive.getFile(descriptor.partPath);
649
- if (!originalPartXml)
688
+ const sourcePartXml = await sourceArchive.getFile(descriptor.partPath);
689
+ if (!sourcePartXml)
650
690
  return result;
651
691
  const resultPartXml = await resultArchive.getFile(descriptor.partPath);
652
- const originalParsed = parseEntries(originalPartXml, descriptor.entryTag);
692
+ const sourceParsed = parseEntries(sourcePartXml, descriptor.entryTag);
653
693
  const resultParsed = resultPartXml ? parseEntries(resultPartXml, descriptor.entryTag) : null;
654
694
  // Find missing entries: referenced in document.xml but not in result
655
695
  const missingElements = [];
656
696
  for (const id of referencedIds) {
657
- if (!(resultParsed?.entries.has(id)) && originalParsed.entries.has(id)) {
658
- missingElements.push(originalParsed.entries.get(id));
697
+ if (!(resultParsed?.entries.has(id)) && sourceParsed.entries.has(id)) {
698
+ missingElements.push(sourceParsed.entries.get(id));
659
699
  result.mergedIds.add(id);
660
700
  }
661
701
  }
@@ -673,27 +713,33 @@ async function mergeAuxiliaryPartDefinitions(originalArchive, resultArchive, doc
673
713
  }
674
714
  }
675
715
  else {
676
- // Create part from scratch: clone root from original, insert missing entries
677
- const newDoc = parseXml(originalPartXml);
716
+ // Create part from scratch: clone root from merge source, drop every
717
+ // non-reserved entry, then append the missing referenced ones.
718
+ // Reserved entries are footnote/endnote separators identified by
719
+ // w:type="separator" / w:type="continuationSeparator" — Word expects
720
+ // them to exist and they don't carry user content. Filtering by w:type
721
+ // (not by magic w:id values) keeps this robust across authoring tools.
722
+ const newDoc = parseXml(sourcePartXml);
678
723
  const rootEl = newDoc.getElementsByTagName(descriptor.rootTag)[0];
679
724
  if (rootEl) {
680
- // Remove all existing entries — we only want the missing ones
681
725
  const existingEntries = rootEl.getElementsByTagName(descriptor.entryTag);
682
726
  const toRemove = [];
683
727
  for (let i = 0; i < existingEntries.length; i++) {
684
- toRemove.push(existingEntries[i]);
728
+ const el = existingEntries[i];
729
+ const type = el.getAttribute('w:type');
730
+ if (type !== 'separator' && type !== 'continuationSeparator') {
731
+ toRemove.push(el);
732
+ }
685
733
  }
686
734
  for (const el of toRemove) {
687
735
  rootEl.removeChild(el);
688
736
  }
689
- // Add back only the missing entries
690
737
  for (const el of missingElements) {
691
738
  const imported = newDoc.importNode(el, true);
692
739
  rootEl.appendChild(imported);
693
740
  }
694
741
  resultArchive.setFile(descriptor.partPath, serializer.serializeToString(newDoc));
695
742
  result.createdPart = true;
696
- // Bootstrap OPC metadata for the newly created part
697
743
  await ensureOpcMetadata(resultArchive, descriptor);
698
744
  }
699
745
  }
@@ -765,52 +811,154 @@ async function ensureOpcMetadata(archive, descriptor) {
765
811
  // Comment Ancillary Parts Merging
766
812
  // =============================================================================
767
813
  /**
768
- * After merging comment definitions, copy related entries from
769
- * commentsExtended.xml and people.xml for author fidelity and reply threading.
814
+ * Walk the comment reply graph from each root referenced in the result
815
+ * document, merging reply <w:comment> entries, their commentsExtended.xml
816
+ * threading entries, and people.xml authors. Replies have no
817
+ * <w:commentReference> in document.xml — they're discoverable only via
818
+ * w15:paraIdParent in commentsExtended.xml. Without this expansion, rebuild
819
+ * mode silently drops reply threads (issue #108).
770
820
  */
771
- async function mergeCommentAncillaryParts(originalArchive, resultArchive, commentMergeResult) {
772
- // Collect authors and paraIds from the merged comment entries
773
- const originalCommentsXml = await originalArchive.getFile('word/comments.xml');
774
- if (!originalCommentsXml)
821
+ async function mergeCommentAncillaryParts(sourceArchive, resultArchive, rootCommentIds) {
822
+ const sourceCommentsXml = await sourceArchive.getFile('word/comments.xml');
823
+ if (!sourceCommentsXml)
775
824
  return;
776
- const origDoc = parseXml(originalCommentsXml);
777
- const mergedAuthors = new Set();
778
- const mergedParaIds = new Set();
779
- const commentEls = origDoc.getElementsByTagName('w:comment');
780
- for (let i = 0; i < commentEls.length; i++) {
781
- const el = commentEls[i];
825
+ const sourceDoc = parseXml(sourceCommentsXml);
826
+ // Build full source comment maps. Canonical paraId is the first <w:p>
827
+ // child's w14:paraId, matching getCommentElParaId() in primitives/comments.ts.
828
+ const commentById = new Map();
829
+ const paraIdByCommentId = new Map();
830
+ const commentIdByParaId = new Map();
831
+ const authorByCommentId = new Map();
832
+ const allCommentEls = sourceDoc.getElementsByTagName('w:comment');
833
+ for (let i = 0; i < allCommentEls.length; i++) {
834
+ const el = allCommentEls[i];
782
835
  const id = el.getAttribute('w:id');
783
- if (!id || !commentMergeResult.mergedIds.has(id))
836
+ if (!id)
784
837
  continue;
838
+ commentById.set(id, el);
785
839
  const author = el.getAttribute('w:author');
786
840
  if (author)
787
- mergedAuthors.add(author);
788
- // Collect paraIds from <w:p> children inside the comment
789
- const paras = el.getElementsByTagName('w:p');
790
- for (let j = 0; j < paras.length; j++) {
791
- const p = paras[j];
792
- const paraId = p.getAttribute('w14:paraId');
793
- if (paraId)
794
- mergedParaIds.add(paraId);
795
- }
796
- }
797
- // Merge commentsExtended.xml entries matching merged paraIds
798
- await mergeCommentsExtended(originalArchive, resultArchive, mergedParaIds);
799
- // Merge people.xml entries matching merged authors
800
- await mergePeople(originalArchive, resultArchive, mergedAuthors);
841
+ authorByCommentId.set(id, author);
842
+ const firstP = el.getElementsByTagName('w:p')[0];
843
+ const paraId = firstP?.getAttribute('w14:paraId');
844
+ if (paraId) {
845
+ paraIdByCommentId.set(id, paraId);
846
+ commentIdByParaId.set(paraId, id);
847
+ }
848
+ }
849
+ // Seed inclusion sets from the root IDs that appear in the result document.
850
+ const includedCommentIds = new Set();
851
+ const includedParaIds = new Set();
852
+ const includedAuthors = new Set();
853
+ for (const id of rootCommentIds) {
854
+ if (!commentById.has(id))
855
+ continue;
856
+ includedCommentIds.add(id);
857
+ const pid = paraIdByCommentId.get(id);
858
+ if (pid)
859
+ includedParaIds.add(pid);
860
+ const author = authorByCommentId.get(id);
861
+ if (author)
862
+ includedAuthors.add(author);
863
+ }
864
+ // BFS over commentsExtended.xml's paraIdParent graph from each included
865
+ // root paraId. Skip entries that don't resolve to a real source comment so
866
+ // we never pull in dangling commentEx/people without a backing definition.
867
+ const sourceExtendedXml = await sourceArchive.getFile('word/commentsExtended.xml');
868
+ if (sourceExtendedXml) {
869
+ const exDoc = parseXml(sourceExtendedXml);
870
+ const exEls = exDoc.getElementsByTagName('w15:commentEx');
871
+ const childrenOf = new Map();
872
+ for (let i = 0; i < exEls.length; i++) {
873
+ const ex = exEls[i];
874
+ const childPid = ex.getAttribute('w15:paraId');
875
+ const parentPid = ex.getAttribute('w15:paraIdParent');
876
+ if (!childPid || !parentPid)
877
+ continue;
878
+ const arr = childrenOf.get(parentPid);
879
+ if (arr)
880
+ arr.push(childPid);
881
+ else
882
+ childrenOf.set(parentPid, [childPid]);
883
+ }
884
+ const queue = [...includedParaIds];
885
+ while (queue.length > 0) {
886
+ const pid = queue.shift();
887
+ const children = childrenOf.get(pid);
888
+ if (!children)
889
+ continue;
890
+ for (const childPid of children) {
891
+ if (includedParaIds.has(childPid))
892
+ continue;
893
+ const childCommentId = commentIdByParaId.get(childPid);
894
+ if (!childCommentId)
895
+ continue;
896
+ includedParaIds.add(childPid);
897
+ includedCommentIds.add(childCommentId);
898
+ const author = authorByCommentId.get(childCommentId);
899
+ if (author)
900
+ includedAuthors.add(author);
901
+ queue.push(childPid);
902
+ }
903
+ }
904
+ }
905
+ // Append any reply <w:comment> definitions still missing from result.
906
+ // The generic merge already added roots when needed; we add the replies
907
+ // (and any roots not yet present in the result, defensively).
908
+ await mergeMissingCommentDefinitions(resultArchive, commentById, includedCommentIds);
909
+ // Merge commentsExtended and people for the expanded set.
910
+ await mergeCommentsExtended(sourceArchive, resultArchive, includedParaIds);
911
+ await mergePeople(sourceArchive, resultArchive, includedAuthors);
801
912
  }
802
- async function mergeCommentsExtended(originalArchive, resultArchive, mergedParaIds) {
913
+ /**
914
+ * Append any source <w:comment> definitions in `includedCommentIds` that
915
+ * aren't already in result/word/comments.xml. Mirrors the append-with-importNode
916
+ * pattern used by mergeCommentsExtended below.
917
+ */
918
+ async function mergeMissingCommentDefinitions(resultArchive, commentById, includedCommentIds) {
919
+ if (includedCommentIds.size === 0)
920
+ return;
921
+ const resultXml = await resultArchive.getFile('word/comments.xml');
922
+ if (!resultXml) {
923
+ // If result has no comments.xml at all, the generic merge would have
924
+ // bootstrapped it for any included root. Nothing to do here.
925
+ return;
926
+ }
927
+ const resultDoc = parseXml(resultXml);
928
+ const rootEl = resultDoc.documentElement;
929
+ const existingIds = new Set();
930
+ const existing = rootEl.getElementsByTagName('w:comment');
931
+ for (let i = 0; i < existing.length; i++) {
932
+ const id = existing[i].getAttribute('w:id');
933
+ if (id)
934
+ existingIds.add(id);
935
+ }
936
+ let appended = false;
937
+ for (const id of includedCommentIds) {
938
+ if (existingIds.has(id))
939
+ continue;
940
+ const sourceEl = commentById.get(id);
941
+ if (!sourceEl)
942
+ continue;
943
+ rootEl.appendChild(resultDoc.importNode(sourceEl, true));
944
+ appended = true;
945
+ }
946
+ if (appended) {
947
+ resultArchive.setFile('word/comments.xml', serializer.serializeToString(resultDoc));
948
+ }
949
+ }
950
+ async function mergeCommentsExtended(sourceArchive, resultArchive, mergedParaIds) {
803
951
  if (mergedParaIds.size === 0)
804
952
  return;
805
- const originalXml = await originalArchive.getFile('word/commentsExtended.xml');
806
- if (!originalXml)
953
+ const sourceXml = await sourceArchive.getFile('word/commentsExtended.xml');
954
+ if (!sourceXml)
807
955
  return;
808
- const origDoc = parseXml(originalXml);
809
- const origEntries = origDoc.getElementsByTagName('w15:commentEx');
956
+ const sourceDoc = parseXml(sourceXml);
957
+ const sourceEntries = sourceDoc.getElementsByTagName('w15:commentEx');
810
958
  // Collect entries whose paraId matches a merged comment's paragraph
811
959
  const entriesToMerge = [];
812
- for (let i = 0; i < origEntries.length; i++) {
813
- const el = origEntries[i];
960
+ for (let i = 0; i < sourceEntries.length; i++) {
961
+ const el = sourceEntries[i];
814
962
  const paraId = el.getAttribute('w15:paraId');
815
963
  if (paraId && mergedParaIds.has(paraId)) {
816
964
  entriesToMerge.push(el);
@@ -818,11 +966,10 @@ async function mergeCommentsExtended(originalArchive, resultArchive, mergedParaI
818
966
  }
819
967
  if (entriesToMerge.length === 0)
820
968
  return;
821
- let resultXml = await resultArchive.getFile('word/commentsExtended.xml');
969
+ const resultXml = await resultArchive.getFile('word/commentsExtended.xml');
822
970
  if (resultXml) {
823
971
  const resultDoc = parseXml(resultXml);
824
972
  const rootEl = resultDoc.documentElement;
825
- // Check existing paraIds to avoid duplicates
826
973
  const existingParaIds = new Set();
827
974
  const existing = rootEl.getElementsByTagName('w15:commentEx');
828
975
  for (let i = 0; i < existing.length; i++) {
@@ -837,21 +984,57 @@ async function mergeCommentsExtended(originalArchive, resultArchive, mergedParaI
837
984
  }
838
985
  }
839
986
  resultArchive.setFile('word/commentsExtended.xml', serializer.serializeToString(resultDoc));
987
+ return;
840
988
  }
841
- // If commentsExtended.xml doesn't exist in result, we don't create it —
842
- // the file is optional and its absence won't cause crashes.
989
+ // Bootstrap: result lacks commentsExtended.xml but the merged comments
990
+ // depend on it for reply threading / done state. Clone the source's root
991
+ // (preserves namespaces), drop non-matching entries, then add OPC metadata.
992
+ const newDoc = parseXml(sourceXml);
993
+ const newRoot = newDoc.documentElement;
994
+ const allEntries = newRoot.getElementsByTagName('w15:commentEx');
995
+ const toRemove = [];
996
+ for (let i = 0; i < allEntries.length; i++) {
997
+ const el = allEntries[i];
998
+ const paraId = el.getAttribute('w15:paraId');
999
+ if (!paraId || !mergedParaIds.has(paraId))
1000
+ toRemove.push(el);
1001
+ }
1002
+ for (const el of toRemove)
1003
+ newRoot.removeChild(el);
1004
+ resultArchive.setFile('word/commentsExtended.xml', serializer.serializeToString(newDoc));
1005
+ await ensureOpcMetadata(resultArchive, COMMENTS_EXTENDED_DESCRIPTOR);
843
1006
  }
844
- async function mergePeople(originalArchive, resultArchive, mergedAuthors) {
1007
+ const COMMENTS_EXTENDED_DESCRIPTOR = {
1008
+ label: 'commentsExtended',
1009
+ partPath: 'word/commentsExtended.xml',
1010
+ referenceTag: '',
1011
+ entryTag: 'w15:commentEx',
1012
+ rootTag: 'w15:commentsEx',
1013
+ contentType: 'application/vnd.ms-word.commentsExtended+xml',
1014
+ relationshipType: 'http://schemas.microsoft.com/office/2011/relationships/commentsExtended',
1015
+ idBearingTags: [], // keyed by w15:paraId, not w:id
1016
+ };
1017
+ const PEOPLE_DESCRIPTOR = {
1018
+ label: 'people',
1019
+ partPath: 'word/people.xml',
1020
+ referenceTag: '',
1021
+ entryTag: 'w15:person',
1022
+ rootTag: 'w15:people',
1023
+ contentType: 'application/vnd.ms-word.people+xml',
1024
+ relationshipType: 'http://schemas.microsoft.com/office/2011/relationships/people',
1025
+ idBearingTags: [], // keyed by w15:author, not w:id
1026
+ };
1027
+ async function mergePeople(sourceArchive, resultArchive, mergedAuthors) {
845
1028
  if (mergedAuthors.size === 0)
846
1029
  return;
847
- const originalXml = await originalArchive.getFile('word/people.xml');
848
- if (!originalXml)
1030
+ const sourceXml = await sourceArchive.getFile('word/people.xml');
1031
+ if (!sourceXml)
849
1032
  return;
850
- const origDoc = parseXml(originalXml);
851
- const origPersons = origDoc.getElementsByTagName('w15:person');
1033
+ const sourceDoc = parseXml(sourceXml);
1034
+ const sourcePersons = sourceDoc.getElementsByTagName('w15:person');
852
1035
  const personsToMerge = [];
853
- for (let i = 0; i < origPersons.length; i++) {
854
- const el = origPersons[i];
1036
+ for (let i = 0; i < sourcePersons.length; i++) {
1037
+ const el = sourcePersons[i];
855
1038
  const author = el.getAttribute('w15:author');
856
1039
  if (author && mergedAuthors.has(author)) {
857
1040
  personsToMerge.push(el);
@@ -859,11 +1042,10 @@ async function mergePeople(originalArchive, resultArchive, mergedAuthors) {
859
1042
  }
860
1043
  if (personsToMerge.length === 0)
861
1044
  return;
862
- let resultXml = await resultArchive.getFile('word/people.xml');
1045
+ const resultXml = await resultArchive.getFile('word/people.xml');
863
1046
  if (resultXml) {
864
1047
  const resultDoc = parseXml(resultXml);
865
1048
  const rootEl = resultDoc.documentElement;
866
- // Check existing authors to avoid duplicates
867
1049
  const existingAuthors = new Set();
868
1050
  const existing = rootEl.getElementsByTagName('w15:person');
869
1051
  for (let i = 0; i < existing.length; i++) {
@@ -878,51 +1060,101 @@ async function mergePeople(originalArchive, resultArchive, mergedAuthors) {
878
1060
  }
879
1061
  }
880
1062
  resultArchive.setFile('word/people.xml', serializer.serializeToString(resultDoc));
1063
+ return;
881
1064
  }
882
- // If people.xml doesn't exist in result, we don't create it —
883
- // the file is optional and its absence won't cause crashes.
1065
+ // Bootstrap: result lacks people.xml. Clone source root (preserves
1066
+ // namespaces), remove non-matching authors, then add OPC metadata.
1067
+ const newDoc = parseXml(sourceXml);
1068
+ const newRoot = newDoc.documentElement;
1069
+ const allPersons = newRoot.getElementsByTagName('w15:person');
1070
+ const toRemove = [];
1071
+ for (let i = 0; i < allPersons.length; i++) {
1072
+ const el = allPersons[i];
1073
+ const author = el.getAttribute('w15:author');
1074
+ if (!author || !mergedAuthors.has(author))
1075
+ toRemove.push(el);
1076
+ }
1077
+ for (const el of toRemove)
1078
+ newRoot.removeChild(el);
1079
+ resultArchive.setFile('word/people.xml', serializer.serializeToString(newDoc));
1080
+ await ensureOpcMetadata(resultArchive, PEOPLE_DESCRIPTOR);
1081
+ }
1082
+ const fallbackParagraphStatsKeys = new WeakMap();
1083
+ let nextFallbackParagraphStatsKey = 0;
1084
+ function paragraphStatsKey(atom) {
1085
+ if (atom.paragraphIndex !== undefined) {
1086
+ return `${atom.part.uri}:${atom.paragraphIndex}`;
1087
+ }
1088
+ const pAncestor = atom.ancestorElements.find((a) => a.tagName === 'w:p');
1089
+ if (!pAncestor)
1090
+ return undefined;
1091
+ let key = fallbackParagraphStatsKeys.get(pAncestor);
1092
+ if (!key) {
1093
+ key = `${atom.part.uri}:paragraph-ref:${nextFallbackParagraphStatsKey++}`;
1094
+ fallbackParagraphStatsKeys.set(pAncestor, key);
1095
+ }
1096
+ return key;
884
1097
  }
885
1098
  /**
886
1099
  * Compute comparison statistics from merged atoms.
1100
+ *
1101
+ * Range counts are contiguous same-status runs in the merged atom stream, scoped
1102
+ * to a paragraph. Atom counts remain available under explicit names for callers
1103
+ * that need the old granular benchmark signal.
887
1104
  */
888
- function computeStats(mergedAtoms) {
1105
+ export function computeAtomizerStats(mergedAtoms) {
889
1106
  const reconstructionStats = computeReconstructionStats(mergedAtoms);
890
- // Count unique paragraphs for modifications
891
- // A modification is when we have both deleted and inserted atoms in the same paragraph
892
- const modifiedParagraphs = new Set();
893
- let currentParagraph = '';
894
- let hasDeleted = false;
895
- let hasInserted = false;
1107
+ let insertedRanges = 0;
1108
+ let deletedRanges = 0;
1109
+ let formatChanges = 0;
1110
+ let previousRangeStatus = null;
1111
+ let previousRangeParagraph;
1112
+ const paragraphs = new Map();
896
1113
  for (const atom of mergedAtoms) {
897
- // Detect paragraph boundaries
898
- const pAncestor = atom.ancestorElements.find((a) => a.tagName === 'w:p');
899
- const paragraphId = pAncestor
900
- ? `${atom.part.uri}:${atom.ancestorElements.indexOf(pAncestor)}`
901
- : '';
902
- if (paragraphId !== currentParagraph) {
903
- // Check previous paragraph
904
- if (currentParagraph && hasDeleted && hasInserted) {
905
- modifiedParagraphs.add(currentParagraph);
1114
+ const paragraphKey = paragraphStatsKey(atom);
1115
+ const status = atom.correlationStatus;
1116
+ const rangeStatus = status === CorrelationStatus.Inserted ||
1117
+ status === CorrelationStatus.Deleted ||
1118
+ status === CorrelationStatus.FormatChanged
1119
+ ? status
1120
+ : null;
1121
+ if (rangeStatus) {
1122
+ if (rangeStatus !== previousRangeStatus || paragraphKey !== previousRangeParagraph) {
1123
+ if (rangeStatus === CorrelationStatus.Inserted)
1124
+ insertedRanges++;
1125
+ if (rangeStatus === CorrelationStatus.Deleted)
1126
+ deletedRanges++;
1127
+ if (rangeStatus === CorrelationStatus.FormatChanged)
1128
+ formatChanges++;
906
1129
  }
907
- currentParagraph = paragraphId;
908
- hasDeleted = false;
909
- hasInserted = false;
1130
+ previousRangeStatus = rangeStatus;
1131
+ previousRangeParagraph = paragraphKey;
910
1132
  }
911
- if (atom.correlationStatus === CorrelationStatus.Deleted) {
912
- hasDeleted = true;
1133
+ else {
1134
+ previousRangeStatus = null;
1135
+ previousRangeParagraph = undefined;
913
1136
  }
914
- else if (atom.correlationStatus === CorrelationStatus.Inserted) {
915
- hasInserted = true;
1137
+ if (paragraphKey && (status === CorrelationStatus.Deleted || status === CorrelationStatus.Inserted)) {
1138
+ const flags = paragraphs.get(paragraphKey) ?? { hasDeleted: false, hasInserted: false };
1139
+ if (status === CorrelationStatus.Deleted)
1140
+ flags.hasDeleted = true;
1141
+ if (status === CorrelationStatus.Inserted)
1142
+ flags.hasInserted = true;
1143
+ paragraphs.set(paragraphKey, flags);
916
1144
  }
917
1145
  }
918
- // Check last paragraph
919
- if (currentParagraph && hasDeleted && hasInserted) {
920
- modifiedParagraphs.add(currentParagraph);
921
- }
1146
+ const modifiedParagraphs = Array.from(paragraphs.values()).filter((flags) => flags.hasDeleted && flags.hasInserted).length;
922
1147
  return {
923
- insertions: reconstructionStats.insertions,
924
- deletions: reconstructionStats.deletions,
925
- modifications: modifiedParagraphs.size + reconstructionStats.formatChanges,
1148
+ insertions: insertedRanges,
1149
+ deletions: deletedRanges,
1150
+ modifications: modifiedParagraphs,
1151
+ insertedRanges,
1152
+ deletedRanges,
1153
+ insertedAtoms: reconstructionStats.insertions,
1154
+ deletedAtoms: reconstructionStats.deletions,
1155
+ modifiedParagraphs,
1156
+ formatChanges,
1157
+ formatChangeAtoms: reconstructionStats.formatChanges,
926
1158
  };
927
1159
  }
928
1160
  //# sourceMappingURL=pipeline.js.map