@stll/folio-core 0.52.0 → 0.53.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 (307) hide show
  1. package/README.md +23 -0
  2. package/dist/ai-edits/apply.d.ts +26 -1
  3. package/dist/ai-edits/apply.js +1519 -105
  4. package/dist/ai-edits/batch-claims.d.ts +130 -0
  5. package/dist/ai-edits/batch-claims.js +244 -0
  6. package/dist/ai-edits/blockRange.js +9 -3
  7. package/dist/ai-edits/character-boundaries.d.ts +43 -0
  8. package/dist/ai-edits/character-boundaries.js +95 -0
  9. package/dist/ai-edits/clean-text.d.ts +33 -3
  10. package/dist/ai-edits/clean-text.js +52 -6
  11. package/dist/ai-edits/comment-lifecycle.d.ts +18 -0
  12. package/dist/ai-edits/comment-lifecycle.js +52 -0
  13. package/dist/ai-edits/headless.d.ts +71 -7
  14. package/dist/ai-edits/headless.js +381 -41
  15. package/dist/ai-edits/index.d.ts +2 -1
  16. package/dist/ai-edits/index.js +2 -1
  17. package/dist/ai-edits/minimal-replacement.d.ts +21 -6
  18. package/dist/ai-edits/minimal-replacement.js +134 -15
  19. package/dist/ai-edits/newListNumbering.d.ts +23 -0
  20. package/dist/ai-edits/newListNumbering.js +94 -0
  21. package/dist/ai-edits/note-references.d.ts +96 -0
  22. package/dist/ai-edits/note-references.js +139 -0
  23. package/dist/ai-edits/pending-suggestions.d.ts +79 -0
  24. package/dist/ai-edits/pending-suggestions.js +306 -0
  25. package/dist/ai-edits/read.d.ts +1 -1
  26. package/dist/ai-edits/read.js +56 -43
  27. package/dist/ai-edits/result-validation.d.ts +29 -0
  28. package/dist/ai-edits/result-validation.js +164 -0
  29. package/dist/ai-edits/snapshot.d.ts +36 -3
  30. package/dist/ai-edits/snapshot.js +177 -23
  31. package/dist/ai-edits/table-cell-mutations.d.ts +1 -1
  32. package/dist/ai-edits/table-cell-mutations.js +4 -1
  33. package/dist/ai-edits/table-geometry.d.ts +1 -1
  34. package/dist/ai-edits/table-row-column-mutations.d.ts +38 -16
  35. package/dist/ai-edits/table-row-column-mutations.js +61 -26
  36. package/dist/ai-edits/types.d.ts +155 -16
  37. package/dist/compare/compare.d.ts +1 -1
  38. package/dist/compare/compare.js +65 -16
  39. package/dist/compare/content-alignment.js +13 -2
  40. package/dist/compare/content-types.d.ts +7 -0
  41. package/dist/compare/content.d.ts +4 -1
  42. package/dist/compare/content.js +6 -1
  43. package/dist/compare/formatting.js +2 -1
  44. package/dist/compare/inline-atoms.d.ts +21 -4
  45. package/dist/compare/inline-atoms.js +138 -16
  46. package/dist/compare/plan.js +10 -5
  47. package/dist/compare/scenario.js +14 -3
  48. package/dist/compare/section-boundary-properties.js +1 -1
  49. package/dist/compare/types.d.ts +4 -2
  50. package/dist/compare/types.js +2 -1
  51. package/dist/compare/verification.d.ts +1 -1
  52. package/dist/compare/verification.js +15 -3
  53. package/dist/controller/committedLayoutDiff.d.ts +25 -0
  54. package/dist/controller/committedLayoutDiff.js +71 -0
  55. package/dist/controller/contentControlWidgetController.d.ts +1 -1
  56. package/dist/controller/folioEditor.d.ts +1 -1
  57. package/dist/controller/fontReadiness.d.ts +70 -3
  58. package/dist/controller/fontReadiness.js +100 -10
  59. package/dist/controller/headerFooterEditorManager.js +6 -1
  60. package/dist/controller/layoutPipeline.d.ts +12 -10
  61. package/dist/controller/layoutPipeline.js +62 -9
  62. package/dist/controller/layoutRunOptions.d.ts +24 -0
  63. package/dist/controller/layoutRunOptions.js +17 -0
  64. package/dist/controller/layoutScheduler.d.ts +19 -14
  65. package/dist/controller/layoutScheduler.js +15 -12
  66. package/dist/controller/layoutSession.d.ts +26 -2
  67. package/dist/controller/layoutSession.js +1 -1
  68. package/dist/controller/noteEditorManager.js +8 -3
  69. package/dist/document-operations.d.ts +11 -2
  70. package/dist/document-operations.js +230 -21
  71. package/dist/docx/altChunk.d.ts +8 -0
  72. package/dist/docx/altChunk.js +17 -0
  73. package/dist/docx/attributeRemainder.d.ts +1 -1
  74. package/dist/docx/blockContentParser.d.ts +64 -1
  75. package/dist/docx/blockContentParser.js +17 -4
  76. package/dist/docx/blockCustomXmlShell.d.ts +7 -0
  77. package/dist/docx/blockCustomXmlShell.js +14 -0
  78. package/dist/docx/blockPlainText.js +7 -0
  79. package/dist/docx/commentAnchorIndex.js +1 -1
  80. package/dist/docx/commentRangeIntegrity.js +8 -3
  81. package/dist/docx/commentReferenceNormalization.js +1 -1
  82. package/dist/docx/commentReplyMarkers.js +20 -1
  83. package/dist/docx/compatibility.d.ts +1 -1
  84. package/dist/docx/compatibility.js +34 -13
  85. package/dist/docx/containerChildren.gen.d.ts +1 -1
  86. package/dist/docx/containerChildren.gen.js +1 -0
  87. package/dist/docx/documentParser.js +12 -12
  88. package/dist/docx/drawingIdNormalization.d.ts +3 -1
  89. package/dist/docx/drawingIdNormalization.js +6 -1
  90. package/dist/docx/ensureParaIds.js +119 -97
  91. package/dist/docx/footnoteParser.js +8 -4
  92. package/dist/docx/headerFooterParser.js +3 -3
  93. package/dist/docx/headerFooterReferenceNormalization.d.ts +20 -1
  94. package/dist/docx/headerFooterReferenceNormalization.js +52 -27
  95. package/dist/docx/hyperlinkParser.d.ts +1 -1
  96. package/dist/docx/index.d.ts +1 -1
  97. package/dist/docx/listNumberingInstances.d.ts +59 -0
  98. package/dist/docx/listNumberingInstances.js +249 -0
  99. package/dist/docx/normalizeBaseDirection.js +2 -1
  100. package/dist/docx/opaqueCarrier.d.ts +7 -0
  101. package/dist/docx/opaqueCarrier.js +38 -0
  102. package/dist/docx/packageParts.js +4 -1
  103. package/dist/docx/paragraphParser.js +91 -24
  104. package/dist/docx/paragraphPropertySource.d.ts +4 -2
  105. package/dist/docx/paragraphPropertySource.js +7 -1
  106. package/dist/docx/paragraphTraversal.js +1 -0
  107. package/dist/docx/parseWarningMessage.js +4 -1
  108. package/dist/docx/parser.js +173 -20
  109. package/dist/docx/rezip.js +27 -5
  110. package/dist/docx/sdtProperties.js +1 -1
  111. package/dist/docx/sdtPropertiesPatch.js +3 -0
  112. package/dist/docx/selectiveSave.js +16 -9
  113. package/dist/docx/selectiveXmlPatch.js +106 -37
  114. package/dist/docx/serializer/blockCustomXmlSerializer.d.ts +5 -0
  115. package/dist/docx/serializer/blockCustomXmlSerializer.js +4 -0
  116. package/dist/docx/serializer/documentSerializer.js +2 -0
  117. package/dist/docx/serializer/headerFooterSerializer.js +2 -0
  118. package/dist/docx/serializer/noteSerializer.js +3 -1
  119. package/dist/docx/serializer/paragraphSerializer.js +33 -9
  120. package/dist/docx/serializer/tableSerializer.js +25 -38
  121. package/dist/docx/server/createBilingualDocument.js +3 -3
  122. package/dist/docx/tableParser.d.ts +157 -1
  123. package/dist/docx/tableParser.js +89 -10
  124. package/dist/docx/textBoxParser.js +1 -1
  125. package/dist/docx/unzip.d.ts +2 -1
  126. package/dist/docx/unzip.js +1 -1
  127. package/dist/docx/wordprocessingPrefixes.d.ts +78 -0
  128. package/dist/docx/wordprocessingPrefixes.js +286 -0
  129. package/dist/i18n/messages/catalogs.gen.d.ts +136 -0
  130. package/dist/i18n/messages/catalogs.gen.js +153 -17
  131. package/dist/i18n/messages/messages.gen.d.ts +8 -0
  132. package/dist/internal/compare/inline-presentation.d.ts +2 -1
  133. package/dist/internal/compare/inline-presentation.js +11 -10
  134. package/dist/internal/headlessRevisionResolutionGuard.d.ts +2 -8
  135. package/dist/internal/headlessRevisionResolutionGuard.js +2 -11
  136. package/dist/internal/indexedPositionMap.d.ts +11 -0
  137. package/dist/internal/indexedPositionMap.js +42 -0
  138. package/dist/internal/pageBreakRunSourceDescendantIndex.js +2 -1
  139. package/dist/internal/revisionResolutionEdits.d.ts +13 -0
  140. package/dist/internal/revisionResolutionEdits.js +19 -0
  141. package/dist/internal/revisionResolutionInline.d.ts +24 -0
  142. package/dist/internal/{headlessRevisionResolution.js → revisionResolutionInline.js} +61 -43
  143. package/dist/internal/revisionResolutionStep.d.ts +34 -0
  144. package/dist/internal/revisionResolutionStep.js +282 -0
  145. package/dist/internal/revisionResolutionTracking.d.ts +11 -0
  146. package/dist/internal/revisionResolutionTracking.js +124 -0
  147. package/dist/internal/wholeStoryRevisionResolution.d.ts +56 -0
  148. package/dist/internal/wholeStoryRevisionResolution.js +530 -0
  149. package/dist/layout-bridge/convert/markupViewFlow.d.ts +20 -0
  150. package/dist/layout-bridge/convert/markupViewFlow.js +123 -0
  151. package/dist/layout-bridge/convert/tableConversion.js +1 -1
  152. package/dist/layout-bridge/convert/toFlowBlocks.js +10 -1
  153. package/dist/layout-engine/layoutInstrumentation.d.ts +9 -1
  154. package/dist/layout-engine/layoutInstrumentation.js +4 -1
  155. package/dist/layout-engine/measure/cache.d.ts +18 -1
  156. package/dist/layout-engine/measure/cache.js +31 -1
  157. package/dist/layout-engine/measure/font-metrics.worker.js +3 -7
  158. package/dist/layout-engine/measure/measureContainer.js +7 -47
  159. package/dist/layout-engine/measure/measureHelpers.d.ts +6 -1
  160. package/dist/layout-engine/measure/measureHelpers.js +22 -2
  161. package/dist/layout-engine/measure/measureWorker.js +2 -3
  162. package/dist/layout-engine/measure/measureWorkerProtocol.d.ts +6 -7
  163. package/dist/layout-engine/measure/measureWorkerProtocol.js +1 -2
  164. package/dist/layout-engine/types.d.ts +6 -0
  165. package/dist/layout-painter/renderPage.js +1 -0
  166. package/dist/layout-painter/renderParagraph.js +1 -1
  167. package/dist/managers/ContextMenuManager.js +5 -2
  168. package/dist/managers/types.d.ts +3 -0
  169. package/dist/markdown/fromMarkdown.js +2 -1
  170. package/dist/markdown/internals.d.ts +11 -1
  171. package/dist/markdown/internals.js +24 -3
  172. package/dist/markdown/renderBlock.js +39 -9
  173. package/dist/markdown/renderParagraph.d.ts +13 -1
  174. package/dist/markdown/renderParagraph.js +85 -38
  175. package/dist/markdown/renderRuns.js +3 -10
  176. package/dist/markdown/renderTable.js +24 -12
  177. package/dist/markdown/trailers.js +2 -2
  178. package/dist/markdown/types.d.ts +29 -7
  179. package/dist/paged-layout/incrementalMeasure.d.ts +1 -2
  180. package/dist/paged-layout/incrementalMeasure.js +1 -9
  181. package/dist/paged-layout/transactionDirtyRange.d.ts +1 -3
  182. package/dist/paged-layout/transactionDirtyRange.js +29 -41
  183. package/dist/panel-layout.d.ts +83 -0
  184. package/dist/panel-layout.js +96 -0
  185. package/dist/prosemirror/anchoredTextBoxes.d.ts +37 -0
  186. package/dist/prosemirror/anchoredTextBoxes.js +156 -0
  187. package/dist/prosemirror/attrs/index.d.ts +6 -2
  188. package/dist/prosemirror/attrs/index.js +172 -1
  189. package/dist/prosemirror/commands/comments.d.ts +7 -8
  190. package/dist/prosemirror/commands/comments.js +241 -207
  191. package/dist/prosemirror/commands/contentControls.d.ts +1 -1
  192. package/dist/prosemirror/commands/formatPainter.d.ts +1 -1
  193. package/dist/prosemirror/commands/formatting.d.ts +1 -1
  194. package/dist/prosemirror/commands/index.d.ts +2 -2
  195. package/dist/prosemirror/commands/index.js +2 -2
  196. package/dist/prosemirror/commands/paragraph.d.ts +7 -1
  197. package/dist/prosemirror/commands/paragraph.js +9 -1
  198. package/dist/prosemirror/commands/paragraphBookmarkJoin.d.ts +13 -0
  199. package/dist/prosemirror/commands/paragraphBookmarkJoin.js +22 -0
  200. package/dist/prosemirror/commands/pastePlainText.d.ts +1 -1
  201. package/dist/prosemirror/commands/resolveAllTableChanges.d.ts +40 -0
  202. package/dist/prosemirror/commands/resolveAllTableChanges.js +615 -0
  203. package/dist/prosemirror/commands/resolveNodePropertyChangeAttrs.d.ts +15 -0
  204. package/dist/prosemirror/commands/resolveNodePropertyChangeAttrs.js +46 -0
  205. package/dist/prosemirror/commands/resolveParagraphProperties.d.ts +16 -0
  206. package/dist/prosemirror/commands/resolveParagraphProperties.js +59 -0
  207. package/dist/prosemirror/commands/sectionBreak.js +2 -1
  208. package/dist/prosemirror/commands/tableCellMergeResolution.d.ts +8 -2
  209. package/dist/prosemirror/commands/tableCellMergeResolution.js +1 -1
  210. package/dist/prosemirror/contentControlRevisions.d.ts +1 -1
  211. package/dist/prosemirror/conversion/fromProseDoc.js +181 -31
  212. package/dist/prosemirror/conversion/toProseDoc.js +39 -4
  213. package/dist/prosemirror/emptyFieldResultRuns.d.ts +18 -0
  214. package/dist/prosemirror/emptyFieldResultRuns.js +33 -0
  215. package/dist/prosemirror/extensions/ExtensionManager.d.ts +1 -1
  216. package/dist/prosemirror/extensions/ExtensionManager.js +3 -1
  217. package/dist/prosemirror/extensions/StarterKit.js +3 -1
  218. package/dist/prosemirror/extensions/core/DocExtension.js +1 -1
  219. package/dist/prosemirror/extensions/core/ParagraphExtension.js +12 -0
  220. package/dist/prosemirror/extensions/features/BaseKeymapExtension.js +3 -0
  221. package/dist/prosemirror/extensions/features/ListExtension.js +161 -123
  222. package/dist/prosemirror/extensions/features/ParaIdAllocatorExtension.d.ts +19 -2
  223. package/dist/prosemirror/extensions/features/ParaIdAllocatorExtension.js +33 -20
  224. package/dist/prosemirror/extensions/features/ParagraphChangeTrackerExtension.d.ts +31 -2
  225. package/dist/prosemirror/extensions/features/ParagraphChangeTrackerExtension.js +270 -99
  226. package/dist/prosemirror/extensions/features/PasteCleanupExtension.js +3 -2
  227. package/dist/prosemirror/extensions/features/pasteCleanup.js +2 -1
  228. package/dist/prosemirror/extensions/features/pastedHtmlLists.d.ts +12 -0
  229. package/dist/prosemirror/extensions/features/pastedHtmlLists.js +126 -0
  230. package/dist/prosemirror/extensions/marks/FootnoteRefExtension.js +21 -5
  231. package/dist/prosemirror/extensions/marks/RunIdentityExtension.d.ts +21 -18
  232. package/dist/prosemirror/extensions/marks/RunIdentityExtension.js +37 -17
  233. package/dist/prosemirror/extensions/marks/markUtils.d.ts +7 -2
  234. package/dist/prosemirror/extensions/marks/markUtils.js +8 -2
  235. package/dist/prosemirror/extensions/marks/noteReferenceDeletion.d.ts +10 -0
  236. package/dist/prosemirror/extensions/marks/noteReferenceDeletion.js +35 -0
  237. package/dist/prosemirror/extensions/nodes/BlockCustomXmlExtension.d.ts +6 -0
  238. package/dist/prosemirror/extensions/nodes/BlockCustomXmlExtension.js +52 -0
  239. package/dist/prosemirror/extensions/nodes/FieldExtension.d.ts +3 -3
  240. package/dist/prosemirror/extensions/nodes/FieldExtension.js +50 -15
  241. package/dist/prosemirror/extensions/nodes/PreservedBlockExtension.js +4 -1
  242. package/dist/prosemirror/extensions/nodes/TableExtension.d.ts +1 -1
  243. package/dist/prosemirror/extensions/nodes/TableExtension.js +19 -18
  244. package/dist/prosemirror/extensions/types.d.ts +4 -1
  245. package/dist/prosemirror/findReplaceSelection.js +1 -1
  246. package/dist/prosemirror/index.d.ts +3 -2
  247. package/dist/prosemirror/index.js +3 -2
  248. package/dist/prosemirror/indexedNodeLookup.d.ts +17 -0
  249. package/dist/prosemirror/indexedNodeLookup.js +103 -0
  250. package/dist/prosemirror/listAutoformatMarkers.d.ts +19 -0
  251. package/dist/prosemirror/listAutoformatMarkers.js +98 -0
  252. package/dist/prosemirror/listInstanceReferences.d.ts +12 -0
  253. package/dist/prosemirror/listInstanceReferences.js +72 -0
  254. package/dist/prosemirror/listLabels.d.ts +24 -0
  255. package/dist/prosemirror/listLabels.js +111 -0
  256. package/dist/prosemirror/listNumbering.d.ts +110 -0
  257. package/dist/prosemirror/listNumbering.js +345 -0
  258. package/dist/prosemirror/listRenderingAttrs.d.ts +11 -2
  259. package/dist/prosemirror/listRenderingAttrs.js +8 -1
  260. package/dist/prosemirror/markupViewProjection.d.ts +95 -0
  261. package/dist/prosemirror/markupViewProjection.js +83 -0
  262. package/dist/prosemirror/numberingAttr.d.ts +9 -1
  263. package/dist/prosemirror/numberingAttr.js +9 -1
  264. package/dist/prosemirror/outlineLevelAttr.js +1 -1
  265. package/dist/prosemirror/paragraphIndentation.d.ts +10 -1
  266. package/dist/prosemirror/paragraphIndentation.js +29 -7
  267. package/dist/prosemirror/paragraphMarkJoin.d.ts +19 -0
  268. package/dist/prosemirror/paragraphMarkJoin.js +24 -0
  269. package/dist/prosemirror/plugins/createDocScanPlugin.d.ts +1 -1
  270. package/dist/prosemirror/plugins/documentNumbering.d.ts +27 -1
  271. package/dist/prosemirror/plugins/documentNumbering.js +97 -11
  272. package/dist/prosemirror/plugins/documentStyles.d.ts +10 -1
  273. package/dist/prosemirror/plugins/documentStyles.js +14 -1
  274. package/dist/prosemirror/plugins/suggestionMode.d.ts +16 -2
  275. package/dist/prosemirror/plugins/suggestionMode.js +116 -52
  276. package/dist/prosemirror/plugins/templateDirectives.d.ts +1 -1
  277. package/dist/prosemirror/plugins/transactionInvariants.d.ts +32 -0
  278. package/dist/prosemirror/plugins/transactionInvariants.js +86 -0
  279. package/dist/prosemirror/positionSweep.d.ts +24 -0
  280. package/dist/prosemirror/positionSweep.js +222 -0
  281. package/dist/prosemirror/rebaseParagraphRunFormatting.d.ts +1 -1
  282. package/dist/prosemirror/rejoinRunCarriers.d.ts +1 -1
  283. package/dist/prosemirror/replacedAnnotations.d.ts +33 -1
  284. package/dist/prosemirror/replacedAnnotations.js +170 -1
  285. package/dist/prosemirror/runFormattingInlineCarriers.d.ts +1 -1
  286. package/dist/prosemirror/schema/index.d.ts +2 -2
  287. package/dist/prosemirror/schema/index.js +3 -0
  288. package/dist/prosemirror/schema/nodes.d.ts +42 -11
  289. package/dist/prosemirror/sectionMarkEdits.d.ts +20 -0
  290. package/dist/prosemirror/sectionMarkEdits.js +59 -0
  291. package/dist/prosemirror/storyListNumbering.d.ts +17 -0
  292. package/dist/prosemirror/storyListNumbering.js +102 -0
  293. package/dist/prosemirror/tableGridMutation.d.ts +48 -2
  294. package/dist/prosemirror/tableGridMutation.js +106 -1
  295. package/dist/prosemirror/validation.js +5 -1
  296. package/dist/redline.js +93 -9
  297. package/dist/render-dom/BodySelectionOverlay.d.ts +4 -1
  298. package/dist/render-dom/BodySelectionOverlay.js +3 -2
  299. package/dist/utils/findReplace.js +2 -2
  300. package/dist/utils/mergeDocumentContent.js +1 -1
  301. package/dist/utils/noteReferenceLabels.d.ts +36 -0
  302. package/dist/utils/noteReferenceLabels.js +32 -0
  303. package/dist/utils/replaceText.js +1 -1
  304. package/dist/version-comparison.d.ts +1 -0
  305. package/dist/version-comparison.js +1 -0
  306. package/package.json +3 -2
  307. package/dist/internal/headlessRevisionResolution.d.ts +0 -23
@@ -1,5 +1,7 @@
1
1
  import { expectPageBreakRunAttrs } from "../prosemirror/attrs/index.js";
2
2
  import { runFormattingInlineAtomCleanText, runFormattingInlineControlCharacter } from "../prosemirror/runFormattingInlineCarriers.js";
3
+ import { createNoteReferenceNumbering, noteReferenceMarker } from "../utils/noteReferenceLabels.js";
4
+ import { noteReferenceOf } from "./note-references.js";
3
5
  //#region src/ai-edits/clean-text.ts
4
6
  const EMPTY_CLEAN_TEXT_STRUCTURAL_BOUNDARIES = Object.freeze([]);
5
7
  const cutsIntoSpan = ({ offset, length }, boundaryOffset) => boundaryOffset > offset && boundaryOffset < offset + length;
@@ -24,7 +26,7 @@ const resolveCleanTextRange = ({ cleanBlock, startOffset, endOffset }) => {
24
26
  let from = baseFrom;
25
27
  let to = baseTo;
26
28
  for (const boundary of structuralBoundaries) {
27
- if (boundary.type === "field") {
29
+ if (boundary.type === "field" || boundary.type === "noteReference") {
28
30
  if (cutsIntoSpan(boundary, startOffset) || cutsIntoSpan(boundary, endOffset)) return null;
29
31
  continue;
30
32
  }
@@ -47,12 +49,48 @@ const COMMENT_MARK = "comment";
47
49
  const HIDDEN_MARK = "hidden";
48
50
  const isOmittedFromCleanView = (node) => node.marks.some((mark) => mark.type.name === DELETION_MARK || mark.type.name === HIDDEN_MARK);
49
51
  const DEFAULT_BUILD_CLEAN_BLOCK_TEXT_OPTIONS = { fieldResults: "text" };
50
- const buildCleanBlockText = (blockNode, blockFrom, { fieldResults } = DEFAULT_BUILD_CLEAN_BLOCK_TEXT_OPTIONS) => {
52
+ /**
53
+ * The marker a reference reads as: the story's number when the labels know
54
+ * the note, else the next number of a block-local sequence.
55
+ */
56
+ const noteReferenceLabelFor = (node, labels, local) => {
57
+ const reference = noteReferenceOf(node);
58
+ if (reference === null) return null;
59
+ const known = labels?.labelOf(reference);
60
+ if (known !== void 0) return known;
61
+ const { displayNumber } = local().next(reference.noteType, reference.noteId);
62
+ return noteReferenceMarker(reference.noteType, displayNumber);
63
+ };
64
+ const buildCleanBlockText = (blockNode, blockFrom, { fieldResults, noteReferences } = DEFAULT_BUILD_CLEAN_BLOCK_TEXT_OPTIONS) => {
51
65
  let text = "";
52
66
  const offsets = [];
53
67
  let structuralBoundaries;
54
68
  let lastEnd = blockFrom + 1;
69
+ const labels = noteReferences === "sourceText" ? void 0 : noteReferences;
70
+ let localNumbering;
71
+ const local = () => localNumbering ??= createNoteReferenceNumbering();
55
72
  blockNode.descendants((node, pos) => {
73
+ if (noteReferences !== "sourceText" && node.isText && !isOmittedFromCleanView(node)) {
74
+ const reference = noteReferenceOf(node);
75
+ const label = reference === null ? null : noteReferenceLabelFor(node, labels, local);
76
+ if (reference !== null && label !== null) {
77
+ const from = blockFrom + 1 + pos;
78
+ const to = from + node.nodeSize;
79
+ (structuralBoundaries ??= []).push({
80
+ type: "noteReference",
81
+ offset: text.length,
82
+ length: label.length,
83
+ from,
84
+ to,
85
+ noteType: reference.noteType,
86
+ noteId: reference.noteId
87
+ });
88
+ for (let index = 0; index < label.length; index++) offsets.push(from);
89
+ text += label;
90
+ lastEnd = to;
91
+ return false;
92
+ }
93
+ }
56
94
  if (node.type.name === "pageBreakRun") {
57
95
  const from = blockFrom + 1 + pos;
58
96
  const { clear } = expectPageBreakRunAttrs(node);
@@ -114,12 +152,20 @@ const buildCleanBlockText = (blockNode, blockFrom, { fieldResults } = DEFAULT_BU
114
152
  *
115
153
  * This is the view a consumer embeds when it wants the model to reason about
116
154
  * the redline itself, in contrast to {@link buildCleanBlockText}'s
117
- * post-tracked-changes view.
155
+ * post-tracked-changes view. A footnote or endnote reference reads as its
156
+ * marker (`[^1]`), numbered within the block.
157
+ */
158
+ const buildAnnotatedBlockText = (blockNode) => buildAnnotatedBlockTextWithNoteReferences(blockNode, void 0);
159
+ /**
160
+ * {@link buildAnnotatedBlockText} with a story's reference numbering, so a
161
+ * reference reads as the marker every other reader of the story shows.
118
162
  */
119
- const buildAnnotatedBlockText = (blockNode) => {
163
+ const buildAnnotatedBlockTextWithNoteReferences = (blockNode, noteReferences) => {
120
164
  const segments = [];
165
+ let localNumbering;
166
+ const local = () => localNumbering ??= createNoteReferenceNumbering();
121
167
  blockNode.descendants((node) => {
122
- const text = node.isText ? node.text : runFormattingInlineAtomCleanText(node);
168
+ const text = node.isText ? noteReferenceLabelFor(node, noteReferences, local) ?? node.text : runFormattingInlineAtomCleanText(node);
123
169
  if (text === void 0 || text === null) return true;
124
170
  const annotation = annotationOf(node.marks);
125
171
  const previous = segments.at(-1);
@@ -165,4 +211,4 @@ const renderAnnotatedSegment = ({ annotation, text }) => {
165
211
  return inner;
166
212
  };
167
213
  //#endregion
168
- export { buildAnnotatedBlockText, buildCleanBlockText, resolveCleanTextRange };
214
+ export { buildAnnotatedBlockText, buildAnnotatedBlockTextWithNoteReferences, buildCleanBlockText, resolveCleanTextRange };
@@ -0,0 +1,18 @@
1
+ import { document_d_exports } from "../types/document.js";
2
+ import { Node } from "prosemirror-model";
3
+ //#region src/ai-edits/comment-lifecycle.d.ts
4
+ /** Ids of the comments an editor document anchors: by mark, reference or point anchor. */
5
+ declare const anchoredCommentIdsInProseDoc: (doc: Node) => Set<number>;
6
+ /** Ids of the comments a model story's blocks hold any marker of. */
7
+ declare const anchoredCommentIdsInBlocks: (blocks: readonly document_d_exports.BlockContent[]) => Set<number>;
8
+ /**
9
+ * `comments` without the threads whose root lost its anchor: the root, and
10
+ * every reply that threads under it. A reply's own markers repeat its root's
11
+ * range, so a reply is judged by its root, never on its own.
12
+ */
13
+ declare const withoutLostCommentThreads: (comments: readonly document_d_exports.Comment[], { anchoredBefore, anchoredNow }: {
14
+ anchoredBefore: ReadonlySet<number>;
15
+ anchoredNow: ReadonlySet<number>;
16
+ }) => document_d_exports.Comment[];
17
+ //#endregion
18
+ export { anchoredCommentIdsInBlocks, anchoredCommentIdsInProseDoc, withoutLostCommentThreads };
@@ -0,0 +1,52 @@
1
+ import { visitCommentMarkers } from "../docx/commentAnchorIndex.js";
2
+ import { readCommentReferenceAttrs } from "../prosemirror/commentReferenceAttrs.js";
3
+ import "../prosemirror/extensions/nodes/CommentReferenceExtension.js";
4
+ import "../prosemirror/extensions/nodes/RangeAnchorExtension.js";
5
+ import { readRangeAnchorAttrs } from "../prosemirror/rangeAnchorAttrs.js";
6
+ //#region src/ai-edits/comment-lifecycle.ts
7
+ /** Ids of the comments an editor document anchors: by mark, reference or point anchor. */
8
+ const anchoredCommentIdsInProseDoc = (doc) => {
9
+ const ids = /* @__PURE__ */ new Set();
10
+ doc.descendants((node) => {
11
+ if (node.type.name === "commentReference") {
12
+ const attrs = readCommentReferenceAttrs(node);
13
+ if (attrs.ok) ids.add(attrs.value.commentId);
14
+ } else if (node.type.name === "rangeAnchor") {
15
+ const attrs = readRangeAnchorAttrs(node);
16
+ if (attrs.ok && attrs.value.start.type === "commentRangeStart") ids.add(attrs.value.start.id);
17
+ }
18
+ for (const mark of node.marks) {
19
+ const commentId = mark.attrs["commentId"];
20
+ if (mark.type.name === "comment" && typeof commentId === "number") ids.add(commentId);
21
+ }
22
+ return true;
23
+ });
24
+ return ids;
25
+ };
26
+ /** Ids of the comments a model story's blocks hold any marker of. */
27
+ const anchoredCommentIdsInBlocks = (blocks) => {
28
+ const ids = /* @__PURE__ */ new Set();
29
+ visitCommentMarkers(blocks, ({ item }) => ids.add(item.id));
30
+ return ids;
31
+ };
32
+ /**
33
+ * `comments` without the threads whose root lost its anchor: the root, and
34
+ * every reply that threads under it. A reply's own markers repeat its root's
35
+ * range, so a reply is judged by its root, never on its own.
36
+ */
37
+ const withoutLostCommentThreads = (comments, { anchoredBefore, anchoredNow }) => {
38
+ const dropped = /* @__PURE__ */ new Set();
39
+ for (const comment of comments) if (comment.parentId === void 0 && anchoredBefore.has(comment.id) && !anchoredNow.has(comment.id)) dropped.add(comment.id);
40
+ if (dropped.size === 0) return [...comments];
41
+ let grew = true;
42
+ while (grew) {
43
+ grew = false;
44
+ for (const comment of comments) if (!dropped.has(comment.id) && comment.parentId !== void 0 && dropped.has(comment.parentId)) {
45
+ dropped.add(comment.id);
46
+ grew = true;
47
+ }
48
+ }
49
+ return comments.filter((comment) => !dropped.has(comment.id));
50
+ };
51
+ //#endregion
52
+ export { anchoredCommentIdsInBlocks, anchoredCommentIdsInProseDoc, withoutLostCommentThreads };
@@ -1,11 +1,12 @@
1
1
  import { document_d_exports } from "../types/document.js";
2
2
  import { FolioTableTemplates } from "./table-template.js";
3
3
  import { FolioAIBlock, FolioAIEditApplyMode, FolioAIEditApplyResult, FolioAIEditOperation, FolioAIEditSnapshot } from "./types.js";
4
- import { FolioReplacementBackground, FolioRevisionStamp, FolioWordDiffOptions } from "./apply.js";
4
+ import { FolioReplacementBackground, FolioRevisionStamp, FolioUndefinedStylePolicy, FolioWordDiffOptions } from "./apply.js";
5
5
  import { ImportReferencedStyleDefinitionsResult } from "../compare/style-resources.js";
6
6
  import { InlineProvenanceTargetOptions } from "../compare/inline-provenance.js";
7
7
  import { MatchInlineAtomsOptions } from "../compare/inline-atoms.js";
8
8
  import { FolioDocumentOperationBatch, FolioDocumentOperationResult, FolioDocumentOperationUndoHandle, FolioDocumentOperationUndoResult } from "../document-operations.js";
9
+ import { FolioPendingSuggestionLoadResult, FolioPendingSuggestionRecord } from "./pending-suggestions.js";
9
10
  import { FolioReviewChange, FolioReviewChangeKind } from "./read.js";
10
11
  import { FolioStoryTable } from "./snapshot.js";
11
12
  import { TableGeometryPairing } from "./table-geometry.js";
@@ -159,6 +160,13 @@ type FolioApplyDocumentOperationsToStoryOptions = FolioApplyDocumentOperationsOp
159
160
  * the target document — keeps them instead.
160
161
  */
161
162
  replacementBackground?: FolioReplacementBackground;
163
+ /**
164
+ * What an operation naming a paragraph style the document does not define
165
+ * does. Refusing it is the default; a caller copying another document's
166
+ * style references — `compareDocx` and `generateRedlineDocx` reproducing the
167
+ * revised document — keeps them instead.
168
+ */
169
+ undefinedStyles?: FolioUndefinedStylePolicy;
162
170
  };
163
171
  type FolioHeaderFooterStoryHandle = Extract<FolioEditableDocumentStoryHandle, {
164
172
  type: "header" | "footer";
@@ -200,6 +208,7 @@ type StoryInlineAtomsResult = {
200
208
  documentChanged: boolean;
201
209
  } | {
202
210
  status: "unalignable";
211
+ detail?: string;
203
212
  } | {
204
213
  status: "budget-exceeded";
205
214
  };
@@ -288,8 +297,17 @@ type FolioReviewComment = {
288
297
  text: string;
289
298
  /** The document text the comment is anchored to, or `""` when unanchored. */
290
299
  anchoredText: string;
291
- /** Stable id of the anchored body block, or `null` when the anchor is absent. */
300
+ /**
301
+ * Stable id of the anchored block, or `null` when the anchor is absent. The
302
+ * id is the one {@link FolioDocxReviewer.snapshotStory} gives the block in
303
+ * {@link FolioReviewComment.story}.
304
+ */
292
305
  blockId: string | null;
306
+ /**
307
+ * The story holding the anchor — the body, a header or footer, a footnote or
308
+ * an endnote — or `null` when the anchor is absent.
309
+ */
310
+ story: FolioDocumentStoryHandle | null;
293
311
  replies: FolioReviewCommentReply[];
294
312
  /** Whether the comment is marked resolved / done. */
295
313
  done: boolean;
@@ -331,7 +349,10 @@ declare class FolioDocxReviewer {
331
349
  private readonly resolvedStoryExpectations;
332
350
  private readonly createdComments;
333
351
  private readonly usedCommentIds;
352
+ /** Comments the body anchored when it was loaded, read as the editor projects it. */
353
+ private readonly loadedMainCommentIds;
334
354
  private readonly documentOperationUndoEntries;
355
+ private readonly pendingSuggestions;
335
356
  /**
336
357
  * Resolved-state overrides recorded by {@link resolveComment}, keyed by
337
358
  * comment id. Applied on read ({@link getComments}) and on write
@@ -359,6 +380,10 @@ declare class FolioDocxReviewer {
359
380
  * the anchor map the apply layer resolves operations against.
360
381
  */
361
382
  snapshot(): FolioAIEditSnapshot;
383
+ /** Export staged AI operations for storage by the host, outside the DOCX. */
384
+ exportPendingSuggestions(): FolioPendingSuggestionRecord[];
385
+ /** Validate saved proposals against this document before restaging them. */
386
+ loadPendingSuggestions(records: readonly unknown[]): FolioPendingSuggestionLoadResult[];
362
387
  /**
363
388
  * The package's numbering, flattened to what a reader sees: one entry per
364
389
  * numbering instance and level, with the format and level text that produce
@@ -419,7 +444,7 @@ declare class FolioDocxReviewer {
419
444
  */
420
445
  applyDocumentOperations(batch: FolioDocumentOperationBatch, options?: FolioApplyDocumentOperationsOptions): FolioDocumentOperationResult;
421
446
  /** Apply a versioned operation batch to one editable document story. */
422
- applyDocumentOperationsToStory({ story, batch, snapshot, revisionStamp, wordDiff, tableTemplates, replacementBackground }: FolioApplyDocumentOperationsToStoryOptions): FolioDocumentOperationResult;
447
+ applyDocumentOperationsToStory({ story, batch, snapshot, revisionStamp, wordDiff, tableTemplates, replacementBackground, undefinedStyles }: FolioApplyDocumentOperationsToStoryOptions): FolioDocumentOperationResult;
423
448
  private applyDocumentOperationsInternal;
424
449
  /** Undo the latest unchanged document-operation batch and its created comments. */
425
450
  undoDocumentOperations(undoHandle: FolioDocumentOperationUndoHandle): FolioDocumentOperationUndoResult;
@@ -446,6 +471,10 @@ declare class FolioDocxReviewer {
446
471
  * one per non-empty part: `[header default] …`, `[footer default] …`,
447
472
  * `[footnote #N] …`, `[endnote #N] …`. Lines reflect in-memory edits. Empty
448
473
  * parts and separator notes are omitted.
474
+ *
475
+ * A header or footer is labelled with the role its section references give
476
+ * it (`default`, `first`, `even`); in a document with several sections, also
477
+ * with the sections that show it: `[header first (sections 1, 3)] …`.
449
478
  */
450
479
  getNotesAsText(): string;
451
480
  private listStoryHandlesInternal;
@@ -472,10 +501,12 @@ declare class FolioDocxReviewer {
472
501
  * {@link getComments} or its id; the reply threads under that comment's root
473
502
  * (Word threads are flat). On {@link toBuffer} the reply is written as a real
474
503
  * Word reply — linked via `commentsExtended.xml` and given its own
475
- * `commentRange` markers + reference anchored on the parent's range. Returns
504
+ * `commentRange` markers + reference anchored on the parent's range. The
505
+ * live document carries the same anchor. Returns
476
506
  * the created reply, or `null` when the target comment is absent.
477
507
  */
478
508
  replyTo(target: FolioReviewComment | number, input: FolioReviewReplyInput): FolioReviewCommentReply | null;
509
+ private anchorReplyInEditor;
479
510
  /**
480
511
  * Mark a comment thread resolved, or reopen a previously resolved one. Pass
481
512
  * the id from {@link getComments} / {@link FolioReviewComment.id}. Applies
@@ -491,6 +522,13 @@ declare class FolioDocxReviewer {
491
522
  resolveComment(commentId: string, options?: {
492
523
  resolved?: boolean;
493
524
  }): boolean;
525
+ /**
526
+ * Where each header and footer part is shown, as the live section
527
+ * references state it: its role (`w:type`) and the 1-based section, in
528
+ * section order. A part's own `hdrFtrType` holds one role, and one part can
529
+ * serve several sections, in different roles.
530
+ */
531
+ private headerFooterPlacements;
494
532
  private currentFinalSectionProperties;
495
533
  private stageFinalSectionProperties;
496
534
  private stageMappedSectionBoundaries;
@@ -510,9 +548,16 @@ declare class FolioDocxReviewer {
510
548
  */
511
549
  rejectChange(target: FolioReviewChange | number): boolean;
512
550
  private rejectChangeInternal;
551
+ /** Convert one pending suggestion into an ordinary tracked change. */
552
+ acceptSuggestion(suggestionId: string, options?: {
553
+ author?: string;
554
+ }): boolean;
555
+ /** Remove one pending suggestion without applying it. */
556
+ rejectSuggestion(suggestionId: string): boolean;
513
557
  /**
514
- * Accept every tracked change in the package. Returns the number of changes
515
- * present before the sweep.
558
+ * Accept every ordinary tracked change in the package. Pending suggestions
559
+ * remain staged until {@link acceptSuggestion} is called. Returns the number
560
+ * of ordinary changes present before the sweep.
516
561
  *
517
562
  * Every story, not just the body: a revision in a header or a footnote is
518
563
  * one a reviewer meant to resolve, and leaving it behind means an accepted
@@ -524,6 +569,7 @@ declare class FolioDocxReviewer {
524
569
  private resolveWithSectionReferenceHistory;
525
570
  private resolveEveryFinalSectionChange;
526
571
  private resolveEveryStory;
572
+ private acceptOrdinaryChangesWithSuggestions;
527
573
  /** The current document model with edits merged back in. */
528
574
  toDocument(): document_d_exports.Document;
529
575
  private captureReviewerState;
@@ -551,6 +597,14 @@ declare class FolioDocxReviewer {
551
597
  */
552
598
  private trySelectiveSave;
553
599
  private getEditableStoryState;
600
+ /**
601
+ * A secondary story as its editable state holds it: the loaded state's
602
+ * document once an operation has loaded it, otherwise the conversion loading
603
+ * performs — with the same deterministic block ids — without retaining a
604
+ * state for a story nothing edits.
605
+ */
606
+ private readSecondaryStoryDoc;
607
+ private secondaryStoryDoc;
554
608
  private requireEditableStoryState;
555
609
  private setEditableStoryState;
556
610
  private getHeaderFooterStory;
@@ -575,7 +629,17 @@ declare class FolioDocxReviewer {
575
629
  private mergeEditedSecondaryStories;
576
630
  /** Apply any {@link resolveComment} overrides recorded for these comments. */
577
631
  private withResolvedOverrides;
578
- /** Map each anchored comment id to its anchored text and containing block id. */
632
+ /**
633
+ * `comments` without the threads an edit left anchored nowhere: anchored in
634
+ * a story when it was loaded (or created anchored by this reviewer), and
635
+ * anchored in no story now. See `comment-lifecycle.ts`.
636
+ */
637
+ private keptCommentThreads;
638
+ /**
639
+ * Map each anchored comment id to its anchored text, its containing block id
640
+ * and the story holding it. A comment can be anchored in any story, so every
641
+ * story is read, not only the body.
642
+ */
579
643
  private commentAnchors;
580
644
  /** Allocate outside every parsed or newly-created comment and reply id. */
581
645
  private nextCommentId;