@beyondwork/docx-react-component 1.0.1 → 1.0.3

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 (172) hide show
  1. package/README.md +44 -104
  2. package/package.json +50 -30
  3. package/src/README.md +85 -0
  4. package/src/api/README.md +22 -0
  5. package/src/api/public-types.ts +525 -0
  6. package/src/compare/diff-engine.ts +530 -0
  7. package/src/compare/export-redlines.ts +162 -0
  8. package/src/compare/snapshot.ts +37 -0
  9. package/src/component-inventory.md +99 -0
  10. package/src/core/README.md +10 -0
  11. package/src/core/commands/README.md +3 -0
  12. package/src/core/commands/formatting-commands.ts +161 -0
  13. package/src/core/commands/image-commands.ts +144 -0
  14. package/src/core/commands/index.ts +1013 -0
  15. package/src/core/commands/list-commands.ts +370 -0
  16. package/src/core/commands/review-commands.ts +108 -0
  17. package/src/core/commands/text-commands.ts +119 -0
  18. package/src/core/schema/README.md +3 -0
  19. package/src/core/schema/text-schema.ts +512 -0
  20. package/src/core/selection/README.md +3 -0
  21. package/src/core/selection/mapping.ts +238 -0
  22. package/src/core/selection/review-anchors.ts +94 -0
  23. package/src/core/state/README.md +3 -0
  24. package/src/core/state/editor-state.ts +580 -0
  25. package/src/core/state/text-transaction.ts +276 -0
  26. package/src/formats/xlsx/io/parse-shared-strings.ts +41 -0
  27. package/src/formats/xlsx/io/parse-sheet.ts +289 -0
  28. package/src/formats/xlsx/io/parse-styles.ts +57 -0
  29. package/src/formats/xlsx/io/parse-workbook.ts +75 -0
  30. package/src/formats/xlsx/io/xlsx-session.ts +306 -0
  31. package/src/formats/xlsx/model/cell.ts +189 -0
  32. package/src/formats/xlsx/model/sheet.ts +244 -0
  33. package/src/formats/xlsx/model/styles.ts +118 -0
  34. package/src/formats/xlsx/model/workbook.ts +449 -0
  35. package/src/index.ts +45 -0
  36. package/src/io/README.md +10 -0
  37. package/src/io/docx-session.ts +1763 -0
  38. package/src/io/export/README.md +3 -0
  39. package/src/io/export/export-session.ts +165 -0
  40. package/src/io/export/minimal-docx.ts +115 -0
  41. package/src/io/export/reattach-preserved-parts.ts +54 -0
  42. package/src/io/export/serialize-comments.ts +876 -0
  43. package/src/io/export/serialize-footnotes.ts +217 -0
  44. package/src/io/export/serialize-headers-footers.ts +200 -0
  45. package/src/io/export/serialize-main-document.ts +982 -0
  46. package/src/io/export/serialize-numbering.ts +97 -0
  47. package/src/io/export/serialize-revisions.ts +389 -0
  48. package/src/io/export/serialize-runtime-revisions.ts +265 -0
  49. package/src/io/export/serialize-tables.ts +147 -0
  50. package/src/io/export/split-review-boundaries.ts +194 -0
  51. package/src/io/normalize/README.md +3 -0
  52. package/src/io/normalize/normalize-text.ts +437 -0
  53. package/src/io/ooxml/README.md +3 -0
  54. package/src/io/ooxml/parse-comments.ts +779 -0
  55. package/src/io/ooxml/parse-complex-content.ts +287 -0
  56. package/src/io/ooxml/parse-fields.ts +438 -0
  57. package/src/io/ooxml/parse-footnotes.ts +403 -0
  58. package/src/io/ooxml/parse-headers-footers.ts +483 -0
  59. package/src/io/ooxml/parse-inline-media.ts +431 -0
  60. package/src/io/ooxml/parse-main-document.ts +1846 -0
  61. package/src/io/ooxml/parse-numbering.ts +425 -0
  62. package/src/io/ooxml/parse-revisions.ts +658 -0
  63. package/src/io/ooxml/parse-shapes.ts +271 -0
  64. package/src/io/ooxml/parse-tables.ts +568 -0
  65. package/src/io/ooxml/parse-theme.ts +314 -0
  66. package/src/io/ooxml/part-manifest.ts +136 -0
  67. package/src/io/ooxml/revision-boundaries.ts +351 -0
  68. package/src/io/opc/README.md +3 -0
  69. package/src/io/opc/corrupt-package.ts +166 -0
  70. package/src/io/opc/docx-package.ts +74 -0
  71. package/src/io/opc/package-reader.ts +325 -0
  72. package/src/io/opc/package-writer.ts +273 -0
  73. package/src/legal/bookmarks.ts +196 -0
  74. package/src/legal/cross-references.ts +356 -0
  75. package/src/legal/defined-terms.ts +203 -0
  76. package/src/model/README.md +3 -0
  77. package/src/model/canonical-document.ts +1911 -0
  78. package/src/model/cds-1.0.0.ts +196 -0
  79. package/src/model/snapshot.ts +393 -0
  80. package/src/preservation/README.md +3 -0
  81. package/src/preservation/markup-compatibility.ts +48 -0
  82. package/src/preservation/opaque-fragment-store.ts +89 -0
  83. package/src/preservation/opaque-region.ts +233 -0
  84. package/src/preservation/package-preservation.ts +120 -0
  85. package/src/preservation/preserved-part-manifest.ts +56 -0
  86. package/src/preservation/relationship-retention.ts +57 -0
  87. package/src/preservation/store.ts +185 -0
  88. package/src/review/README.md +16 -0
  89. package/src/review/store/README.md +3 -0
  90. package/src/review/store/comment-anchors.ts +70 -0
  91. package/src/review/store/comment-remapping.ts +154 -0
  92. package/src/review/store/comment-store.ts +331 -0
  93. package/src/review/store/comment-thread.ts +109 -0
  94. package/src/review/store/revision-actions.ts +394 -0
  95. package/src/review/store/revision-store.ts +303 -0
  96. package/src/review/store/revision-types.ts +168 -0
  97. package/src/review/store/runtime-comment-store.ts +43 -0
  98. package/src/runtime/README.md +3 -0
  99. package/src/runtime/ai-action-policy.ts +764 -0
  100. package/src/runtime/document-runtime.ts +967 -0
  101. package/src/runtime/read-only-diagnostics-runtime.ts +232 -0
  102. package/src/runtime/review-runtime.ts +44 -0
  103. package/src/runtime/revision-runtime.ts +107 -0
  104. package/src/runtime/session-capabilities.ts +138 -0
  105. package/src/runtime/surface-projection.ts +570 -0
  106. package/src/runtime/table-commands.ts +87 -0
  107. package/src/runtime/table-schema.ts +140 -0
  108. package/src/runtime/virtualized-rendering.ts +258 -0
  109. package/src/ui/README.md +30 -0
  110. package/src/ui/WordReviewEditor.tsx +1506 -0
  111. package/src/ui/comments/README.md +3 -0
  112. package/src/ui/compatibility/README.md +3 -0
  113. package/src/ui/editor-surface/README.md +3 -0
  114. package/src/ui/headless/comment-decoration-model.ts +124 -0
  115. package/src/ui/headless/revision-decoration-model.ts +128 -0
  116. package/src/ui/headless/selection-helpers.ts +34 -0
  117. package/src/ui/headless/use-editor-keyboard.ts +98 -0
  118. package/src/ui/review/README.md +3 -0
  119. package/src/ui/shared/revision-filters.ts +31 -0
  120. package/src/ui/status/README.md +3 -0
  121. package/src/ui/theme/README.md +3 -0
  122. package/src/ui/toolbar/README.md +3 -0
  123. package/src/ui-tailwind/chrome/tw-alert-banner.tsx +48 -0
  124. package/src/ui-tailwind/chrome/tw-selection-toolbar.tsx +44 -0
  125. package/src/ui-tailwind/chrome/tw-unsaved-modal.tsx +58 -0
  126. package/src/ui-tailwind/chrome/use-before-unload.ts +20 -0
  127. package/src/ui-tailwind/editor-surface/pm-command-bridge.ts +139 -0
  128. package/src/ui-tailwind/editor-surface/pm-decorations.ts +98 -0
  129. package/src/ui-tailwind/editor-surface/pm-position-map.ts +123 -0
  130. package/src/ui-tailwind/editor-surface/pm-schema.ts +452 -0
  131. package/src/ui-tailwind/editor-surface/pm-state-from-snapshot.ts +327 -0
  132. package/src/ui-tailwind/editor-surface/search-plugin.ts +157 -0
  133. package/src/ui-tailwind/editor-surface/tw-caret.tsx +12 -0
  134. package/src/ui-tailwind/editor-surface/tw-editor-surface.tsx +150 -0
  135. package/src/ui-tailwind/editor-surface/tw-inline-token.tsx +118 -0
  136. package/src/ui-tailwind/editor-surface/tw-opaque-block.tsx +52 -0
  137. package/src/ui-tailwind/editor-surface/tw-paragraph-block.tsx +151 -0
  138. package/src/ui-tailwind/editor-surface/tw-prosemirror-surface.tsx +215 -0
  139. package/src/ui-tailwind/editor-surface/tw-segment-view.tsx +111 -0
  140. package/src/ui-tailwind/editor-surface/tw-table-node-view.tsx +122 -0
  141. package/src/ui-tailwind/index.ts +61 -0
  142. package/src/ui-tailwind/review/tw-comment-sidebar.tsx +276 -0
  143. package/src/ui-tailwind/review/tw-health-panel.tsx +120 -0
  144. package/src/ui-tailwind/review/tw-review-rail.tsx +120 -0
  145. package/src/ui-tailwind/review/tw-revision-sidebar.tsx +164 -0
  146. package/src/ui-tailwind/status/tw-status-bar.tsx +58 -0
  147. package/src/ui-tailwind/theme/editor-theme.css +190 -0
  148. package/src/ui-tailwind/toolbar/tw-toolbar-icon-button.tsx +48 -0
  149. package/src/ui-tailwind/toolbar/tw-toolbar.tsx +231 -0
  150. package/src/ui-tailwind/tw-review-workspace.tsx +140 -0
  151. package/src/validation/README.md +3 -0
  152. package/src/validation/compatibility-engine.ts +317 -0
  153. package/src/validation/compatibility-report.ts +160 -0
  154. package/src/validation/diagnostics.ts +203 -0
  155. package/src/validation/import-diagnostics.ts +128 -0
  156. package/src/validation/low-priority-word-surfaces.ts +373 -0
  157. package/dist/chunk-32W6IVQE.js +0 -7725
  158. package/dist/chunk-32W6IVQE.js.map +0 -1
  159. package/dist/index.cjs +0 -23722
  160. package/dist/index.cjs.map +0 -1
  161. package/dist/index.d.cts +0 -7
  162. package/dist/index.d.ts +0 -7
  163. package/dist/index.js +0 -16011
  164. package/dist/index.js.map +0 -1
  165. package/dist/public-types-DqCURAz8.d.cts +0 -1152
  166. package/dist/public-types-DqCURAz8.d.ts +0 -1152
  167. package/dist/tailwind.cjs +0 -8295
  168. package/dist/tailwind.cjs.map +0 -1
  169. package/dist/tailwind.d.cts +0 -323
  170. package/dist/tailwind.d.ts +0 -323
  171. package/dist/tailwind.js +0 -553
  172. package/dist/tailwind.js.map +0 -1
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/ui/WordReviewEditor.tsx","../src/core/selection/mapping.ts","../src/model/cds-1.0.0.ts","../src/model/canonical-document.ts","../src/model/snapshot.ts","../src/core/state/editor-state.ts","../src/core/commands/review-commands.ts","../src/core/schema/text-schema.ts","../src/core/state/text-transaction.ts","../src/core/commands/text-commands.ts","../src/core/selection/review-anchors.ts","../src/review/store/comment-remapping.ts","../src/review/store/revision-types.ts","../src/review/store/revision-store.ts","../src/review/store/revision-actions.ts","../src/runtime/revision-runtime.ts","../src/core/commands/index.ts","../src/review/store/comment-anchors.ts","../src/review/store/comment-store.ts","../src/review/store/runtime-comment-store.ts","../src/preservation/store.ts","../src/validation/compatibility-engine.ts","../src/runtime/surface-projection.ts","../src/runtime/document-runtime.ts","../src/io/ooxml/part-manifest.ts","../src/io/opc/package-writer.ts","../src/io/opc/docx-package.ts","../src/io/opc/package-reader.ts","../src/io/ooxml/parse-inline-media.ts","../src/io/ooxml/parse-numbering.ts","../src/io/ooxml/parse-main-document.ts","../src/io/normalize/normalize-text.ts","../src/io/opc/corrupt-package.ts","../src/io/export/reattach-preserved-parts.ts","../src/io/export/export-session.ts","../src/preservation/relationship-retention.ts","../src/io/export/serialize-numbering.ts","../src/io/export/serialize-main-document.ts","../src/io/ooxml/revision-boundaries.ts","../src/io/ooxml/parse-revisions.ts","../src/review/store/comment-thread.ts","../src/io/ooxml/parse-comments.ts","../src/io/export/serialize-comments.ts","../src/io/export/split-review-boundaries.ts","../src/io/export/serialize-runtime-revisions.ts","../src/validation/diagnostics.ts","../src/validation/import-diagnostics.ts","../src/runtime/read-only-diagnostics-runtime.ts","../src/io/ooxml/parse-headers-footers.ts","../src/io/ooxml/parse-footnotes.ts","../src/io/ooxml/parse-theme.ts","../src/io/export/serialize-headers-footers.ts","../src/io/export/serialize-footnotes.ts","../src/io/docx-session.ts","../src/io/export/minimal-docx.ts","../src/ui-tailwind/editor-surface/tw-prosemirror-surface.tsx","../src/ui-tailwind/editor-surface/pm-state-from-snapshot.ts","../src/ui-tailwind/editor-surface/pm-schema.ts","../src/runtime/table-schema.ts","../src/ui-tailwind/editor-surface/pm-position-map.ts","../src/ui-tailwind/editor-surface/pm-command-bridge.ts","../src/ui-tailwind/editor-surface/pm-decorations.ts","../src/ui-tailwind/editor-surface/tw-table-node-view.tsx"],"sourcesContent":["import React, {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from \"react\";\n\nimport type {\n AutosaveState,\n EditorDatastoreAdapter,\n CompatibilityReport,\n EditorError,\n EditorWarning,\n ExportDocxOptions,\n PersistedEditorSnapshot,\n RuntimeRenderSnapshot,\n SelectionSnapshot as PublicSelectionSnapshot,\n ExportResult,\n WordReviewEditorEvent,\n WordReviewEditorProps,\n WordReviewEditorRef,\n} from \"../api/public-types\";\nimport {\n createDetachedAnchor,\n createNodeAnchor,\n createRangeAnchor,\n} from \"../core/selection/mapping.ts\";\nimport { createCanonicalDocumentId } from \"../core/state/editor-state.ts\";\nimport {\n createDocumentRuntime,\n type DocumentRuntime,\n} from \"../runtime/document-runtime.ts\";\nimport { loadDocxEditorSession } from \"../io/docx-session.ts\";\nimport { exportSnapshotToMinimalDocx } from \"../io/export/minimal-docx.ts\";\nimport { DOCX_MIME_TYPE } from \"../io/opc/docx-package.ts\";\nimport { deriveCapabilities } from \"../runtime/session-capabilities\";\nimport { TwProseMirrorSurface } from \"../ui-tailwind/editor-surface/tw-prosemirror-surface\";\nimport { TwReviewWorkspace } from \"../ui-tailwind/tw-review-workspace\";\nimport type { ReviewRailTab } from \"../ui-tailwind/review/tw-review-rail\";\nimport type { ViewMode } from \"../ui-tailwind/toolbar/tw-toolbar\";\nimport type { MarkupDisplay } from \"./headless/comment-decoration-model\";\n\ninterface ResolvedSource {\n source: \"docx\" | \"snapshot\" | \"datastore\";\n sourceLabel?: string;\n initialDocx?: Uint8Array | ArrayBuffer;\n initialSnapshot?: PersistedEditorSnapshot;\n}\n\ninterface CreateRuntimeArgs {\n documentId: string;\n readOnly: boolean;\n source: ResolvedSource;\n datastore?: EditorDatastoreAdapter;\n currentUserId?: string;\n}\n\ninterface RuntimeLifecycleHandlers {\n onEvent?: (event: WordReviewEditorEvent) => void;\n onWarning?: (warning: EditorWarning) => void;\n onError?: (error: EditorError) => void;\n}\n\ninterface WordReviewEditorRuntime extends DocumentRuntime {\n getFatalError?(): EditorError | undefined;\n dispose?(): void;\n}\n\nexport function __createWordReviewEditorRefBridge(\n runtime: WordReviewEditorRuntime,\n): WordReviewEditorRef {\n return {\n focus: () => runtime.focus(),\n blur: () => runtime.blur(),\n undo: () => runtime.undo(),\n redo: () => runtime.redo(),\n addComment: (params) => runtime.addComment(params),\n openComment: (commentId) => runtime.openComment(commentId),\n resolveComment: (commentId) => runtime.resolveComment(commentId),\n reopenComment: (commentId) => runtime.reopenComment(commentId),\n addCommentReply: (commentId, body) => runtime.addCommentReply(commentId, body),\n editCommentBody: (commentId, body) => runtime.editCommentBody(commentId, body),\n acceptChange: (changeId) => runtime.acceptChange(changeId),\n rejectChange: (changeId) => runtime.rejectChange(changeId),\n acceptAllChanges: () => runtime.acceptAllChanges(),\n rejectAllChanges: () => runtime.rejectAllChanges(),\n exportDocx: (options) => runtime.exportDocx(options),\n getSnapshot: () => runtime.getPersistedSnapshot(),\n getCompatibilityReport: () => runtime.getCompatibilityReport(),\n getWarnings: () => runtime.getWarnings(),\n };\n}\n\nexport async function __resolveWordReviewEditorSource(\n props: Pick<\n WordReviewEditorProps,\n | \"documentId\"\n | \"datastore\"\n | \"externalDocSource\"\n | \"initialDocx\"\n | \"initialSnapshot\"\n | \"initialSourceLabel\"\n >,\n): Promise<ResolvedSource> {\n const explicitInitialCount =\n Number(Boolean(props.initialDocx)) + Number(Boolean(props.initialSnapshot));\n if (explicitInitialCount > 1) {\n throw new Error(\"Provide exactly one of initialDocx or initialSnapshot.\");\n }\n\n if (props.externalDocSource) {\n return props.externalDocSource.kind === \"docx\"\n ? {\n source: \"docx\",\n initialDocx: props.externalDocSource.bytes,\n sourceLabel: props.externalDocSource.sourceLabel,\n }\n : {\n source: \"snapshot\",\n initialSnapshot: props.externalDocSource.snapshot,\n sourceLabel: props.externalDocSource.sourceLabel,\n };\n }\n\n if (props.initialSnapshot) {\n return {\n source: \"snapshot\",\n initialSnapshot: props.initialSnapshot,\n sourceLabel: props.initialSourceLabel,\n };\n }\n\n if (props.initialDocx) {\n return {\n source: \"docx\",\n initialDocx: props.initialDocx,\n sourceLabel: props.initialSourceLabel,\n };\n }\n\n if (!props.datastore) {\n throw new Error(\n `WordReviewEditor ${props.documentId} needs initialDocx, initialSnapshot, or datastore.load().`,\n );\n }\n\n const loadResult = await props.datastore.load({\n documentId: props.documentId,\n });\n\n if (!loadResult.source) {\n throw new Error(`Datastore did not return a loadable source for ${props.documentId}.`);\n }\n\n return loadResult.source.kind === \"docx\"\n ? {\n source: \"datastore\",\n initialDocx: loadResult.source.bytes,\n sourceLabel: loadResult.source.sourceLabel,\n }\n : {\n source: \"datastore\",\n initialSnapshot: loadResult.source.snapshot,\n sourceLabel: loadResult.source.sourceLabel,\n };\n}\n\nexport function __createFallbackRuntime(args: CreateRuntimeArgs): WordReviewEditorRuntime {\n return createRuntime(args);\n}\n\nfunction createRuntime(\n args: CreateRuntimeArgs,\n handlers: RuntimeLifecycleHandlers = {},\n): WordReviewEditorRuntime {\n const docxSession = args.source.initialDocx\n ? loadDocxEditorSession({\n documentId: args.documentId,\n sourceLabel: args.source.sourceLabel,\n bytes: args.source.initialDocx,\n editorBuild: \"dev\",\n })\n : undefined;\n const initialSnapshot =\n args.source.initialSnapshot ??\n docxSession?.initialSnapshot ??\n createFallbackPersistedSnapshot(\n args.documentId,\n args.source.sourceLabel ?? \"Generated shell snapshot\",\n );\n\n return createDocumentRuntime({\n documentId: args.documentId,\n initialSnapshot,\n sourceKind: args.source.source,\n sourceLabel: args.source.sourceLabel,\n readOnly: args.readOnly || docxSession?.readOnly,\n editorBuild: initialSnapshot.editorBuild,\n fatalError: docxSession?.fatalError,\n exportDocx: async (snapshot, options) =>\n docxSession\n ? docxSession.exportDocx(snapshot, options)\n : {\n bytes: exportSnapshotToMinimalDocx(snapshot),\n mimeType: DOCX_MIME_TYPE,\n fileName: options?.fileName ?? `${args.documentId}.docx`,\n },\n onWarning: handlers.onWarning,\n onError: handlers.onError,\n defaultAuthorId: args.currentUserId,\n });\n}\n\nexport const WordReviewEditor = forwardRef<WordReviewEditorRef, WordReviewEditorProps>(\n function WordReviewEditor(props, ref) {\n const {\n currentUser,\n datastore,\n documentId,\n externalDocSource,\n externalDocumentRevision,\n initialDocx,\n initialSnapshot,\n initialSourceLabel,\n markupDisplay = \"simple\",\n onError,\n onEvent,\n onWarning,\n readOnly = false,\n reviewMode = \"review\",\n } = props;\n\n const [runtime, setRuntime] = useState<WordReviewEditorRuntime | null>(null);\n const [loadError, setLoadError] = useState<EditorError | null>(null);\n const [viewMode, setViewMode] = useState<ViewMode>(\"canvas\");\n const liveMarkupDisplay: MarkupDisplay = viewMode === \"document\" ? \"all\" : \"clean\";\n const [activeRailTab, setActiveRailTab] = useState<ReviewRailTab>(\"comments\");\n const [showTrackedChanges, setShowTrackedChanges] = useState(false);\n const [activeRevisionId, setActiveRevisionId] = useState<string | undefined>();\n const runtimeRef = useRef<WordReviewEditorRuntime | null>(null);\n const autosaveTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const lastSavedRevisionTokenRef = useRef<string | null>(null);\n const datastoreRef = useRef(datastore);\n const onEventRef = useRef(onEvent);\n const onWarningRef = useRef(onWarning);\n const onErrorRef = useRef(onError);\n const initialSourceRef = useRef<{\n documentId: string;\n initialDocx?: Uint8Array | ArrayBuffer;\n initialSnapshot?: PersistedEditorSnapshot;\n initialSourceLabel?: string;\n } | null>(null);\n\n if (!initialSourceRef.current || initialSourceRef.current.documentId !== documentId) {\n initialSourceRef.current = {\n documentId,\n initialDocx,\n initialSnapshot,\n initialSourceLabel,\n };\n }\n\n const stableInitialSource = initialSourceRef.current;\n const sourceReloadKey = externalDocSource\n ? `external:${externalDocSource.kind}:${externalDocumentRevision ?? \"static\"}`\n : stableInitialSource?.initialSnapshot\n ? \"initial-snapshot\"\n : stableInitialSource?.initialDocx\n ? \"initial-docx\"\n : \"datastore\";\n\n useEffect(() => {\n datastoreRef.current = datastore;\n onEventRef.current = onEvent;\n onWarningRef.current = onWarning;\n onErrorRef.current = onError;\n }, [datastore, onError, onEvent, onWarning]);\n\n useEffect(() => {\n let cancelled = false;\n\n async function loadRuntime(): Promise<void> {\n setLoadError(null);\n\n try {\n const source = await __resolveWordReviewEditorSource({\n documentId,\n datastore: datastoreRef.current,\n externalDocSource,\n initialDocx: stableInitialSource?.initialDocx,\n initialSnapshot: stableInitialSource?.initialSnapshot,\n initialSourceLabel: stableInitialSource?.initialSourceLabel,\n });\n\n if (cancelled) {\n return;\n }\n\n runtimeRef.current?.dispose?.();\n const nextRuntime = createRuntime(\n {\n documentId,\n readOnly,\n source,\n datastore: datastoreRef.current,\n currentUserId: currentUser.userId,\n },\n {\n onWarning: onWarningRef.current,\n onError: onErrorRef.current,\n },\n );\n emitEditorEvent({\n datastore: datastoreRef.current,\n onEvent: onEventRef.current,\n event: createReadyEvent(nextRuntime, source.source),\n });\n runtimeRef.current = nextRuntime;\n setRuntime(nextRuntime);\n } catch (error) {\n if (cancelled) {\n return;\n }\n\n const normalized = normalizeEditorError(error);\n setLoadError(normalized);\n onErrorRef.current?.(normalized);\n emitEditorEvent({\n datastore: datastoreRef.current,\n onEvent: onEventRef.current,\n event: {\n type: \"error\",\n documentId,\n error: normalized,\n },\n });\n }\n }\n\n void loadRuntime();\n\n return () => {\n cancelled = true;\n };\n }, [\n documentId,\n readOnly,\n sourceReloadKey,\n ]);\n\n useEffect(() => {\n if (!runtime?.subscribeToEvents) {\n return;\n }\n\n return runtime.subscribeToEvents((event) => {\n emitEditorEvent({\n datastore: datastoreRef.current,\n onEvent: onEventRef.current,\n event,\n });\n });\n }, [runtime]);\n\n useEffect(() => {\n return () => {\n if (autosaveTimerRef.current) {\n clearTimeout(autosaveTimerRef.current);\n autosaveTimerRef.current = null;\n }\n runtimeRef.current?.dispose?.();\n runtimeRef.current = null;\n };\n }, []);\n\n const optimisticRuntime = useMemo(\n () =>\n __createFallbackRuntime({\n documentId,\n readOnly,\n currentUserId: currentUser.userId,\n source: {\n source: \"snapshot\",\n initialSnapshot:\n initialSnapshot ?? createFallbackPersistedSnapshot(documentId, initialSourceLabel),\n sourceLabel: guessSourceLabel(initialSourceLabel, initialSnapshot, externalDocSource),\n },\n datastore: datastoreRef.current,\n }),\n [\n currentUser.userId,\n documentId,\n initialSnapshot,\n initialSourceLabel,\n readOnly,\n externalDocSource?.kind,\n externalDocSource?.sourceLabel,\n ],\n );\n\n const fallbackSnapshot = useMemo(\n () =>\n loadError\n ? createErrorSnapshot(documentId, loadError)\n : createLoadingSnapshot(\n documentId,\n readOnly,\n guessSourceLabel(initialSourceLabel, initialSnapshot, externalDocSource),\n ),\n [\n documentId,\n externalDocSource,\n initialSnapshot,\n initialSourceLabel,\n loadError,\n readOnly,\n ],\n );\n\n const snapshot = useSyncExternalStore(\n (listener) => runtime?.subscribe(listener) ?? (() => undefined),\n () => runtime?.getRenderSnapshot() ?? fallbackSnapshot,\n () => runtime?.getRenderSnapshot() ?? fallbackSnapshot,\n );\n\n const activeRuntime = runtime ?? optimisticRuntime;\n\n useImperativeHandle(\n ref,\n () => ({\n focus: () => activeRuntime.focus(),\n blur: () => activeRuntime.blur(),\n undo: () => activeRuntime.undo(),\n redo: () => activeRuntime.redo(),\n addComment: (params) =>\n activeRuntime.addComment({\n ...params,\n authorId: params.authorId ?? currentUser.userId,\n }),\n openComment: (commentId) => activeRuntime.openComment(commentId),\n resolveComment: (commentId) => activeRuntime.resolveComment(commentId),\n reopenComment: (commentId) => activeRuntime.reopenComment(commentId),\n addCommentReply: (commentId, body) =>\n activeRuntime.addCommentReply(commentId, body, currentUser.userId),\n editCommentBody: (commentId, body) =>\n activeRuntime.editCommentBody(commentId, body),\n acceptChange: (changeId) => activeRuntime.acceptChange(changeId),\n rejectChange: (changeId) => activeRuntime.rejectChange(changeId),\n acceptAllChanges: () => activeRuntime.acceptAllChanges(),\n rejectAllChanges: () => activeRuntime.rejectAllChanges(),\n exportDocx: (options) =>\n runtime\n ? persistAndExport({\n datastore: datastoreRef.current,\n documentId,\n runtime,\n onError: onErrorRef.current,\n onEvent: onEventRef.current,\n options,\n lastSavedRevisionTokenRef,\n autosaveTimerRef,\n })\n : rejectExportWhileLoading({\n documentId,\n datastore: datastoreRef.current,\n onError: onErrorRef.current,\n onEvent: onEventRef.current,\n }),\n getSnapshot: () => activeRuntime.getPersistedSnapshot(),\n getCompatibilityReport: () => activeRuntime.getCompatibilityReport(),\n getWarnings: () => activeRuntime.getWarnings(),\n }),\n [activeRuntime, currentUser.userId, documentId, runtime],\n );\n\n useEffect(() => {\n if (!datastoreRef.current || props.autosave?.enabled === false || !runtime || readOnly) {\n if (autosaveTimerRef.current) {\n clearTimeout(autosaveTimerRef.current);\n autosaveTimerRef.current = null;\n }\n return;\n }\n\n if (!snapshot.isReady || !snapshot.isDirty) {\n return;\n }\n\n if (lastSavedRevisionTokenRef.current === snapshot.revisionToken) {\n return;\n }\n\n if (autosaveTimerRef.current) {\n clearTimeout(autosaveTimerRef.current);\n }\n\n const debounceMs = props.autosave?.debounceMs ?? 800;\n if (debounceMs <= 0) {\n void persistSnapshot({\n datastore: datastoreRef.current,\n documentId,\n runtime,\n isAutosave: true,\n onError: onErrorRef.current,\n onEvent: onEventRef.current,\n lastSavedRevisionTokenRef,\n });\n return;\n }\n\n autosaveTimerRef.current = setTimeout(() => {\n void persistSnapshot({\n datastore: datastoreRef.current,\n documentId,\n runtime,\n isAutosave: true,\n onError: onErrorRef.current,\n onEvent: onEventRef.current,\n lastSavedRevisionTokenRef,\n });\n }, debounceMs);\n\n return () => {\n if (autosaveTimerRef.current) {\n clearTimeout(autosaveTimerRef.current);\n autosaveTimerRef.current = null;\n }\n };\n }, [\n documentId,\n props.autosave?.debounceMs,\n props.autosave?.enabled,\n readOnly,\n runtime,\n snapshot.isDirty,\n snapshot.isReady,\n snapshot.revisionToken,\n ]);\n\n // Auto-select the most relevant rail tab based on content.\n // Health tab was moved to toolbar popover — rail has only comments/changes.\n useEffect(() => {\n if (\n activeRailTab === \"comments\" &&\n snapshot.comments.totalCount === 0 &&\n snapshot.trackedChanges.totalCount > 0\n ) {\n setActiveRailTab(\"changes\");\n return;\n }\n }, [\n activeRailTab,\n loadError,\n snapshot.comments.totalCount,\n snapshot.compatibility.blockExport,\n snapshot.fatalError,\n snapshot.trackedChanges.totalCount,\n ]);\n\n function focusAnchor(anchor: PublicSelectionSnapshot[\"activeRange\"]): void {\n if (anchor.kind === \"detached\") {\n return;\n }\n\n activeRuntime.dispatch({\n type: \"selection.set\",\n selection: toRuntimeSelectionSnapshot(createSelectionFromAnchor(anchor)),\n });\n }\n\n function addReviewComment(): void {\n activeRuntime.addComment({\n anchor: snapshot.selection.activeRange,\n body: \"New review comment\",\n authorId: currentUser.userId,\n });\n setActiveRailTab(\"comments\");\n }\n\n function exportCurrentDocument(): void {\n void (runtime\n ? persistAndExport({\n datastore: datastoreRef.current,\n documentId,\n runtime,\n onError: onErrorRef.current,\n onEvent: onEventRef.current,\n lastSavedRevisionTokenRef,\n autosaveTimerRef,\n })\n : rejectExportWhileLoading({\n documentId,\n datastore: datastoreRef.current,\n onError: onErrorRef.current,\n onEvent: onEventRef.current,\n }));\n }\n\n const selectionPreview = summarizeSelectionPreview(snapshot);\n const capabilities = deriveCapabilities(snapshot, reviewMode);\n\n const dispatchSelection = (selection: PublicSelectionSnapshot) =>\n activeRuntime.dispatch({\n type: \"selection.set\",\n selection: toRuntimeSelectionSnapshot(selection),\n });\n\n const editorCallbacks = {\n onFocus: () => activeRuntime.focus(),\n onBlur: () => activeRuntime.blur(),\n onSelectionChange: dispatchSelection,\n onInsertText: (text: string) => activeRuntime.dispatch({ type: \"text.insert\", text }),\n onDeleteBackward: () => activeRuntime.dispatch({ type: \"text.delete-backward\" }),\n onDeleteForward: () => activeRuntime.dispatch({ type: \"text.delete-forward\" }),\n onInsertTab: () => activeRuntime.dispatch({ type: \"text.insert-tab\" }),\n onInsertHardBreak: () => activeRuntime.dispatch({ type: \"text.insert-hard-break\" }),\n onSplitParagraph: () => activeRuntime.dispatch({ type: \"paragraph.split\" }),\n };\n\n const reviewCallbacks = {\n onUndo: () => activeRuntime.undo(),\n onRedo: () => activeRuntime.redo(),\n onAddComment: addReviewComment,\n onExport: exportCurrentDocument,\n onOpenComment: (thread: typeof snapshot.comments.threads[number]) => {\n activeRuntime.openComment(thread.commentId);\n focusAnchor(thread.anchor);\n setActiveRailTab(\"comments\");\n },\n onResolveComment: (commentId: string) => {\n activeRuntime.resolveComment(commentId);\n setActiveRailTab(\"comments\");\n },\n onReopenComment: (commentId: string) => {\n activeRuntime.reopenComment(commentId);\n setActiveRailTab(\"comments\");\n },\n onAddReply: (commentId: string, body: string) => {\n activeRuntime.addCommentReply(commentId, body, currentUser.userId);\n },\n onEditBody: (commentId: string, body: string) => {\n activeRuntime.editCommentBody(commentId, body);\n },\n onOpenRevision: (revision: typeof snapshot.trackedChanges.revisions[number]) => {\n setActiveRevisionId(revision.revisionId);\n focusAnchor(revision.anchor);\n setActiveRailTab(\"changes\");\n },\n onAcceptRevision: (revisionId: string) => {\n activeRuntime.acceptChange(revisionId);\n setActiveRailTab(\"changes\");\n },\n onRejectRevision: (revisionId: string) => {\n activeRuntime.rejectChange(revisionId);\n setActiveRailTab(\"changes\");\n },\n onAcceptAllChanges: () => {\n activeRuntime.acceptAllChanges();\n setActiveRailTab(\"changes\");\n },\n onRejectAllChanges: () => {\n activeRuntime.rejectAllChanges();\n setActiveRailTab(\"changes\");\n },\n };\n\n return (\n <TwReviewWorkspace\n snapshot={snapshot}\n currentUserId={currentUser.userId}\n capabilities={capabilities}\n reviewMode={reviewMode}\n viewMode={viewMode}\n activeRailTab={activeRailTab}\n activeCommentId={snapshot.comments.activeCommentId}\n activeRevisionId={activeRevisionId}\n showTrackedChanges={showTrackedChanges}\n selectionPreview={selectionPreview}\n onViewModeChange={setViewMode}\n onActiveRailTabChange={setActiveRailTab}\n onShowTrackedChangesChange={setShowTrackedChanges}\n {...reviewCallbacks}\n document={\n <TwProseMirrorSurface\n currentUser={currentUser}\n snapshot={snapshot}\n reviewMode={reviewMode}\n markupDisplay={liveMarkupDisplay}\n activeRevisionId={activeRevisionId}\n showTrackedChanges={showTrackedChanges}\n {...editorCallbacks}\n onCommentActivated={(commentId) => {\n activeRuntime.openComment(commentId);\n setActiveRailTab(\"comments\");\n }}\n onRevisionActivated={(revisionId) => {\n setActiveRevisionId(revisionId);\n setActiveRailTab(\"changes\");\n }}\n />\n }\n />\n );\n },\n);\n\nfunction normalizeEditorError(error: unknown): EditorError {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"errorId\" in error &&\n \"code\" in error &&\n \"message\" in error\n ) {\n return error as EditorError;\n }\n\n return {\n errorId: \"word-review-editor-load\",\n code: \"internal_invariant\",\n message: error instanceof Error ? error.message : \"Unknown editor load failure.\",\n isFatal: true,\n source: \"runtime\",\n };\n}\n\nfunction guessSourceLabel(\n initialSourceLabel?: string,\n initialSnapshot?: PersistedEditorSnapshot,\n externalDocSource?: WordReviewEditorProps[\"externalDocSource\"],\n): string | undefined {\n return (\n externalDocSource?.sourceLabel ??\n initialSourceLabel ??\n initialSnapshot?.editorBuild ??\n undefined\n );\n}\n\nfunction createLoadingSnapshot(\n documentId: string,\n readOnly: boolean,\n sourceLabel?: string,\n): RuntimeRenderSnapshot {\n return {\n documentId,\n sessionId: `${documentId}-loading`,\n sourceLabel,\n revisionToken: `${documentId}:loading`,\n isReady: false,\n isDirty: false,\n readOnly,\n selection: collapsedSelection(),\n documentStats: {\n storyLength: 0,\n commentCount: 0,\n revisionCount: 0,\n opaqueFragmentCount: 0,\n },\n comments: {\n openCommentIds: [],\n resolvedCommentIds: [],\n detachedCommentIds: [],\n totalCount: 0,\n threads: [],\n },\n trackedChanges: {\n pendingChangeIds: [],\n acceptedChangeIds: [],\n rejectedChangeIds: [],\n detachedChangeIds: [],\n actionableChangeIds: [],\n preserveOnlyChangeIds: [],\n totalCount: 0,\n revisions: [],\n },\n compatibility: {\n blockExport: false,\n blockExportReasons: [],\n warningCount: 0,\n errorCount: 0,\n featureEntries: [],\n },\n warnings: [],\n commandState: {\n canUndo: false,\n canRedo: false,\n readOnly,\n },\n };\n}\n\nfunction createErrorSnapshot(documentId: string, error: EditorError): RuntimeRenderSnapshot {\n return {\n ...createLoadingSnapshot(documentId, true),\n isReady: true,\n sessionId: `${documentId}-error`,\n revisionToken: `${documentId}:error`,\n compatibility: {\n blockExport: true,\n blockExportReasons: [error.message],\n warningCount: 0,\n errorCount: 1,\n featureEntries: [],\n },\n fatalError: error,\n };\n}\n\nasync function persistAndExport(input: {\n datastore?: EditorDatastoreAdapter;\n documentId: string;\n runtime: WordReviewEditorRuntime;\n onError?: (error: EditorError) => void;\n onEvent?: (event: WordReviewEditorEvent) => void;\n options?: ExportDocxOptions;\n lastSavedRevisionTokenRef: React.MutableRefObject<string | null>;\n autosaveTimerRef: React.MutableRefObject<ReturnType<typeof setTimeout> | null>;\n}): Promise<ExportResult> {\n if (input.autosaveTimerRef.current) {\n clearTimeout(input.autosaveTimerRef.current);\n input.autosaveTimerRef.current = null;\n }\n\n await persistSnapshot({\n datastore: input.datastore,\n documentId: input.documentId,\n runtime: input.runtime,\n isAutosave: false,\n onError: input.onError,\n onEvent: input.onEvent,\n lastSavedRevisionTokenRef: input.lastSavedRevisionTokenRef,\n });\n\n const result = await input.runtime.exportDocx(input.options);\n\n if (!input.datastore) {\n return result;\n }\n\n try {\n await input.datastore.saveExport({\n documentId: input.documentId,\n result,\n });\n } catch (error) {\n const normalized = normalizeDatastoreError(error, {\n message: \"Export persisted bytes could not be stored.\",\n details: {\n operation: \"saveExport\",\n },\n });\n input.onError?.(normalized);\n emitEditorEvent({\n datastore: input.datastore,\n onEvent: input.onEvent,\n event: {\n type: \"error\",\n documentId: input.documentId,\n error: normalized,\n },\n });\n }\n\n return result;\n}\n\nfunction rejectExportWhileLoading(input: {\n documentId: string;\n datastore?: EditorDatastoreAdapter;\n onError?: (error: EditorError) => void;\n onEvent?: (event: WordReviewEditorEvent) => void;\n}): Promise<never> {\n const error: EditorError = {\n errorId: \"word-review-editor-loading-export\",\n code: \"internal_invariant\",\n message: \"WordReviewEditor is still loading and cannot export yet.\",\n isFatal: false,\n source: \"runtime\",\n };\n input.onError?.(error);\n emitEditorEvent({\n datastore: input.datastore,\n onEvent: input.onEvent,\n event: {\n type: \"error\",\n documentId: input.documentId,\n error,\n },\n });\n return Promise.reject(error);\n}\n\nasync function persistSnapshot(input: {\n datastore?: EditorDatastoreAdapter;\n documentId: string;\n runtime: WordReviewEditorRuntime;\n isAutosave: boolean;\n onError?: (error: EditorError) => void;\n onEvent?: (event: WordReviewEditorEvent) => void;\n lastSavedRevisionTokenRef: React.MutableRefObject<string | null>;\n}): Promise<void> {\n if (!input.datastore) {\n return;\n }\n\n const snapshot = input.runtime.getPersistedSnapshot();\n const revisionToken = input.runtime.getRenderSnapshot().revisionToken;\n\n if (input.isAutosave) {\n emitEditorEvent({\n datastore: input.datastore,\n onEvent: input.onEvent,\n event: {\n type: \"autosave_state\",\n documentId: input.documentId,\n state: {\n status: \"saving\",\n } satisfies AutosaveState,\n },\n });\n }\n\n try {\n const result = await input.datastore.saveSnapshot({\n documentId: input.documentId,\n snapshot,\n isAutosave: input.isAutosave,\n });\n const savedSnapshot: PersistedEditorSnapshot = {\n ...snapshot,\n savedAt: result.savedAt,\n };\n input.lastSavedRevisionTokenRef.current = revisionToken;\n emitEditorEvent({\n datastore: input.datastore,\n onEvent: input.onEvent,\n event: {\n type: \"snapshot_saved\",\n documentId: input.documentId,\n snapshot: savedSnapshot,\n isAutosave: input.isAutosave,\n },\n });\n if (input.isAutosave) {\n emitEditorEvent({\n datastore: input.datastore,\n onEvent: input.onEvent,\n event: {\n type: \"autosave_state\",\n documentId: input.documentId,\n state: {\n status: \"saved\",\n savedAt: result.savedAt,\n } satisfies AutosaveState,\n },\n });\n }\n } catch (error) {\n const normalized = normalizeDatastoreError(error, {\n message: input.isAutosave\n ? \"Autosave failed while storing the editor snapshot.\"\n : \"Snapshot save failed while preparing the export checkpoint.\",\n details: {\n operation: \"saveSnapshot\",\n isAutosave: input.isAutosave,\n },\n });\n input.onError?.(normalized);\n emitEditorEvent({\n datastore: input.datastore,\n onEvent: input.onEvent,\n event: {\n type: \"error\",\n documentId: input.documentId,\n error: normalized,\n },\n });\n if (input.isAutosave) {\n emitEditorEvent({\n datastore: input.datastore,\n onEvent: input.onEvent,\n event: {\n type: \"autosave_state\",\n documentId: input.documentId,\n state: {\n status: \"error\",\n error: normalized,\n } satisfies AutosaveState,\n },\n });\n }\n if (!input.isAutosave) {\n throw normalized;\n }\n }\n}\n\nfunction emitEditorEvent(input: {\n datastore?: EditorDatastoreAdapter;\n onEvent?: (event: WordReviewEditorEvent) => void;\n event: WordReviewEditorEvent;\n}): void {\n input.onEvent?.(input.event);\n input.datastore?.logEvent?.({\n type: input.event.type,\n documentId: input.event.documentId,\n detail: summarizeEventDetail(input.event),\n });\n}\n\nfunction summarizeEventDetail(\n event: WordReviewEditorEvent,\n): Record<string, unknown> | undefined {\n switch (event.type) {\n case \"dirty_changed\":\n return { isDirty: event.isDirty };\n case \"comment_added\":\n return { commentId: event.commentId };\n case \"comment_resolved\":\n return { commentId: event.commentId };\n case \"change_accepted\":\n case \"change_rejected\":\n return { changeId: event.changeId };\n case \"warning_added\":\n return { warningId: event.warning.warningId, code: event.warning.code };\n case \"warning_cleared\":\n return { warningId: event.warningId, code: event.code };\n case \"error\":\n return { errorId: event.error.errorId, code: event.error.code };\n case \"autosave_state\":\n return { status: event.state.status };\n case \"snapshot_saved\":\n return { isAutosave: event.isAutosave, savedAt: event.snapshot.savedAt };\n case \"export_completed\":\n return { fileName: event.result.fileName };\n case \"selection_changed\":\n return {\n anchor: event.selection.anchor,\n head: event.selection.head,\n };\n case \"ready\":\n return {\n source: event.source,\n blockExport: event.compatibility.blockExport,\n };\n }\n}\n\nfunction createReadyEvent(\n runtime: Pick<WordReviewEditorRuntime, \"getCompatibilityReport\" | \"getRenderSnapshot\">,\n source: \"docx\" | \"snapshot\" | \"datastore\" | \"canonical\",\n): Extract<WordReviewEditorEvent, { type: \"ready\" }> {\n const snapshot = runtime.getRenderSnapshot();\n return {\n type: \"ready\",\n documentId: snapshot.documentId,\n sessionId: snapshot.sessionId,\n source,\n stats: snapshot.documentStats,\n compatibility: runtime.getCompatibilityReport(),\n };\n}\n\nfunction normalizeDatastoreError(\n error: unknown,\n fallback: {\n message: string;\n details?: Record<string, unknown>;\n },\n): EditorError {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"errorId\" in error &&\n \"code\" in error &&\n \"message\" in error\n ) {\n return error as EditorError;\n }\n\n return {\n errorId: \"word-review-editor-datastore\",\n code: \"datastore_failed\",\n message: error instanceof Error ? error.message : fallback.message,\n isFatal: false,\n source: \"datastore\",\n details: fallback.details,\n };\n}\n\nfunction createFallbackSnapshot(args: CreateRuntimeArgs): RuntimeRenderSnapshot {\n const warnings = args.source.initialSnapshot?.warningLog ?? [];\n const compatibility = args.source.initialSnapshot?.compatibility ?? emptyCompatibilityReport();\n\n return {\n ...createLoadingSnapshot(args.documentId, args.readOnly, args.source.sourceLabel),\n sessionId: `${args.documentId}-session`,\n revisionToken: `${args.documentId}:0`,\n isReady: true,\n documentStats: {\n storyLength: estimateStoryLength(args.source.initialSnapshot),\n commentCount: 0,\n revisionCount: 0,\n opaqueFragmentCount: 0,\n },\n compatibility: {\n blockExport: compatibility.blockExport,\n blockExportReasons: [],\n warningCount: compatibility.warnings.length,\n errorCount: compatibility.errors.length,\n featureEntries: compatibility.featureEntries,\n },\n warnings,\n };\n}\n\nfunction createFallbackPersistedSnapshot(\n documentId: string,\n label = \"Generated shell snapshot\",\n): PersistedEditorSnapshot {\n const docId = createCanonicalDocumentId(documentId);\n return {\n snapshotVersion: \"persisted-editor-snapshot/1\",\n schemaVersion: \"cds/1.0.0\",\n documentId,\n docId,\n createdAt: \"1970-01-01T00:00:00.000Z\",\n updatedAt: \"1970-01-01T00:00:00.000Z\",\n savedAt: \"1970-01-01T00:00:00.000Z\",\n editorBuild: label,\n canonicalDocument: {\n schemaVersion: \"cds/1.0.0\",\n docId,\n createdAt: \"1970-01-01T00:00:00.000Z\",\n updatedAt: \"1970-01-01T00:00:00.000Z\",\n metadata: {\n customProperties: {},\n },\n styles: {\n paragraphs: {},\n characters: {},\n tables: {},\n },\n numbering: {\n abstractDefinitions: {},\n instances: {},\n },\n media: {\n items: {},\n },\n content: {\n type: \"doc\",\n children: [{ type: \"paragraph\", children: [] }],\n },\n review: {\n comments: {},\n revisions: {},\n },\n preservation: {\n opaqueFragments: {},\n packageParts: {},\n },\n diagnostics: {\n warnings: [],\n errors: [],\n },\n },\n compatibility: emptyCompatibilityReport(),\n warningLog: [],\n };\n}\n\nfunction emptyCompatibilityReport(): CompatibilityReport {\n return {\n reportVersion: \"compatibility-report/1\",\n generatedAt: \"1970-01-01T00:00:00.000Z\",\n blockExport: false,\n featureEntries: [],\n warnings: [],\n errors: [],\n };\n}\n\nfunction toRuntimeSelectionSnapshot(selection: PublicSelectionSnapshot) {\n return {\n anchor: selection.anchor,\n head: selection.head,\n isCollapsed: selection.isCollapsed,\n activeRange:\n selection.activeRange.kind === \"range\"\n ? createRangeAnchor(\n selection.activeRange.from,\n selection.activeRange.to,\n selection.activeRange.assoc,\n )\n : selection.activeRange.kind === \"node\"\n ? createNodeAnchor(selection.activeRange.at, selection.activeRange.assoc)\n : createDetachedAnchor(\n selection.activeRange.lastKnownRange,\n selection.activeRange.reason,\n ),\n };\n}\n\nfunction createSelectionFromAnchor(\n anchor: PublicSelectionSnapshot[\"activeRange\"],\n): PublicSelectionSnapshot {\n switch (anchor.kind) {\n case \"range\":\n return {\n anchor: anchor.from,\n head: anchor.to,\n isCollapsed: anchor.from === anchor.to,\n activeRange: anchor,\n };\n case \"node\":\n return {\n anchor: anchor.at,\n head: anchor.at,\n isCollapsed: true,\n activeRange: anchor,\n };\n case \"detached\":\n return {\n anchor: anchor.lastKnownRange.from,\n head: anchor.lastKnownRange.to,\n isCollapsed: anchor.lastKnownRange.from === anchor.lastKnownRange.to,\n activeRange: anchor,\n };\n }\n}\n\nfunction estimateStoryLength(snapshot?: PersistedEditorSnapshot): number {\n const content = snapshot?.canonicalDocument.content;\n return Array.isArray(content) ? content.length : 0;\n}\n\nfunction collapsedSelection(): RuntimeRenderSnapshot[\"selection\"] {\n return {\n anchor: 0,\n head: 0,\n isCollapsed: true,\n activeRange: {\n kind: \"range\",\n from: 0,\n to: 0,\n assoc: {\n start: -1,\n end: 1,\n },\n },\n };\n}\n\nfunction toUint8Array(bytes: Uint8Array | ArrayBuffer): Uint8Array {\n return bytes instanceof Uint8Array ? new Uint8Array(bytes) : new Uint8Array(bytes);\n}\n\nfunction summarizeSelectionPreview(snapshot: RuntimeRenderSnapshot): string | null {\n if (!snapshot.surface || snapshot.selection.isCollapsed) {\n return null;\n }\n\n const range = snapshot.selection.activeRange;\n if (range.kind !== \"range\") {\n return \"Selected range\";\n }\n\n const preview = snapshot.surface.plainText\n .slice(range.from, range.to)\n .replace(/\\s+/g, \" \")\n .trim();\n\n if (!preview) {\n return \"Selected range\";\n }\n\n return preview.length > 48 ? `${preview.slice(0, 45)}...` : preview;\n}\n","export type Position = number;\nexport type Assoc = -1 | 1;\n\nexport interface DocRange {\n from: Position;\n to: Position;\n}\n\nexport interface BoundaryAssoc {\n start: Assoc;\n end: Assoc;\n}\n\nexport interface RangeAnchor {\n kind: \"range\";\n range: DocRange;\n assoc: BoundaryAssoc;\n}\n\nexport interface NodeAnchor {\n kind: \"node\";\n at: Position;\n assoc: Assoc;\n}\n\nexport interface DetachedAnchor {\n kind: \"detached\";\n lastKnownRange: DocRange;\n reason: \"deleted\" | \"invalidatedByStructureChange\" | \"importAmbiguity\";\n}\n\nexport type EditorAnchorProjection = RangeAnchor | NodeAnchor | DetachedAnchor;\n\nexport interface MappingStep {\n from: Position;\n to: Position;\n insertSize: number;\n}\n\nexport interface MappingResult {\n position: Position;\n deleted: boolean;\n}\n\nexport interface TransactionMapping {\n steps: MappingStep[];\n metadata?: {\n invalidatesStructures?: boolean;\n affectsComments?: boolean;\n affectsRevisions?: boolean;\n affectsOpaqueFragments?: boolean;\n [key: string]: unknown;\n };\n}\n\nexport const DEFAULT_BOUNDARY_ASSOC: BoundaryAssoc = {\n start: 1,\n end: -1,\n};\n\nexport function createRangeAnchor(\n from: Position,\n to = from,\n assoc: BoundaryAssoc = DEFAULT_BOUNDARY_ASSOC,\n): RangeAnchor {\n return {\n kind: \"range\",\n range: normalizeRange({ from, to }),\n assoc,\n };\n}\n\nexport function createNodeAnchor(at: Position, assoc: Assoc = 1): NodeAnchor {\n return {\n kind: \"node\",\n at,\n assoc,\n };\n}\n\nexport function createDetachedAnchor(\n lastKnownRange: DocRange,\n reason: DetachedAnchor[\"reason\"],\n): DetachedAnchor {\n return {\n kind: \"detached\",\n lastKnownRange: normalizeRange(lastKnownRange),\n reason,\n };\n}\n\nexport function createEmptyMapping(): TransactionMapping {\n return {\n steps: [],\n };\n}\n\nexport function normalizeRange(range: DocRange): DocRange {\n return range.from <= range.to\n ? { from: range.from, to: range.to }\n : { from: range.to, to: range.from };\n}\n\nexport function mapPosition(\n position: Position,\n assoc: Assoc,\n mapping: TransactionMapping,\n): MappingResult {\n let mappedPosition = position;\n let deleted = false;\n\n for (const step of mapping.steps) {\n const next = mapPositionThroughStep(mappedPosition, assoc, step);\n mappedPosition = next.position;\n deleted = deleted || next.deleted;\n }\n\n return {\n position: mappedPosition,\n deleted,\n };\n}\n\nexport function mapAnchor(\n anchor: EditorAnchorProjection,\n mapping: TransactionMapping,\n): EditorAnchorProjection {\n if (anchor.kind === \"detached\") {\n return anchor;\n }\n\n if (anchor.kind === \"node\") {\n const mapped = mapPosition(anchor.at, anchor.assoc, mapping);\n\n if (mapped.deleted) {\n return createDetachedAnchor(\n { from: anchor.at, to: anchor.at + 1 },\n mapping.metadata?.invalidatesStructures\n ? \"invalidatedByStructureChange\"\n : \"deleted\",\n );\n }\n\n return createNodeAnchor(mapped.position, anchor.assoc);\n }\n\n const from = mapPosition(anchor.range.from, anchor.assoc.start, mapping);\n const to = mapPosition(anchor.range.to, anchor.assoc.end, mapping);\n const mappedRange = normalizeRange({ from: from.position, to: to.position });\n\n if (from.deleted && to.deleted && mappedRange.from === mappedRange.to) {\n return createDetachedAnchor(\n anchor.range,\n mapping.metadata?.invalidatesStructures\n ? \"invalidatedByStructureChange\"\n : \"deleted\",\n );\n }\n\n return createRangeAnchor(mappedRange.from, mappedRange.to, anchor.assoc);\n}\n\nexport function mapRange(\n range: DocRange,\n assoc: BoundaryAssoc,\n mapping: TransactionMapping,\n): RangeAnchor | DetachedAnchor {\n const mapped = mapAnchor(createRangeAnchor(range.from, range.to, assoc), mapping);\n return mapped.kind === \"node\" ? createRangeAnchor(mapped.at, mapped.at, assoc) : mapped;\n}\n\nexport function areAnchorsEqual(\n left: EditorAnchorProjection,\n right: EditorAnchorProjection,\n): boolean {\n if (left.kind !== right.kind) {\n return false;\n }\n\n if (left.kind === \"detached\" && right.kind === \"detached\") {\n return (\n left.reason === right.reason &&\n left.lastKnownRange.from === right.lastKnownRange.from &&\n left.lastKnownRange.to === right.lastKnownRange.to\n );\n }\n\n if (left.kind === \"node\" && right.kind === \"node\") {\n return left.at === right.at && left.assoc === right.assoc;\n }\n\n if (left.kind === \"range\" && right.kind === \"range\") {\n return (\n left.range.from === right.range.from &&\n left.range.to === right.range.to &&\n left.assoc.start === right.assoc.start &&\n left.assoc.end === right.assoc.end\n );\n }\n\n return false;\n}\n\nfunction mapPositionThroughStep(\n position: Position,\n assoc: Assoc,\n step: MappingStep,\n): MappingResult {\n if (position < step.from) {\n return { position, deleted: false };\n }\n\n if (position > step.to) {\n return {\n position: position + step.insertSize - (step.to - step.from),\n deleted: false,\n };\n }\n\n if (position === step.from) {\n return {\n position: assoc < 0 ? step.from : step.from + step.insertSize,\n deleted: false,\n };\n }\n\n if (position === step.to) {\n return {\n position: assoc < 0 ? step.from : step.from + step.insertSize,\n deleted: false,\n };\n }\n\n return {\n position: assoc < 0 ? step.from : step.from + step.insertSize,\n deleted: true,\n };\n}\n","export const CDS_SCHEMA_VERSION = \"cds/1.0.0\" as const;\nexport const PERSISTED_EDITOR_SNAPSHOT_VERSION =\n \"persisted-editor-snapshot/1\" as const;\nexport const COMPATIBILITY_REPORT_VERSION = \"compatibility-report/1\" as const;\n\nexport type CDS_SchemaVersion = typeof CDS_SCHEMA_VERSION;\nexport type PersistedEditorSnapshotVersion =\n typeof PERSISTED_EDITOR_SNAPSHOT_VERSION;\nexport type CompatibilityReportVersion = typeof COMPATIBILITY_REPORT_VERSION;\n\nexport type Id = string;\nexport type UUID = string;\nexport type ISO8601DateTime = string;\nexport type Base64 = string;\nexport type PartName = string;\nexport type RelationshipId = string;\n\nexport type JsonPrimitive = string | number | boolean | null;\nexport type JsonValue = JsonPrimitive | JsonObject | JsonValue[];\n\nexport interface JsonObject {\n [key: string]: JsonValue | undefined;\n}\n\nexport interface ModelValidationIssue {\n path: string;\n message: string;\n}\n\nexport class ModelValidationError extends Error {\n readonly issues: readonly ModelValidationIssue[];\n\n constructor(message: string, issues: readonly ModelValidationIssue[]) {\n super(message);\n this.name = \"ModelValidationError\";\n this.issues = issues;\n }\n}\n\nconst UUID_PATTERN =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\nconst ISO_8601_UTC_PATTERN =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{3})?Z$/;\n\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nexport function isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nexport function isUuid(value: unknown): value is UUID {\n return typeof value === \"string\" && UUID_PATTERN.test(value);\n}\n\nexport function isIso8601UtcTimestamp(\n value: unknown,\n): value is ISO8601DateTime {\n return (\n typeof value === \"string\" &&\n ISO_8601_UTC_PATTERN.test(value) &&\n !Number.isNaN(Date.parse(value))\n );\n}\n\nexport function asPlainObject(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): Record<string, unknown> | null {\n if (!isPlainObject(value)) {\n issues.push({ path, message: \"Expected a plain object.\" });\n return null;\n }\n\n return value;\n}\n\nexport function expectString(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): string | null {\n if (!isNonEmptyString(value)) {\n issues.push({ path, message: \"Expected a non-empty string.\" });\n return null;\n }\n\n return value;\n}\n\nexport function expectExactString<T extends string>(\n value: unknown,\n expected: T,\n path: string,\n issues: ModelValidationIssue[],\n): T | null {\n if (value !== expected) {\n issues.push({\n path,\n message: `Expected ${JSON.stringify(expected)}.`,\n });\n return null;\n }\n\n return expected;\n}\n\nexport function expectIso8601UtcTimestamp(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): ISO8601DateTime | null {\n if (!isIso8601UtcTimestamp(value)) {\n issues.push({\n path,\n message: \"Expected an ISO 8601 UTC timestamp string.\",\n });\n return null;\n }\n\n return value;\n}\n\nexport function expectUuid(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): UUID | null {\n if (!isUuid(value)) {\n issues.push({\n path,\n message: \"Expected an RFC 4122 UUID string.\",\n });\n return null;\n }\n\n return value;\n}\n\nexport function sortRecordKeys<T>(\n record: Record<string, T>,\n): Array<[string, T]> {\n return Object.entries(record).sort(([left], [right]) =>\n left.localeCompare(right),\n );\n}\n\nexport function assertValid(\n issues: readonly ModelValidationIssue[],\n message: string,\n): void {\n if (issues.length > 0) {\n throw new ModelValidationError(message, issues);\n }\n}\n\nfunction toStableJsonValue(value: unknown): JsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => toStableJsonValue(item));\n }\n\n if (!isPlainObject(value)) {\n throw new TypeError(\"Cannot serialize non-JSON value.\");\n }\n\n const sortedEntries = sortRecordKeys(value).filter(\n ([, entryValue]) => entryValue !== undefined,\n );\n const result: JsonObject = {};\n\n for (const [key, entryValue] of sortedEntries) {\n result[key] = toStableJsonValue(entryValue);\n }\n\n return result;\n}\n\nexport function stableStringify(value: unknown): string {\n return JSON.stringify(toStableJsonValue(value));\n}\n","import {\n CDS_SCHEMA_VERSION,\n type ISO8601DateTime,\n type ModelValidationIssue,\n type UUID,\n asPlainObject,\n assertValid,\n expectExactString,\n expectIso8601UtcTimestamp,\n expectString,\n expectUuid,\n stableStringify,\n} from \"./cds-1.0.0.ts\";\n\nconst CANONICAL_DOCUMENT_TOP_LEVEL_KEYS = [\n \"schemaVersion\",\n \"docId\",\n \"createdAt\",\n \"updatedAt\",\n \"metadata\",\n \"styles\",\n \"numbering\",\n \"media\",\n \"content\",\n \"review\",\n \"preservation\",\n \"diagnostics\",\n] as const;\n\nconst CANONICAL_DOCUMENT_OPTIONAL_KEYS = [\"subParts\"] as const;\n\nconst ID_PATTERNS = {\n styleId: /^[A-Za-z_][A-Za-z0-9._-]{0,127}$/,\n abstractNumberingId: /^abstract-num:[A-Za-z0-9._-]{1,120}$/,\n numberingInstanceId: /^num:[A-Za-z0-9._-]{1,120}$/,\n mediaId: /^media:[A-Za-z0-9._/-]{1,120}$/,\n commentId:\n /^(?:comment:[A-Za-z0-9._-]{1,120}|comment-[A-Za-z0-9._-]{1,120}|[0-9]{1,18})$/,\n revisionId:\n /^(?:revision:[A-Za-z0-9._-]{1,120}|change-[A-Za-z0-9._-]{1,120})$/,\n fragmentId: /^fragment:[A-Za-z0-9._-]{1,120}$/,\n warningId: /^warning:[A-Za-z0-9._:-]{1,120}$/,\n diagnosticId: /^diagnostic:[A-Za-z0-9._-]{1,120}$/,\n packagePartName: /^\\/[A-Za-z0-9_.\\-\\/]+\\.[A-Za-z0-9]+$/,\n relationshipId: /^rId[A-Za-z0-9._-]{1,120}$/,\n} as const;\n\ntype StableIdDomain = keyof typeof ID_PATTERNS;\n\nexport interface CanonicalDocument {\n schemaVersion: typeof CDS_SCHEMA_VERSION;\n docId: UUID;\n createdAt: ISO8601DateTime;\n updatedAt: ISO8601DateTime;\n metadata: DocumentMetadata;\n styles: StylesCatalog;\n numbering: NumberingCatalog;\n media: MediaCatalog;\n content: DocumentNode;\n review: ReviewStore;\n preservation: PreservationStore;\n diagnostics: DiagnosticStore;\n subParts?: SubPartsCatalog;\n}\n\nexport interface DocumentMetadata {\n title?: string;\n subject?: string;\n description?: string;\n language?: string;\n keywords?: string[];\n category?: string;\n customProperties: Record<string, string>;\n}\n\nexport interface StylesCatalog {\n paragraphs: Record<string, ParagraphStyleDefinition>;\n characters: Record<string, CharacterStyleDefinition>;\n tables: Record<string, TableStyleDefinition>;\n latentStyles?: Record<string, LatentStyleDefinition>;\n}\n\nexport interface ParagraphStyleDefinition {\n styleId: string;\n basedOn?: string;\n nextStyle?: string;\n displayName: string;\n kind: \"paragraph\";\n isDefault: boolean;\n}\n\nexport interface CharacterStyleDefinition {\n styleId: string;\n basedOn?: string;\n displayName: string;\n kind: \"character\";\n isDefault: boolean;\n}\n\nexport interface TableStyleDefinition {\n styleId: string;\n basedOn?: string;\n displayName: string;\n kind: \"table\";\n isDefault: boolean;\n}\n\nexport interface LatentStyleDefinition {\n name: string;\n locked?: boolean;\n semiHidden?: boolean;\n unhideWhenUsed?: boolean;\n qFormat?: boolean;\n uiPriority?: number;\n}\n\nexport interface NumberingCatalog {\n abstractDefinitions: Record<string, AbstractNumberingDefinition>;\n instances: Record<string, NumberingInstance>;\n}\n\nexport interface AbstractNumberingDefinition {\n abstractNumberingId: string;\n levels: NumberingLevelDefinition[];\n}\n\nexport interface NumberingLevelDefinition {\n level: number;\n format: string;\n text: string;\n startAt?: number;\n paragraphStyleId?: string;\n}\n\nexport interface NumberingInstance {\n numberingInstanceId: string;\n abstractNumberingId: string;\n overrides: NumberingLevelOverride[];\n}\n\nexport interface NumberingLevelOverride {\n level: number;\n startAt?: number;\n}\n\nexport interface MediaCatalog {\n items: Record<string, MediaItem>;\n}\n\nexport interface MediaItem {\n mediaId: string;\n contentType: string;\n filename: string;\n relationshipId?: string;\n packagePartName: string;\n altText?: string;\n}\n\n// ---- Sub-part canonical types ----\n\nexport type HeaderFooterVariant = \"default\" | \"first\" | \"even\";\n\nexport interface HeaderDocument {\n variant: HeaderFooterVariant;\n partPath: string;\n relationshipId: string;\n blocks: BlockNode[];\n}\n\nexport interface FooterDocument {\n variant: HeaderFooterVariant;\n partPath: string;\n relationshipId: string;\n blocks: BlockNode[];\n}\n\nexport interface FootnoteDefinition {\n noteId: string;\n kind: \"footnote\" | \"endnote\";\n blocks: BlockNode[];\n}\n\nexport interface FootnoteCollection {\n footnotes: Record<string, FootnoteDefinition>;\n endnotes: Record<string, FootnoteDefinition>;\n}\n\nexport interface ThemeColorScheme {\n name: string;\n colors: Record<string, string>;\n}\n\nexport interface ThemeFontScheme {\n name: string;\n majorFont?: string;\n minorFont?: string;\n}\n\nexport interface ThemeDefinition {\n name?: string;\n colorScheme?: ThemeColorScheme;\n fontScheme?: ThemeFontScheme;\n}\n\nexport interface SubPartsCatalog {\n headers: HeaderDocument[];\n footers: FooterDocument[];\n footnoteCollection?: FootnoteCollection;\n theme?: ThemeDefinition;\n}\n\n// ---- Inline footnote reference node ----\n\nexport interface FootnoteRefNode {\n type: \"footnote_ref\";\n noteId: string;\n noteKind: \"footnote\" | \"endnote\";\n}\n\nexport type DocumentNode =\n | DocumentRootNode\n | ParagraphNode\n | TableNode\n | TableRowNode\n | TableCellNode\n | SdtNode\n | CustomXmlNode\n | AltChunkNode\n | TextNode\n | HardBreakNode\n | TabNode\n | ColumnBreakNode\n | SymbolNode\n | HyperlinkNode\n | ImageNode\n | FieldNode\n | BookmarkStartNode\n | BookmarkEndNode\n | SectionBreakNode\n | OpaqueInlineNode\n | OpaqueBlockNode\n | FootnoteRefNode\n | ChartPreviewNode\n | SmartArtPreviewNode\n | ShapeNode\n | WordArtNode\n | VmlShapeNode;\n\nexport interface DocumentRootNode {\n type: \"doc\";\n children: BlockNode[];\n}\n\nexport type BlockNode =\n | ParagraphNode\n | TableNode\n | SdtNode\n | CustomXmlNode\n | AltChunkNode\n | SectionBreakNode\n | OpaqueBlockNode;\n\nexport interface ParagraphSpacing {\n before?: number;\n after?: number;\n line?: number;\n lineRule?: \"auto\" | \"exact\" | \"atLeast\";\n}\n\nexport interface ParagraphIndentation {\n left?: number;\n right?: number;\n firstLine?: number;\n hanging?: number;\n}\n\nexport interface TabStop {\n position: number;\n align: \"left\" | \"center\" | \"right\" | \"decimal\" | \"bar\" | \"clear\";\n leader?: \"none\" | \"dot\" | \"hyphen\" | \"underscore\" | \"heavy\" | \"middleDot\";\n}\n\nexport interface ParagraphBorders {\n top?: BorderSpec;\n left?: BorderSpec;\n bottom?: BorderSpec;\n right?: BorderSpec;\n bar?: BorderSpec;\n between?: BorderSpec;\n}\n\nexport interface ParagraphShading {\n fill?: string;\n color?: string;\n val?: string;\n}\n\nexport interface ParagraphNode {\n type: \"paragraph\";\n styleId?: string;\n numbering?: {\n numberingInstanceId: string;\n level: number;\n };\n alignment?: \"left\" | \"center\" | \"right\" | \"both\" | \"distribute\";\n spacing?: ParagraphSpacing;\n indentation?: ParagraphIndentation;\n tabStops?: TabStop[];\n keepNext?: boolean;\n keepLines?: boolean;\n outlineLevel?: number;\n pageBreakBefore?: boolean;\n widowControl?: boolean;\n borders?: ParagraphBorders;\n shading?: ParagraphShading;\n bidi?: boolean;\n suppressLineNumbers?: boolean;\n cnfStyle?: string;\n children: InlineNode[];\n}\n\nexport interface BorderSpec {\n value?: string;\n size?: number;\n space?: number;\n color?: string;\n}\n\nexport interface TableBorders {\n top?: BorderSpec;\n left?: BorderSpec;\n bottom?: BorderSpec;\n right?: BorderSpec;\n insideH?: BorderSpec;\n insideV?: BorderSpec;\n}\n\nexport interface TableCellBorders {\n top?: BorderSpec;\n left?: BorderSpec;\n bottom?: BorderSpec;\n right?: BorderSpec;\n insideH?: BorderSpec;\n insideV?: BorderSpec;\n}\n\nexport interface TableWidth {\n value: number;\n type: \"dxa\" | \"auto\" | \"pct\" | \"nil\";\n}\n\nexport interface CellShading {\n fill?: string;\n color?: string;\n val?: string;\n}\n\nexport interface TableCellMargins {\n top?: number;\n left?: number;\n bottom?: number;\n right?: number;\n}\n\nexport interface TableLook {\n val?: string;\n firstRow?: boolean;\n lastRow?: boolean;\n firstColumn?: boolean;\n lastColumn?: boolean;\n noHBand?: boolean;\n noVBand?: boolean;\n}\n\nexport interface TableNode {\n type: \"table\";\n styleId?: string;\n propertiesXml?: string;\n gridColumns: number[];\n rows: TableRowNode[];\n width?: TableWidth;\n alignment?: \"left\" | \"center\" | \"right\";\n borders?: TableBorders;\n cellMargins?: TableCellMargins;\n tblLook?: TableLook;\n}\n\nexport interface TableRowNode {\n type: \"table_row\";\n propertiesXml?: string;\n cells: TableCellNode[];\n height?: number;\n heightRule?: \"auto\" | \"atLeast\" | \"exact\";\n isHeader?: boolean;\n}\n\nexport interface TableCellNode {\n type: \"table_cell\";\n propertiesXml?: string;\n gridSpan?: number;\n verticalMerge?: \"restart\" | \"continue\";\n children: BlockNode[];\n width?: TableWidth;\n borders?: TableCellBorders;\n shading?: CellShading;\n verticalAlign?: \"top\" | \"center\" | \"bottom\";\n}\n\nexport interface SdtNode {\n type: \"sdt\";\n properties: {\n sdtType?: string;\n alias?: string;\n tag?: string;\n lock?: string;\n propertiesXml?: string;\n };\n children: BlockNode[];\n}\n\nexport interface CustomXmlNode {\n type: \"custom_xml\";\n uri?: string;\n element?: string;\n children: BlockNode[];\n}\n\nexport interface AltChunkNode {\n type: \"alt_chunk\";\n relationshipId: string;\n}\n\nexport interface FieldNode {\n type: \"field\";\n fieldType: \"simple\" | \"complex\";\n instruction: string;\n children: InlineNode[];\n}\n\nexport interface BookmarkStartNode {\n type: \"bookmark_start\";\n bookmarkId: string;\n name: string;\n}\n\nexport interface BookmarkEndNode {\n type: \"bookmark_end\";\n bookmarkId: string;\n}\n\nexport interface SectionBreakNode {\n type: \"section_break\";\n propertiesXml?: string;\n}\n\nexport type InlineNode =\n | TextNode\n | HardBreakNode\n | TabNode\n | HyperlinkNode\n | ImageNode\n | FieldNode\n | BookmarkStartNode\n | BookmarkEndNode\n | OpaqueInlineNode\n | FootnoteRefNode\n | ChartPreviewNode\n | SmartArtPreviewNode\n | ShapeNode\n | WordArtNode\n | VmlShapeNode;\n\nexport interface TextNode {\n type: \"text\";\n text: string;\n marks?: TextMark[];\n}\n\nexport type TextMark =\n | { type: \"bold\" }\n | { type: \"italic\" }\n | { type: \"underline\" }\n | { type: \"strikethrough\" }\n | { type: \"doubleStrikethrough\" }\n | { type: \"vanish\" }\n | { type: \"lang\"; val: string }\n | { type: \"backgroundColor\"; color: string }\n | { type: \"charSpacing\"; val: number }\n | { type: \"kerning\"; val: number }\n | { type: \"emboss\" }\n | { type: \"imprint\" }\n | { type: \"shadow\" }\n | { type: \"position\"; val: number }\n | { type: \"textFill\"; xml: string };\n\nexport interface HardBreakNode {\n type: \"hard_break\";\n}\n\nexport interface ColumnBreakNode {\n type: \"column_break\";\n}\n\nexport interface TabNode {\n type: \"tab\";\n}\n\nexport interface SymbolNode {\n type: \"symbol\";\n char: string;\n font?: string;\n marks?: TextMark[];\n}\n\nexport interface HyperlinkNode {\n type: \"hyperlink\";\n href: string;\n children: Array<TextNode | HardBreakNode | ColumnBreakNode | TabNode | SymbolNode>;\n}\n\nexport interface ImageNode {\n type: \"image\";\n mediaId: string;\n altText?: string;\n placementXml?: string;\n display?: \"inline\" | \"floating\";\n floating?: FloatingImageProperties;\n}\n\nexport interface FloatingImageProperties {\n horizontalPosition?: FloatingAxisPosition;\n verticalPosition?: FloatingAxisPosition;\n wrap?: \"none\" | \"square\" | \"tight\" | \"through\" | \"topAndBottom\";\n behindDoc?: boolean;\n layoutInCell?: boolean;\n allowOverlap?: boolean;\n}\n\nexport interface FloatingAxisPosition {\n relativeFrom?: string;\n align?: string;\n offset?: number;\n}\n\nexport interface OpaqueInlineNode {\n type: \"opaque_inline\";\n fragmentId: string;\n warningId: string;\n}\n\n// ---- Complex rendering inline nodes (read-only previews) ----\n\n/**\n * Read-only preview of a chart (c:chart). The original drawing XML is stored in\n * rawXml for lossless round-trip export. If a fallback image was present in\n * mc:AlternateContent it is referenced by previewMediaId.\n */\nexport interface ChartPreviewNode {\n type: \"chart_preview\";\n previewMediaId?: string;\n rawXml: string;\n}\n\n/**\n * Read-only preview of a SmartArt diagram (dgm:*). The original drawing XML is\n * stored in rawXml for lossless round-trip export.\n */\nexport interface SmartArtPreviewNode {\n type: \"smartart_preview\";\n previewMediaId?: string;\n rawXml: string;\n}\n\n/**\n * Read-only rendering of a wps:wsp WordprocessingShape. Text content is\n * extracted for display. The original drawing XML is preserved in rawXml.\n */\nexport interface ShapeNode {\n type: \"shape\";\n text?: string;\n geometry?: string;\n rawXml: string;\n}\n\n/**\n * Read-only rendering of WordArt — a wps:wsp shape with a text-geometry preset.\n * Text is extracted for display. The original drawing XML is preserved in rawXml.\n */\nexport interface WordArtNode {\n type: \"wordart\";\n text: string;\n geometry?: string;\n rawXml: string;\n}\n\n/**\n * Read-only rendering of a VML shape (v:shape, v:rect, v:textbox) from a w:pict\n * element. Text is extracted for display. The original w:pict XML is preserved\n * in rawXml for lossless round-trip export.\n */\nexport interface VmlShapeNode {\n type: \"vml_shape\";\n text?: string;\n shapeType?: string;\n rawXml: string;\n}\n\nexport interface OpaqueBlockNode {\n type: \"opaque_block\";\n fragmentId: string;\n warningId: string;\n}\n\nexport interface DocRange {\n from: number;\n to: number;\n}\n\nexport interface BoundaryAssoc {\n start: -1 | 1;\n end: -1 | 1;\n}\n\nexport type CanonicalAnchor =\n | {\n kind: \"range\";\n range: DocRange;\n assoc: BoundaryAssoc;\n }\n | {\n kind: \"node\";\n at: number;\n assoc: -1 | 1;\n }\n | {\n kind: \"detached\";\n lastKnownRange: DocRange;\n reason: \"deleted\" | \"invalidatedByStructureChange\" | \"importAmbiguity\";\n };\n\nexport interface ReviewStore {\n comments: Record<string, CommentThread>;\n revisions: Record<string, RevisionRecord>;\n}\n\nexport interface CommentThread {\n commentId: string;\n status: \"open\" | \"resolved\" | \"detached\";\n anchor: CanonicalAnchor;\n createdAt: ISO8601DateTime;\n createdBy?: string;\n authorId?: string;\n body?: string;\n entries?: CommentEntry[];\n resolution?: CommentResolution;\n resolvedAt?: ISO8601DateTime;\n warningIds: string[];\n isResolved?: boolean;\n metadata?: CommentThreadMetadata;\n}\n\nexport interface CommentEntry {\n entryId: string;\n authorId: string;\n createdAt: ISO8601DateTime;\n body: string;\n metadata?: CommentEntryMetadata;\n}\n\nexport interface CommentEntryMetadata {\n ooxmlCommentId?: string;\n paraId?: string;\n parentParaId?: string;\n durableId?: string;\n initials?: string;\n}\n\nexport interface CommentResolution {\n resolvedAt: ISO8601DateTime;\n resolvedBy: string;\n}\n\nexport interface CommentThreadMetadata {\n source?: \"runtime\" | \"import\";\n rootOoxmlCommentId?: string;\n rootParaId?: string;\n}\n\nexport interface RevisionPropertyChangeData {\n xmlTag: \"pPrChange\" | \"sectPrChange\" | \"tblPrChange\" | \"rPrChange\";\n beforeXml: string;\n}\n\nexport interface RevisionMoveData {\n moveId: string;\n direction: \"from\" | \"to\";\n}\n\nexport interface RevisionRecord {\n changeId: string;\n kind: \"insertion\" | \"deletion\" | \"formatting\" | \"move\" | \"property-change\";\n anchor: CanonicalAnchor;\n authorId?: string;\n createdAt: ISO8601DateTime;\n warningIds?: string[];\n metadata?: RevisionMetadataRecord;\n status: \"open\" | \"accepted\" | \"rejected\" | \"detached\";\n}\n\nexport interface RevisionMetadataRecord {\n source?: \"runtime\" | \"import\";\n preserveOnlyReason?: string;\n importedRevisionForm?:\n | \"run-insertion\"\n | \"run-deletion\"\n | \"paragraph-insertion\"\n | \"paragraph-deletion\";\n originalRevisionType?: string;\n ooxmlRevisionId?: string;\n propertyChangeData?: RevisionPropertyChangeData;\n moveData?: RevisionMoveData;\n}\n\nexport interface PreservationStore {\n opaqueFragments: Record<string, OpaqueFragmentRecord>;\n packageParts: Record<string, PreservedPackagePart>;\n}\n\nexport interface OpaqueFragmentRecord {\n fragmentId: string;\n payloadKind: \"xml-subtree\" | \"package-part\";\n payloadReference: string;\n featureClass: \"preserve-only\";\n lastKnownRange: DocRange;\n warningId: string;\n packagePartName?: string;\n relationshipId?: string;\n}\n\nexport interface PreservedPackagePart {\n packagePartName: string;\n contentType: string;\n relationshipIds: string[];\n}\n\nexport interface DiagnosticStore {\n warnings: DiagnosticWarningEntry[];\n errors: DiagnosticErrorEntry[];\n}\n\nexport interface DiagnosticWarningEntry {\n diagnosticId: string;\n warningId: string;\n source:\n | \"import\"\n | \"runtime\"\n | \"review\"\n | \"preservation\"\n | \"validation\"\n | \"export\";\n message: string;\n}\n\nexport interface DiagnosticErrorEntry {\n diagnosticId: string;\n code:\n | \"load_failed\"\n | \"export_failed\"\n | \"package_corrupt\"\n | \"validation_failed\"\n | \"datastore_failed\"\n | \"internal_invariant\";\n message: string;\n isFatal: boolean;\n source: \"import\" | \"runtime\" | \"validation\" | \"datastore\" | \"export\";\n}\n\nexport function createCanonicalDocument(\n input: Omit<CanonicalDocument, \"schemaVersion\">,\n): CanonicalDocument {\n const document: CanonicalDocument = {\n schemaVersion: CDS_SCHEMA_VERSION,\n ...input,\n };\n\n assertCanonicalDocument(document);\n return document;\n}\n\nexport function serializeCanonicalDocument(document: CanonicalDocument): string {\n assertCanonicalDocument(document);\n return stableStringify(document);\n}\n\nexport function createCanonicalDocumentSignature(document: unknown): string {\n return stableStringify(document);\n}\n\nexport function parseCanonicalDocument(json: string): CanonicalDocument {\n const parsed = JSON.parse(json) as unknown;\n assertCanonicalDocument(parsed);\n return parsed;\n}\n\nexport function projectCanonicalDocument(\n document: CanonicalDocument,\n): CanonicalDocument {\n assertCanonicalDocument(document);\n return JSON.parse(stableStringify(document)) as CanonicalDocument;\n}\n\nexport function assertCanonicalDocument(\n value: unknown,\n): asserts value is CanonicalDocument {\n const issues = validateCanonicalDocument(value);\n assertValid(issues, \"Invalid canonical document.\");\n}\n\nexport function validateCanonicalDocument(\n value: unknown,\n): ModelValidationIssue[] {\n const issues: ModelValidationIssue[] = [];\n const record = asPlainObject(value, \"$\", issues);\n if (!record) {\n return issues;\n }\n\n validateExactObjectKeys(record, CANONICAL_DOCUMENT_TOP_LEVEL_KEYS, \"$\", issues, CANONICAL_DOCUMENT_OPTIONAL_KEYS);\n expectExactString(record.schemaVersion, CDS_SCHEMA_VERSION, \"$.schemaVersion\", issues);\n expectUuid(record.docId, \"$.docId\", issues);\n expectIso8601UtcTimestamp(record.createdAt, \"$.createdAt\", issues);\n expectIso8601UtcTimestamp(record.updatedAt, \"$.updatedAt\", issues);\n\n validateMetadata(record.metadata, \"$.metadata\", issues);\n validateStylesCatalog(record.styles, \"$.styles\", issues);\n validateNumberingCatalog(record.numbering, \"$.numbering\", issues);\n validateMediaCatalog(record.media, \"$.media\", issues);\n validateDocumentNode(record.content, \"$.content\", issues);\n validateReviewStore(record.review, \"$.review\", issues);\n validatePreservationStore(record.preservation, \"$.preservation\", issues);\n validateDiagnosticStore(record.diagnostics, \"$.diagnostics\", issues);\n if (record.subParts !== undefined) {\n validateSubPartsCatalog(record.subParts, \"$.subParts\", issues);\n }\n\n return issues;\n}\n\nfunction validateMetadata(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const customProperties = asPlainObject(record.customProperties, `${path}.customProperties`, issues);\n if (!customProperties) {\n return;\n }\n\n for (const [propertyKey, propertyValue] of Object.entries(customProperties)) {\n if (typeof propertyValue !== \"string\") {\n issues.push({\n path: `${path}.customProperties.${propertyKey}`,\n message: \"customProperties values must be strings.\",\n });\n }\n }\n}\n\nfunction validateStylesCatalog(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n validateStyleMap(record.paragraphs, `${path}.paragraphs`, issues);\n validateStyleMap(record.characters, `${path}.characters`, issues);\n validateStyleMap(record.tables, `${path}.tables`, issues);\n if (record.latentStyles !== undefined) {\n validateLatentStyleMap(record.latentStyles, `${path}.latentStyles`, issues);\n }\n}\n\nfunction validateStyleMap(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n for (const [styleId, definition] of Object.entries(record)) {\n expectDomainString(styleId, \"styleId\", `${path}.${styleId}`, issues);\n const definitionRecord = asPlainObject(definition, `${path}.${styleId}`, issues);\n if (!definitionRecord) {\n continue;\n }\n if (definitionRecord.styleId !== styleId) {\n issues.push({\n path: `${path}.${styleId}.styleId`,\n message: \"styleId must match the map key.\",\n });\n }\n }\n}\n\nfunction validateLatentStyleMap(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n for (const [styleName, definition] of Object.entries(record)) {\n const definitionRecord = asPlainObject(definition, `${path}.${styleName}`, issues);\n if (!definitionRecord) {\n continue;\n }\n if (definitionRecord.name !== styleName) {\n issues.push({\n path: `${path}.${styleName}.name`,\n message: \"name must match the map key.\",\n });\n }\n if (definitionRecord.uiPriority !== undefined && typeof definitionRecord.uiPriority !== \"number\") {\n issues.push({\n path: `${path}.${styleName}.uiPriority`,\n message: \"uiPriority must be a number.\",\n });\n }\n }\n}\n\nfunction validateNumberingCatalog(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const abstractDefinitions = asPlainObject(\n record.abstractDefinitions,\n `${path}.abstractDefinitions`,\n issues,\n );\n if (abstractDefinitions) {\n for (const [abstractId, definition] of Object.entries(abstractDefinitions)) {\n expectDomainString(\n abstractId,\n \"abstractNumberingId\",\n `${path}.abstractDefinitions.${abstractId}`,\n issues,\n );\n const definitionRecord = asPlainObject(\n definition,\n `${path}.abstractDefinitions.${abstractId}`,\n issues,\n );\n if (definitionRecord && definitionRecord.abstractNumberingId !== abstractId) {\n issues.push({\n path: `${path}.abstractDefinitions.${abstractId}.abstractNumberingId`,\n message: \"abstractNumberingId must match the map key.\",\n });\n }\n }\n }\n\n const instances = asPlainObject(record.instances, `${path}.instances`, issues);\n if (instances) {\n for (const [instanceId, instance] of Object.entries(instances)) {\n expectDomainString(\n instanceId,\n \"numberingInstanceId\",\n `${path}.instances.${instanceId}`,\n issues,\n );\n const instanceRecord = asPlainObject(\n instance,\n `${path}.instances.${instanceId}`,\n issues,\n );\n if (!instanceRecord) {\n continue;\n }\n if (instanceRecord.numberingInstanceId !== instanceId) {\n issues.push({\n path: `${path}.instances.${instanceId}.numberingInstanceId`,\n message: \"numberingInstanceId must match the map key.\",\n });\n }\n expectDomainString(\n instanceRecord.abstractNumberingId,\n \"abstractNumberingId\",\n `${path}.instances.${instanceId}.abstractNumberingId`,\n issues,\n );\n }\n }\n}\n\nfunction validateMediaCatalog(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const items = asPlainObject(record.items, `${path}.items`, issues);\n if (!items) {\n return;\n }\n\n for (const [mediaId, item] of Object.entries(items)) {\n expectDomainString(mediaId, \"mediaId\", `${path}.items.${mediaId}`, issues);\n const itemRecord = asPlainObject(item, `${path}.items.${mediaId}`, issues);\n if (!itemRecord) {\n continue;\n }\n if (itemRecord.mediaId !== mediaId) {\n issues.push({\n path: `${path}.items.${mediaId}.mediaId`,\n message: \"mediaId must match the map key.\",\n });\n }\n expectDomainString(\n itemRecord.packagePartName,\n \"packagePartName\",\n `${path}.items.${mediaId}.packagePartName`,\n issues,\n );\n if (itemRecord.relationshipId !== undefined) {\n expectDomainString(\n itemRecord.relationshipId,\n \"relationshipId\",\n `${path}.items.${mediaId}.relationshipId`,\n issues,\n );\n }\n }\n}\n\nfunction validateDocumentNode(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const type = expectString(record.type, `${path}.type`, issues);\n if (!type) {\n return;\n }\n\n switch (type) {\n case \"doc\":\n case \"paragraph\":\n case \"sdt\":\n case \"custom_xml\":\n case \"hyperlink\":\n if (!Array.isArray(record.children)) {\n issues.push({ path: `${path}.children`, message: \"children must be an array.\" });\n } else {\n record.children.forEach((child, index) =>\n validateDocumentNode(child, `${path}.children[${index}]`, issues),\n );\n }\n if (type === \"paragraph\" && record.numbering !== undefined) {\n const numbering = asPlainObject(record.numbering, `${path}.numbering`, issues);\n if (numbering) {\n expectDomainString(\n numbering.numberingInstanceId,\n \"numberingInstanceId\",\n `${path}.numbering.numberingInstanceId`,\n issues,\n );\n }\n }\n return;\n case \"alt_chunk\":\n expectDomainString(record.relationshipId, \"relationshipId\", `${path}.relationshipId`, issues);\n return;\n case \"image\":\n expectDomainString(record.mediaId, \"mediaId\", `${path}.mediaId`, issues);\n if (record.placementXml !== undefined) {\n expectString(record.placementXml, `${path}.placementXml`, issues);\n }\n if (record.display !== undefined) {\n const display = expectString(record.display, `${path}.display`, issues);\n if (display && display !== \"inline\" && display !== \"floating\") {\n issues.push({\n path: `${path}.display`,\n message: \"display must be 'inline' or 'floating'.\",\n });\n }\n }\n if (record.floating !== undefined) {\n validateFloatingImageProperties(record.floating, `${path}.floating`, issues);\n }\n return;\n case \"opaque_inline\":\n case \"opaque_block\":\n expectDomainString(record.fragmentId, \"fragmentId\", `${path}.fragmentId`, issues);\n expectDomainString(record.warningId, \"warningId\", `${path}.warningId`, issues);\n return;\n case \"table\":\n if (!Array.isArray(record.gridColumns)) {\n issues.push({ path: `${path}.gridColumns`, message: \"gridColumns must be an array.\" });\n }\n if (!Array.isArray(record.rows)) {\n issues.push({ path: `${path}.rows`, message: \"rows must be an array.\" });\n } else {\n record.rows.forEach((row, rowIndex) =>\n validateDocumentNode(row, `${path}.rows[${rowIndex}]`, issues),\n );\n }\n return;\n case \"table_row\":\n if (!Array.isArray(record.cells)) {\n issues.push({ path: `${path}.cells`, message: \"cells must be an array.\" });\n } else {\n record.cells.forEach((cell, cellIndex) =>\n validateDocumentNode(cell, `${path}.cells[${cellIndex}]`, issues),\n );\n }\n return;\n case \"table_cell\":\n if (!Array.isArray(record.children)) {\n issues.push({ path: `${path}.children`, message: \"children must be an array.\" });\n } else {\n record.children.forEach((child, childIndex) =>\n validateDocumentNode(child, `${path}.children[${childIndex}]`, issues),\n );\n }\n return;\n case \"field\":\n if (!Array.isArray(record.children)) {\n issues.push({ path: `${path}.children`, message: \"children must be an array.\" });\n } else {\n record.children.forEach((child, index) =>\n validateDocumentNode(child, `${path}.children[${index}]`, issues),\n );\n }\n return;\n case \"bookmark_start\":\n expectString(record.bookmarkId, `${path}.bookmarkId`, issues);\n expectString(record.name, `${path}.name`, issues);\n return;\n case \"bookmark_end\":\n expectString(record.bookmarkId, `${path}.bookmarkId`, issues);\n return;\n case \"section_break\":\n return;\n case \"text\":\n case \"hard_break\":\n case \"column_break\":\n case \"tab\":\n return;\n case \"symbol\":\n expectString(record.char, `${path}.char`, issues);\n if (record.font !== undefined) {\n expectString(record.font, `${path}.font`, issues);\n }\n return;\n case \"footnote_ref\":\n expectString(record.noteId, `${path}.noteId`, issues);\n expectString(record.noteKind, `${path}.noteKind`, issues);\n return;\n case \"chart_preview\":\n case \"smartart_preview\":\n case \"shape\":\n case \"wordart\":\n case \"vml_shape\":\n expectString(record.rawXml, `${path}.rawXml`, issues);\n return;\n default:\n issues.push({\n path: `${path}.type`,\n message: `Unsupported node type ${JSON.stringify(type)}.`,\n });\n }\n}\n\nfunction validateFloatingImageProperties(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n if (record.horizontalPosition !== undefined) {\n validateFloatingAxisPosition(record.horizontalPosition, `${path}.horizontalPosition`, issues);\n }\n if (record.verticalPosition !== undefined) {\n validateFloatingAxisPosition(record.verticalPosition, `${path}.verticalPosition`, issues);\n }\n if (record.wrap !== undefined) {\n const wrap = expectString(record.wrap, `${path}.wrap`, issues);\n if (\n wrap &&\n wrap !== \"none\" &&\n wrap !== \"square\" &&\n wrap !== \"tight\" &&\n wrap !== \"through\" &&\n wrap !== \"topAndBottom\"\n ) {\n issues.push({\n path: `${path}.wrap`,\n message: \"wrap must be one of none, square, tight, through, or topAndBottom.\",\n });\n }\n }\n}\n\nfunction validateFloatingAxisPosition(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n if (record.relativeFrom !== undefined) {\n expectString(record.relativeFrom, `${path}.relativeFrom`, issues);\n }\n if (record.align !== undefined) {\n expectString(record.align, `${path}.align`, issues);\n }\n if (record.offset !== undefined && typeof record.offset !== \"number\") {\n issues.push({\n path: `${path}.offset`,\n message: \"offset must be a number.\",\n });\n }\n}\n\nfunction validateReviewStore(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const comments = asPlainObject(record.comments, `${path}.comments`, issues);\n if (comments) {\n for (const [commentId, thread] of Object.entries(comments)) {\n expectDomainString(commentId, \"commentId\", `${path}.comments.${commentId}`, issues);\n const threadRecord = asPlainObject(thread, `${path}.comments.${commentId}`, issues);\n if (!threadRecord) {\n continue;\n }\n if (threadRecord.commentId !== commentId) {\n issues.push({\n path: `${path}.comments.${commentId}.commentId`,\n message: \"commentId must match the map key.\",\n });\n }\n validateAnchor(threadRecord.anchor, `${path}.comments.${commentId}.anchor`, issues);\n expectIso8601UtcTimestamp(\n threadRecord.createdAt,\n `${path}.comments.${commentId}.createdAt`,\n issues,\n );\n validateCommentStatus(threadRecord.status, `${path}.comments.${commentId}.status`, issues);\n if (threadRecord.createdBy !== undefined) {\n expectString(\n threadRecord.createdBy,\n `${path}.comments.${commentId}.createdBy`,\n issues,\n );\n }\n if (threadRecord.authorId !== undefined) {\n expectString(\n threadRecord.authorId,\n `${path}.comments.${commentId}.authorId`,\n issues,\n );\n }\n if (threadRecord.body !== undefined) {\n expectString(threadRecord.body, `${path}.comments.${commentId}.body`, issues);\n }\n if (!Array.isArray(threadRecord.warningIds)) {\n issues.push({\n path: `${path}.comments.${commentId}.warningIds`,\n message: \"warningIds must be an array.\",\n });\n } else {\n threadRecord.warningIds.forEach((warningId, index) =>\n expectDomainString(\n warningId,\n \"warningId\",\n `${path}.comments.${commentId}.warningIds[${index}]`,\n issues,\n ),\n );\n }\n if (threadRecord.entries !== undefined) {\n validateCommentEntries(\n threadRecord.entries,\n `${path}.comments.${commentId}.entries`,\n issues,\n );\n }\n if (threadRecord.resolution !== undefined) {\n validateCommentResolution(\n threadRecord.resolution,\n `${path}.comments.${commentId}.resolution`,\n issues,\n );\n }\n if (threadRecord.resolvedAt !== undefined) {\n expectIso8601UtcTimestamp(\n threadRecord.resolvedAt,\n `${path}.comments.${commentId}.resolvedAt`,\n issues,\n );\n }\n if (\n threadRecord.isResolved !== undefined &&\n typeof threadRecord.isResolved !== \"boolean\"\n ) {\n issues.push({\n path: `${path}.comments.${commentId}.isResolved`,\n message: \"isResolved must be a boolean.\",\n });\n }\n if (threadRecord.metadata !== undefined) {\n validateCommentThreadMetadata(\n threadRecord.metadata,\n `${path}.comments.${commentId}.metadata`,\n issues,\n );\n }\n }\n }\n\n const revisions = asPlainObject(record.revisions, `${path}.revisions`, issues);\n if (revisions) {\n for (const [revisionId, revision] of Object.entries(revisions)) {\n expectDomainString(revisionId, \"revisionId\", `${path}.revisions.${revisionId}`, issues);\n const revisionRecord = asPlainObject(\n revision,\n `${path}.revisions.${revisionId}`,\n issues,\n );\n if (!revisionRecord) {\n continue;\n }\n if (revisionRecord.changeId !== revisionId) {\n issues.push({\n path: `${path}.revisions.${revisionId}.changeId`,\n message: \"changeId must match the map key.\",\n });\n }\n validateAnchor(revisionRecord.anchor, `${path}.revisions.${revisionId}.anchor`, issues);\n validateRevisionKind(revisionRecord.kind, `${path}.revisions.${revisionId}.kind`, issues);\n validateRevisionStatus(\n revisionRecord.status,\n `${path}.revisions.${revisionId}.status`,\n issues,\n );\n expectIso8601UtcTimestamp(\n revisionRecord.createdAt,\n `${path}.revisions.${revisionId}.createdAt`,\n issues,\n );\n if (revisionRecord.authorId !== undefined) {\n expectString(\n revisionRecord.authorId,\n `${path}.revisions.${revisionId}.authorId`,\n issues,\n );\n }\n if (revisionRecord.warningIds !== undefined) {\n validateWarningIds(\n revisionRecord.warningIds,\n `${path}.revisions.${revisionId}.warningIds`,\n issues,\n );\n }\n if (revisionRecord.metadata !== undefined) {\n validateRevisionMetadata(\n revisionRecord.metadata,\n `${path}.revisions.${revisionId}.metadata`,\n issues,\n );\n }\n }\n }\n}\n\nfunction validateCommentStatus(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n if (value === \"open\" || value === \"resolved\" || value === \"detached\") {\n return;\n }\n issues.push({\n path,\n message: \"status must be one of open, resolved, or detached.\",\n });\n}\n\nfunction validateCommentEntries(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n if (!Array.isArray(value)) {\n issues.push({\n path,\n message: \"entries must be an array.\",\n });\n return;\n }\n\n value.forEach((entry, index) => {\n const record = asPlainObject(entry, `${path}[${index}]`, issues);\n if (!record) {\n return;\n }\n expectString(record.entryId, `${path}[${index}].entryId`, issues);\n expectString(record.authorId, `${path}[${index}].authorId`, issues);\n expectString(record.body, `${path}[${index}].body`, issues);\n expectIso8601UtcTimestamp(record.createdAt, `${path}[${index}].createdAt`, issues);\n if (record.metadata !== undefined) {\n validateCommentEntryMetadata(record.metadata, `${path}[${index}].metadata`, issues);\n }\n });\n}\n\nfunction validateCommentEntryMetadata(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n for (const field of [\n \"ooxmlCommentId\",\n \"paraId\",\n \"parentParaId\",\n \"durableId\",\n \"initials\",\n ] as const) {\n if (record[field] !== undefined) {\n expectString(record[field], `${path}.${field}`, issues);\n }\n }\n}\n\nfunction validateCommentResolution(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n expectIso8601UtcTimestamp(record.resolvedAt, `${path}.resolvedAt`, issues);\n expectString(record.resolvedBy, `${path}.resolvedBy`, issues);\n}\n\nfunction validateCommentThreadMetadata(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n if (\n record.source !== undefined &&\n record.source !== \"runtime\" &&\n record.source !== \"import\"\n ) {\n issues.push({\n path: `${path}.source`,\n message: \"source must be either runtime or import.\",\n });\n }\n if (record.rootOoxmlCommentId !== undefined) {\n expectString(record.rootOoxmlCommentId, `${path}.rootOoxmlCommentId`, issues);\n }\n if (record.rootParaId !== undefined) {\n expectString(record.rootParaId, `${path}.rootParaId`, issues);\n }\n}\n\nfunction validateRevisionKind(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n if (\n value === \"insertion\" ||\n value === \"deletion\" ||\n value === \"formatting\" ||\n value === \"move\" ||\n value === \"property-change\"\n ) {\n return;\n }\n issues.push({\n path,\n message: \"kind must be insertion, deletion, formatting, move, or property-change.\",\n });\n}\n\nfunction validateRevisionStatus(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n if (\n value === \"open\" ||\n value === \"accepted\" ||\n value === \"rejected\" ||\n value === \"detached\"\n ) {\n return;\n }\n issues.push({\n path,\n message: \"status must be one of open, accepted, rejected, or detached.\",\n });\n}\n\nfunction validateWarningIds(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n if (!Array.isArray(value)) {\n issues.push({\n path,\n message: \"warningIds must be an array.\",\n });\n return;\n }\n\n value.forEach((warningId, index) =>\n expectDomainString(warningId, \"warningId\", `${path}[${index}]`, issues),\n );\n}\n\nfunction validateRevisionMetadata(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n if (\n record.source !== undefined &&\n record.source !== \"runtime\" &&\n record.source !== \"import\"\n ) {\n issues.push({\n path: `${path}.source`,\n message: \"source must be either runtime or import.\",\n });\n }\n for (const field of [\n \"preserveOnlyReason\",\n \"importedRevisionForm\",\n \"originalRevisionType\",\n \"ooxmlRevisionId\",\n ] as const) {\n if (record[field] !== undefined) {\n expectString(record[field], `${path}.${field}`, issues);\n }\n }\n\n if (record.propertyChangeData !== undefined) {\n const pcd = asPlainObject(record.propertyChangeData, `${path}.propertyChangeData`, issues);\n if (pcd) {\n expectString(pcd.xmlTag, `${path}.propertyChangeData.xmlTag`, issues);\n expectString(pcd.beforeXml, `${path}.propertyChangeData.beforeXml`, issues);\n }\n }\n\n if (record.moveData !== undefined) {\n const md = asPlainObject(record.moveData, `${path}.moveData`, issues);\n if (md) {\n expectString(md.moveId, `${path}.moveData.moveId`, issues);\n expectString(md.direction, `${path}.moveData.direction`, issues);\n }\n }\n}\n\nfunction validatePreservationStore(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const opaqueFragments = asPlainObject(\n record.opaqueFragments,\n `${path}.opaqueFragments`,\n issues,\n );\n if (opaqueFragments) {\n for (const [fragmentId, fragment] of Object.entries(opaqueFragments)) {\n expectDomainString(fragmentId, \"fragmentId\", `${path}.opaqueFragments.${fragmentId}`, issues);\n const fragmentRecord = asPlainObject(\n fragment,\n `${path}.opaqueFragments.${fragmentId}`,\n issues,\n );\n if (!fragmentRecord) {\n continue;\n }\n if (fragmentRecord.fragmentId !== fragmentId) {\n issues.push({\n path: `${path}.opaqueFragments.${fragmentId}.fragmentId`,\n message: \"fragmentId must match the map key.\",\n });\n }\n validateRange(\n fragmentRecord.lastKnownRange,\n `${path}.opaqueFragments.${fragmentId}.lastKnownRange`,\n issues,\n );\n expectDomainString(\n fragmentRecord.warningId,\n \"warningId\",\n `${path}.opaqueFragments.${fragmentId}.warningId`,\n issues,\n );\n if (fragmentRecord.packagePartName !== undefined) {\n expectDomainString(\n fragmentRecord.packagePartName,\n \"packagePartName\",\n `${path}.opaqueFragments.${fragmentId}.packagePartName`,\n issues,\n );\n }\n if (fragmentRecord.relationshipId !== undefined) {\n expectDomainString(\n fragmentRecord.relationshipId,\n \"relationshipId\",\n `${path}.opaqueFragments.${fragmentId}.relationshipId`,\n issues,\n );\n }\n }\n }\n\n const packageParts = asPlainObject(record.packageParts, `${path}.packageParts`, issues);\n if (packageParts) {\n for (const [packagePartName, packagePart] of Object.entries(packageParts)) {\n expectDomainString(\n packagePartName,\n \"packagePartName\",\n `${path}.packageParts.${packagePartName}`,\n issues,\n );\n const packagePartRecord = asPlainObject(\n packagePart,\n `${path}.packageParts.${packagePartName}`,\n issues,\n );\n if (!packagePartRecord) {\n continue;\n }\n if (packagePartRecord.packagePartName !== packagePartName) {\n issues.push({\n path: `${path}.packageParts.${packagePartName}.packagePartName`,\n message: \"packagePartName must match the map key.\",\n });\n }\n if (Array.isArray(packagePartRecord.relationshipIds)) {\n packagePartRecord.relationshipIds.forEach((relationshipId, index) =>\n expectDomainString(\n relationshipId,\n \"relationshipId\",\n `${path}.packageParts.${packagePartName}.relationshipIds[${index}]`,\n issues,\n ),\n );\n }\n }\n }\n}\n\nfunction validateDiagnosticStore(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n if (Array.isArray(record.warnings)) {\n record.warnings.forEach((warning, index) => {\n const warningRecord = asPlainObject(warning, `${path}.warnings[${index}]`, issues);\n if (!warningRecord) {\n return;\n }\n expectDomainString(\n warningRecord.diagnosticId,\n \"diagnosticId\",\n `${path}.warnings[${index}].diagnosticId`,\n issues,\n );\n expectDomainString(\n warningRecord.warningId,\n \"warningId\",\n `${path}.warnings[${index}].warningId`,\n issues,\n );\n });\n }\n\n if (Array.isArray(record.errors)) {\n record.errors.forEach((error, index) => {\n const errorRecord = asPlainObject(error, `${path}.errors[${index}]`, issues);\n if (!errorRecord) {\n return;\n }\n expectDomainString(\n errorRecord.diagnosticId,\n \"diagnosticId\",\n `${path}.errors[${index}].diagnosticId`,\n issues,\n );\n });\n }\n}\n\nfunction validateAnchor(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const kind = expectString(record.kind, `${path}.kind`, issues);\n if (!kind) {\n return;\n }\n\n if (kind === \"range\") {\n validateRange(record.range, `${path}.range`, issues);\n } else if (kind === \"detached\") {\n validateRange(record.lastKnownRange, `${path}.lastKnownRange`, issues);\n }\n}\n\nfunction validateRange(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n if (typeof record.from !== \"number\" || typeof record.to !== \"number\") {\n issues.push({\n path,\n message: \"Range must contain numeric from and to values.\",\n });\n }\n}\n\nfunction validateExactObjectKeys(\n record: Record<string, unknown>,\n expectedKeys: readonly string[],\n path: string,\n issues: ModelValidationIssue[],\n allowedOptionalKeys?: readonly string[],\n): void {\n const actualKeys = new Set(Object.keys(record));\n const expected = new Set(expectedKeys);\n const optional = new Set(allowedOptionalKeys ?? []);\n\n for (const expectedKey of expectedKeys) {\n if (!actualKeys.has(expectedKey)) {\n issues.push({\n path,\n message: `Missing required key ${JSON.stringify(expectedKey)}.`,\n });\n }\n }\n\n for (const actualKey of actualKeys) {\n if (!expected.has(actualKey) && !optional.has(actualKey)) {\n issues.push({\n path: `${path}.${actualKey}`,\n message:\n \"Unexpected canonical document key. Render/UI state is not part of the canonical envelope.\",\n });\n }\n }\n}\n\nfunction validateSubPartsCatalog(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n if (record.headers !== undefined) {\n if (!Array.isArray(record.headers)) {\n issues.push({ path: `${path}.headers`, message: \"headers must be an array.\" });\n } else {\n record.headers.forEach((header, index) => {\n const headerRecord = asPlainObject(header, `${path}.headers[${index}]`, issues);\n if (headerRecord) {\n expectString(headerRecord.variant, `${path}.headers[${index}].variant`, issues);\n expectString(headerRecord.partPath, `${path}.headers[${index}].partPath`, issues);\n expectString(headerRecord.relationshipId, `${path}.headers[${index}].relationshipId`, issues);\n }\n });\n }\n }\n\n if (record.footers !== undefined) {\n if (!Array.isArray(record.footers)) {\n issues.push({ path: `${path}.footers`, message: \"footers must be an array.\" });\n } else {\n record.footers.forEach((footer, index) => {\n const footerRecord = asPlainObject(footer, `${path}.footers[${index}]`, issues);\n if (footerRecord) {\n expectString(footerRecord.variant, `${path}.footers[${index}].variant`, issues);\n expectString(footerRecord.partPath, `${path}.footers[${index}].partPath`, issues);\n expectString(footerRecord.relationshipId, `${path}.footers[${index}].relationshipId`, issues);\n }\n });\n }\n }\n}\n\nfunction expectDomainString(\n value: unknown,\n domain: StableIdDomain,\n path: string,\n issues: ModelValidationIssue[],\n): string | null {\n const stableId = expectString(value, path, issues);\n if (!stableId) {\n return null;\n }\n\n if (!ID_PATTERNS[domain].test(stableId)) {\n issues.push({\n path,\n message: `Expected a valid ${domain}.`,\n });\n return null;\n }\n\n return stableId;\n}\n","import {\n CDS_SCHEMA_VERSION,\n COMPATIBILITY_REPORT_VERSION,\n PERSISTED_EDITOR_SNAPSHOT_VERSION,\n type CompatibilityReportVersion,\n type ISO8601DateTime,\n type ModelValidationIssue,\n type PersistedEditorSnapshotVersion,\n asPlainObject,\n assertValid,\n expectExactString,\n expectIso8601UtcTimestamp,\n expectString,\n stableStringify,\n} from \"./cds-1.0.0.ts\";\nimport {\n type CanonicalDocument,\n assertCanonicalDocument,\n validateCanonicalDocument,\n} from \"./canonical-document.ts\";\n\nexport type EditorWarningCode =\n | \"unsupported_ooxml_preserved\"\n | \"unsupported_ooxml_locked\"\n | \"import_normalized\"\n | \"export_roundtrip_risk\"\n | \"comment_anchor_detached\"\n | \"revision_anchor_detached\"\n | \"large_document_degraded\"\n | \"font_substitution\"\n | \"image_missing\";\n\nexport interface EditorWarning {\n warningId: string;\n code: EditorWarningCode;\n severity: \"info\" | \"warning\";\n message: string;\n source:\n | \"import\"\n | \"runtime\"\n | \"review\"\n | \"preservation\"\n | \"validation\"\n | \"export\";\n affectedAnchor?: Record<string, unknown>;\n featureEntryId?: string;\n details?: Record<string, unknown>;\n}\n\nexport type EditorErrorCode =\n | \"import_failed\"\n | \"export_failed\"\n | \"package_corrupt\"\n | \"validation_failed\"\n | \"datastore_failed\"\n | \"internal_invariant\";\n\nexport interface EditorError {\n errorId: string;\n code: EditorErrorCode;\n message: string;\n isFatal: boolean;\n source: \"import\" | \"runtime\" | \"validation\" | \"datastore\" | \"export\";\n details?: Record<string, unknown>;\n}\n\nexport type CompatibilityFeatureClass =\n | \"supported-roundtrip\"\n | \"preserve-only\"\n | \"unsupported-fatal\";\n\nexport interface CompatibilityFeatureEntry {\n featureEntryId: string;\n featureKey: string;\n featureClass: CompatibilityFeatureClass;\n message: string;\n affectedAnchor?: Record<string, unknown>;\n details?: Record<string, unknown>;\n}\n\nexport interface CompatibilityReport {\n reportVersion: CompatibilityReportVersion;\n generatedAt: ISO8601DateTime;\n blockExport: boolean;\n featureEntries: CompatibilityFeatureEntry[];\n warnings: EditorWarning[];\n errors: EditorError[];\n}\n\nexport interface PersistedEditorSnapshot {\n snapshotVersion: PersistedEditorSnapshotVersion;\n schemaVersion: typeof CDS_SCHEMA_VERSION;\n documentId: string;\n docId: string;\n createdAt: ISO8601DateTime;\n updatedAt: ISO8601DateTime;\n savedAt: ISO8601DateTime;\n editorBuild: string;\n canonicalDocument: CanonicalDocument;\n compatibility: CompatibilityReport;\n warningLog: EditorWarning[];\n}\n\nconst SNAPSHOT_TOP_LEVEL_KEYS = [\n \"snapshotVersion\",\n \"schemaVersion\",\n \"documentId\",\n \"docId\",\n \"createdAt\",\n \"updatedAt\",\n \"savedAt\",\n \"editorBuild\",\n \"canonicalDocument\",\n \"compatibility\",\n \"warningLog\",\n] as const;\n\nexport function serializePersistedEditorSnapshot(\n snapshot: PersistedEditorSnapshot,\n): string {\n assertPersistedEditorSnapshot(snapshot);\n return stableStringify(snapshot);\n}\n\nexport function parsePersistedEditorSnapshot(\n json: string,\n): PersistedEditorSnapshot {\n const parsed = JSON.parse(json) as unknown;\n assertPersistedEditorSnapshot(parsed);\n return parsed;\n}\n\nexport function assertPersistedEditorSnapshot(\n snapshot: unknown,\n): asserts snapshot is PersistedEditorSnapshot {\n const issues = validatePersistedEditorSnapshot(snapshot);\n assertValid(issues, \"Invalid persisted editor snapshot.\");\n}\n\nexport function validatePersistedEditorSnapshot(\n snapshot: unknown,\n): ModelValidationIssue[] {\n const issues: ModelValidationIssue[] = [];\n const record = asPlainObject(snapshot, \"$\", issues);\n if (!record) {\n return issues;\n }\n\n validateExactObjectKeys(record, SNAPSHOT_TOP_LEVEL_KEYS, \"$\", issues);\n\n expectExactString(\n record.snapshotVersion,\n PERSISTED_EDITOR_SNAPSHOT_VERSION,\n \"$.snapshotVersion\",\n issues,\n );\n expectExactString(\n record.schemaVersion,\n CDS_SCHEMA_VERSION,\n \"$.schemaVersion\",\n issues,\n );\n expectString(record.documentId, \"$.documentId\", issues);\n expectString(record.docId, \"$.docId\", issues);\n expectIso8601UtcTimestamp(record.createdAt, \"$.createdAt\", issues);\n expectIso8601UtcTimestamp(record.updatedAt, \"$.updatedAt\", issues);\n expectIso8601UtcTimestamp(record.savedAt, \"$.savedAt\", issues);\n expectString(record.editorBuild, \"$.editorBuild\", issues);\n\n const canonicalDocumentIssues = validateCanonicalDocument(record.canonicalDocument);\n issues.push(...canonicalDocumentIssues.map(prefixIssue(\"$.canonicalDocument\")));\n\n if (\n asPlainObject(record.canonicalDocument, \"$.canonicalDocument\", [])?.docId !==\n record.docId\n ) {\n issues.push({\n path: \"$.docId\",\n message: \"Snapshot docId must match canonicalDocument.docId.\",\n });\n }\n\n validateCompatibilityReport(record.compatibility, \"$.compatibility\", issues);\n\n if (!Array.isArray(record.warningLog)) {\n issues.push({\n path: \"$.warningLog\",\n message: \"warningLog must be an array.\",\n });\n } else {\n record.warningLog.forEach((warning, index) => {\n validateEditorWarning(warning, `$.warningLog[${index}]`, issues);\n });\n }\n\n return issues;\n}\n\nexport function assertCompatibilityReport(\n report: unknown,\n): asserts report is CompatibilityReport {\n const issues = validateCompatibilityReport(report);\n assertValid(issues, \"Invalid compatibility report.\");\n}\n\nexport function validateCompatibilityReport(\n report: unknown,\n path = \"$\",\n issues: ModelValidationIssue[] = [],\n): ModelValidationIssue[] {\n const record = asPlainObject(report, path, issues);\n if (!record) {\n return issues;\n }\n\n expectExactString(\n record.reportVersion,\n COMPATIBILITY_REPORT_VERSION,\n `${path}.reportVersion`,\n issues,\n );\n expectIso8601UtcTimestamp(record.generatedAt, `${path}.generatedAt`, issues);\n\n if (typeof record.blockExport !== \"boolean\") {\n issues.push({\n path: `${path}.blockExport`,\n message: \"blockExport must be a boolean.\",\n });\n }\n\n if (!Array.isArray(record.featureEntries)) {\n issues.push({\n path: `${path}.featureEntries`,\n message: \"featureEntries must be an array.\",\n });\n } else {\n record.featureEntries.forEach((featureEntry, index) => {\n validateCompatibilityFeatureEntry(\n featureEntry,\n `${path}.featureEntries[${index}]`,\n issues,\n );\n });\n }\n\n if (!Array.isArray(record.warnings)) {\n issues.push({\n path: `${path}.warnings`,\n message: \"warnings must be an array.\",\n });\n } else {\n record.warnings.forEach((warning, index) => {\n validateEditorWarning(warning, `${path}.warnings[${index}]`, issues);\n });\n }\n\n if (!Array.isArray(record.errors)) {\n issues.push({\n path: `${path}.errors`,\n message: \"errors must be an array.\",\n });\n } else {\n record.errors.forEach((error, index) => {\n validateEditorError(error, `${path}.errors[${index}]`, issues);\n });\n }\n\n return issues;\n}\n\nfunction validateCompatibilityFeatureEntry(\n featureEntry: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(featureEntry, path, issues);\n if (!record) {\n return;\n }\n\n expectString(record.featureEntryId, `${path}.featureEntryId`, issues);\n expectString(record.featureKey, `${path}.featureKey`, issues);\n expectString(record.featureClass, `${path}.featureClass`, issues);\n expectString(record.message, `${path}.message`, issues);\n}\n\nfunction validateEditorWarning(\n warning: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(warning, path, issues);\n if (!record) {\n return;\n }\n\n expectString(record.warningId, `${path}.warningId`, issues);\n expectString(record.code, `${path}.code`, issues);\n expectString(record.severity, `${path}.severity`, issues);\n expectString(record.message, `${path}.message`, issues);\n expectString(record.source, `${path}.source`, issues);\n}\n\nfunction validateEditorError(\n error: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(error, path, issues);\n if (!record) {\n return;\n }\n\n expectString(record.errorId, `${path}.errorId`, issues);\n expectString(record.code, `${path}.code`, issues);\n expectString(record.message, `${path}.message`, issues);\n expectString(record.source, `${path}.source`, issues);\n\n if (typeof record.isFatal !== \"boolean\") {\n issues.push({\n path: `${path}.isFatal`,\n message: \"isFatal must be a boolean.\",\n });\n }\n}\n\nfunction validateExactObjectKeys(\n record: Record<string, unknown>,\n expectedKeys: readonly string[],\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const actualKeys = new Set(Object.keys(record));\n const expected = new Set(expectedKeys);\n\n for (const expectedKey of expectedKeys) {\n if (!actualKeys.has(expectedKey)) {\n issues.push({\n path,\n message: `Missing required key ${JSON.stringify(expectedKey)}.`,\n });\n }\n }\n\n for (const actualKey of actualKeys) {\n if (!expected.has(actualKey)) {\n issues.push({\n path: `${path}.${actualKey}`,\n message:\n \"Unexpected persisted snapshot key. Render/UI state is not part of the persistence contract.\",\n });\n }\n }\n}\n\nfunction prefixIssue(basePath: string) {\n return (issue: ModelValidationIssue): ModelValidationIssue => ({\n path: `${basePath}${issue.path === \"$\" ? \"\" : issue.path.slice(1)}`,\n message: issue.message,\n });\n}\n\nexport function createPersistedEditorSnapshot(params: {\n documentId: string;\n savedAt: ISO8601DateTime;\n editorBuild: string;\n canonicalDocument: CanonicalDocument;\n compatibility: CompatibilityReport;\n warningLog?: EditorWarning[];\n}): PersistedEditorSnapshot {\n assertCanonicalDocument(params.canonicalDocument);\n assertCompatibilityReport(params.compatibility);\n\n return {\n snapshotVersion: PERSISTED_EDITOR_SNAPSHOT_VERSION,\n schemaVersion: CDS_SCHEMA_VERSION,\n documentId: params.documentId,\n docId: params.canonicalDocument.docId,\n createdAt: params.canonicalDocument.createdAt,\n updatedAt: params.canonicalDocument.updatedAt,\n savedAt: params.savedAt,\n editorBuild: params.editorBuild,\n canonicalDocument: params.canonicalDocument,\n compatibility: params.compatibility,\n warningLog: params.warningLog ?? params.compatibility.warnings,\n };\n}\n\nexport function projectAnchorToSnapshot(\n anchor: Record<string, unknown>,\n): Record<string, unknown> {\n return JSON.parse(JSON.stringify(anchor)) as Record<string, unknown>;\n}\n","import {\n DEFAULT_BOUNDARY_ASSOC,\n createDetachedAnchor,\n createRangeAnchor,\n type EditorAnchorProjection,\n} from \"../selection/mapping.ts\";\nimport {\n assertPersistedEditorSnapshot as assertModelPersistedEditorSnapshot,\n createPersistedEditorSnapshot as createModelPersistedEditorSnapshot,\n type PersistedEditorSnapshot as ModelPersistedEditorSnapshot,\n} from \"../../model/snapshot.ts\";\nimport {\n assertCanonicalDocument,\n type CanonicalDocument,\n type CommentEntry as ModelCommentEntry,\n type CommentResolution as ModelCommentResolution,\n type CommentThread as ModelCommentThread,\n type RevisionMetadataRecord as ModelRevisionMetadataRecord,\n type RevisionRecord as ModelRevisionRecord,\n} from \"../../model/canonical-document.ts\";\n\nexport type RuntimePhase = \"loading\" | \"ready\" | \"error\";\nexport type EditorWarningCode =\n | \"unsupported_ooxml_preserved\"\n | \"unsupported_ooxml_locked\"\n | \"import_normalized\"\n | \"export_roundtrip_risk\"\n | \"comment_anchor_detached\"\n | \"revision_anchor_detached\"\n | \"large_document_degraded\"\n | \"font_substitution\"\n | \"image_missing\";\n\nexport interface EditorWarning {\n warningId: string;\n code: EditorWarningCode;\n severity: \"info\" | \"warning\";\n message: string;\n source:\n | \"import\"\n | \"runtime\"\n | \"review\"\n | \"preservation\"\n | \"validation\"\n | \"export\";\n affectedAnchor?: EditorAnchorProjection;\n featureEntryId?: string;\n details?: Record<string, unknown>;\n}\n\nexport interface EditorError {\n errorId: string;\n code:\n | \"import_failed\"\n | \"export_failed\"\n | \"package_corrupt\"\n | \"validation_failed\"\n | \"datastore_failed\"\n | \"internal_invariant\";\n message: string;\n isFatal: boolean;\n source: \"import\" | \"runtime\" | \"validation\" | \"datastore\" | \"export\";\n details?: Record<string, unknown>;\n}\n\nexport type CompatibilityFeatureClass =\n | \"supported-roundtrip\"\n | \"preserve-only\"\n | \"unsupported-fatal\";\n\nexport interface CompatibilityFeatureEntry {\n featureEntryId: string;\n featureKey: string;\n featureClass: CompatibilityFeatureClass;\n message: string;\n affectedAnchor?: EditorAnchorProjection;\n details?: Record<string, unknown>;\n}\n\nexport interface CompatibilityReport {\n reportVersion: \"compatibility-report/1\";\n generatedAt: string;\n blockExport: boolean;\n featureEntries: CompatibilityFeatureEntry[];\n warnings: EditorWarning[];\n errors: EditorError[];\n}\n\nexport type CommentEntryRecord = ModelCommentEntry;\nexport type CommentResolutionRecord = ModelCommentResolution;\nexport type CommentThreadRecord = ModelCommentThread;\nexport type RevisionMetadataRecord = ModelRevisionMetadataRecord;\nexport type RevisionRecord = ModelRevisionRecord;\nexport type ReviewStore = CanonicalDocument[\"review\"];\nexport type CanonicalDocumentEnvelope = CanonicalDocument;\n\nexport interface SelectionSnapshot {\n anchor: number;\n head: number;\n isCollapsed: boolean;\n activeRange: EditorAnchorProjection;\n}\n\nexport interface DocumentStats {\n paragraphCount: number;\n wordCount: number;\n characterCount: number;\n commentCount: number;\n revisionCount: number;\n}\n\nexport interface CommentSidebarSnapshot {\n activeCommentId?: string;\n openThreadCount: number;\n resolvedThreadCount: number;\n threads: CommentThreadRecord[];\n}\n\nexport interface TrackedChangesSnapshot {\n totalCount: number;\n pendingCount: number;\n acceptedCount: number;\n rejectedCount: number;\n}\n\nexport interface CompatibilityPanelSnapshot {\n report: CompatibilityReport;\n blockExport: boolean;\n totalEntries: number;\n}\n\nexport interface CommandStateSnapshot {\n canUndo: boolean;\n canRedo: boolean;\n canAddComment: boolean;\n canAcceptAllChanges: boolean;\n canRejectAllChanges: boolean;\n}\n\nexport interface RuntimeRenderSnapshot {\n documentId: string;\n sessionId: string;\n sourceLabel?: string;\n revisionToken: string;\n isReady: boolean;\n isDirty: boolean;\n readOnly: boolean;\n selection: SelectionSnapshot;\n documentStats: DocumentStats;\n comments: CommentSidebarSnapshot;\n trackedChanges: TrackedChangesSnapshot;\n compatibility: CompatibilityPanelSnapshot;\n warnings: EditorWarning[];\n fatalError?: EditorError;\n commandState: CommandStateSnapshot;\n}\n\nexport interface PersistedEditorSnapshot\n extends Omit<\n ModelPersistedEditorSnapshot,\n \"canonicalDocument\" | \"compatibility\" | \"warningLog\"\n > {\n canonicalDocument: CanonicalDocumentEnvelope;\n compatibility: CompatibilityReport;\n warningLog: EditorWarning[];\n}\n\nexport interface EditorRuntimeState {\n hasFocus: boolean;\n activeCommentId?: string;\n}\n\nexport interface EditorState {\n phase: RuntimePhase;\n documentId: string;\n sessionId: string;\n sourceLabel?: string;\n revision: number;\n revisionToken: string;\n isDirty: boolean;\n readOnly: boolean;\n document: CanonicalDocumentEnvelope;\n selection: SelectionSnapshot;\n warnings: EditorWarning[];\n compatibility: CompatibilityReport;\n fatalError?: EditorError;\n runtime: EditorRuntimeState;\n}\n\nexport interface CreateEditorStateOptions {\n documentId: string;\n sessionId: string;\n sourceLabel?: string;\n readOnly?: boolean;\n canonicalDocument?: CanonicalDocumentEnvelope;\n persistedSnapshot?: PersistedEditorSnapshot;\n compatibility?: CompatibilityReport;\n warnings?: EditorWarning[];\n fatalError?: EditorError;\n}\n\nexport function createEmptyReviewStore(): ReviewStore {\n return {\n comments: {},\n revisions: {},\n };\n}\n\nexport function createDefaultCanonicalDocument(\n documentId: string,\n timestamp: string,\n): CanonicalDocumentEnvelope {\n return {\n schemaVersion: \"cds/1.0.0\",\n docId: createCanonicalDocumentId(documentId),\n createdAt: timestamp,\n updatedAt: timestamp,\n metadata: {\n customProperties: {},\n },\n styles: {\n paragraphs: {},\n characters: {},\n tables: {},\n },\n numbering: {\n abstractDefinitions: {},\n instances: {},\n },\n media: {\n items: {},\n },\n content: {\n type: \"doc\",\n children: [{ type: \"paragraph\", children: [] }],\n },\n review: createEmptyReviewStore(),\n preservation: {\n opaqueFragments: {},\n packageParts: {},\n },\n diagnostics: {\n warnings: [],\n errors: [],\n },\n };\n}\n\nexport function createSelectionSnapshot(anchor = 0, head = anchor): SelectionSnapshot {\n return {\n anchor,\n head,\n isCollapsed: anchor === head,\n activeRange: createRangeAnchor(anchor, head, DEFAULT_BOUNDARY_ASSOC),\n };\n}\n\nexport function createEmptyCompatibilityReport(generatedAt: string): CompatibilityReport {\n return {\n reportVersion: \"compatibility-report/1\",\n generatedAt,\n blockExport: false,\n featureEntries: [],\n warnings: [],\n errors: [],\n };\n}\n\nexport function createEditorState(options: CreateEditorStateOptions): EditorState {\n const timestamp = new Date(0).toISOString();\n if (options.persistedSnapshot) {\n assertModelPersistedEditorSnapshot(options.persistedSnapshot as unknown);\n }\n if (options.canonicalDocument) {\n assertCanonicalDocument(options.canonicalDocument as unknown);\n }\n\n const normalizedDocument = options.persistedSnapshot\n ? structuredClone(options.persistedSnapshot.canonicalDocument)\n : options.canonicalDocument\n ? structuredClone(options.canonicalDocument)\n : createDefaultCanonicalDocument(options.documentId, timestamp);\n const warnings = options.persistedSnapshot?.warningLog ?? options.warnings ?? [];\n const compatibility =\n options.persistedSnapshot?.compatibility ??\n options.compatibility ??\n createEmptyCompatibilityReport(normalizedDocument.updatedAt);\n\n return {\n phase: options.fatalError ? \"error\" : \"ready\",\n documentId: options.documentId,\n sessionId: options.sessionId,\n sourceLabel: options.sourceLabel,\n revision: 0,\n revisionToken: `${options.sessionId}:0`,\n isDirty: false,\n readOnly: options.readOnly ?? false,\n document: normalizedDocument,\n selection: createSelectionSnapshot(),\n warnings,\n compatibility,\n fatalError: options.fatalError,\n runtime: {\n hasFocus: false,\n },\n };\n}\n\nexport function deriveDocumentStats(state: Pick<EditorState, \"document\">): DocumentStats {\n const serializedContent = extractText(state.document.content);\n\n return {\n paragraphCount: estimateParagraphCount(state.document.content),\n wordCount: serializedContent.trim().length === 0 ? 0 : serializedContent.trim().split(/\\s+/u).length,\n characterCount: Array.from(serializedContent).length,\n commentCount: Object.keys(state.document.review.comments).length,\n revisionCount: Object.keys(state.document.review.revisions).length,\n };\n}\n\nexport function deriveRenderSnapshot(\n state: EditorState,\n history: { canUndo: boolean; canRedo: boolean },\n): RuntimeRenderSnapshot {\n const comments = Object.values(state.document.review.comments).sort((left, right) =>\n left.createdAt.localeCompare(right.createdAt),\n );\n const revisions = Object.values(state.document.review.revisions);\n\n return {\n documentId: state.documentId,\n sessionId: state.sessionId,\n sourceLabel: state.sourceLabel,\n revisionToken: state.revisionToken,\n isReady: state.phase === \"ready\",\n isDirty: state.isDirty,\n readOnly: state.readOnly,\n selection: state.selection,\n documentStats: deriveDocumentStats(state),\n comments: {\n activeCommentId: state.runtime.activeCommentId,\n openThreadCount: comments.filter((comment) => comment.status === \"open\").length,\n resolvedThreadCount: comments.filter((comment) => comment.status === \"resolved\").length,\n threads: comments,\n },\n trackedChanges: {\n totalCount: revisions.length,\n pendingCount: revisions.filter((revision) => revision.status === \"open\").length,\n acceptedCount: revisions.filter((revision) => revision.status === \"accepted\").length,\n rejectedCount: revisions.filter((revision) => revision.status === \"rejected\").length,\n },\n compatibility: {\n report: state.compatibility,\n blockExport: state.compatibility.blockExport,\n totalEntries: state.compatibility.featureEntries.length,\n },\n warnings: state.warnings,\n fatalError: state.fatalError,\n commandState: {\n canUndo: history.canUndo,\n canRedo: history.canRedo,\n canAddComment: !state.readOnly,\n canAcceptAllChanges: revisions.some((revision) => revision.status === \"open\"),\n canRejectAllChanges: revisions.some((revision) => revision.status === \"open\"),\n },\n };\n}\n\nexport function createPersistedEditorSnapshot(\n state: EditorState,\n options: {\n editorBuild: string;\n savedAt: string;\n compatibility?: CompatibilityReport;\n },\n): PersistedEditorSnapshot {\n const snapshot = createModelPersistedEditorSnapshot({\n documentId: state.documentId,\n savedAt: options.savedAt,\n editorBuild: options.editorBuild,\n canonicalDocument: state.document,\n compatibility: (options.compatibility ?? state.compatibility) as never,\n warningLog: state.warnings as never,\n });\n return snapshot as PersistedEditorSnapshot;\n}\n\nfunction estimateParagraphCount(content: unknown): number {\n if (Array.isArray(content)) {\n return content.length;\n }\n\n if (content && typeof content === \"object\" && Array.isArray((content as { blocks?: unknown[] }).blocks)) {\n return ((content as { blocks: unknown[] }).blocks).length;\n }\n\n return extractText(content).length > 0 ? 1 : 0;\n}\n\nfunction extractText(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => extractText(item)).join(\" \");\n }\n\n if (!value || typeof value !== \"object\") {\n return \"\";\n }\n\n return Object.values(value as Record<string, unknown>)\n .map((item) => extractText(item))\n .filter(Boolean)\n .join(\" \");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function createCanonicalDocumentId(documentId: string): string {\n const hashWord = (seed: string): string => {\n let hash = 0x811c9dc5;\n for (const char of seed) {\n hash ^= char.charCodeAt(0);\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0).toString(16).padStart(8, \"0\");\n };\n\n const raw =\n hashWord(`${documentId}:0`) +\n hashWord(`${documentId}:1`) +\n hashWord(`${documentId}:2`) +\n hashWord(`${documentId}:3`);\n\n return [\n raw.slice(0, 8),\n raw.slice(8, 12),\n `4${raw.slice(13, 16)}`,\n `8${raw.slice(17, 20)}`,\n raw.slice(20, 32),\n ].join(\"-\");\n}\n\nexport function normalizeCommentThreadRecord(value: unknown): CommentThreadRecord {\n const record = isRecord(value) ? value : {};\n const authorId =\n typeof record.createdBy === \"string\" && record.createdBy.length > 0\n ? record.createdBy\n : typeof record.authorId === \"string\" && record.authorId.length > 0\n ? record.authorId\n : \"unknown\";\n const createdAt =\n typeof record.createdAt === \"string\" && record.createdAt.length > 0\n ? record.createdAt\n : new Date(0).toISOString();\n const entries = Array.isArray(record.entries)\n ? record.entries\n .filter((entry): entry is Record<string, unknown> => isRecord(entry))\n .map((entry, index) => ({\n entryId:\n typeof entry.entryId === \"string\" && entry.entryId.length > 0\n ? entry.entryId\n : `${String(record.commentId ?? \"comment\")}-entry-${index + 1}`,\n authorId:\n typeof entry.authorId === \"string\" && entry.authorId.length > 0\n ? entry.authorId\n : authorId,\n body: typeof entry.body === \"string\" ? entry.body : \"\",\n createdAt:\n typeof entry.createdAt === \"string\" && entry.createdAt.length > 0\n ? entry.createdAt\n : createdAt,\n metadata: isRecord(entry.metadata)\n ? {\n ooxmlCommentId:\n typeof entry.metadata.ooxmlCommentId === \"string\"\n ? entry.metadata.ooxmlCommentId\n : undefined,\n paraId:\n typeof entry.metadata.paraId === \"string\"\n ? entry.metadata.paraId\n : undefined,\n parentParaId:\n typeof entry.metadata.parentParaId === \"string\"\n ? entry.metadata.parentParaId\n : undefined,\n durableId:\n typeof entry.metadata.durableId === \"string\"\n ? entry.metadata.durableId\n : undefined,\n initials:\n typeof entry.metadata.initials === \"string\"\n ? entry.metadata.initials\n : undefined,\n }\n : undefined,\n }))\n : [\n {\n entryId: `${String(record.commentId ?? \"comment\")}-entry-1`,\n authorId,\n body: typeof record.body === \"string\" ? record.body : \"\",\n createdAt,\n },\n ];\n const resolution = isRecord(record.resolution)\n ? {\n resolvedAt:\n typeof record.resolution.resolvedAt === \"string\"\n ? record.resolution.resolvedAt\n : typeof record.resolvedAt === \"string\"\n ? record.resolvedAt\n : createdAt,\n resolvedBy:\n typeof record.resolution.resolvedBy === \"string\" &&\n record.resolution.resolvedBy.length > 0\n ? record.resolution.resolvedBy\n : authorId,\n }\n : typeof record.resolvedAt === \"string\"\n ? {\n resolvedAt: record.resolvedAt,\n resolvedBy: authorId,\n }\n : undefined;\n const normalizedStatus =\n typeof record.status === \"string\"\n ? record.status\n : record.anchor && isRecord(record.anchor) && record.anchor.kind === \"detached\"\n ? \"detached\"\n : resolution || record.isResolved\n ? \"resolved\"\n : \"open\";\n\n return {\n commentId:\n typeof record.commentId === \"string\" && record.commentId.length > 0\n ? record.commentId\n : \"comment-generated\",\n anchor:\n isRecord(record.anchor) && typeof record.anchor.kind === \"string\"\n ? (record.anchor as unknown as EditorAnchorProjection)\n : createDetachedAnchor({ from: 0, to: 0 }, \"importAmbiguity\"),\n createdAt,\n createdBy: authorId,\n authorId,\n body: entries.map((entry) => entry.body).join(\"\\n\"),\n entries,\n status:\n normalizedStatus === \"resolved\" || normalizedStatus === \"detached\"\n ? normalizedStatus\n : \"open\",\n resolution,\n resolvedAt: resolution?.resolvedAt,\n warningIds: Array.isArray(record.warningIds)\n ? record.warningIds.filter((warningId): warningId is string => typeof warningId === \"string\")\n : [],\n isResolved: normalizedStatus === \"resolved\",\n metadata: isRecord(record.metadata)\n ? {\n source:\n record.metadata.source === \"import\" || record.metadata.source === \"runtime\"\n ? record.metadata.source\n : undefined,\n rootOoxmlCommentId:\n typeof record.metadata.rootOoxmlCommentId === \"string\"\n ? record.metadata.rootOoxmlCommentId\n : undefined,\n rootParaId:\n typeof record.metadata.rootParaId === \"string\"\n ? record.metadata.rootParaId\n : undefined,\n }\n : undefined,\n };\n}\n","export interface ReviewCommandOrigin {\n source:\n | \"keyboard\"\n | \"toolbar\"\n | \"context_menu\"\n | \"comment_panel\"\n | \"review_panel\"\n | \"api\"\n | \"runtime\";\n timestamp: string;\n}\n\nexport type ReviewCommand =\n | {\n type: \"review.accept-revision\";\n revisionId: string;\n origin?: ReviewCommandOrigin;\n }\n | {\n type: \"review.reject-revision\";\n revisionId: string;\n origin?: ReviewCommandOrigin;\n }\n | {\n type: \"review.accept-all-revisions\";\n origin?: ReviewCommandOrigin;\n }\n | {\n type: \"review.reject-all-revisions\";\n origin?: ReviewCommandOrigin;\n };\n\nexport type SingleRevisionReviewCommand = Extract<\n ReviewCommand,\n { revisionId: string }\n>;\n\nexport type BatchRevisionReviewCommand = Exclude<\n ReviewCommand,\n SingleRevisionReviewCommand\n>;\n\nexport type ReviewCommandIntent = \"accept\" | \"reject\";\n\nexport function isSingleRevisionReviewCommand(\n command: ReviewCommand,\n): command is SingleRevisionReviewCommand {\n return \"revisionId\" in command;\n}\n\nexport function isBatchRevisionReviewCommand(\n command: ReviewCommand,\n): command is BatchRevisionReviewCommand {\n return !isSingleRevisionReviewCommand(command);\n}\n\nexport function getReviewCommandIntent(\n command: ReviewCommand,\n): ReviewCommandIntent {\n switch (command.type) {\n case \"review.accept-revision\":\n case \"review.accept-all-revisions\":\n return \"accept\";\n case \"review.reject-revision\":\n case \"review.reject-all-revisions\":\n return \"reject\";\n }\n}\n\nexport function createAcceptRevisionCommand(\n revisionId: string,\n origin?: ReviewCommandOrigin,\n): SingleRevisionReviewCommand {\n return {\n type: \"review.accept-revision\",\n revisionId,\n ...(origin ? { origin } : {}),\n };\n}\n\nexport function createRejectRevisionCommand(\n revisionId: string,\n origin?: ReviewCommandOrigin,\n): SingleRevisionReviewCommand {\n return {\n type: \"review.reject-revision\",\n revisionId,\n ...(origin ? { origin } : {}),\n };\n}\n\nexport function createAcceptAllRevisionsCommand(\n origin?: ReviewCommandOrigin,\n): BatchRevisionReviewCommand {\n return {\n type: \"review.accept-all-revisions\",\n ...(origin ? { origin } : {}),\n };\n}\n\nexport function createRejectAllRevisionsCommand(\n origin?: ReviewCommandOrigin,\n): BatchRevisionReviewCommand {\n return {\n type: \"review.reject-all-revisions\",\n ...(origin ? { origin } : {}),\n };\n}\n","import type {\n DocumentRootNode,\n HyperlinkNode,\n InlineNode,\n OpaqueBlockNode,\n OpaqueInlineNode,\n ParagraphNode,\n TextMark,\n} from \"../../model/canonical-document.ts\";\n\nexport interface ParagraphProperties {\n styleId?: string;\n numbering?: ParagraphNode[\"numbering\"];\n}\n\nexport interface TextStory {\n firstParagraph: ParagraphProperties;\n units: StoryUnit[];\n size: number;\n}\n\nexport type StoryUnit =\n | TextCharacterUnit\n | TabUnit\n | HardBreakUnit\n | ImageUnit\n | OpaqueInlineUnit\n | OpaqueBlockUnit\n | ParagraphBreakUnit;\n\nexport interface TextCharacterUnit {\n kind: \"text\";\n value: string;\n marks?: TextMark[];\n hyperlinkHref?: string;\n}\n\nexport interface TabUnit {\n kind: \"tab\";\n hyperlinkHref?: string;\n}\n\nexport interface HardBreakUnit {\n kind: \"hard_break\";\n hyperlinkHref?: string;\n}\n\nexport interface ImageUnit {\n kind: \"image\";\n mediaId: string;\n altText?: string;\n}\n\nexport interface OpaqueInlineUnit {\n kind: \"opaque_inline\";\n fragmentId: string;\n warningId: string;\n}\n\nexport interface OpaqueBlockUnit {\n kind: \"opaque_block\";\n fragmentId: string;\n warningId: string;\n nextParagraph?: ParagraphProperties;\n}\n\nexport interface ParagraphBreakUnit {\n kind: \"paragraph_break\";\n nextParagraph: ParagraphProperties;\n}\n\nexport function parseTextStory(content: unknown): TextStory {\n const root = normalizeDocumentRoot(content);\n const firstParagraphNode = root.children.find(isParagraphNode);\n const firstParagraph = firstParagraphNode\n ? extractParagraphProperties(firstParagraphNode)\n : cloneParagraphProperties(EMPTY_PARAGRAPH_PROPERTIES);\n const units: StoryUnit[] = [];\n\n for (let index = 0; index < root.children.length; index += 1) {\n const block = root.children[index];\n const nextBlock = root.children[index + 1];\n\n if (isParagraphNode(block)) {\n units.push(...flattenInlineNodes(block.children));\n\n if (isParagraphNode(nextBlock)) {\n units.push({\n kind: \"paragraph_break\",\n nextParagraph: extractParagraphProperties(nextBlock),\n });\n }\n\n continue;\n }\n\n units.push({\n kind: \"opaque_block\",\n fragmentId: block.fragmentId,\n warningId: block.warningId,\n ...(isParagraphNode(nextBlock)\n ? { nextParagraph: extractParagraphProperties(nextBlock) }\n : {}),\n });\n }\n\n return {\n firstParagraph,\n units,\n size: units.length,\n };\n}\n\nexport function serializeTextStory(story: TextStory): DocumentRootNode {\n const blocks: Array<ParagraphNode | OpaqueBlockNode> = [];\n let currentParagraph: ParagraphNode | undefined = createParagraph(story.firstParagraph);\n let currentHyperlink: HyperlinkNode | undefined;\n let activeTextBuffer:\n | {\n text: string;\n marks?: TextMark[];\n hyperlinkHref?: string;\n }\n | undefined;\n\n const ensureCurrentParagraph = () => {\n if (!currentParagraph) {\n currentParagraph = createParagraph(EMPTY_PARAGRAPH_PROPERTIES);\n }\n };\n\n const flushTextBuffer = () => {\n if (!activeTextBuffer || activeTextBuffer.text.length === 0) {\n activeTextBuffer = undefined;\n return;\n }\n\n const textNode = {\n type: \"text\" as const,\n text: activeTextBuffer.text,\n ...(activeTextBuffer.marks ? { marks: cloneMarks(activeTextBuffer.marks) } : {}),\n };\n\n ensureCurrentParagraph();\n\n if (activeTextBuffer.hyperlinkHref) {\n if (!currentHyperlink || currentHyperlink.href !== activeTextBuffer.hyperlinkHref) {\n flushHyperlink();\n currentHyperlink = {\n type: \"hyperlink\",\n href: activeTextBuffer.hyperlinkHref,\n children: [],\n };\n }\n\n currentHyperlink.children.push(textNode);\n } else {\n flushHyperlink();\n currentParagraph!.children.push(textNode);\n }\n\n activeTextBuffer = undefined;\n };\n\n const flushHyperlink = () => {\n if (currentHyperlink) {\n ensureCurrentParagraph();\n currentParagraph!.children.push(currentHyperlink);\n currentHyperlink = undefined;\n }\n };\n\n const flushParagraph = () => {\n flushTextBuffer();\n flushHyperlink();\n\n if (!currentParagraph) {\n return;\n }\n\n blocks.push(currentParagraph);\n currentParagraph = undefined;\n };\n\n const pushInlineNode = (\n node: Exclude<InlineNode, { type: \"text\" }>,\n hyperlinkHref?: string,\n ) => {\n flushTextBuffer();\n ensureCurrentParagraph();\n\n if (hyperlinkHref) {\n if (!currentHyperlink || currentHyperlink.href !== hyperlinkHref) {\n flushHyperlink();\n currentHyperlink = {\n type: \"hyperlink\",\n href: hyperlinkHref,\n children: [],\n };\n }\n\n currentHyperlink.children.push(node as HyperlinkNode[\"children\"][number]);\n return;\n }\n\n flushHyperlink();\n currentParagraph!.children.push(node);\n };\n\n for (const unit of story.units) {\n if (unit.kind === \"paragraph_break\") {\n flushParagraph();\n currentParagraph = createParagraph(unit.nextParagraph);\n continue;\n }\n\n if (unit.kind === \"opaque_block\") {\n flushParagraph();\n blocks.push({\n type: \"opaque_block\",\n fragmentId: unit.fragmentId,\n warningId: unit.warningId,\n });\n currentParagraph = unit.nextParagraph\n ? createParagraph(unit.nextParagraph)\n : undefined;\n continue;\n }\n\n if (unit.kind === \"text\") {\n const shouldExtendBuffer =\n activeTextBuffer &&\n activeTextBuffer.hyperlinkHref === unit.hyperlinkHref &&\n haveEqualMarks(activeTextBuffer.marks, unit.marks);\n\n if (shouldExtendBuffer && activeTextBuffer) {\n activeTextBuffer.text += unit.value;\n } else {\n flushTextBuffer();\n activeTextBuffer = {\n text: unit.value,\n ...(unit.marks ? { marks: cloneMarks(unit.marks) } : {}),\n ...(unit.hyperlinkHref ? { hyperlinkHref: unit.hyperlinkHref } : {}),\n };\n }\n\n continue;\n }\n\n switch (unit.kind) {\n case \"tab\":\n pushInlineNode({ type: \"tab\" }, unit.hyperlinkHref);\n break;\n case \"hard_break\":\n pushInlineNode({ type: \"hard_break\" }, unit.hyperlinkHref);\n break;\n case \"image\":\n pushInlineNode({\n type: \"image\",\n mediaId: unit.mediaId,\n ...(unit.altText ? { altText: unit.altText } : {}),\n });\n break;\n case \"opaque_inline\":\n pushInlineNode({\n type: \"opaque_inline\",\n fragmentId: unit.fragmentId,\n warningId: unit.warningId,\n });\n break;\n }\n }\n\n flushParagraph();\n\n if (blocks.length === 0) {\n blocks.push(createParagraph(story.firstParagraph));\n }\n\n return {\n type: \"doc\",\n children: blocks,\n };\n}\n\nexport function createPlainText(story: TextStory): string {\n return story.units\n .map((unit) => {\n switch (unit.kind) {\n case \"text\":\n return unit.value;\n case \"tab\":\n return \"\\t\";\n case \"hard_break\":\n return \"\\n\";\n case \"paragraph_break\":\n return \"\\n\";\n case \"image\":\n return \"\\uFFFC\";\n case \"opaque_inline\":\n return \"\\uFFF9\";\n case \"opaque_block\":\n return \"\\uFFFA\";\n }\n })\n .join(\"\");\n}\n\nexport function cloneStoryUnit(unit: StoryUnit): StoryUnit {\n switch (unit.kind) {\n case \"text\":\n return {\n kind: \"text\",\n value: unit.value,\n ...(unit.marks ? { marks: cloneMarks(unit.marks) } : {}),\n ...(unit.hyperlinkHref ? { hyperlinkHref: unit.hyperlinkHref } : {}),\n };\n case \"tab\":\n return {\n kind: \"tab\",\n ...(unit.hyperlinkHref ? { hyperlinkHref: unit.hyperlinkHref } : {}),\n };\n case \"hard_break\":\n return {\n kind: \"hard_break\",\n ...(unit.hyperlinkHref ? { hyperlinkHref: unit.hyperlinkHref } : {}),\n };\n case \"image\":\n return {\n kind: \"image\",\n mediaId: unit.mediaId,\n ...(unit.altText ? { altText: unit.altText } : {}),\n };\n case \"opaque_inline\":\n return {\n kind: \"opaque_inline\",\n fragmentId: unit.fragmentId,\n warningId: unit.warningId,\n };\n case \"opaque_block\":\n return {\n kind: \"opaque_block\",\n fragmentId: unit.fragmentId,\n warningId: unit.warningId,\n ...(unit.nextParagraph\n ? { nextParagraph: cloneParagraphProperties(unit.nextParagraph) }\n : {}),\n };\n case \"paragraph_break\":\n return {\n kind: \"paragraph_break\",\n nextParagraph: cloneParagraphProperties(unit.nextParagraph),\n };\n }\n}\n\nexport function cloneParagraphProperties(\n properties: ParagraphProperties,\n): ParagraphProperties {\n return {\n ...(properties.styleId ? { styleId: properties.styleId } : {}),\n ...(properties.numbering\n ? {\n numbering: {\n numberingInstanceId: properties.numbering.numberingInstanceId,\n level: properties.numbering.level,\n },\n }\n : {}),\n };\n}\n\nfunction normalizeDocumentRoot(content: unknown): DocumentRootNode {\n if (isDocumentRootNode(content)) {\n return content;\n }\n\n if (Array.isArray(content)) {\n return {\n type: \"doc\",\n children: content.filter(\n (block): block is DocumentRootNode[\"children\"][number] =>\n isParagraphNode(block) || isOpaqueBlockNode(block),\n ),\n };\n }\n\n return {\n type: \"doc\",\n children: [createEmptyParagraph()],\n };\n}\n\nfunction flattenInlineNodes(\n nodes: ParagraphNode[\"children\"],\n hyperlinkHref?: string,\n): StoryUnit[] {\n const units: StoryUnit[] = [];\n\n for (const node of nodes) {\n switch (node.type) {\n case \"text\":\n for (const character of Array.from(node.text)) {\n units.push({\n kind: \"text\",\n value: character,\n ...(node.marks ? { marks: cloneMarks(node.marks) } : {}),\n ...(hyperlinkHref ? { hyperlinkHref } : {}),\n });\n }\n break;\n case \"tab\":\n units.push({\n kind: \"tab\",\n ...(hyperlinkHref ? { hyperlinkHref } : {}),\n });\n break;\n case \"hard_break\":\n units.push({\n kind: \"hard_break\",\n ...(hyperlinkHref ? { hyperlinkHref } : {}),\n });\n break;\n case \"hyperlink\":\n units.push(...flattenInlineNodes(node.children, node.href));\n break;\n case \"image\":\n units.push({\n kind: \"image\",\n mediaId: node.mediaId,\n ...(node.altText ? { altText: node.altText } : {}),\n });\n break;\n case \"opaque_inline\":\n units.push({\n kind: \"opaque_inline\",\n fragmentId: node.fragmentId,\n warningId: node.warningId,\n });\n break;\n }\n }\n\n return units;\n}\n\nfunction extractParagraphProperties(paragraph: ParagraphNode): ParagraphProperties {\n return {\n ...(paragraph.styleId ? { styleId: paragraph.styleId } : {}),\n ...(paragraph.numbering\n ? {\n numbering: {\n numberingInstanceId: paragraph.numbering.numberingInstanceId,\n level: paragraph.numbering.level,\n },\n }\n : {}),\n };\n}\n\nfunction createParagraph(properties: ParagraphProperties): ParagraphNode {\n return {\n type: \"paragraph\",\n ...(properties.styleId ? { styleId: properties.styleId } : {}),\n ...(properties.numbering\n ? {\n numbering: {\n numberingInstanceId: properties.numbering.numberingInstanceId,\n level: properties.numbering.level,\n },\n }\n : {}),\n children: [],\n };\n}\n\nfunction createEmptyParagraph(): ParagraphNode {\n return {\n type: \"paragraph\",\n children: [],\n };\n}\n\nconst EMPTY_PARAGRAPH_PROPERTIES: ParagraphProperties = {};\n\nfunction cloneMarks(marks: TextMark[]): TextMark[] {\n return marks.map((mark) => ({ type: mark.type }));\n}\n\nfunction haveEqualMarks(left?: TextMark[], right?: TextMark[]): boolean {\n if (!left && !right) {\n return true;\n }\n\n if (!left || !right || left.length !== right.length) {\n return false;\n }\n\n return left.every((mark, index) => mark.type === right[index]?.type);\n}\n\nfunction isDocumentRootNode(value: unknown): value is DocumentRootNode {\n return Boolean(value) && typeof value === \"object\" && (value as { type?: string }).type === \"doc\";\n}\n\nfunction isParagraphNode(value: unknown): value is ParagraphNode {\n return Boolean(value) && typeof value === \"object\" && (value as { type?: string }).type === \"paragraph\";\n}\n\nfunction isOpaqueBlockNode(value: unknown): value is OpaqueBlockNode {\n return Boolean(value) && typeof value === \"object\" && (value as { type?: string }).type === \"opaque_block\";\n}\n","import { createSelectionSnapshot, type CanonicalDocumentEnvelope, type SelectionSnapshot } from \"./editor-state.ts\";\nimport type { TransactionMapping } from \"../selection/mapping.ts\";\nimport {\n cloneParagraphProperties,\n cloneStoryUnit,\n createPlainText,\n parseTextStory,\n serializeTextStory,\n type ParagraphProperties,\n type StoryUnit,\n type TextStory,\n} from \"../schema/text-schema.ts\";\n\nexport type TextInsertion =\n | {\n type: \"text\";\n text: string;\n }\n | {\n type: \"tab\";\n }\n | {\n type: \"hard_break\";\n }\n | {\n type: \"paragraph_break\";\n };\n\nexport type TextTransactionIntent =\n | {\n type: \"replace\";\n range?: {\n from: number;\n to: number;\n };\n insertion: TextInsertion[];\n }\n | {\n type: \"delete_backward\";\n }\n | {\n type: \"delete_forward\";\n };\n\nexport interface TextTransactionResult {\n document: CanonicalDocumentEnvelope;\n selection: SelectionSnapshot;\n mapping: TransactionMapping;\n storyText: string;\n}\n\nexport class TextTransactionError extends Error {\n readonly code: \"invalid_selection\" | \"unsupported_content\";\n\n constructor(\n code: TextTransactionError[\"code\"],\n message: string,\n ) {\n super(message);\n this.name = \"TextTransactionError\";\n this.code = code;\n }\n}\n\nexport function applyTextTransaction(\n document: CanonicalDocumentEnvelope,\n selection: SelectionSnapshot,\n intent: TextTransactionIntent,\n options: {\n timestamp: string;\n },\n): TextTransactionResult {\n const story = parseTextStory(document.content);\n const normalizedRange = resolveRange(selection, story.size, intent);\n const insertionUnits = createInsertionUnits(intent, story, normalizedRange.from);\n\n ensureEditableRange(story.units.slice(normalizedRange.from, normalizedRange.to));\n\n const nextUnits = [\n ...story.units.slice(0, normalizedRange.from).map(cloneStoryUnit),\n ...insertionUnits.map(cloneStoryUnit),\n ...story.units.slice(normalizedRange.to).map(cloneStoryUnit),\n ];\n\n const nextStory: TextStory = {\n firstParagraph: cloneParagraphProperties(story.firstParagraph),\n units: normalizeStoryUnits(nextUnits),\n size: 0,\n };\n nextStory.size = nextStory.units.length;\n\n const caret = normalizedRange.from + insertionUnits.length;\n\n return {\n document: {\n ...document,\n updatedAt: options.timestamp,\n content: serializeTextStory(nextStory),\n },\n selection: createSelectionSnapshot(caret, caret),\n mapping: {\n steps: [\n {\n from: normalizedRange.from,\n to: normalizedRange.to,\n insertSize: insertionUnits.length,\n },\n ],\n metadata: {\n affectsComments: true,\n affectsRevisions: true,\n ...(containsParagraphBoundaryChange(story, normalizedRange, insertionUnits)\n ? { invalidatesStructures: true }\n : {}),\n },\n },\n storyText: createPlainText(nextStory),\n };\n}\n\nfunction resolveRange(\n selection: SelectionSnapshot,\n storySize: number,\n intent: TextTransactionIntent,\n): { from: number; to: number } {\n const from = Math.max(0, Math.min(selection.anchor, selection.head));\n const to = Math.max(0, Math.max(selection.anchor, selection.head));\n\n if (from > storySize || to > storySize) {\n throw new TextTransactionError(\n \"invalid_selection\",\n `Selection ${from}-${to} exceeds story size ${storySize}.`,\n );\n }\n\n if (intent.type === \"replace\") {\n if (intent.range) {\n const explicitFrom = Math.max(0, Math.min(intent.range.from, intent.range.to));\n const explicitTo = Math.max(0, Math.max(intent.range.from, intent.range.to));\n if (explicitFrom > storySize || explicitTo > storySize) {\n throw new TextTransactionError(\n \"invalid_selection\",\n `Explicit range ${explicitFrom}-${explicitTo} exceeds story size ${storySize}.`,\n );\n }\n\n return {\n from: explicitFrom,\n to: explicitTo,\n };\n }\n\n return { from, to };\n }\n\n if (from !== to) {\n return { from, to };\n }\n\n if (intent.type === \"delete_backward\") {\n return {\n from: Math.max(0, from - 1),\n to: from,\n };\n }\n\n return {\n from,\n to: Math.min(storySize, from + 1),\n };\n}\n\nfunction createInsertionUnits(\n intent: TextTransactionIntent,\n story: TextStory,\n position: number,\n): StoryUnit[] {\n if (intent.type !== \"replace\") {\n return [];\n }\n\n const inheritedProps = resolveParagraphPropertiesAtPosition(story, position);\n\n return intent.insertion.flatMap((entry) => {\n switch (entry.type) {\n case \"text\":\n return Array.from(entry.text).map<StoryUnit>((character) => ({\n kind: \"text\",\n value: character,\n }));\n case \"tab\":\n return [{ kind: \"tab\" }];\n case \"hard_break\":\n return [{ kind: \"hard_break\" }];\n case \"paragraph_break\":\n return [\n {\n kind: \"paragraph_break\",\n nextParagraph: cloneParagraphProperties(inheritedProps),\n },\n ];\n }\n });\n}\n\nfunction resolveParagraphPropertiesAtPosition(\n story: TextStory,\n position: number,\n): ParagraphProperties {\n let current = cloneParagraphProperties(story.firstParagraph);\n\n for (let index = 0; index < Math.min(position, story.units.length); index += 1) {\n const unit = story.units[index];\n if (unit.kind === \"paragraph_break\") {\n current = cloneParagraphProperties(unit.nextParagraph);\n } else if (unit.kind === \"opaque_block\" && unit.nextParagraph) {\n current = cloneParagraphProperties(unit.nextParagraph);\n }\n }\n\n return current;\n}\n\nfunction normalizeStoryUnits(units: StoryUnit[]): StoryUnit[] {\n if (units.length === 0) {\n return [];\n }\n\n const normalized: StoryUnit[] = [];\n\n for (const unit of units) {\n if (\n unit.kind === \"paragraph_break\" &&\n normalized[normalized.length - 1]?.kind === \"paragraph_break\"\n ) {\n normalized.push({\n kind: \"paragraph_break\",\n nextParagraph: cloneParagraphProperties(unit.nextParagraph),\n });\n continue;\n }\n\n normalized.push(cloneStoryUnit(unit));\n }\n\n return normalized;\n}\n\nfunction ensureEditableRange(units: StoryUnit[]): void {\n const protectedUnit = units.find(\n (unit) => unit.kind === \"opaque_inline\" || unit.kind === \"opaque_block\" || unit.kind === \"image\",\n );\n\n if (!protectedUnit) {\n return;\n }\n\n throw new TextTransactionError(\n \"unsupported_content\",\n `Text transaction crosses protected ${protectedUnit.kind} content.`,\n );\n}\n\nfunction containsParagraphBoundaryChange(\n story: TextStory,\n range: { from: number; to: number },\n insertionUnits: StoryUnit[],\n): boolean {\n if (insertionUnits.some((unit) => unit.kind === \"paragraph_break\")) {\n return true;\n }\n\n return story.units\n .slice(range.from, range.to)\n .some((unit) => unit.kind === \"paragraph_break\");\n}\n","import type { CanonicalDocumentEnvelope, SelectionSnapshot } from \"../state/editor-state.ts\";\nimport {\n applyTextTransaction,\n type TextTransactionResult,\n} from \"../state/text-transaction.ts\";\n\nexport interface TextCommandContext {\n timestamp: string;\n}\n\nexport function insertText(\n document: CanonicalDocumentEnvelope,\n selection: SelectionSnapshot,\n text: string,\n context: TextCommandContext,\n): TextTransactionResult {\n return applyTextTransaction(\n document,\n selection,\n {\n type: \"replace\",\n insertion: [\n {\n type: \"text\",\n text,\n },\n ],\n },\n context,\n );\n}\n\nexport function deleteSelectionOrBackward(\n document: CanonicalDocumentEnvelope,\n selection: SelectionSnapshot,\n context: TextCommandContext,\n): TextTransactionResult {\n return applyTextTransaction(\n document,\n selection,\n selection.isCollapsed\n ? {\n type: \"delete_backward\",\n }\n : {\n type: \"replace\",\n insertion: [],\n },\n context,\n );\n}\n\nexport function deleteSelectionOrForward(\n document: CanonicalDocumentEnvelope,\n selection: SelectionSnapshot,\n context: TextCommandContext,\n): TextTransactionResult {\n return applyTextTransaction(\n document,\n selection,\n selection.isCollapsed\n ? {\n type: \"delete_forward\",\n }\n : {\n type: \"replace\",\n insertion: [],\n },\n context,\n );\n}\n\nexport function insertTab(\n document: CanonicalDocumentEnvelope,\n selection: SelectionSnapshot,\n context: TextCommandContext,\n): TextTransactionResult {\n return applyTextTransaction(\n document,\n selection,\n {\n type: \"replace\",\n insertion: [{ type: \"tab\" }],\n },\n context,\n );\n}\n\nexport function insertHardBreak(\n document: CanonicalDocumentEnvelope,\n selection: SelectionSnapshot,\n context: TextCommandContext,\n): TextTransactionResult {\n return applyTextTransaction(\n document,\n selection,\n {\n type: \"replace\",\n insertion: [{ type: \"hard_break\" }],\n },\n context,\n );\n}\n\nexport function splitParagraph(\n document: CanonicalDocumentEnvelope,\n selection: SelectionSnapshot,\n context: TextCommandContext,\n): TextTransactionResult {\n return applyTextTransaction(\n document,\n selection,\n {\n type: \"replace\",\n insertion: [{ type: \"paragraph_break\" }],\n },\n context,\n );\n}\n","import { parseTextStory } from \"../schema/text-schema.ts\";\nimport {\n DEFAULT_BOUNDARY_ASSOC,\n createDetachedAnchor,\n createRangeAnchor,\n mapAnchor,\n normalizeRange,\n type BoundaryAssoc,\n type DetachedAnchor,\n type DocRange,\n type EditorAnchorProjection,\n type TransactionMapping,\n} from \"./mapping.ts\";\n\nexport type ReviewAnchor = EditorAnchorProjection;\n\nexport const COMMENT_RANGE_ASSOC: BoundaryAssoc = DEFAULT_BOUNDARY_ASSOC;\n\nexport function createCommentReviewAnchor(\n from: number,\n to = from,\n assoc: BoundaryAssoc = COMMENT_RANGE_ASSOC,\n): ReviewAnchor {\n return createRangeAnchor(from, to, assoc);\n}\n\nexport function detachReviewAnchor(\n lastKnownRange: DocRange,\n reason: DetachedAnchor[\"reason\"],\n): DetachedAnchor {\n return createDetachedAnchor(lastKnownRange, reason);\n}\n\nexport function mapReviewAnchor(\n anchor: ReviewAnchor,\n mapping: TransactionMapping,\n): ReviewAnchor {\n return mapAnchor(anchor, mapping);\n}\n\nexport function getAnchorRange(anchor: ReviewAnchor): DocRange {\n if (anchor.kind === \"range\") {\n return normalizeRange(anchor.range);\n }\n\n if (anchor.kind === \"node\") {\n return { from: anchor.at, to: anchor.at };\n }\n\n return normalizeRange(anchor.lastKnownRange);\n}\n\nexport function mappingTouchesAnchorContent(\n anchor: ReviewAnchor,\n mapping: TransactionMapping,\n): boolean {\n const range = getAnchorRange(anchor);\n\n if (range.from === range.to) {\n return mapping.steps.some(\n (step) => step.from <= range.from && step.to >= range.to,\n );\n }\n\n return mapping.steps.some(\n (step) => step.from < range.to && step.to > range.from,\n );\n}\n\nexport function rangeStaysWithinSingleParagraph(\n content: unknown,\n range: DocRange,\n): boolean {\n const normalized = normalizeRange(range);\n if (normalized.from === normalized.to) {\n return true;\n }\n\n const story = parseTextStory(content);\n const upperBound = Math.min(normalized.to, story.units.length);\n\n for (let index = Math.max(0, normalized.from); index < upperBound; index += 1) {\n const unit = story.units[index];\n if (!unit) {\n continue;\n }\n\n if (unit.kind === \"paragraph_break\" || unit.kind === \"opaque_block\") {\n return false;\n }\n }\n\n return true;\n}\n","import type { CommentThreadRecord, EditorWarning } from \"../../core/state/editor-state.ts\";\nimport {\n detachReviewAnchor,\n getAnchorRange,\n mapReviewAnchor,\n mappingTouchesAnchorContent,\n rangeStaysWithinSingleParagraph,\n type ReviewAnchor,\n} from \"../../core/selection/review-anchors.ts\";\nimport type { TransactionMapping } from \"../../core/selection/mapping.ts\";\n\nexport interface RemapCommentThreadsOptions {\n comments: Record<string, CommentThreadRecord>;\n mapping: TransactionMapping;\n nextContent: unknown;\n existingWarnings?: EditorWarning[];\n}\n\nexport interface RemapCommentThreadsResult {\n comments: Record<string, CommentThreadRecord>;\n warnings: EditorWarning[];\n detachedCommentIds: string[];\n}\n\nexport function remapCommentThreads(\n options: RemapCommentThreadsOptions,\n): RemapCommentThreadsResult {\n const comments = Object.fromEntries(\n Object.entries(options.comments).map(([commentId, comment]) => [\n commentId,\n remapCommentThread(comment, options.mapping, options.nextContent),\n ]),\n );\n const detachedCommentIds = Object.values(comments)\n .filter((comment) => comment.anchor.kind === \"detached\")\n .map((comment) => comment.commentId);\n\n return {\n comments,\n warnings: mergeDetachedAnchorWarnings(comments, options.existingWarnings ?? []),\n detachedCommentIds,\n };\n}\n\nexport function remapCommentThread(\n comment: CommentThreadRecord,\n mapping: TransactionMapping,\n nextContent: unknown,\n): CommentThreadRecord {\n if (comment.anchor.kind === \"detached\") {\n return comment;\n }\n\n const mappedAnchor = mapReviewAnchor(comment.anchor, mapping);\n const anchor = normalizeCommentAnchor(comment.anchor, mappedAnchor, mapping, nextContent);\n\n return {\n ...comment,\n anchor,\n };\n}\n\nfunction normalizeCommentAnchor(\n previousAnchor: ReviewAnchor,\n mappedAnchor: ReviewAnchor,\n mapping: TransactionMapping,\n nextContent: unknown,\n): ReviewAnchor {\n if (mappedAnchor.kind === \"detached\") {\n return mappedAnchor;\n }\n\n const previousRange = getAnchorRange(previousAnchor);\n const mappedRange = getAnchorRange(mappedAnchor);\n\n if (\n previousAnchor.kind === \"range\" &&\n previousRange.from < previousRange.to &&\n mappedAnchor.kind === \"range\" &&\n mappedRange.from === mappedRange.to &&\n mappingTouchesAnchorContent(previousAnchor, mapping)\n ) {\n return detachReviewAnchor(previousRange, detachReason(mapping));\n }\n\n if (\n mappedAnchor.kind === \"range\" &&\n !rangeStaysWithinSingleParagraph(nextContent, mappedAnchor.range)\n ) {\n return detachReviewAnchor(previousRange, \"invalidatedByStructureChange\");\n }\n\n return mappedAnchor;\n}\n\nfunction detachReason(\n mapping: TransactionMapping,\n): \"deleted\" | \"invalidatedByStructureChange\" {\n return mapping.metadata?.invalidatesStructures\n ? \"invalidatedByStructureChange\"\n : \"deleted\";\n}\n\nfunction mergeDetachedAnchorWarnings(\n comments: Record<string, CommentThreadRecord>,\n existingWarnings: EditorWarning[],\n): EditorWarning[] {\n const retainedWarnings = existingWarnings.filter(\n (warning) =>\n warning.code !== \"comment_anchor_detached\" ||\n !warning.details ||\n typeof warning.details.commentId !== \"string\" ||\n comments[warning.details.commentId]?.anchor.kind === \"detached\",\n );\n\n const knownDetachedIds = new Set(\n retainedWarnings\n .filter((warning) => warning.code === \"comment_anchor_detached\")\n .map((warning) =>\n typeof warning.details?.commentId === \"string\"\n ? warning.details.commentId\n : undefined,\n )\n .filter((value): value is string => Boolean(value)),\n );\n\n const detachedWarnings = Object.values(comments)\n .filter(\n (comment) =>\n comment.anchor.kind === \"detached\" && !knownDetachedIds.has(comment.commentId),\n )\n .map((comment) => createDetachedCommentWarning(comment));\n\n return [...retainedWarnings, ...detachedWarnings];\n}\n\nfunction createDetachedCommentWarning(\n comment: CommentThreadRecord,\n): EditorWarning {\n const anchor = comment.anchor.kind === \"detached\" ? comment.anchor : undefined;\n\n return {\n warningId: `warning:comment-anchor-detached:${comment.commentId}`,\n code: \"comment_anchor_detached\",\n severity: \"warning\",\n message: `Comment ${comment.commentId} detached after edit remapping.`,\n source: \"review\",\n affectedAnchor: anchor,\n details: {\n commentId: comment.commentId,\n reason: anchor?.reason,\n },\n };\n}\n","import {\n createNodeAnchor,\n createRangeAnchor,\n mapAnchor,\n normalizeRange,\n type Assoc,\n type BoundaryAssoc,\n type DocRange,\n type EditorAnchorProjection,\n type TransactionMapping,\n} from \"../../core/selection/mapping.ts\";\n\nexport type RevisionAnchor = EditorAnchorProjection;\n\nexport type SupportedRevisionKind = \"insertion\" | \"deletion\" | \"property-change\";\nexport type PreserveOnlyRevisionKind = \"formatting\" | \"move\";\nexport type RevisionKind = SupportedRevisionKind | PreserveOnlyRevisionKind;\n\nexport type RevisionStatus = \"active\" | \"accepted\" | \"rejected\" | \"detached\";\nexport type RevisionActionability = \"actionable\" | \"preserve-only\";\nexport type RevisionAnchorState = \"active\" | \"detached\";\n\nexport interface PropertyChangeData {\n xmlTag: \"pPrChange\" | \"sectPrChange\" | \"tblPrChange\" | \"rPrChange\";\n beforeXml: string;\n}\n\nexport interface MoveData {\n moveId: string;\n direction: \"from\" | \"to\";\n}\n\nexport interface RevisionMetadataEnvelope {\n source: \"runtime\" | \"import\";\n preserveOnlyReason?: string;\n importedRevisionForm?:\n | \"run-insertion\"\n | \"run-deletion\"\n | \"paragraph-insertion\"\n | \"paragraph-deletion\";\n originalRevisionType?: string;\n ooxmlRevisionId?: string;\n propertyChangeData?: PropertyChangeData;\n moveData?: MoveData;\n}\n\nexport type PropertyChangeRevision = RevisionRecord & {\n kind: \"property-change\";\n metadata: RevisionMetadataEnvelope & { propertyChangeData: PropertyChangeData };\n};\n\nexport type MoveRevision = RevisionRecord & {\n kind: \"move\";\n metadata: RevisionMetadataEnvelope & { moveData: MoveData };\n};\n\nexport interface RevisionRecord {\n revisionId: string;\n kind: RevisionKind;\n anchor: RevisionAnchor;\n authorId: string;\n createdAt: string;\n status: RevisionStatus;\n warningIds: string[];\n metadata: RevisionMetadataEnvelope;\n}\n\nexport interface RevisionAnchorSummary {\n anchor: RevisionAnchor;\n state: RevisionAnchorState;\n range: DocRange;\n}\n\nexport function createRevisionRangeAnchor(\n from: number,\n to = from,\n assoc?: BoundaryAssoc,\n): RevisionAnchor {\n return createRangeAnchor(from, to, assoc);\n}\n\nexport function createRevisionNodeAnchor(at: number, assoc?: Assoc): RevisionAnchor {\n return createNodeAnchor(at, assoc);\n}\n\nexport function remapRevisionAnchor(\n anchor: RevisionAnchor,\n mapping: TransactionMapping,\n): RevisionAnchor {\n return mapAnchor(anchor, mapping);\n}\n\nexport function isDetachedRevisionAnchor(anchor: RevisionAnchor): boolean {\n return anchor.kind === \"detached\";\n}\n\nexport function summarizeRevisionAnchor(anchor: RevisionAnchor): RevisionAnchorSummary {\n if (anchor.kind === \"range\") {\n return {\n anchor,\n state: \"active\",\n range: normalizeRange(anchor.range),\n };\n }\n\n if (anchor.kind === \"node\") {\n return {\n anchor,\n state: \"active\",\n range: {\n from: anchor.at,\n to: anchor.at,\n },\n };\n }\n\n return {\n anchor,\n state: \"detached\",\n range: normalizeRange(anchor.lastKnownRange),\n };\n}\n\nexport function getRevisionActionability(\n revision:\n | RevisionKind\n | Pick<RevisionRecord, \"kind\" | \"metadata\">,\n): RevisionActionability {\n if (\n typeof revision !== \"string\" &&\n typeof revision.metadata.preserveOnlyReason === \"string\" &&\n revision.metadata.preserveOnlyReason.length > 0\n ) {\n return \"preserve-only\";\n }\n\n const kind = typeof revision === \"string\" ? revision : revision.kind;\n switch (kind) {\n case \"insertion\":\n case \"deletion\":\n case \"property-change\":\n return \"actionable\";\n case \"formatting\":\n case \"move\":\n return \"preserve-only\";\n }\n}\n\nexport function isRevisionActionable(\n record: Pick<RevisionRecord, \"kind\" | \"metadata\" | \"status\">,\n): boolean {\n return getRevisionActionability(record) === \"actionable\" && record.status === \"active\";\n}\n\nexport function describeRevisionKind(kind: RevisionKind): string {\n switch (kind) {\n case \"insertion\":\n return \"Insertion\";\n case \"deletion\":\n return \"Deletion\";\n case \"formatting\":\n return \"Formatting change\";\n case \"move\":\n return \"Move\";\n case \"property-change\":\n return \"Property change\";\n }\n}\n","import type { TransactionMapping } from \"../../core/selection/mapping.ts\";\nimport {\n describeRevisionKind,\n getRevisionActionability,\n isDetachedRevisionAnchor,\n isRevisionActionable,\n remapRevisionAnchor,\n summarizeRevisionAnchor,\n type RevisionActionability,\n type RevisionKind,\n type RevisionMetadataEnvelope,\n type RevisionRecord,\n type RevisionStatus,\n} from \"./revision-types.ts\";\n\nexport interface RevisionStore {\n version: \"revision-store/1\";\n revisions: Record<string, RevisionRecord>;\n}\n\nexport interface CreateRevisionRecordParams {\n revisionId: string;\n kind: RevisionKind;\n anchor: RevisionRecord[\"anchor\"];\n authorId: string;\n createdAt: string;\n status?: Exclude<RevisionStatus, \"detached\">;\n warningIds?: string[];\n metadata?: Partial<RevisionMetadataEnvelope>;\n}\n\nexport interface RevisionSidebarEntry {\n revisionId: string;\n kind: RevisionKind;\n label: string;\n status: RevisionStatus;\n actionability: RevisionActionability;\n anchorLabel: string;\n createdAt: string;\n authorId: string;\n warningCount: number;\n canAccept: boolean;\n canReject: boolean;\n preserveOnlyReason?: string;\n}\n\nexport interface RevisionSidebarProjection {\n totalCount: number;\n activeRevisionIds: string[];\n acceptedRevisionIds: string[];\n rejectedRevisionIds: string[];\n detachedRevisionIds: string[];\n actionableRevisionIds: string[];\n preserveOnlyRevisionIds: string[];\n revisions: RevisionSidebarEntry[];\n}\n\nexport function createRevisionStore(\n revisions: Record<string, RevisionRecord> = {},\n): RevisionStore {\n return {\n version: \"revision-store/1\",\n revisions,\n };\n}\n\nexport function createRevisionRecord(\n params: CreateRevisionRecordParams,\n): RevisionRecord {\n return normalizeRevisionRecord({\n revisionId: params.revisionId,\n kind: params.kind,\n anchor: params.anchor,\n authorId: params.authorId,\n createdAt: params.createdAt,\n status: params.status ?? \"active\",\n warningIds: [...(params.warningIds ?? [])],\n metadata: {\n source: params.metadata?.source ?? \"runtime\",\n preserveOnlyReason:\n params.metadata?.preserveOnlyReason ??\n (getRevisionActionability(params.kind) === \"preserve-only\"\n ? \"Imported preserve-only revision.\"\n : undefined),\n importedRevisionForm: params.metadata?.importedRevisionForm,\n originalRevisionType: params.metadata?.originalRevisionType,\n ooxmlRevisionId: params.metadata?.ooxmlRevisionId,\n propertyChangeData: params.metadata?.propertyChangeData,\n moveData: params.metadata?.moveData,\n },\n });\n}\n\nexport function upsertRevisionRecord(\n store: RevisionStore,\n revision: RevisionRecord,\n): RevisionStore {\n return {\n ...store,\n revisions: {\n ...store.revisions,\n [revision.revisionId]: normalizeRevisionRecord(revision),\n },\n };\n}\n\nexport function setRevisionStatus(\n store: RevisionStore,\n revisionId: string,\n status: Exclude<RevisionStatus, \"detached\">,\n): RevisionStore {\n const existing = store.revisions[revisionId];\n if (!existing) {\n return store;\n }\n\n if (existing.status === \"detached\") {\n return store;\n }\n\n if (\n (status === \"accepted\" || status === \"rejected\") &&\n getRevisionActionability(existing) !== \"actionable\"\n ) {\n return store;\n }\n\n return upsertRevisionRecord(store, {\n ...existing,\n status,\n });\n}\n\nexport function setRevisionWarnings(\n store: RevisionStore,\n revisionId: string,\n warningIds: string[],\n): RevisionStore {\n const existing = store.revisions[revisionId];\n if (!existing) {\n return store;\n }\n\n return upsertRevisionRecord(store, {\n ...existing,\n warningIds: [...warningIds],\n });\n}\n\nexport function remapRevisionStore(\n store: RevisionStore,\n mapping: TransactionMapping,\n): RevisionStore {\n return createRevisionStore(\n Object.fromEntries(\n Object.entries(store.revisions).map(([revisionId, revision]) => {\n const anchor = remapRevisionAnchor(revision.anchor, mapping);\n const status =\n anchor.kind === \"detached\"\n ? \"detached\"\n : revision.status === \"accepted\" || revision.status === \"rejected\"\n ? revision.status\n : \"active\";\n\n return [\n revisionId,\n normalizeRevisionRecord({\n ...revision,\n anchor,\n status,\n }),\n ];\n }),\n ),\n );\n}\n\nexport function createRevisionSidebarProjection(\n store: RevisionStore,\n): RevisionSidebarProjection {\n const revisions = Object.values(store.revisions)\n .map(toSidebarEntry)\n .sort(compareRevisionEntries);\n\n return {\n totalCount: revisions.length,\n activeRevisionIds: revisions\n .filter((revision) => revision.status === \"active\")\n .map((revision) => revision.revisionId),\n acceptedRevisionIds: revisions\n .filter((revision) => revision.status === \"accepted\")\n .map((revision) => revision.revisionId),\n rejectedRevisionIds: revisions\n .filter((revision) => revision.status === \"rejected\")\n .map((revision) => revision.revisionId),\n detachedRevisionIds: revisions\n .filter((revision) => revision.status === \"detached\")\n .map((revision) => revision.revisionId),\n actionableRevisionIds: revisions\n .filter((revision) => revision.actionability === \"actionable\")\n .map((revision) => revision.revisionId),\n preserveOnlyRevisionIds: revisions\n .filter((revision) => revision.actionability === \"preserve-only\")\n .map((revision) => revision.revisionId),\n revisions,\n };\n}\n\nfunction toSidebarEntry(revision: RevisionRecord): RevisionSidebarEntry {\n const anchorSummary = summarizeRevisionAnchor(revision.anchor);\n const actionability = getRevisionActionability(revision);\n\n return {\n revisionId: revision.revisionId,\n kind: revision.kind,\n label: describeRevisionKind(revision.kind),\n status: revision.status,\n actionability,\n anchorLabel:\n anchorSummary.state === \"detached\"\n ? `Detached ${anchorSummary.range.from}-${anchorSummary.range.to}`\n : `Range ${anchorSummary.range.from}-${anchorSummary.range.to}`,\n createdAt: revision.createdAt,\n authorId: revision.authorId,\n warningCount: revision.warningIds.length,\n canAccept: isRevisionActionable(revision),\n canReject: isRevisionActionable(revision),\n preserveOnlyReason: revision.metadata.preserveOnlyReason,\n };\n}\n\nfunction normalizeRevisionRecord(revision: RevisionRecord): RevisionRecord {\n const actionability = getRevisionActionability(revision);\n\n if (isDetachedRevisionAnchor(revision.anchor)) {\n return {\n ...revision,\n status: \"detached\",\n metadata: {\n ...revision.metadata,\n preserveOnlyReason:\n revision.metadata.preserveOnlyReason ??\n (actionability === \"preserve-only\"\n ? \"Imported preserve-only revision.\"\n : undefined),\n },\n };\n }\n\n if (actionability === \"preserve-only\" && revision.status !== \"detached\") {\n return {\n ...revision,\n status: revision.status === \"accepted\" || revision.status === \"rejected\" ? \"active\" : revision.status,\n metadata: {\n ...revision.metadata,\n preserveOnlyReason:\n revision.metadata.preserveOnlyReason ?? \"Imported preserve-only revision.\",\n },\n };\n }\n\n return revision;\n}\n\nfunction compareRevisionEntries(\n left: RevisionSidebarEntry,\n right: RevisionSidebarEntry,\n): number {\n const statusDelta = priorityForStatus(left.status) - priorityForStatus(right.status);\n if (statusDelta !== 0) {\n return statusDelta;\n }\n\n const actionabilityDelta =\n priorityForActionability(left.actionability) - priorityForActionability(right.actionability);\n if (actionabilityDelta !== 0) {\n return actionabilityDelta;\n }\n\n return left.createdAt.localeCompare(right.createdAt);\n}\n\nfunction priorityForStatus(status: RevisionStatus): number {\n switch (status) {\n case \"active\":\n return 0;\n case \"detached\":\n return 1;\n case \"accepted\":\n return 2;\n case \"rejected\":\n return 3;\n }\n}\n\nfunction priorityForActionability(actionability: RevisionActionability): number {\n switch (actionability) {\n case \"actionable\":\n return 0;\n case \"preserve-only\":\n return 1;\n }\n}\n","import { createEmptyMapping, type TransactionMapping } from \"../../core/selection/mapping.ts\";\nimport { parseTextStory } from \"../../core/schema/text-schema.ts\";\nimport { createSelectionSnapshot, type CanonicalDocumentEnvelope } from \"../../core/state/editor-state.ts\";\nimport { applyTextTransaction } from \"../../core/state/text-transaction.ts\";\nimport {\n remapRevisionStore,\n setRevisionStatus,\n type RevisionStore,\n} from \"./revision-store.ts\";\nimport { getRevisionActionability, type RevisionRecord } from \"./revision-types.ts\";\n\nexport type RevisionActionIntent = \"accept\" | \"reject\";\n\nexport type RevisionActionSkipReason =\n | \"missing\"\n | \"already-resolved\"\n | \"detached-anchor\"\n | \"preserve-only\"\n | \"structural-range\"\n | \"protected-range\"\n | \"invalid-range\";\n\nexport interface ApplyRevisionActionOptions {\n document: CanonicalDocumentEnvelope;\n store: RevisionStore;\n revisionId: string;\n intent: RevisionActionIntent;\n timestamp: string;\n}\n\nexport interface AppliedRevisionAction {\n kind: \"applied\";\n revisionId: string;\n intent: RevisionActionIntent;\n resultingStatus: \"accepted\" | \"rejected\";\n contentChanged: boolean;\n}\n\nexport interface SkippedRevisionAction {\n kind: \"skipped\";\n revisionId: string;\n intent: RevisionActionIntent;\n reason: RevisionActionSkipReason;\n detail: string;\n}\n\nexport type RevisionActionOutcome =\n | AppliedRevisionAction\n | SkippedRevisionAction;\n\nexport interface ApplyRevisionActionResult {\n document: CanonicalDocumentEnvelope;\n store: RevisionStore;\n mapping: TransactionMapping;\n outcome: RevisionActionOutcome;\n detachedRevisionIds: string[];\n}\n\nexport function applyRevisionAction(\n options: ApplyRevisionActionOptions,\n): ApplyRevisionActionResult {\n const revision = options.store.revisions[options.revisionId];\n\n if (!revision) {\n return skippedResult(options, \"missing\", \"Revision record was not found.\");\n }\n\n if (revision.status !== \"active\") {\n return skippedResult(\n options,\n \"already-resolved\",\n `Revision is already ${revision.status}.`,\n );\n }\n\n if (revision.anchor.kind === \"detached\") {\n return skippedResult(\n options,\n \"detached-anchor\",\n \"Detached revisions remain visible but cannot be accepted or rejected.\",\n );\n }\n\n if (getRevisionActionability(revision) !== \"actionable\") {\n return skippedResult(\n options,\n \"preserve-only\",\n revision.metadata.preserveOnlyReason ??\n \"This revision kind remains preserve-only in the current runtime.\",\n );\n }\n\n if (revision.anchor.kind !== \"range\") {\n return skippedResult(\n options,\n \"structural-range\",\n \"Non-range revisions remain preserve-only in the current runtime.\",\n );\n }\n\n const story = parseTextStory(options.document.content);\n const range = normalizeRange(\n revision.anchor.range.from,\n revision.anchor.range.to,\n );\n\n if (range.to > story.size) {\n return skippedResult(\n options,\n \"invalid-range\",\n `Revision range ${range.from}-${range.to} exceeds story size ${story.size}.`,\n );\n }\n\n const paragraphMarkRange = resolveParagraphMarkDeletionRange(story, revision, options.intent);\n if (paragraphMarkRange) {\n const resultingStatus = toResultingStatus(options.intent);\n const textResult = applyTextTransaction(\n options.document,\n createSelectionSnapshot(paragraphMarkRange.from, paragraphMarkRange.to),\n {\n type: \"replace\",\n range: paragraphMarkRange,\n insertion: [],\n },\n {\n timestamp: options.timestamp,\n },\n );\n\n const nextStore = remapRevisionStore(\n setRevisionStatus(options.store, revision.revisionId, resultingStatus),\n textResult.mapping,\n );\n\n return {\n document: textResult.document,\n store: nextStore,\n mapping: textResult.mapping,\n outcome: {\n kind: \"applied\",\n revisionId: revision.revisionId,\n intent: options.intent,\n resultingStatus,\n contentChanged: true,\n },\n detachedRevisionIds: findNewDetachedRevisionIds(options.store, nextStore),\n };\n }\n if (requiresParagraphBoundaryDeletion(revision, options.intent)) {\n return skippedResult(\n options,\n \"structural-range\",\n \"Paragraph-boundary revisions need a stable paragraph break and remain blocked for this shape.\",\n );\n }\n\n const slice = story.units.slice(range.from, range.to);\n if (\n slice.some(\n (unit) =>\n unit.kind === \"paragraph_break\" || unit.kind === \"opaque_block\",\n )\n ) {\n return skippedResult(\n options,\n \"structural-range\",\n \"Paragraph-boundary and structural revisions remain preserve-only.\",\n );\n }\n\n if (\n slice.some(\n (unit) =>\n unit.kind === \"image\" || unit.kind === \"opaque_inline\",\n )\n ) {\n return skippedResult(\n options,\n \"protected-range\",\n \"Revisions touching protected inline content remain preserve-only.\",\n );\n }\n\n const resultingStatus = toResultingStatus(options.intent);\n const contentChanged = requiresContentDeletion(revision, options.intent);\n\n if (!contentChanged) {\n return {\n document: options.document,\n store: setRevisionStatus(options.store, revision.revisionId, resultingStatus),\n mapping: createEmptyMapping(),\n outcome: {\n kind: \"applied\",\n revisionId: revision.revisionId,\n intent: options.intent,\n resultingStatus,\n contentChanged: false,\n },\n detachedRevisionIds: [],\n };\n }\n\n const textResult = applyTextTransaction(\n options.document,\n createSelectionSnapshot(range.from, range.to),\n {\n type: \"replace\",\n range,\n insertion: [],\n },\n {\n timestamp: options.timestamp,\n },\n );\n\n const nextStore = remapRevisionStore(\n setRevisionStatus(options.store, revision.revisionId, resultingStatus),\n textResult.mapping,\n );\n\n return {\n document: textResult.document,\n store: nextStore,\n mapping: textResult.mapping,\n outcome: {\n kind: \"applied\",\n revisionId: revision.revisionId,\n intent: options.intent,\n resultingStatus,\n contentChanged: true,\n },\n detachedRevisionIds: findNewDetachedRevisionIds(options.store, nextStore),\n };\n}\n\nfunction skippedResult(\n options: ApplyRevisionActionOptions,\n reason: RevisionActionSkipReason,\n detail: string,\n): ApplyRevisionActionResult {\n return {\n document: options.document,\n store: options.store,\n mapping: createEmptyMapping(),\n outcome: {\n kind: \"skipped\",\n revisionId: options.revisionId,\n intent: options.intent,\n reason,\n detail,\n },\n detachedRevisionIds: [],\n };\n}\n\nfunction toResultingStatus(\n intent: RevisionActionIntent,\n): \"accepted\" | \"rejected\" {\n return intent === \"accept\" ? \"accepted\" : \"rejected\";\n}\n\nfunction requiresContentDeletion(\n revision: Pick<RevisionRecord, \"kind\">,\n intent: RevisionActionIntent,\n): boolean {\n return (\n (revision.kind === \"insertion\" && intent === \"reject\") ||\n (revision.kind === \"deletion\" && intent === \"accept\")\n );\n}\n\nfunction requiresParagraphBoundaryDeletion(\n revision: RevisionRecord,\n intent: RevisionActionIntent,\n): boolean {\n return (\n (revision.metadata.originalRevisionType === \"paragraph-del\" && intent === \"accept\") ||\n (revision.metadata.originalRevisionType === \"paragraph-ins\" && intent === \"reject\")\n );\n}\n\nfunction resolveParagraphMarkDeletionRange(\n story: ReturnType<typeof parseTextStory>,\n revision: RevisionRecord,\n intent: RevisionActionIntent,\n): { from: number; to: number } | undefined {\n const originalRevisionType = revision.metadata.originalRevisionType;\n if (\n revision.anchor.kind !== \"range\" ||\n (originalRevisionType !== \"paragraph-del\" && originalRevisionType !== \"paragraph-ins\")\n ) {\n return undefined;\n }\n\n const shouldDeleteBoundary =\n (originalRevisionType === \"paragraph-del\" && intent === \"accept\") ||\n (originalRevisionType === \"paragraph-ins\" && intent === \"reject\");\n if (!shouldDeleteBoundary) {\n return undefined;\n }\n\n const paragraphs = mapParagraphRanges(story);\n const anchorPosition = normalizeRange(\n revision.anchor.range.from,\n revision.anchor.range.to,\n ).from;\n const paragraph = paragraphs.find(\n (candidate) =>\n candidate.end === anchorPosition ||\n (anchorPosition >= candidate.start && anchorPosition <= candidate.end),\n );\n if (!paragraph) {\n return undefined;\n }\n\n if (originalRevisionType === \"paragraph-del\") {\n const boundaryIndex = paragraph.end;\n if (story.units[boundaryIndex]?.kind !== \"paragraph_break\") {\n return undefined;\n }\n\n return {\n from: boundaryIndex,\n to: boundaryIndex + 1,\n };\n }\n\n const boundaryIndex = paragraph.start - 1;\n if (boundaryIndex < 0 || story.units[boundaryIndex]?.kind !== \"paragraph_break\") {\n return undefined;\n }\n\n return {\n from: boundaryIndex,\n to: boundaryIndex + 1,\n };\n}\n\nfunction mapParagraphRanges(\n story: ReturnType<typeof parseTextStory>,\n): Array<{ start: number; end: number }> {\n const paragraphs: Array<{ start: number; end: number }> = [];\n let start = 0;\n let hasPendingParagraph = true;\n\n for (let index = 0; index < story.units.length; index += 1) {\n const unit = story.units[index];\n if (unit.kind === \"paragraph_break\") {\n paragraphs.push({ start, end: index });\n start = index + 1;\n hasPendingParagraph = true;\n continue;\n }\n\n if (unit.kind === \"opaque_block\") {\n if (hasPendingParagraph) {\n paragraphs.push({ start, end: index });\n }\n start = index + 1;\n hasPendingParagraph = Boolean(unit.nextParagraph);\n }\n }\n\n if (hasPendingParagraph) {\n paragraphs.push({ start, end: story.units.length });\n }\n return paragraphs;\n}\n\nfunction normalizeRange(from: number, to: number): { from: number; to: number } {\n return {\n from: Math.min(from, to),\n to: Math.max(from, to),\n };\n}\n\nfunction findNewDetachedRevisionIds(\n previousStore: RevisionStore,\n nextStore: RevisionStore,\n): string[] {\n const detachedRevisionIds: string[] = [];\n\n for (const [revisionId, revision] of Object.entries(nextStore.revisions)) {\n if (\n revision.status === \"detached\" &&\n previousStore.revisions[revisionId]?.status !== \"detached\"\n ) {\n detachedRevisionIds.push(revisionId);\n }\n }\n\n return detachedRevisionIds;\n}\n","import type { CanonicalDocumentEnvelope } from \"../core/state/editor-state.ts\";\nimport {\n getReviewCommandIntent,\n isSingleRevisionReviewCommand,\n type ReviewCommand,\n} from \"../core/commands/review-commands.ts\";\nimport type { TransactionMapping } from \"../core/selection/mapping.ts\";\nimport {\n applyRevisionAction,\n type RevisionActionOutcome,\n} from \"../review/store/revision-actions.ts\";\nimport { type RevisionStore } from \"../review/store/revision-store.ts\";\n\nexport interface RevisionRuntimeState {\n document: CanonicalDocumentEnvelope;\n store: RevisionStore;\n}\n\nexport interface ApplyRevisionRuntimeCommandOptions {\n state: RevisionRuntimeState;\n command: ReviewCommand;\n timestamp: string;\n}\n\nexport interface RevisionRuntimeCommandEffects {\n appliedRevisionIds: string[];\n skippedRevisions: RevisionActionOutcome[];\n detachedRevisionIds: string[];\n}\n\nexport interface RevisionRuntimeCommandResult extends RevisionRuntimeState {\n outcomes: RevisionActionOutcome[];\n mappings: Array<{ revisionId: string; mapping: TransactionMapping; steps: number }>;\n effects: RevisionRuntimeCommandEffects;\n}\n\nexport function applyRevisionRuntimeCommand(\n options: ApplyRevisionRuntimeCommandOptions,\n): RevisionRuntimeCommandResult {\n const revisionIds = isSingleRevisionReviewCommand(options.command)\n ? [options.command.revisionId]\n : listBatchRevisionIds(options.state.store);\n\n const outcomes: RevisionActionOutcome[] = [];\n const mappings: Array<{ revisionId: string; steps: number }> = [];\n const appliedRevisionIds: string[] = [];\n const detachedRevisionIds = new Set<string>();\n\n let state = options.state;\n\n for (const revisionId of revisionIds) {\n const result = applyRevisionAction({\n document: state.document,\n store: state.store,\n revisionId,\n intent: getReviewCommandIntent(options.command),\n timestamp: options.timestamp,\n });\n\n state = {\n document: result.document,\n store: result.store,\n };\n outcomes.push(result.outcome);\n mappings.push({\n revisionId,\n mapping: result.mapping,\n steps: result.mapping.steps.length,\n });\n\n if (result.outcome.kind === \"applied\") {\n appliedRevisionIds.push(revisionId);\n }\n\n for (const detachedRevisionId of result.detachedRevisionIds) {\n detachedRevisionIds.add(detachedRevisionId);\n }\n }\n\n return {\n ...state,\n outcomes,\n mappings,\n effects: {\n appliedRevisionIds,\n skippedRevisions: outcomes.filter(\n (outcome): outcome is Extract<RevisionActionOutcome, { kind: \"skipped\" }> =>\n outcome.kind === \"skipped\",\n ),\n detachedRevisionIds: [...detachedRevisionIds],\n },\n };\n}\n\nfunction listBatchRevisionIds(store: RevisionStore): string[] {\n return Object.values(store.revisions)\n .filter((revision) => revision.status === \"active\")\n .sort((left, right) => {\n const createdAtDelta = left.createdAt.localeCompare(right.createdAt);\n if (createdAtDelta !== 0) {\n return createdAtDelta;\n }\n\n return left.revisionId.localeCompare(right.revisionId);\n })\n .map((revision) => revision.revisionId);\n}\n","import {\n createSelectionSnapshot,\n type CanonicalDocumentEnvelope,\n type CommentThreadRecord,\n type EditorState,\n type EditorWarning,\n normalizeCommentThreadRecord,\n type SelectionSnapshot,\n} from \"../state/editor-state.ts\";\nimport {\n areAnchorsEqual,\n createEmptyMapping,\n mapAnchor,\n type EditorAnchorProjection,\n type MappingStep,\n type TransactionMapping,\n} from \"../selection/mapping.ts\";\nimport {\n createAcceptRevisionCommand,\n createRejectRevisionCommand,\n type ReviewCommand,\n} from \"./review-commands.ts\";\nimport {\n deleteSelectionOrBackward,\n deleteSelectionOrForward,\n insertHardBreak,\n insertTab,\n insertText,\n splitParagraph,\n} from \"./text-commands.ts\";\nimport { remapCommentThreads } from \"../../review/store/comment-remapping.ts\";\nimport { applyRevisionRuntimeCommand } from \"../../runtime/revision-runtime.ts\";\nimport type { RevisionStore } from \"../../review/store/revision-store.ts\";\n\nexport interface CommandOrigin {\n source:\n | \"keyboard\"\n | \"toolbar\"\n | \"context_menu\"\n | \"comment_panel\"\n | \"review_panel\"\n | \"api\"\n | \"runtime\";\n timestamp: string;\n}\n\nexport type EditorCommand =\n | {\n type: \"selection.set\";\n selection: SelectionSnapshot;\n origin?: CommandOrigin;\n }\n | {\n type: \"document.replace\";\n document: CanonicalDocumentEnvelope;\n mapping?: TransactionMapping;\n selection?: SelectionSnapshot;\n origin?: CommandOrigin;\n }\n | {\n type: \"text.insert\";\n text: string;\n origin?: CommandOrigin;\n }\n | {\n type: \"text.delete-backward\";\n origin?: CommandOrigin;\n }\n | {\n type: \"text.delete-forward\";\n origin?: CommandOrigin;\n }\n | {\n type: \"text.insert-tab\";\n origin?: CommandOrigin;\n }\n | {\n type: \"text.insert-hard-break\";\n origin?: CommandOrigin;\n }\n | {\n type: \"paragraph.split\";\n origin?: CommandOrigin;\n }\n | {\n type: \"runtime.set-read-only\";\n readOnly: boolean;\n origin?: CommandOrigin;\n }\n | {\n type: \"runtime.focus\";\n focused: boolean;\n origin?: CommandOrigin;\n }\n | {\n type: \"warning.add\";\n warning: EditorWarning;\n origin?: CommandOrigin;\n }\n | {\n type: \"warning.clear\";\n warningId: string;\n origin?: CommandOrigin;\n }\n | {\n type: \"comment.add\";\n comment: CommentThreadRecord;\n origin?: CommandOrigin;\n }\n | {\n type: \"comment.open\";\n commentId: string;\n origin?: CommandOrigin;\n }\n | {\n type: \"comment.resolve\";\n commentId: string;\n resolvedBy?: string;\n origin?: CommandOrigin;\n }\n | {\n type: \"comment.reopen\";\n commentId: string;\n origin?: CommandOrigin;\n }\n | {\n type: \"comment.add-reply\";\n commentId: string;\n body: string;\n authorId?: string;\n origin?: CommandOrigin;\n }\n | {\n type: \"comment.edit-body\";\n commentId: string;\n body: string;\n origin?: CommandOrigin;\n }\n | {\n type: \"change.accept\";\n changeId: string;\n origin?: CommandOrigin;\n }\n | {\n type: \"change.reject\";\n changeId: string;\n origin?: CommandOrigin;\n }\n | {\n type: \"change.accept-all\";\n origin?: CommandOrigin;\n }\n | {\n type: \"change.reject-all\";\n origin?: CommandOrigin;\n }\n | {\n type: \"history.undo\";\n origin?: CommandOrigin;\n }\n | {\n type: \"history.redo\";\n origin?: CommandOrigin;\n };\n\nexport interface TransactionEffects {\n warningsAdded: EditorWarning[];\n warningsCleared: Array<{ warningId: string; code: EditorWarning[\"code\"] }>;\n commentAdded?: { commentId: string; anchor: EditorAnchorProjection };\n commentResolved?: { commentId: string };\n commentReopened?: { commentId: string };\n commentReplyAdded?: { commentId: string };\n commentBodyEdited?: { commentId: string };\n changeAccepted?: { changeId: string };\n changeRejected?: { changeId: string };\n}\n\nexport interface EditorTransaction {\n nextState: EditorState;\n mapping: TransactionMapping;\n effects: TransactionEffects;\n historyBoundary: \"push\" | \"skip\";\n markDirty: boolean;\n}\n\nexport interface CommandExecutionContext {\n timestamp: string;\n}\n\nexport function executeEditorCommand(\n state: EditorState,\n command: Exclude<EditorCommand, { type: \"history.undo\" } | { type: \"history.redo\" }>,\n context: CommandExecutionContext,\n): EditorTransaction {\n switch (command.type) {\n case \"selection.set\":\n return createTransaction(\n {\n ...state,\n selection: normalizeSelection(command.selection),\n },\n {\n historyBoundary: \"skip\",\n markDirty: false,\n },\n );\n case \"document.replace\": {\n const mapping = command.mapping ?? createEmptyMapping();\n const selection =\n command.selection ?? remapSelection(state.selection, mapping);\n const reviewState = remapReviewStateAfterContentChange(\n state,\n command.document,\n mapping,\n );\n\n return createTransaction(\n {\n ...state,\n document: reviewState.document,\n selection,\n warnings: reviewState.warnings,\n runtime: {\n ...state.runtime,\n activeCommentId: reviewState.activeCommentId,\n },\n compatibility: {\n ...state.compatibility,\n generatedAt: context.timestamp,\n warnings: reviewState.warnings,\n featureEntries: state.compatibility.featureEntries.map((entry) =>\n entry.affectedAnchor\n ? {\n ...entry,\n affectedAnchor: mapAnchor(entry.affectedAnchor, mapping),\n }\n : entry,\n ),\n },\n },\n {\n historyBoundary: \"push\",\n markDirty: true,\n mapping,\n effects: reviewState.effects,\n },\n );\n }\n case \"text.insert\":\n return applyTextCommand(state, context.timestamp, (document, selection) =>\n insertText(document, selection, command.text, context),\n );\n case \"text.delete-backward\":\n return applyTextCommand(state, context.timestamp, (document, selection) =>\n deleteSelectionOrBackward(document, selection, context),\n );\n case \"text.delete-forward\":\n return applyTextCommand(state, context.timestamp, (document, selection) =>\n deleteSelectionOrForward(document, selection, context),\n );\n case \"text.insert-tab\":\n return applyTextCommand(state, context.timestamp, (document, selection) =>\n insertTab(document, selection, context),\n );\n case \"text.insert-hard-break\":\n return applyTextCommand(state, context.timestamp, (document, selection) =>\n insertHardBreak(document, selection, context),\n );\n case \"paragraph.split\":\n return applyTextCommand(state, context.timestamp, (document, selection) =>\n splitParagraph(document, selection, context),\n );\n case \"runtime.set-read-only\":\n return createTransaction(\n {\n ...state,\n readOnly: command.readOnly,\n },\n {\n historyBoundary: \"skip\",\n markDirty: false,\n },\n );\n case \"runtime.focus\":\n return createTransaction(\n {\n ...state,\n runtime: {\n ...state.runtime,\n hasFocus: command.focused,\n },\n },\n {\n historyBoundary: \"skip\",\n markDirty: false,\n },\n );\n case \"warning.add\": {\n if (state.warnings.some((warning) => warning.warningId === command.warning.warningId)) {\n return createTransaction(state, {\n historyBoundary: \"skip\",\n markDirty: false,\n });\n }\n\n const warnings = [...state.warnings, command.warning];\n return createTransaction(\n {\n ...state,\n warnings,\n compatibility: {\n ...state.compatibility,\n generatedAt: context.timestamp,\n warnings,\n },\n },\n {\n historyBoundary: \"skip\",\n markDirty: false,\n effects: {\n warningsAdded: [command.warning],\n },\n },\n );\n }\n case \"warning.clear\": {\n const existing = state.warnings.find((warning) => warning.warningId === command.warningId);\n\n if (!existing) {\n return createTransaction(state, {\n historyBoundary: \"skip\",\n markDirty: false,\n });\n }\n\n const warnings = state.warnings.filter((warning) => warning.warningId !== command.warningId);\n return createTransaction(\n {\n ...state,\n warnings,\n compatibility: {\n ...state.compatibility,\n generatedAt: context.timestamp,\n warnings,\n },\n },\n {\n historyBoundary: \"skip\",\n markDirty: false,\n effects: {\n warningsCleared: [\n {\n warningId: existing.warningId,\n code: existing.code,\n },\n ],\n },\n },\n );\n }\n case \"comment.add\": {\n const comments = {\n ...state.document.review.comments,\n [command.comment.commentId]: normalizeCommentThreadRecord(command.comment),\n };\n\n return createTransaction(\n {\n ...state,\n document: {\n ...state.document,\n updatedAt: context.timestamp,\n review: {\n ...state.document.review,\n comments,\n },\n },\n runtime: {\n ...state.runtime,\n activeCommentId: command.comment.commentId,\n },\n },\n {\n historyBoundary: \"push\",\n markDirty: true,\n effects: {\n commentAdded: {\n commentId: command.comment.commentId,\n anchor: command.comment.anchor,\n },\n },\n },\n );\n }\n case \"comment.open\":\n return createTransaction(\n {\n ...state,\n runtime: {\n ...state.runtime,\n activeCommentId: command.commentId,\n },\n },\n {\n historyBoundary: \"skip\",\n markDirty: false,\n },\n );\n case \"comment.resolve\": {\n const existing = state.document.review.comments[command.commentId];\n if (!existing) {\n return createTransaction(state, {\n historyBoundary: \"skip\",\n markDirty: false,\n });\n }\n\n const comments = {\n ...state.document.review.comments,\n [command.commentId]: {\n ...existing,\n status: (existing.anchor.kind === \"detached\" ? \"detached\" : \"resolved\") as \"detached\" | \"resolved\",\n resolution: {\n resolvedAt: context.timestamp,\n resolvedBy:\n command.resolvedBy ??\n existing.createdBy ??\n existing.authorId ??\n existing.entries?.[0]?.authorId ??\n \"unknown\",\n },\n isResolved: true,\n resolvedAt: context.timestamp,\n },\n };\n\n return createTransaction(\n {\n ...state,\n document: {\n ...state.document,\n updatedAt: context.timestamp,\n review: {\n ...state.document.review,\n comments,\n },\n },\n },\n {\n historyBoundary: \"push\",\n markDirty: true,\n effects: {\n commentResolved: {\n commentId: command.commentId,\n },\n },\n },\n );\n }\n case \"comment.reopen\": {\n const existingThread = state.document.review.comments[command.commentId];\n if (!existingThread || existingThread.status === \"detached\") {\n return createTransaction(state, { historyBoundary: \"skip\", markDirty: false });\n }\n const reopenedComments = {\n ...state.document.review.comments,\n [command.commentId]: {\n ...existingThread,\n status: \"open\" as const,\n isResolved: false,\n resolvedAt: undefined,\n resolution: undefined,\n },\n };\n return createTransaction(\n {\n ...state,\n document: {\n ...state.document,\n updatedAt: context.timestamp,\n review: { ...state.document.review, comments: reopenedComments },\n },\n runtime: { ...state.runtime, activeCommentId: command.commentId },\n },\n {\n historyBoundary: \"push\",\n markDirty: true,\n effects: { commentReopened: { commentId: command.commentId } },\n },\n );\n }\n case \"comment.add-reply\": {\n const threadForReply = state.document.review.comments[command.commentId];\n if (!threadForReply) {\n return createTransaction(state, { historyBoundary: \"skip\", markDirty: false });\n }\n // Block reply on resolved or detached threads (must reopen first)\n if (threadForReply.status === \"resolved\" || threadForReply.status === \"detached\") {\n return createTransaction(state, { historyBoundary: \"skip\", markDirty: false });\n }\n const entryId = `${command.commentId}-entry-${(threadForReply.entries?.length ?? 0) + 1}`;\n const newEntry = {\n entryId,\n authorId: command.authorId ?? threadForReply.createdBy ?? \"unknown\",\n body: command.body,\n createdAt: context.timestamp,\n };\n const updatedThread = {\n ...threadForReply,\n entries: [...(threadForReply.entries ?? []), newEntry],\n };\n const replyComments = {\n ...state.document.review.comments,\n [command.commentId]: updatedThread,\n };\n return createTransaction(\n {\n ...state,\n document: {\n ...state.document,\n updatedAt: context.timestamp,\n review: { ...state.document.review, comments: replyComments },\n },\n },\n {\n historyBoundary: \"push\",\n markDirty: true,\n effects: { commentReplyAdded: { commentId: command.commentId } },\n },\n );\n }\n case \"comment.edit-body\": {\n const threadToEdit = state.document.review.comments[command.commentId];\n if (!threadToEdit || !threadToEdit.entries?.length) {\n return createTransaction(state, { historyBoundary: \"skip\", markDirty: false });\n }\n const editedEntries = [...threadToEdit.entries];\n editedEntries[0] = { ...editedEntries[0], body: command.body };\n const editedThread = { ...threadToEdit, entries: editedEntries };\n const editedComments = {\n ...state.document.review.comments,\n [command.commentId]: editedThread,\n };\n return createTransaction(\n {\n ...state,\n document: {\n ...state.document,\n updatedAt: context.timestamp,\n review: { ...state.document.review, comments: editedComments },\n },\n },\n {\n historyBoundary: \"push\",\n markDirty: true,\n effects: { commentBodyEdited: { commentId: command.commentId } },\n },\n );\n }\n case \"change.accept\":\n return applyReviewCommand(\n state,\n createAcceptRevisionCommand(command.changeId, command.origin),\n context.timestamp,\n );\n case \"change.reject\":\n return applyReviewCommand(\n state,\n createRejectRevisionCommand(command.changeId, command.origin),\n context.timestamp,\n );\n case \"change.accept-all\":\n return applyReviewCommand(\n state,\n {\n type: \"review.accept-all-revisions\",\n ...(command.origin ? { origin: command.origin } : {}),\n },\n context.timestamp,\n );\n case \"change.reject-all\":\n return applyReviewCommand(\n state,\n {\n type: \"review.reject-all-revisions\",\n ...(command.origin ? { origin: command.origin } : {}),\n },\n context.timestamp,\n );\n }\n}\n\nexport function remapSelection(\n selection: SelectionSnapshot,\n mapping: TransactionMapping,\n): SelectionSnapshot {\n const activeRange = mapAnchor(selection.activeRange, mapping);\n\n if (activeRange.kind === \"range\") {\n return {\n anchor: activeRange.range.from,\n head: activeRange.range.to,\n isCollapsed: activeRange.range.from === activeRange.range.to,\n activeRange,\n };\n }\n\n if (activeRange.kind === \"node\") {\n return createSelectionSnapshot(activeRange.at, activeRange.at);\n }\n\n return {\n anchor: selection.anchor,\n head: selection.head,\n isCollapsed: selection.anchor === selection.head,\n activeRange,\n };\n}\n\nexport function selectionChanged(\n left: SelectionSnapshot,\n right: SelectionSnapshot,\n): boolean {\n return (\n left.anchor !== right.anchor ||\n left.head !== right.head ||\n left.isCollapsed !== right.isCollapsed ||\n !areAnchorsEqual(left.activeRange, right.activeRange)\n );\n}\n\nfunction createTransaction(\n nextState: EditorState,\n options: {\n mapping?: TransactionMapping;\n historyBoundary: \"push\" | \"skip\";\n markDirty: boolean;\n effects?: Partial<TransactionEffects>;\n },\n): EditorTransaction {\n return {\n nextState,\n mapping: options.mapping ?? createEmptyMapping(),\n historyBoundary: options.historyBoundary,\n markDirty: options.markDirty,\n effects: {\n warningsAdded: options.effects?.warningsAdded ?? [],\n warningsCleared: options.effects?.warningsCleared ?? [],\n commentAdded: options.effects?.commentAdded,\n commentResolved: options.effects?.commentResolved,\n changeAccepted: options.effects?.changeAccepted,\n changeRejected: options.effects?.changeRejected,\n },\n };\n}\n\nfunction normalizeSelection(selection: SelectionSnapshot): SelectionSnapshot {\n if (selection.activeRange.kind === \"range\") {\n return {\n ...selection,\n anchor: selection.activeRange.range.from,\n head: selection.activeRange.range.to,\n isCollapsed: selection.activeRange.range.from === selection.activeRange.range.to,\n };\n }\n\n if (selection.activeRange.kind === \"node\") {\n return createSelectionSnapshot(selection.activeRange.at, selection.activeRange.at);\n }\n\n return selection;\n}\n\nfunction applyTextCommand(\n state: EditorState,\n timestamp: string,\n apply: (\n document: CanonicalDocumentEnvelope,\n selection: SelectionSnapshot,\n ) => {\n document: CanonicalDocumentEnvelope;\n selection: SelectionSnapshot;\n mapping: TransactionMapping;\n },\n): EditorTransaction {\n if (state.readOnly) {\n return createTransaction(state, {\n historyBoundary: \"skip\",\n markDirty: false,\n });\n }\n\n const result = apply(state.document, state.selection);\n const reviewState = remapReviewStateAfterContentChange(\n state,\n result.document,\n result.mapping,\n );\n\n return createTransaction(\n {\n ...state,\n document: reviewState.document,\n selection: result.selection,\n warnings: reviewState.warnings,\n runtime: {\n ...state.runtime,\n activeCommentId: reviewState.activeCommentId,\n },\n },\n {\n historyBoundary: \"push\",\n markDirty: true,\n mapping: result.mapping,\n effects: reviewState.effects,\n },\n );\n}\n\nfunction applyReviewCommand(\n state: EditorState,\n command: ReviewCommand,\n timestamp: string,\n): EditorTransaction {\n if (state.readOnly) {\n return createTransaction(state, {\n historyBoundary: \"skip\",\n markDirty: false,\n });\n }\n\n const result = applyRevisionRuntimeCommand({\n state: {\n document: state.document,\n store: createRevisionStoreFromState(state),\n },\n command,\n timestamp,\n });\n const hasAppliedOutcome = result.outcomes.some((outcome) => outcome.kind === \"applied\");\n\n if (!hasAppliedOutcome) {\n return createTransaction(state, {\n historyBoundary: \"skip\",\n markDirty: false,\n });\n }\n\n let selection = state.selection;\n let comments = result.document.review.comments;\n let warnings = state.warnings;\n let activeCommentId = state.runtime.activeCommentId;\n const mappingSteps: MappingStep[] = [];\n\n for (const entry of result.mappings) {\n if (entry.steps === 0) {\n continue;\n }\n\n selection = remapSelection(selection, entry.mapping);\n mappingSteps.push(...entry.mapping.steps);\n\n const remappedComments = remapCommentThreads({\n comments,\n mapping: entry.mapping,\n nextContent: result.document.content,\n existingWarnings: mapWarningsThroughMapping(warnings, entry.mapping),\n });\n comments = remappedComments.comments;\n warnings = remappedComments.warnings;\n activeCommentId =\n activeCommentId && comments[activeCommentId]\n ? activeCommentId\n : undefined;\n }\n\n warnings = mergeDetachedRevisionWarnings(result.store, warnings);\n\n const nextDocument = {\n ...result.document,\n review: {\n ...result.document.review,\n comments,\n revisions: toEditorRevisionRecords(result.store),\n },\n };\n const appliedRevisionIds = result.effects.appliedRevisionIds;\n\n return createTransaction(\n {\n ...state,\n document: nextDocument,\n selection,\n warnings,\n runtime: {\n ...state.runtime,\n activeCommentId,\n },\n },\n {\n historyBoundary: \"push\",\n markDirty: true,\n mapping: combineMappingSteps(mappingSteps),\n effects: {\n ...buildWarningEffects(state.warnings, warnings),\n changeAccepted:\n command.type === \"review.accept-revision\" && appliedRevisionIds[0]\n ? {\n changeId: appliedRevisionIds[0],\n }\n : undefined,\n changeRejected:\n command.type === \"review.reject-revision\" && appliedRevisionIds[0]\n ? {\n changeId: appliedRevisionIds[0],\n }\n : undefined,\n },\n },\n );\n}\n\nfunction remapReviewStateAfterContentChange(\n state: EditorState,\n nextDocument: CanonicalDocumentEnvelope,\n mapping: TransactionMapping,\n): {\n document: CanonicalDocumentEnvelope;\n warnings: EditorWarning[];\n activeCommentId?: string;\n effects: Pick<TransactionEffects, \"warningsAdded\" | \"warningsCleared\">;\n} {\n const mappedWarnings = mapWarningsThroughMapping(state.warnings, mapping);\n const remappedComments = remapCommentThreads({\n comments: nextDocument.review.comments,\n mapping,\n nextContent: nextDocument.content,\n existingWarnings: mappedWarnings,\n });\n const revisions = Object.fromEntries(\n Object.entries(nextDocument.review.revisions).map(([changeId, revision]) => [\n changeId,\n {\n ...revision,\n anchor: mapAnchor(revision.anchor, mapping),\n },\n ]),\n );\n const activeCommentId =\n state.runtime.activeCommentId &&\n remappedComments.comments[state.runtime.activeCommentId]\n ? state.runtime.activeCommentId\n : undefined;\n const warnings = remappedComments.warnings;\n\n return {\n document: {\n ...nextDocument,\n review: {\n ...nextDocument.review,\n comments: remappedComments.comments,\n revisions,\n },\n },\n warnings,\n activeCommentId,\n effects: buildWarningEffects(state.warnings, warnings),\n };\n}\n\nfunction createRevisionStoreFromState(\n state: Pick<EditorState, \"document\">,\n): RevisionStore {\n return {\n version: \"revision-store/1\",\n revisions: Object.fromEntries(\n Object.values(state.document.review.revisions).map((revision) => [\n revision.changeId,\n {\n revisionId: revision.changeId,\n kind: revision.kind,\n anchor: revision.anchor,\n authorId: revision.authorId ?? \"unknown\",\n createdAt: revision.createdAt,\n status: revision.status === \"open\" ? \"active\" : revision.status,\n warningIds: [...(revision.warningIds ?? [])],\n metadata: {\n source: revision.metadata?.source ?? \"runtime\",\n preserveOnlyReason: revision.metadata?.preserveOnlyReason,\n importedRevisionForm: revision.metadata?.importedRevisionForm,\n originalRevisionType: revision.metadata?.originalRevisionType,\n ooxmlRevisionId: revision.metadata?.ooxmlRevisionId,\n },\n },\n ]),\n ),\n };\n}\n\nfunction toEditorRevisionRecords(\n store: RevisionStore,\n): EditorState[\"document\"][\"review\"][\"revisions\"] {\n return Object.fromEntries(\n Object.values(store.revisions).map((revision) => [\n revision.revisionId,\n {\n changeId: revision.revisionId,\n kind: revision.kind,\n anchor: revision.anchor,\n authorId: revision.authorId,\n createdAt: revision.createdAt,\n warningIds: [...revision.warningIds],\n metadata: {\n source: revision.metadata.source,\n preserveOnlyReason: revision.metadata.preserveOnlyReason,\n importedRevisionForm: revision.metadata.importedRevisionForm,\n originalRevisionType: revision.metadata.originalRevisionType,\n ooxmlRevisionId: revision.metadata.ooxmlRevisionId,\n },\n status: revision.status === \"active\" ? \"open\" : revision.status,\n },\n ]),\n );\n}\n\nfunction mapWarningsThroughMapping(\n warnings: EditorWarning[],\n mapping: TransactionMapping,\n): EditorWarning[] {\n return warnings.map((warning) =>\n warning.affectedAnchor\n ? {\n ...warning,\n affectedAnchor: mapAnchor(warning.affectedAnchor, mapping),\n }\n : warning,\n );\n}\n\nfunction buildWarningEffects(\n previousWarnings: EditorWarning[],\n nextWarnings: EditorWarning[],\n): Pick<TransactionEffects, \"warningsAdded\" | \"warningsCleared\"> {\n const previousById = new Set(previousWarnings.map((warning) => warning.warningId));\n const nextById = new Set(nextWarnings.map((warning) => warning.warningId));\n\n return {\n warningsAdded: nextWarnings.filter((warning) => !previousById.has(warning.warningId)),\n warningsCleared: previousWarnings\n .filter((warning) => !nextById.has(warning.warningId))\n .map((warning) => ({\n warningId: warning.warningId,\n code: warning.code,\n })),\n };\n}\n\nfunction mergeDetachedRevisionWarnings(\n store: RevisionStore,\n existingWarnings: EditorWarning[],\n): EditorWarning[] {\n const retainedWarnings = existingWarnings.filter(\n (warning) =>\n warning.code !== \"revision_anchor_detached\" ||\n !warning.details ||\n typeof warning.details.changeId !== \"string\" ||\n store.revisions[warning.details.changeId]?.status === \"detached\",\n );\n\n const knownDetachedIds = new Set(\n retainedWarnings\n .filter((warning) => warning.code === \"revision_anchor_detached\")\n .map((warning) =>\n typeof warning.details?.changeId === \"string\"\n ? warning.details.changeId\n : undefined,\n )\n .filter((value): value is string => Boolean(value)),\n );\n\n const detachedWarnings = Object.values(store.revisions)\n .filter(\n (revision) =>\n revision.status === \"detached\" && !knownDetachedIds.has(revision.revisionId),\n )\n .map((revision) => ({\n warningId: `warning:revision-anchor-detached:${revision.revisionId}`,\n code: \"revision_anchor_detached\" as const,\n severity: \"warning\" as const,\n message: `Revision ${revision.revisionId} detached after review remapping.`,\n source: \"review\" as const,\n affectedAnchor: revision.anchor.kind === \"detached\" ? revision.anchor : undefined,\n details: {\n changeId: revision.revisionId,\n reason:\n revision.anchor.kind === \"detached\"\n ? revision.anchor.reason\n : undefined,\n },\n }));\n\n return [...retainedWarnings, ...detachedWarnings];\n}\n\nfunction combineMappingSteps(\n steps: MappingStep[],\n): TransactionMapping {\n return steps.length > 0\n ? {\n steps,\n }\n : createEmptyMapping();\n}\n","import {\n createNodeAnchor,\n createRangeAnchor,\n mapAnchor,\n normalizeRange,\n type Assoc,\n type BoundaryAssoc,\n type DocRange,\n type EditorAnchorProjection,\n type TransactionMapping,\n} from \"../../core/selection/mapping.ts\";\n\nexport type CommentAnchor = EditorAnchorProjection;\nexport type CommentAnchorState = \"active\" | \"detached\";\n\nexport interface CommentAnchorSummary {\n anchor: CommentAnchor;\n state: CommentAnchorState;\n range: DocRange;\n}\n\nexport function createCommentRangeAnchor(\n from: number,\n to = from,\n assoc?: BoundaryAssoc,\n): CommentAnchor {\n return createRangeAnchor(from, to, assoc);\n}\n\nexport function createCommentNodeAnchor(at: number, assoc?: Assoc): CommentAnchor {\n return createNodeAnchor(at, assoc);\n}\n\nexport function remapCommentAnchor(\n anchor: CommentAnchor,\n mapping: TransactionMapping,\n): CommentAnchor {\n return mapAnchor(anchor, mapping);\n}\n\nexport function isDetachedCommentAnchor(anchor: CommentAnchor): boolean {\n return anchor.kind === \"detached\";\n}\n\nexport function summarizeCommentAnchor(anchor: CommentAnchor): CommentAnchorSummary {\n if (anchor.kind === \"range\") {\n return {\n anchor,\n state: \"active\",\n range: normalizeRange(anchor.range),\n };\n }\n\n if (anchor.kind === \"node\") {\n return {\n anchor,\n state: \"active\",\n range: {\n from: anchor.at,\n to: anchor.at,\n },\n };\n }\n\n return {\n anchor,\n state: \"detached\",\n range: normalizeRange(anchor.lastKnownRange),\n };\n}\n","import type { TransactionMapping } from \"../../core/selection/mapping.ts\";\nimport {\n isDetachedCommentAnchor,\n remapCommentAnchor,\n summarizeCommentAnchor,\n type CommentAnchor,\n} from \"./comment-anchors.ts\";\n\nexport interface CommentEntry {\n entryId: string;\n authorId: string;\n body: string;\n createdAt: string;\n metadata?: CommentEntryMetadata;\n}\n\nexport interface CommentEntryMetadata {\n ooxmlCommentId?: string;\n paraId?: string;\n parentParaId?: string;\n durableId?: string;\n initials?: string;\n}\n\nexport interface CommentResolution {\n resolvedAt: string;\n resolvedBy: string;\n}\n\nexport type CommentThreadStatus = \"open\" | \"resolved\" | \"detached\";\n\nexport interface CommentThread {\n commentId: string;\n anchor: CommentAnchor;\n status: CommentThreadStatus;\n entries: CommentEntry[];\n createdBy: string;\n createdAt: string;\n resolution?: CommentResolution;\n warningIds: string[];\n metadata?: CommentThreadMetadata;\n}\n\nexport interface CommentThreadMetadata {\n source?: \"runtime\" | \"import\";\n rootOoxmlCommentId?: string;\n rootParaId?: string;\n}\n\nexport interface CommentStore {\n version: \"comment-store/1\";\n threads: Record<string, CommentThread>;\n}\n\nexport interface CreateCommentThreadParams {\n commentId: string;\n anchor: CommentAnchor;\n createdBy: string;\n createdAt: string;\n body: string;\n entryId?: string;\n warningIds?: string[];\n}\n\nexport interface AppendCommentEntryParams {\n commentId: string;\n entry: CommentEntry;\n}\n\nexport interface ResolveCommentThreadParams {\n commentId: string;\n resolvedAt: string;\n resolvedBy: string;\n}\n\nexport interface CommentSidebarThread {\n commentId: string;\n status: CommentThreadStatus;\n excerpt: string;\n entryCount: number;\n createdAt: string;\n createdBy: string;\n warningCount: number;\n anchorLabel: string;\n isActive: boolean;\n resolvedAt?: string;\n resolvedBy?: string;\n}\n\nexport interface CommentSidebarProjection {\n totalCount: number;\n openCommentIds: string[];\n resolvedCommentIds: string[];\n detachedCommentIds: string[];\n threads: CommentSidebarThread[];\n}\n\nexport function createCommentStore(\n threads: Record<string, CommentThread> = {},\n): CommentStore {\n return {\n version: \"comment-store/1\",\n threads,\n };\n}\n\nexport function createCommentThread(\n params: CreateCommentThreadParams,\n): CommentThread {\n return {\n commentId: params.commentId,\n anchor: params.anchor,\n status: isDetachedCommentAnchor(params.anchor) ? \"detached\" : \"open\",\n entries: [\n {\n entryId: params.entryId ?? `${params.commentId}-entry-1`,\n authorId: params.createdBy,\n body: params.body,\n createdAt: params.createdAt,\n },\n ],\n createdBy: params.createdBy,\n createdAt: params.createdAt,\n warningIds: [...(params.warningIds ?? [])],\n };\n}\n\nexport function upsertCommentThread(\n store: CommentStore,\n thread: CommentThread,\n): CommentStore {\n return {\n ...store,\n threads: {\n ...store.threads,\n [thread.commentId]: normalizeThread(thread),\n },\n };\n}\n\nexport function appendCommentEntry(\n store: CommentStore,\n params: AppendCommentEntryParams,\n): CommentStore {\n const existing = store.threads[params.commentId];\n if (!existing) {\n return store;\n }\n\n return upsertCommentThread(store, {\n ...existing,\n entries: [...existing.entries, params.entry],\n });\n}\n\nexport function resolveCommentThread(\n store: CommentStore,\n params: ResolveCommentThreadParams,\n): CommentStore {\n const existing = store.threads[params.commentId];\n if (!existing) {\n return store;\n }\n\n return upsertCommentThread(store, {\n ...existing,\n status: existing.status === \"detached\" ? \"detached\" : \"resolved\",\n resolution: {\n resolvedAt: params.resolvedAt,\n resolvedBy: params.resolvedBy,\n },\n });\n}\n\nexport function reopenCommentThread(\n store: CommentStore,\n commentId: string,\n): CommentStore {\n const existing = store.threads[commentId];\n if (!existing) {\n return store;\n }\n\n return upsertCommentThread(store, {\n ...existing,\n status: isDetachedCommentAnchor(existing.anchor) ? \"detached\" : \"open\",\n resolution: undefined,\n });\n}\n\nexport function setCommentThreadWarnings(\n store: CommentStore,\n commentId: string,\n warningIds: string[],\n): CommentStore {\n const existing = store.threads[commentId];\n if (!existing) {\n return store;\n }\n\n return upsertCommentThread(store, {\n ...existing,\n warningIds: [...warningIds],\n });\n}\n\nexport function remapCommentStore(\n store: CommentStore,\n mapping: TransactionMapping,\n): CommentStore {\n return createCommentStore(\n Object.fromEntries(\n Object.entries(store.threads).map(([commentId, thread]) => {\n const anchor = remapCommentAnchor(thread.anchor, mapping);\n const nextStatus =\n anchor.kind === \"detached\"\n ? \"detached\"\n : thread.status === \"resolved\"\n ? \"resolved\"\n : \"open\";\n\n return [\n commentId,\n normalizeThread({\n ...thread,\n anchor,\n status: nextStatus,\n }),\n ];\n }),\n ),\n );\n}\n\nexport function createCommentSidebarProjection(\n store: CommentStore,\n activeCommentId?: string,\n): CommentSidebarProjection {\n const threads = Object.values(store.threads)\n .map((thread) => toSidebarThread(thread, activeCommentId))\n .sort(compareSidebarThreads);\n\n return {\n totalCount: threads.length,\n openCommentIds: threads\n .filter((thread) => thread.status === \"open\")\n .map((thread) => thread.commentId),\n resolvedCommentIds: threads\n .filter((thread) => thread.status === \"resolved\")\n .map((thread) => thread.commentId),\n detachedCommentIds: threads\n .filter((thread) => thread.status === \"detached\")\n .map((thread) => thread.commentId),\n threads,\n };\n}\n\nfunction toSidebarThread(\n thread: CommentThread,\n activeCommentId?: string,\n): CommentSidebarThread {\n const firstEntry = thread.entries[0];\n const anchorSummary = summarizeCommentAnchor(thread.anchor);\n\n return {\n commentId: thread.commentId,\n status: thread.status,\n excerpt: firstEntry ? summarizeBody(firstEntry.body) : \"Empty thread\",\n entryCount: thread.entries.length,\n createdAt: thread.createdAt,\n createdBy: thread.createdBy,\n warningCount: thread.warningIds.length,\n anchorLabel:\n anchorSummary.state === \"detached\"\n ? `Detached ${anchorSummary.range.from}-${anchorSummary.range.to}`\n : `Range ${anchorSummary.range.from}-${anchorSummary.range.to}`,\n isActive: activeCommentId === thread.commentId,\n resolvedAt: thread.resolution?.resolvedAt,\n resolvedBy: thread.resolution?.resolvedBy,\n };\n}\n\nfunction normalizeThread(thread: CommentThread): CommentThread {\n if (isDetachedCommentAnchor(thread.anchor)) {\n return {\n ...thread,\n status: \"detached\",\n };\n }\n\n if (thread.status === \"detached\") {\n return {\n ...thread,\n status: thread.resolution ? \"resolved\" : \"open\",\n };\n }\n\n return thread;\n}\n\nfunction compareSidebarThreads(\n left: CommentSidebarThread,\n right: CommentSidebarThread,\n): number {\n const statusDelta = priorityForStatus(left.status) - priorityForStatus(right.status);\n if (statusDelta !== 0) {\n return statusDelta;\n }\n\n return left.createdAt.localeCompare(right.createdAt);\n}\n\nfunction priorityForStatus(status: CommentThreadStatus): number {\n switch (status) {\n case \"open\":\n return 0;\n case \"detached\":\n return 1;\n case \"resolved\":\n return 2;\n }\n}\n\nfunction summarizeBody(body: string): string {\n const collapsed = body.replace(/\\s+/g, \" \").trim();\n if (!collapsed) {\n return \"Empty thread\";\n }\n\n return collapsed.length > 80 ? `${collapsed.slice(0, 77)}...` : collapsed;\n}\n","import {\n normalizeCommentThreadRecord,\n type CommentThreadRecord,\n} from \"../../core/state/editor-state.ts\";\nimport {\n createCommentStore,\n type CommentStore,\n type CommentThread,\n} from \"./comment-store.ts\";\n\nexport function createCommentStoreFromRuntimeComments(\n comments: Record<string, CommentThreadRecord>,\n): CommentStore {\n const threads = Object.fromEntries(\n Object.values(comments).map((comment) => [\n comment.commentId,\n toCommentThread(comment),\n ]),\n );\n\n return createCommentStore(threads);\n}\n\nfunction toCommentThread(comment: CommentThreadRecord): CommentThread {\n const normalized = normalizeCommentThreadRecord(comment);\n\n return {\n commentId: normalized.commentId,\n anchor: normalized.anchor,\n status:\n normalized.anchor.kind === \"detached\"\n ? \"detached\"\n : normalized.status === \"resolved\"\n ? \"resolved\"\n : \"open\",\n entries: normalized.entries ?? [],\n createdBy: normalized.createdBy ?? normalized.authorId ?? \"unknown\",\n createdAt: normalized.createdAt,\n resolution: normalized.resolution,\n warningIds: [...(normalized.warningIds ?? [])],\n metadata: normalized.metadata,\n };\n}\n","import type {\n DocRange,\n OpaqueFragmentRecord,\n PreservationStore,\n PreservedPackagePart,\n} from \"../model/canonical-document.ts\";\n\nexport interface OpaqueFragmentDescriptor {\n featureKey:\n | \"sections\"\n | \"tables\"\n | \"headers-footers\"\n | \"fields\"\n | \"content-controls\"\n | \"custom-xml\"\n | \"alt-chunk\"\n | \"embedded-objects\"\n | \"alternate-content\"\n | \"unknown-ooxml\";\n label: string;\n detail: string;\n}\n\nexport function createPreservationStore(\n seed?: Partial<PreservationStore>,\n): PreservationStore {\n return {\n opaqueFragments: { ...(seed?.opaqueFragments ?? {}) },\n packageParts: { ...(seed?.packageParts ?? {}) },\n };\n}\n\nexport function getOpaqueFragment(\n store: PreservationStore,\n fragmentId: string,\n): OpaqueFragmentRecord | undefined {\n return normalizeOpaqueFragmentMap(store)[fragmentId];\n}\n\nexport function listOpaqueFragments(\n store: PreservationStore,\n): OpaqueFragmentRecord[] {\n return Object.values(normalizeOpaqueFragmentMap(store)).sort((left, right) => {\n return (\n left.lastKnownRange.from - right.lastKnownRange.from ||\n left.fragmentId.localeCompare(right.fragmentId)\n );\n });\n}\n\nexport function listPreservedPackageParts(\n store: PreservationStore,\n): PreservedPackagePart[] {\n return Object.values(normalizePackagePartMap(store)).sort((left, right) =>\n left.packagePartName.localeCompare(right.packagePartName),\n );\n}\n\nexport function findOpaqueFragmentsIntersectingRange(\n store: PreservationStore,\n range: DocRange,\n): OpaqueFragmentRecord[] {\n return listOpaqueFragments(store).filter((fragment) =>\n rangesIntersect(fragment.lastKnownRange, range),\n );\n}\n\nexport function describeOpaqueFragment(\n fragment: OpaqueFragmentRecord,\n): OpaqueFragmentDescriptor {\n const xml = fragment.payloadReference;\n const detail = createDetail(fragment);\n\n if (/\\b(?:w:)?sectPr\\b/u.test(xml)) {\n return {\n featureKey: \"sections\",\n label: \"Section properties\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?tbl\\b/u.test(xml)) {\n return {\n featureKey: \"tables\",\n label: \"Preserved table structure\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?hdr\\b|\\b(?:w:)?ftr\\b/u.test(xml)) {\n return {\n featureKey: \"headers-footers\",\n label: \"Header or footer content\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?fldSimple\\b|\\b(?:w:)?fldChar\\b|\\b(?:w:)?instrText\\b/u.test(xml)) {\n return {\n featureKey: \"fields\",\n label: \"Word field content\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?sdt\\b/u.test(xml)) {\n return {\n featureKey: \"content-controls\",\n label: \"Content control\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?customXml\\b/u.test(xml)) {\n return {\n featureKey: \"custom-xml\",\n label: \"Custom XML wrapper\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?altChunk\\b/u.test(xml)) {\n return {\n featureKey: \"alt-chunk\",\n label: \"Alternate content import\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?object\\b|\\b(?:o:)?OLEObject\\b/u.test(xml)) {\n return {\n featureKey: \"embedded-objects\",\n label: \"Embedded object\",\n detail,\n };\n }\n\n if (/\\b(?:mc:)?AlternateContent\\b/u.test(xml)) {\n return {\n featureKey: \"alternate-content\",\n label: \"Markup compatibility block\",\n detail,\n };\n }\n\n return {\n featureKey: \"unknown-ooxml\",\n label: \"Unsupported OOXML fragment\",\n detail,\n };\n}\n\nfunction createDetail(fragment: OpaqueFragmentRecord): string {\n const detail = [\n `Preserved whole-unit from ${fragment.lastKnownRange.from}-${fragment.lastKnownRange.to}.`,\n fragment.packagePartName ? `Part ${fragment.packagePartName}.` : null,\n fragment.relationshipId ? `Relationship ${fragment.relationshipId}.` : null,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return detail.length > 0\n ? detail\n : \"Preserved whole-unit to keep unsupported OOXML intact.\";\n}\n\nfunction rangesIntersect(left: DocRange, right: DocRange): boolean {\n return left.from < right.to && right.from < left.to;\n}\n\nfunction normalizeOpaqueFragmentMap(\n store: PreservationStore,\n): Record<string, OpaqueFragmentRecord> {\n return store && typeof store === \"object\" && store.opaqueFragments && typeof store.opaqueFragments === \"object\"\n ? (store.opaqueFragments as Record<string, OpaqueFragmentRecord>)\n : {};\n}\n\nfunction normalizePackagePartMap(\n store: PreservationStore,\n): Record<string, PreservedPackagePart> {\n return store && typeof store === \"object\" && store.packageParts && typeof store.packageParts === \"object\"\n ? (store.packageParts as Record<string, PreservedPackagePart>)\n : {};\n}\n","import { createRangeAnchor } from \"../core/selection/mapping.ts\";\nimport type {\n CanonicalDocumentEnvelope,\n CompatibilityFeatureEntry,\n CompatibilityReport,\n EditorError,\n EditorWarning,\n} from \"../core/state/editor-state.ts\";\nimport type {\n DocumentRootNode,\n InlineNode,\n ParagraphNode,\n} from \"../model/canonical-document.ts\";\nimport {\n describeOpaqueFragment,\n listOpaqueFragments,\n listPreservedPackageParts,\n} from \"../preservation/store.ts\";\n\nexport interface BuildCompatibilityReportInput {\n document: CanonicalDocumentEnvelope;\n warnings?: readonly EditorWarning[];\n fatalError?: EditorError;\n generatedAt: string;\n}\n\nexport function buildCompatibilityReport(\n input: BuildCompatibilityReportInput,\n): CompatibilityReport {\n const content = normalizeDocumentRoot(input.document.content);\n const contentFeatures = collectContentFeatures(content);\n if (hasSupportedRuntimeComments(input.document.review.comments)) {\n contentFeatures.push(\n supportedEntry(\n \"comments-single-paragraph\",\n \"Single-paragraph review comments stay mappable through runtime selections.\",\n ),\n );\n }\n const featureEntries: CompatibilityFeatureEntry[] = [\n ...contentFeatures,\n ...collectPreservationFeatures(input.document),\n ];\n const warnings = dedupeWarnings([\n ...(input.warnings ?? []),\n ...collectDiagnosticWarnings(input.document),\n ]);\n const errors = dedupeErrors([\n ...collectDiagnosticErrors(input.document),\n ...(input.fatalError ? [input.fatalError] : []),\n ]);\n\n return {\n reportVersion: \"compatibility-report/1\",\n generatedAt: input.generatedAt,\n blockExport:\n featureEntries.some((entry) => entry.featureClass === \"unsupported-fatal\") ||\n errors.some((error) => error.isFatal),\n featureEntries,\n warnings,\n errors,\n };\n}\n\nfunction hasSupportedRuntimeComments(\n comments: CanonicalDocumentEnvelope[\"review\"][\"comments\"],\n): boolean {\n return Object.values(comments).some((comment) => comment.anchor.kind !== \"detached\");\n}\n\nfunction normalizeDocumentRoot(content: unknown): DocumentRootNode {\n if (content && typeof content === \"object\" && (content as { type?: string }).type === \"doc\") {\n return content as DocumentRootNode;\n }\n\n if (Array.isArray(content)) {\n return {\n type: \"doc\",\n children: content.filter(\n (value): value is DocumentRootNode[\"children\"][number] =>\n Boolean(value) &&\n typeof value === \"object\" &&\n ((value as { type?: string }).type === \"paragraph\" ||\n (value as { type?: string }).type === \"opaque_block\"),\n ),\n };\n }\n\n return {\n type: \"doc\",\n children: [{ type: \"paragraph\", children: [] }],\n };\n}\n\nfunction collectContentFeatures(\n content: DocumentRootNode,\n): CompatibilityFeatureEntry[] {\n const flags = {\n paragraphs: false,\n runs: false,\n whitespace: false,\n headings: false,\n lists: false,\n hyperlinks: false,\n images: false,\n };\n\n for (let index = 0; index < content.children.length; index += 1) {\n const block = content.children[index];\n if (block.type !== \"paragraph\") {\n continue;\n }\n\n flags.paragraphs = true;\n if (block.styleId?.toLowerCase().startsWith(\"heading\")) {\n flags.headings = true;\n }\n if (block.numbering) {\n flags.lists = true;\n }\n\n measureParagraph(block, flags);\n }\n\n const entries: CompatibilityFeatureEntry[] = [];\n if (flags.paragraphs) {\n entries.push(supportedEntry(\"paragraphs\", \"Paragraph structure is editable and round-trippable.\"));\n }\n if (flags.runs) {\n entries.push(supportedEntry(\"runs\", \"Runs and inline text are editable through runtime commands.\"));\n }\n if (flags.whitespace) {\n entries.push(supportedEntry(\"whitespace\", \"Whitespace-sensitive text units stay explicit in the runtime model.\"));\n }\n if (flags.headings) {\n entries.push(supportedEntry(\"headings\", \"Heading styles remain attached to paragraph structure.\"));\n }\n if (flags.lists) {\n entries.push(supportedEntry(\"lists\", \"Numbering metadata stays attached to paragraph blocks.\"));\n }\n if (flags.hyperlinks) {\n entries.push(supportedEntry(\"hyperlinks\", \"Hyperlink relationships are preserved and re-serialized.\"));\n }\n if (flags.images) {\n entries.push(supportedEntry(\"inline-images\", \"Inline image placements stay attached to preserved media parts.\"));\n }\n return entries;\n}\n\nfunction measureParagraph(\n paragraph: ParagraphNode,\n flags: {\n runs: boolean;\n whitespace: boolean;\n hyperlinks: boolean;\n images: boolean;\n },\n): number {\n let size = 0;\n const children = Array.isArray(paragraph.children) ? paragraph.children : [];\n\n for (const child of children) {\n size += measureInlineNode(child, flags);\n }\n\n return size;\n}\n\nfunction measureInlineNode(\n node: InlineNode,\n flags: {\n runs: boolean;\n whitespace: boolean;\n hyperlinks: boolean;\n images: boolean;\n },\n): number {\n switch (node.type) {\n case \"text\":\n flags.runs = flags.runs || node.text.length > 0;\n flags.whitespace =\n flags.whitespace ||\n /^\\s/u.test(node.text) ||\n /\\s$/u.test(node.text) ||\n node.text.includes(\" \");\n return Array.from(node.text).length;\n case \"tab\":\n case \"hard_break\":\n flags.runs = true;\n flags.whitespace = true;\n return 1;\n case \"hyperlink\":\n flags.runs = true;\n flags.hyperlinks = true;\n return node.children.reduce((size, child) => size + measureInlineNode(child, flags), 0);\n case \"image\":\n flags.images = true;\n flags.runs = true;\n return 1;\n case \"opaque_inline\":\n flags.runs = true;\n return 1;\n }\n}\n\nfunction collectPreservationFeatures(\n document: CanonicalDocumentEnvelope,\n): CompatibilityFeatureEntry[] {\n const entries: CompatibilityFeatureEntry[] = [];\n\n for (const fragment of listOpaqueFragments(document.preservation as never)) {\n const descriptor = describeOpaqueFragment(fragment);\n entries.push({\n featureEntryId: `feature:${fragment.fragmentId}`,\n featureKey: descriptor.featureKey,\n featureClass: \"preserve-only\",\n message: descriptor.label,\n affectedAnchor: createRangeAnchor(\n fragment.lastKnownRange.from,\n fragment.lastKnownRange.to,\n ),\n details: {\n fragmentId: fragment.fragmentId,\n warningId: fragment.warningId,\n detail: descriptor.detail,\n },\n });\n }\n\n for (const packagePart of listPreservedPackageParts(document.preservation as never)) {\n entries.push({\n featureEntryId: `feature:package:${packagePart.packagePartName}`,\n featureKey: \"unknown-package-parts\",\n featureClass: \"preserve-only\",\n message: `Preserved package part ${packagePart.packagePartName}.`,\n details: {\n packagePartName: packagePart.packagePartName,\n contentType: packagePart.contentType,\n relationshipIds: packagePart.relationshipIds,\n },\n });\n }\n\n return entries;\n}\n\nfunction collectDiagnosticWarnings(\n document: CanonicalDocumentEnvelope,\n): EditorWarning[] {\n const diagnostics = Array.isArray(document.diagnostics?.warnings)\n ? document.diagnostics.warnings\n : [];\n\n return diagnostics.map((warning) => ({\n warningId: warning.warningId,\n code:\n warning.source === \"validation\" || warning.source === \"export\"\n ? \"export_roundtrip_risk\"\n : warning.source === \"preservation\"\n ? \"unsupported_ooxml_preserved\"\n : \"import_normalized\",\n severity: \"warning\",\n message: warning.message,\n source: warning.source,\n }));\n}\n\nfunction collectDiagnosticErrors(\n document: CanonicalDocumentEnvelope,\n): EditorError[] {\n const diagnostics = Array.isArray(document.diagnostics?.errors)\n ? document.diagnostics.errors\n : [];\n\n return diagnostics.map((error) => ({\n errorId: error.diagnosticId,\n code:\n error.code === \"load_failed\"\n ? \"import_failed\"\n : error.code,\n message: error.message,\n isFatal: error.isFatal,\n source: error.source,\n }));\n}\n\nfunction supportedEntry(\n featureKey: CompatibilityFeatureEntry[\"featureKey\"],\n message: string,\n): CompatibilityFeatureEntry {\n return {\n featureEntryId: `feature:${featureKey}`,\n featureKey,\n featureClass: \"supported-roundtrip\",\n message,\n };\n}\n\nfunction dedupeWarnings(warnings: EditorWarning[]): EditorWarning[] {\n const byId = new Map<string, EditorWarning>();\n\n for (const warning of warnings) {\n byId.set(warning.warningId, warning);\n }\n\n return [...byId.values()];\n}\n\nfunction dedupeErrors(errors: EditorError[]): EditorError[] {\n const byId = new Map<string, EditorError>();\n\n for (const error of errors) {\n byId.set(error.errorId, error);\n }\n\n return [...byId.values()];\n}\n","import type {\n EditorSurfaceSnapshot,\n SurfaceBlockSnapshot,\n SurfaceInlineSegment,\n SurfaceTableCellSnapshot,\n SurfaceTableRowSnapshot,\n} from \"../api/public-types\";\nimport type {\n CanonicalDocumentEnvelope,\n SelectionSnapshot,\n} from \"../core/state/editor-state.ts\";\nimport type {\n BlockNode,\n ChartPreviewNode,\n DocumentRootNode,\n InlineNode,\n ParagraphNode,\n SdtNode,\n ShapeNode,\n SmartArtPreviewNode,\n TableNode,\n TextMark,\n VmlShapeNode,\n WordArtNode,\n} from \"../model/canonical-document.ts\";\nimport {\n describeOpaqueFragment,\n getOpaqueFragment,\n} from \"../preservation/store.ts\";\n\ninterface ParagraphAccumulator {\n blockId: string;\n kind: \"paragraph\";\n from: number;\n to: number;\n styleId?: string;\n numbering?: ParagraphNode[\"numbering\"];\n segments: SurfaceInlineSegment[];\n}\n\nexport function createEditorSurfaceSnapshot(\n document: CanonicalDocumentEnvelope,\n _selection: SelectionSnapshot,\n): EditorSurfaceSnapshot {\n const root = normalizeDocumentRoot(document.content);\n const blocks: SurfaceBlockSnapshot[] = [];\n const lockedFragmentIds: string[] = [];\n let cursor = 0;\n const counters = {\n paragraph: 0,\n table: 0,\n opaque: 0,\n sdt: 0,\n customXml: 0,\n altChunk: 0,\n };\n\n for (let index = 0; index < root.children.length; index += 1) {\n const surfaceBlock = createSurfaceBlock(root.children[index], document, cursor, counters);\n blocks.push(surfaceBlock.block);\n lockedFragmentIds.push(...surfaceBlock.lockedFragmentIds);\n cursor = surfaceBlock.nextCursor;\n if (index < root.children.length - 1 && root.children[index + 1]?.type === \"paragraph\") {\n cursor += 1;\n }\n }\n\n return {\n storySize: cursor,\n plainText: createPlainText(blocks),\n blocks,\n lockedFragmentIds,\n };\n}\n\nfunction createSurfaceBlock(\n block: BlockNode,\n document: CanonicalDocumentEnvelope,\n cursor: number,\n counters: {\n paragraph: number;\n table: number;\n opaque: number;\n sdt: number;\n customXml: number;\n altChunk: number;\n },\n): { block: SurfaceBlockSnapshot; lockedFragmentIds: string[]; nextCursor: number } {\n if (block.type === \"opaque_block\") {\n const fragment = getOpaqueFragment(document.preservation as never, block.fragmentId);\n const descriptor = fragment ? describeOpaqueFragment(fragment) : null;\n const blockId = `opaque-${counters.opaque}`;\n counters.opaque += 1;\n return {\n block: {\n blockId,\n kind: \"opaque_block\",\n from: cursor,\n to: cursor + 1,\n fragmentId: block.fragmentId,\n warningId: block.warningId,\n label: descriptor?.label ?? \"Unsupported OOXML fragment\",\n detail:\n descriptor?.detail ??\n \"Locked whole-unit to keep unsupported OOXML intact through export.\",\n state: \"locked-preserve-only\",\n },\n lockedFragmentIds: [block.fragmentId],\n nextCursor: cursor + 1,\n };\n }\n\n if (block.type === \"table\") {\n const tableIndex = counters.table;\n counters.table += 1;\n return createTableBlock(tableIndex, block, document, cursor, counters);\n }\n\n if (block.type === \"sdt\") {\n const sdtIndex = counters.sdt;\n counters.sdt += 1;\n return createSdtBlock(sdtIndex, block, document, cursor, counters);\n }\n\n if (block.type === \"custom_xml\") {\n const blockId = `custom-xml-${counters.customXml}`;\n counters.customXml += 1;\n return {\n block: {\n blockId,\n kind: \"opaque_block\",\n from: cursor,\n to: cursor + 1,\n fragmentId: blockId,\n warningId: blockId,\n label: \"Custom XML block\",\n detail:\n block.uri || block.element\n ? `Custom XML wrapper ${[block.element, block.uri].filter(Boolean).join(\" \")} preserved as a read-only block.`\n : \"Custom XML wrapper preserved as a read-only block.\",\n state: \"locked-preserve-only\",\n },\n lockedFragmentIds: [],\n nextCursor: cursor + 1,\n };\n }\n\n if (block.type === \"alt_chunk\") {\n const blockId = `alt-chunk-${counters.altChunk}`;\n counters.altChunk += 1;\n return {\n block: {\n blockId,\n kind: \"opaque_block\",\n from: cursor,\n to: cursor + 1,\n fragmentId: blockId,\n warningId: blockId,\n label: \"AltChunk import\",\n detail: `Alternate content import remains read-only through relationship ${block.relationshipId}.`,\n state: \"locked-preserve-only\",\n },\n lockedFragmentIds: [],\n nextCursor: cursor + 1,\n };\n }\n\n const paragraphIndex = counters.paragraph;\n counters.paragraph += 1;\n return createParagraphBlock(paragraphIndex, block, document, cursor);\n}\n\nfunction createTableBlock(\n tableIndex: number,\n table: TableNode,\n document: CanonicalDocumentEnvelope,\n cursor: number,\n counters: {\n paragraph: number;\n table: number;\n opaque: number;\n sdt: number;\n customXml: number;\n altChunk: number;\n },\n): { block: SurfaceBlockSnapshot; lockedFragmentIds: string[]; nextCursor: number } {\n const lockedFragmentIds: string[] = [];\n let innerCursor = cursor;\n const rows: SurfaceTableRowSnapshot[] = [];\n\n for (const row of table.rows) {\n const cells: SurfaceTableCellSnapshot[] = [];\n for (const cell of row.cells) {\n const cellContent: SurfaceBlockSnapshot[] = [];\n for (const child of cell.children) {\n const result = createSurfaceBlock(child, document, innerCursor, counters);\n cellContent.push(result.block);\n lockedFragmentIds.push(...result.lockedFragmentIds);\n innerCursor = result.nextCursor;\n }\n cells.push({\n gridSpan: cell.gridSpan ?? 1,\n verticalMerge: cell.verticalMerge ?? null,\n colspan: cell.gridSpan ?? 1,\n rowspan: cell.verticalMerge === \"restart\" ? 1 : 1,\n content: cellContent,\n });\n }\n rows.push({ cells });\n }\n\n return {\n block: {\n blockId: `table-${tableIndex}`,\n kind: \"table\",\n from: cursor,\n to: innerCursor,\n styleId: table.styleId,\n gridColumns: table.gridColumns,\n rows,\n },\n lockedFragmentIds,\n nextCursor: innerCursor,\n };\n}\n\nfunction createSdtBlock(\n sdtIndex: number,\n block: SdtNode,\n document: CanonicalDocumentEnvelope,\n cursor: number,\n counters: {\n paragraph: number;\n table: number;\n opaque: number;\n sdt: number;\n customXml: number;\n altChunk: number;\n },\n): { block: SurfaceBlockSnapshot; lockedFragmentIds: string[]; nextCursor: number } {\n const children: SurfaceBlockSnapshot[] = [];\n const lockedFragmentIds: string[] = [];\n let innerCursor = cursor;\n\n for (const child of block.children) {\n const result = createSurfaceBlock(child, document, innerCursor, counters);\n children.push(result.block);\n lockedFragmentIds.push(...result.lockedFragmentIds);\n innerCursor = result.nextCursor;\n }\n\n return {\n block: {\n blockId: `sdt-${sdtIndex}`,\n kind: \"sdt_block\",\n from: cursor,\n to: innerCursor,\n ...(block.properties.sdtType ? { sdtType: block.properties.sdtType } : {}),\n ...(block.properties.alias ? { alias: block.properties.alias } : {}),\n ...(block.properties.tag ? { tag: block.properties.tag } : {}),\n ...(block.properties.lock ? { lock: block.properties.lock } : {}),\n children,\n },\n lockedFragmentIds,\n nextCursor: innerCursor,\n };\n}\n\nfunction createParagraphBlock(\n paragraphIndex: number,\n paragraph: ParagraphNode,\n document: CanonicalDocumentEnvelope,\n start: number,\n): {\n block: SurfaceBlockSnapshot;\n nextCursor: number;\n lockedFragmentIds: string[];\n} {\n const accumulator: ParagraphAccumulator = {\n blockId: `paragraph-${paragraphIndex}`,\n kind: \"paragraph\",\n from: start,\n to: start,\n ...(paragraph.styleId ? { styleId: paragraph.styleId } : {}),\n ...(paragraph.numbering ? { numbering: paragraph.numbering } : {}),\n segments: [],\n };\n const lockedFragmentIds: string[] = [];\n let cursor = start;\n const children = Array.isArray(paragraph.children) ? paragraph.children : [];\n\n for (const child of children) {\n const result = appendInlineSegments(accumulator, child, document, cursor);\n cursor = result.nextCursor;\n lockedFragmentIds.push(...result.lockedFragmentIds);\n }\n\n accumulator.to = cursor;\n return {\n block: accumulator,\n nextCursor: cursor,\n lockedFragmentIds,\n };\n}\n\nfunction appendInlineSegments(\n paragraph: ParagraphAccumulator,\n node: InlineNode,\n document: CanonicalDocumentEnvelope,\n start: number,\n hyperlinkHref?: string,\n): { nextCursor: number; lockedFragmentIds: string[] } {\n switch (node.type) {\n case \"text\":\n paragraph.segments.push({\n segmentId: `${paragraph.blockId}-segment-${paragraph.segments.length}`,\n kind: \"text\",\n from: start,\n to: start + Array.from(node.text).length,\n text: node.text,\n ...(node.marks ? { marks: cloneMarks(node.marks) } : {}),\n ...(hyperlinkHref ? { hyperlinkHref } : {}),\n });\n return { nextCursor: start + Array.from(node.text).length, lockedFragmentIds: [] };\n case \"tab\":\n paragraph.segments.push({\n segmentId: `${paragraph.blockId}-segment-${paragraph.segments.length}`,\n kind: \"tab\",\n from: start,\n to: start + 1,\n ...(hyperlinkHref ? { hyperlinkHref } : {}),\n });\n return { nextCursor: start + 1, lockedFragmentIds: [] };\n case \"hard_break\":\n paragraph.segments.push({\n segmentId: `${paragraph.blockId}-segment-${paragraph.segments.length}`,\n kind: \"hard_break\",\n from: start,\n to: start + 1,\n ...(hyperlinkHref ? { hyperlinkHref } : {}),\n });\n return { nextCursor: start + 1, lockedFragmentIds: [] };\n case \"hyperlink\": {\n let cursor = start;\n for (const child of node.children) {\n const result = appendInlineSegments(paragraph, child, document, cursor, node.href);\n cursor = result.nextCursor;\n }\n return { nextCursor: cursor, lockedFragmentIds: [] };\n }\n case \"image\":\n paragraph.segments.push({\n segmentId: `${paragraph.blockId}-segment-${paragraph.segments.length}`,\n kind: \"image\",\n from: start,\n to: start + 1,\n mediaId: node.mediaId,\n altText: node.altText,\n state: hasMediaItem(document.media, node.mediaId) ? \"editable\" : \"missing\",\n ...(node.display ? { display: node.display } : {}),\n detail:\n node.display === \"floating\"\n ? createFloatingImageDetail(node.altText, node.floating)\n : node.altText\n ? `Alt text ${node.altText}.`\n : \"Inline image remains a whole-unit render surface.\",\n });\n return { nextCursor: start + 1, lockedFragmentIds: [] };\n case \"opaque_inline\": {\n const fragment = getOpaqueFragment(document.preservation as never, node.fragmentId);\n const descriptor = fragment ? describeOpaqueFragment(fragment) : null;\n paragraph.segments.push({\n segmentId: `${paragraph.blockId}-segment-${paragraph.segments.length}`,\n kind: \"opaque_inline\",\n from: start,\n to: start + 1,\n fragmentId: node.fragmentId,\n warningId: node.warningId,\n label: descriptor?.label ?? \"Unsupported inline OOXML\",\n detail:\n descriptor?.detail ??\n \"Locked whole-unit to keep unsupported inline OOXML intact through export.\",\n state: \"locked-preserve-only\",\n });\n return { nextCursor: start + 1, lockedFragmentIds: [node.fragmentId] };\n }\n case \"chart_preview\":\n return appendComplexPreviewSegment(paragraph, node, start, \"Chart\", createChartDetail(node));\n case \"smartart_preview\":\n return appendComplexPreviewSegment(paragraph, node, start, \"SmartArt\", createSmartArtDetail(node));\n case \"shape\":\n return appendComplexPreviewSegment(paragraph, node, start, \"Shape\", createShapeDetail(node));\n case \"wordart\":\n return appendComplexPreviewSegment(paragraph, node, start, \"WordArt\", createWordArtDetail(node));\n case \"vml_shape\":\n return appendComplexPreviewSegment(paragraph, node, start, \"VML shape\", createVmlDetail(node));\n }\n}\n\nfunction appendComplexPreviewSegment(\n paragraph: ParagraphAccumulator,\n node: { rawXml: string },\n start: number,\n label: string,\n detail: string,\n): { nextCursor: number; lockedFragmentIds: string[] } {\n paragraph.segments.push({\n segmentId: `${paragraph.blockId}-segment-${paragraph.segments.length}`,\n kind: \"opaque_inline\",\n from: start,\n to: start + 1,\n fragmentId: `complex:${label.replace(/\\s/g, \"-\").toLowerCase()}:${start}`,\n warningId: `warning:complex-preview:${start}`,\n label,\n detail,\n state: \"locked-preserve-only\",\n });\n return { nextCursor: start + 1, lockedFragmentIds: [] };\n}\n\nfunction createChartDetail(node: ChartPreviewNode): string {\n return node.previewMediaId\n ? `Chart read-only preview. Fallback image ${node.previewMediaId}. Original XML preserved for export.`\n : \"Chart read-only preview. Original XML preserved for export.\";\n}\n\nfunction createSmartArtDetail(node: SmartArtPreviewNode): string {\n return node.previewMediaId\n ? `SmartArt diagram read-only preview. Fallback image ${node.previewMediaId}. Original XML preserved for export.`\n : \"SmartArt diagram read-only preview. Original XML preserved for export.\";\n}\n\nfunction createShapeDetail(node: ShapeNode): string {\n const parts = [\"Shape read-only preview.\"];\n if (node.geometry) parts.push(`Geometry: ${node.geometry}.`);\n if (node.text) parts.push(`Text: \"${node.text}\".`);\n parts.push(\"Original XML preserved for export.\");\n return parts.join(\" \");\n}\n\nfunction createWordArtDetail(node: WordArtNode): string {\n const parts = [\"WordArt read-only preview.\"];\n if (node.text) parts.push(`Text: \"${node.text}\".`);\n if (node.geometry) parts.push(`Effect: ${node.geometry}.`);\n parts.push(\"Original XML preserved for export.\");\n return parts.join(\" \");\n}\n\nfunction createVmlDetail(node: VmlShapeNode): string {\n const parts = [\"VML shape read-only preview.\"];\n if (node.shapeType) parts.push(`Type: ${node.shapeType}.`);\n if (node.text) parts.push(`Text: \"${node.text}\".`);\n parts.push(\"Legacy VML; original XML preserved for export.\");\n return parts.join(\" \");\n}\n\nfunction createPlainText(\n blocks: SurfaceBlockSnapshot[],\n): string {\n const text: string[] = [];\n for (const block of blocks) {\n if (block.kind === \"opaque_block\") {\n text.push(\"\\uFFFA\");\n continue;\n }\n\n if (block.kind === \"table\") {\n text.push(\"\\uFFFA\"); // placeholder for table in plain text\n continue;\n }\n\n if (block.kind === \"sdt_block\") {\n text.push(createPlainText(block.children));\n continue;\n }\n\n for (const segment of block.segments) {\n switch (segment.kind) {\n case \"text\":\n text.push(segment.text);\n break;\n case \"tab\":\n text.push(\"\\t\");\n break;\n case \"hard_break\":\n text.push(\"\\n\");\n break;\n case \"image\":\n text.push(\"\\uFFFC\");\n break;\n case \"opaque_inline\":\n text.push(\"\\uFFF9\");\n break;\n }\n }\n }\n\n return text.join(\"\");\n}\n\nfunction cloneMarks(marks: TextMark[]): Array<\"bold\" | \"italic\" | \"underline\" | \"strikethrough\"> {\n return marks.map((mark) => mark.type);\n}\n\nfunction normalizeDocumentRoot(content: unknown): DocumentRootNode {\n if (content && typeof content === \"object\" &&\n ((content as { type?: string }).type === \"doc\" || (content as { type?: string }).type === \"document_root\")) {\n return content as DocumentRootNode;\n }\n\n if (Array.isArray(content)) {\n return {\n type: \"doc\",\n children: content.filter(\n (value): value is DocumentRootNode[\"children\"][number] =>\n Boolean(value) &&\n typeof value === \"object\" &&\n ((value as { type?: string }).type === \"paragraph\" ||\n (value as { type?: string }).type === \"table\" ||\n (value as { type?: string }).type === \"sdt\" ||\n (value as { type?: string }).type === \"custom_xml\" ||\n (value as { type?: string }).type === \"alt_chunk\" ||\n (value as { type?: string }).type === \"opaque_block\"),\n ),\n };\n }\n\n return {\n type: \"doc\",\n children: [{ type: \"paragraph\", children: [] }],\n };\n}\n\nfunction createFloatingImageDetail(\n altText: string | undefined,\n floating: {\n horizontalPosition?: { relativeFrom?: string; align?: string; offset?: number };\n verticalPosition?: { relativeFrom?: string; align?: string; offset?: number };\n wrap?: string;\n } | undefined,\n): string {\n const parts = [altText ? `Alt text ${altText}.` : \"Floating image rendered inline in the editor.\"];\n if (floating?.wrap) {\n parts.push(`Wrap ${floating.wrap}.`);\n }\n if (floating?.horizontalPosition?.align || floating?.horizontalPosition?.offset !== undefined) {\n parts.push(\n `Horizontal ${floating.horizontalPosition.align ?? floating.horizontalPosition.offset}.`,\n );\n }\n if (floating?.verticalPosition?.align || floating?.verticalPosition?.offset !== undefined) {\n parts.push(\n `Vertical ${floating.verticalPosition.align ?? floating.verticalPosition.offset}.`,\n );\n }\n return parts.join(\" \");\n}\n\nfunction hasMediaItem(media: Record<string, unknown>, mediaId: string): boolean {\n if (mediaId in media) {\n return true;\n }\n\n const items = media.items;\n if (!items || typeof items !== \"object\" || Array.isArray(items)) {\n return false;\n }\n\n return mediaId in items;\n}\n","import {\n createEditorState,\n createPersistedEditorSnapshot,\n deriveDocumentStats,\n type CanonicalDocumentEnvelope,\n type CommentEntryRecord,\n type CommentThreadRecord,\n type CompatibilityFeatureEntry as InternalCompatibilityFeatureEntry,\n type CompatibilityReport as InternalCompatibilityReport,\n type EditorError as InternalEditorError,\n type EditorState,\n type EditorWarning as InternalEditorWarning,\n} from \"../core/state/editor-state.ts\";\nimport type {\n AddCommentParams,\n CommentSidebarSnapshot,\n CommentSidebarThreadSnapshot,\n CompatibilityReport,\n EditorAnchorProjection,\n EditorError,\n EditorWarning,\n ExportDocxOptions,\n ExportResult,\n PersistedEditorSnapshot,\n RuntimeRenderSnapshot,\n SelectionSnapshot,\n TrackedChangeEntrySnapshot,\n TrackedChangesSnapshot,\n WordReviewEditorEvent,\n} from \"../api/public-types\";\nimport {\n executeEditorCommand,\n selectionChanged,\n type CommandOrigin,\n type EditorCommand,\n type EditorTransaction,\n} from \"../core/commands/index.ts\";\nimport {\n createDetachedAnchor,\n createNodeAnchor,\n createRangeAnchor,\n type EditorAnchorProjection as InternalEditorAnchorProjection,\n} from \"../core/selection/mapping.ts\";\nimport { createCommentSidebarProjection } from \"../review/store/comment-store.ts\";\nimport { createCommentStoreFromRuntimeComments } from \"../review/store/runtime-comment-store.ts\";\nimport {\n createRevisionSidebarProjection,\n type RevisionStore,\n} from \"../review/store/revision-store.ts\";\nimport { buildCompatibilityReport } from \"../validation/compatibility-engine.ts\";\nimport { createEditorSurfaceSnapshot } from \"./surface-projection.ts\";\n\nexport type Unsubscribe = () => void;\n\nexport interface DocumentRuntime {\n subscribe(listener: () => void): Unsubscribe;\n subscribeToEvents(listener: (event: WordReviewEditorEvent) => void): Unsubscribe;\n getRenderSnapshot(): RuntimeRenderSnapshot;\n dispatch(command: EditorCommand): void;\n undo(): void;\n redo(): void;\n focus(): void;\n blur(): void;\n addComment(params: AddCommentParams): string;\n openComment(commentId: string): void;\n resolveComment(commentId: string): void;\n reopenComment(commentId: string): void;\n addCommentReply(commentId: string, body: string, authorId?: string): void;\n editCommentBody(commentId: string, body: string): void;\n acceptChange(changeId: string): void;\n rejectChange(changeId: string): void;\n acceptAllChanges(): void;\n rejectAllChanges(): void;\n getPersistedSnapshot(): PersistedEditorSnapshot;\n getCompatibilityReport(): CompatibilityReport;\n getWarnings(): EditorWarning[];\n exportDocx(options?: ExportDocxOptions): Promise<ExportResult>;\n}\n\nexport interface CreateDocumentRuntimeOptions {\n documentId: string;\n initialSnapshot?: PersistedEditorSnapshot;\n initialCanonicalDocument?: CanonicalDocumentEnvelope;\n sourceLabel?: string;\n sourceKind?: \"docx\" | \"snapshot\" | \"datastore\" | \"canonical\";\n readOnly?: boolean;\n editorBuild?: string;\n defaultAuthorId?: string;\n fatalError?: EditorError;\n clock?: () => string;\n exportDocx?: (\n snapshot: PersistedEditorSnapshot,\n options?: ExportDocxOptions,\n ) => Promise<ExportResult>;\n onEvent?: (event: WordReviewEditorEvent) => void;\n onWarning?: (warning: EditorWarning) => void;\n onError?: (error: EditorError) => void;\n}\n\ninterface HistoryState {\n past: EditorState[];\n future: EditorState[];\n}\n\nexport function createDocumentRuntime(\n options: CreateDocumentRuntimeOptions,\n): DocumentRuntime {\n const clock = options.clock ?? (() => new Date().toISOString());\n const editorBuild = options.editorBuild ?? \"dev\";\n const sessionId = createSessionId(options.documentId, clock());\n const listeners = new Set<() => void>();\n const eventListeners = new Set<(event: WordReviewEditorEvent) => void>();\n const history: HistoryState = {\n past: [],\n future: [],\n };\n\n let state = createEditorState({\n documentId: options.documentId,\n sessionId,\n sourceLabel: options.sourceLabel,\n readOnly: options.readOnly,\n persistedSnapshot: options.initialSnapshot as never,\n canonicalDocument: options.initialCanonicalDocument,\n fatalError: options.fatalError as never,\n });\n let cachedRenderSnapshot = createPublicRenderSnapshot(state, history);\n\n emit({\n type: \"ready\",\n documentId: state.documentId,\n sessionId: state.sessionId,\n source: options.sourceKind ?? (options.initialSnapshot ? \"snapshot\" : \"canonical\"),\n stats: toPublicDocumentStats(state),\n compatibility: toPublicCompatibilityReport(createDerivedCompatibility(state)),\n });\n if (options.fatalError) {\n emit({\n type: \"error\",\n documentId: state.documentId,\n error: options.fatalError,\n });\n }\n\n return {\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n subscribeToEvents(listener) {\n eventListeners.add(listener);\n return () => {\n eventListeners.delete(listener);\n };\n },\n getRenderSnapshot() {\n return cachedRenderSnapshot;\n },\n dispatch(command) {\n if (command.type === \"history.undo\") {\n applyHistory(\"undo\");\n return;\n }\n\n if (command.type === \"history.redo\") {\n applyHistory(\"redo\");\n return;\n }\n\n try {\n const transaction = executeEditorCommand(state, command, {\n timestamp: command.origin?.timestamp ?? clock(),\n });\n commit(transaction);\n } catch (error) {\n emitError(toRuntimeError(error));\n }\n },\n undo() {\n this.dispatch({\n type: \"history.undo\",\n origin: createOrigin(\"runtime\", clock()),\n });\n },\n redo() {\n this.dispatch({\n type: \"history.redo\",\n origin: createOrigin(\"runtime\", clock()),\n });\n },\n focus() {\n this.dispatch({\n type: \"runtime.focus\",\n focused: true,\n origin: createOrigin(\"api\", clock()),\n });\n },\n blur() {\n this.dispatch({\n type: \"runtime.focus\",\n focused: false,\n origin: createOrigin(\"api\", clock()),\n });\n },\n addComment(params) {\n const commentId = createEntityId(\"comment\", state.document.review.comments, clock());\n const anchor = params.anchor\n ? toInternalAnchorProjection(params.anchor)\n : state.selection.activeRange;\n const authorId = params.authorId ?? options.defaultAuthorId ?? \"unknown\";\n const createdAt = clock();\n const entries: CommentEntryRecord[] = [\n {\n entryId: `${commentId}-entry-1`,\n authorId,\n body: params.body ?? \"\",\n createdAt,\n },\n ];\n const comment: CommentThreadRecord = {\n commentId,\n anchor,\n createdAt,\n createdBy: authorId,\n authorId,\n body: params.body ?? \"\",\n entries,\n status: anchor.kind === \"detached\" ? \"detached\" : \"open\",\n warningIds: [],\n isResolved: false,\n metadata: {\n source: \"runtime\",\n },\n };\n\n this.dispatch({\n type: \"comment.add\",\n comment,\n origin: createOrigin(\"api\", clock()),\n });\n\n return commentId;\n },\n openComment(commentId) {\n this.dispatch({\n type: \"comment.open\",\n commentId,\n origin: createOrigin(\"api\", clock()),\n });\n },\n resolveComment(commentId) {\n this.dispatch({\n type: \"comment.resolve\",\n commentId,\n resolvedBy: options.defaultAuthorId ?? \"unknown\",\n origin: createOrigin(\"api\", clock()),\n });\n },\n reopenComment(commentId) {\n this.dispatch({\n type: \"comment.reopen\",\n commentId,\n origin: createOrigin(\"api\", clock()),\n });\n },\n addCommentReply(commentId, body, authorId) {\n this.dispatch({\n type: \"comment.add-reply\",\n commentId,\n body,\n authorId: authorId ?? options.defaultAuthorId,\n origin: createOrigin(\"api\", clock()),\n });\n },\n editCommentBody(commentId, body) {\n this.dispatch({\n type: \"comment.edit-body\",\n commentId,\n body,\n origin: createOrigin(\"api\", clock()),\n });\n },\n acceptChange(changeId) {\n this.dispatch({\n type: \"change.accept\",\n changeId,\n origin: createOrigin(\"api\", clock()),\n });\n },\n rejectChange(changeId) {\n this.dispatch({\n type: \"change.reject\",\n changeId,\n origin: createOrigin(\"api\", clock()),\n });\n },\n acceptAllChanges() {\n this.dispatch({\n type: \"change.accept-all\",\n origin: createOrigin(\"api\", clock()),\n });\n },\n rejectAllChanges() {\n this.dispatch({\n type: \"change.reject-all\",\n origin: createOrigin(\"api\", clock()),\n });\n },\n getPersistedSnapshot() {\n const compatibility = createDerivedCompatibility(state);\n return createPersistedEditorSnapshot(state, {\n editorBuild,\n savedAt: clock(),\n compatibility,\n }) as unknown as PersistedEditorSnapshot;\n },\n getCompatibilityReport() {\n return toPublicCompatibilityReport(createDerivedCompatibility(state));\n },\n getWarnings() {\n return state.warnings.map((warning) => toPublicWarning(warning));\n },\n async exportDocx(exportOptions) {\n if (!options.exportDocx) {\n const error: InternalEditorError = {\n errorId: createEntityId(\"error\", {}, clock()),\n code: \"export_failed\",\n isFatal: false,\n message: \"DOCX export requires an injected exporter until the IO substrate lands.\",\n source: \"export\",\n details: {\n requestedOptions: exportOptions ?? {},\n },\n };\n emitError(error);\n throw new Error(error.message);\n }\n\n const result = await options.exportDocx(\n createPersistedEditorSnapshot(state, {\n editorBuild,\n savedAt: clock(),\n compatibility: createDerivedCompatibility(state),\n }) as unknown as PersistedEditorSnapshot,\n exportOptions,\n );\n\n emit({\n type: \"export_completed\",\n documentId: state.documentId,\n result,\n });\n\n return result;\n },\n };\n\n function applyHistory(direction: \"undo\" | \"redo\"): void {\n const source = direction === \"undo\" ? history.past : history.future;\n const target = source.pop();\n\n if (!target) {\n return;\n }\n\n const counterpart = direction === \"undo\" ? history.future : history.past;\n counterpart.push(state);\n\n const previous = state;\n // Undo/redo changes the document — must mint a new revisionToken so\n // autosave/export checkpoint dedup treats it as fresh content.\n state = finalizeState(target, true, clock());\n cachedRenderSnapshot = createPublicRenderSnapshot(state, history);\n notify(previous, state, {\n nextState: state,\n mapping: { steps: [] },\n effects: {\n warningsAdded: [],\n warningsCleared: [],\n },\n historyBoundary: \"skip\",\n markDirty: true,\n });\n }\n\n function commit(transaction: EditorTransaction): void {\n const previous = state;\n\n if (transaction.historyBoundary === \"push\") {\n history.past.push(state);\n history.future = [];\n }\n\n state = finalizeState(transaction.nextState, transaction.markDirty, clock());\n cachedRenderSnapshot = createPublicRenderSnapshot(state, history);\n notify(previous, state, transaction);\n }\n\n function notify(\n previous: EditorState,\n next: EditorState,\n transaction: EditorTransaction,\n ): void {\n if (previous.isDirty !== next.isDirty) {\n emit({\n type: \"dirty_changed\",\n documentId: next.documentId,\n isDirty: next.isDirty,\n });\n }\n\n if (selectionChanged(previous.selection, next.selection)) {\n emit({\n type: \"selection_changed\",\n documentId: next.documentId,\n selection: toPublicSelectionSnapshot(next.selection),\n });\n }\n\n if (transaction.effects.commentAdded) {\n emit({\n type: \"comment_added\",\n documentId: next.documentId,\n commentId: transaction.effects.commentAdded.commentId,\n anchor: toPublicAnchorProjection(transaction.effects.commentAdded.anchor),\n });\n }\n\n if (transaction.effects.commentResolved) {\n emit({\n type: \"comment_resolved\",\n documentId: next.documentId,\n commentId: transaction.effects.commentResolved.commentId,\n });\n }\n\n if (transaction.effects.changeAccepted) {\n emit({\n type: \"change_accepted\",\n documentId: next.documentId,\n changeId: transaction.effects.changeAccepted.changeId,\n });\n }\n\n if (transaction.effects.changeRejected) {\n emit({\n type: \"change_rejected\",\n documentId: next.documentId,\n changeId: transaction.effects.changeRejected.changeId,\n });\n }\n\n for (const warning of transaction.effects.warningsAdded) {\n const publicWarning = toPublicWarning(warning);\n emit({\n type: \"warning_added\",\n documentId: next.documentId,\n warning: publicWarning,\n });\n options.onWarning?.(publicWarning);\n }\n\n for (const cleared of transaction.effects.warningsCleared) {\n emit({\n type: \"warning_cleared\",\n documentId: next.documentId,\n warningId: cleared.warningId,\n code: cleared.code,\n });\n }\n\n for (const listener of listeners) {\n listener();\n }\n }\n\n function emit(event: WordReviewEditorEvent): void {\n options.onEvent?.(event);\n for (const listener of eventListeners) {\n listener(event);\n }\n }\n\n function emitError(error: InternalEditorError): void {\n const nextState: EditorState = {\n ...state,\n phase: error.isFatal ? \"error\" : state.phase,\n fatalError: error.isFatal ? error : state.fatalError,\n };\n state = nextState;\n cachedRenderSnapshot = createPublicRenderSnapshot(state, history);\n const publicError = toPublicError(error);\n options.onError?.(publicError);\n emit({\n type: \"error\",\n documentId: state.documentId,\n error: publicError,\n });\n for (const listener of listeners) {\n listener();\n }\n }\n}\n\nfunction createSessionId(documentId: string, timestamp: string): string {\n return `session-${documentId}-${timestamp.replace(/[^0-9]/gu, \"\")}`;\n}\n\nfunction createOrigin(\n source: CommandOrigin[\"source\"],\n timestamp: string,\n): CommandOrigin {\n return {\n source,\n timestamp,\n };\n}\n\nfunction createEntityId(\n prefix: string,\n existing: Record<string, unknown>,\n timestamp: string,\n): string {\n let counter = Object.keys(existing).length;\n let nextId = `${prefix}-${timestamp.replace(/[^0-9]/gu, \"\")}-${counter}`;\n\n while (existing[nextId]) {\n counter += 1;\n nextId = `${prefix}-${timestamp.replace(/[^0-9]/gu, \"\")}-${counter}`;\n }\n\n return nextId;\n}\n\nfunction finalizeState(\n state: EditorState,\n markDirty: boolean,\n timestamp: string,\n): EditorState {\n // Only increment revision on actual document mutations (markDirty=true).\n // Selection-only changes must not churn the revisionToken, which would\n // cause autosave/checkpoint dedup to treat cursor movement as new content.\n const revision = markDirty ? state.revision + 1 : state.revision;\n\n return {\n ...state,\n document: {\n ...state.document,\n updatedAt: markDirty ? timestamp : state.document.updatedAt,\n },\n selection: state.selection,\n revision,\n revisionToken: `${state.sessionId}:${revision}`,\n isDirty: state.isDirty || markDirty,\n };\n}\n\nfunction toRuntimeError(error: unknown): InternalEditorError {\n if (typeof error === \"object\" && error && \"message\" in error) {\n return {\n errorId: createSessionId(\"runtime-error\", new Date().toISOString()),\n code: \"internal_invariant\",\n isFatal: false,\n message: String((error as { message?: unknown }).message ?? \"Runtime error\"),\n source: \"runtime\",\n };\n }\n\n return {\n errorId: createSessionId(\"runtime-error\", new Date().toISOString()),\n code: \"internal_invariant\",\n isFatal: false,\n message: \"Runtime error\",\n source: \"runtime\",\n };\n}\n\nfunction createPublicRenderSnapshot(\n state: EditorState,\n history: HistoryState,\n): RuntimeRenderSnapshot {\n const compatibility = createDerivedCompatibility(state);\n const surface = createEditorSurfaceSnapshot(state.document, state.selection);\n const comments = toPublicCommentSidebarSnapshot(state);\n const trackedChanges = toPublicTrackedChangesSnapshot(state, surface.plainText);\n\n return {\n documentId: state.documentId,\n sessionId: state.sessionId,\n sourceLabel: state.sourceLabel,\n revisionToken: state.revisionToken,\n isReady: state.phase === \"ready\",\n isDirty: state.isDirty,\n readOnly: state.readOnly,\n selection: toPublicSelectionSnapshot(state.selection),\n documentStats: toPublicDocumentStats(state),\n comments,\n trackedChanges,\n compatibility: {\n blockExport: compatibility.blockExport,\n blockExportReasons: listBlockExportReasons(compatibility),\n warningCount: compatibility.warnings.length,\n errorCount: compatibility.errors.length,\n featureEntries: compatibility.featureEntries.map((entry) =>\n toPublicCompatibilityFeatureEntry(entry),\n ),\n },\n warnings: state.warnings.map((warning) => toPublicWarning(warning)),\n fatalError: state.fatalError ? toPublicError(state.fatalError) : undefined,\n commandState: {\n canUndo: history.past.length > 0,\n canRedo: history.future.length > 0,\n readOnly: state.readOnly,\n },\n surface,\n };\n}\n\nfunction toPublicDocumentStats(state: Pick<EditorState, \"document\">) {\n const stats = deriveDocumentStats(state);\n return {\n storyLength: stats.characterCount,\n commentCount: stats.commentCount,\n revisionCount: stats.revisionCount,\n opaqueFragmentCount: countOpaqueFragments(state.document.preservation.opaqueFragments),\n };\n}\n\nfunction toPublicSelectionSnapshot(\n selection: EditorState[\"selection\"],\n): SelectionSnapshot {\n return {\n anchor: selection.anchor,\n head: selection.head,\n isCollapsed: selection.isCollapsed,\n activeRange: toPublicAnchorProjection(selection.activeRange),\n };\n}\n\nfunction toPublicAnchorProjection(\n anchor: InternalEditorAnchorProjection,\n): EditorAnchorProjection {\n switch (anchor.kind) {\n case \"range\":\n return {\n kind: \"range\",\n from: anchor.range.from,\n to: anchor.range.to,\n assoc: anchor.assoc,\n };\n case \"node\":\n return {\n kind: \"node\",\n at: anchor.at,\n assoc: anchor.assoc,\n };\n case \"detached\":\n return {\n kind: \"detached\",\n lastKnownRange: anchor.lastKnownRange,\n reason: anchor.reason,\n };\n }\n}\n\nfunction toInternalAnchorProjection(\n anchor: EditorAnchorProjection,\n): InternalEditorAnchorProjection {\n switch (anchor.kind) {\n case \"range\":\n return createRangeAnchor(anchor.from, anchor.to, anchor.assoc);\n case \"node\":\n return createNodeAnchor(anchor.at, anchor.assoc);\n case \"detached\":\n return createDetachedAnchor(anchor.lastKnownRange, anchor.reason);\n }\n}\n\nfunction toPublicCompatibilityReport(\n report: InternalCompatibilityReport,\n): CompatibilityReport {\n return {\n reportVersion: report.reportVersion,\n generatedAt: report.generatedAt,\n blockExport: report.blockExport,\n featureEntries: report.featureEntries.map((entry) =>\n toPublicCompatibilityFeatureEntry(entry),\n ),\n warnings: report.warnings.map((warning) => toPublicWarning(warning)),\n errors: report.errors.map((error) => toPublicError(error)),\n };\n}\n\nfunction toPublicCompatibilityFeatureEntry(\n entry: InternalCompatibilityFeatureEntry,\n) {\n return {\n ...entry,\n affectedAnchor: entry.affectedAnchor\n ? toPublicAnchorProjection(entry.affectedAnchor)\n : undefined,\n };\n}\n\nfunction toPublicWarning(warning: InternalEditorWarning): EditorWarning {\n return {\n ...warning,\n affectedAnchor: warning.affectedAnchor\n ? toPublicAnchorProjection(warning.affectedAnchor)\n : undefined,\n };\n}\n\nfunction toPublicError(error: InternalEditorError): EditorError {\n return { ...error };\n}\n\nfunction countOpaqueFragments(opaqueFragments: Record<string, unknown>): number {\n return Object.keys(opaqueFragments).length;\n}\n\nfunction createDerivedCompatibility(state: EditorState): InternalCompatibilityReport {\n return buildCompatibilityReport({\n document: state.document,\n warnings: state.warnings,\n fatalError: state.fatalError,\n generatedAt: state.document.updatedAt,\n });\n}\n\nfunction toPublicCommentSidebarSnapshot(\n state: EditorState,\n): CommentSidebarSnapshot {\n const projection = createCommentSidebarProjection(\n createCommentStoreFromRuntimeComments(state.document.review.comments),\n state.runtime.activeCommentId,\n );\n\n return {\n activeCommentId: state.runtime.activeCommentId,\n openCommentIds: projection.openCommentIds,\n resolvedCommentIds: projection.resolvedCommentIds,\n detachedCommentIds: projection.detachedCommentIds,\n totalCount: projection.totalCount,\n threads: projection.threads.map((thread): CommentSidebarThreadSnapshot => {\n const sourceThread = state.document.review.comments[thread.commentId];\n const projectedEntries =\n sourceThread?.entries?.map((entry) => ({\n entryId: entry.entryId,\n authorId: entry.authorId,\n body: entry.body,\n createdAt: entry.createdAt,\n })) ??\n (sourceThread?.body\n ? [\n {\n entryId: `${thread.commentId}-entry-1`,\n authorId:\n sourceThread.authorId ?? sourceThread.createdBy ?? \"unknown\",\n body: sourceThread.body,\n createdAt: sourceThread.createdAt,\n },\n ]\n : []);\n\n return {\n commentId: thread.commentId,\n status: thread.status,\n anchor: toPublicAnchorProjection(\n sourceThread?.anchor ??\n createDetachedAnchor({ from: 0, to: 0 }, \"importAmbiguity\"),\n ),\n excerpt: thread.excerpt,\n entryCount: thread.entryCount,\n createdAt: thread.createdAt,\n createdBy: thread.createdBy,\n warningCount: thread.warningCount,\n anchorLabel: thread.anchorLabel,\n isActive: thread.isActive,\n resolvedAt: thread.resolvedAt,\n resolvedBy: thread.resolvedBy,\n entries: projectedEntries,\n };\n }),\n };\n}\n\nfunction toPublicTrackedChangesSnapshot(\n state: EditorState,\n surfaceText = \"\",\n): TrackedChangesSnapshot {\n const projection = createRevisionSidebarProjection(\n createRevisionStoreFromDocument(state),\n );\n\n return {\n pendingChangeIds: projection.activeRevisionIds,\n acceptedChangeIds: projection.acceptedRevisionIds,\n rejectedChangeIds: projection.rejectedRevisionIds,\n detachedChangeIds: projection.detachedRevisionIds,\n actionableChangeIds: projection.actionableRevisionIds,\n preserveOnlyChangeIds: projection.preserveOnlyRevisionIds,\n totalCount: projection.totalCount,\n revisions: projection.revisions.map((revision): TrackedChangeEntrySnapshot => {\n const sourceRevision = state.document.review.revisions[revision.revisionId];\n const preview = describeRevisionPreview(\n revision,\n sourceRevision?.anchor ??\n createDetachedAnchor({ from: 0, to: 0 }, \"importAmbiguity\"),\n surfaceText,\n );\n\n return {\n revisionId: revision.revisionId,\n kind: revision.kind,\n label: revision.label,\n status: revision.status,\n actionability: revision.actionability,\n anchor: toPublicAnchorProjection(\n sourceRevision?.anchor ??\n createDetachedAnchor({ from: 0, to: 0 }, \"importAmbiguity\"),\n ),\n anchorLabel: revision.anchorLabel,\n createdAt: revision.createdAt,\n authorId: revision.authorId,\n warningCount: revision.warningCount,\n canAccept: revision.canAccept,\n canReject: revision.canReject,\n importedRevisionForm: sourceRevision?.metadata?.importedRevisionForm,\n preserveOnlyReason: revision.preserveOnlyReason,\n excerpt: preview.excerpt,\n detail: preview.detail,\n };\n }),\n };\n}\n\nfunction createRevisionStoreFromDocument(\n state: Pick<EditorState, \"document\">,\n): RevisionStore {\n return {\n version: \"revision-store/1\",\n revisions: Object.fromEntries(\n Object.values(state.document.review.revisions).map((revision) => [\n revision.changeId,\n {\n revisionId: revision.changeId,\n kind: revision.kind,\n anchor: revision.anchor,\n authorId: revision.authorId ?? \"unknown\",\n createdAt: revision.createdAt,\n status:\n revision.status === \"open\"\n ? \"active\"\n : revision.status,\n warningIds: [...(revision.warningIds ?? [])],\n metadata: {\n source: revision.metadata?.source ?? \"runtime\",\n preserveOnlyReason: revision.metadata?.preserveOnlyReason,\n importedRevisionForm: revision.metadata?.importedRevisionForm,\n originalRevisionType: revision.metadata?.originalRevisionType,\n ooxmlRevisionId: revision.metadata?.ooxmlRevisionId,\n },\n },\n ]),\n ),\n };\n}\n\nfunction listBlockExportReasons(\n report: InternalCompatibilityReport,\n): string[] {\n return [\n ...report.featureEntries\n .filter((entry) => entry.featureClass === \"unsupported-fatal\")\n .map((entry) => entry.message),\n ...report.errors\n .filter((error) => error.isFatal)\n .map((error) => error.message),\n ];\n}\n\nfunction describeRevisionPreview(\n revision: ReturnType<typeof createRevisionSidebarProjection>[\"revisions\"][number],\n anchor: InternalEditorAnchorProjection,\n plainText: string,\n): { excerpt: string; detail: string } {\n const { from, to } = toAnchorBounds(anchor);\n const excerpt = summarizeRevisionExcerpt(plainText, from, to, revision.label);\n\n if (revision.actionability === \"preserve-only\") {\n return {\n excerpt,\n detail:\n revision.preserveOnlyReason ??\n \"Visible for review, but this change remains preserve-only in the current runtime.\",\n };\n }\n\n if (revision.status === \"accepted\") {\n return {\n excerpt,\n detail: \"Accepted in the live review runtime and retained here for audit visibility.\",\n };\n }\n\n if (revision.status === \"rejected\") {\n return {\n excerpt,\n detail: \"Rejected in the live review runtime and retained here for audit visibility.\",\n };\n }\n\n return {\n excerpt,\n detail:\n revision.kind === \"deletion\"\n ? \"Deleted content stays reviewable here until it is accepted or rejected.\"\n : \"Runtime-backed change. Review it here or reopen the anchor in the canvas.\",\n };\n}\n\nfunction toAnchorBounds(anchor: InternalEditorAnchorProjection): { from: number; to: number } {\n switch (anchor.kind) {\n case \"range\":\n return {\n from: Math.min(anchor.range.from, anchor.range.to),\n to: Math.max(anchor.range.from, anchor.range.to),\n };\n case \"node\":\n return {\n from: anchor.at,\n to: anchor.at + 1,\n };\n case \"detached\":\n return {\n from: Math.min(anchor.lastKnownRange.from, anchor.lastKnownRange.to),\n to: Math.max(anchor.lastKnownRange.from, anchor.lastKnownRange.to),\n };\n }\n}\n\nfunction summarizeRevisionExcerpt(\n plainText: string,\n from: number,\n to: number,\n fallback: string,\n): string {\n const normalizedFrom = Math.max(0, Math.min(from, plainText.length));\n const normalizedTo = Math.max(normalizedFrom, Math.min(to, plainText.length));\n const collapsed = plainText\n .slice(normalizedFrom, normalizedTo)\n .replace(/\\s+/g, \" \")\n .trim();\n\n if (!collapsed) {\n return fallback;\n }\n\n return collapsed.length > 96 ? `${collapsed.slice(0, 93)}...` : collapsed;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n","export const CONTENT_TYPES_PATH = \"/[Content_Types].xml\";\nexport const PACKAGE_RELATIONSHIPS_PATH = \"/_rels/.rels\";\n\nexport type OpcCompressionMethod = \"store\" | \"deflate\";\nexport type OpcSurfaceKind = \"content\" | \"relationships\" | \"content-types\";\nexport type OpcRelationshipTargetMode = \"internal\" | \"external\";\n\nexport interface OpcRelationship {\n id: string;\n type: string;\n target: string;\n targetMode: OpcRelationshipTargetMode;\n}\n\nexport interface OpcPartManifestEntry {\n path: string;\n surfaceKind: OpcSurfaceKind;\n contentType: string | null;\n relationshipsPartPath: string | null;\n relationships: OpcRelationship[];\n compression: OpcCompressionMethod;\n byteLength: number;\n}\n\nexport interface OpcContentTypesManifest {\n defaults: Record<string, string>;\n overrides: Record<string, string>;\n}\n\nexport interface OpcPackageManifest {\n contentTypes: OpcContentTypesManifest;\n packageRelationships: OpcRelationship[];\n parts: OpcPartManifestEntry[];\n}\n\nexport interface OpcPackagePart {\n path: string;\n surfaceKind: OpcSurfaceKind;\n contentType: string | null;\n relationshipsPartPath: string | null;\n relationships: OpcRelationship[];\n compression: OpcCompressionMethod;\n bytes: Uint8Array;\n crc32: number;\n}\n\nexport function normalizePartPath(path: string): string {\n const normalized = path.replace(/\\\\/g, \"/\").trim();\n if (normalized.length === 0) {\n throw new Error(\"OPC part path must not be empty.\");\n }\n\n const withLeadingSlash = normalized.startsWith(\"/\") ? normalized : `/${normalized}`;\n const segments = withLeadingSlash.split(\"/\");\n const resolved: string[] = [];\n\n for (const segment of segments) {\n if (segment === \"\" || segment === \".\") {\n continue;\n }\n\n if (segment === \"..\") {\n if (resolved.length === 0) {\n throw new Error(`OPC part path escapes package root: ${path}`);\n }\n\n resolved.pop();\n continue;\n }\n\n resolved.push(segment);\n }\n\n return `/${resolved.join(\"/\")}`;\n}\n\nexport function getExtension(partPath: string): string {\n const normalized = normalizePartPath(partPath);\n const lastSlash = normalized.lastIndexOf(\"/\");\n const lastDot = normalized.lastIndexOf(\".\");\n if (lastDot <= lastSlash) {\n return \"\";\n }\n\n return normalized.slice(lastDot + 1).toLowerCase();\n}\n\nexport function getRelationshipsPartPath(partPath?: string | null): string {\n if (!partPath) {\n return PACKAGE_RELATIONSHIPS_PATH;\n }\n\n const normalized = normalizePartPath(partPath);\n const lastSlash = normalized.lastIndexOf(\"/\");\n const directory = lastSlash <= 0 ? \"\" : normalized.slice(0, lastSlash);\n const filename = normalized.slice(lastSlash + 1);\n return `${directory}/_rels/${filename}.rels`;\n}\n\nexport function getSourcePartPathFromRelationshipsPart(path: string): string | null {\n const normalized = normalizePartPath(path);\n if (normalized === PACKAGE_RELATIONSHIPS_PATH) {\n return null;\n }\n\n const marker = \"/_rels/\";\n const markerIndex = normalized.lastIndexOf(marker);\n if (markerIndex === -1 || !normalized.endsWith(\".rels\")) {\n throw new Error(`Invalid OPC relationships part path: ${path}`);\n }\n\n return normalizePartPath(\n `${normalized.slice(0, markerIndex)}${normalized.slice(markerIndex + marker.length, -\".rels\".length)}`,\n );\n}\n\nexport function resolveRelationshipTarget(\n sourcePartPath: string | null,\n relationship: Pick<OpcRelationship, \"target\" | \"targetMode\">,\n): string {\n if (relationship.targetMode === \"external\") {\n return relationship.target;\n }\n\n if (relationship.target.startsWith(\"/\")) {\n return normalizePartPath(relationship.target);\n }\n\n const basePath = sourcePartPath ? normalizePartPath(sourcePartPath) : \"/\";\n const baseDir = basePath === \"/\" ? \"/\" : basePath.slice(0, basePath.lastIndexOf(\"/\") + 1);\n return normalizePartPath(`${baseDir}${relationship.target}`);\n}\n\nexport function comparePartPaths(a: string, b: string): number {\n return normalizePartPath(a).localeCompare(normalizePartPath(b));\n}\n","import {\n CONTENT_TYPES_PATH,\n OpcCompressionMethod,\n OpcPackageManifest,\n OpcPackagePart,\n OpcRelationship,\n PACKAGE_RELATIONSHIPS_PATH,\n comparePartPaths,\n getExtension,\n getRelationshipsPartPath,\n normalizePartPath,\n} from \"../ooxml/part-manifest.ts\";\nimport type { OpcPackage } from \"./package-reader.ts\";\n\ninterface ZipEntryPayload {\n path: string;\n compression: OpcCompressionMethod;\n uncompressedBytes: Uint8Array;\n compressedBytes: Uint8Array;\n crc32: number;\n}\n\nexport function writeOpcPackage(input: OpcPackage | { manifest: OpcPackageManifest; parts: Map<string, OpcPackagePart> }): Uint8Array {\n const entries = collectZipEntries(input.manifest, input.parts);\n return buildZipArchive(entries);\n}\n\nfunction collectZipEntries(\n manifest: OpcPackageManifest,\n parts: Map<string, OpcPackagePart>,\n): ZipEntryPayload[] {\n const entries: ZipEntryPayload[] = [];\n const contentParts = [...parts.values()]\n .filter((part) => part.surfaceKind === \"content\")\n .sort((left, right) => comparePartPaths(left.path, right.path));\n\n entries.push(createZipPayload(CONTENT_TYPES_PATH, \"deflate\", encodeXml(buildContentTypesXml(manifest, contentParts))));\n entries.push(\n createZipPayload(\n PACKAGE_RELATIONSHIPS_PATH,\n \"deflate\",\n encodeXml(buildRelationshipsXml(manifest.packageRelationships)),\n ),\n );\n\n for (const part of contentParts) {\n entries.push(createZipPayload(part.path, part.compression, part.bytes));\n\n if (part.relationships.length > 0) {\n entries.push(\n createZipPayload(\n getRelationshipsPartPath(part.path),\n \"deflate\",\n encodeXml(buildRelationshipsXml(part.relationships)),\n ),\n );\n }\n }\n\n return entries.sort((left, right) => comparePartPaths(left.path, right.path));\n}\n\nfunction buildContentTypesXml(\n manifest: OpcPackageManifest,\n parts: OpcPackagePart[],\n): string {\n const defaults: Record<string, string> = {\n ...manifest.contentTypes.defaults,\n rels: manifest.contentTypes.defaults.rels ?? \"application/vnd.openxmlformats-package.relationships+xml\",\n xml: manifest.contentTypes.defaults.xml ?? \"application/xml\",\n };\n\n const overrides = { ...manifest.contentTypes.overrides };\n\n for (const part of parts) {\n if (!part.contentType) {\n throw new Error(`Cannot write OPC package: missing content type for ${part.path}.`);\n }\n\n const extension = getExtension(part.path);\n if (!extension) {\n overrides[part.path] = part.contentType;\n continue;\n }\n\n const defaultContentType = defaults[extension];\n if (!defaultContentType) {\n defaults[extension] = part.contentType;\n delete overrides[part.path];\n continue;\n }\n\n if (defaultContentType === part.contentType) {\n delete overrides[part.path];\n continue;\n }\n\n overrides[part.path] = part.contentType;\n }\n\n const defaultEntries = Object.entries(defaults).sort(([left], [right]) => left.localeCompare(right));\n const overrideEntries = Object.entries(overrides).sort(([left], [right]) => comparePartPaths(left, right));\n\n const defaultXml = defaultEntries\n .map(([extension, contentType]) => ` <Default Extension=\"${escapeXml(extension)}\" ContentType=\"${escapeXml(contentType)}\"/>`)\n .join(\"\\n\");\n const overrideXml = overrideEntries\n .map(([partName, contentType]) => ` <Override PartName=\"${escapeXml(partName)}\" ContentType=\"${escapeXml(contentType)}\"/>`)\n .join(\"\\n\");\n const body = [defaultXml, overrideXml].filter((value) => value.length > 0).join(\"\\n\");\n\n return [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n `<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">`,\n body,\n `</Types>`,\n ].join(\"\\n\");\n}\n\nfunction buildRelationshipsXml(relationships: OpcRelationship[]): string {\n const relationshipXml = [...relationships]\n .sort((left, right) => left.id.localeCompare(right.id))\n .map((relationship) => {\n const targetMode =\n relationship.targetMode === \"external\"\n ? ` TargetMode=\"External\"`\n : \"\";\n return ` <Relationship Id=\"${escapeXml(relationship.id)}\" Type=\"${escapeXml(relationship.type)}\" Target=\"${escapeXml(relationship.target)}\"${targetMode}/>`;\n })\n .join(\"\\n\");\n\n return [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n `<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">`,\n relationshipXml,\n `</Relationships>`,\n ].join(\"\\n\");\n}\n\nfunction createZipPayload(\n path: string,\n compression: OpcCompressionMethod,\n bytes: Uint8Array,\n): ZipEntryPayload {\n const normalizedPath = normalizePartPath(path).slice(1);\n const uncompressedBytes = new Uint8Array(bytes);\n // Keep export browser-safe by storing entries without Node-only compression primitives.\n const compressedBytes = uncompressedBytes;\n const effectiveCompression: OpcCompressionMethod = \"store\";\n\n return {\n path: normalizedPath,\n compression: effectiveCompression,\n uncompressedBytes,\n compressedBytes,\n crc32: calculateCrc32(uncompressedBytes),\n };\n}\n\nfunction buildZipArchive(entries: ZipEntryPayload[]): Uint8Array {\n const localChunks: Uint8Array[] = [];\n const centralChunks: Uint8Array[] = [];\n let localOffset = 0;\n\n for (const entry of entries) {\n const fileName = encodeUtf8(entry.path);\n const localHeader = createByteBuffer(30 + fileName.length);\n const localHeaderView = new DataView(localHeader.buffer);\n localHeaderView.setUint32(0, 0x04034b50, true);\n localHeaderView.setUint16(4, 20, true);\n localHeaderView.setUint16(6, 0, true);\n localHeaderView.setUint16(8, entry.compression === \"store\" ? 0 : 8, true);\n localHeaderView.setUint16(10, 0, true);\n localHeaderView.setUint16(12, 0, true);\n localHeaderView.setUint32(14, entry.crc32 >>> 0, true);\n localHeaderView.setUint32(18, entry.compressedBytes.byteLength, true);\n localHeaderView.setUint32(22, entry.uncompressedBytes.byteLength, true);\n localHeaderView.setUint16(26, fileName.length, true);\n localHeaderView.setUint16(28, 0, true);\n localHeader.set(fileName, 30);\n\n localChunks.push(localHeader, entry.compressedBytes);\n\n const centralHeader = createByteBuffer(46 + fileName.length);\n const centralHeaderView = new DataView(centralHeader.buffer);\n centralHeaderView.setUint32(0, 0x02014b50, true);\n centralHeaderView.setUint16(4, 20, true);\n centralHeaderView.setUint16(6, 20, true);\n centralHeaderView.setUint16(8, 0, true);\n centralHeaderView.setUint16(10, entry.compression === \"store\" ? 0 : 8, true);\n centralHeaderView.setUint16(12, 0, true);\n centralHeaderView.setUint16(14, 0, true);\n centralHeaderView.setUint32(16, entry.crc32 >>> 0, true);\n centralHeaderView.setUint32(20, entry.compressedBytes.byteLength, true);\n centralHeaderView.setUint32(24, entry.uncompressedBytes.byteLength, true);\n centralHeaderView.setUint16(28, fileName.length, true);\n centralHeaderView.setUint16(30, 0, true);\n centralHeaderView.setUint16(32, 0, true);\n centralHeaderView.setUint16(34, 0, true);\n centralHeaderView.setUint16(36, 0, true);\n centralHeaderView.setUint32(38, 0, true);\n centralHeaderView.setUint32(42, localOffset, true);\n centralHeader.set(fileName, 46);\n centralChunks.push(centralHeader);\n\n localOffset += localHeader.byteLength + entry.compressedBytes.byteLength;\n }\n\n const centralDirectoryOffset = localOffset;\n const centralDirectory = concatByteArrays(centralChunks);\n const endOfCentralDirectory = createByteBuffer(22);\n const endOfCentralDirectoryView = new DataView(endOfCentralDirectory.buffer);\n endOfCentralDirectoryView.setUint32(0, 0x06054b50, true);\n endOfCentralDirectoryView.setUint16(4, 0, true);\n endOfCentralDirectoryView.setUint16(6, 0, true);\n endOfCentralDirectoryView.setUint16(8, entries.length, true);\n endOfCentralDirectoryView.setUint16(10, entries.length, true);\n endOfCentralDirectoryView.setUint32(12, centralDirectory.byteLength, true);\n endOfCentralDirectoryView.setUint32(16, centralDirectoryOffset, true);\n endOfCentralDirectoryView.setUint16(20, 0, true);\n\n return concatByteArrays([...localChunks, centralDirectory, endOfCentralDirectory]);\n}\n\nfunction encodeXml(xml: string): Uint8Array {\n return encodeUtf8(xml);\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/'/g, \"&apos;\");\n}\n\nfunction calculateCrc32(bytes: Uint8Array): number {\n let crc = 0xffffffff;\n\n for (const byte of bytes) {\n crc ^= byte;\n for (let bit = 0; bit < 8; bit += 1) {\n const mask = -(crc & 1);\n crc = (crc >>> 1) ^ (0xedb88320 & mask);\n }\n }\n\n return (crc ^ 0xffffffff) >>> 0;\n}\n\nfunction createByteBuffer(size: number): Uint8Array {\n return new Uint8Array(size);\n}\n\nfunction concatByteArrays(chunks: readonly Uint8Array[]): Uint8Array {\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.byteLength, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return combined;\n}\n\nfunction encodeUtf8(value: string): Uint8Array {\n return new TextEncoder().encode(value);\n}\n\nexport { buildContentTypesXml, buildRelationshipsXml, calculateCrc32 };\n","import {\n getRelationshipsPartPath,\n type OpcPackageManifest,\n type OpcPackagePart,\n} from \"../ooxml/part-manifest.ts\";\nimport { writeOpcPackage } from \"./package-writer.ts\";\n\nexport const DOCX_MIME_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\";\nexport const DOCX_DOCUMENT_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\";\nexport const DOCX_DOCUMENT_RELATIONSHIP_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\";\n\ninterface WriteDocxPackageInput {\n documentXml: string;\n documentContentType?: string;\n packageRelationshipType?: string;\n}\n\nexport function writeDocxPackage(input: WriteDocxPackageInput): Uint8Array {\n const documentPath = \"/word/document.xml\";\n const contentType = input.documentContentType ?? DOCX_DOCUMENT_CONTENT_TYPE;\n const relationshipType =\n input.packageRelationshipType ?? DOCX_DOCUMENT_RELATIONSHIP_TYPE;\n const documentBytes = new TextEncoder().encode(input.documentXml);\n\n const documentPart: OpcPackagePart = {\n path: documentPath,\n surfaceKind: \"content\",\n contentType,\n relationshipsPartPath: getRelationshipsPartPath(documentPath),\n relationships: [],\n compression: \"deflate\",\n bytes: documentBytes,\n crc32: 0,\n };\n\n const manifest: OpcPackageManifest = {\n contentTypes: {\n defaults: {\n rels: \"application/vnd.openxmlformats-package.relationships+xml\",\n xml: \"application/xml\",\n },\n overrides: {\n [documentPath]: contentType,\n },\n },\n packageRelationships: [\n {\n id: \"rId1\",\n type: relationshipType,\n target: \"word/document.xml\",\n targetMode: \"internal\",\n },\n ],\n parts: [\n {\n path: documentPart.path,\n surfaceKind: documentPart.surfaceKind,\n contentType: documentPart.contentType,\n relationshipsPartPath: documentPart.relationshipsPartPath,\n relationships: documentPart.relationships,\n compression: documentPart.compression,\n byteLength: documentPart.bytes.byteLength,\n },\n ],\n };\n\n return writeOpcPackage({\n manifest,\n parts: new Map([[documentPart.path, documentPart]]),\n });\n}\n","import { inflateRawSync } from \"node:zlib\";\n\nimport {\n CONTENT_TYPES_PATH,\n OpcCompressionMethod,\n OpcPackageManifest,\n OpcPackagePart,\n OpcPartManifestEntry,\n OpcRelationship,\n PACKAGE_RELATIONSHIPS_PATH,\n getRelationshipsPartPath,\n getSourcePartPathFromRelationshipsPart,\n normalizePartPath,\n} from \"../ooxml/part-manifest.ts\";\n\ninterface ZipCentralDirectoryEntry {\n path: string;\n compression: OpcCompressionMethod;\n crc32: number;\n compressedSize: number;\n uncompressedSize: number;\n localHeaderOffset: number;\n generalPurposeBitFlag: number;\n}\n\nexport interface OpcPackage {\n manifest: OpcPackageManifest;\n parts: Map<string, OpcPackagePart>;\n sourceByteLength: number;\n}\n\nconst EOCD_SIGNATURE = 0x06054b50;\nconst CENTRAL_DIRECTORY_SIGNATURE = 0x02014b50;\nconst LOCAL_FILE_HEADER_SIGNATURE = 0x04034b50;\n\nexport function readOpcPackage(source: Uint8Array | ArrayBuffer): OpcPackage {\n const bytes = source instanceof Uint8Array ? source : new Uint8Array(source);\n const archive = Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const centralDirectory = readCentralDirectory(archive);\n const parts = new Map<string, OpcPackagePart>();\n\n for (const entry of centralDirectory) {\n if (entry.path.endsWith(\"/\")) {\n continue;\n }\n\n const storedBytes = readZipEntry(archive, entry);\n const normalizedPath = normalizePartPath(entry.path);\n const surfaceKind = getSurfaceKind(normalizedPath);\n\n parts.set(normalizedPath, {\n path: normalizedPath,\n surfaceKind,\n contentType: null,\n relationshipsPartPath:\n surfaceKind === \"content\" ? getRelationshipsPartPath(normalizedPath) : null,\n relationships: [],\n compression: entry.compression,\n bytes: storedBytes,\n crc32: entry.crc32 >>> 0,\n });\n }\n\n const contentTypesPart = parts.get(CONTENT_TYPES_PATH);\n if (!contentTypesPart) {\n throw new Error(\"Invalid OPC package: missing /[Content_Types].xml.\");\n }\n\n const contentTypes = parseContentTypesXml(decodeXml(contentTypesPart.bytes));\n const packageRelationshipsPart = parts.get(PACKAGE_RELATIONSHIPS_PATH);\n const packageRelationships = packageRelationshipsPart\n ? parseRelationshipsXml(decodeXml(packageRelationshipsPart.bytes))\n : [];\n\n const manifestParts: OpcPartManifestEntry[] = [];\n\n for (const [path, part] of [...parts.entries()].sort(([left], [right]) => left.localeCompare(right))) {\n const contentType = resolveContentType(path, contentTypes);\n const relationshipsPartPath = part.surfaceKind === \"content\" ? getRelationshipsPartPath(path) : null;\n const relationshipsPart = relationshipsPartPath ? parts.get(relationshipsPartPath) : undefined;\n const relationships = relationshipsPart\n ? parseRelationshipsXml(decodeXml(relationshipsPart.bytes))\n : [];\n\n const nextPart: OpcPackagePart = {\n ...part,\n contentType,\n relationshipsPartPath,\n relationships,\n };\n\n parts.set(path, nextPart);\n manifestParts.push({\n path,\n surfaceKind: nextPart.surfaceKind,\n contentType,\n relationshipsPartPath,\n relationships,\n compression: nextPart.compression,\n byteLength: nextPart.bytes.byteLength,\n });\n }\n\n return {\n manifest: {\n contentTypes,\n packageRelationships,\n parts: manifestParts,\n },\n parts,\n sourceByteLength: bytes.byteLength,\n };\n}\n\nfunction readCentralDirectory(archive: Buffer): ZipCentralDirectoryEntry[] {\n const eocdOffset = findEndOfCentralDirectory(archive);\n const entryCount = archive.readUInt16LE(eocdOffset + 10);\n const centralDirectoryOffset = archive.readUInt32LE(eocdOffset + 16);\n const entries: ZipCentralDirectoryEntry[] = [];\n let offset = centralDirectoryOffset;\n\n for (let index = 0; index < entryCount; index += 1) {\n const signature = archive.readUInt32LE(offset);\n if (signature !== CENTRAL_DIRECTORY_SIGNATURE) {\n throw new Error(`Invalid ZIP central directory signature at offset ${offset}.`);\n }\n\n const generalPurposeBitFlag = archive.readUInt16LE(offset + 8);\n const compressionMethod = archive.readUInt16LE(offset + 10);\n const crc32 = archive.readUInt32LE(offset + 16);\n const compressedSize = archive.readUInt32LE(offset + 20);\n const uncompressedSize = archive.readUInt32LE(offset + 24);\n const fileNameLength = archive.readUInt16LE(offset + 28);\n const extraFieldLength = archive.readUInt16LE(offset + 30);\n const fileCommentLength = archive.readUInt16LE(offset + 32);\n const localHeaderOffset = archive.readUInt32LE(offset + 42);\n const fileNameOffset = offset + 46;\n const fileName = archive.subarray(fileNameOffset, fileNameOffset + fileNameLength).toString(\"utf8\");\n\n entries.push({\n path: fileName,\n compression: mapCompressionMethod(compressionMethod),\n crc32,\n compressedSize,\n uncompressedSize,\n localHeaderOffset,\n generalPurposeBitFlag,\n });\n\n offset += 46 + fileNameLength + extraFieldLength + fileCommentLength;\n }\n\n return entries;\n}\n\nfunction findEndOfCentralDirectory(archive: Buffer): number {\n const minimumEocdSize = 22;\n const maximumCommentSize = 0xffff;\n const searchStart = Math.max(0, archive.length - minimumEocdSize - maximumCommentSize);\n\n for (let offset = archive.length - minimumEocdSize; offset >= searchStart; offset -= 1) {\n if (archive.readUInt32LE(offset) === EOCD_SIGNATURE) {\n return offset;\n }\n }\n\n throw new Error(\"Invalid ZIP archive: end of central directory not found.\");\n}\n\nfunction readZipEntry(archive: Buffer, entry: ZipCentralDirectoryEntry): Uint8Array {\n const headerOffset = entry.localHeaderOffset;\n const signature = archive.readUInt32LE(headerOffset);\n if (signature !== LOCAL_FILE_HEADER_SIGNATURE) {\n throw new Error(`Invalid ZIP local file header signature at offset ${headerOffset}.`);\n }\n\n const fileNameLength = archive.readUInt16LE(headerOffset + 26);\n const extraFieldLength = archive.readUInt16LE(headerOffset + 28);\n const dataOffset = headerOffset + 30 + fileNameLength + extraFieldLength;\n const compressed = archive.subarray(dataOffset, dataOffset + entry.compressedSize);\n\n switch (entry.compression) {\n case \"store\":\n return new Uint8Array(compressed);\n case \"deflate\":\n return new Uint8Array(inflateRawSync(compressed));\n default:\n throw new Error(`Unsupported ZIP compression for ${entry.path}.`);\n }\n}\n\nfunction mapCompressionMethod(method: number): OpcCompressionMethod {\n switch (method) {\n case 0:\n return \"store\";\n case 8:\n return \"deflate\";\n default:\n throw new Error(`Unsupported ZIP compression method ${method}.`);\n }\n}\n\nfunction getSurfaceKind(path: string): OpcPartManifestEntry[\"surfaceKind\"] {\n if (path === CONTENT_TYPES_PATH) {\n return \"content-types\";\n }\n\n if (path === PACKAGE_RELATIONSHIPS_PATH || path.includes(\"/_rels/\")) {\n return \"relationships\";\n }\n\n return \"content\";\n}\n\nfunction decodeXml(bytes: Uint8Array): string {\n return Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength).toString(\"utf8\");\n}\n\nfunction parseContentTypesXml(xml: string): OpcPackageManifest[\"contentTypes\"] {\n const defaults: Record<string, string> = {};\n const overrides: Record<string, string> = {};\n\n for (const attributes of findTagAttributes(xml, \"Default\")) {\n const extension = attributes.Extension?.toLowerCase();\n const contentType = attributes.ContentType;\n if (!extension || !contentType) {\n continue;\n }\n\n defaults[extension] = contentType;\n }\n\n for (const attributes of findTagAttributes(xml, \"Override\")) {\n const partName = attributes.PartName;\n const contentType = attributes.ContentType;\n if (!partName || !contentType) {\n continue;\n }\n\n overrides[normalizePartPath(partName)] = contentType;\n }\n\n return { defaults, overrides };\n}\n\nfunction parseRelationshipsXml(xml: string): OpcRelationship[] {\n const relationships: OpcRelationship[] = [];\n\n for (const attributes of findTagAttributes(xml, \"Relationship\")) {\n const id = attributes.Id;\n const type = attributes.Type;\n const target = attributes.Target;\n if (!id || !type || !target) {\n continue;\n }\n\n relationships.push({\n id,\n type,\n target,\n targetMode: attributes.TargetMode === \"External\" ? \"external\" : \"internal\",\n });\n }\n\n return relationships;\n}\n\nfunction findTagAttributes(xml: string, tagName: string): Record<string, string>[] {\n const tagPattern = new RegExp(`<${tagName}\\\\b([^>]*)\\\\/?>`, \"g\");\n const results: Record<string, string>[] = [];\n let tagMatch: RegExpExecArray | null = tagPattern.exec(xml);\n\n while (tagMatch) {\n results.push(parseAttributes(tagMatch[1] ?? \"\"));\n tagMatch = tagPattern.exec(xml);\n }\n\n return results;\n}\n\nfunction parseAttributes(rawAttributes: string): Record<string, string> {\n const attributes: Record<string, string> = {};\n const attributePattern = /([A-Za-z_][\\w:.-]*)=\"([^\"]*)\"/g;\n let match: RegExpExecArray | null = attributePattern.exec(rawAttributes);\n\n while (match) {\n attributes[match[1]] = decodeXmlEntities(match[2]);\n match = attributePattern.exec(rawAttributes);\n }\n\n return attributes;\n}\n\nfunction decodeXmlEntities(value: string): string {\n return value\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&amp;/g, \"&\");\n}\n\nfunction resolveContentType(\n path: string,\n contentTypes: OpcPackageManifest[\"contentTypes\"],\n): string | null {\n if (path === CONTENT_TYPES_PATH) {\n return \"application/xml\";\n }\n\n const override = contentTypes.overrides[path];\n if (override) {\n return override;\n }\n\n const extension = path.includes(\".\") ? path.slice(path.lastIndexOf(\".\") + 1).toLowerCase() : \"\";\n return extension ? contentTypes.defaults[extension] ?? null : null;\n}\n\nexport { parseContentTypesXml, parseRelationshipsXml };\n","import type { OpcRelationship } from \"./part-manifest.ts\";\nimport { normalizePartPath, resolveRelationshipTarget } from \"./part-manifest.ts\";\n\nexport interface InlineMediaPart {\n path: string;\n contentType: string;\n}\n\nexport interface ParsedInlineMedia {\n type: \"image\";\n mediaId: string;\n relationshipId: string;\n packagePartName: string;\n contentType?: string;\n filename: string;\n altText?: string;\n display?: \"inline\" | \"floating\";\n floating?: {\n horizontalPosition?: {\n relativeFrom?: string;\n align?: string;\n offset?: number;\n };\n verticalPosition?: {\n relativeFrom?: string;\n align?: string;\n offset?: number;\n };\n wrap?: \"none\" | \"square\" | \"tight\" | \"through\" | \"topAndBottom\";\n behindDoc?: boolean;\n layoutInCell?: boolean;\n allowOverlap?: boolean;\n };\n}\n\ninterface XmlElementNode {\n type: \"element\";\n name: string;\n attributes: Record<string, string>;\n children: XmlNode[];\n}\n\ninterface XmlTextNode {\n type: \"text\";\n text: string;\n}\n\ntype XmlNode = XmlElementNode | XmlTextNode;\n\nexport function parseInlineMediaXml(\n xml: string,\n relationships: readonly OpcRelationship[],\n mediaParts: ReadonlyMap<string, InlineMediaPart> = new Map(),\n sourcePartPath = \"/word/document.xml\",\n): ParsedInlineMedia[] {\n const root = parseXml(xml);\n const relationshipMap = new Map(relationships.map((relationship) => [relationship.id, relationship]));\n const drawings = findDescendants(root, \"drawing\");\n const media: ParsedInlineMedia[] = [];\n\n for (const drawing of drawings) {\n const inline = findFirstDescendant(drawing, \"inline\");\n const anchor = findFirstDescendant(drawing, \"anchor\");\n const container = anchor ?? inline;\n const blip = findFirstDescendant(drawing, \"blip\");\n if (!container || !blip) {\n continue;\n }\n\n const relationshipId = blip.attributes[\"r:embed\"] ?? blip.attributes.embed;\n if (!relationshipId) {\n continue;\n }\n\n const relationship = relationshipMap.get(relationshipId);\n if (!relationship || !relationship.type.endsWith(\"/image\")) {\n continue;\n }\n\n const packagePartName = normalizePartPath(\n resolveRelationshipTarget(sourcePartPath, relationship),\n );\n const mediaPart = mediaParts.get(packagePartName);\n const docProperties = findFirstDescendant(container, \"docPr\");\n const altText = readAltText(docProperties);\n const floating = anchor ? readFloatingProperties(anchor) : undefined;\n\n media.push({\n type: \"image\",\n mediaId: `media:${packagePartName.slice(1)}`,\n relationshipId,\n packagePartName,\n ...(mediaPart ? { contentType: mediaPart.contentType } : {}),\n filename: packagePartName.slice(packagePartName.lastIndexOf(\"/\") + 1),\n ...(altText ? { altText } : {}),\n ...(anchor ? { display: \"floating\" as const } : {}),\n ...(floating ? { floating } : {}),\n });\n }\n\n return media;\n}\n\nfunction readFloatingProperties(\n node: XmlElementNode,\n): NonNullable<ParsedInlineMedia[\"floating\"]> | undefined {\n const horizontalPosition = findFirstDescendant(node, \"positionH\");\n const verticalPosition = findFirstDescendant(node, \"positionV\");\n const wrap =\n findFirstDescendant(node, \"wrapNone\") ??\n findFirstDescendant(node, \"wrapSquare\") ??\n findFirstDescendant(node, \"wrapTight\") ??\n findFirstDescendant(node, \"wrapThrough\") ??\n findFirstDescendant(node, \"wrapTopAndBottom\");\n\n const properties: NonNullable<ParsedInlineMedia[\"floating\"]> = {};\n const horizontalAxis = readAxisPosition(horizontalPosition);\n const verticalAxis = readAxisPosition(verticalPosition);\n if (horizontalAxis) {\n properties.horizontalPosition = horizontalAxis;\n }\n if (verticalAxis) {\n properties.verticalPosition = verticalAxis;\n }\n if (wrap) {\n const wrapName = localName(wrap.name);\n properties.wrap =\n wrapName === \"wrapSquare\"\n ? \"square\"\n : wrapName === \"wrapTight\"\n ? \"tight\"\n : wrapName === \"wrapThrough\"\n ? \"through\"\n : wrapName === \"wrapTopAndBottom\"\n ? \"topAndBottom\"\n : \"none\";\n }\n\n properties.behindDoc = readBooleanAttribute(node, \"behindDoc\");\n properties.layoutInCell = readBooleanAttribute(node, \"layoutInCell\");\n properties.allowOverlap = readBooleanAttribute(node, \"allowOverlap\");\n\n return Object.values(properties).some((value) => value !== undefined) ? properties : undefined;\n}\n\nfunction readAxisPosition(\n node: XmlElementNode | undefined,\n): NonNullable<NonNullable<ParsedInlineMedia[\"floating\"]>[\"horizontalPosition\"]> | undefined {\n if (!node) {\n return undefined;\n }\n\n const align = findFirstDescendant(node, \"align\");\n const posOffset = findFirstDescendant(node, \"posOffset\");\n const position: NonNullable<NonNullable<ParsedInlineMedia[\"floating\"]>[\"horizontalPosition\"]> = {\n ...(readOptionalAttribute(node, \"relativeFrom\") ? { relativeFrom: readOptionalAttribute(node, \"relativeFrom\") } : {}),\n ...(align && extractText(align).trim() ? { align: extractText(align).trim() } : {}),\n };\n\n if (posOffset) {\n const offset = Number.parseInt(extractText(posOffset).trim(), 10);\n if (Number.isFinite(offset)) {\n position.offset = offset;\n }\n }\n\n return Object.keys(position).length > 0 ? position : undefined;\n}\n\nfunction readAltText(node: XmlElementNode | undefined): string | undefined {\n if (!node) {\n return undefined;\n }\n\n const description = node.attributes.descr?.trim();\n if (description) {\n return description;\n }\n\n const title = node.attributes.title?.trim();\n if (title) {\n return title;\n }\n\n const name = node.attributes.name?.trim();\n return name || undefined;\n}\n\nfunction findFirstDescendant(node: XmlElementNode, local: string): XmlElementNode | undefined {\n for (const child of node.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n if (localName(child.name) === local) {\n return child;\n }\n\n const nested = findFirstDescendant(child, local);\n if (nested) {\n return nested;\n }\n }\n\n return undefined;\n}\n\nfunction findDescendants(node: XmlElementNode, local: string): XmlElementNode[] {\n const results: XmlElementNode[] = [];\n\n for (const child of node.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n if (localName(child.name) === local) {\n results.push(child);\n }\n\n results.push(...findDescendants(child, local));\n }\n\n return results;\n}\n\nfunction localName(name: string): string {\n const separatorIndex = name.indexOf(\":\");\n return separatorIndex >= 0 ? name.slice(separatorIndex + 1) : name;\n}\n\nfunction extractText(node: XmlElementNode): string {\n return node.children.map((child) => child.type === \"text\" ? child.text : extractText(child)).join(\"\");\n}\n\nfunction readOptionalAttribute(node: XmlElementNode, name: string): string | undefined {\n return node.attributes[`wp:${name}`]\n ?? node.attributes[`w:${name}`]\n ?? node.attributes[name];\n}\n\nfunction readBooleanAttribute(node: XmlElementNode, name: string): boolean | undefined {\n const value = readOptionalAttribute(node, name);\n if (value === undefined) {\n return undefined;\n }\n return value !== \"0\" && value !== \"false\" && value !== \"off\";\n}\n\nfunction parseXml(xml: string): XmlElementNode {\n const root: XmlElementNode = {\n type: \"element\",\n name: \"__root__\",\n attributes: {},\n children: [],\n };\n const stack: XmlElementNode[] = [root];\n let cursor = 0;\n\n while (cursor < xml.length) {\n if (xml.startsWith(\"<!--\", cursor)) {\n const end = xml.indexOf(\"-->\", cursor);\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<?\", cursor)) {\n const end = xml.indexOf(\"?>\", cursor);\n cursor = end >= 0 ? end + 2 : xml.length;\n continue;\n }\n\n if (xml[cursor] !== \"<\") {\n const nextTag = xml.indexOf(\"<\", cursor);\n const end = nextTag >= 0 ? nextTag : xml.length;\n const text = decodeXmlEntities(xml.slice(cursor, end));\n if (text.length > 0) {\n stack[stack.length - 1]?.children.push({ type: \"text\", text });\n }\n cursor = end;\n continue;\n }\n\n if (xml[cursor + 1] === \"/\") {\n const end = xml.indexOf(\">\", cursor);\n const current = stack.pop();\n const name = xml.slice(cursor + 2, end).trim();\n if (!current || localName(current.name) !== localName(name)) {\n throw new Error(`Malformed XML: unexpected closing tag </${name}>.`);\n }\n cursor = end + 1;\n continue;\n }\n\n const tagEnd = findTagEnd(xml, cursor);\n const tagBody = xml.slice(cursor + 1, tagEnd);\n const selfClosing = /\\/\\s*$/.test(tagBody);\n const { name, attributes } = parseTag(tagBody.replace(/\\/\\s*$/, \"\").trim());\n const element: XmlElementNode = {\n type: \"element\",\n name,\n attributes,\n children: [],\n };\n stack[stack.length - 1]?.children.push(element);\n\n if (!selfClosing) {\n stack.push(element);\n }\n\n cursor = tagEnd + 1;\n }\n\n if (stack.length !== 1) {\n throw new Error(\"Malformed XML: unclosed element.\");\n }\n\n return root;\n}\n\nfunction parseTag(tagBody: string): { name: string; attributes: Record<string, string> } {\n let cursor = 0;\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n\n const nameStart = cursor;\n while (cursor < tagBody.length && !/\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n const name = tagBody.slice(nameStart, cursor);\n const attributes: Record<string, string> = {};\n\n while (cursor < tagBody.length) {\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n if (cursor >= tagBody.length) {\n break;\n }\n\n const keyStart = cursor;\n while (cursor < tagBody.length && !/[\\s=]/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n const key = tagBody.slice(keyStart, cursor);\n\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n\n if (tagBody[cursor] !== \"=\") {\n attributes[key] = \"\";\n continue;\n }\n cursor += 1;\n\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n\n const quote = tagBody[cursor];\n if (quote !== `\"` && quote !== `'`) {\n throw new Error(`Malformed XML attribute ${key}.`);\n }\n cursor += 1;\n\n const valueStart = cursor;\n while (cursor < tagBody.length && tagBody[cursor] !== quote) {\n cursor += 1;\n }\n attributes[key] = decodeXmlEntities(tagBody.slice(valueStart, cursor));\n cursor += 1;\n }\n\n return { name, attributes };\n}\n\nfunction findTagEnd(xml: string, start: number): number {\n let cursor = start + 1;\n let quote: string | null = null;\n\n while (cursor < xml.length) {\n const current = xml[cursor];\n if (quote) {\n if (current === quote) {\n quote = null;\n }\n cursor += 1;\n continue;\n }\n\n if (current === `\"` || current === `'`) {\n quote = current;\n cursor += 1;\n continue;\n }\n\n if (current === \">\") {\n return cursor;\n }\n\n cursor += 1;\n }\n\n throw new Error(\"Malformed XML: missing >.\");\n}\n\nfunction decodeXmlEntities(value: string): string {\n return value.replace(/&(#x[0-9a-fA-F]+|#\\d+|amp|lt|gt|quot|apos);/g, (match, entity) => {\n switch (entity) {\n case \"amp\":\n return \"&\";\n case \"lt\":\n return \"<\";\n case \"gt\":\n return \">\";\n case \"quot\":\n return `\"`;\n case \"apos\":\n return \"'\";\n default:\n if (entity.startsWith(\"#x\")) {\n return String.fromCodePoint(Number.parseInt(entity.slice(2), 16));\n }\n if (entity.startsWith(\"#\")) {\n return String.fromCodePoint(Number.parseInt(entity.slice(1), 10));\n }\n return match;\n }\n });\n}\n","import type { NumberingCatalog, NumberingLevelDefinition, NumberingLevelOverride } from \"../../model/canonical-document.ts\";\n\nexport interface ParsedParagraphNumberingReference {\n paragraphIndex: number;\n numberingInstanceId: string;\n level: number;\n}\n\ninterface XmlElementNode {\n type: \"element\";\n name: string;\n attributes: Record<string, string>;\n children: XmlNode[];\n}\n\ninterface XmlTextNode {\n type: \"text\";\n text: string;\n}\n\ntype XmlNode = XmlElementNode | XmlTextNode;\n\nexport function parseNumberingXml(xml: string): NumberingCatalog {\n const root = parseXml(xml);\n const numberingElement = findChildElement(root, \"numbering\");\n const abstractDefinitions: NumberingCatalog[\"abstractDefinitions\"] = {};\n const instances: NumberingCatalog[\"instances\"] = {};\n\n for (const child of numberingElement.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n switch (localName(child.name)) {\n case \"abstractNum\": {\n const rawId = child.attributes[\"w:abstractNumId\"] ?? child.attributes.abstractNumId;\n if (!rawId) {\n continue;\n }\n\n const abstractNumberingId = toCanonicalAbstractNumberingId(rawId);\n abstractDefinitions[abstractNumberingId] = {\n abstractNumberingId,\n levels: readLevels(child),\n };\n break;\n }\n case \"num\": {\n const rawId = child.attributes[\"w:numId\"] ?? child.attributes.numId;\n const abstractReference = findChildElementOptional(child, \"abstractNumId\");\n const rawAbstractId =\n abstractReference?.attributes[\"w:val\"] ?? abstractReference?.attributes.val;\n\n if (!rawId || !rawAbstractId) {\n continue;\n }\n\n const numberingInstanceId = toCanonicalNumberingInstanceId(rawId);\n instances[numberingInstanceId] = {\n numberingInstanceId,\n abstractNumberingId: toCanonicalAbstractNumberingId(rawAbstractId),\n overrides: readOverrides(child),\n };\n break;\n }\n }\n }\n\n return {\n abstractDefinitions,\n instances,\n };\n}\n\nexport function parseParagraphNumberingReferences(\n documentXml: string,\n): ParsedParagraphNumberingReference[] {\n const root = parseXml(documentXml);\n const documentElement = findChildElement(root, \"document\");\n const bodyElement = findChildElement(documentElement, \"body\");\n const references: ParsedParagraphNumberingReference[] = [];\n let paragraphIndex = 0;\n\n for (const child of bodyElement.children) {\n if (child.type !== \"element\" || localName(child.name) !== \"p\") {\n continue;\n }\n\n const paragraphProperties = findChildElementOptional(child, \"pPr\");\n const numberingProperties = paragraphProperties\n ? findChildElementOptional(paragraphProperties, \"numPr\")\n : undefined;\n\n if (numberingProperties) {\n const levelNode = findChildElementOptional(numberingProperties, \"ilvl\");\n const instanceNode = findChildElementOptional(numberingProperties, \"numId\");\n const rawLevel = levelNode?.attributes[\"w:val\"] ?? levelNode?.attributes.val;\n const rawInstanceId = instanceNode?.attributes[\"w:val\"] ?? instanceNode?.attributes.val;\n\n if (rawLevel !== undefined && rawInstanceId) {\n const level = parseInteger(rawLevel);\n if (level !== undefined) {\n references.push({\n paragraphIndex,\n numberingInstanceId: toCanonicalNumberingInstanceId(rawInstanceId),\n level,\n });\n }\n }\n }\n\n paragraphIndex += 1;\n }\n\n return references;\n}\n\nexport function toCanonicalAbstractNumberingId(value: string): string {\n return value.startsWith(\"abstract-num:\") ? value : `abstract-num:${value}`;\n}\n\nexport function toCanonicalNumberingInstanceId(value: string): string {\n return value.startsWith(\"num:\") ? value : `num:${value}`;\n}\n\nfunction readLevels(abstractNode: XmlElementNode): NumberingLevelDefinition[] {\n const levels: NumberingLevelDefinition[] = [];\n\n for (const child of abstractNode.children) {\n if (child.type !== \"element\" || localName(child.name) !== \"lvl\") {\n continue;\n }\n\n const rawLevel = child.attributes[\"w:ilvl\"] ?? child.attributes.ilvl;\n const level = rawLevel === undefined ? undefined : parseInteger(rawLevel);\n if (level === undefined) {\n continue;\n }\n\n const startNode = findChildElementOptional(child, \"start\");\n const formatNode = findChildElementOptional(child, \"numFmt\");\n const textNode = findChildElementOptional(child, \"lvlText\");\n const paragraphStyleNode = findChildElementOptional(child, \"pStyle\");\n const rawStart = startNode?.attributes[\"w:val\"] ?? startNode?.attributes.val;\n const startAt = rawStart === undefined ? undefined : parseInteger(rawStart);\n const format = formatNode?.attributes[\"w:val\"] ?? formatNode?.attributes.val ?? \"decimal\";\n const text = textNode?.attributes[\"w:val\"] ?? textNode?.attributes.val ?? `%${level + 1}.`;\n const paragraphStyleId =\n paragraphStyleNode?.attributes[\"w:val\"] ?? paragraphStyleNode?.attributes.val;\n\n levels.push({\n level,\n format,\n text,\n ...(startAt !== undefined ? { startAt } : {}),\n ...(paragraphStyleId ? { paragraphStyleId } : {}),\n });\n }\n\n return levels.sort((left, right) => left.level - right.level);\n}\n\nfunction readOverrides(numNode: XmlElementNode): NumberingLevelOverride[] {\n const overrides: NumberingLevelOverride[] = [];\n\n for (const child of numNode.children) {\n if (child.type !== \"element\" || localName(child.name) !== \"lvlOverride\") {\n continue;\n }\n\n const rawLevel = child.attributes[\"w:ilvl\"] ?? child.attributes.ilvl;\n const level = rawLevel === undefined ? undefined : parseInteger(rawLevel);\n if (level === undefined) {\n continue;\n }\n\n const startOverrideNode = findChildElementOptional(child, \"startOverride\");\n const rawStart = startOverrideNode?.attributes[\"w:val\"] ?? startOverrideNode?.attributes.val;\n const startAt = rawStart === undefined ? undefined : parseInteger(rawStart);\n\n overrides.push({\n level,\n ...(startAt !== undefined ? { startAt } : {}),\n });\n }\n\n return overrides.sort((left, right) => left.level - right.level);\n}\n\nfunction findChildElement(node: XmlElementNode, childLocalName: string): XmlElementNode {\n const child = findChildElementOptional(node, childLocalName);\n if (!child) {\n throw new Error(`Expected <${childLocalName}> element in numbering XML.`);\n }\n\n return child;\n}\n\nfunction findChildElementOptional(\n node: XmlElementNode,\n childLocalName: string,\n): XmlElementNode | undefined {\n return node.children.find(\n (entry): entry is XmlElementNode =>\n entry.type === \"element\" && localName(entry.name) === childLocalName,\n );\n}\n\nfunction localName(name: string): string {\n const separatorIndex = name.indexOf(\":\");\n return separatorIndex >= 0 ? name.slice(separatorIndex + 1) : name;\n}\n\nfunction parseInteger(value: string): number | undefined {\n if (!/^-?\\d+$/.test(value)) {\n return undefined;\n }\n\n return Number.parseInt(value, 10);\n}\n\nfunction parseXml(xml: string): XmlElementNode {\n const root: XmlElementNode = {\n type: \"element\",\n name: \"__root__\",\n attributes: {},\n children: [],\n };\n const stack: XmlElementNode[] = [root];\n let cursor = 0;\n\n while (cursor < xml.length) {\n if (xml.startsWith(\"<!--\", cursor)) {\n const end = xml.indexOf(\"-->\", cursor);\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<?\", cursor)) {\n const end = xml.indexOf(\"?>\", cursor);\n cursor = end >= 0 ? end + 2 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<![CDATA[\", cursor)) {\n const end = xml.indexOf(\"]]>\", cursor);\n const textEnd = end >= 0 ? end : xml.length;\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text: xml.slice(cursor + 9, textEnd),\n });\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n if (xml[cursor] !== \"<\") {\n const nextTag = xml.indexOf(\"<\", cursor);\n const end = nextTag >= 0 ? nextTag : xml.length;\n const text = decodeXmlEntities(xml.slice(cursor, end));\n if (text.length > 0) {\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text,\n });\n }\n cursor = end;\n continue;\n }\n\n if (xml[cursor + 1] === \"/\") {\n const end = xml.indexOf(\">\", cursor);\n if (end < 0) {\n throw new Error(\"Malformed XML: missing closing >.\");\n }\n\n const name = xml.slice(cursor + 2, end).trim();\n const current = stack.pop();\n if (!current || localName(current.name) !== localName(name)) {\n throw new Error(`Malformed XML: unexpected closing tag </${name}>.`);\n }\n\n cursor = end + 1;\n continue;\n }\n\n const tagEnd = findTagEnd(xml, cursor);\n const tagBody = xml.slice(cursor + 1, tagEnd);\n const selfClosing = /\\/\\s*$/.test(tagBody);\n const { name, attributes } = parseTag(tagBody.replace(/\\/\\s*$/, \"\").trim());\n const element: XmlElementNode = {\n type: \"element\",\n name,\n attributes,\n children: [],\n };\n stack[stack.length - 1]?.children.push(element);\n\n if (!selfClosing) {\n stack.push(element);\n }\n\n cursor = tagEnd + 1;\n }\n\n if (stack.length !== 1) {\n throw new Error(\"Malformed XML: unclosed element.\");\n }\n\n return root;\n}\n\nfunction parseTag(tagBody: string): { name: string; attributes: Record<string, string> } {\n let cursor = 0;\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n\n const nameStart = cursor;\n while (cursor < tagBody.length && !/\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n\n const name = tagBody.slice(nameStart, cursor);\n const attributes: Record<string, string> = {};\n\n while (cursor < tagBody.length) {\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n if (cursor >= tagBody.length) {\n break;\n }\n\n const keyStart = cursor;\n while (cursor < tagBody.length && !/[\\s=]/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n const key = tagBody.slice(keyStart, cursor);\n\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n\n if (tagBody[cursor] !== \"=\") {\n attributes[key] = \"\";\n continue;\n }\n cursor += 1;\n\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n\n const quote = tagBody[cursor];\n if (quote !== `\"` && quote !== `'`) {\n throw new Error(`Malformed XML attribute ${key}.`);\n }\n cursor += 1;\n\n const valueStart = cursor;\n while (cursor < tagBody.length && tagBody[cursor] !== quote) {\n cursor += 1;\n }\n const rawValue = tagBody.slice(valueStart, cursor);\n attributes[key] = decodeXmlEntities(rawValue);\n cursor += 1;\n }\n\n return { name, attributes };\n}\n\nfunction findTagEnd(xml: string, start: number): number {\n let cursor = start + 1;\n let quote: string | null = null;\n\n while (cursor < xml.length) {\n const current = xml[cursor];\n if (quote) {\n if (current === quote) {\n quote = null;\n }\n cursor += 1;\n continue;\n }\n\n if (current === `\"` || current === `'`) {\n quote = current;\n cursor += 1;\n continue;\n }\n\n if (current === \">\") {\n return cursor;\n }\n\n cursor += 1;\n }\n\n throw new Error(\"Malformed XML: missing >.\");\n}\n\nfunction decodeXmlEntities(value: string): string {\n return value.replace(/&(#x[0-9a-fA-F]+|#\\d+|amp|lt|gt|quot|apos);/g, (match, entity) => {\n switch (entity) {\n case \"amp\":\n return \"&\";\n case \"lt\":\n return \"<\";\n case \"gt\":\n return \">\";\n case \"quot\":\n return `\"`;\n case \"apos\":\n return \"'\";\n default:\n if (entity.startsWith(\"#x\")) {\n return String.fromCodePoint(Number.parseInt(entity.slice(2), 16));\n }\n if (entity.startsWith(\"#\")) {\n return String.fromCodePoint(Number.parseInt(entity.slice(1), 10));\n }\n return match;\n }\n });\n}\n","import type {\n TextMark,\n ParagraphBorders,\n ParagraphShading,\n ParagraphSpacing,\n ParagraphIndentation,\n TabStop,\n TableLook,\n} from \"../../model/canonical-document.ts\";\nimport type { OpcRelationship } from \"./part-manifest.ts\";\nimport {\n parseInlineMediaXml,\n type InlineMediaPart,\n} from \"./parse-inline-media.ts\";\nimport { toCanonicalNumberingInstanceId } from \"./parse-numbering.ts\";\n\nexport interface ParsedMainDocument {\n blocks: ParsedBlockNode[];\n}\n\nexport type ParsedBlockNode =\n | ParsedParagraphNode\n | ParsedTableBlockNode\n | ParsedSdtNode\n | ParsedCustomXmlNode\n | ParsedAltChunkNode\n | ParsedOpaqueBlockNode;\n\nexport interface ParsedParagraphNode {\n type: \"paragraph\";\n styleId?: string;\n numbering?: {\n numberingInstanceId: string;\n level: number;\n };\n alignment?: \"left\" | \"center\" | \"right\" | \"both\" | \"distribute\";\n spacing?: ParagraphSpacing;\n indentation?: ParagraphIndentation;\n tabStops?: TabStop[];\n keepNext?: boolean;\n keepLines?: boolean;\n outlineLevel?: number;\n pageBreakBefore?: boolean;\n widowControl?: boolean;\n borders?: ParagraphBorders;\n shading?: ParagraphShading;\n bidi?: boolean;\n suppressLineNumbers?: boolean;\n cnfStyle?: string;\n children: ParsedInlineNode[];\n rawXml: string;\n}\n\nexport type ParsedInlineNode =\n | ParsedTextNode\n | ParsedBreakNode\n | ParsedColumnBreakNode\n | ParsedTabNode\n | ParsedSymbolNode\n | ParsedImageNode\n | ParsedHyperlinkNode\n | ParsedOpaqueInlineNode;\n\nexport interface ParsedTextNode {\n type: \"text\";\n text: string;\n marks?: TextMark[];\n}\n\nexport interface ParsedBreakNode {\n type: \"hard_break\";\n}\n\nexport interface ParsedColumnBreakNode {\n type: \"column_break\";\n}\n\nexport interface ParsedTabNode {\n type: \"tab\";\n}\n\nexport interface ParsedSymbolNode {\n type: \"symbol\";\n char: string;\n font?: string;\n marks?: TextMark[];\n}\n\nexport interface ParsedImageNode {\n type: \"image\";\n mediaId: string;\n relationshipId?: string;\n packagePartName?: string;\n contentType?: string;\n filename?: string;\n altText?: string;\n placementXml?: string;\n display?: \"inline\" | \"floating\";\n floating?: {\n horizontalPosition?: {\n relativeFrom?: string;\n align?: string;\n offset?: number;\n };\n verticalPosition?: {\n relativeFrom?: string;\n align?: string;\n offset?: number;\n };\n wrap?: \"none\" | \"square\" | \"tight\" | \"through\" | \"topAndBottom\";\n behindDoc?: boolean;\n layoutInCell?: boolean;\n allowOverlap?: boolean;\n };\n}\n\nexport interface ParsedHyperlinkNode {\n type: \"hyperlink\";\n href: string;\n children: Array<ParsedTextNode | ParsedBreakNode | ParsedColumnBreakNode | ParsedTabNode | ParsedSymbolNode>;\n rawXml: string;\n}\n\nexport interface ParsedOpaqueInlineNode {\n type: \"opaque_inline\";\n rawXml: string;\n}\n\nexport interface ParsedOpaqueBlockNode {\n type: \"opaque_block\";\n rawXml: string;\n}\n\nexport interface ParsedSdtNode {\n type: \"sdt\";\n properties: {\n sdtType?: string;\n alias?: string;\n tag?: string;\n lock?: string;\n propertiesXml?: string;\n };\n children: ParsedBlockNode[];\n rawXml: string;\n}\n\nexport interface ParsedCustomXmlNode {\n type: \"custom_xml\";\n uri?: string;\n element?: string;\n children: ParsedBlockNode[];\n rawXml: string;\n}\n\nexport interface ParsedAltChunkNode {\n type: \"alt_chunk\";\n relationshipId: string;\n rawXml: string;\n}\n\nexport interface ParsedTableBlockNode {\n type: \"table\";\n styleId?: string;\n tblLook?: TableLook;\n propertiesXml?: string;\n gridColumns: number[];\n rows: ParsedTableRowNode[];\n rawXml: string;\n}\n\nexport interface ParsedTableRowNode {\n type: \"table_row\";\n propertiesXml?: string;\n cells: ParsedTableCellNode[];\n rawXml: string;\n}\n\nexport interface ParsedTableCellNode {\n type: \"table_cell\";\n propertiesXml?: string;\n gridSpan?: number;\n verticalMerge?: \"restart\" | \"continue\";\n children: ParsedBlockNode[];\n rawXml: string;\n}\n\ninterface XmlElementNode {\n type: \"element\";\n name: string;\n attributes: Record<string, string>;\n children: XmlNode[];\n start: number;\n end: number;\n}\n\ninterface XmlTextNode {\n type: \"text\";\n text: string;\n start: number;\n end: number;\n}\n\ntype XmlNode = XmlElementNode | XmlTextNode;\n\ninterface RunParseResult {\n nodes: Array<ParsedTextNode | ParsedBreakNode | ParsedColumnBreakNode | ParsedTabNode | ParsedSymbolNode>;\n supported: boolean;\n}\n\ninterface MarksParseResult {\n marks: TextMark[];\n supported: boolean;\n}\n\nconst HYPERLINK_RELATIONSHIP_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\";\n\nexport function parseMainDocumentXml(\n xml: string,\n relationships: readonly OpcRelationship[] = [],\n mediaParts: ReadonlyMap<string, InlineMediaPart> = new Map(),\n sourcePartPath = \"/word/document.xml\",\n): ParsedMainDocument {\n const root = parseXml(xml);\n const documentElement = findChildElement(root, \"document\");\n const bodyElement = findChildElement(documentElement, \"body\");\n const relationshipMap = new Map(relationships.map((relationship) => [relationship.id, relationship]));\n\n return {\n blocks: bodyElement.children\n .filter((node): node is XmlElementNode => node.type === \"element\")\n .map((node) => parseBodyChild(node, xml, relationshipMap, relationships, mediaParts, sourcePartPath)),\n };\n}\n\nfunction parseBodyChild(\n node: XmlElementNode,\n sourceXml: string,\n relationshipMap: Map<string, OpcRelationship>,\n relationships: readonly OpcRelationship[],\n mediaParts: ReadonlyMap<string, InlineMediaPart>,\n sourcePartPath: string,\n): ParsedBlockNode {\n const nodeType = localName(node.name);\n\n if (nodeType === \"tbl\") {\n // Tables with revision markup (tracked changes inside cells) stay opaque\n // to preserve fidelity until revision-aware table editing is implemented\n const rawTableXml = sourceXml.slice(node.start, node.end);\n if (tableRequiresOpaquePreservation(rawTableXml)) {\n return {\n type: \"opaque_block\",\n rawXml: rawTableXml,\n };\n }\n try {\n return parseTableElement(node, sourceXml, relationshipMap, relationships, mediaParts, sourcePartPath);\n } catch {\n // If table parsing fails for any reason, fall back to opaque preservation\n return {\n type: \"opaque_block\",\n rawXml: rawTableXml,\n };\n }\n }\n\n if (nodeType === \"sdt\") {\n return parseSdtElement(node, sourceXml, relationshipMap, relationships, mediaParts, sourcePartPath);\n }\n\n if (nodeType === \"customXml\") {\n return parseCustomXmlElement(node, sourceXml, relationshipMap, relationships, mediaParts, sourcePartPath);\n }\n\n if (nodeType === \"altChunk\") {\n return parseAltChunkElement(node, sourceXml);\n }\n\n if (nodeType !== \"p\") {\n return {\n type: \"opaque_block\",\n rawXml: sourceXml.slice(node.start, node.end),\n };\n }\n\n let styleId: string | undefined;\n let numbering: ParsedParagraphNode[\"numbering\"];\n let alignment: ParsedParagraphNode[\"alignment\"];\n let spacing: ParsedParagraphNode[\"spacing\"];\n let indentation: ParsedParagraphNode[\"indentation\"];\n let tabStops: ParsedParagraphNode[\"tabStops\"];\n let keepNext: ParsedParagraphNode[\"keepNext\"];\n let keepLines: ParsedParagraphNode[\"keepLines\"];\n let outlineLevel: ParsedParagraphNode[\"outlineLevel\"];\n let pageBreakBefore: ParsedParagraphNode[\"pageBreakBefore\"];\n let widowControl: ParsedParagraphNode[\"widowControl\"];\n let borders: ParsedParagraphNode[\"borders\"];\n let shading: ParsedParagraphNode[\"shading\"];\n let bidi: ParsedParagraphNode[\"bidi\"];\n let suppressLineNumbers: ParsedParagraphNode[\"suppressLineNumbers\"];\n let cnfStyle: ParsedParagraphNode[\"cnfStyle\"];\n let paragraphSupported = true;\n const children: ParsedInlineNode[] = [];\n\n for (const child of node.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n switch (localName(child.name)) {\n case \"pPr\":\n styleId = readParagraphStyleId(child);\n numbering = readParagraphNumbering(child);\n alignment = readParagraphAlignment(child);\n spacing = readParagraphSpacing(child);\n indentation = readParagraphIndentation(child);\n tabStops = readParagraphTabStops(child);\n keepNext = readOnOffParagraphProperty(child, \"keepNext\");\n keepLines = readOnOffParagraphProperty(child, \"keepLines\");\n outlineLevel = readParagraphOutlineLevel(child);\n pageBreakBefore = readOnOffParagraphProperty(child, \"pageBreakBefore\");\n widowControl = readOnOffParagraphProperty(child, \"widowControl\");\n borders = readParagraphBorders(child);\n shading = readParagraphShading(child);\n bidi = readOnOffParagraphProperty(child, \"bidi\");\n suppressLineNumbers = readOnOffParagraphProperty(child, \"suppressLineNumbers\");\n cnfStyle = readParagraphCnfStyle(child);\n paragraphSupported = paragraphSupported && supportsParagraphProperties(child);\n break;\n case \"r\":\n children.push(...parseRun(child, sourceXml, relationships, mediaParts, sourcePartPath));\n break;\n case \"hyperlink\": {\n const hyperlink = parseHyperlink(child, sourceXml, relationshipMap);\n children.push(hyperlink);\n break;\n }\n case \"ins\":\n case \"del\": {\n children.push(...parseRevisionContainer(child, sourceXml, relationshipMap));\n break;\n }\n case \"commentRangeStart\":\n case \"commentRangeEnd\":\n break;\n case \"bookmarkStart\":\n case \"bookmarkEnd\":\n case \"permStart\":\n case \"permEnd\":\n case \"proofErr\":\n children.push({\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(child.start, child.end),\n });\n break;\n default:\n children.push({\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(child.start, child.end),\n });\n break;\n }\n }\n\n if (!paragraphSupported) {\n return {\n type: \"opaque_block\",\n rawXml: sourceXml.slice(node.start, node.end),\n };\n }\n\n return {\n type: \"paragraph\",\n styleId,\n ...(numbering ? { numbering } : {}),\n ...(alignment ? { alignment } : {}),\n ...(spacing ? { spacing } : {}),\n ...(indentation ? { indentation } : {}),\n ...(tabStops && tabStops.length > 0 ? { tabStops } : {}),\n ...(keepNext ? { keepNext } : {}),\n ...(keepLines ? { keepLines } : {}),\n ...(outlineLevel !== undefined ? { outlineLevel } : {}),\n ...(pageBreakBefore ? { pageBreakBefore } : {}),\n ...(widowControl ? { widowControl } : {}),\n ...(borders ? { borders } : {}),\n ...(shading ? { shading } : {}),\n ...(bidi ? { bidi } : {}),\n ...(suppressLineNumbers ? { suppressLineNumbers } : {}),\n ...(cnfStyle ? { cnfStyle } : {}),\n children,\n rawXml: sourceXml.slice(node.start, node.end),\n };\n}\n\nfunction parseTableElement(\n node: XmlElementNode,\n sourceXml: string,\n relationshipMap: Map<string, OpcRelationship>,\n relationships: readonly OpcRelationship[],\n mediaParts: ReadonlyMap<string, InlineMediaPart>,\n sourcePartPath: string,\n): ParsedTableBlockNode {\n let styleId: string | undefined;\n let tblLook: TableLook | undefined;\n let propertiesXml: string | undefined;\n let gridColumns: number[] = [];\n const rows: ParsedTableRowNode[] = [];\n\n for (const child of node.children) {\n if (child.type !== \"element\") continue;\n\n switch (localName(child.name)) {\n case \"tblPr\": {\n propertiesXml = sourceXml.slice(child.start, child.end);\n styleId = readTableStyleId(child);\n tblLook = readTableLook(child);\n break;\n }\n case \"tblGrid\": {\n gridColumns = readTableGridColumns(child);\n break;\n }\n case \"tr\": {\n rows.push(parseTableRowElement(child, sourceXml, relationshipMap, relationships, mediaParts, sourcePartPath));\n break;\n }\n }\n }\n\n return {\n type: \"table\",\n ...(styleId ? { styleId } : {}),\n ...(tblLook ? { tblLook } : {}),\n ...(propertiesXml ? { propertiesXml } : {}),\n gridColumns,\n rows,\n rawXml: sourceXml.slice(node.start, node.end),\n };\n}\n\nfunction parseTableRowElement(\n node: XmlElementNode,\n sourceXml: string,\n relationshipMap: Map<string, OpcRelationship>,\n relationships: readonly OpcRelationship[],\n mediaParts: ReadonlyMap<string, InlineMediaPart>,\n sourcePartPath: string,\n): ParsedTableRowNode {\n let propertiesXml: string | undefined;\n const cells: ParsedTableCellNode[] = [];\n\n for (const child of node.children) {\n if (child.type !== \"element\") continue;\n\n switch (localName(child.name)) {\n case \"trPr\":\n propertiesXml = sourceXml.slice(child.start, child.end);\n break;\n case \"tc\":\n cells.push(parseTableCellElement(child, sourceXml, relationshipMap, relationships, mediaParts, sourcePartPath));\n break;\n }\n }\n\n return {\n type: \"table_row\",\n ...(propertiesXml ? { propertiesXml } : {}),\n cells,\n rawXml: sourceXml.slice(node.start, node.end),\n };\n}\n\nfunction parseTableCellElement(\n node: XmlElementNode,\n sourceXml: string,\n relationshipMap: Map<string, OpcRelationship>,\n relationships: readonly OpcRelationship[],\n mediaParts: ReadonlyMap<string, InlineMediaPart>,\n sourcePartPath: string,\n): ParsedTableCellNode {\n let propertiesXml: string | undefined;\n let gridSpan: number | undefined;\n let verticalMerge: \"restart\" | \"continue\" | undefined;\n const children: ParsedBlockNode[] = [];\n\n for (const child of node.children) {\n if (child.type !== \"element\") continue;\n\n switch (localName(child.name)) {\n case \"tcPr\": {\n propertiesXml = sourceXml.slice(child.start, child.end);\n gridSpan = readCellGridSpan(child);\n verticalMerge = readCellVerticalMerge(child);\n break;\n }\n default: {\n // Everything else in a cell is a block child (paragraphs, nested tables, etc.)\n children.push(parseBodyChild(child, sourceXml, relationshipMap, relationships, mediaParts, sourcePartPath));\n break;\n }\n }\n }\n\n return {\n type: \"table_cell\",\n ...(propertiesXml ? { propertiesXml } : {}),\n ...(gridSpan ? { gridSpan } : {}),\n ...(verticalMerge ? { verticalMerge } : {}),\n children,\n rawXml: sourceXml.slice(node.start, node.end),\n };\n}\n\nfunction parseSdtElement(\n node: XmlElementNode,\n sourceXml: string,\n relationshipMap: Map<string, OpcRelationship>,\n relationships: readonly OpcRelationship[],\n mediaParts: ReadonlyMap<string, InlineMediaPart>,\n sourcePartPath: string,\n): ParsedBlockNode {\n const propertiesNode = node.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"sdtPr\",\n );\n const contentNode = node.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"sdtContent\",\n );\n\n if (!contentNode) {\n return {\n type: \"opaque_block\",\n rawXml: sourceXml.slice(node.start, node.end),\n };\n }\n\n const children = contentNode.children\n .filter((child): child is XmlElementNode => child.type === \"element\")\n .map((child) => parseBodyChild(child, sourceXml, relationshipMap, relationships, mediaParts, sourcePartPath));\n\n return {\n type: \"sdt\",\n properties: readSdtProperties(propertiesNode, sourceXml),\n children,\n rawXml: sourceXml.slice(node.start, node.end),\n };\n}\n\nfunction parseCustomXmlElement(\n node: XmlElementNode,\n sourceXml: string,\n relationshipMap: Map<string, OpcRelationship>,\n relationships: readonly OpcRelationship[],\n mediaParts: ReadonlyMap<string, InlineMediaPart>,\n sourcePartPath: string,\n): ParsedBlockNode {\n const uri = readOptionalAttribute(node, \"uri\");\n const element = readOptionalAttribute(node, \"element\");\n if (!uri && !element) {\n return {\n type: \"opaque_block\",\n rawXml: sourceXml.slice(node.start, node.end),\n };\n }\n\n const children = node.children\n .filter(\n (child): child is XmlElementNode =>\n child.type === \"element\" && localName(child.name) !== \"customXmlPr\",\n )\n .map((child) => parseBodyChild(child, sourceXml, relationshipMap, relationships, mediaParts, sourcePartPath));\n\n return {\n type: \"custom_xml\",\n ...(uri ? { uri } : {}),\n ...(element ? { element } : {}),\n children,\n rawXml: sourceXml.slice(node.start, node.end),\n };\n}\n\nfunction parseAltChunkElement(\n node: XmlElementNode,\n sourceXml: string,\n): ParsedBlockNode {\n const relationshipId = readOptionalAttribute(node, \"id\");\n if (!relationshipId) {\n return {\n type: \"opaque_block\",\n rawXml: sourceXml.slice(node.start, node.end),\n };\n }\n\n return {\n type: \"alt_chunk\",\n relationshipId,\n rawXml: sourceXml.slice(node.start, node.end),\n };\n}\n\nfunction readSdtProperties(\n node: XmlElementNode | undefined,\n sourceXml: string,\n): ParsedSdtNode[\"properties\"] {\n if (!node) {\n return {};\n }\n\n const properties: ParsedSdtNode[\"properties\"] = {\n propertiesXml: sourceXml.slice(node.start, node.end),\n };\n\n for (const child of node.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const name = localName(child.name);\n if (name === \"alias\") {\n properties.alias = readOptionalAttribute(child, \"val\");\n continue;\n }\n if (name === \"tag\") {\n properties.tag = readOptionalAttribute(child, \"val\");\n continue;\n }\n if (name === \"lock\") {\n properties.lock = readOptionalAttribute(child, \"val\");\n continue;\n }\n if (!properties.sdtType && name !== \"id\" && name !== \"placeholder\" && name !== \"showingPlcHdr\") {\n properties.sdtType = name;\n }\n }\n\n return properties;\n}\n\nfunction readTableStyleId(node: XmlElementNode): string | undefined {\n for (const child of node.children) {\n if (child.type !== \"element\" || localName(child.name) !== \"tblStyle\") continue;\n const styleId = child.attributes[\"w:val\"] ?? child.attributes.val;\n if (styleId) return styleId;\n }\n return undefined;\n}\n\nfunction readTableLook(node: XmlElementNode): TableLook | undefined {\n const tblLookNode = node.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"tblLook\",\n );\n if (!tblLookNode) {\n return undefined;\n }\n\n const tableLook: TableLook = {};\n const val = tblLookNode.attributes[\"w:val\"] ?? tblLookNode.attributes.val;\n if (val) {\n tableLook.val = val;\n }\n for (const [attribute, key] of [\n [\"w:firstRow\", \"firstRow\"],\n [\"w:lastRow\", \"lastRow\"],\n [\"w:firstColumn\", \"firstColumn\"],\n [\"w:lastColumn\", \"lastColumn\"],\n [\"w:noHBand\", \"noHBand\"],\n [\"w:noVBand\", \"noVBand\"],\n ] as const) {\n const fallback = attribute.replace(\"w:\", \"\");\n const raw = tblLookNode.attributes[attribute] ?? tblLookNode.attributes[fallback];\n if (raw !== undefined) {\n tableLook[key] = raw !== \"0\" && raw !== \"false\" && raw !== \"off\";\n }\n }\n\n return Object.keys(tableLook).length > 0 ? tableLook : undefined;\n}\n\nfunction readTableGridColumns(node: XmlElementNode): number[] {\n return node.children\n .filter((child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"gridCol\")\n .map((child) => {\n const raw = child.attributes[\"w:w\"] ?? child.attributes.w ?? \"0\";\n const value = Number.parseInt(raw, 10);\n return Number.isFinite(value) && value > 0 ? value : 0;\n });\n}\n\n/**\n * Check if a table's raw XML contains content that cannot safely round-trip\n * through the parsed table path yet. This includes:\n * - Revision markup (tracked changes inside cells)\n * - Hyperlink relationships (original relationship IDs would be lost)\n * - Comment ranges, bookmarks, and other annotation markup\n *\n * Tables matching this check stay opaque until the respective features\n * are implemented in the table editing path.\n */\nfunction tableRequiresOpaquePreservation(rawXml: string): boolean {\n // For now, only parse tables that contain exclusively simple content\n // (plain text, basic formatting). Any complex OOXML stays opaque.\n // This list will shrink as the table editing path gains feature coverage.\n return /<w:(ins|del|rPrChange|pPrChange|tblPrChange|trPrChange|tcPrChange|sectPrChange|cellIns|cellDel|cellMerge|hyperlink|commentRangeStart|commentRangeEnd|commentReference|bookmarkStart|bookmarkEnd|rStyle|pict|fldChar|fldSimple|smartTag|gridAfter|gridBefore|hideMark|tblHeader|tblCellSpacing|bCs)\\b/.test(rawXml);\n}\n\nfunction readCellGridSpan(node: XmlElementNode): number | undefined {\n const gridSpanNode = node.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"gridSpan\",\n );\n if (!gridSpanNode) return undefined;\n const raw = gridSpanNode.attributes[\"w:val\"] ?? gridSpanNode.attributes.val;\n const value = Number.parseInt(raw ?? \"0\", 10);\n return Number.isFinite(value) && value > 1 ? value : undefined;\n}\n\nfunction readCellVerticalMerge(node: XmlElementNode): \"restart\" | \"continue\" | undefined {\n const vMergeNode = node.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"vMerge\",\n );\n if (!vMergeNode) return undefined;\n const raw = (vMergeNode.attributes[\"w:val\"] ?? vMergeNode.attributes.val ?? \"continue\").toLowerCase();\n return raw === \"restart\" ? \"restart\" : \"continue\";\n}\n\nfunction readParagraphAlignment(node: XmlElementNode): ParsedParagraphNode[\"alignment\"] {\n const jcNode = node.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"jc\",\n );\n if (!jcNode) return undefined;\n const val = (jcNode.attributes[\"w:val\"] ?? jcNode.attributes.val ?? \"\").toLowerCase();\n if (val === \"left\" || val === \"center\" || val === \"right\" || val === \"both\" || val === \"distribute\") {\n return val;\n }\n return undefined;\n}\n\nfunction readParagraphSpacing(node: XmlElementNode): ParagraphSpacing | undefined {\n const spacingNode = node.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"spacing\",\n );\n if (!spacingNode) return undefined;\n\n const spacing: ParagraphSpacing = {};\n const before = spacingNode.attributes[\"w:before\"] ?? spacingNode.attributes.before;\n const after = spacingNode.attributes[\"w:after\"] ?? spacingNode.attributes.after;\n const line = spacingNode.attributes[\"w:line\"] ?? spacingNode.attributes.line;\n const lineRule = spacingNode.attributes[\"w:lineRule\"] ?? spacingNode.attributes.lineRule;\n\n if (before !== undefined) {\n const v = Number.parseInt(before, 10);\n if (Number.isFinite(v)) spacing.before = v;\n }\n if (after !== undefined) {\n const v = Number.parseInt(after, 10);\n if (Number.isFinite(v)) spacing.after = v;\n }\n if (line !== undefined) {\n const v = Number.parseInt(line, 10);\n if (Number.isFinite(v)) spacing.line = v;\n }\n if (lineRule !== undefined) {\n const lr = lineRule.toLowerCase();\n if (lr === \"auto\" || lr === \"exact\") {\n spacing.lineRule = lr;\n } else if (lr === \"atleast\") {\n spacing.lineRule = \"atLeast\";\n }\n }\n\n if (\n spacing.before === undefined &&\n spacing.after === undefined &&\n spacing.line === undefined &&\n spacing.lineRule === undefined\n ) {\n return undefined;\n }\n return spacing;\n}\n\nfunction readParagraphIndentation(node: XmlElementNode): ParagraphIndentation | undefined {\n const indNode = node.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"ind\",\n );\n if (!indNode) return undefined;\n\n const indentation: ParagraphIndentation = {};\n const left = indNode.attributes[\"w:left\"] ?? indNode.attributes.left;\n const right = indNode.attributes[\"w:right\"] ?? indNode.attributes.right;\n const firstLine = indNode.attributes[\"w:firstLine\"] ?? indNode.attributes.firstLine;\n const hanging = indNode.attributes[\"w:hanging\"] ?? indNode.attributes.hanging;\n\n if (left !== undefined) {\n const v = Number.parseInt(left, 10);\n if (Number.isFinite(v)) indentation.left = v;\n }\n if (right !== undefined) {\n const v = Number.parseInt(right, 10);\n if (Number.isFinite(v)) indentation.right = v;\n }\n if (firstLine !== undefined) {\n const v = Number.parseInt(firstLine, 10);\n if (Number.isFinite(v)) indentation.firstLine = v;\n }\n if (hanging !== undefined) {\n const v = Number.parseInt(hanging, 10);\n if (Number.isFinite(v)) indentation.hanging = v;\n }\n\n if (\n indentation.left === undefined &&\n indentation.right === undefined &&\n indentation.firstLine === undefined &&\n indentation.hanging === undefined\n ) {\n return undefined;\n }\n return indentation;\n}\n\nfunction readParagraphTabStops(node: XmlElementNode): TabStop[] | undefined {\n const tabsNode = node.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"tabs\",\n );\n if (!tabsNode) return undefined;\n\n const tabStops: TabStop[] = [];\n for (const child of tabsNode.children) {\n if (child.type !== \"element\" || localName(child.name) !== \"tab\") continue;\n const pos = child.attributes[\"w:pos\"] ?? child.attributes.pos;\n const val = (child.attributes[\"w:val\"] ?? child.attributes.val ?? \"left\").toLowerCase();\n const leader = (child.attributes[\"w:leader\"] ?? child.attributes.leader ?? \"none\").toLowerCase();\n\n if (pos === undefined) continue;\n const position = Number.parseInt(pos, 10);\n if (!Number.isFinite(position)) continue;\n\n const align = ([\"left\", \"center\", \"right\", \"decimal\", \"bar\", \"clear\"] as const).includes(\n val as \"left\" | \"center\" | \"right\" | \"decimal\" | \"bar\" | \"clear\",\n )\n ? (val as TabStop[\"align\"])\n : \"left\";\n\n const leaderValue =\n leader === \"none\" ||\n leader === \"dot\" ||\n leader === \"hyphen\" ||\n leader === \"underscore\" ||\n leader === \"heavy\"\n ? (leader as Exclude<TabStop[\"leader\"], \"middleDot\">)\n : leader === \"middledot\"\n ? \"middleDot\"\n : undefined;\n\n tabStops.push({\n position,\n align,\n ...(leaderValue && leaderValue !== \"none\" ? { leader: leaderValue } : {}),\n });\n }\n\n return tabStops.length > 0 ? tabStops : undefined;\n}\n\nfunction readOnOffParagraphProperty(node: XmlElementNode, name: string): boolean | undefined {\n const propNode = node.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === name,\n );\n if (!propNode) return undefined;\n const val = (propNode.attributes[\"w:val\"] ?? propNode.attributes.val ?? \"true\").toLowerCase();\n return val !== \"false\" && val !== \"0\" && val !== \"off\" ? true : undefined;\n}\n\nfunction readParagraphOutlineLevel(node: XmlElementNode): number | undefined {\n const propNode = node.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"outlineLvl\",\n );\n if (!propNode) return undefined;\n const val = propNode.attributes[\"w:val\"] ?? propNode.attributes.val;\n if (val === undefined) return undefined;\n const level = Number.parseInt(val, 10);\n return Number.isFinite(level) ? level : undefined;\n}\n\nfunction readParagraphBorders(node: XmlElementNode): ParagraphBorders | undefined {\n const borderContainer = node.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"pBdr\",\n );\n if (!borderContainer) {\n return undefined;\n }\n\n const borders: ParagraphBorders = {};\n for (const [name, key] of [\n [\"top\", \"top\"],\n [\"left\", \"left\"],\n [\"bottom\", \"bottom\"],\n [\"right\", \"right\"],\n [\"bar\", \"bar\"],\n [\"between\", \"between\"],\n ] as const) {\n const borderNode = borderContainer.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === name,\n );\n if (borderNode) {\n const border = readBorder(borderNode);\n if (border) {\n borders[key] = border;\n }\n }\n }\n\n return Object.keys(borders).length > 0 ? borders : undefined;\n}\n\nfunction readParagraphShading(node: XmlElementNode): ParagraphShading | undefined {\n const shadingNode = node.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"shd\",\n );\n if (!shadingNode) {\n return undefined;\n }\n\n const shading: ParagraphShading = {};\n const fill = shadingNode.attributes[\"w:fill\"] ?? shadingNode.attributes.fill;\n const color = shadingNode.attributes[\"w:color\"] ?? shadingNode.attributes.color;\n const val = shadingNode.attributes[\"w:val\"] ?? shadingNode.attributes.val;\n if (fill) shading.fill = fill;\n if (color) shading.color = color;\n if (val) shading.val = val;\n return Object.keys(shading).length > 0 ? shading : undefined;\n}\n\nfunction readParagraphCnfStyle(node: XmlElementNode): string | undefined {\n const cnfStyleNode = node.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"cnfStyle\",\n );\n return cnfStyleNode?.attributes[\"w:val\"] ?? cnfStyleNode?.attributes.val;\n}\n\nfunction readBorder(node: XmlElementNode): ParagraphBorders[keyof ParagraphBorders] {\n const border: NonNullable<ParagraphBorders[keyof ParagraphBorders]> = {};\n const value = node.attributes[\"w:val\"] ?? node.attributes.val;\n const size = node.attributes[\"w:sz\"] ?? node.attributes.sz;\n const space = node.attributes[\"w:space\"] ?? node.attributes.space;\n const color = node.attributes[\"w:color\"] ?? node.attributes.color;\n if (value) border.value = value;\n if (size !== undefined) {\n const parsedSize = Number.parseInt(size, 10);\n if (Number.isFinite(parsedSize)) border.size = parsedSize;\n }\n if (space !== undefined) {\n const parsedSpace = Number.parseInt(space, 10);\n if (Number.isFinite(parsedSpace)) border.space = parsedSpace;\n }\n if (color) border.color = color;\n return Object.keys(border).length > 0 ? border : undefined;\n}\n\nfunction readParagraphStyleId(node: XmlElementNode): string | undefined {\n for (const child of node.children) {\n if (child.type !== \"element\" || localName(child.name) !== \"pStyle\") {\n continue;\n }\n\n const styleId = child.attributes[\"w:val\"] ?? child.attributes.val;\n if (styleId) {\n return styleId;\n }\n }\n\n return undefined;\n}\n\nfunction readParagraphNumbering(\n node: XmlElementNode,\n): ParsedParagraphNode[\"numbering\"] | undefined {\n const numberingProperties = node.children.find(\n (child): child is XmlElementNode =>\n child.type === \"element\" && localName(child.name) === \"numPr\",\n );\n if (!numberingProperties) {\n return undefined;\n }\n\n const levelNode = numberingProperties.children.find(\n (child): child is XmlElementNode =>\n child.type === \"element\" && localName(child.name) === \"ilvl\",\n );\n const instanceNode = numberingProperties.children.find(\n (child): child is XmlElementNode =>\n child.type === \"element\" && localName(child.name) === \"numId\",\n );\n const rawLevel = levelNode?.attributes[\"w:val\"] ?? levelNode?.attributes.val;\n const rawInstanceId = instanceNode?.attributes[\"w:val\"] ?? instanceNode?.attributes.val;\n if (!rawInstanceId || rawLevel === undefined || !/^-?\\d+$/.test(rawLevel)) {\n return undefined;\n }\n\n return {\n numberingInstanceId: toCanonicalNumberingInstanceId(rawInstanceId),\n level: Number.parseInt(rawLevel, 10),\n };\n}\n\nfunction parseRun(\n node: XmlElementNode,\n sourceXml: string,\n relationships: readonly OpcRelationship[],\n mediaParts: ReadonlyMap<string, InlineMediaPart>,\n sourcePartPath: string,\n): ParsedInlineNode[] {\n const marksResult = readRunMarks(node, sourceXml);\n if (!marksResult.supported) {\n return [\n {\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(node.start, node.end),\n },\n ];\n }\n\n const marks = marksResult.marks;\n const result: ParsedInlineNode[] = [];\n let encounteredUnsupportedChild = false;\n\n for (const child of node.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n switch (localName(child.name)) {\n case \"rPr\":\n break;\n case \"t\": {\n const text = child.children\n .filter((entry): entry is XmlTextNode => entry.type === \"text\")\n .map((entry) => entry.text)\n .join(\"\");\n result.push({\n type: \"text\",\n text,\n ...(marks.length > 0 ? { marks } : {}),\n });\n break;\n }\n case \"tab\":\n result.push({ type: \"tab\" });\n break;\n case \"sym\": {\n const symbol = parseSymbolNode(child, marks);\n if (!symbol) {\n encounteredUnsupportedChild = true;\n result.push({\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(child.start, child.end),\n });\n break;\n }\n result.push(symbol);\n break;\n }\n case \"br\":\n if (isColumnBreak(child)) {\n result.push({ type: \"column_break\" });\n } else if (isSimpleLineBreak(child)) {\n result.push({ type: \"hard_break\" });\n } else {\n result.push({\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(child.start, child.end),\n });\n }\n break;\n case \"drawing\": {\n const parsedMedia = parseInlineMediaXml(\n sourceXml.slice(child.start, child.end),\n relationships,\n mediaParts,\n sourcePartPath,\n );\n if (parsedMedia.length === 0) {\n encounteredUnsupportedChild = true;\n result.push({\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(node.start, node.end),\n });\n break;\n }\n\n const semanticChildren = node.children.filter(\n (entry): entry is XmlElementNode =>\n entry.type === \"element\" && localName(entry.name) !== \"rPr\",\n );\n const placementXml =\n semanticChildren.length === 1\n ? sourceXml.slice(node.start, node.end)\n : sourceXml.slice(child.start, child.end);\n\n result.push(\n ...parsedMedia.map((media) => ({\n type: \"image\" as const,\n mediaId: media.mediaId,\n relationshipId: media.relationshipId,\n packagePartName: media.packagePartName,\n contentType: media.contentType,\n filename: media.filename,\n ...(media.altText ? { altText: media.altText } : {}),\n placementXml,\n ...(media.display ? { display: media.display } : {}),\n ...(media.floating ? { floating: media.floating } : {}),\n })),\n );\n break;\n }\n case \"commentReference\":\n break;\n case \"lastRenderedPageBreak\":\n case \"proofErr\":\n result.push({\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(child.start, child.end),\n });\n break;\n default:\n encounteredUnsupportedChild = true;\n result.push({\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(child.start, child.end),\n });\n break;\n }\n }\n\n if (encounteredUnsupportedChild && result.every((child) => child.type === \"opaque_inline\")) {\n return [\n {\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(node.start, node.end),\n },\n ];\n }\n\n return result;\n}\n\nfunction parseRevisionContainer(\n node: XmlElementNode,\n sourceXml: string,\n relationshipMap: Map<string, OpcRelationship>,\n): ParsedInlineNode[] {\n const result: ParsedInlineNode[] = [];\n const allowsDeletedText = localName(node.name) === \"del\";\n\n for (const child of node.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n switch (localName(child.name)) {\n case \"r\": {\n const run = parseRunContentOnly(child, sourceXml, {\n allowDeletedText: allowsDeletedText,\n preserveUnsupportedReviewMarkup: true,\n });\n if (!run.supported) {\n return [\n {\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(node.start, node.end),\n },\n ];\n }\n result.push(...run.nodes);\n break;\n }\n case \"hyperlink\": {\n const hyperlink = parseHyperlink(child, sourceXml, relationshipMap, {\n allowDeletedText: allowsDeletedText,\n preserveUnsupportedReviewMarkup: true,\n });\n if (hyperlink.type === \"opaque_inline\") {\n return [\n {\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(node.start, node.end),\n },\n ];\n }\n result.push(hyperlink);\n break;\n }\n case \"commentRangeStart\":\n case \"commentRangeEnd\":\n case \"bookmarkStart\":\n case \"bookmarkEnd\":\n case \"permStart\":\n case \"permEnd\":\n case \"proofErr\":\n case \"lastRenderedPageBreak\":\n return [\n {\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(node.start, node.end),\n },\n ];\n default:\n return [\n {\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(node.start, node.end),\n },\n ];\n }\n }\n\n return result;\n}\n\nfunction parseHyperlink(\n node: XmlElementNode,\n sourceXml: string,\n relationshipMap: Map<string, OpcRelationship>,\n options: {\n allowDeletedText?: boolean;\n preserveUnsupportedReviewMarkup?: boolean;\n } = {},\n): ParsedHyperlinkNode | ParsedOpaqueInlineNode {\n const relationshipId = node.attributes[\"r:id\"] ?? node.attributes.id;\n const anchor = node.attributes[\"w:anchor\"] ?? node.attributes.anchor;\n let href: string | undefined;\n\n if (relationshipId) {\n const relationship = relationshipMap.get(relationshipId);\n if (\n relationship &&\n relationship.type === HYPERLINK_RELATIONSHIP_TYPE &&\n relationship.targetMode === \"external\"\n ) {\n href = relationship.target;\n }\n } else if (anchor) {\n href = `#${anchor}`;\n }\n\n if (!href) {\n return {\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(node.start, node.end),\n };\n }\n\n const children: Array<ParsedTextNode | ParsedBreakNode | ParsedTabNode> = [];\n\n for (const child of node.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n if (localName(child.name) !== \"r\") {\n return {\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(node.start, node.end),\n };\n }\n\n const run = parseRunContentOnly(child, sourceXml, {\n allowDeletedText: options.allowDeletedText,\n preserveUnsupportedReviewMarkup: options.preserveUnsupportedReviewMarkup,\n });\n if (!run.supported) {\n return {\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(node.start, node.end),\n };\n }\n\n children.push(...run.nodes);\n }\n\n return {\n type: \"hyperlink\",\n href,\n children,\n rawXml: sourceXml.slice(node.start, node.end),\n };\n}\n\nfunction parseRunContentOnly(\n node: XmlElementNode,\n _sourceXml: string,\n options: {\n allowDeletedText?: boolean;\n preserveUnsupportedReviewMarkup?: boolean;\n } = {},\n): RunParseResult {\n const marksResult = readRunMarks(node, _sourceXml);\n if (!marksResult.supported) {\n return { nodes: [], supported: false };\n }\n\n const marks = marksResult.marks;\n const nodes: Array<ParsedTextNode | ParsedBreakNode | ParsedColumnBreakNode | ParsedTabNode | ParsedSymbolNode> = [];\n\n for (const child of node.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n switch (localName(child.name)) {\n case \"rPr\":\n break;\n case \"t\": {\n const text = child.children\n .filter((entry): entry is XmlTextNode => entry.type === \"text\")\n .map((entry) => entry.text)\n .join(\"\");\n nodes.push({\n type: \"text\",\n text,\n ...(marks.length > 0 ? { marks } : {}),\n });\n break;\n }\n case \"delText\":\n case \"delInstrText\":\n if (!options.allowDeletedText) {\n return { nodes: [], supported: false };\n }\n nodes.push({\n type: \"text\",\n text: child.children\n .filter((entry): entry is XmlTextNode => entry.type === \"text\")\n .map((entry) => entry.text)\n .join(\"\"),\n ...(marks.length > 0 ? { marks } : {}),\n });\n break;\n case \"tab\":\n nodes.push({ type: \"tab\" });\n break;\n case \"sym\": {\n const symbol = parseSymbolNode(child, marks);\n if (!symbol) {\n return { nodes: [], supported: false };\n }\n nodes.push(symbol);\n break;\n }\n case \"br\":\n if (isColumnBreak(child)) {\n nodes.push({ type: \"column_break\" });\n break;\n }\n if (!isSimpleLineBreak(child)) {\n return { nodes: [], supported: false };\n }\n nodes.push({ type: \"hard_break\" });\n break;\n case \"commentReference\":\n case \"lastRenderedPageBreak\":\n case \"proofErr\":\n if (options.preserveUnsupportedReviewMarkup) {\n return { nodes: [], supported: false };\n }\n break;\n default:\n return { nodes: [], supported: false };\n }\n }\n\n return { nodes, supported: true };\n}\n\nfunction readRunMarks(node: XmlElementNode, sourceXml: string): MarksParseResult {\n const properties = node.children.find(\n (child): child is XmlElementNode =>\n child.type === \"element\" && localName(child.name) === \"rPr\",\n );\n\n if (!properties) {\n return { marks: [], supported: true };\n }\n\n if (\n properties.children.some(\n (child) =>\n child.type === \"element\" &&\n DISALLOWED_RUN_PROPERTY_NAMES.has(localName(child.name)),\n )\n ) {\n return {\n marks: [],\n supported: false,\n };\n }\n\n const marks: TextMark[] = [];\n if (hasOnOffProperty(properties, \"b\")) {\n marks.push({ type: \"bold\" });\n }\n if (hasOnOffProperty(properties, \"i\")) {\n marks.push({ type: \"italic\" });\n }\n if (hasUnderlineProperty(properties)) {\n marks.push({ type: \"underline\" });\n }\n if (hasOnOffProperty(properties, \"strike\")) {\n marks.push({ type: \"strikethrough\" });\n }\n if (hasOnOffProperty(properties, \"dstrike\")) {\n marks.push({ type: \"doubleStrikethrough\" });\n }\n if (hasOnOffProperty(properties, \"vanish\")) {\n marks.push({ type: \"vanish\" });\n }\n\n const langMark = readRunLang(properties);\n if (langMark) {\n marks.push(langMark);\n }\n\n const backgroundColorMark = readRunBackgroundColor(properties);\n if (backgroundColorMark) {\n marks.push(backgroundColorMark);\n }\n\n const charSpacingMark = readNumericRunMark(properties, \"spacing\", \"charSpacing\");\n if (charSpacingMark) {\n marks.push(charSpacingMark);\n }\n\n const kerningMark = readNumericRunMark(properties, \"kern\", \"kerning\");\n if (kerningMark) {\n marks.push(kerningMark);\n }\n\n const positionMark = readNumericRunMark(properties, \"position\", \"position\");\n if (positionMark) {\n marks.push(positionMark);\n }\n\n if (hasOnOffProperty(properties, \"emboss\")) {\n marks.push({ type: \"emboss\" });\n }\n if (hasOnOffProperty(properties, \"imprint\")) {\n marks.push({ type: \"imprint\" });\n }\n if (hasOnOffProperty(properties, \"shadow\")) {\n marks.push({ type: \"shadow\" });\n }\n\n const textFillMark = readRunTextFill(properties, sourceXml);\n if (textFillMark) {\n marks.push(textFillMark);\n }\n\n return {\n marks,\n supported: true,\n };\n}\n\nfunction readRunLang(properties: XmlElementNode): TextMark | undefined {\n const langNode = properties.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"lang\",\n );\n if (!langNode) return undefined;\n const val =\n langNode.attributes[\"w:val\"] ??\n langNode.attributes.val ??\n langNode.attributes[\"w:bidi\"] ??\n langNode.attributes.bidi;\n if (!val) return undefined;\n return { type: \"lang\", val };\n}\n\nfunction readRunBackgroundColor(properties: XmlElementNode): TextMark | undefined {\n const shadingNode = properties.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"shd\",\n );\n if (!shadingNode) {\n return undefined;\n }\n\n const fill = shadingNode.attributes[\"w:fill\"] ?? shadingNode.attributes.fill;\n if (!fill || fill === \"auto\") {\n return undefined;\n }\n\n return { type: \"backgroundColor\", color: fill };\n}\n\nfunction readNumericRunMark(\n properties: XmlElementNode,\n elementName: \"spacing\" | \"kern\" | \"position\",\n markType: \"charSpacing\" | \"kerning\" | \"position\",\n): TextMark | undefined {\n const propertyNode = properties.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === elementName,\n );\n if (!propertyNode) {\n return undefined;\n }\n const rawValue = propertyNode.attributes[\"w:val\"] ?? propertyNode.attributes.val;\n if (rawValue === undefined) {\n return undefined;\n }\n const value = Number.parseInt(rawValue, 10);\n if (!Number.isFinite(value)) {\n return undefined;\n }\n return { type: markType, val: value };\n}\n\nfunction readRunTextFill(properties: XmlElementNode, sourceXml: string): TextMark | undefined {\n const textFillNode = properties.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"textFill\",\n );\n if (!textFillNode) {\n return undefined;\n }\n return {\n type: \"textFill\",\n xml: sourceXml.slice(textFillNode.start, textFillNode.end),\n };\n}\n\nfunction parseSymbolNode(\n node: XmlElementNode,\n marks: TextMark[],\n): ParsedSymbolNode | undefined {\n const char = node.attributes[\"w:char\"] ?? node.attributes.char;\n if (!char) {\n return undefined;\n }\n const font = node.attributes[\"w:font\"] ?? node.attributes.font;\n return {\n type: \"symbol\",\n char,\n ...(font ? { font } : {}),\n ...(marks.length > 0 ? { marks } : {}),\n };\n}\n\nfunction supportsParagraphProperties(node: XmlElementNode): boolean {\n for (const child of node.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const name = localName(child.name);\n if (name === \"pPrChange\") {\n return false;\n }\n\n if (name === \"rPr\") {\n if (\n child.children.some(\n (entry) =>\n entry.type === \"element\" &&\n DISALLOWED_PARAGRAPH_PROPERTY_NAMES.has(localName(entry.name)),\n )\n ) {\n return false;\n }\n }\n }\n\n return true;\n}\n\nconst DISALLOWED_RUN_PROPERTY_NAMES = new Set([\"rPrChange\"]);\nconst DISALLOWED_PARAGRAPH_PROPERTY_NAMES = new Set([\"pPrChange\", \"rPrChange\"]);\n\nfunction hasOnOffProperty(properties: XmlElementNode, propertyName: string): boolean {\n const property = properties.children.find(\n (child): child is XmlElementNode =>\n child.type === \"element\" && localName(child.name) === propertyName,\n );\n if (!property) {\n return false;\n }\n\n const value = (property.attributes[\"w:val\"] ?? property.attributes.val ?? \"true\").toLowerCase();\n return value !== \"false\" && value !== \"0\" && value !== \"off\";\n}\n\nfunction hasUnderlineProperty(properties: XmlElementNode): boolean {\n const property = properties.children.find(\n (child): child is XmlElementNode =>\n child.type === \"element\" && localName(child.name) === \"u\",\n );\n if (!property) {\n return false;\n }\n\n const value = (property.attributes[\"w:val\"] ?? property.attributes.val ?? \"single\").toLowerCase();\n return value !== \"none\";\n}\n\nfunction isSimpleLineBreak(node: XmlElementNode): boolean {\n const value = (node.attributes[\"w:type\"] ?? node.attributes.type ?? \"textWrapping\").toLowerCase();\n return value === \"textwrapping\" || value === \"line\";\n}\n\nfunction isColumnBreak(node: XmlElementNode): boolean {\n const value = (node.attributes[\"w:type\"] ?? node.attributes.type ?? \"\").toLowerCase();\n return value === \"column\";\n}\n\nfunction findChildElement(node: XmlElementNode, childLocalName: string): XmlElementNode {\n const child = node.children.find(\n (entry): entry is XmlElementNode =>\n entry.type === \"element\" && localName(entry.name) === childLocalName,\n );\n\n if (!child) {\n throw new Error(`Expected <${childLocalName}> element in main document XML.`);\n }\n\n return child;\n}\n\nfunction localName(name: string): string {\n const separatorIndex = name.indexOf(\":\");\n return separatorIndex >= 0 ? name.slice(separatorIndex + 1) : name;\n}\n\nfunction readOptionalAttribute(node: XmlElementNode, name: string): string | undefined {\n return node.attributes[`w:${name}`]\n ?? node.attributes[`r:${name}`]\n ?? node.attributes[name];\n}\n\nfunction parseXml(xml: string): XmlElementNode {\n const root: XmlElementNode = {\n type: \"element\",\n name: \"__root__\",\n attributes: {},\n children: [],\n start: 0,\n end: xml.length,\n };\n const stack: XmlElementNode[] = [root];\n let cursor = 0;\n\n while (cursor < xml.length) {\n if (xml.startsWith(\"<!--\", cursor)) {\n const end = xml.indexOf(\"-->\", cursor);\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<?\", cursor)) {\n const end = xml.indexOf(\"?>\", cursor);\n cursor = end >= 0 ? end + 2 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<![CDATA[\", cursor)) {\n const end = xml.indexOf(\"]]>\", cursor);\n const textEnd = end >= 0 ? end : xml.length;\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text: xml.slice(cursor + 9, textEnd),\n start: cursor,\n end: end >= 0 ? end + 3 : xml.length,\n });\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n const currentChar = xml[cursor];\n if (currentChar !== \"<\") {\n const nextTag = xml.indexOf(\"<\", cursor);\n const end = nextTag >= 0 ? nextTag : xml.length;\n const text = decodeXmlEntities(xml.slice(cursor, end));\n if (text.length > 0) {\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text,\n start: cursor,\n end,\n });\n }\n cursor = end;\n continue;\n }\n\n if (xml[cursor + 1] === \"/\") {\n const end = xml.indexOf(\">\", cursor);\n if (end < 0) {\n throw new Error(\"Malformed XML: missing closing >.\");\n }\n\n const name = xml.slice(cursor + 2, end).trim();\n const current = stack.pop();\n if (!current || localName(current.name) !== localName(name)) {\n throw new Error(`Malformed XML: unexpected closing tag </${name}>.`);\n }\n current.end = end + 1;\n cursor = end + 1;\n continue;\n }\n\n const tagEnd = findTagEnd(xml, cursor);\n const tagBody = xml.slice(cursor + 1, tagEnd);\n const selfClosing = /\\/\\s*$/.test(tagBody);\n const { name, attributes } = parseTag(tagBody.replace(/\\/\\s*$/, \"\").trim());\n const element: XmlElementNode = {\n type: \"element\",\n name,\n attributes,\n children: [],\n start: cursor,\n end: tagEnd + 1,\n };\n stack[stack.length - 1]?.children.push(element);\n\n if (!selfClosing) {\n stack.push(element);\n }\n\n cursor = tagEnd + 1;\n }\n\n if (stack.length !== 1) {\n throw new Error(\"Malformed XML: unclosed element in main document XML.\");\n }\n\n return root;\n}\n\nfunction parseTag(tagBody: string): { name: string; attributes: Record<string, string> } {\n let cursor = 0;\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n\n const nameStart = cursor;\n while (cursor < tagBody.length && !/\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n const name = tagBody.slice(nameStart, cursor);\n const attributes: Record<string, string> = {};\n\n while (cursor < tagBody.length) {\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n if (cursor >= tagBody.length) {\n break;\n }\n\n const keyStart = cursor;\n while (cursor < tagBody.length && !/[\\s=]/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n const key = tagBody.slice(keyStart, cursor);\n\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n\n if (tagBody[cursor] !== \"=\") {\n attributes[key] = \"\";\n continue;\n }\n cursor += 1;\n\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n\n const quote = tagBody[cursor];\n if (quote !== `\"` && quote !== `'`) {\n throw new Error(`Malformed XML attribute ${key}.`);\n }\n cursor += 1;\n\n const valueStart = cursor;\n while (cursor < tagBody.length && tagBody[cursor] !== quote) {\n cursor += 1;\n }\n const rawValue = tagBody.slice(valueStart, cursor);\n attributes[key] = decodeXmlEntities(rawValue);\n cursor += 1;\n }\n\n return { name, attributes };\n}\n\nfunction findTagEnd(xml: string, start: number): number {\n let cursor = start + 1;\n let quote: string | null = null;\n\n while (cursor < xml.length) {\n const current = xml[cursor];\n if (quote) {\n if (current === quote) {\n quote = null;\n }\n cursor += 1;\n continue;\n }\n\n if (current === `\"` || current === `'`) {\n quote = current;\n cursor += 1;\n continue;\n }\n\n if (current === \">\") {\n return cursor;\n }\n\n cursor += 1;\n }\n\n throw new Error(\"Malformed XML: missing >.\");\n}\n\nfunction decodeXmlEntities(value: string): string {\n return value.replace(/&(#x[0-9a-fA-F]+|#\\d+|amp|lt|gt|quot|apos);/g, (match, entity) => {\n switch (entity) {\n case \"amp\":\n return \"&\";\n case \"lt\":\n return \"<\";\n case \"gt\":\n return \">\";\n case \"quot\":\n return `\"`;\n case \"apos\":\n return \"'\";\n default:\n if (entity.startsWith(\"#x\")) {\n return String.fromCodePoint(Number.parseInt(entity.slice(2), 16));\n }\n if (entity.startsWith(\"#\")) {\n return String.fromCodePoint(Number.parseInt(entity.slice(1), 10));\n }\n return match;\n }\n });\n}\n","import type {\n AltChunkNode,\n BlockNode,\n CustomXmlNode,\n DiagnosticStore,\n DocumentRootNode,\n InlineNode,\n MediaCatalog,\n OpaqueBlockNode,\n OpaqueFragmentRecord,\n OpaqueInlineNode,\n ParagraphNode,\n PreservationStore,\n TableCellNode,\n TableNode,\n TableRowNode,\n TextMark,\n TextNode,\n SdtNode,\n} from \"../../model/canonical-document.ts\";\nimport type {\n ParsedAltChunkNode,\n ParsedBlockNode,\n ParsedCustomXmlNode,\n ParsedHyperlinkNode,\n ParsedInlineNode,\n ParsedImageNode,\n ParsedMainDocument,\n ParsedParagraphNode,\n ParsedSdtNode,\n ParsedTableBlockNode,\n ParsedTableCellNode,\n ParsedTableRowNode,\n} from \"../ooxml/parse-main-document.ts\";\n\nexport interface NormalizedTextDocument {\n content: DocumentRootNode;\n media: MediaCatalog;\n preservation: PreservationStore;\n diagnostics: DiagnosticStore;\n}\n\ninterface NormalizationState {\n nextFragmentIndex: number;\n nextWarningIndex: number;\n nextDiagnosticIndex: number;\n cursor: number;\n media: MediaCatalog;\n preservation: PreservationStore;\n diagnostics: DiagnosticStore;\n}\n\nexport function normalizeParsedTextDocument(\n document: ParsedMainDocument,\n packagePartName = \"/word/document.xml\",\n): NormalizedTextDocument {\n const state: NormalizationState = {\n nextFragmentIndex: 1,\n nextWarningIndex: 1,\n nextDiagnosticIndex: 1,\n cursor: 0,\n media: {\n items: {},\n },\n preservation: {\n opaqueFragments: {},\n packageParts: {},\n },\n diagnostics: {\n warnings: [],\n errors: [],\n },\n };\n\n const children = document.blocks.map((block, index) => {\n if (\n index > 0 &&\n document.blocks[index - 1]?.type === \"paragraph\" &&\n block.type === \"paragraph\"\n ) {\n state.cursor += 1;\n }\n\n return normalizeBlock(block, state, packagePartName);\n });\n\n return {\n content: {\n type: \"doc\",\n children,\n },\n media: state.media,\n preservation: state.preservation,\n diagnostics: state.diagnostics,\n };\n}\n\nfunction normalizeBlock(\n block: ParsedBlockNode,\n state: NormalizationState,\n packagePartName: string,\n): BlockNode {\n if (block.type === \"opaque_block\") {\n const opaque = recordOpaqueFragment(\"opaque_block\", block.rawXml, state, packagePartName);\n state.cursor += 1;\n return {\n type: \"opaque_block\",\n fragmentId: opaque.fragmentId,\n warningId: opaque.warningId,\n };\n }\n\n if (block.type === \"table\") {\n return normalizeTable(block, state, packagePartName);\n }\n\n if (block.type === \"sdt\") {\n return normalizeSdt(block, state, packagePartName);\n }\n\n if (block.type === \"custom_xml\") {\n return normalizeCustomXml(block, state, packagePartName);\n }\n\n if (block.type === \"alt_chunk\") {\n return normalizeAltChunk(block, state);\n }\n\n return normalizeParagraph(block, state, packagePartName);\n}\n\nfunction normalizeParagraph(\n paragraph: ParsedParagraphNode,\n state: NormalizationState,\n packagePartName: string,\n): ParagraphNode {\n const children = normalizeInlineChildren(paragraph.children, state, packagePartName);\n return {\n type: \"paragraph\",\n ...(paragraph.styleId ? { styleId: paragraph.styleId } : {}),\n ...(paragraph.numbering ? { numbering: paragraph.numbering } : {}),\n ...(paragraph.alignment ? { alignment: paragraph.alignment } : {}),\n ...(paragraph.spacing ? { spacing: paragraph.spacing } : {}),\n ...(paragraph.indentation ? { indentation: paragraph.indentation } : {}),\n ...(paragraph.tabStops && paragraph.tabStops.length > 0 ? { tabStops: paragraph.tabStops } : {}),\n ...(paragraph.keepNext ? { keepNext: paragraph.keepNext } : {}),\n ...(paragraph.keepLines ? { keepLines: paragraph.keepLines } : {}),\n ...(paragraph.outlineLevel !== undefined ? { outlineLevel: paragraph.outlineLevel } : {}),\n ...(paragraph.pageBreakBefore ? { pageBreakBefore: paragraph.pageBreakBefore } : {}),\n children,\n };\n}\n\nfunction normalizeTable(\n table: ParsedTableBlockNode,\n state: NormalizationState,\n packagePartName: string,\n): TableNode {\n const rows = table.rows.map((row) => normalizeTableRow(row, state, packagePartName));\n state.cursor += 1;\n return {\n type: \"table\",\n ...(table.styleId ? { styleId: table.styleId } : {}),\n ...(table.propertiesXml ? { propertiesXml: table.propertiesXml } : {}),\n gridColumns: table.gridColumns,\n rows,\n };\n}\n\nfunction normalizeTableRow(\n row: ParsedTableRowNode,\n state: NormalizationState,\n packagePartName: string,\n): TableRowNode {\n const cells = row.cells.map((cell) => normalizeTableCell(cell, state, packagePartName));\n return {\n type: \"table_row\",\n ...(row.propertiesXml ? { propertiesXml: row.propertiesXml } : {}),\n cells,\n };\n}\n\nfunction normalizeTableCell(\n cell: ParsedTableCellNode,\n state: NormalizationState,\n packagePartName: string,\n): TableCellNode {\n const children: BlockNode[] = [];\n for (const block of cell.children) {\n children.push(normalizeBlock(block, state, packagePartName));\n }\n // Ensure at least one child (OOXML requires at least one <w:p> per cell)\n if (children.length === 0) {\n children.push({ type: \"paragraph\", children: [] });\n }\n return {\n type: \"table_cell\",\n ...(cell.propertiesXml ? { propertiesXml: cell.propertiesXml } : {}),\n ...(cell.gridSpan ? { gridSpan: cell.gridSpan } : {}),\n ...(cell.verticalMerge ? { verticalMerge: cell.verticalMerge } : {}),\n children,\n };\n}\n\nfunction normalizeSdt(\n block: ParsedSdtNode,\n state: NormalizationState,\n packagePartName: string,\n): SdtNode {\n return {\n type: \"sdt\",\n properties: { ...block.properties },\n children: block.children.map((child) => normalizeBlock(child, state, packagePartName)),\n };\n}\n\nfunction normalizeCustomXml(\n block: ParsedCustomXmlNode,\n state: NormalizationState,\n packagePartName: string,\n): CustomXmlNode {\n return {\n type: \"custom_xml\",\n ...(block.uri ? { uri: block.uri } : {}),\n ...(block.element ? { element: block.element } : {}),\n children: block.children.map((child) => normalizeBlock(child, state, packagePartName)),\n };\n}\n\nfunction normalizeAltChunk(\n block: ParsedAltChunkNode,\n state: NormalizationState,\n): AltChunkNode {\n state.cursor += 1;\n return {\n type: \"alt_chunk\",\n relationshipId: block.relationshipId,\n };\n}\n\nfunction normalizeInlineChildren(\n nodes: ParsedInlineNode[],\n state: NormalizationState,\n packagePartName: string,\n): InlineNode[] {\n const normalized: InlineNode[] = [];\n\n for (const node of nodes) {\n switch (node.type) {\n case \"text\": {\n if (node.text.length === 0) {\n continue;\n }\n\n const previous = normalized[normalized.length - 1];\n if (previous?.type === \"text\" && sameMarks(previous.marks, node.marks)) {\n previous.text += node.text;\n } else {\n normalized.push({\n type: \"text\",\n text: node.text,\n ...(node.marks && node.marks.length > 0 ? { marks: node.marks } : {}),\n });\n }\n state.cursor += node.text.length;\n break;\n }\n case \"tab\":\n normalized.push({ type: \"tab\" });\n state.cursor += 1;\n break;\n case \"hard_break\":\n normalized.push({ type: \"hard_break\" });\n state.cursor += 1;\n break;\n case \"image\":\n normalized.push(normalizeImageNode(node, state));\n state.cursor += 1;\n break;\n case \"hyperlink\":\n normalized.push(normalizeHyperlink(node));\n state.cursor += measureHyperlink(node);\n break;\n case \"opaque_inline\": {\n const opaque = recordOpaqueFragment(\"opaque_inline\", node.rawXml, state, packagePartName);\n normalized.push(opaque as OpaqueInlineNode);\n state.cursor += 1;\n break;\n }\n }\n }\n\n return normalized;\n}\n\nfunction normalizeImageNode(\n node: ParsedImageNode,\n state: NormalizationState,\n): InlineNode {\n if (!state.media.items[node.mediaId]) {\n const packagePartName =\n typeof node.packagePartName === \"string\" && node.packagePartName.length > 0\n ? node.packagePartName\n : `/${node.mediaId.slice(\"media:\".length)}`;\n const filename =\n typeof node.filename === \"string\" && node.filename.length > 0\n ? node.filename\n : packagePartName.slice(packagePartName.lastIndexOf(\"/\") + 1) || \"image.bin\";\n state.media.items[node.mediaId] = {\n mediaId: node.mediaId,\n contentType: node.contentType ?? \"application/octet-stream\",\n filename,\n packagePartName,\n ...(node.relationshipId ? { relationshipId: node.relationshipId } : {}),\n ...(node.altText ? { altText: node.altText } : {}),\n };\n }\n\n return {\n type: \"image\",\n mediaId: node.mediaId,\n ...(node.altText ? { altText: node.altText } : {}),\n ...(node.placementXml ? { placementXml: node.placementXml } : {}),\n ...(node.display ? { display: node.display } : {}),\n ...(node.floating ? { floating: node.floating } : {}),\n };\n}\n\nfunction normalizeHyperlink(node: ParsedHyperlinkNode): {\n type: \"hyperlink\";\n href: string;\n children: Array<TextNode | { type: \"hard_break\" } | { type: \"tab\" }>;\n} {\n const children: Array<TextNode | { type: \"hard_break\" } | { type: \"tab\" }> = [];\n\n for (const child of node.children) {\n switch (child.type) {\n case \"text\": {\n if (child.text.length === 0) {\n continue;\n }\n const previous = children[children.length - 1];\n if (previous?.type === \"text\" && sameMarks(previous.marks, child.marks)) {\n previous.text += child.text;\n } else {\n children.push({\n type: \"text\",\n text: child.text,\n ...(child.marks && child.marks.length > 0 ? { marks: child.marks } : {}),\n });\n }\n break;\n }\n case \"tab\":\n children.push({ type: \"tab\" });\n break;\n case \"hard_break\":\n children.push({ type: \"hard_break\" });\n break;\n }\n }\n\n return {\n type: \"hyperlink\",\n href: node.href,\n children,\n };\n}\n\nfunction measureHyperlink(node: ParsedHyperlinkNode): number {\n return node.children.reduce((size, child) => {\n switch (child.type) {\n case \"text\":\n return size + child.text.length;\n case \"tab\":\n case \"hard_break\":\n return size + 1;\n }\n }, 0);\n}\n\nfunction sameMarks(left: TextMark[] | undefined, right: TextMark[] | undefined): boolean {\n const leftMarks = normalizeMarks(left);\n const rightMarks = normalizeMarks(right);\n return leftMarks.length === rightMarks.length && leftMarks.every((mark, index) => mark === rightMarks[index]);\n}\n\nfunction normalizeMarks(marks: TextMark[] | undefined): string[] {\n return [...(marks ?? []).map((mark) => mark.type)].sort();\n}\n\nfunction recordOpaqueFragment(\n nodeType: \"opaque_inline\" | \"opaque_block\",\n rawXml: string,\n state: NormalizationState,\n packagePartName: string,\n): { type: \"opaque_inline\" | \"opaque_block\"; fragmentId: string; warningId: string } {\n const fragmentId = `fragment:import-${state.nextFragmentIndex}`;\n state.nextFragmentIndex += 1;\n const warningId = `warning:import-${state.nextWarningIndex}`;\n state.nextWarningIndex += 1;\n const diagnosticId = `diagnostic:import-${state.nextDiagnosticIndex}`;\n state.nextDiagnosticIndex += 1;\n\n const rangeStart = state.cursor;\n const rangeEnd = state.cursor + 1;\n\n const record: OpaqueFragmentRecord = {\n fragmentId,\n payloadKind: \"xml-subtree\",\n payloadReference: rawXml,\n featureClass: \"preserve-only\",\n lastKnownRange: {\n from: rangeStart,\n to: rangeEnd,\n },\n warningId,\n packagePartName,\n };\n\n state.preservation.opaqueFragments[fragmentId] = record;\n state.diagnostics.warnings.push({\n diagnosticId,\n warningId,\n source: \"import\",\n message:\n nodeType === \"opaque_inline\"\n ? \"Unsupported inline OOXML was preserved as an opaque placeholder.\"\n : \"Unsupported block OOXML was preserved as an opaque placeholder.\",\n });\n\n return {\n type: nodeType,\n fragmentId,\n warningId,\n };\n}\n","import type { EditorError } from \"../../api/public-types.ts\";\n\nexport const CORRUPT_PACKAGE_REASONS = [\n \"zip-structure\",\n \"content-types-missing\",\n \"main-document-missing\",\n \"broken-relationship-graph\",\n \"malformed-xml\",\n \"unsupported-compression\",\n \"unreadable-package\",\n] as const;\n\nexport type CorruptPackageReason = (typeof CORRUPT_PACKAGE_REASONS)[number];\n\nexport interface CorruptPackageIssue {\n reason: CorruptPackageReason;\n message: string;\n partPath?: string;\n relationshipSourcePath?: string;\n relationshipId?: string;\n targetPartPath?: string;\n details?: Record<string, unknown>;\n}\n\nexport interface CorruptPackageErrorDetails extends Record<string, unknown> {\n stage: \"package\";\n reason: CorruptPackageReason;\n diagnosticsToken: string;\n partPath?: string;\n relationshipSourcePath?: string;\n relationshipId?: string;\n targetPartPath?: string;\n}\n\nexport function createCorruptPackageError(\n issue: CorruptPackageIssue,\n): EditorError {\n return {\n errorId: `error:package_corrupt:${createCorruptPackageDiagnosticsToken(issue)}`,\n code: \"package_corrupt\",\n message: issue.message,\n isFatal: true,\n source: \"import\",\n details: {\n stage: \"package\",\n reason: issue.reason,\n diagnosticsToken: createCorruptPackageDiagnosticsToken(issue),\n ...(issue.partPath ? { partPath: issue.partPath } : {}),\n ...(issue.relationshipSourcePath\n ? { relationshipSourcePath: issue.relationshipSourcePath }\n : {}),\n ...(issue.relationshipId ? { relationshipId: issue.relationshipId } : {}),\n ...(issue.targetPartPath ? { targetPartPath: issue.targetPartPath } : {}),\n ...(issue.details ?? {}),\n } satisfies CorruptPackageErrorDetails,\n };\n}\n\nexport function createMissingPartIssue(partPath: string): CorruptPackageIssue {\n return {\n reason:\n partPath === \"/[Content_Types].xml\"\n ? \"content-types-missing\"\n : partPath === \"/word/document.xml\"\n ? \"main-document-missing\"\n : \"unreadable-package\",\n message: `DOCX package is missing required part ${partPath}.`,\n partPath,\n };\n}\n\nexport function createBrokenRelationshipIssue(input: {\n relationshipSourcePath: string | null;\n relationshipId: string;\n targetPartPath: string;\n}): CorruptPackageIssue {\n return {\n reason: \"broken-relationship-graph\",\n message:\n input.relationshipSourcePath === null\n ? `DOCX package relationship ${input.relationshipId} points to missing part ${input.targetPartPath}.`\n : `DOCX part ${input.relationshipSourcePath} has unresolved relationship ${input.relationshipId} targeting ${input.targetPartPath}.`,\n relationshipSourcePath: input.relationshipSourcePath ?? undefined,\n relationshipId: input.relationshipId,\n targetPartPath: input.targetPartPath,\n };\n}\n\nexport function classifyCorruptPackageError(error: unknown): CorruptPackageIssue {\n const message =\n error instanceof Error\n ? error.message\n : typeof error === \"string\"\n ? error\n : \"DOCX package could not be read safely.\";\n const normalized = message.toLowerCase();\n\n if (\n normalized.includes(\"end of central directory\") ||\n normalized.includes(\"zip archive\") ||\n normalized.includes(\"central directory signature\") ||\n normalized.includes(\"local file header signature\")\n ) {\n return {\n reason: \"zip-structure\",\n message,\n };\n }\n\n if (normalized.includes(\"compression\")) {\n return {\n reason: \"unsupported-compression\",\n message,\n };\n }\n\n if (normalized.includes(\"relationship\")) {\n return {\n reason: \"broken-relationship-graph\",\n message,\n };\n }\n\n if (normalized.includes(\"/[content_types].xml\")) {\n return createMissingPartIssue(\"/[Content_Types].xml\");\n }\n\n if (normalized.includes(\"/word/document.xml\")) {\n return createMissingPartIssue(\"/word/document.xml\");\n }\n\n if (normalized.includes(\"xml\")) {\n return {\n reason: \"malformed-xml\",\n message,\n };\n }\n\n return {\n reason: \"unreadable-package\",\n message,\n };\n}\n\nexport function createCorruptPackageDiagnosticsToken(\n issue: CorruptPackageIssue,\n): string {\n const fields = [\n issue.reason,\n issue.message,\n issue.partPath ?? \"\",\n issue.relationshipSourcePath ?? \"\",\n issue.relationshipId ?? \"\",\n issue.targetPartPath ?? \"\",\n ];\n\n let hash = 2166136261;\n for (const field of fields) {\n for (let index = 0; index < field.length; index += 1) {\n hash ^= field.charCodeAt(index);\n hash = Math.imul(hash, 16777619) >>> 0;\n }\n }\n\n return `pkg-${hash.toString(16).padStart(8, \"0\")}`;\n}\n","import type { OpcPackage } from \"../opc/package-reader.ts\";\nimport type { OpcPackagePart, OpcRelationship } from \"../ooxml/part-manifest.ts\";\n\nexport function reattachPreservedParts(\n sourcePackage: OpcPackage,\n workingParts: Map<string, OpcPackagePart>,\n packageRelationships: OpcRelationship[],\n ownedPaths: ReadonlySet<string>,\n): void {\n for (const [path, sourcePart] of sourcePackage.parts.entries()) {\n if (ownedPaths.has(path) || sourcePart.surfaceKind !== \"content\") {\n continue;\n }\n\n if (!workingParts.has(path)) {\n workingParts.set(path, clonePart(sourcePart));\n continue;\n }\n\n const currentPart = workingParts.get(path);\n if (!currentPart) {\n continue;\n }\n\n currentPart.contentType = sourcePart.contentType;\n currentPart.relationships = sourcePart.relationships.map(cloneRelationship);\n currentPart.relationshipsPartPath = sourcePart.relationshipsPartPath;\n currentPart.compression = sourcePart.compression;\n currentPart.bytes = new Uint8Array(sourcePart.bytes);\n currentPart.crc32 = sourcePart.crc32;\n }\n\n const knownPackageRelationshipIds = new Set(packageRelationships.map((relationship) => relationship.id));\n for (const relationship of sourcePackage.manifest.packageRelationships) {\n if (knownPackageRelationshipIds.has(relationship.id)) {\n continue;\n }\n\n packageRelationships.push(cloneRelationship(relationship));\n knownPackageRelationshipIds.add(relationship.id);\n }\n}\n\nfunction clonePart(part: OpcPackagePart): OpcPackagePart {\n return {\n ...part,\n relationships: part.relationships.map(cloneRelationship),\n bytes: new Uint8Array(part.bytes),\n };\n}\n\nfunction cloneRelationship(relationship: OpcRelationship): OpcRelationship {\n return { ...relationship };\n}\n","import {\n CONTENT_TYPES_PATH,\n PACKAGE_RELATIONSHIPS_PATH,\n OpcCompressionMethod,\n OpcPackagePart,\n OpcRelationship,\n comparePartPaths,\n getRelationshipsPartPath,\n normalizePartPath,\n} from \"../ooxml/part-manifest.ts\";\nimport type { OpcPackage } from \"../opc/package-reader.ts\";\nimport { writeOpcPackage } from \"../opc/package-writer.ts\";\nimport { reattachPreservedParts } from \"./reattach-preserved-parts.ts\";\n\nexport interface ExportPartReplacement {\n path: string;\n bytes: Uint8Array;\n contentType: string;\n relationships?: OpcRelationship[];\n compression?: OpcCompressionMethod;\n}\n\nexport interface ExportSessionSnapshot {\n manifest: OpcPackage[\"manifest\"];\n parts: Map<string, OpcPackagePart>;\n}\n\nexport class ExportSession {\n private readonly ownedPaths: Set<string>;\n private readonly workingParts: Map<string, OpcPackagePart>;\n private readonly packageRelationships: OpcRelationship[];\n\n public constructor(private readonly sourcePackage: OpcPackage, ownedOutputPaths: Iterable<string>) {\n this.ownedPaths = new Set(\n [...ownedOutputPaths].map((path) => {\n const normalized = normalizePartPath(path);\n if (normalized === CONTENT_TYPES_PATH || normalized.endsWith(\".rels\") || normalized === PACKAGE_RELATIONSHIPS_PATH) {\n throw new Error(`ExportSession cannot directly own reserved OPC manifest path ${normalized}.`);\n }\n\n return normalized;\n }),\n );\n this.workingParts = cloneParts(sourcePackage.parts);\n this.packageRelationships = sourcePackage.manifest.packageRelationships.map(cloneRelationship);\n }\n\n public replaceOwnedPart(replacement: ExportPartReplacement): void {\n const normalizedPath = normalizePartPath(replacement.path);\n if (!this.ownedPaths.has(normalizedPath)) {\n throw new Error(`Attempted to rewrite non-owned OPC path ${normalizedPath}.`);\n }\n\n const existing = this.workingParts.get(normalizedPath);\n const nextPart: OpcPackagePart = {\n path: normalizedPath,\n surfaceKind: \"content\",\n contentType: replacement.contentType,\n relationshipsPartPath: getRelationshipsPartPath(normalizedPath),\n relationships: (replacement.relationships ?? existing?.relationships ?? []).map(cloneRelationship),\n compression: replacement.compression ?? existing?.compression ?? \"deflate\",\n bytes: new Uint8Array(replacement.bytes),\n crc32: 0,\n };\n\n this.workingParts.set(normalizedPath, nextPart);\n }\n\n public withOwnedPart(replacement: ExportPartReplacement): ExportSession {\n this.replaceOwnedPart(replacement);\n return this;\n }\n\n public toPackage(): OpcPackage {\n reattachPreservedParts(\n this.sourcePackage,\n this.workingParts,\n this.packageRelationships,\n this.ownedPaths,\n );\n const parts = pruneReservedManifestParts(this.workingParts);\n const manifest = buildManifest(parts, this.packageRelationships, this.sourcePackage.manifest.contentTypes);\n return {\n manifest,\n parts,\n sourceByteLength: this.sourcePackage.sourceByteLength,\n };\n }\n\n public serialize(): Uint8Array {\n return writeOpcPackage(this.toPackage());\n }\n}\n\nexport function createExportSession(\n sourcePackage: OpcPackage,\n ownedOutputPaths: Iterable<string>,\n): ExportSession {\n return new ExportSession(sourcePackage, ownedOutputPaths);\n}\n\nfunction cloneParts(parts: Map<string, OpcPackagePart>): Map<string, OpcPackagePart> {\n return new Map(\n [...parts.entries()].map(([path, part]) => [\n path,\n {\n ...part,\n relationships: part.relationships.map(cloneRelationship),\n bytes: new Uint8Array(part.bytes),\n },\n ]),\n );\n}\n\nfunction pruneReservedManifestParts(parts: Map<string, OpcPackagePart>): Map<string, OpcPackagePart> {\n return new Map(\n [...parts.entries()].filter(([path]) => path !== CONTENT_TYPES_PATH && path !== PACKAGE_RELATIONSHIPS_PATH && !path.includes(\"/_rels/\")),\n );\n}\n\nfunction buildManifest(\n parts: Map<string, OpcPackagePart>,\n packageRelationships: OpcRelationship[],\n contentTypesSeed: OpcPackage[\"manifest\"][\"contentTypes\"],\n): OpcPackage[\"manifest\"] {\n const partsList = [...parts.values()].sort((left, right) => comparePartPaths(left.path, right.path));\n\n const overrides = { ...contentTypesSeed.overrides };\n for (const key of Object.keys(overrides)) {\n if (!parts.has(normalizePartPath(key))) {\n delete overrides[key];\n }\n }\n\n for (const part of partsList) {\n if (!part.contentType) {\n throw new Error(`Cannot export part without content type: ${part.path}`);\n }\n\n overrides[part.path] = part.contentType;\n }\n\n return {\n contentTypes: {\n defaults: { ...contentTypesSeed.defaults },\n overrides,\n },\n packageRelationships: packageRelationships.map(cloneRelationship),\n parts: partsList.map((part) => ({\n path: part.path,\n surfaceKind: part.surfaceKind,\n contentType: part.contentType,\n relationshipsPartPath: part.relationshipsPartPath,\n relationships: part.relationships.map(cloneRelationship),\n compression: part.compression,\n byteLength: part.bytes.byteLength,\n })),\n };\n}\n\nfunction cloneRelationship(relationship: OpcRelationship): OpcRelationship {\n return { ...relationship };\n}\n\nexport { buildManifest };\n","import type { OpaqueFragmentRecord, PreservationStore } from \"../model/canonical-document.ts\";\nimport type { OpcRelationship } from \"../io/ooxml/part-manifest.ts\";\n\nexport function retainRelationshipsForFragment(\n fragment: OpaqueFragmentRecord | undefined,\n relationships: OpcRelationship[],\n existingRelationshipMap: Map<string, OpcRelationship>,\n retainedRelationshipIds: Set<string>,\n): void {\n if (!fragment || fragment.payloadKind !== \"xml-subtree\") {\n return;\n }\n\n for (const relationshipId of extractReferencedRelationshipIds(fragment.payloadReference)) {\n if (retainedRelationshipIds.has(relationshipId)) {\n continue;\n }\n\n const relationship = existingRelationshipMap.get(relationshipId);\n if (!relationship) {\n continue;\n }\n\n relationships.push({ ...relationship });\n retainedRelationshipIds.add(relationshipId);\n }\n}\n\nexport function retainRelationshipsForStore(\n store: PreservationStore,\n relationships: OpcRelationship[],\n existingRelationshipMap: Map<string, OpcRelationship>,\n retainedRelationshipIds: Set<string>,\n): void {\n for (const fragment of Object.values(store.opaqueFragments)) {\n retainRelationshipsForFragment(\n fragment,\n relationships,\n existingRelationshipMap,\n retainedRelationshipIds,\n );\n }\n}\n\nexport function extractReferencedRelationshipIds(xml: string): Set<string> {\n const relationshipIds = new Set<string>();\n const relationshipPattern = /\\br:id=([\"'])([^\"']+)\\1/gu;\n\n for (const match of xml.matchAll(relationshipPattern)) {\n const relationshipId = match[2];\n if (relationshipId) {\n relationshipIds.add(relationshipId);\n }\n }\n\n return relationshipIds;\n}\n","import type { NumberingCatalog, ParagraphNode } from \"../../model/canonical-document.ts\";\n\nexport const WORD_NUMBERING_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml\";\n\nexport function serializeNumberingXml(catalog: NumberingCatalog): string {\n const abstractDefinitions = Object.values(catalog.abstractDefinitions).sort((left, right) =>\n compareSerializedIds(left.abstractNumberingId, right.abstractNumberingId),\n );\n const instances = Object.values(catalog.instances).sort((left, right) =>\n compareSerializedIds(left.numberingInstanceId, right.numberingInstanceId),\n );\n\n const body = [\n ...abstractDefinitions.map((definition) => serializeAbstractDefinition(definition)),\n ...instances.map((instance) => serializeInstance(instance)),\n ].join(\"\");\n\n return [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n `<w:numbering xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">${body}</w:numbering>`,\n ].join(\"\\n\");\n}\n\nexport function serializeParagraphNumberingProperties(\n numbering: ParagraphNode[\"numbering\"],\n): string {\n if (!numbering) {\n return \"\";\n }\n\n return `<w:numPr><w:ilvl w:val=\"${numbering.level}\"/><w:numId w:val=\"${escapeAttribute(\n stripCanonicalPrefix(numbering.numberingInstanceId, \"num:\"),\n )}\"/></w:numPr>`;\n}\n\nfunction serializeAbstractDefinition(definition: NumberingCatalog[\"abstractDefinitions\"][string]): string {\n const abstractNumId = escapeAttribute(\n stripCanonicalPrefix(definition.abstractNumberingId, \"abstract-num:\"),\n );\n const levels = [...definition.levels]\n .sort((left, right) => left.level - right.level)\n .map((level) => serializeLevel(level))\n .join(\"\");\n\n return `<w:abstractNum w:abstractNumId=\"${abstractNumId}\">${levels}</w:abstractNum>`;\n}\n\nfunction serializeLevel(level: NumberingCatalog[\"abstractDefinitions\"][string][\"levels\"][number]): string {\n const start = level.startAt !== undefined ? `<w:start w:val=\"${level.startAt}\"/>` : \"\";\n const paragraphStyle = level.paragraphStyleId\n ? `<w:pStyle w:val=\"${escapeAttribute(level.paragraphStyleId)}\"/>`\n : \"\";\n\n return `<w:lvl w:ilvl=\"${level.level}\">${start}<w:numFmt w:val=\"${escapeAttribute(\n level.format,\n )}\"/><w:lvlText w:val=\"${escapeAttribute(level.text)}\"/>${paragraphStyle}</w:lvl>`;\n}\n\nfunction serializeInstance(instance: NumberingCatalog[\"instances\"][string]): string {\n const numId = escapeAttribute(stripCanonicalPrefix(instance.numberingInstanceId, \"num:\"));\n const abstractNumId = escapeAttribute(\n stripCanonicalPrefix(instance.abstractNumberingId, \"abstract-num:\"),\n );\n const overrides = [...instance.overrides]\n .sort((left, right) => left.level - right.level)\n .map((override) => serializeOverride(override))\n .join(\"\");\n\n return `<w:num w:numId=\"${numId}\"><w:abstractNumId w:val=\"${abstractNumId}\"/>${overrides}</w:num>`;\n}\n\nfunction serializeOverride(override: NumberingCatalog[\"instances\"][string][\"overrides\"][number]): string {\n const startOverride =\n override.startAt !== undefined ? `<w:startOverride w:val=\"${override.startAt}\"/>` : \"\";\n return `<w:lvlOverride w:ilvl=\"${override.level}\">${startOverride}</w:lvlOverride>`;\n}\n\nfunction compareSerializedIds(left: string, right: string): number {\n return stripKnownPrefix(left).localeCompare(stripKnownPrefix(right), \"en\", { numeric: true });\n}\n\nfunction stripKnownPrefix(value: string): string {\n return value.replace(/^abstract-num:|^num:/, \"\");\n}\n\nfunction stripCanonicalPrefix(value: string, prefix: \"abstract-num:\" | \"num:\"): string {\n return value.startsWith(prefix) ? value.slice(prefix.length) : value;\n}\n\nfunction escapeAttribute(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\n}\n","import type {\n AltChunkNode,\n BorderSpec,\n CustomXmlNode,\n DocumentRootNode,\n InlineNode,\n MediaCatalog,\n ParagraphNode,\n PreservationStore,\n SdtNode,\n TableNode,\n TableCellNode,\n TextMark,\n} from \"../../model/canonical-document.ts\";\nimport type { OpcRelationship } from \"../ooxml/part-manifest.ts\";\nimport type { RevisionParagraphBoundary } from \"../ooxml/revision-boundaries.ts\";\nimport { getOpaqueFragment } from \"../../preservation/store.ts\";\nimport { retainRelationshipsForFragment } from \"../../preservation/relationship-retention.ts\";\nimport { serializeParagraphNumberingProperties } from \"./serialize-numbering.ts\";\n\nconst HYPERLINK_RELATIONSHIP_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\";\n\nexport interface SerializedMainDocument {\n documentXml: string;\n relationships: OpcRelationship[];\n paragraphBoundaries: RevisionParagraphBoundary[];\n}\n\nexport interface SerializeMainDocumentOptions {\n documentAttributes?: Record<string, string>;\n media?: MediaCatalog;\n}\n\ninterface SerializationState {\n nextHyperlinkRelationshipIndex: number;\n relationships: OpcRelationship[];\n existingRelationshipMap: Map<string, OpcRelationship>;\n retainedRelationshipIds: Set<string>;\n media: MediaCatalog;\n preservation: PreservationStore;\n}\n\ninterface InlineSerializationResult {\n xml: string;\n cursor: number;\n boundaries: Map<number, number>;\n}\n\ninterface ParagraphSerializationResult {\n xml: string;\n nextCursor: number;\n boundary: RevisionParagraphBoundary;\n}\n\nexport function serializeMainDocument(\n content: DocumentRootNode,\n preservation: PreservationStore = { opaqueFragments: {}, packageParts: {} },\n existingRelationships: readonly OpcRelationship[] = [],\n options: SerializeMainDocumentOptions = {},\n): SerializedMainDocument {\n const nextRelationshipIndex =\n existingRelationships.reduce((maxIndex, relationship) => {\n const match = /^rIdHyperlink(\\d+)$/.exec(relationship.id);\n return match ? Math.max(maxIndex, Number.parseInt(match[1] ?? \"0\", 10)) : maxIndex;\n }, 0) + 1;\n const state: SerializationState = {\n nextHyperlinkRelationshipIndex: nextRelationshipIndex,\n relationships: existingRelationships.filter(\n (relationship) => relationship.type !== HYPERLINK_RELATIONSHIP_TYPE,\n ).map(cloneRelationship),\n existingRelationshipMap: new Map(\n existingRelationships.map((relationship) => [relationship.id, cloneRelationship(relationship)]),\n ),\n retainedRelationshipIds: new Set(\n existingRelationships\n .filter((relationship) => relationship.type !== HYPERLINK_RELATIONSHIP_TYPE)\n .map((relationship) => relationship.id),\n ),\n media: options.media ?? { items: {} },\n preservation,\n };\n const documentOpen = `<w:document${serializeDocumentAttributes(options.documentAttributes, content)}>`;\n const prefix = [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n documentOpen,\n ` <w:body>`,\n ].join(\"\\n\");\n const suffix = `</w:body>\\n</w:document>`;\n const bodyPieces: string[] = [];\n const paragraphBoundaries: RevisionParagraphBoundary[] = [];\n let bodyLength = 0;\n let sectionPropertiesXml = \"<w:sectPr/>\";\n let cursor = 0;\n let paragraphIndex = -1;\n let previousWasParagraph = false;\n\n for (const block of content.children) {\n if (block.type === \"paragraph\") {\n if (previousWasParagraph) {\n cursor += 1;\n }\n\n paragraphIndex += 1;\n const serializedParagraph = serializeParagraph(\n block,\n state,\n cursor,\n paragraphIndex,\n );\n const paragraphOffset = prefix.length + bodyLength;\n bodyPieces.push(serializedParagraph.xml);\n bodyLength += serializedParagraph.xml.length;\n paragraphBoundaries.push(\n offsetParagraphBoundary(serializedParagraph.boundary, paragraphOffset),\n );\n cursor = serializedParagraph.nextCursor;\n previousWasParagraph = true;\n continue;\n }\n\n if (block.type === \"table\") {\n const tableXml = serializeTableNode(block, state);\n bodyPieces.push(tableXml);\n bodyLength += tableXml.length;\n cursor += 1;\n previousWasParagraph = false;\n continue;\n }\n\n if (block.type === \"sdt\") {\n const sdtXml = serializeSdtNode(block, state);\n bodyPieces.push(sdtXml);\n bodyLength += sdtXml.length;\n previousWasParagraph = false;\n continue;\n }\n\n if (block.type === \"custom_xml\") {\n const customXml = serializeCustomXmlNode(block, state);\n bodyPieces.push(customXml);\n bodyLength += customXml.length;\n previousWasParagraph = false;\n continue;\n }\n\n if (block.type === \"alt_chunk\") {\n const altChunkXml = serializeAltChunkNode(block);\n bodyPieces.push(altChunkXml);\n bodyLength += altChunkXml.length;\n cursor += 1;\n previousWasParagraph = false;\n continue;\n }\n\n const blockXml = serializeOpaqueBlock(block, state);\n if (looksLikeSectionPropertiesXml(blockXml)) {\n sectionPropertiesXml = blockXml;\n } else {\n bodyPieces.push(blockXml);\n bodyLength += blockXml.length;\n }\n cursor += 1;\n previousWasParagraph = false;\n }\n\n const bodyXml = bodyPieces.join(\"\");\n const documentXml = `${prefix}${bodyXml || \"<w:p><w:r><w:t></w:t></w:r></w:p>\"}${sectionPropertiesXml}${suffix}`;\n\n return {\n documentXml,\n relationships: state.relationships,\n paragraphBoundaries,\n };\n}\n\nfunction serializeOpaqueBlock(\n block: Extract<DocumentRootNode[\"children\"][number], { type: \"opaque_block\" }>,\n state: SerializationState,\n): string {\n return lookupOpaqueXml(block.fragmentId, state);\n}\n\nfunction serializeTableNode(\n table: TableNode,\n state: SerializationState,\n): string {\n const propertiesXml = table.propertiesXml ?? buildTablePropertiesXml(table);\n const gridXml =\n table.gridColumns.length > 0\n ? `<w:tblGrid>${table.gridColumns\n .map((width) => `<w:gridCol w:w=\"${width}\"/>`)\n .join(\"\")}</w:tblGrid>`\n : \"\";\n const rowsXml = table.rows\n .map((row) => {\n const rowPropertiesXml = row.propertiesXml ?? \"\";\n const cellsXml = row.cells\n .map((cell) => serializeTableCellNode(cell, state))\n .join(\"\");\n return `<w:tr>${rowPropertiesXml}${cellsXml}</w:tr>`;\n })\n .join(\"\");\n return `<w:tbl>${propertiesXml}${gridXml}${rowsXml}</w:tbl>`;\n}\n\nfunction serializeTableCellNode(\n cell: TableCellNode,\n state: SerializationState,\n): string {\n const propertiesXml = cell.propertiesXml ?? buildCellPropertiesXml(cell);\n const blocksXml = cell.children\n .map((child) => serializeBlockNode(child, state))\n .join(\"\");\n return `<w:tc>${propertiesXml}${blocksXml || \"<w:p/>\"}</w:tc>`;\n}\n\nfunction serializeBlockNode(\n block: DocumentRootNode[\"children\"][number],\n state: SerializationState,\n): string {\n switch (block.type) {\n case \"paragraph\":\n return serializeTableCellParagraph(block, state);\n case \"table\":\n return serializeTableNode(block, state);\n case \"sdt\":\n return serializeSdtNode(block, state);\n case \"custom_xml\":\n return serializeCustomXmlNode(block, state);\n case \"alt_chunk\":\n return serializeAltChunkNode(block);\n case \"opaque_block\":\n return lookupOpaqueXml(block.fragmentId, state);\n case \"section_break\":\n return block.propertiesXml ?? \"<w:sectPr/>\";\n }\n}\n\nfunction buildCellPropertiesXml(cell: TableCellNode): string {\n const children: string[] = [];\n if (cell.gridSpan && cell.gridSpan > 1) {\n children.push(`<w:gridSpan w:val=\"${cell.gridSpan}\"/>`);\n }\n if (cell.verticalMerge) {\n children.push(\n cell.verticalMerge === \"restart\"\n ? `<w:vMerge w:val=\"restart\"/>`\n : `<w:vMerge/>`,\n );\n }\n return children.length > 0 ? `<w:tcPr>${children.join(\"\")}</w:tcPr>` : \"\";\n}\n\nfunction serializeSdtNode(\n block: SdtNode,\n state: SerializationState,\n): string {\n const propertiesXml = block.properties.propertiesXml ?? buildSdtPropertiesXml(block);\n const childrenXml = block.children.map((child) => serializeBlockNode(child, state)).join(\"\") || \"<w:p/>\";\n return `<w:sdt>${propertiesXml}<w:sdtContent>${childrenXml}</w:sdtContent></w:sdt>`;\n}\n\nfunction serializeCustomXmlNode(\n block: CustomXmlNode,\n state: SerializationState,\n): string {\n const attrs: string[] = [];\n if (block.uri) {\n attrs.push(`w:uri=\"${escapeAttribute(block.uri)}\"`);\n }\n if (block.element) {\n attrs.push(`w:element=\"${escapeAttribute(block.element)}\"`);\n }\n const attrXml = attrs.length > 0 ? ` ${attrs.join(\" \")}` : \"\";\n const childrenXml = block.children.map((child) => serializeBlockNode(child, state)).join(\"\");\n return `<w:customXml${attrXml}>${childrenXml || \"<w:p/>\"}</w:customXml>`;\n}\n\nfunction serializeAltChunkNode(\n block: AltChunkNode,\n): string {\n return `<w:altChunk r:id=\"${escapeAttribute(block.relationshipId)}\"/>`;\n}\n\nfunction buildSdtPropertiesXml(block: SdtNode): string {\n const children: string[] = [];\n if (block.properties.alias) {\n children.push(`<w:alias w:val=\"${escapeAttribute(block.properties.alias)}\"/>`);\n }\n if (block.properties.tag) {\n children.push(`<w:tag w:val=\"${escapeAttribute(block.properties.tag)}\"/>`);\n }\n if (block.properties.lock) {\n children.push(`<w:lock w:val=\"${escapeAttribute(block.properties.lock)}\"/>`);\n }\n if (block.properties.sdtType) {\n children.push(`<w:${block.properties.sdtType}/>`);\n }\n return children.length > 0 ? `<w:sdtPr>${children.join(\"\")}</w:sdtPr>` : \"<w:sdtPr/>\";\n}\n\nfunction serializeTableCellParagraph(\n paragraph: ParagraphNode,\n state: SerializationState,\n): string {\n let xml = \"<w:p>\";\n const paragraphPropertiesXml = buildParagraphPropertiesXml(paragraph);\n if (paragraphPropertiesXml.length > 0) {\n xml += paragraphPropertiesXml;\n }\n const childrenXml = paragraph.children.map((child) => serializeTableInlineNode(child, state)).join(\"\");\n xml += childrenXml || \"<w:r><w:t></w:t></w:r>\";\n xml += \"</w:p>\";\n return xml;\n}\n\nfunction serializeTableInlineNode(\n node: InlineNode,\n state: SerializationState,\n): string {\n switch (node.type) {\n case \"text\": {\n const marks = node.marks;\n const properties = serializeRunPropertiesFromMarks(marks);\n const preserve = requiresPreservedSpace(node.text) ? ` xml:space=\"preserve\"` : \"\";\n return `<w:r>${properties}<w:t${preserve}>${escapeXml(node.text)}</w:t></w:r>`;\n }\n case \"tab\":\n return \"<w:r><w:tab/></w:r>\";\n case \"column_break\":\n return \"<w:r><w:br w:type=\\\"column\\\"/></w:r>\";\n case \"hard_break\":\n return \"<w:r><w:br/></w:r>\";\n case \"symbol\": {\n const properties = serializeRunPropertiesFromMarks(node.marks);\n const fontAttribute = node.font ? ` w:font=\"${escapeAttribute(node.font)}\"` : \"\";\n return `<w:r>${properties}<w:sym${fontAttribute} w:char=\"${escapeAttribute(node.char)}\"/></w:r>`;\n }\n case \"image\":\n return serializeImageNode(node, state);\n case \"opaque_inline\":\n return lookupOpaqueXml(node.fragmentId, state);\n case \"chart_preview\":\n case \"smartart_preview\":\n case \"shape\":\n case \"wordart\":\n case \"vml_shape\":\n return node.rawXml;\n case \"hyperlink\": {\n const hyperlinkOpen = node.href.startsWith(\"#\")\n ? `<w:hyperlink w:anchor=\"${escapeAttribute(node.href.slice(1))}\">`\n : (() => {\n const relationshipId = `rIdHyperlink${state.nextHyperlinkRelationshipIndex}`;\n state.nextHyperlinkRelationshipIndex += 1;\n state.relationships.push({\n id: relationshipId,\n type: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\",\n target: node.href,\n targetMode: \"external\",\n });\n state.retainedRelationshipIds.add(relationshipId);\n return `<w:hyperlink r:id=\"${relationshipId}\">`;\n })();\n const childrenXml = node.children.map((child) => serializeTableInlineNode(child, state)).join(\"\");\n return `${hyperlinkOpen}${childrenXml}</w:hyperlink>`;\n }\n }\n}\n\nfunction buildParagraphPropertiesXml(paragraph: ParagraphNode): string {\n const children: string[] = [];\n\n if (paragraph.styleId) {\n children.push(`<w:pStyle w:val=\"${escapeAttribute(paragraph.styleId)}\"/>`);\n }\n if (paragraph.keepNext) {\n children.push(\"<w:keepNext/>\");\n }\n if (paragraph.keepLines) {\n children.push(\"<w:keepLines/>\");\n }\n if (paragraph.pageBreakBefore) {\n children.push(\"<w:pageBreakBefore/>\");\n }\n if (paragraph.widowControl) {\n children.push(\"<w:widowControl/>\");\n }\n if (paragraph.outlineLevel !== undefined) {\n children.push(`<w:outlineLvl w:val=\"${paragraph.outlineLevel}\"/>`);\n }\n if (paragraph.numbering) {\n children.push(serializeParagraphNumberingProperties(paragraph.numbering));\n }\n if (paragraph.spacing) {\n const s = paragraph.spacing;\n const attrs: string[] = [];\n if (s.before !== undefined) attrs.push(`w:before=\"${s.before}\"`);\n if (s.after !== undefined) attrs.push(`w:after=\"${s.after}\"`);\n if (s.line !== undefined) attrs.push(`w:line=\"${s.line}\"`);\n if (s.lineRule !== undefined) attrs.push(`w:lineRule=\"${s.lineRule}\"`);\n if (attrs.length > 0) children.push(`<w:spacing ${attrs.join(\" \")}/>`);\n }\n if (paragraph.indentation) {\n const ind = paragraph.indentation;\n const attrs: string[] = [];\n if (ind.left !== undefined) attrs.push(`w:left=\"${ind.left}\"`);\n if (ind.right !== undefined) attrs.push(`w:right=\"${ind.right}\"`);\n if (ind.firstLine !== undefined) attrs.push(`w:firstLine=\"${ind.firstLine}\"`);\n if (ind.hanging !== undefined) attrs.push(`w:hanging=\"${ind.hanging}\"`);\n if (attrs.length > 0) children.push(`<w:ind ${attrs.join(\" \")}/>`);\n }\n if (paragraph.alignment) {\n children.push(`<w:jc w:val=\"${paragraph.alignment}\"/>`);\n }\n if (paragraph.borders) {\n const bordersXml = serializeParagraphBorders(paragraph.borders);\n if (bordersXml) {\n children.push(bordersXml);\n }\n }\n if (paragraph.shading) {\n const shadingXml = serializeParagraphShading(paragraph.shading);\n if (shadingXml) {\n children.push(shadingXml);\n }\n }\n if (paragraph.bidi) {\n children.push(\"<w:bidi/>\");\n }\n if (paragraph.suppressLineNumbers) {\n children.push(\"<w:suppressLineNumbers/>\");\n }\n if (paragraph.cnfStyle) {\n children.push(`<w:cnfStyle w:val=\"${escapeAttribute(paragraph.cnfStyle)}\"/>`);\n }\n if (paragraph.tabStops && paragraph.tabStops.length > 0) {\n const tabsXml = paragraph.tabStops.map((tab) => {\n const leaderAttr = tab.leader ? ` w:leader=\"${tab.leader}\"` : \"\";\n return `<w:tab w:val=\"${tab.align}\" w:pos=\"${tab.position}\"${leaderAttr}/>`;\n }).join(\"\");\n children.push(`<w:tabs>${tabsXml}</w:tabs>`);\n }\n\n if (children.length === 0) return \"\";\n return `<w:pPr>${children.join(\"\")}</w:pPr>`;\n}\n\nfunction buildTablePropertiesXml(table: TableNode): string {\n const children: string[] = [];\n if (table.styleId) {\n children.push(`<w:tblStyle w:val=\"${escapeAttribute(table.styleId)}\"/>`);\n }\n if (table.tblLook) {\n const attrs: string[] = [];\n if (table.tblLook.val) {\n attrs.push(`w:val=\"${escapeAttribute(table.tblLook.val)}\"`);\n }\n for (const [key, attr] of [\n [\"firstRow\", \"w:firstRow\"],\n [\"lastRow\", \"w:lastRow\"],\n [\"firstColumn\", \"w:firstColumn\"],\n [\"lastColumn\", \"w:lastColumn\"],\n [\"noHBand\", \"w:noHBand\"],\n [\"noVBand\", \"w:noVBand\"],\n ] as const) {\n const value = table.tblLook[key];\n if (value !== undefined) {\n attrs.push(`${attr}=\"${value ? \"1\" : \"0\"}\"`);\n }\n }\n if (attrs.length > 0) {\n children.push(`<w:tblLook ${attrs.join(\" \")}/>`);\n }\n }\n return children.length > 0 ? `<w:tblPr>${children.join(\"\")}</w:tblPr>` : \"\";\n}\n\nfunction serializeParagraphBorders(borders: ParagraphNode[\"borders\"]): string {\n if (!borders) {\n return \"\";\n }\n const parts: string[] = [];\n for (const [name, border] of [\n [\"top\", borders.top],\n [\"left\", borders.left],\n [\"bottom\", borders.bottom],\n [\"right\", borders.right],\n [\"bar\", borders.bar],\n [\"between\", borders.between],\n ] as const) {\n const xml = serializeBorder(name, border);\n if (xml) {\n parts.push(xml);\n }\n }\n return parts.length > 0 ? `<w:pBdr>${parts.join(\"\")}</w:pBdr>` : \"\";\n}\n\nfunction serializeBorder(name: string, border: BorderSpec | undefined): string {\n if (!border) {\n return \"\";\n }\n const attrs: string[] = [];\n if (border.value) attrs.push(`w:val=\"${escapeAttribute(border.value)}\"`);\n if (border.size !== undefined) attrs.push(`w:sz=\"${border.size}\"`);\n if (border.space !== undefined) attrs.push(`w:space=\"${border.space}\"`);\n if (border.color) attrs.push(`w:color=\"${escapeAttribute(border.color)}\"`);\n return attrs.length > 0 ? `<w:${name} ${attrs.join(\" \")}/>` : \"\";\n}\n\nfunction serializeParagraphShading(shading: ParagraphNode[\"shading\"]): string {\n if (!shading) {\n return \"\";\n }\n const attrs: string[] = [];\n if (shading.val) attrs.push(`w:val=\"${escapeAttribute(shading.val)}\"`);\n if (shading.color) attrs.push(`w:color=\"${escapeAttribute(shading.color)}\"`);\n if (shading.fill) attrs.push(`w:fill=\"${escapeAttribute(shading.fill)}\"`);\n return attrs.length > 0 ? `<w:shd ${attrs.join(\" \")}/>` : \"\";\n}\n\nfunction serializeRunPropertiesFromMarks(marks: TextMark[] | undefined): string {\n return serializeRunProperties(marks);\n}\n\nfunction serializeParagraph(\n paragraph: ParagraphNode,\n state: SerializationState,\n cursor: number,\n paragraphIndex: number,\n): ParagraphSerializationResult {\n let xml = \"<w:p>\";\n const boundaries = new Map<number, number>();\n const paragraphStart = 0;\n const paragraphStartTagEnd = xml.length;\n boundaries.set(cursor, paragraphStartTagEnd);\n\n let paragraphPropertiesStart: number | undefined;\n let paragraphPropertiesEnd: number | undefined;\n\n const paragraphPropertiesXml = buildParagraphPropertiesXml(paragraph);\n if (paragraphPropertiesXml.length > 0) {\n paragraphPropertiesStart = xml.length;\n xml += paragraphPropertiesXml;\n paragraphPropertiesEnd = xml.length;\n }\n\n const children = serializeParagraphChildren(paragraph.children, state, cursor, xml.length);\n xml += children.xml;\n const contentEmpty = children.xml.length === 0;\n if (contentEmpty) {\n xml += \"<w:r><w:t></w:t></w:r>\";\n }\n const paragraphEndTagStart = xml.length;\n xml += \"</w:p>\";\n\n if (!children.boundaries.has(children.cursor)) {\n children.boundaries.set(children.cursor, paragraphEndTagStart);\n }\n\n return {\n xml,\n nextCursor: children.cursor,\n boundary: {\n paragraphIndex,\n start: cursor,\n end: children.cursor,\n boundaries: children.boundaries,\n paragraphStart,\n paragraphStartTagEnd,\n paragraphEndTagStart,\n paragraphEnd: xml.length,\n ...(paragraphPropertiesStart !== undefined\n ? { paragraphPropertiesStart }\n : {}),\n ...(paragraphPropertiesEnd !== undefined ? { paragraphPropertiesEnd } : {}),\n },\n };\n}\n\nfunction serializeParagraphChildren(\n children: InlineNode[],\n state: SerializationState,\n cursor: number,\n xmlOffset: number,\n): InlineSerializationResult {\n const pieces: string[] = [];\n const boundaries = new Map<number, number>();\n let nextCursor = cursor;\n let nextOffset = xmlOffset;\n boundaries.set(nextCursor, nextOffset);\n\n for (const child of children) {\n const result = serializeInlineNode(child, state, nextCursor, nextOffset);\n pieces.push(result.xml);\n for (const [position, index] of result.boundaries) {\n boundaries.set(position, index);\n }\n nextCursor = result.cursor;\n nextOffset += result.xml.length;\n }\n\n return {\n xml: pieces.join(\"\"),\n cursor: nextCursor,\n boundaries,\n };\n}\n\ntype RunPiece =\n | { kind: \"text\"; text: string; marks?: TextMark[] }\n | { kind: \"tab\" }\n | { kind: \"hard_break\" };\n\nfunction serializeRunPiece(piece: RunPiece): string {\n switch (piece.kind) {\n case \"text\":\n return serializeText(piece.text);\n case \"tab\":\n return \"<w:tab/>\";\n case \"hard_break\":\n return \"<w:br/>\";\n }\n}\n\nfunction serializeText(text: string): string {\n const preserve = requiresPreservedSpace(text) ? ` xml:space=\"preserve\"` : \"\";\n return `<w:t${preserve}>${escapeXml(text)}</w:t>`;\n}\n\nfunction serializeInlineNode(\n node: InlineNode,\n state: SerializationState,\n cursor: number,\n xmlOffset: number,\n): InlineSerializationResult {\n switch (node.type) {\n case \"text\": {\n const xml = serializeRun({\n kind: \"text\",\n text: node.text,\n ...(node.marks && node.marks.length > 0 ? { marks: node.marks } : {}),\n });\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + Array.from(node.text).length, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + Array.from(node.text).length,\n boundaries,\n };\n }\n case \"tab\": {\n const xml = serializeRun({ kind: \"tab\" });\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n case \"column_break\": {\n const xml = `<w:r><w:br w:type=\"column\"/></w:r>`;\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n case \"hard_break\": {\n const xml = serializeRun({ kind: \"hard_break\" });\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n case \"symbol\": {\n const xml = serializeTableInlineNode(node, state);\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n case \"image\": {\n const xml = serializeImageNode(node, state);\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n case \"opaque_inline\": {\n const xml = lookupOpaqueXml(node.fragmentId, state);\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n case \"chart_preview\":\n case \"smartart_preview\":\n case \"shape\":\n case \"wordart\":\n case \"vml_shape\": {\n // Reattach original XML unchanged for lossless round-trip.\n const xml = node.rawXml;\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n case \"hyperlink\": {\n const hyperlinkOpen = node.href.startsWith(\"#\")\n ? `<w:hyperlink w:anchor=\"${escapeAttribute(node.href.slice(1))}\">`\n : (() => {\n const relationshipId = `rIdHyperlink${state.nextHyperlinkRelationshipIndex}`;\n state.nextHyperlinkRelationshipIndex += 1;\n state.relationships.push({\n id: relationshipId,\n type: HYPERLINK_RELATIONSHIP_TYPE,\n target: node.href,\n targetMode: \"external\",\n });\n state.retainedRelationshipIds.add(relationshipId);\n return `<w:hyperlink r:id=\"${relationshipId}\">`;\n })();\n const hyperlinkClose = \"</w:hyperlink>\";\n const boundaries = new Map<number, number>();\n let nextCursor = cursor;\n let nextOffset = xmlOffset + hyperlinkOpen.length;\n boundaries.set(cursor, nextOffset);\n const children: string[] = [];\n\n for (const child of node.children) {\n const result = serializeInlineNode(child, state, nextCursor, nextOffset);\n children.push(result.xml);\n for (const [position, index] of result.boundaries) {\n boundaries.set(position, index);\n }\n nextCursor = result.cursor;\n nextOffset += result.xml.length;\n }\n\n boundaries.set(nextCursor, nextOffset);\n return {\n xml: `${hyperlinkOpen}${children.join(\"\")}${hyperlinkClose}`,\n cursor: nextCursor,\n boundaries,\n };\n }\n }\n}\n\nfunction serializeImageNode(\n node: Extract<InlineNode, { type: \"image\" }>,\n state: SerializationState,\n): string {\n const placementXml = typeof node.placementXml === \"string\" ? node.placementXml.trim() : \"\";\n if (placementXml.length > 0) {\n return placementXml.startsWith(\"<w:r\") ? placementXml : `<w:r>${placementXml}</w:r>`;\n }\n\n const mediaItem = state.media.items[node.mediaId];\n if (mediaItem?.relationshipId && state.existingRelationshipMap.has(mediaItem.relationshipId)) {\n const altText = node.altText ?? mediaItem.altText ?? mediaItem.filename;\n return `<w:r><w:drawing><wp:inline xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\" xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\"><wp:extent cx=\"9525\" cy=\"9525\"/><wp:docPr id=\"1\" name=\"${escapeAttribute(mediaItem.filename)}\" descr=\"${escapeAttribute(altText ?? \"\")}\"/><wp:cNvGraphicFramePr/><a:graphic><a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\"><pic:pic><pic:nvPicPr><pic:cNvPr id=\"0\" name=\"${escapeAttribute(mediaItem.filename)}\"/><pic:cNvPicPr/></pic:nvPicPr><pic:blipFill><a:blip r:embed=\"${escapeAttribute(mediaItem.relationshipId)}\"/><a:stretch><a:fillRect/></a:stretch></pic:blipFill><pic:spPr><a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"9525\" cy=\"9525\"/></a:xfrm><a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom></pic:spPr></pic:pic></a:graphicData></a:graphic></wp:inline></w:drawing></w:r>`;\n }\n\n return serializeRun({\n kind: \"text\",\n text: node.altText ?? \"[Image]\",\n });\n}\n\nfunction serializeRun(piece: RunPiece): string {\n const marks = piece.kind === \"text\" ? piece.marks : undefined;\n const properties = serializeRunProperties(marks);\n const content = serializeRunPiece(piece);\n return `<w:r>${properties}${content}</w:r>`;\n}\n\nfunction serializeRunProperties(marks: TextMark[] | undefined): string {\n if (!marks || marks.length === 0) {\n return \"\";\n }\n\n const markParts: string[] = [];\n for (const mark of marks) {\n switch (mark.type) {\n case \"bold\":\n markParts.push(\"<w:b/>\");\n break;\n case \"italic\":\n markParts.push(\"<w:i/>\");\n break;\n case \"underline\":\n markParts.push(`<w:u w:val=\"single\"/>`);\n break;\n case \"strikethrough\":\n markParts.push(\"<w:strike/>\");\n break;\n case \"doubleStrikethrough\":\n markParts.push(\"<w:dstrike/>\");\n break;\n case \"vanish\":\n markParts.push(\"<w:vanish/>\");\n break;\n case \"lang\":\n markParts.push(`<w:lang w:val=\"${escapeAttribute(mark.val)}\"/>`);\n break;\n case \"backgroundColor\":\n markParts.push(\n `<w:shd w:val=\"clear\" w:color=\"auto\" w:fill=\"${escapeAttribute(mark.color)}\"/>`,\n );\n break;\n case \"charSpacing\":\n markParts.push(`<w:spacing w:val=\"${mark.val}\"/>`);\n break;\n case \"kerning\":\n markParts.push(`<w:kern w:val=\"${mark.val}\"/>`);\n break;\n case \"emboss\":\n markParts.push(\"<w:emboss/>\");\n break;\n case \"imprint\":\n markParts.push(\"<w:imprint/>\");\n break;\n case \"shadow\":\n markParts.push(\"<w:shadow/>\");\n break;\n case \"position\":\n markParts.push(`<w:position w:val=\"${mark.val}\"/>`);\n break;\n case \"textFill\":\n markParts.push(mark.xml);\n break;\n }\n }\n\n const children = markParts.join(\"\");\n return children.length > 0 ? `<w:rPr>${children}</w:rPr>` : \"\";\n}\n\nfunction requiresPreservedSpace(text: string): boolean {\n return /^\\s/.test(text) || /\\s$/.test(text) || text.includes(\" \");\n}\n\nfunction lookupOpaqueXml(fragmentId: string, state: SerializationState): string {\n const fragment = getOpaqueFragment(state.preservation, fragmentId);\n if (!fragment || fragment.payloadKind !== \"xml-subtree\") {\n throw new Error(`Missing preserved OOXML fragment ${fragmentId} during serialization.`);\n }\n\n retainRelationshipsForFragment(\n fragment,\n state.relationships,\n state.existingRelationshipMap,\n state.retainedRelationshipIds,\n );\n return fragment.payloadReference;\n}\n\nfunction cloneRelationship(relationship: OpcRelationship): OpcRelationship {\n return { ...relationship };\n}\n\nfunction looksLikeSectionPropertiesXml(xml: string): boolean {\n return /^<[^>]*:?sectPr(?:\\s|>|\\/)/.test(xml.trim());\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeXml(value).replace(/\"/g, \"&quot;\");\n}\n\nfunction offsetParagraphBoundary(\n boundary: RevisionParagraphBoundary,\n offset: number,\n): RevisionParagraphBoundary {\n return {\n ...boundary,\n boundaries: new Map(\n [...boundary.boundaries.entries()].map(([position, index]) => [\n position,\n index + offset,\n ]),\n ),\n paragraphStart: boundary.paragraphStart + offset,\n paragraphStartTagEnd: boundary.paragraphStartTagEnd + offset,\n paragraphEndTagStart: boundary.paragraphEndTagStart + offset,\n paragraphEnd: boundary.paragraphEnd + offset,\n ...(boundary.paragraphPropertiesStart !== undefined\n ? { paragraphPropertiesStart: boundary.paragraphPropertiesStart + offset }\n : {}),\n ...(boundary.paragraphPropertiesEnd !== undefined\n ? { paragraphPropertiesEnd: boundary.paragraphPropertiesEnd + offset }\n : {}),\n ...(boundary.paragraphRunPropertiesStart !== undefined\n ? { paragraphRunPropertiesStart: boundary.paragraphRunPropertiesStart + offset }\n : {}),\n ...(boundary.paragraphRunPropertiesEnd !== undefined\n ? { paragraphRunPropertiesEnd: boundary.paragraphRunPropertiesEnd + offset }\n : {}),\n };\n}\n\nfunction serializeDocumentAttributes(\n attributes: Record<string, string> | undefined,\n content?: DocumentRootNode,\n): string {\n const merged = {\n \"xmlns:r\": \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\n \"xmlns:w\": \"http://schemas.openxmlformats.org/wordprocessingml/2006/main\",\n ...(content && documentNeedsW14Namespace(content)\n ? { \"xmlns:w14\": \"http://schemas.microsoft.com/office/word/2010/wordml\" }\n : {}),\n ...(attributes ?? {}),\n };\n\n return Object.entries(merged)\n .map(([name, value]) => ` ${name}=\"${escapeAttribute(value)}\"`)\n .join(\"\");\n}\n\nfunction documentNeedsW14Namespace(content: DocumentRootNode): boolean {\n const blockQueue = [...content.children];\n while (blockQueue.length > 0) {\n const block = blockQueue.shift();\n if (!block) {\n continue;\n }\n if (block.type === \"paragraph\") {\n for (const child of block.children) {\n if (\n (child.type === \"text\" || child.type === \"symbol\") &&\n child.marks?.some((mark) => mark.type === \"textFill\")\n ) {\n return true;\n }\n }\n continue;\n }\n if (block.type === \"table\") {\n for (const row of block.rows) {\n for (const cell of row.cells) {\n blockQueue.push(...cell.children);\n }\n }\n }\n }\n return false;\n}\n","export interface XmlElementNode {\n type: \"element\";\n name: string;\n attributes: Record<string, string>;\n children: XmlNode[];\n start: number;\n end: number;\n openingTagEnd: number;\n closingTagStart: number;\n}\n\nexport interface XmlTextNode {\n type: \"text\";\n text: string;\n start: number;\n end: number;\n}\n\nexport type XmlNode = XmlElementNode | XmlTextNode;\n\nexport interface RevisionParagraphBoundary {\n paragraphIndex: number;\n start: number;\n end: number;\n boundaries: Map<number, number>;\n paragraphStart: number;\n paragraphStartTagEnd: number;\n paragraphEndTagStart: number;\n paragraphEnd: number;\n paragraphPropertiesStart?: number;\n paragraphPropertiesEnd?: number;\n paragraphRunPropertiesStart?: number;\n paragraphRunPropertiesEnd?: number;\n}\n\nexport function mapRevisionBoundaries(\n documentXml: string,\n): RevisionParagraphBoundary[] {\n const root = parseXmlWithPositions(documentXml);\n const documentElement = findRequiredChildElement(root, \"document\");\n const bodyElement = findRequiredChildElement(documentElement, \"body\");\n const paragraphs: RevisionParagraphBoundary[] = [];\n let cursor = 0;\n let paragraphIndex = -1;\n let previousWasParagraph = false;\n\n for (const child of bodyElement.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n if (localName(child.name) !== \"p\") {\n cursor += 1;\n previousWasParagraph = false;\n continue;\n }\n\n if (previousWasParagraph) {\n cursor += 1;\n }\n paragraphIndex += 1;\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, child.openingTagEnd);\n\n const paragraphProperties = findChildElement(child, \"pPr\");\n const paragraphRunProperties = paragraphProperties\n ? findChildElement(paragraphProperties, \"rPr\")\n : undefined;\n\n walkStoryNodesForBoundaries(\n child.children,\n boundaries,\n () => cursor,\n (next) => {\n cursor = next;\n },\n );\n\n boundaries.set(cursor, child.closingTagStart);\n paragraphs.push({\n paragraphIndex,\n start: Math.min(...boundaries.keys()),\n end: Math.max(...boundaries.keys()),\n boundaries,\n paragraphStart: child.start,\n paragraphStartTagEnd: child.openingTagEnd,\n paragraphEndTagStart: child.closingTagStart,\n paragraphEnd: child.end,\n ...(paragraphProperties\n ? {\n paragraphPropertiesStart: paragraphProperties.start,\n paragraphPropertiesEnd: paragraphProperties.end,\n }\n : {}),\n ...(paragraphRunProperties\n ? {\n paragraphRunPropertiesStart: paragraphRunProperties.start,\n paragraphRunPropertiesEnd: paragraphRunProperties.end,\n }\n : {}),\n });\n previousWasParagraph = true;\n }\n\n return paragraphs;\n}\n\nfunction walkStoryNodesForBoundaries(\n nodes: XmlNode[],\n boundaries: Map<number, number>,\n getCursor: () => number,\n setCursor: (next: number) => void,\n): void {\n for (const node of nodes) {\n walkStoryNodeForBoundaries(node, boundaries, getCursor, setCursor);\n }\n}\n\nfunction walkStoryNodeForBoundaries(\n node: XmlNode,\n boundaries: Map<number, number>,\n getCursor: () => number,\n setCursor: (next: number) => void,\n): void {\n if (node.type !== \"element\") {\n return;\n }\n\n switch (localName(node.name)) {\n case \"pPr\":\n return;\n case \"r\":\n boundaries.set(getCursor(), node.start);\n for (const child of node.children) {\n walkStoryNodeForBoundaries(child, boundaries, getCursor, setCursor);\n }\n boundaries.set(getCursor(), node.end);\n return;\n case \"ins\":\n case \"del\":\n case \"moveFrom\":\n case \"moveTo\":\n case \"hyperlink\":\n case \"smartTag\":\n case \"sdtContent\":\n case \"customXml\":\n for (const child of node.children) {\n walkStoryNodeForBoundaries(child, boundaries, getCursor, setCursor);\n }\n return;\n case \"t\":\n case \"delText\":\n case \"instrText\":\n case \"delInstrText\": {\n const text = node.children\n .filter((child): child is XmlTextNode => child.type === \"text\")\n .map((child) => child.text)\n .join(\"\");\n if (text.length === 0) {\n return;\n }\n\n if (!boundaries.has(getCursor())) {\n boundaries.set(getCursor(), node.start);\n }\n setCursor(getCursor() + text.length);\n boundaries.set(getCursor(), node.end);\n return;\n }\n case \"tab\":\n case \"br\":\n case \"cr\":\n if (!boundaries.has(getCursor())) {\n boundaries.set(getCursor(), node.start);\n }\n setCursor(getCursor() + 1);\n boundaries.set(getCursor(), node.end);\n return;\n default:\n for (const child of node.children) {\n walkStoryNodeForBoundaries(child, boundaries, getCursor, setCursor);\n }\n }\n}\n\nexport function parseXmlWithPositions(xml: string): XmlElementNode {\n const root: XmlElementNode = {\n type: \"element\",\n name: \"__root__\",\n attributes: {},\n children: [],\n start: 0,\n end: xml.length,\n openingTagEnd: 0,\n closingTagStart: xml.length,\n };\n const stack: XmlElementNode[] = [root];\n let cursor = 0;\n\n while (cursor < xml.length) {\n if (xml.startsWith(\"<!--\", cursor)) {\n const end = xml.indexOf(\"-->\", cursor);\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<?\", cursor)) {\n const end = xml.indexOf(\"?>\", cursor);\n cursor = end >= 0 ? end + 2 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<![CDATA[\", cursor)) {\n const end = xml.indexOf(\"]]>\", cursor);\n const textEnd = end >= 0 ? end : xml.length;\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text: xml.slice(cursor + 9, textEnd),\n start: cursor,\n end: textEnd,\n });\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n if (xml[cursor] !== \"<\") {\n const nextTag = xml.indexOf(\"<\", cursor);\n const end = nextTag >= 0 ? nextTag : xml.length;\n const text = decodeXmlEntities(xml.slice(cursor, end));\n if (text.length > 0) {\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text,\n start: cursor,\n end,\n });\n }\n cursor = end;\n continue;\n }\n\n if (xml[cursor + 1] === \"/\") {\n const tagEnd = xml.indexOf(\">\", cursor);\n if (tagEnd < 0) {\n throw new Error(\"Malformed XML: unterminated closing tag.\");\n }\n\n const node = stack.pop();\n if (!node || stack.length === 0) {\n throw new Error(\"Malformed XML: unexpected closing tag.\");\n }\n\n node.closingTagStart = cursor;\n node.end = tagEnd + 1;\n cursor = tagEnd + 1;\n continue;\n }\n\n const tagEnd = xml.indexOf(\">\", cursor);\n if (tagEnd < 0) {\n throw new Error(\"Malformed XML: unterminated opening tag.\");\n }\n\n const rawTag = xml.slice(cursor + 1, tagEnd);\n const selfClosing = /\\/\\s*$/.test(rawTag);\n const normalizedTag = selfClosing ? rawTag.replace(/\\/\\s*$/, \"\") : rawTag;\n const parts = normalizedTag.trim().split(/\\s+/, 1);\n const name = parts[0];\n if (!name) {\n throw new Error(\"Malformed XML: empty tag name.\");\n }\n\n const attributes = parseAttributes(normalizedTag.slice(name.length));\n const node: XmlElementNode = {\n type: \"element\",\n name,\n attributes,\n children: [],\n start: cursor,\n end: selfClosing ? tagEnd + 1 : xml.length,\n openingTagEnd: tagEnd + 1,\n closingTagStart: tagEnd + 1,\n };\n\n stack[stack.length - 1]?.children.push(node);\n cursor = tagEnd + 1;\n\n if (!selfClosing) {\n stack.push(node);\n }\n }\n\n if (stack.length !== 1) {\n throw new Error(\"Malformed XML: unclosed element.\");\n }\n\n return root;\n}\n\nexport function findRequiredChildElement(\n node: XmlElementNode,\n childLocalName: string,\n): XmlElementNode {\n const child = findChildElement(node, childLocalName);\n if (!child) {\n throw new Error(`Expected <${childLocalName}> element.`);\n }\n\n return child;\n}\n\nexport function findChildElement(\n node: XmlElementNode,\n childLocalName: string,\n): XmlElementNode | undefined {\n return node.children.find(\n (entry): entry is XmlElementNode =>\n entry.type === \"element\" && localName(entry.name) === childLocalName,\n );\n}\n\nexport function localName(name: string): string {\n const separatorIndex = name.indexOf(\":\");\n return separatorIndex >= 0 ? name.slice(separatorIndex + 1) : name;\n}\n\nfunction parseAttributes(source: string): Record<string, string> {\n const attributes: Record<string, string> = {};\n const attributePattern = /([A-Za-z_][A-Za-z0-9:._-]*)\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/g;\n\n for (const match of source.matchAll(attributePattern)) {\n const key = match[1];\n if (!key) {\n continue;\n }\n\n const rawValue = match[3] ?? match[4] ?? \"\";\n attributes[key] = decodeXmlEntities(rawValue);\n }\n\n return attributes;\n}\n\nfunction decodeXmlEntities(value: string): string {\n return value\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&quot;/g, \"\\\"\")\n .replace(/&apos;/g, \"'\")\n .replace(/&amp;/g, \"&\");\n}\n","import { createDetachedAnchor } from \"../../core/selection/mapping.ts\";\nimport {\n createRevisionRecord,\n type RevisionRecord,\n} from \"../../review/store/revision-store.ts\";\nimport {\n createRevisionRangeAnchor,\n type MoveData,\n type PropertyChangeData,\n type RevisionKind,\n} from \"../../review/store/revision-types.ts\";\nimport {\n findChildElement,\n findRequiredChildElement,\n localName,\n mapRevisionBoundaries,\n parseXmlWithPositions,\n type RevisionParagraphBoundary,\n type XmlElementNode,\n type XmlNode,\n} from \"./revision-boundaries.ts\";\n\nexport interface PreservedRevisionMarkup {\n revisionId: string;\n rawXml: string;\n xmlStart: number;\n xmlEnd: number;\n originalRevisionType: string;\n paragraphIndex?: number;\n containerXmlStart?: number;\n containerXmlEnd?: number;\n beforeContainerXml?: string;\n}\n\nexport interface RevisionImportDiagnostic {\n revisionId: string;\n code:\n | \"preserve_only_move_revision\"\n | \"preserve_only_formatting_revision\"\n | \"nested_revision_preserve_only\"\n | \"ambiguous_revision_anchor\";\n message: string;\n featureClass: \"preserve-only\";\n}\n\nexport interface ParsedRevisionsResult {\n revisions: RevisionRecord[];\n preservedMarkup: PreservedRevisionMarkup[];\n diagnostics: RevisionImportDiagnostic[];\n boundaries: RevisionParagraphBoundary[];\n}\n\ninterface ParseState {\n documentXml: string;\n boundaries: RevisionParagraphBoundary[];\n revisions: RevisionRecord[];\n preservedMarkup: PreservedRevisionMarkup[];\n diagnostics: RevisionImportDiagnostic[];\n nextGeneratedIndex: number;\n}\n\ninterface RevisionMetadata {\n revisionId: string;\n ooxmlRevisionId?: string;\n authorId: string;\n createdAt: string;\n}\n\nconst SUPPORTED_CONTAINER_TYPES = new Set([\"ins\", \"del\"]);\nconst PRESERVE_ONLY_CONTAINER_TYPES = new Set([\"moveFrom\", \"moveTo\"]);\nconst FORMATTING_REVISION_TYPES = new Set([\"rPrChange\", \"pPrChange\"]);\n\nexport function parseRevisionsFromDocumentXml(\n documentXml: string,\n): ParsedRevisionsResult {\n const root = parseXmlWithPositions(documentXml);\n const documentElement = findRequiredChildElement(root, \"document\");\n const bodyElement = findRequiredChildElement(documentElement, \"body\");\n const boundaries = mapRevisionBoundaries(documentXml);\n const state: ParseState = {\n documentXml,\n boundaries,\n revisions: [],\n preservedMarkup: [],\n diagnostics: [],\n nextGeneratedIndex: 1,\n };\n\n let paragraphIndex = -1;\n let cursor = 0;\n let previousWasParagraph = false;\n\n for (const child of bodyElement.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const childType = localName(child.name);\n\n if (childType !== \"p\") {\n if (childType === \"tbl\") {\n parseTblPropertyRevisions(child, cursor, state);\n } else if (childType === \"sectPr\") {\n parseSectPrRevisions(child, cursor, state);\n }\n cursor += 1;\n previousWasParagraph = false;\n continue;\n }\n\n if (previousWasParagraph) {\n cursor += 1;\n }\n paragraphIndex += 1;\n const paragraphBoundary = boundaries[paragraphIndex];\n if (!paragraphBoundary) {\n continue;\n }\n\n parseParagraphMarkRevisions(child, paragraphBoundary, state);\n walkParagraphContent(child.children, paragraphIndex, state, () => cursor, (next) => {\n cursor = next;\n });\n previousWasParagraph = true;\n }\n\n return {\n revisions: state.revisions,\n preservedMarkup: state.preservedMarkup.sort((left, right) => left.xmlStart - right.xmlStart),\n diagnostics: state.diagnostics,\n boundaries,\n };\n}\n\nfunction parseParagraphMarkRevisions(\n paragraph: XmlElementNode,\n boundary: RevisionParagraphBoundary,\n state: ParseState,\n): void {\n const paragraphProperties = findChildElement(paragraph, \"pPr\");\n const paragraphRunProperties = paragraphProperties\n ? findChildElement(paragraphProperties, \"rPr\")\n : undefined;\n\n if (!paragraphProperties) {\n return;\n }\n\n const paragraphRange =\n boundary.start === boundary.end\n ? createRevisionRangeAnchor(boundary.end, boundary.end)\n : createRevisionRangeAnchor(boundary.start, boundary.end);\n\n for (const child of paragraphProperties.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const type = localName(child.name);\n if (type === \"pPrChange\") {\n const metadata = readRevisionMetadata(child, state, \"formatting\");\n const innerPPr = findChildElement(child, \"pPr\");\n const propertyChangeData: PropertyChangeData = {\n xmlTag: \"pPrChange\",\n beforeXml: innerPPr ? state.documentXml.slice(innerPPr.start, innerPPr.end) : \"\",\n };\n state.revisions.push(\n createRevisionRecord({\n revisionId: metadata.revisionId,\n kind: \"formatting\",\n anchor: paragraphRange,\n authorId: metadata.authorId,\n createdAt: metadata.createdAt,\n metadata: {\n source: \"import\",\n originalRevisionType: \"pPrChange\",\n ooxmlRevisionId: metadata.ooxmlRevisionId,\n preserveOnlyReason: \"Imported preserve-only revision.\",\n propertyChangeData,\n },\n }),\n );\n state.preservedMarkup.push({\n revisionId: metadata.revisionId,\n rawXml: state.documentXml.slice(child.start, child.end),\n xmlStart: child.start,\n xmlEnd: child.end,\n originalRevisionType: \"pPrChange\",\n });\n state.diagnostics.push({\n revisionId: metadata.revisionId,\n code: \"preserve_only_formatting_revision\",\n message: \"Paragraph property revisions remain preserve-only for Wave 6.\",\n featureClass: \"preserve-only\",\n });\n }\n }\n\n if (!paragraphRunProperties) {\n return;\n }\n\n for (const child of paragraphRunProperties.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const type = localName(child.name);\n if (!SUPPORTED_CONTAINER_TYPES.has(type)) {\n continue;\n }\n\n const metadata = readRevisionMetadata(child, state, type);\n state.revisions.push(\n createRevisionRecord({\n revisionId: metadata.revisionId,\n kind: type === \"ins\" ? \"insertion\" : \"deletion\",\n anchor: createRevisionRangeAnchor(boundary.end, boundary.end),\n authorId: metadata.authorId,\n createdAt: metadata.createdAt,\n metadata: {\n source: \"import\",\n importedRevisionForm:\n type === \"ins\" ? \"paragraph-insertion\" : \"paragraph-deletion\",\n originalRevisionType: `paragraph-${type}`,\n ooxmlRevisionId: metadata.ooxmlRevisionId,\n },\n }),\n );\n state.preservedMarkup.push({\n revisionId: metadata.revisionId,\n rawXml: state.documentXml.slice(child.start, child.end),\n xmlStart: child.start,\n xmlEnd: child.end,\n originalRevisionType: `paragraph-${type}`,\n paragraphIndex: boundary.paragraphIndex,\n });\n }\n}\n\nfunction walkParagraphContent(\n nodes: XmlNode[],\n paragraphIndex: number,\n state: ParseState,\n getCursor: () => number,\n setCursor: (next: number) => void,\n): void {\n for (const node of nodes) {\n walkContentNode(node, paragraphIndex, state, getCursor, setCursor);\n }\n}\n\nfunction walkContentNode(\n node: XmlNode,\n paragraphIndex: number,\n state: ParseState,\n getCursor: () => number,\n setCursor: (next: number) => void,\n): void {\n if (node.type !== \"element\") {\n return;\n }\n\n const type = localName(node.name);\n if (type === \"pPr\") {\n return;\n }\n\n if (type === \"r\") {\n parseRunFormattingRevisions(node, paragraphIndex, state, getCursor());\n for (const child of node.children) {\n walkContentNode(child, paragraphIndex, state, getCursor, setCursor);\n }\n return;\n }\n\n if (SUPPORTED_CONTAINER_TYPES.has(type) || PRESERVE_ONLY_CONTAINER_TYPES.has(type)) {\n const start = getCursor();\n const length = measureStoryLength(node);\n const end = start + length;\n const hasNestedRevision = containsNestedRevision(node);\n const metadata = readRevisionMetadata(\n node,\n state,\n type === \"moveFrom\" || type === \"moveTo\" ? \"move\" : type,\n );\n\n if (hasNestedRevision) {\n const nestedKind = type === \"ins\" ? \"insertion\" : type === \"del\" ? \"deletion\" : \"move\";\n state.revisions.push(\n createRevisionRecord({\n revisionId: metadata.revisionId,\n kind: nestedKind,\n anchor:\n length > 0\n ? createRevisionRangeAnchor(start, end)\n : createDetachedAnchor({ from: start, to: end }, \"importAmbiguity\"),\n authorId: metadata.authorId,\n createdAt: metadata.createdAt,\n metadata: {\n source: \"import\",\n originalRevisionType: type,\n ooxmlRevisionId: metadata.ooxmlRevisionId,\n preserveOnlyReason: \"Nested revision markup remains preserve-only.\",\n },\n }),\n );\n state.preservedMarkup.push({\n revisionId: metadata.revisionId,\n rawXml: state.documentXml.slice(node.start, node.end),\n xmlStart: node.start,\n xmlEnd: node.end,\n originalRevisionType: type,\n });\n state.diagnostics.push({\n revisionId: metadata.revisionId,\n code: \"nested_revision_preserve_only\",\n message: \"Nested revision markup remains preserve-only and is exported unchanged.\",\n featureClass: \"preserve-only\",\n });\n advanceCursor(node, setCursor, getCursor);\n return;\n }\n\n if (type === \"moveFrom\" || type === \"moveTo\") {\n const moveData: MoveData = {\n moveId: metadata.ooxmlRevisionId ?? `generated-${metadata.revisionId}`,\n direction: type === \"moveFrom\" ? \"from\" : \"to\",\n };\n state.revisions.push(\n createRevisionRecord({\n revisionId: metadata.revisionId,\n kind: \"move\",\n anchor:\n length > 0\n ? createRevisionRangeAnchor(start, end)\n : createDetachedAnchor({ from: start, to: end }, \"importAmbiguity\"),\n authorId: metadata.authorId,\n createdAt: metadata.createdAt,\n metadata: {\n source: \"import\",\n originalRevisionType: type,\n ooxmlRevisionId: metadata.ooxmlRevisionId,\n preserveOnlyReason: \"Imported preserve-only revision.\",\n moveData,\n },\n }),\n );\n state.preservedMarkup.push({\n revisionId: metadata.revisionId,\n rawXml: state.documentXml.slice(node.start, node.end),\n xmlStart: node.start,\n xmlEnd: node.end,\n originalRevisionType: type,\n });\n state.diagnostics.push({\n revisionId: metadata.revisionId,\n code: \"preserve_only_move_revision\",\n message: \"Tracked move revisions remain preserve-only for Wave 6.\",\n featureClass: \"preserve-only\",\n });\n advanceCursor(node, setCursor, getCursor);\n return;\n }\n\n state.revisions.push(\n createRevisionRecord({\n revisionId: metadata.revisionId,\n kind: type === \"ins\" ? \"insertion\" : \"deletion\",\n anchor: createRevisionRangeAnchor(start, end),\n authorId: metadata.authorId,\n createdAt: metadata.createdAt,\n metadata: {\n source: \"import\",\n importedRevisionForm:\n type === \"ins\" ? \"run-insertion\" : \"run-deletion\",\n originalRevisionType: type,\n ooxmlRevisionId: metadata.ooxmlRevisionId,\n },\n }),\n );\n state.preservedMarkup.push({\n revisionId: metadata.revisionId,\n rawXml: state.documentXml.slice(node.start, node.end),\n xmlStart: node.start,\n xmlEnd: node.end,\n originalRevisionType: type,\n });\n advanceCursor(node, setCursor, getCursor);\n return;\n }\n\n switch (type) {\n case \"t\":\n case \"delText\":\n case \"instrText\":\n case \"delInstrText\": {\n const text = node.children\n .filter((child): child is XmlElementNode[\"children\"][number] & { type: \"text\" } => child.type === \"text\")\n .map((child) => child.text)\n .join(\"\");\n setCursor(getCursor() + text.length);\n return;\n }\n case \"tab\":\n case \"br\":\n case \"cr\":\n setCursor(getCursor() + 1);\n return;\n default:\n for (const child of node.children) {\n walkContentNode(child, paragraphIndex, state, getCursor, setCursor);\n }\n }\n}\n\nfunction parseRunFormattingRevisions(\n run: XmlElementNode,\n _paragraphIndex: number,\n state: ParseState,\n runStart: number,\n): void {\n const runProperties = findChildElement(run, \"rPr\");\n if (!runProperties) {\n return;\n }\n\n const runLength = measureStoryLength(run);\n const anchor =\n runLength > 0\n ? createRevisionRangeAnchor(runStart, runStart + runLength)\n : createDetachedAnchor({ from: runStart, to: runStart }, \"importAmbiguity\");\n\n for (const child of runProperties.children) {\n if (child.type !== \"element\" || !FORMATTING_REVISION_TYPES.has(localName(child.name))) {\n continue;\n }\n\n const childLocalName = localName(child.name) as \"rPrChange\" | \"pPrChange\";\n const metadata = readRevisionMetadata(child, state, \"formatting\");\n const innerRPr = findChildElement(child, \"rPr\");\n const propertyChangeData: PropertyChangeData = {\n xmlTag: childLocalName === \"rPrChange\" ? \"rPrChange\" : \"pPrChange\",\n beforeXml: innerRPr ? state.documentXml.slice(innerRPr.start, innerRPr.end) : \"\",\n };\n state.revisions.push(\n createRevisionRecord({\n revisionId: metadata.revisionId,\n kind: \"formatting\",\n anchor,\n authorId: metadata.authorId,\n createdAt: metadata.createdAt,\n metadata: {\n source: \"import\",\n originalRevisionType: childLocalName,\n ooxmlRevisionId: metadata.ooxmlRevisionId,\n preserveOnlyReason: \"Imported preserve-only revision.\",\n propertyChangeData,\n },\n }),\n );\n state.preservedMarkup.push({\n revisionId: metadata.revisionId,\n rawXml: state.documentXml.slice(child.start, child.end),\n xmlStart: child.start,\n xmlEnd: child.end,\n originalRevisionType: childLocalName,\n });\n state.diagnostics.push({\n revisionId: metadata.revisionId,\n code: \"preserve_only_formatting_revision\",\n message: \"Formatting revisions remain preserve-only for Wave 6.\",\n featureClass: \"preserve-only\",\n });\n }\n}\n\nfunction parseTblPropertyRevisions(\n table: XmlElementNode,\n position: number,\n state: ParseState,\n): void {\n const tblPr = findChildElement(table, \"tblPr\");\n if (!tblPr) {\n return;\n }\n\n const tblPrChange = findChildElement(tblPr, \"tblPrChange\");\n if (!tblPrChange) {\n return;\n }\n\n const metadata = readRevisionMetadata(tblPrChange, state, \"property-change\");\n const innerTblPr = findChildElement(tblPrChange, \"tblPr\");\n const beforeXml = innerTblPr ? state.documentXml.slice(innerTblPr.start, innerTblPr.end) : \"\";\n const propertyChangeData: PropertyChangeData = { xmlTag: \"tblPrChange\", beforeXml };\n\n state.revisions.push(\n createRevisionRecord({\n revisionId: metadata.revisionId,\n kind: \"property-change\",\n anchor: createRevisionRangeAnchor(position, position),\n authorId: metadata.authorId,\n createdAt: metadata.createdAt,\n metadata: {\n source: \"import\",\n originalRevisionType: \"tblPrChange\",\n ooxmlRevisionId: metadata.ooxmlRevisionId,\n propertyChangeData,\n },\n }),\n );\n state.preservedMarkup.push({\n revisionId: metadata.revisionId,\n rawXml: state.documentXml.slice(tblPrChange.start, tblPrChange.end),\n xmlStart: tblPrChange.start,\n xmlEnd: tblPrChange.end,\n originalRevisionType: \"tblPrChange\",\n containerXmlStart: tblPr.start,\n containerXmlEnd: tblPr.end,\n beforeContainerXml: beforeXml,\n });\n}\n\nfunction parseSectPrRevisions(\n sectPr: XmlElementNode,\n position: number,\n state: ParseState,\n): void {\n const sectPrChange = findChildElement(sectPr, \"sectPrChange\");\n if (!sectPrChange) {\n return;\n }\n\n const metadata = readRevisionMetadata(sectPrChange, state, \"property-change\");\n const innerSectPr = findChildElement(sectPrChange, \"sectPr\");\n const beforeXml = innerSectPr ? state.documentXml.slice(innerSectPr.start, innerSectPr.end) : \"\";\n const propertyChangeData: PropertyChangeData = { xmlTag: \"sectPrChange\", beforeXml };\n\n state.revisions.push(\n createRevisionRecord({\n revisionId: metadata.revisionId,\n kind: \"property-change\",\n anchor: createRevisionRangeAnchor(position, position),\n authorId: metadata.authorId,\n createdAt: metadata.createdAt,\n metadata: {\n source: \"import\",\n originalRevisionType: \"sectPrChange\",\n ooxmlRevisionId: metadata.ooxmlRevisionId,\n propertyChangeData,\n },\n }),\n );\n state.preservedMarkup.push({\n revisionId: metadata.revisionId,\n rawXml: state.documentXml.slice(sectPrChange.start, sectPrChange.end),\n xmlStart: sectPrChange.start,\n xmlEnd: sectPrChange.end,\n originalRevisionType: \"sectPrChange\",\n containerXmlStart: sectPr.start,\n containerXmlEnd: sectPr.end,\n beforeContainerXml: beforeXml,\n });\n}\n\nfunction readRevisionMetadata(\n node: XmlElementNode,\n state: ParseState,\n prefix: string,\n): RevisionMetadata {\n const rawId = node.attributes[\"w:id\"] ?? node.attributes.id;\n const ooxmlRevisionId = rawId ? rawId : undefined;\n const revisionId = rawId\n ? `revision:${sanitizeRevisionToken(prefix)}-${sanitizeRevisionToken(rawId)}`\n : `revision:${sanitizeRevisionToken(prefix)}-generated-${state.nextGeneratedIndex++}`;\n const authorId =\n node.attributes[\"w:author\"] ??\n node.attributes.author ??\n \"word:unknown-author\";\n const createdAt =\n normalizeImportedTimestamp(\n node.attributes[\"w:date\"] ?? node.attributes.date,\n ) ??\n \"1970-01-01T00:00:00.000Z\";\n\n return {\n revisionId,\n ooxmlRevisionId,\n authorId,\n createdAt,\n };\n}\n\nfunction normalizeImportedTimestamp(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n\n const parsed = new Date(value);\n if (Number.isNaN(parsed.valueOf())) {\n return undefined;\n }\n\n return parsed.toISOString();\n}\n\nfunction sanitizeRevisionToken(value: string): string {\n const sanitized = value.replace(/[^A-Za-z0-9._-]+/g, \"-\").replace(/^-+|-+$/g, \"\");\n return sanitized.length > 0 ? sanitized : \"unknown\";\n}\n\nfunction containsNestedRevision(node: XmlElementNode): boolean {\n return node.children.some(\n (child) =>\n child.type === \"element\" &&\n (SUPPORTED_CONTAINER_TYPES.has(localName(child.name)) ||\n PRESERVE_ONLY_CONTAINER_TYPES.has(localName(child.name)) ||\n FORMATTING_REVISION_TYPES.has(localName(child.name)) ||\n containsNestedRevision(child)),\n );\n}\n\nfunction advanceCursor(\n node: XmlElementNode,\n setCursor: (next: number) => void,\n getCursor: () => number,\n): void {\n setCursor(getCursor() + measureStoryLength(node));\n}\n\nfunction measureStoryLength(node: XmlNode): number {\n if (node.type !== \"element\") {\n return 0;\n }\n\n switch (localName(node.name)) {\n case \"t\":\n case \"delText\":\n case \"instrText\":\n case \"delInstrText\":\n return node.children\n .filter((child): child is XmlElementNode[\"children\"][number] & { type: \"text\" } => child.type === \"text\")\n .map((child) => child.text.length)\n .reduce((total, length) => total + length, 0);\n case \"tab\":\n case \"br\":\n case \"cr\":\n return 1;\n case \"pPr\":\n case \"rPr\":\n case \"rPrChange\":\n case \"pPrChange\":\n return 0;\n default:\n return node.children.reduce((total, child) => total + measureStoryLength(child), 0);\n }\n}\n","import { createDetachedAnchor } from \"../../core/selection/mapping.ts\";\nimport type {\n CommentEntry,\n CommentEntryMetadata,\n CommentThread,\n CommentThreadMetadata,\n} from \"./comment-store.ts\";\nimport { createCommentRangeAnchor } from \"./comment-anchors.ts\";\n\nexport interface ImportedCommentEntryInput {\n entryId?: string;\n authorId?: string;\n body: string;\n createdAt?: string;\n metadata?: CommentEntryMetadata;\n}\n\nexport interface ImportedCommentThreadInput {\n commentId: string;\n body: string;\n createdBy?: string;\n createdAt?: string;\n range?:\n | {\n from: number;\n to: number;\n }\n | undefined;\n warningIds?: string[];\n entries?: CommentEntry[];\n status?: CommentThread[\"status\"];\n resolution?: CommentThread[\"resolution\"];\n metadata?: CommentThreadMetadata;\n}\n\nexport function createImportedCommentThread(\n input: ImportedCommentThreadInput,\n): CommentThread {\n const createdAt = input.createdAt ?? \"1970-01-01T00:00:00.000Z\";\n const createdBy = input.createdBy ?? \"unknown\";\n const entries =\n input.entries && input.entries.length > 0\n ? input.entries\n : [\n {\n entryId: `${input.commentId}-entry-1`,\n authorId: createdBy,\n body: input.body,\n createdAt,\n },\n ];\n const status =\n input.status ??\n (input.range ? \"open\" : \"detached\");\n\n return {\n commentId: input.commentId,\n anchor:\n status === \"detached\"\n ? createDetachedAnchor(input.range ?? { from: 0, to: 0 }, \"importAmbiguity\")\n : input.range\n ? createCommentRangeAnchor(input.range.from, input.range.to)\n : createDetachedAnchor({ from: 0, to: 0 }, \"importAmbiguity\"),\n status,\n entries,\n createdBy,\n createdAt,\n resolution: input.resolution,\n warningIds: [...(input.warningIds ?? [])],\n metadata: input.metadata,\n };\n}\n\nexport function createImportedCommentReply(\n commentId: string,\n input: ImportedCommentEntryInput,\n) {\n return {\n entryId: input.entryId ?? `${commentId}-entry-reply`,\n authorId: input.authorId ?? \"unknown\",\n body: input.body,\n createdAt: input.createdAt ?? \"1970-01-01T00:00:00.000Z\",\n };\n}\n\nexport function updateCommentThreadBody(\n thread: CommentThread,\n body: string,\n): CommentThread {\n const firstEntry = thread.entries[0];\n if (!firstEntry) {\n return thread;\n }\n\n return {\n ...thread,\n entries: [\n {\n ...firstEntry,\n body,\n },\n ...thread.entries.slice(1),\n ],\n };\n}\n\nexport function getCommentThreadBody(thread: CommentThread): string {\n return thread.entries.map((entry) => entry.body).join(\"\\n\");\n}\n","import type { CommentThread } from \"../../review/store/comment-store.ts\";\nimport { createImportedCommentThread } from \"../../review/store/comment-thread.ts\";\n\ninterface XmlElementNode {\n type: \"element\";\n name: string;\n attributes: Record<string, string>;\n children: XmlNode[];\n start: number;\n end: number;\n}\n\ninterface XmlTextNode {\n type: \"text\";\n text: string;\n start: number;\n end: number;\n}\n\ntype XmlNode = XmlElementNode | XmlTextNode;\n\nexport interface ParsedCommentsInput {\n commentsXml: string;\n commentsExtendedXml?: string;\n commentsIdsXml?: string;\n peopleXml?: string;\n}\n\nexport interface ImportedCommentDefinition {\n commentId: string;\n authorId?: string;\n createdAt?: string;\n body: string;\n rawXml: string;\n order: number;\n initials?: string;\n paraId?: string;\n parentParaId?: string;\n durableId?: string;\n isDone?: boolean;\n}\n\ninterface CommentAnchorBounds {\n start?: number;\n end?: number;\n startParagraphIndex?: number;\n endParagraphIndex?: number;\n referenceAt?: number;\n referenceParagraphIndex?: number;\n}\n\ninterface CommentExtensionRecord {\n paraId: string;\n parentParaId?: string;\n isDone?: boolean;\n}\n\nexport interface CommentImportDiagnostic {\n commentId: string;\n code:\n | \"missing_comment_definition\"\n | \"missing_anchor_reference\"\n | \"multi_paragraph_anchor_preserve_only\"\n | \"opaque_anchor_preserve_only\"\n | \"preserve_only_revision_overlap\";\n message: string;\n featureClass: \"preserve-only\";\n}\n\nexport interface ParsedCommentsResult {\n threads: CommentThread[];\n diagnostics: CommentImportDiagnostic[];\n definitions: ImportedCommentDefinition[];\n sourceRootTag?: string;\n sourceExtendedRootTag?: string;\n sourceIdsRootTag?: string;\n sourcePeopleRootTag?: string;\n peopleAuthors: string[];\n}\n\nexport function parseCommentsFromOoxml(\n documentXml: string,\n input: string | ParsedCommentsInput,\n): ParsedCommentsResult {\n const parts = normalizeInput(input);\n const commentExtensions = parseCommentExtensions(parts.commentsExtendedXml);\n const durableIds = parseCommentDurableIds(parts.commentsIdsXml);\n const peopleAuthors = parsePeopleAuthors(parts.peopleXml);\n const definitions = parseCommentDefinitions(parts.commentsXml, commentExtensions, durableIds);\n const definitionsById = new Map(definitions.map((definition) => [definition.commentId, definition]));\n const definitionsByParaId = new Map(\n definitions\n .filter((definition) => typeof definition.paraId === \"string\")\n .map((definition) => [definition.paraId!, definition]),\n );\n const anchors = parseCommentAnchors(documentXml);\n const diagnostics: CommentImportDiagnostic[] = [];\n const threadDefinitions = groupThreadDefinitions(definitions, definitionsByParaId);\n const threads: CommentThread[] = [];\n\n for (const [rootCommentId, groupedDefinitions] of threadDefinitions) {\n const rootDefinition = groupedDefinitions[0];\n if (!rootDefinition) {\n continue;\n }\n\n const anchor = anchors.get(rootCommentId);\n const start = anchor?.start ?? anchor?.referenceAt;\n const end = anchor?.end ?? anchor?.referenceAt;\n const startParagraphIndex = anchor?.startParagraphIndex ?? anchor?.referenceParagraphIndex;\n const endParagraphIndex = anchor?.endParagraphIndex ?? anchor?.referenceParagraphIndex;\n const entries = groupedDefinitions.map((definition, index) => ({\n entryId: `${rootCommentId}-entry-${index + 1}`,\n authorId: definition.authorId ?? \"unknown\",\n body: definition.body,\n createdAt: definition.createdAt ?? \"1970-01-01T00:00:00.000Z\",\n metadata: {\n ooxmlCommentId: definition.commentId,\n paraId: definition.paraId,\n parentParaId: definition.parentParaId,\n durableId: definition.durableId,\n initials: definition.initials,\n },\n }));\n const createdBy = rootDefinition.authorId ?? entries[0]?.authorId ?? \"unknown\";\n const createdAt = rootDefinition.createdAt ?? entries[0]?.createdAt ?? \"1970-01-01T00:00:00.000Z\";\n const resolution =\n rootDefinition.isDone\n ? {\n resolvedAt: entries.at(-1)?.createdAt ?? createdAt,\n resolvedBy: entries.at(-1)?.authorId ?? createdBy,\n }\n : undefined;\n const detachedRange = toDetachedRange(anchor);\n\n if (\n start === undefined ||\n end === undefined ||\n startParagraphIndex === undefined ||\n endParagraphIndex === undefined\n ) {\n diagnostics.push({\n commentId: rootCommentId,\n code: \"missing_anchor_reference\",\n message: \"Comment anchor markers are incomplete and remain preserve-only.\",\n featureClass: \"preserve-only\",\n });\n threads.push(\n createImportedCommentThread({\n commentId: rootCommentId,\n body: rootDefinition.body,\n createdBy,\n createdAt,\n range: detachedRange,\n entries,\n status: \"detached\",\n resolution,\n metadata: {\n source: \"import\",\n rootOoxmlCommentId: rootDefinition.commentId,\n rootParaId: rootDefinition.paraId,\n },\n }),\n );\n continue;\n }\n\n if (startParagraphIndex !== endParagraphIndex) {\n diagnostics.push({\n commentId: rootCommentId,\n code: \"multi_paragraph_anchor_preserve_only\",\n message:\n \"Comment anchor spans multiple paragraphs and remains preserve-only for Wave 5.\",\n featureClass: \"preserve-only\",\n });\n threads.push(\n createImportedCommentThread({\n commentId: rootCommentId,\n body: rootDefinition.body,\n createdBy,\n createdAt,\n range: detachedRange,\n entries,\n status: \"detached\",\n resolution,\n metadata: {\n source: \"import\",\n rootOoxmlCommentId: rootDefinition.commentId,\n rootParaId: rootDefinition.paraId,\n },\n }),\n );\n continue;\n }\n\n threads.push(\n createImportedCommentThread({\n commentId: rootCommentId,\n body: rootDefinition.body,\n createdBy,\n createdAt,\n range: {\n from: Math.min(start, end),\n to: Math.max(start, end),\n },\n entries,\n status: resolution ? \"resolved\" : \"open\",\n resolution,\n metadata: {\n source: \"import\",\n rootOoxmlCommentId: rootDefinition.commentId,\n rootParaId: rootDefinition.paraId,\n },\n }),\n );\n }\n\n for (const commentId of anchors.keys()) {\n if (definitionsById.has(commentId)) {\n continue;\n }\n\n diagnostics.push({\n commentId,\n code: \"missing_comment_definition\",\n message: \"Document anchor markers reference a comment id missing from comments.xml.\",\n featureClass: \"preserve-only\",\n });\n }\n\n threads.sort(compareThreadsByAnchor);\n\n return {\n threads,\n diagnostics,\n definitions,\n sourceRootTag: extractRootTag(parts.commentsXml, \"comments\"),\n sourceExtendedRootTag: extractRootTag(parts.commentsExtendedXml, \"commentsEx\"),\n sourceIdsRootTag: extractRootTag(parts.commentsIdsXml, \"commentsIds\"),\n sourcePeopleRootTag: extractRootTag(parts.peopleXml, \"people\"),\n peopleAuthors,\n };\n}\n\nfunction normalizeInput(input: string | ParsedCommentsInput): ParsedCommentsInput {\n return typeof input === \"string\"\n ? {\n commentsXml: input,\n }\n : input;\n}\n\nfunction groupThreadDefinitions(\n definitions: ImportedCommentDefinition[],\n definitionsByParaId: Map<string, ImportedCommentDefinition>,\n): Map<string, ImportedCommentDefinition[]> {\n const grouped = new Map<string, ImportedCommentDefinition[]>();\n\n for (const definition of definitions) {\n const rootCommentId = resolveRootCommentId(definition, definitionsByParaId);\n const group = grouped.get(rootCommentId);\n if (group) {\n group.push(definition);\n } else {\n grouped.set(rootCommentId, [definition]);\n }\n }\n\n for (const group of grouped.values()) {\n group.sort((left, right) => left.order - right.order);\n const rootIndex = group.findIndex((definition) => !definition.parentParaId);\n if (rootIndex > 0) {\n const [rootDefinition] = group.splice(rootIndex, 1);\n if (rootDefinition) {\n group.unshift(rootDefinition);\n }\n }\n }\n\n return new Map(\n [...grouped.entries()].sort(([leftId], [rightId]) => leftId.localeCompare(rightId)),\n );\n}\n\nfunction resolveRootCommentId(\n definition: ImportedCommentDefinition,\n definitionsByParaId: Map<string, ImportedCommentDefinition>,\n): string {\n const visited = new Set<string>();\n let current: ImportedCommentDefinition | undefined = definition;\n\n while (current?.parentParaId) {\n if (visited.has(current.parentParaId)) {\n break;\n }\n visited.add(current.parentParaId);\n const parent = definitionsByParaId.get(current.parentParaId);\n if (!parent) {\n break;\n }\n current = parent;\n }\n\n return current?.commentId ?? definition.commentId;\n}\n\nfunction parseCommentDefinitions(\n commentsXml: string,\n extensions: Map<string, CommentExtensionRecord>,\n durableIds: Map<string, string>,\n): ImportedCommentDefinition[] {\n if (commentsXml.trim().length === 0) {\n return [];\n }\n\n const root = parseXml(commentsXml);\n const commentsElement = findChildElement(root, \"comments\");\n const definitions: ImportedCommentDefinition[] = [];\n let order = 0;\n\n for (const child of commentsElement.children) {\n if (child.type !== \"element\" || localName(child.name) !== \"comment\") {\n continue;\n }\n\n const commentId = child.attributes[\"w:id\"] ?? child.attributes.id;\n if (!commentId) {\n continue;\n }\n\n const authorId = child.attributes[\"w:author\"] ?? child.attributes.author;\n const createdAt = normalizeImportedTimestamp(\n child.attributes[\"w:date\"] ?? child.attributes.date,\n );\n const initials = child.attributes[\"w:initials\"] ?? child.attributes.initials;\n const paragraphNodes = child.children.filter(\n (node): node is XmlElementNode => node.type === \"element\" && localName(node.name) === \"p\",\n );\n const body = paragraphNodes\n .map(extractParagraphText)\n .join(\"\\n\");\n const paraId = paragraphNodes[0]?.attributes[\"w14:paraId\"] ?? paragraphNodes[0]?.attributes.paraId;\n const extension = paraId ? extensions.get(paraId) : undefined;\n\n definitions.push({\n commentId,\n authorId,\n createdAt,\n body,\n rawXml: commentsXml.slice(child.start, child.end),\n order,\n initials,\n paraId,\n parentParaId: extension?.parentParaId,\n durableId: paraId ? durableIds.get(paraId) : undefined,\n isDone: extension?.isDone,\n });\n order += 1;\n }\n\n return definitions;\n}\n\nfunction normalizeImportedTimestamp(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n\n const parsed = new Date(value);\n if (Number.isNaN(parsed.valueOf())) {\n return undefined;\n }\n\n return parsed.toISOString();\n}\n\nfunction parseCommentExtensions(xml: string | undefined): Map<string, CommentExtensionRecord> {\n if (!xml || xml.trim().length === 0) {\n return new Map();\n }\n\n const root = parseXml(xml);\n const commentsElement = findChildElement(root, \"commentsEx\");\n const extensions = new Map<string, CommentExtensionRecord>();\n\n for (const child of commentsElement.children) {\n if (child.type !== \"element\" || localName(child.name) !== \"commentEx\") {\n continue;\n }\n\n const paraId = child.attributes[\"w15:paraId\"] ?? child.attributes.paraId;\n if (!paraId) {\n continue;\n }\n\n const parentParaId = child.attributes[\"w15:paraIdParent\"] ?? child.attributes.paraIdParent;\n const doneValue = child.attributes[\"w15:done\"] ?? child.attributes.done;\n extensions.set(paraId, {\n paraId,\n parentParaId,\n isDone:\n typeof doneValue === \"string\"\n ? doneValue.toLowerCase() === \"true\" || doneValue === \"1\"\n : undefined,\n });\n }\n\n return extensions;\n}\n\nfunction parseCommentDurableIds(xml: string | undefined): Map<string, string> {\n if (!xml || xml.trim().length === 0) {\n return new Map();\n }\n\n const root = parseXml(xml);\n const commentsIdsElement = findChildElement(root, \"commentsIds\");\n const durableIds = new Map<string, string>();\n\n for (const child of commentsIdsElement.children) {\n if (child.type !== \"element\" || localName(child.name) !== \"commentId\") {\n continue;\n }\n\n const paraId = child.attributes[\"w16cid:paraId\"] ?? child.attributes.paraId;\n const durableId = child.attributes[\"w16cid:durableId\"] ?? child.attributes.durableId;\n if (paraId && durableId) {\n durableIds.set(paraId, durableId);\n }\n }\n\n return durableIds;\n}\n\nfunction parsePeopleAuthors(xml: string | undefined): string[] {\n if (!xml || xml.trim().length === 0) {\n return [];\n }\n\n const root = parseXml(xml);\n const peopleElement = findChildElement(root, \"people\");\n const authors = new Set<string>();\n\n for (const child of peopleElement.children) {\n if (child.type !== \"element\" || localName(child.name) !== \"person\") {\n continue;\n }\n\n const author = child.attributes[\"w15:author\"] ?? child.attributes.author;\n if (author) {\n authors.add(author);\n }\n }\n\n return [...authors].sort((left, right) => left.localeCompare(right));\n}\n\nfunction extractRootTag(xml: string | undefined, localTagName: string): string | undefined {\n if (!xml) {\n return undefined;\n }\n\n const pattern = new RegExp(`<[^>]*:?${localTagName}\\\\b[^>]*>`, \"u\");\n return pattern.exec(xml)?.[0];\n}\n\nfunction parseCommentAnchors(documentXml: string): Map<string, CommentAnchorBounds> {\n const root = parseXml(documentXml);\n const documentElement = findChildElement(root, \"document\");\n const bodyElement = findChildElement(documentElement, \"body\");\n const anchors = new Map<string, CommentAnchorBounds>();\n let cursor = 0;\n let paragraphIndex = -1;\n let previousWasParagraph = false;\n\n for (const child of bodyElement.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n if (localName(child.name) !== \"p\") {\n cursor += 1;\n previousWasParagraph = false;\n continue;\n }\n\n if (previousWasParagraph) {\n cursor += 1;\n }\n paragraphIndex += 1;\n walkParagraph(child, paragraphIndex, anchors, () => cursor, (next) => {\n cursor = next;\n });\n previousWasParagraph = true;\n }\n\n return anchors;\n}\n\nfunction walkParagraph(\n paragraph: XmlElementNode,\n paragraphIndex: number,\n anchors: Map<string, CommentAnchorBounds>,\n getCursor: () => number,\n setCursor: (next: number) => void,\n): void {\n for (const child of paragraph.children) {\n walkInlineNode(child, paragraphIndex, anchors, getCursor, setCursor);\n }\n}\n\nfunction walkInlineNode(\n node: XmlNode,\n paragraphIndex: number,\n anchors: Map<string, CommentAnchorBounds>,\n getCursor: () => number,\n setCursor: (next: number) => void,\n): void {\n if (node.type !== \"element\") {\n return;\n }\n\n switch (localName(node.name)) {\n case \"commentRangeStart\": {\n const commentId = node.attributes[\"w:id\"] ?? node.attributes.id;\n if (commentId) {\n const bounds = ensureCommentAnchor(anchors, commentId);\n bounds.start = getCursor();\n bounds.startParagraphIndex = paragraphIndex;\n }\n return;\n }\n case \"commentRangeEnd\": {\n const commentId = node.attributes[\"w:id\"] ?? node.attributes.id;\n if (commentId) {\n const bounds = ensureCommentAnchor(anchors, commentId);\n bounds.end = getCursor();\n bounds.endParagraphIndex = paragraphIndex;\n }\n return;\n }\n case \"commentReference\": {\n const commentId = node.attributes[\"w:id\"] ?? node.attributes.id;\n if (commentId) {\n const bounds = ensureCommentAnchor(anchors, commentId);\n bounds.referenceAt = getCursor();\n bounds.referenceParagraphIndex = paragraphIndex;\n }\n return;\n }\n case \"t\": {\n const text = node.children\n .filter((child): child is XmlTextNode => child.type === \"text\")\n .map((child) => child.text)\n .join(\"\");\n setCursor(getCursor() + text.length);\n return;\n }\n case \"tab\":\n case \"br\":\n setCursor(getCursor() + 1);\n return;\n default:\n for (const child of node.children) {\n walkInlineNode(child, paragraphIndex, anchors, getCursor, setCursor);\n }\n }\n}\n\nfunction ensureCommentAnchor(\n anchors: Map<string, CommentAnchorBounds>,\n commentId: string,\n): CommentAnchorBounds {\n const existing = anchors.get(commentId);\n if (existing) {\n return existing;\n }\n\n const next: CommentAnchorBounds = {};\n anchors.set(commentId, next);\n return next;\n}\n\nfunction extractParagraphText(paragraph: XmlElementNode): string {\n let text = \"\";\n\n for (const child of paragraph.children) {\n text += extractNodeText(child);\n }\n\n return text;\n}\n\nfunction extractNodeText(node: XmlNode): string {\n if (node.type === \"text\") {\n return node.text;\n }\n\n switch (localName(node.name)) {\n case \"t\":\n return node.children.map(extractNodeText).join(\"\");\n case \"tab\":\n return \"\\t\";\n case \"br\":\n return \"\\n\";\n default:\n return node.children.map(extractNodeText).join(\"\");\n }\n}\n\nfunction compareThreadsByAnchor(left: CommentThread, right: CommentThread): number {\n const leftStart =\n left.anchor.kind === \"range\" ? left.anchor.range.from : Number.MAX_SAFE_INTEGER;\n const rightStart =\n right.anchor.kind === \"range\" ? right.anchor.range.from : Number.MAX_SAFE_INTEGER;\n\n if (leftStart !== rightStart) {\n return leftStart - rightStart;\n }\n\n return left.commentId.localeCompare(right.commentId);\n}\n\nfunction toDetachedRange(anchor: CommentAnchorBounds): { from: number; to: number } | undefined {\n const positions = [anchor.start, anchor.end, anchor.referenceAt].filter(\n (value): value is number => typeof value === \"number\",\n );\n if (positions.length === 0) {\n return undefined;\n }\n return {\n from: Math.min(...positions),\n to: Math.max(...positions),\n };\n}\n\nfunction parseXml(xml: string): XmlElementNode {\n const root: XmlElementNode = {\n type: \"element\",\n name: \"#document\",\n attributes: {},\n children: [],\n start: 0,\n end: xml.length,\n };\n const stack: XmlElementNode[] = [root];\n const tokenPattern =\n /<!--[\\s\\S]*?-->|<\\?[\\s\\S]*?\\?>|<!DOCTYPE[\\s\\S]*?>|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>|<[^>]+>|[^<]+/gu;\n\n for (const match of xml.matchAll(tokenPattern)) {\n const token = match[0] ?? \"\";\n const start = match.index ?? 0;\n const end = start + token.length;\n\n if (token.startsWith(\"<?\") || token.startsWith(\"<!DOCTYPE\") || token.startsWith(\"<!--\")) {\n continue;\n }\n\n if (token.startsWith(\"<![CDATA[\")) {\n const text = token.slice(9, -3);\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text,\n start,\n end,\n });\n continue;\n }\n\n if (token.startsWith(\"</\")) {\n const node = stack.pop();\n if (!node) {\n throw new Error(\"Malformed XML: unexpected closing tag.\");\n }\n node.end = end;\n continue;\n }\n\n if (token.startsWith(\"<\")) {\n const selfClosing = /\\/>$/.test(token);\n const tagBody = token.slice(1, token.length - (selfClosing ? 2 : 1)).trim();\n const { name, attributes } = parseTag(tagBody);\n const node: XmlElementNode = {\n type: \"element\",\n name,\n attributes,\n children: [],\n start,\n end,\n };\n stack[stack.length - 1]?.children.push(node);\n if (!selfClosing) {\n stack.push(node);\n }\n continue;\n }\n\n const text = decodeXmlText(token);\n if (text.length > 0) {\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text,\n start,\n end,\n });\n }\n }\n\n if (stack.length !== 1) {\n throw new Error(\"Malformed XML: unclosed tag.\");\n }\n\n return root;\n}\n\nfunction parseTag(tagBody: string): { name: string; attributes: Record<string, string> } {\n const whitespaceIndex = tagBody.search(/\\s/u);\n const name = whitespaceIndex === -1 ? tagBody : tagBody.slice(0, whitespaceIndex);\n const rawAttributes = whitespaceIndex === -1 ? \"\" : tagBody.slice(whitespaceIndex + 1);\n const attributes: Record<string, string> = {};\n const pattern = /([A-Za-z_][A-Za-z0-9:._-]*)\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/gu;\n\n for (const match of rawAttributes.matchAll(pattern)) {\n const key = match[1];\n const value = match[3] ?? match[4] ?? \"\";\n if (key) {\n attributes[key] = decodeXmlText(value);\n }\n }\n\n return { name, attributes };\n}\n\nfunction findChildElement(node: XmlElementNode, name: string): XmlElementNode {\n const match = node.children.find(\n (child): child is XmlElementNode =>\n child.type === \"element\" && localName(child.name) === name,\n );\n\n if (!match) {\n throw new Error(`Expected XML element ${name}.`);\n }\n\n return match;\n}\n\nfunction localName(name: string): string {\n const index = name.indexOf(\":\");\n return index === -1 ? name : name.slice(index + 1);\n}\n\nfunction decodeXmlText(text: string): string {\n return text.replace(\n /&(?:#x([0-9A-Fa-f]+)|#([0-9]+)|([A-Za-z]+));/gu,\n (_, hex, dec, named) => {\n if (hex) {\n return String.fromCodePoint(Number.parseInt(hex, 16));\n }\n if (dec) {\n return String.fromCodePoint(Number.parseInt(dec, 10));\n }\n\n switch (named) {\n case \"amp\":\n return \"&\";\n case \"lt\":\n return \"<\";\n case \"gt\":\n return \">\";\n case \"quot\":\n return \"\\\"\";\n case \"apos\":\n return \"'\";\n default:\n return `&${named};`;\n }\n },\n );\n}\n","import type { CommentEntry, CommentThread } from \"../../review/store/comment-store.ts\";\nimport type { RevisionParagraphBoundary } from \"../ooxml/revision-boundaries.ts\";\nimport type { ImportedCommentDefinition } from \"../ooxml/parse-comments.ts\";\n\ninterface XmlElementNode {\n type: \"element\";\n name: string;\n attributes: Record<string, string>;\n children: XmlNode[];\n start: number;\n end: number;\n}\n\ninterface XmlTextNode {\n type: \"text\";\n text: string;\n start: number;\n end: number;\n}\n\ntype XmlNode = XmlElementNode | XmlTextNode;\n\ninterface ParagraphBoundaryMap {\n paragraphIndex: number;\n start: number;\n end: number;\n boundaries: Map<number, number>;\n}\n\ninterface SerializableCommentEntry {\n thread: CommentThread;\n entry: CommentEntry;\n exportCommentId: string;\n paraId: string;\n durableId?: string;\n isRoot: boolean;\n}\n\nexport interface SerializedCommentsResult {\n commentsXml: string;\n serializedCommentIds: string[];\n commentsExtendedXml?: string;\n commentsIdsXml?: string;\n peopleXml?: string;\n}\n\nexport interface SerializeMergedCommentsXmlOptions {\n preservedDefinitions?: readonly ImportedCommentDefinition[];\n sourceRootTag?: string;\n sourceExtendedRootTag?: string;\n sourceIdsRootTag?: string;\n sourcePeopleRootTag?: string;\n peopleAuthors?: readonly string[];\n exportCommentIds?: ReadonlyMap<string, string>;\n}\n\nexport interface SerializeCommentAnchorsOptions {\n exportCommentIds?: ReadonlyMap<string, string>;\n}\n\nexport interface SerializedCommentDocumentResult {\n documentXml: string;\n serializedCommentIds: string[];\n skippedCommentIds: string[];\n}\n\nconst DEFAULT_COMMENTS_ROOT_TAG =\n `<w:comments xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" mc:Ignorable=\"w14\">`;\nconst DEFAULT_COMMENTS_EXTENDED_ROOT_TAG =\n `<w15:commentsEx xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\">`;\nconst DEFAULT_COMMENTS_IDS_ROOT_TAG =\n `<w16cid:commentsIds xmlns:w16cid=\"http://schemas.microsoft.com/office/word/2016/wordml/cid\">`;\nconst DEFAULT_PEOPLE_ROOT_TAG =\n `<w15:people xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\">`;\n\nexport function serializeCommentsXml(\n threads: readonly CommentThread[],\n options: {\n exportCommentIds?: ReadonlyMap<string, string>;\n } = {},\n): SerializedCommentsResult {\n return serializeMergedCommentsXml(threads, {\n exportCommentIds: options.exportCommentIds,\n });\n}\n\nexport function serializeMergedCommentsXml(\n threads: readonly CommentThread[],\n options: SerializeMergedCommentsXmlOptions = {},\n): SerializedCommentsResult {\n const serializableThreads = threads.filter((thread) => thread.entries.length > 0);\n const preservedDefinitions = (options.preservedDefinitions ?? [])\n .slice()\n .sort((left, right) => left.order - right.order);\n const runtimeThreadById = new Map(\n serializableThreads.map((thread) => [thread.commentId, thread]),\n );\n const exportCommentIds =\n options.exportCommentIds ??\n createCommentExportIdMap(serializableThreads, preservedDefinitions);\n const serializableEntries = createSerializableEntries(\n serializableThreads,\n preservedDefinitions,\n exportCommentIds,\n );\n const serializedEntryByOoxmlId = new Map(\n serializableEntries.map((entry) => [entry.exportCommentId, entry]),\n );\n const emittedThreadIds = new Set<string>();\n const mergedComments: string[] = [];\n\n for (const definition of preservedDefinitions) {\n const ownedThread = runtimeThreadById.get(definition.commentId);\n if (ownedThread) {\n if (emittedThreadIds.has(ownedThread.commentId)) {\n continue;\n }\n mergedComments.push(\n ...serializeThreadEntries(\n serializableEntries.filter((entry) => entry.thread.commentId === ownedThread.commentId),\n ),\n );\n emittedThreadIds.add(ownedThread.commentId);\n continue;\n }\n\n if (serializedEntryByOoxmlId.has(definition.commentId)) {\n continue;\n }\n\n mergedComments.push(definition.rawXml);\n }\n\n for (const thread of serializableThreads) {\n if (emittedThreadIds.has(thread.commentId)) {\n continue;\n }\n\n mergedComments.push(\n ...serializeThreadEntries(\n serializableEntries.filter((entry) => entry.thread.commentId === thread.commentId),\n ),\n );\n emittedThreadIds.add(thread.commentId);\n }\n\n const mergedExtendedEntries = [\n ...serializePreservedCommentExtensions(\n preservedDefinitions.filter((definition) => !serializedEntryByOoxmlId.has(definition.commentId)),\n ),\n ...serializableEntries\n .map((entry) => serializeCommentExtension(entry))\n .filter((xml): xml is string => Boolean(xml)),\n ];\n const mergedDurableIds = [\n ...serializePreservedCommentIds(\n preservedDefinitions.filter((definition) => !serializedEntryByOoxmlId.has(definition.commentId)),\n ),\n ...serializableEntries\n .map((entry) => serializeCommentDurableId(entry))\n .filter((xml): xml is string => Boolean(xml)),\n ];\n const peopleAuthors = new Set([\n ...(options.peopleAuthors ?? []),\n ...preservedDefinitions\n .map((definition) => definition.authorId)\n .filter((authorId): authorId is string => typeof authorId === \"string\" && authorId.length > 0),\n ...serializableEntries\n .map((entry) => entry.entry.authorId)\n .filter((authorId): authorId is string => typeof authorId === \"string\" && authorId.length > 0),\n ]);\n\n return {\n commentsXml: [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n normalizeCommentsRootTag(options.sourceRootTag ?? DEFAULT_COMMENTS_ROOT_TAG),\n ...mergedComments,\n `</w:comments>`,\n ].join(\"\\n\"),\n serializedCommentIds: serializableThreads.map((thread) => thread.commentId),\n commentsExtendedXml:\n mergedExtendedEntries.length > 0\n ? [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n options.sourceExtendedRootTag ?? DEFAULT_COMMENTS_EXTENDED_ROOT_TAG,\n ...mergedExtendedEntries,\n `</w15:commentsEx>`,\n ].join(\"\\n\")\n : undefined,\n commentsIdsXml:\n mergedDurableIds.length > 0\n ? [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n options.sourceIdsRootTag ?? DEFAULT_COMMENTS_IDS_ROOT_TAG,\n ...mergedDurableIds,\n `</w16cid:commentsIds>`,\n ].join(\"\\n\")\n : undefined,\n peopleXml:\n peopleAuthors.size > 0\n ? [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n options.sourcePeopleRootTag ?? DEFAULT_PEOPLE_ROOT_TAG,\n ...[...peopleAuthors]\n .sort((left, right) => left.localeCompare(right))\n .map(\n (authorId) =>\n `<w15:person w15:author=\"${escapeAttribute(authorId)}\" />`,\n ),\n `</w15:people>`,\n ].join(\"\\n\")\n : undefined,\n };\n}\n\nfunction normalizeCommentsRootTag(rootTag: string): string {\n let normalized = rootTag;\n if (!/\\bxmlns:w14=/u.test(normalized)) {\n normalized = normalized.replace(\n />$/u,\n ` xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\">`,\n );\n }\n if (!/\\bxmlns:mc=/u.test(normalized)) {\n normalized = normalized.replace(\n />$/u,\n ` xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\">`,\n );\n }\n if (!/\\bmc:Ignorable=/u.test(normalized)) {\n normalized = normalized.replace(/>$/u, ` mc:Ignorable=\"w14\">`);\n } else if (!/\\bmc:Ignorable=\"[^\"]*\\bw14\\b/u.test(normalized)) {\n normalized = normalized.replace(\n /\\bmc:Ignorable=\"([^\"]*)\"/u,\n (_match, value: string) =>\n `mc:Ignorable=\"${`${value} w14`.trim().replace(/\\s+/gu, \" \")}\"`,\n );\n }\n return normalized;\n}\n\nexport function serializeCommentAnchorsIntoDocumentXml(\n documentXml: string,\n threads: readonly CommentThread[],\n paragraphs: readonly Pick<\n RevisionParagraphBoundary,\n \"paragraphIndex\" | \"start\" | \"end\" | \"boundaries\"\n >[] = mapParagraphBoundaries(documentXml),\n options: SerializeCommentAnchorsOptions = {},\n): SerializedCommentDocumentResult {\n const insertions = new Map<number, string[]>();\n const serializedCommentIds: string[] = [];\n const skippedCommentIds: string[] = [];\n const exportCommentIds =\n options.exportCommentIds ?? createCommentExportIdMap(threads);\n\n for (const thread of threads) {\n if (thread.anchor.kind !== \"range\") {\n skippedCommentIds.push(thread.commentId);\n continue;\n }\n\n const paragraph = paragraphs.find(\n (candidate) =>\n thread.anchor.range.from >= candidate.start &&\n thread.anchor.range.to <= candidate.end,\n );\n\n if (!paragraph) {\n skippedCommentIds.push(thread.commentId);\n continue;\n }\n\n const startIndex = paragraph.boundaries.get(thread.anchor.range.from);\n const endIndex = paragraph.boundaries.get(thread.anchor.range.to);\n\n if (startIndex === undefined || endIndex === undefined) {\n skippedCommentIds.push(thread.commentId);\n continue;\n }\n\n const exportCommentId = exportCommentIds.get(thread.commentId) ?? thread.commentId;\n pushInsertion(\n insertions,\n startIndex,\n `<w:commentRangeStart w:id=\"${escapeAttribute(exportCommentId)}\"/>`,\n );\n pushInsertion(\n insertions,\n endIndex,\n `<w:commentRangeEnd w:id=\"${escapeAttribute(exportCommentId)}\"/>`,\n );\n pushInsertion(\n insertions,\n endIndex,\n `<w:r><w:commentReference w:id=\"${escapeAttribute(exportCommentId)}\"/></w:r>`,\n );\n serializedCommentIds.push(thread.commentId);\n }\n\n const sortedInsertions = [...insertions.entries()].sort((left, right) => left[0] - right[0]);\n let cursor = 0;\n let output = \"\";\n\n for (const [index, snippets] of sortedInsertions) {\n output += documentXml.slice(cursor, index);\n output += snippets.join(\"\");\n cursor = index;\n }\n\n output += documentXml.slice(cursor);\n\n return {\n documentXml: output,\n serializedCommentIds,\n skippedCommentIds,\n };\n}\n\nexport function createCommentExportIdMap(\n threads: readonly CommentThread[],\n preservedDefinitions: readonly ImportedCommentDefinition[] = [],\n): ReadonlyMap<string, string> {\n const exportIds = new Map<string, string>();\n const reservedNumericIds = new Set<number>();\n\n for (const definition of preservedDefinitions) {\n const numericId = parseOoxmlNumericId(definition.commentId);\n if (numericId !== undefined) {\n reservedNumericIds.add(numericId);\n }\n }\n\n for (const thread of threads) {\n const rootEntry = getRootEntry(thread);\n const preferredValue =\n thread.metadata?.rootOoxmlCommentId ??\n rootEntry?.metadata?.ooxmlCommentId ??\n thread.commentId;\n const numericId = parseOoxmlNumericId(preferredValue);\n if (numericId !== undefined && !reservedNumericIds.has(numericId)) {\n exportIds.set(thread.commentId, String(numericId));\n reservedNumericIds.add(numericId);\n }\n }\n\n let nextGeneratedId =\n reservedNumericIds.size > 0 ? Math.max(...reservedNumericIds) + 1 : 1;\n\n for (const thread of threads) {\n if (exportIds.has(thread.commentId)) {\n continue;\n }\n\n while (reservedNumericIds.has(nextGeneratedId)) {\n nextGeneratedId += 1;\n }\n\n exportIds.set(thread.commentId, String(nextGeneratedId));\n reservedNumericIds.add(nextGeneratedId);\n nextGeneratedId += 1;\n }\n\n return exportIds;\n}\n\nfunction createSerializableEntries(\n threads: readonly CommentThread[],\n preservedDefinitions: readonly ImportedCommentDefinition[],\n exportCommentIds: ReadonlyMap<string, string>,\n): SerializableCommentEntry[] {\n const entries: SerializableCommentEntry[] = [];\n const reservedNumericIds = new Set<number>();\n\n for (const definition of preservedDefinitions) {\n const numericId = parseOoxmlNumericId(definition.commentId);\n if (numericId !== undefined) {\n reservedNumericIds.add(numericId);\n }\n }\n\n for (const thread of threads) {\n const rootEntry = getRootEntry(thread);\n if (!rootEntry) {\n continue;\n }\n\n const rootExportCommentId = exportCommentIds.get(thread.commentId) ?? thread.commentId;\n const rootNumericId = parseOoxmlNumericId(rootExportCommentId);\n if (rootNumericId !== undefined) {\n reservedNumericIds.add(rootNumericId);\n }\n\n const rootParaId =\n rootEntry.metadata?.paraId ??\n thread.metadata?.rootParaId ??\n generateParaId(thread.commentId, 0);\n const rootDurableId =\n rootEntry.metadata?.durableId ??\n createDurableId(rootEntry, rootExportCommentId, 0);\n\n entries.push({\n thread,\n entry: rootEntry,\n exportCommentId: rootExportCommentId,\n paraId: rootParaId,\n durableId: rootDurableId,\n isRoot: true,\n });\n\n for (let index = 1; index < thread.entries.length; index += 1) {\n const entry = thread.entries[index];\n if (!entry) {\n continue;\n }\n\n const preferredCommentId = entry.metadata?.ooxmlCommentId;\n let exportCommentId: string | undefined;\n const preferredNumericId = preferredCommentId\n ? parseOoxmlNumericId(preferredCommentId)\n : undefined;\n if (\n preferredNumericId !== undefined &&\n !reservedNumericIds.has(preferredNumericId)\n ) {\n exportCommentId = String(preferredNumericId);\n reservedNumericIds.add(preferredNumericId);\n } else {\n let nextGeneratedId =\n reservedNumericIds.size > 0 ? Math.max(...reservedNumericIds) + 1 : 1;\n while (reservedNumericIds.has(nextGeneratedId)) {\n nextGeneratedId += 1;\n }\n exportCommentId = String(nextGeneratedId);\n reservedNumericIds.add(nextGeneratedId);\n }\n\n entries.push({\n thread,\n entry,\n exportCommentId,\n paraId: entry.metadata?.paraId ?? generateParaId(thread.commentId, index),\n durableId:\n entry.metadata?.durableId ??\n createDurableId(entry, exportCommentId, index),\n isRoot: false,\n });\n }\n }\n\n return entries;\n}\n\nfunction serializeThreadEntries(entries: readonly SerializableCommentEntry[]): string[] {\n return entries.map((entry) => serializeCommentEntry(entry));\n}\n\nfunction serializeCommentEntry(entry: SerializableCommentEntry): string {\n const author = escapeAttribute(entry.entry.authorId);\n const createdAt = escapeAttribute(entry.entry.createdAt);\n const initials = entry.entry.metadata?.initials;\n const paragraphXml = serializeCommentParagraphs(entry.entry.body, entry.paraId);\n\n return `<w:comment w:id=\"${escapeAttribute(entry.exportCommentId)}\"${initials ? ` w:initials=\"${escapeAttribute(initials)}\"` : \"\"} w:author=\"${author}\" w:date=\"${createdAt}\">${paragraphXml}</w:comment>`;\n}\n\nfunction serializeCommentParagraphs(body: string, paraId: string): string {\n const paragraphs = body.length > 0 ? body.split(\"\\n\") : [\"\"];\n const textId = deriveTextIdFromParaId(paraId);\n return paragraphs\n .map((paragraph, index) => {\n const attributes =\n index === 0\n ? ` w14:paraId=\"${escapeAttribute(paraId)}\" w14:textId=\"${escapeAttribute(textId)}\"`\n : \"\";\n return `<w:p${attributes}><w:r>${serializeText(paragraph)}</w:r></w:p>`;\n })\n .join(\"\");\n}\n\nfunction serializePreservedCommentExtensions(\n definitions: readonly ImportedCommentDefinition[],\n): string[] {\n return definitions\n .map((definition) =>\n definition.paraId\n ? serializePreservedCommentExtension(definition)\n : undefined,\n )\n .filter((xml): xml is string => Boolean(xml));\n}\n\nfunction serializePreservedCommentExtension(\n definition: ImportedCommentDefinition,\n): string {\n const doneValue = definition.isDone ? \"true\" : \"false\";\n return `<w15:commentEx w15:paraId=\"${escapeAttribute(definition.paraId!)}\"${definition.parentParaId ? ` w15:paraIdParent=\"${escapeAttribute(definition.parentParaId)}\"` : \"\"} w15:done=\"${doneValue}\" />`;\n}\n\nfunction serializeCommentExtension(\n entry: SerializableCommentEntry,\n): string | undefined {\n return `<w15:commentEx w15:paraId=\"${escapeAttribute(entry.paraId)}\"${entry.isRoot ? \"\" : ` w15:paraIdParent=\"${escapeAttribute(findRootParaId(entry.thread, entry.paraId))}\"`} w15:done=\"${entry.isRoot && entry.thread.status === \"resolved\" ? \"true\" : \"false\"}\" />`;\n}\n\nfunction serializePreservedCommentIds(\n definitions: readonly ImportedCommentDefinition[],\n): string[] {\n return definitions\n .map((definition) =>\n definition.paraId && definition.durableId\n ? `<w16cid:commentId w16cid:paraId=\"${escapeAttribute(definition.paraId)}\" w16cid:durableId=\"${escapeAttribute(definition.durableId)}\" />`\n : undefined,\n )\n .filter((xml): xml is string => Boolean(xml));\n}\n\nfunction serializeCommentDurableId(\n entry: SerializableCommentEntry,\n): string | undefined {\n if (!entry.durableId) {\n return undefined;\n }\n\n return `<w16cid:commentId w16cid:paraId=\"${escapeAttribute(entry.paraId)}\" w16cid:durableId=\"${escapeAttribute(entry.durableId)}\" />`;\n}\n\nfunction getRootEntry(thread: CommentThread): CommentEntry | undefined {\n return thread.entries[0];\n}\n\nfunction findRootParaId(thread: CommentThread, fallback: string): string {\n return (\n thread.entries[0]?.metadata?.paraId ??\n thread.metadata?.rootParaId ??\n fallback\n );\n}\n\nfunction generateParaId(seed: string, index: number): string {\n const normalized = `${seed}:${index}`;\n let hash = 0;\n\n for (let cursor = 0; cursor < normalized.length; cursor += 1) {\n hash = (hash * 31 + normalized.charCodeAt(cursor)) >>> 0;\n }\n\n return hash.toString(16).toUpperCase().padStart(8, \"0\").slice(-8);\n}\n\nfunction createDurableId(\n entry: CommentEntry,\n exportCommentId: string,\n index: number,\n): string {\n const seed = `${entry.entryId}:${exportCommentId}:${index}`;\n let hash = 0n;\n\n for (let cursor = 0; cursor < seed.length; cursor += 1) {\n hash = (hash * 131n + BigInt(seed.charCodeAt(cursor))) & 0xffffffffffffffffn;\n }\n\n return hash.toString(16).toUpperCase().padStart(16, \"0\").slice(-16);\n}\n\nfunction deriveTextIdFromParaId(paraId: string): string {\n return paraId.slice(-8).padStart(8, \"0\");\n}\n\nfunction parseOoxmlNumericId(value: string): number | undefined {\n if (!/^-?\\d+$/u.test(value)) {\n return undefined;\n }\n\n const numericId = Number.parseInt(value, 10);\n return Number.isFinite(numericId) ? numericId : undefined;\n}\n\nfunction mapParagraphBoundaries(documentXml: string): ParagraphBoundaryMap[] {\n const root = parseXml(documentXml);\n const documentElement = findChildElement(root, \"document\");\n const bodyElement = findChildElement(documentElement, \"body\");\n const paragraphs: ParagraphBoundaryMap[] = [];\n let globalCursor = 0;\n let paragraphIndex = -1;\n let previousWasParagraph = false;\n\n for (const child of bodyElement.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n if (localName(child.name) !== \"p\") {\n globalCursor += 1;\n previousWasParagraph = false;\n continue;\n }\n\n if (previousWasParagraph) {\n globalCursor += 1;\n }\n paragraphIndex += 1;\n const boundaries = new Map<number, number>();\n boundaries.set(globalCursor, child.start + openingTagLength(documentXml, child.start));\n\n walkParagraphForBoundaries(\n child,\n documentXml,\n boundaries,\n () => globalCursor,\n (next) => {\n globalCursor = next;\n },\n );\n\n if (!boundaries.has(globalCursor)) {\n boundaries.set(globalCursor, child.end - 4);\n }\n paragraphs.push({\n paragraphIndex,\n start: Math.min(...boundaries.keys()),\n end: Math.max(...boundaries.keys()),\n boundaries,\n });\n previousWasParagraph = true;\n }\n\n return paragraphs;\n}\n\nfunction walkParagraphForBoundaries(\n paragraph: XmlElementNode,\n sourceXml: string,\n boundaries: Map<number, number>,\n getCursor: () => number,\n setCursor: (next: number) => void,\n): void {\n for (const child of paragraph.children) {\n walkInlineNodeForBoundaries(child, sourceXml, boundaries, getCursor, setCursor);\n }\n}\n\nfunction walkInlineNodeForBoundaries(\n node: XmlNode,\n sourceXml: string,\n boundaries: Map<number, number>,\n getCursor: () => number,\n setCursor: (next: number) => void,\n): void {\n if (node.type !== \"element\") {\n return;\n }\n\n switch (localName(node.name)) {\n case \"r\": {\n if (!boundaries.has(getCursor())) {\n boundaries.set(getCursor(), node.start);\n }\n\n for (const child of node.children) {\n walkInlineNodeForBoundaries(child, sourceXml, boundaries, getCursor, setCursor);\n }\n\n boundaries.set(getCursor(), node.end);\n return;\n }\n case \"t\": {\n const text = node.children\n .filter((child): child is XmlTextNode => child.type === \"text\")\n .map((child) => child.text)\n .join(\"\");\n setCursor(getCursor() + Array.from(text).length);\n return;\n }\n case \"tab\":\n case \"br\": {\n const startCursor = getCursor();\n boundaries.set(startCursor, node.start);\n const nextCursor = startCursor + 1;\n boundaries.set(nextCursor, node.end);\n setCursor(nextCursor);\n return;\n }\n default:\n for (const child of node.children) {\n walkInlineNodeForBoundaries(child, sourceXml, boundaries, getCursor, setCursor);\n }\n }\n}\n\nfunction pushInsertion(\n insertions: Map<number, string[]>,\n index: number,\n xml: string,\n): void {\n const bucket = insertions.get(index);\n if (bucket) {\n bucket.push(xml);\n return;\n }\n\n insertions.set(index, [xml]);\n}\n\nfunction serializeText(text: string): string {\n const preserve = requiresPreservedSpace(text) ? ` xml:space=\"preserve\"` : \"\";\n return `<w:t${preserve}>${escapeXml(text)}</w:t>`;\n}\n\nfunction requiresPreservedSpace(text: string): boolean {\n return /^\\s/u.test(text) || /\\s$/u.test(text) || /\\s{2,}/u.test(text);\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeXml(value).replace(/\"/g, \"&quot;\");\n}\n\nfunction openingTagLength(xml: string, start: number): number {\n const end = xml.indexOf(\">\", start);\n if (end < 0) {\n throw new Error(\"Malformed XML: missing tag close.\");\n }\n\n return end - start + 1;\n}\n\nfunction parseXml(xml: string): XmlElementNode {\n const root: XmlElementNode = {\n type: \"element\",\n name: \"#document\",\n attributes: {},\n children: [],\n start: 0,\n end: xml.length,\n };\n const stack: XmlElementNode[] = [root];\n const tokenPattern =\n /<!--[\\s\\S]*?-->|<\\?[\\s\\S]*?\\?>|<!DOCTYPE[\\s\\S]*?>|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>|<[^>]+>|[^<]+/gu;\n\n for (const match of xml.matchAll(tokenPattern)) {\n const token = match[0] ?? \"\";\n const start = match.index ?? 0;\n const end = start + token.length;\n\n if (token.startsWith(\"<?\") || token.startsWith(\"<!DOCTYPE\") || token.startsWith(\"<!--\")) {\n continue;\n }\n\n if (token.startsWith(\"<![CDATA[\")) {\n const text = token.slice(9, -3);\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text,\n start,\n end,\n });\n continue;\n }\n\n if (token.startsWith(\"</\")) {\n const node = stack.pop();\n if (!node) {\n throw new Error(\"Malformed XML: unexpected closing tag.\");\n }\n node.end = end;\n continue;\n }\n\n if (token.startsWith(\"<\")) {\n const selfClosing = /\\/>$/.test(token);\n const tagBody = token.slice(1, token.length - (selfClosing ? 2 : 1)).trim();\n const { name, attributes } = parseTag(tagBody);\n const node: XmlElementNode = {\n type: \"element\",\n name,\n attributes,\n children: [],\n start,\n end,\n };\n stack[stack.length - 1]?.children.push(node);\n if (!selfClosing) {\n stack.push(node);\n }\n continue;\n }\n\n const text = decodeXmlText(token);\n if (text.length > 0) {\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text,\n start,\n end,\n });\n }\n }\n\n if (stack.length !== 1) {\n throw new Error(\"Malformed XML: unclosed tag.\");\n }\n\n return root;\n}\n\nfunction parseTag(tagBody: string): { name: string; attributes: Record<string, string> } {\n const whitespaceIndex = tagBody.search(/\\s/u);\n const name = whitespaceIndex === -1 ? tagBody : tagBody.slice(0, whitespaceIndex);\n const rawAttributes = whitespaceIndex === -1 ? \"\" : tagBody.slice(whitespaceIndex + 1);\n const attributes: Record<string, string> = {};\n const pattern = /([A-Za-z_][A-Za-z0-9:._-]*)\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/gu;\n\n for (const match of rawAttributes.matchAll(pattern)) {\n const key = match[1];\n const value = match[3] ?? match[4] ?? \"\";\n if (key) {\n attributes[key] = decodeXmlText(value);\n }\n }\n\n return { name, attributes };\n}\n\nfunction findChildElement(node: XmlElementNode, name: string): XmlElementNode {\n const match = node.children.find(\n (child): child is XmlElementNode =>\n child.type === \"element\" && localName(child.name) === name,\n );\n\n if (!match) {\n throw new Error(`Expected XML element ${name}.`);\n }\n\n return match;\n}\n\nfunction localName(name: string): string {\n const index = name.indexOf(\":\");\n return index === -1 ? name : name.slice(index + 1);\n}\n\nfunction decodeXmlText(text: string): string {\n return text.replace(\n /&(?:#x([0-9A-Fa-f]+)|#([0-9]+)|([A-Za-z]+));/gu,\n (_, hex, dec, named) => {\n if (hex) {\n return String.fromCodePoint(Number.parseInt(hex, 16));\n }\n if (dec) {\n return String.fromCodePoint(Number.parseInt(dec, 10));\n }\n\n switch (named) {\n case \"amp\":\n return \"&\";\n case \"lt\":\n return \"<\";\n case \"gt\":\n return \">\";\n case \"quot\":\n return \"\\\"\";\n case \"apos\":\n return \"'\";\n default:\n return `&${named};`;\n }\n },\n );\n}\n","import type {\n DocumentRootNode,\n HyperlinkNode,\n InlineNode,\n ParagraphNode,\n TextNode,\n} from \"../../model/canonical-document.ts\";\nimport type { CommentThread } from \"../../review/store/comment-store.ts\";\nimport type { RevisionRecord } from \"../../review/store/revision-types.ts\";\n\nexport function splitDocumentAtReviewBoundaries(\n content: DocumentRootNode,\n comments: readonly CommentThread[],\n revisions: readonly RevisionRecord[],\n): DocumentRootNode {\n const splitPositions = collectSplitPositions(comments, revisions);\n if (splitPositions.size === 0) {\n return content;\n }\n\n let cursor = 0;\n const children = content.children.map((block, index) => {\n if (index > 0 && content.children[index - 1]?.type === \"paragraph\" && block.type === \"paragraph\") {\n cursor += 1;\n }\n\n if (block.type !== \"paragraph\") {\n cursor += 1;\n return block;\n }\n\n const next = splitParagraph(block, splitPositions, cursor);\n cursor = next.cursor;\n return next.paragraph;\n });\n\n return {\n type: \"doc\",\n children,\n };\n}\n\nfunction collectSplitPositions(\n comments: readonly CommentThread[],\n revisions: readonly RevisionRecord[],\n): Set<number> {\n const positions = new Set<number>();\n\n for (const thread of comments) {\n if (thread.anchor.kind !== \"range\") {\n continue;\n }\n\n positions.add(thread.anchor.range.from);\n positions.add(thread.anchor.range.to);\n }\n\n for (const revision of revisions) {\n if (revision.status !== \"active\" || revision.anchor.kind !== \"range\") {\n continue;\n }\n\n if (\n revision.metadata.importedRevisionForm === \"paragraph-insertion\" ||\n revision.metadata.importedRevisionForm === \"paragraph-deletion\"\n ) {\n continue;\n }\n\n positions.add(revision.anchor.range.from);\n positions.add(revision.anchor.range.to);\n }\n\n return positions;\n}\n\nfunction splitParagraph(\n paragraph: ParagraphNode,\n splitPositions: ReadonlySet<number>,\n cursor: number,\n): { paragraph: ParagraphNode; cursor: number } {\n const children: InlineNode[] = [];\n let nextCursor = cursor;\n\n for (const child of paragraph.children) {\n if (child.type === \"text\") {\n const split = splitTextNode(child, splitPositions, nextCursor);\n children.push(...split.children);\n nextCursor = split.cursor;\n continue;\n }\n\n if (child.type === \"hyperlink\") {\n const split = splitHyperlinkNode(child, splitPositions, nextCursor);\n children.push(...split.children);\n nextCursor = split.cursor;\n continue;\n }\n\n children.push(child);\n nextCursor += 1;\n }\n\n return {\n paragraph: {\n ...paragraph,\n children,\n },\n cursor: nextCursor,\n };\n}\n\nfunction splitHyperlinkNode(\n node: HyperlinkNode,\n splitPositions: ReadonlySet<number>,\n cursor: number,\n): { children: HyperlinkNode[]; cursor: number } {\n let nextCursor = cursor;\n const groups: Array<HyperlinkNode[\"children\"]> = [[]];\n\n for (const child of node.children) {\n if (child.type === \"text\") {\n const split = splitTextNode(child, splitPositions, nextCursor);\n for (const piece of split.children) {\n groups[groups.length - 1]?.push(piece);\n nextCursor += Array.from(piece.text).length;\n if (splitPositions.has(nextCursor)) {\n groups.push([]);\n }\n }\n continue;\n }\n\n groups[groups.length - 1]?.push(child);\n nextCursor += 1;\n if (splitPositions.has(nextCursor)) {\n groups.push([]);\n }\n }\n\n const hyperlinks = groups\n .filter((children) => children.length > 0)\n .map((children) => ({\n type: \"hyperlink\" as const,\n href: node.href,\n children,\n }));\n\n return {\n children: hyperlinks.length > 0 ? hyperlinks : [node],\n cursor: nextCursor,\n };\n}\n\nfunction splitTextNode(\n node: TextNode,\n splitPositions: ReadonlySet<number>,\n cursor: number,\n): { children: TextNode[]; cursor: number } {\n const codepoints = Array.from(node.text);\n if (codepoints.length === 0) {\n return { children: [], cursor };\n }\n\n const boundaries = new Set<number>([0, codepoints.length]);\n for (let index = 1; index < codepoints.length; index += 1) {\n if (splitPositions.has(cursor + index)) {\n boundaries.add(index);\n }\n }\n\n const ordered = [...boundaries].sort((left, right) => left - right);\n const children: TextNode[] = [];\n\n for (let index = 0; index < ordered.length - 1; index += 1) {\n const start = ordered[index] ?? 0;\n const end = ordered[index + 1] ?? codepoints.length;\n const text = codepoints.slice(start, end).join(\"\");\n if (text.length === 0) {\n continue;\n }\n\n children.push({\n type: \"text\",\n text,\n ...(node.marks && node.marks.length > 0 ? { marks: node.marks } : {}),\n });\n }\n\n return {\n children: children.length > 0 ? children : [node],\n cursor: cursor + codepoints.length,\n };\n}\n","import type { RevisionRecord } from \"../../review/store/revision-types.ts\";\nimport {\n mapRevisionBoundaries,\n type RevisionParagraphBoundary,\n} from \"../ooxml/revision-boundaries.ts\";\n\ninterface XmlReplacement {\n start: number;\n end: number;\n replacement: string;\n}\n\nexport interface SerializedRuntimeRevisionsResult {\n documentXml: string;\n serializedRevisionIds: string[];\n skippedRevisionIds: string[];\n}\n\nexport function serializeRuntimeRevisionsIntoDocumentXml(\n documentXml: string,\n revisions: readonly RevisionRecord[],\n boundaries: readonly RevisionParagraphBoundary[] = mapRevisionBoundaries(documentXml),\n): SerializedRuntimeRevisionsResult {\n const replacements: XmlReplacement[] = [];\n const serializedRevisionIds: string[] = [];\n const skippedRevisionIds: string[] = [];\n const paragraphMarkers = new Map<\n number,\n { boundary: RevisionParagraphBoundary; markers: string[]; revisionIds: string[] }\n >();\n\n for (const revision of revisions) {\n if (revision.status !== \"active\" || revision.anchor.kind !== \"range\") {\n continue;\n }\n\n if (revision.kind !== \"insertion\" && revision.kind !== \"deletion\") {\n continue;\n }\n\n const form = revision.metadata.importedRevisionForm;\n if (form === \"paragraph-insertion\" || form === \"paragraph-deletion\") {\n const paragraphBoundary = findParagraphBoundaryForAnchor(boundaries, revision);\n if (!paragraphBoundary) {\n skippedRevisionIds.push(revision.revisionId);\n continue;\n }\n\n const entry = paragraphMarkers.get(paragraphBoundary.paragraphIndex) ?? {\n boundary: paragraphBoundary,\n markers: [],\n revisionIds: [],\n };\n entry.markers.push(createParagraphRevisionMarker(revision));\n entry.revisionIds.push(revision.revisionId);\n paragraphMarkers.set(paragraphBoundary.paragraphIndex, entry);\n serializedRevisionIds.push(revision.revisionId);\n continue;\n }\n\n const rangeReplacement = createRangeRevisionReplacement(documentXml, boundaries, revision);\n if (!rangeReplacement) {\n skippedRevisionIds.push(revision.revisionId);\n continue;\n }\n\n replacements.push(rangeReplacement);\n serializedRevisionIds.push(revision.revisionId);\n }\n\n for (const { boundary, markers, revisionIds } of paragraphMarkers.values()) {\n const paragraphInsertion = createParagraphRevisionInsertion(\n documentXml,\n boundary,\n markers,\n );\n if (!paragraphInsertion) {\n skippedRevisionIds.push(...revisionIds);\n continue;\n }\n\n replacements.push(paragraphInsertion);\n }\n\n return {\n documentXml: applyReplacements(documentXml, replacements),\n serializedRevisionIds,\n skippedRevisionIds,\n };\n}\n\nfunction createRangeRevisionReplacement(\n documentXml: string,\n boundaries: readonly RevisionParagraphBoundary[],\n revision: RevisionRecord,\n): XmlReplacement | undefined {\n const paragraphBoundary = findParagraphBoundaryForRange(boundaries, revision.anchor.range.from, revision.anchor.range.to);\n if (!paragraphBoundary) {\n return undefined;\n }\n\n const startIndex = paragraphBoundary.boundaries.get(revision.anchor.range.from);\n const endIndex = paragraphBoundary.boundaries.get(revision.anchor.range.to);\n if (startIndex === undefined || endIndex === undefined || endIndex < startIndex) {\n return undefined;\n }\n\n const xml = documentXml.slice(startIndex, endIndex);\n const attributes = serializeRevisionAttributes(revision);\n return {\n start: startIndex,\n end: endIndex,\n replacement:\n revision.kind === \"insertion\"\n ? `<w:ins${attributes}>${xml}</w:ins>`\n : `<w:del${attributes}>${convertRunsToDeletedContent(xml)}</w:del>`,\n };\n}\n\nfunction createParagraphRevisionMarker(revision: RevisionRecord): string {\n const markerName = revision.kind === \"insertion\" ? \"w:ins\" : \"w:del\";\n return `<${markerName}${serializeRevisionAttributes(revision)}/>`;\n}\n\nfunction createParagraphRevisionInsertion(\n documentXml: string,\n paragraphBoundary: RevisionParagraphBoundary,\n markers: readonly string[],\n): XmlReplacement | undefined {\n const paragraphXml = documentXml.slice(\n paragraphBoundary.paragraphStart,\n paragraphBoundary.paragraphEnd,\n );\n const markerXml = markers.join(\"\");\n const paragraphRunPropertiesInsertionIndex = findClosingTagInsertionIndex(\n documentXml,\n paragraphBoundary.paragraphRunPropertiesStart,\n paragraphBoundary.paragraphRunPropertiesEnd,\n \"w:rPr\",\n );\n if (paragraphRunPropertiesInsertionIndex !== undefined) {\n return {\n start: paragraphRunPropertiesInsertionIndex,\n end: paragraphRunPropertiesInsertionIndex,\n replacement: markerXml,\n };\n }\n\n const paragraphPropertiesInsertionIndex = findClosingTagInsertionIndex(\n documentXml,\n paragraphBoundary.paragraphPropertiesStart,\n paragraphBoundary.paragraphPropertiesEnd,\n \"w:pPr\",\n );\n if (paragraphPropertiesInsertionIndex !== undefined) {\n return {\n start: paragraphPropertiesInsertionIndex,\n end: paragraphPropertiesInsertionIndex,\n replacement: `<w:rPr>${markerXml}</w:rPr>`,\n };\n }\n\n if (!/<w:p[\\s>]/u.test(paragraphXml)) {\n return undefined;\n }\n\n return {\n start: paragraphBoundary.paragraphStartTagEnd,\n end: paragraphBoundary.paragraphStartTagEnd,\n replacement: `<w:pPr><w:rPr>${markerXml}</w:rPr></w:pPr>`,\n };\n}\n\nfunction findParagraphBoundaryForRange(\n boundaries: readonly RevisionParagraphBoundary[],\n from: number,\n to: number,\n): RevisionParagraphBoundary | undefined {\n return boundaries.find(\n (boundary) => from >= boundary.start && to <= boundary.end,\n );\n}\n\nfunction findParagraphBoundaryForAnchor(\n boundaries: readonly RevisionParagraphBoundary[],\n revision: RevisionRecord,\n): RevisionParagraphBoundary | undefined {\n const anchor = revision.anchor.kind === \"range\" ? revision.anchor.range.from : undefined;\n if (anchor === undefined) {\n return undefined;\n }\n\n return boundaries.find(\n (boundary) =>\n boundary.end === anchor ||\n (anchor >= boundary.start && anchor <= boundary.end),\n );\n}\n\nfunction serializeRevisionAttributes(revision: RevisionRecord): string {\n const attributes = {\n \"w:id\": revision.metadata.ooxmlRevisionId ?? sanitizeRevisionId(revision.revisionId),\n \"w:author\": revision.authorId,\n \"w:date\": revision.createdAt,\n };\n\n return Object.entries(attributes)\n .filter(([, value]) => value && value.length > 0)\n .map(([name, value]) => ` ${name}=\"${escapeAttribute(value)}\"`)\n .join(\"\");\n}\n\nfunction findClosingTagInsertionIndex(\n documentXml: string,\n start: number | undefined,\n end: number | undefined,\n tagName: string,\n): number | undefined {\n if (start === undefined || end === undefined) {\n return undefined;\n }\n\n const closingTag = `</${tagName}>`;\n const closingIndex = documentXml.lastIndexOf(closingTag, end);\n if (closingIndex < start) {\n return undefined;\n }\n\n return closingIndex;\n}\n\nfunction sanitizeRevisionId(revisionId: string): string {\n const numericTail = /(\\d+)$/.exec(revisionId)?.[1];\n return numericTail ?? revisionId.replace(/[^A-Za-z0-9._-]/g, \"-\");\n}\n\nfunction convertRunsToDeletedContent(xml: string): string {\n return xml\n .replace(/<(\\/?)w:t\\b/g, \"<$1w:delText\")\n .replace(/<(\\/?)w:instrText\\b/g, \"<$1w:delInstrText\");\n}\n\nfunction applyReplacements(documentXml: string, replacements: readonly XmlReplacement[]): string {\n const sorted = replacements\n .slice()\n .sort((left, right) => right.start - left.start || right.end - left.end);\n let output = documentXml;\n\n for (const replacement of sorted) {\n output =\n output.slice(0, replacement.start) +\n replacement.replacement +\n output.slice(replacement.end);\n }\n\n return output;\n}\n\nfunction escapeAttribute(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n","export const COMPATIBILITY_FEATURE_CLASSES = [\n \"supported-roundtrip\",\n \"preserve-only\",\n \"unsupported-fatal\",\n] as const;\n\nexport type CompatibilityFeatureClass =\n (typeof COMPATIBILITY_FEATURE_CLASSES)[number];\n\nexport const EDITOR_WARNING_CODES = [\n \"unsupported_ooxml_preserved\",\n \"unsupported_ooxml_locked\",\n \"import_normalized\",\n \"export_roundtrip_risk\",\n \"comment_anchor_detached\",\n \"revision_anchor_detached\",\n \"large_document_degraded\",\n \"font_substitution\",\n \"image_missing\",\n] as const;\n\nexport type EditorWarningCode = (typeof EDITOR_WARNING_CODES)[number];\n\nexport const EDITOR_WARNING_SOURCES = [\n \"import\",\n \"runtime\",\n \"review\",\n \"preservation\",\n \"validation\",\n \"export\",\n] as const;\n\nexport type EditorWarningSource = (typeof EDITOR_WARNING_SOURCES)[number];\n\nexport const EDITOR_ERROR_CODES = [\n \"import_failed\",\n \"export_failed\",\n \"package_corrupt\",\n \"validation_failed\",\n \"datastore_failed\",\n \"internal_invariant\",\n] as const;\n\nexport type EditorErrorCode = (typeof EDITOR_ERROR_CODES)[number];\n\nexport const EDITOR_ERROR_SOURCES = [\n \"import\",\n \"runtime\",\n \"validation\",\n \"datastore\",\n \"export\",\n] as const;\n\nexport type EditorErrorSource = (typeof EDITOR_ERROR_SOURCES)[number];\n\nexport type EditorAnchorProjection =\n | {\n kind: \"range\";\n from: number;\n to: number;\n assoc: {\n start: -1 | 1;\n end: -1 | 1;\n };\n }\n | {\n kind: \"node\";\n at: number;\n assoc: -1 | 1;\n }\n | {\n kind: \"detached\";\n lastKnownRange: {\n from: number;\n to: number;\n };\n reason: \"deleted\" | \"invalidatedByStructureChange\" | \"importAmbiguity\";\n };\n\nexport interface EditorWarning {\n warningId: string;\n code: EditorWarningCode;\n severity: \"info\" | \"warning\";\n message: string;\n source: EditorWarningSource;\n affectedAnchor?: EditorAnchorProjection;\n featureEntryId?: string;\n details?: Record<string, unknown>;\n}\n\nexport interface EditorError {\n errorId: string;\n code: EditorErrorCode;\n message: string;\n isFatal: boolean;\n source: EditorErrorSource;\n details?: Record<string, unknown>;\n}\n\nexport interface CompatibilityFeatureEntry<\n FeatureKey extends string = string,\n FeatureClass extends CompatibilityFeatureClass = CompatibilityFeatureClass,\n> {\n featureEntryId: string;\n featureKey: FeatureKey;\n featureClass: FeatureClass;\n message: string;\n affectedAnchor?: EditorAnchorProjection;\n details?: Record<string, unknown>;\n}\n\nexport interface CompatibilityDiagnostics<\n FeatureKey extends string = string,\n FeatureClass extends CompatibilityFeatureClass = CompatibilityFeatureClass,\n> {\n featureEntries: readonly CompatibilityFeatureEntry<FeatureKey, FeatureClass>[];\n warnings: readonly EditorWarning[];\n errors: readonly EditorError[];\n}\n\nconst EXPORT_BLOCKING_ERROR_CODES = new Set<EditorErrorCode>([\n \"import_failed\",\n \"export_failed\",\n \"package_corrupt\",\n \"validation_failed\",\n]);\n\nexport function isCompatibilityFeatureClass(\n value: string,\n): value is CompatibilityFeatureClass {\n return COMPATIBILITY_FEATURE_CLASSES.includes(\n value as CompatibilityFeatureClass,\n );\n}\n\nexport function isEditorWarningCode(value: string): value is EditorWarningCode {\n return EDITOR_WARNING_CODES.includes(value as EditorWarningCode);\n}\n\nexport function isEditorErrorCode(value: string): value is EditorErrorCode {\n return EDITOR_ERROR_CODES.includes(value as EditorErrorCode);\n}\n\nexport function createDiagnostics<\n FeatureKey extends string = string,\n FeatureClass extends CompatibilityFeatureClass = CompatibilityFeatureClass,\n>(\n input: Partial<CompatibilityDiagnostics<FeatureKey, FeatureClass>> = {},\n): CompatibilityDiagnostics<FeatureKey, FeatureClass> {\n return {\n featureEntries: freezeArray(input.featureEntries ?? []),\n warnings: freezeArray(input.warnings ?? []),\n errors: freezeArray(input.errors ?? []),\n };\n}\n\nexport function collectWarningIds(warnings: readonly EditorWarning[]): string[] {\n return warnings.map((warning) => warning.warningId);\n}\n\nexport function summarizeFeatureClasses<\n FeatureKey extends string,\n FeatureClass extends CompatibilityFeatureClass,\n>(\n featureEntries: readonly CompatibilityFeatureEntry<FeatureKey, FeatureClass>[],\n): Record<CompatibilityFeatureClass, number> {\n return featureEntries.reduce<Record<CompatibilityFeatureClass, number>>(\n (counts, entry) => {\n counts[entry.featureClass] += 1;\n return counts;\n },\n {\n \"supported-roundtrip\": 0,\n \"preserve-only\": 0,\n \"unsupported-fatal\": 0,\n },\n );\n}\n\nexport function diagnosticsBlockExport<\n FeatureKey extends string,\n FeatureClass extends CompatibilityFeatureClass,\n>(\n diagnostics: CompatibilityDiagnostics<FeatureKey, FeatureClass>,\n explicitBlockExport = false,\n): boolean {\n if (explicitBlockExport) {\n return true;\n }\n\n return (\n diagnostics.featureEntries.some(\n (entry) => entry.featureClass === \"unsupported-fatal\",\n ) ||\n diagnostics.errors.some(\n (error) => error.isFatal || EXPORT_BLOCKING_ERROR_CODES.has(error.code),\n )\n );\n}\n\nfunction freezeArray<Value>(items: readonly Value[]): readonly Value[] {\n return Object.freeze([...items]);\n}\n","import type {\n CompatibilityFeatureEntry,\n EditorError,\n} from \"../api/public-types.ts\";\nimport {\n createCorruptPackageError,\n createCorruptPackageDiagnosticsToken,\n type CorruptPackageIssue,\n} from \"../io/opc/corrupt-package.ts\";\nimport {\n createDiagnostics,\n diagnosticsBlockExport,\n type CompatibilityDiagnostics,\n} from \"./diagnostics.ts\";\n\nexport const IMPORT_FAILURE_STAGES = [\"package\", \"validation\"] as const;\n\nexport type ImportFailureStage = (typeof IMPORT_FAILURE_STAGES)[number];\n\nexport interface ImportDiagnosticsResult {\n mode: \"read-only-diagnostics\";\n readOnly: true;\n blockExport: true;\n fatalError: EditorError;\n diagnostics: CompatibilityDiagnostics;\n featureEntry: CompatibilityFeatureEntry;\n}\n\nexport function createPackageImportDiagnostics(input: {\n issue: CorruptPackageIssue;\n}): ImportDiagnosticsResult {\n const fatalError = createCorruptPackageError(input.issue);\n const featureEntry = {\n featureEntryId: `feature:${fatalError.errorId}`,\n featureKey: \"malformed-package\",\n featureClass: \"unsupported-fatal\",\n message: input.issue.message,\n details: {\n stage: \"package\",\n reason: input.issue.reason,\n diagnosticsToken: createCorruptPackageDiagnosticsToken(input.issue),\n },\n } satisfies CompatibilityFeatureEntry;\n\n const diagnostics = createDiagnostics({\n featureEntries: [featureEntry],\n warnings: [],\n errors: [fatalError],\n });\n\n return createReadOnlyDiagnosticsResult(featureEntry, diagnostics, fatalError);\n}\n\nexport function createValidationImportDiagnostics(input: {\n message: string;\n source?: EditorError[\"source\"];\n details?: Record<string, unknown>;\n}): ImportDiagnosticsResult {\n const diagnosticsToken = createImportDiagnosticsToken(\"validation\", input.message);\n const fatalError: EditorError = {\n errorId: `error:validation_failed:${diagnosticsToken}`,\n code: \"validation_failed\",\n message: input.message,\n isFatal: true,\n source: input.source ?? \"validation\",\n details: {\n stage: \"validation\",\n diagnosticsToken,\n ...(input.details ?? {}),\n },\n };\n const featureEntry = {\n featureEntryId: `feature:${fatalError.errorId}`,\n featureKey: \"openxml-validation\",\n featureClass: \"unsupported-fatal\",\n message: input.message,\n details: {\n stage: \"validation\",\n diagnosticsToken,\n },\n } satisfies CompatibilityFeatureEntry;\n const diagnostics = createDiagnostics({\n featureEntries: [featureEntry],\n warnings: [],\n errors: [fatalError],\n });\n\n return createReadOnlyDiagnosticsResult(featureEntry, diagnostics, fatalError);\n}\n\nexport function getImportFailureStage(error: Pick<EditorError, \"code\" | \"details\">): ImportFailureStage {\n if (error.code === \"package_corrupt\") {\n return \"package\";\n }\n\n const stage = error.details?.stage;\n return stage === \"package\" ? \"package\" : \"validation\";\n}\n\nfunction createReadOnlyDiagnosticsResult(\n featureEntry: CompatibilityFeatureEntry,\n diagnostics: CompatibilityDiagnostics,\n fatalError: EditorError,\n): ImportDiagnosticsResult {\n if (!diagnosticsBlockExport(diagnostics, true)) {\n throw new Error(\"Import diagnostics must conservatively block export.\");\n }\n\n return {\n mode: \"read-only-diagnostics\",\n readOnly: true,\n blockExport: true,\n fatalError,\n diagnostics,\n featureEntry,\n };\n}\n\nfunction createImportDiagnosticsToken(stage: ImportFailureStage, message: string): string {\n let hash = 2166136261;\n const text = `${stage}:${message}`;\n for (let index = 0; index < text.length; index += 1) {\n hash ^= text.charCodeAt(index);\n hash = Math.imul(hash, 16777619) >>> 0;\n }\n\n return `${stage}-${hash.toString(16).padStart(8, \"0\")}`;\n}\n","import type {\n CompatibilityReport,\n EditorWarning,\n ExportDocxOptions,\n ExportResult,\n PersistedEditorSnapshot,\n RuntimeRenderSnapshot,\n} from \"../api/public-types.ts\";\nimport { createCanonicalDocumentId } from \"../core/state/editor-state.ts\";\nimport type { ImportDiagnosticsResult } from \"../validation/import-diagnostics.ts\";\n\nexport interface ReadOnlyDiagnosticsRuntime {\n getRenderSnapshot(): RuntimeRenderSnapshot;\n getPersistedSnapshot(): PersistedEditorSnapshot;\n getCompatibilityReport(): CompatibilityReport;\n getWarnings(): EditorWarning[];\n dispatch(command: { type: string }): never;\n undo(): never;\n redo(): never;\n exportDocx(options?: ExportDocxOptions): Promise<ExportResult>;\n}\n\nexport function createReadOnlyDiagnosticsRuntime(input: {\n documentId: string;\n sourceLabel?: string;\n editorBuild: string;\n generatedAt: string;\n diagnostics: ImportDiagnosticsResult;\n}): ReadOnlyDiagnosticsRuntime {\n const persistedSnapshot = createDiagnosticsSnapshot(input);\n const renderSnapshot = createDiagnosticsRenderSnapshot(input, persistedSnapshot);\n\n return {\n getRenderSnapshot() {\n return renderSnapshot;\n },\n getPersistedSnapshot() {\n return persistedSnapshot;\n },\n getCompatibilityReport() {\n return persistedSnapshot.compatibility;\n },\n getWarnings() {\n return persistedSnapshot.warningLog;\n },\n dispatch(command) {\n throw createReadOnlyDiagnosticsModeError(command.type);\n },\n undo() {\n throw createReadOnlyDiagnosticsModeError(\"history.undo\");\n },\n redo() {\n throw createReadOnlyDiagnosticsModeError(\"history.redo\");\n },\n async exportDocx(options) {\n void options;\n throw new Error(\n \"DOCX export is blocked in read-only diagnostics mode because the imported package is not safe to rewrite.\",\n );\n },\n };\n}\n\nfunction createDiagnosticsSnapshot(input: {\n documentId: string;\n editorBuild: string;\n generatedAt: string;\n diagnostics: ImportDiagnosticsResult;\n}): PersistedEditorSnapshot {\n const docId = createCanonicalDocumentId(input.documentId);\n const diagnosticId = `diagnostic:${sanitizeDiagnosticsToken(input.documentId)}`;\n\n return {\n snapshotVersion: \"persisted-editor-snapshot/1\",\n schemaVersion: \"cds/1.0.0\",\n documentId: input.documentId,\n docId,\n createdAt: input.generatedAt,\n updatedAt: input.generatedAt,\n savedAt: input.generatedAt,\n editorBuild: input.editorBuild,\n canonicalDocument: {\n schemaVersion: \"cds/1.0.0\",\n docId,\n createdAt: input.generatedAt,\n updatedAt: input.generatedAt,\n metadata: {\n customProperties: {},\n importMode: input.diagnostics.mode,\n },\n styles: {\n paragraphs: {},\n characters: {},\n tables: {},\n },\n numbering: {\n abstractDefinitions: {},\n instances: {},\n },\n media: {\n items: {},\n },\n content: {\n type: \"doc\",\n children: [{ type: \"paragraph\", children: [] }],\n },\n review: {\n comments: {},\n revisions: {},\n },\n preservation: {\n opaqueFragments: {},\n packageParts: {},\n },\n diagnostics: {\n warnings: [],\n errors: [\n {\n diagnosticId,\n code: input.diagnostics.fatalError.code,\n message: input.diagnostics.fatalError.message,\n isFatal: input.diagnostics.fatalError.isFatal,\n source: input.diagnostics.fatalError.source,\n details: input.diagnostics.fatalError.details,\n },\n ],\n },\n },\n compatibility: {\n reportVersion: \"compatibility-report/1\",\n generatedAt: input.generatedAt,\n blockExport: true,\n featureEntries: [...input.diagnostics.diagnostics.featureEntries],\n warnings: [...input.diagnostics.diagnostics.warnings],\n errors: [...input.diagnostics.diagnostics.errors],\n },\n warningLog: [],\n };\n}\n\nfunction createDiagnosticsRenderSnapshot(\n input: {\n documentId: string;\n sourceLabel?: string;\n diagnostics: ImportDiagnosticsResult;\n },\n persistedSnapshot: PersistedEditorSnapshot,\n): RuntimeRenderSnapshot {\n return {\n documentId: input.documentId,\n sessionId: `${input.documentId}-diagnostics`,\n sourceLabel: input.sourceLabel,\n revisionToken: `${input.documentId}:diagnostics`,\n isReady: true,\n isDirty: false,\n readOnly: true,\n selection: collapsedSelection(),\n documentStats: {\n storyLength: 0,\n commentCount: 0,\n revisionCount: 0,\n opaqueFragmentCount: 0,\n },\n comments: {\n openCommentIds: [],\n resolvedCommentIds: [],\n detachedCommentIds: [],\n totalCount: 0,\n threads: [],\n },\n trackedChanges: {\n pendingChangeIds: [],\n acceptedChangeIds: [],\n rejectedChangeIds: [],\n detachedChangeIds: [],\n actionableChangeIds: [],\n preserveOnlyChangeIds: [],\n totalCount: 0,\n revisions: [],\n },\n compatibility: {\n blockExport: true,\n blockExportReasons: [persistedSnapshot.compatibility.errors[0]?.message ?? input.diagnostics.featureEntry.message],\n warningCount: persistedSnapshot.compatibility.warnings.length,\n errorCount: persistedSnapshot.compatibility.errors.length,\n featureEntries: [...persistedSnapshot.compatibility.featureEntries],\n },\n warnings: [],\n fatalError: input.diagnostics.fatalError,\n commandState: {\n canUndo: false,\n canRedo: false,\n readOnly: true,\n },\n };\n}\n\nfunction collapsedSelection(): RuntimeRenderSnapshot[\"selection\"] {\n return {\n anchor: 0,\n head: 0,\n isCollapsed: true,\n activeRange: {\n kind: \"range\",\n from: 0,\n to: 0,\n assoc: {\n start: -1,\n end: 1,\n },\n },\n };\n}\n\nfunction createReadOnlyDiagnosticsModeError(commandType: string): Error {\n const error = new Error(\n `Command ${commandType} is blocked in read-only diagnostics mode.`,\n );\n Object.assign(error, {\n code: \"import_failed\",\n details: {\n mode: \"read-only-diagnostics\",\n commandType,\n },\n });\n return error;\n}\n\nfunction sanitizeDiagnosticsToken(documentId: string): string {\n const collapsed = documentId.replace(/[^A-Za-z0-9._-]/g, \"-\");\n return collapsed.length > 0 ? `read-only-${collapsed}` : \"read-only-diagnostics\";\n}\n","import type {\n BlockNode,\n FootnoteRefNode,\n HeaderFooterVariant,\n InlineNode,\n ParagraphNode,\n TextMark,\n} from \"../../model/canonical-document.ts\";\n\n// ---- Public types ----\n\nexport interface ParsedHeaderFooterReference {\n variant: HeaderFooterVariant;\n relationshipId: string;\n kind: \"header\" | \"footer\";\n}\n\nexport interface ParsedHeaderFooterDocument {\n blocks: BlockNode[];\n}\n\n// ---- XML node types (inline, no external dep) ----\n\ninterface XmlElementNode {\n type: \"element\";\n name: string;\n attributes: Record<string, string>;\n children: XmlNode[];\n}\n\ninterface XmlTextNode {\n type: \"text\";\n text: string;\n}\n\ntype XmlNode = XmlElementNode | XmlTextNode;\n\n// ---- Public API ----\n\n/**\n * Scan a document body XML for w:headerReference / w:footerReference elements\n * inside w:sectPr and return the relationship references.\n */\nexport function parseHeaderFooterReferences(\n documentXml: string,\n): ParsedHeaderFooterReference[] {\n const root = parseXml(documentXml);\n const documentElement = findChildElementOptional(root, \"document\");\n if (!documentElement) {\n return [];\n }\n\n const bodyElement = findChildElementOptional(documentElement, \"body\");\n if (!bodyElement) {\n return [];\n }\n\n const refs: ParsedHeaderFooterReference[] = [];\n\n // Collect all sectPr elements (can appear in paragraph pPr and at body level)\n collectSectPrReferences(bodyElement, refs);\n\n return refs;\n}\n\n/**\n * Parse a headerN.xml part (<w:hdr> root) into block nodes.\n */\nexport function parseHeaderXml(xml: string): ParsedHeaderFooterDocument {\n return parseHdrFtrXml(xml, \"hdr\");\n}\n\n/**\n * Parse a footerN.xml part (<w:ftr> root) into block nodes.\n */\nexport function parseFooterXml(xml: string): ParsedHeaderFooterDocument {\n return parseHdrFtrXml(xml, \"ftr\");\n}\n\n// ---- Internal helpers ----\n\nfunction collectSectPrReferences(\n element: XmlElementNode,\n refs: ParsedHeaderFooterReference[],\n): void {\n for (const child of element.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const name = localName(child.name);\n\n if (name === \"sectPr\") {\n extractSectPrRefs(child, refs);\n } else if (name === \"p\") {\n // Check paragraph properties for sectPr\n const pPr = findChildElementOptional(child, \"pPr\");\n if (pPr) {\n const sectPr = findChildElementOptional(pPr, \"sectPr\");\n if (sectPr) {\n extractSectPrRefs(sectPr, refs);\n }\n }\n }\n }\n}\n\nfunction extractSectPrRefs(\n sectPr: XmlElementNode,\n refs: ParsedHeaderFooterReference[],\n): void {\n for (const child of sectPr.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const name = localName(child.name);\n if (name === \"headerReference\" || name === \"footerReference\") {\n const kind: \"header\" | \"footer\" = name === \"headerReference\" ? \"header\" : \"footer\";\n const rawType =\n child.attributes[\"w:type\"] ?? child.attributes.type ?? \"default\";\n const variant = toHeaderFooterVariant(rawType);\n const relationshipId =\n child.attributes[\"r:id\"] ??\n child.attributes[\"r:Id\"] ??\n child.attributes.id ??\n child.attributes.Id ??\n \"\";\n\n if (relationshipId) {\n // Avoid duplicates (multiple sectPr may reference same header)\n const alreadyAdded = refs.some(\n (ref) => ref.relationshipId === relationshipId && ref.kind === kind,\n );\n if (!alreadyAdded) {\n refs.push({ variant, relationshipId, kind });\n }\n }\n }\n }\n}\n\nfunction toHeaderFooterVariant(raw: string): HeaderFooterVariant {\n if (raw === \"first\") {\n return \"first\";\n }\n if (raw === \"even\") {\n return \"even\";\n }\n return \"default\";\n}\n\nfunction parseHdrFtrXml(\n xml: string,\n rootLocalName: \"hdr\" | \"ftr\",\n): ParsedHeaderFooterDocument {\n const root = parseXml(xml);\n const hdrFtrElement = findChildElementOptional(root, rootLocalName);\n if (!hdrFtrElement) {\n return { blocks: [] };\n }\n\n const blocks: BlockNode[] = [];\n\n for (const child of hdrFtrElement.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const name = localName(child.name);\n\n if (name === \"p\") {\n blocks.push(parseParagraphElement(child));\n } else if (name === \"tbl\") {\n // Table in header/footer: store as opaque to preserve fidelity\n blocks.push({\n type: \"opaque_block\",\n fragmentId: \"fragment:hdrftr-tbl\",\n warningId: \"warning:hdrftr-opaque-table\",\n });\n } else {\n // Other block-level elements: treat as opaque\n blocks.push({\n type: \"opaque_block\",\n fragmentId: \"fragment:hdrftr-opaque\",\n warningId: \"warning:hdrftr-opaque-block\",\n });\n }\n }\n\n return { blocks };\n}\n\nfunction parseParagraphElement(pElement: XmlElementNode): ParagraphNode {\n let styleId: string | undefined;\n let alignment: ParagraphNode[\"alignment\"];\n const children: InlineNode[] = [];\n\n for (const child of pElement.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const name = localName(child.name);\n\n if (name === \"pPr\") {\n const pStyle = findChildElementOptional(child, \"pStyle\");\n styleId = pStyle?.attributes[\"w:val\"] ?? pStyle?.attributes.val;\n const jc = findChildElementOptional(child, \"jc\");\n const jcVal = jc?.attributes[\"w:val\"] ?? jc?.attributes.val;\n if (jcVal === \"left\" || jcVal === \"center\" || jcVal === \"right\" || jcVal === \"both\" || jcVal === \"distribute\") {\n alignment = jcVal;\n }\n } else if (name === \"r\") {\n children.push(...parseRunElement(child));\n } else if (name === \"hyperlink\") {\n // Simplified: collect text children from hyperlink runs\n for (const hChild of child.children) {\n if (hChild.type === \"element\" && localName(hChild.name) === \"r\") {\n children.push(...parseRunElement(hChild));\n }\n }\n } else if (name === \"bookmarkStart\" || name === \"bookmarkEnd\") {\n // Skip bookmark nodes in headers/footers\n } else if (name === \"fldChar\" || name === \"instrText\") {\n // Skip field chars, handled via run parsing\n }\n }\n\n return {\n type: \"paragraph\",\n ...(styleId ? { styleId } : {}),\n ...(alignment ? { alignment } : {}),\n children,\n };\n}\n\nfunction parseRunElement(rElement: XmlElementNode): InlineNode[] {\n const nodes: InlineNode[] = [];\n const marks: TextMark[] = parseRunProperties(rElement);\n\n for (const child of rElement.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const name = localName(child.name);\n\n if (name === \"t\") {\n const text = extractTextContent(child);\n if (text.length > 0) {\n nodes.push({\n type: \"text\",\n text,\n ...(marks.length > 0 ? { marks } : {}),\n });\n }\n } else if (name === \"br\") {\n nodes.push({ type: \"hard_break\" });\n } else if (name === \"tab\") {\n nodes.push({ type: \"tab\" });\n } else if (name === \"footnoteReference\") {\n const noteId =\n child.attributes[\"w:id\"] ?? child.attributes.id ?? \"\";\n if (noteId) {\n const ref: FootnoteRefNode = {\n type: \"footnote_ref\",\n noteId,\n noteKind: \"footnote\",\n };\n nodes.push(ref);\n }\n } else if (name === \"endnoteReference\") {\n const noteId =\n child.attributes[\"w:id\"] ?? child.attributes.id ?? \"\";\n if (noteId) {\n const ref: FootnoteRefNode = {\n type: \"footnote_ref\",\n noteId,\n noteKind: \"endnote\",\n };\n nodes.push(ref);\n }\n }\n }\n\n return nodes;\n}\n\nfunction parseRunProperties(rElement: XmlElementNode): TextMark[] {\n const rPr = findChildElementOptional(rElement, \"rPr\");\n if (!rPr) {\n return [];\n }\n\n const marks: TextMark[] = [];\n\n for (const child of rPr.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const name = localName(child.name);\n const val = child.attributes[\"w:val\"] ?? child.attributes.val ?? \"true\";\n\n switch (name) {\n case \"b\":\n if (val !== \"0\" && val !== \"false\") {\n marks.push({ type: \"bold\" });\n }\n break;\n case \"i\":\n if (val !== \"0\" && val !== \"false\") {\n marks.push({ type: \"italic\" });\n }\n break;\n case \"u\":\n if (val !== \"none\" && val !== \"0\") {\n marks.push({ type: \"underline\" });\n }\n break;\n case \"strike\":\n if (val !== \"0\" && val !== \"false\") {\n marks.push({ type: \"strikethrough\" });\n }\n break;\n case \"dstrike\":\n if (val !== \"0\" && val !== \"false\") {\n marks.push({ type: \"doubleStrikethrough\" });\n }\n break;\n }\n }\n\n return marks;\n}\n\nfunction extractTextContent(tElement: XmlElementNode): string {\n let text = \"\";\n for (const child of tElement.children) {\n if (child.type === \"text\") {\n text += child.text;\n }\n }\n return text;\n}\n\nfunction findChildElementOptional(\n node: XmlElementNode,\n childLocalName: string,\n): XmlElementNode | undefined {\n return node.children.find(\n (entry): entry is XmlElementNode =>\n entry.type === \"element\" && localName(entry.name) === childLocalName,\n );\n}\n\nfunction localName(name: string): string {\n const separatorIndex = name.indexOf(\":\");\n return separatorIndex >= 0 ? name.slice(separatorIndex + 1) : name;\n}\n\n// ---- Minimal XML parser (same pattern as parse-numbering.ts) ----\n\nfunction parseXml(xml: string): XmlElementNode {\n const root: XmlElementNode = {\n type: \"element\",\n name: \"__root__\",\n attributes: {},\n children: [],\n };\n const stack: XmlElementNode[] = [root];\n let cursor = 0;\n\n while (cursor < xml.length) {\n if (xml.startsWith(\"<!--\", cursor)) {\n const end = xml.indexOf(\"-->\", cursor);\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<?\", cursor)) {\n const end = xml.indexOf(\"?>\", cursor);\n cursor = end >= 0 ? end + 2 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<![CDATA[\", cursor)) {\n const end = xml.indexOf(\"]]>\", cursor);\n const textEnd = end >= 0 ? end : xml.length;\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text: xml.slice(cursor + 9, textEnd),\n });\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n if (xml[cursor] !== \"<\") {\n const nextTag = xml.indexOf(\"<\", cursor);\n const end = nextTag >= 0 ? nextTag : xml.length;\n const text = decodeXmlEntities(xml.slice(cursor, end));\n if (text.trim().length > 0 || (text.length > 0 && stack.length > 1)) {\n stack[stack.length - 1]?.children.push({ type: \"text\", text });\n }\n cursor = end;\n continue;\n }\n\n // Closing tag\n if (xml[cursor + 1] === \"/\") {\n const end = xml.indexOf(\">\", cursor);\n if (end < 0) {\n break;\n }\n stack.pop();\n cursor = end + 1;\n continue;\n }\n\n // Open or self-closing tag\n const tagEnd = xml.indexOf(\">\", cursor);\n if (tagEnd < 0) {\n break;\n }\n\n const tagContent = xml.slice(cursor + 1, tagEnd);\n const selfClosing = tagContent.endsWith(\"/\");\n const normalized = selfClosing ? tagContent.slice(0, -1).trimEnd() : tagContent;\n\n const spaceIndex = normalized.search(/\\s/);\n const tagName =\n spaceIndex >= 0 ? normalized.slice(0, spaceIndex) : normalized;\n const attrString =\n spaceIndex >= 0 ? normalized.slice(spaceIndex + 1) : \"\";\n const attributes = parseAttributes(attrString);\n\n const element: XmlElementNode = {\n type: \"element\",\n name: tagName,\n attributes,\n children: [],\n };\n\n stack[stack.length - 1]?.children.push(element);\n\n if (!selfClosing) {\n stack.push(element);\n }\n\n cursor = tagEnd + 1;\n }\n\n return root;\n}\n\nfunction parseAttributes(attrString: string): Record<string, string> {\n const attrs: Record<string, string> = {};\n const pattern = /([A-Za-z_:][A-Za-z0-9:._-]*)\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/gu;\n\n for (const match of attrString.matchAll(pattern)) {\n const name = match[1];\n const value = match[3] ?? match[4] ?? \"\";\n if (name) {\n attrs[name] = decodeXmlEntities(value);\n }\n }\n\n return attrs;\n}\n\nfunction decodeXmlEntities(text: string): string {\n return text\n .replace(/&amp;/g, \"&\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\")\n .replace(/&#(\\d+);/g, (_, dec) => String.fromCodePoint(Number.parseInt(dec, 10)))\n .replace(/&#x([0-9a-fA-F]+);/g, (_, hex) =>\n String.fromCodePoint(Number.parseInt(hex, 16)),\n );\n}\n","import type {\n BlockNode,\n FootnoteCollection,\n FootnoteDefinition,\n InlineNode,\n ParagraphNode,\n TextMark,\n} from \"../../model/canonical-document.ts\";\n\n// ---- XML node types (inline, no external dep) ----\n\ninterface XmlElementNode {\n type: \"element\";\n name: string;\n attributes: Record<string, string>;\n children: XmlNode[];\n}\n\ninterface XmlTextNode {\n type: \"text\";\n text: string;\n}\n\ntype XmlNode = XmlElementNode | XmlTextNode;\n\n// ---- Special footnote/endnote IDs to skip ----\n\nconst SPECIAL_NOTE_IDS = new Set([\"-1\", \"0\"]);\nconst SPECIAL_NOTE_TYPES = new Set([\"separator\", \"continuationSeparator\"]);\n\n// ---- Public API ----\n\n/**\n * Parse footnotes.xml (<w:footnotes> root) into a FootnoteCollection.\n * Also accepts endnotes.xml (<w:endnotes> root).\n */\nexport function parseFootnotesXml(xml: string): FootnoteCollection {\n const root = parseXml(xml);\n\n const footnotesElement = findChildElementOptional(root, \"footnotes\");\n const endnotesElement = findChildElementOptional(root, \"endnotes\");\n\n const footnotes: Record<string, FootnoteDefinition> = {};\n const endnotes: Record<string, FootnoteDefinition> = {};\n\n if (footnotesElement) {\n for (const child of footnotesElement.children) {\n if (child.type !== \"element\") {\n continue;\n }\n if (localName(child.name) !== \"footnote\") {\n continue;\n }\n const definition = parseNoteElement(child, \"footnote\");\n if (definition) {\n footnotes[definition.noteId] = definition;\n }\n }\n }\n\n if (endnotesElement) {\n for (const child of endnotesElement.children) {\n if (child.type !== \"element\") {\n continue;\n }\n if (localName(child.name) !== \"endnote\") {\n continue;\n }\n const definition = parseNoteElement(child, \"endnote\");\n if (definition) {\n endnotes[definition.noteId] = definition;\n }\n }\n }\n\n return { footnotes, endnotes };\n}\n\n/**\n * Parse a standalone endnotes.xml (<w:endnotes> root).\n * Merges into the provided collection or creates a new one.\n */\nexport function parseEndnotesXml(\n xml: string,\n existing?: FootnoteCollection,\n): FootnoteCollection {\n const root = parseXml(xml);\n const endnotesElement = findChildElementOptional(root, \"endnotes\");\n const endnotes: Record<string, FootnoteDefinition> = {\n ...(existing?.endnotes ?? {}),\n };\n\n if (endnotesElement) {\n for (const child of endnotesElement.children) {\n if (child.type !== \"element\") {\n continue;\n }\n if (localName(child.name) !== \"endnote\") {\n continue;\n }\n const definition = parseNoteElement(child, \"endnote\");\n if (definition) {\n endnotes[definition.noteId] = definition;\n }\n }\n }\n\n return {\n footnotes: existing?.footnotes ?? {},\n endnotes,\n };\n}\n\n// ---- Internal helpers ----\n\nfunction parseNoteElement(\n element: XmlElementNode,\n kind: \"footnote\" | \"endnote\",\n): FootnoteDefinition | undefined {\n const rawId =\n element.attributes[\"w:id\"] ?? element.attributes.id ?? \"\";\n const rawType =\n element.attributes[\"w:type\"] ?? element.attributes.type ?? \"\";\n\n if (!rawId || SPECIAL_NOTE_IDS.has(rawId) || SPECIAL_NOTE_TYPES.has(rawType)) {\n return undefined;\n }\n\n const noteId = rawId;\n const blocks: BlockNode[] = [];\n\n for (const child of element.children) {\n if (child.type !== \"element\") {\n continue;\n }\n const name = localName(child.name);\n if (name === \"p\") {\n blocks.push(parseParagraphElement(child));\n } else if (name === \"tbl\") {\n blocks.push({\n type: \"opaque_block\",\n fragmentId: `fragment:note-tbl-${noteId}`,\n warningId: `warning:note-opaque-table`,\n });\n } else {\n blocks.push({\n type: \"opaque_block\",\n fragmentId: `fragment:note-opaque-${noteId}`,\n warningId: `warning:note-opaque-block`,\n });\n }\n }\n\n return { noteId, kind, blocks };\n}\n\nfunction parseParagraphElement(pElement: XmlElementNode): ParagraphNode {\n let styleId: string | undefined;\n const children: InlineNode[] = [];\n\n for (const child of pElement.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const name = localName(child.name);\n\n if (name === \"pPr\") {\n const pStyle = findChildElementOptional(child, \"pStyle\");\n styleId = pStyle?.attributes[\"w:val\"] ?? pStyle?.attributes.val;\n } else if (name === \"r\") {\n children.push(...parseRunElement(child));\n } else if (name === \"hyperlink\") {\n for (const hChild of child.children) {\n if (hChild.type === \"element\" && localName(hChild.name) === \"r\") {\n children.push(...parseRunElement(hChild));\n }\n }\n }\n }\n\n return {\n type: \"paragraph\",\n ...(styleId ? { styleId } : {}),\n children,\n };\n}\n\nfunction parseRunElement(rElement: XmlElementNode): InlineNode[] {\n const nodes: InlineNode[] = [];\n const marks: TextMark[] = parseRunProperties(rElement);\n\n for (const child of rElement.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const name = localName(child.name);\n\n if (name === \"t\") {\n const text = extractTextContent(child);\n if (text.length > 0) {\n nodes.push({\n type: \"text\",\n text,\n ...(marks.length > 0 ? { marks } : {}),\n });\n }\n } else if (name === \"br\") {\n nodes.push({ type: \"hard_break\" });\n } else if (name === \"tab\") {\n nodes.push({ type: \"tab\" });\n } else if (name === \"footnoteRef\" || name === \"endnoteRef\") {\n // The in-note reference marker (superscript) - skip, rendered by the host\n } else if (name === \"footnoteReference\") {\n const noteId =\n child.attributes[\"w:id\"] ?? child.attributes.id ?? \"\";\n if (noteId) {\n nodes.push({ type: \"footnote_ref\", noteId, noteKind: \"footnote\" });\n }\n } else if (name === \"endnoteReference\") {\n const noteId =\n child.attributes[\"w:id\"] ?? child.attributes.id ?? \"\";\n if (noteId) {\n nodes.push({ type: \"footnote_ref\", noteId, noteKind: \"endnote\" });\n }\n }\n }\n\n return nodes;\n}\n\nfunction parseRunProperties(rElement: XmlElementNode): TextMark[] {\n const rPr = findChildElementOptional(rElement, \"rPr\");\n if (!rPr) {\n return [];\n }\n\n const marks: TextMark[] = [];\n\n for (const child of rPr.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const name = localName(child.name);\n const val = child.attributes[\"w:val\"] ?? child.attributes.val ?? \"true\";\n\n switch (name) {\n case \"b\":\n if (val !== \"0\" && val !== \"false\") marks.push({ type: \"bold\" });\n break;\n case \"i\":\n if (val !== \"0\" && val !== \"false\") marks.push({ type: \"italic\" });\n break;\n case \"u\":\n if (val !== \"none\" && val !== \"0\") marks.push({ type: \"underline\" });\n break;\n case \"strike\":\n if (val !== \"0\" && val !== \"false\") marks.push({ type: \"strikethrough\" });\n break;\n }\n }\n\n return marks;\n}\n\nfunction extractTextContent(tElement: XmlElementNode): string {\n let text = \"\";\n for (const child of tElement.children) {\n if (child.type === \"text\") {\n text += child.text;\n }\n }\n return text;\n}\n\nfunction findChildElementOptional(\n node: XmlElementNode,\n childLocalName: string,\n): XmlElementNode | undefined {\n return node.children.find(\n (entry): entry is XmlElementNode =>\n entry.type === \"element\" && localName(entry.name) === childLocalName,\n );\n}\n\nfunction localName(name: string): string {\n const idx = name.indexOf(\":\");\n return idx >= 0 ? name.slice(idx + 1) : name;\n}\n\n// ---- Minimal XML parser (same pattern as parse-numbering.ts) ----\n\nfunction parseXml(xml: string): XmlElementNode {\n const root: XmlElementNode = {\n type: \"element\",\n name: \"__root__\",\n attributes: {},\n children: [],\n };\n const stack: XmlElementNode[] = [root];\n let cursor = 0;\n\n while (cursor < xml.length) {\n if (xml.startsWith(\"<!--\", cursor)) {\n const end = xml.indexOf(\"-->\", cursor);\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<?\", cursor)) {\n const end = xml.indexOf(\"?>\", cursor);\n cursor = end >= 0 ? end + 2 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<![CDATA[\", cursor)) {\n const end = xml.indexOf(\"]]>\", cursor);\n const textEnd = end >= 0 ? end : xml.length;\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text: xml.slice(cursor + 9, textEnd),\n });\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n if (xml[cursor] !== \"<\") {\n const nextTag = xml.indexOf(\"<\", cursor);\n const end = nextTag >= 0 ? nextTag : xml.length;\n const text = decodeXmlEntities(xml.slice(cursor, end));\n if (text.trim().length > 0 || (text.length > 0 && stack.length > 1)) {\n stack[stack.length - 1]?.children.push({ type: \"text\", text });\n }\n cursor = end;\n continue;\n }\n\n if (xml[cursor + 1] === \"/\") {\n const end = xml.indexOf(\">\", cursor);\n if (end < 0) break;\n stack.pop();\n cursor = end + 1;\n continue;\n }\n\n const tagEnd = xml.indexOf(\">\", cursor);\n if (tagEnd < 0) break;\n\n const tagContent = xml.slice(cursor + 1, tagEnd);\n const selfClosing = tagContent.endsWith(\"/\");\n const normalized = selfClosing ? tagContent.slice(0, -1).trimEnd() : tagContent;\n\n const spaceIndex = normalized.search(/\\s/);\n const tagName = spaceIndex >= 0 ? normalized.slice(0, spaceIndex) : normalized;\n const attrString = spaceIndex >= 0 ? normalized.slice(spaceIndex + 1) : \"\";\n const attributes = parseAttributes(attrString);\n\n const element: XmlElementNode = {\n type: \"element\",\n name: tagName,\n attributes,\n children: [],\n };\n\n stack[stack.length - 1]?.children.push(element);\n\n if (!selfClosing) {\n stack.push(element);\n }\n\n cursor = tagEnd + 1;\n }\n\n return root;\n}\n\nfunction parseAttributes(attrString: string): Record<string, string> {\n const attrs: Record<string, string> = {};\n const pattern = /([A-Za-z_:][A-Za-z0-9:._-]*)\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/gu;\n for (const match of attrString.matchAll(pattern)) {\n const name = match[1];\n const value = match[3] ?? match[4] ?? \"\";\n if (name) {\n attrs[name] = decodeXmlEntities(value);\n }\n }\n return attrs;\n}\n\nfunction decodeXmlEntities(text: string): string {\n return text\n .replace(/&amp;/g, \"&\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\")\n .replace(/&#(\\d+);/g, (_, dec) => String.fromCodePoint(Number.parseInt(dec, 10)))\n .replace(/&#x([0-9a-fA-F]+);/g, (_, hex) =>\n String.fromCodePoint(Number.parseInt(hex, 16)),\n );\n}\n","import type {\n ThemeColorScheme,\n ThemeDefinition,\n ThemeFontScheme,\n} from \"../../model/canonical-document.ts\";\n\n// ---- XML node types (inline, no external dep) ----\n\ninterface XmlElementNode {\n type: \"element\";\n name: string;\n attributes: Record<string, string>;\n children: XmlNode[];\n}\n\ninterface XmlTextNode {\n type: \"text\";\n text: string;\n}\n\ntype XmlNode = XmlElementNode | XmlTextNode;\n\n// ---- Well-known DrawingML color slot names ----\n\nconst COLOR_SLOTS = [\n \"dk1\",\n \"lt1\",\n \"dk2\",\n \"lt2\",\n \"accent1\",\n \"accent2\",\n \"accent3\",\n \"accent4\",\n \"accent5\",\n \"accent6\",\n \"hlink\",\n \"folHlink\",\n] as const;\n\n// ---- Public API ----\n\n/**\n * Parse a DrawingML theme1.xml part into a ThemeDefinition.\n * Returns an empty ThemeDefinition if the XML is empty or malformed.\n */\nexport function parseThemeXml(xml: string): ThemeDefinition {\n if (!xml.trim()) {\n return {};\n }\n\n const root = parseXml(xml);\n const themeElement = findChildElementOptional(root, \"theme\");\n if (!themeElement) {\n return {};\n }\n\n const themeName =\n themeElement.attributes[\"name\"] ??\n themeElement.attributes[\"a:name\"] ??\n undefined;\n\n const themeElements = findChildElementOptional(themeElement, \"themeElements\");\n if (!themeElements) {\n return { ...(themeName ? { name: themeName } : {}) };\n }\n\n const colorScheme = parseColorScheme(\n findChildElementOptional(themeElements, \"clrScheme\"),\n );\n const fontScheme = parseFontScheme(\n findChildElementOptional(themeElements, \"fontScheme\"),\n );\n\n const result: ThemeDefinition = {};\n if (themeName) {\n result.name = themeName;\n }\n if (colorScheme) {\n result.colorScheme = colorScheme;\n }\n if (fontScheme) {\n result.fontScheme = fontScheme;\n }\n\n return result;\n}\n\n// ---- Internal helpers ----\n\nfunction parseColorScheme(\n element: XmlElementNode | undefined,\n): ThemeColorScheme | undefined {\n if (!element) {\n return undefined;\n }\n\n const schemeName =\n element.attributes[\"name\"] ?? element.attributes[\"a:name\"] ?? \"\";\n const colors: Record<string, string> = {};\n\n for (const slot of COLOR_SLOTS) {\n const slotElement = findChildElementOptional(element, slot);\n if (!slotElement) {\n continue;\n }\n\n const color = extractColorValue(slotElement);\n if (color) {\n colors[slot] = color;\n }\n }\n\n return { name: schemeName, colors };\n}\n\nfunction extractColorValue(slotElement: XmlElementNode): string | undefined {\n for (const child of slotElement.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const name = localName(child.name);\n\n if (name === \"srgbClr\") {\n const val = child.attributes[\"val\"] ?? child.attributes[\"a:val\"] ?? \"\";\n if (val) {\n return `#${val.toUpperCase()}`;\n }\n } else if (name === \"sysClr\") {\n // Use lastClr as the resolved color value\n const lastClr =\n child.attributes[\"lastClr\"] ??\n child.attributes[\"a:lastClr\"] ??\n \"\";\n if (lastClr) {\n return `#${lastClr.toUpperCase()}`;\n }\n }\n }\n\n return undefined;\n}\n\nfunction parseFontScheme(\n element: XmlElementNode | undefined,\n): ThemeFontScheme | undefined {\n if (!element) {\n return undefined;\n }\n\n const schemeName =\n element.attributes[\"name\"] ?? element.attributes[\"a:name\"] ?? \"\";\n\n const majorFontElement = findChildElementOptional(element, \"majorFont\");\n const minorFontElement = findChildElementOptional(element, \"minorFont\");\n\n const majorFont = majorFontElement\n ? extractFontTypeface(majorFontElement)\n : undefined;\n const minorFont = minorFontElement\n ? extractFontTypeface(minorFontElement)\n : undefined;\n\n const result: ThemeFontScheme = { name: schemeName };\n if (majorFont) {\n result.majorFont = majorFont;\n }\n if (minorFont) {\n result.minorFont = minorFont;\n }\n\n return result;\n}\n\nfunction extractFontTypeface(\n fontGroupElement: XmlElementNode,\n): string | undefined {\n const latinElement = findChildElementOptional(fontGroupElement, \"latin\");\n if (latinElement) {\n return (\n latinElement.attributes[\"typeface\"] ??\n latinElement.attributes[\"a:typeface\"] ??\n undefined\n );\n }\n return undefined;\n}\n\nfunction findChildElementOptional(\n node: XmlElementNode,\n childLocalName: string,\n): XmlElementNode | undefined {\n return node.children.find(\n (entry): entry is XmlElementNode =>\n entry.type === \"element\" && localName(entry.name) === childLocalName,\n );\n}\n\nfunction localName(name: string): string {\n const idx = name.indexOf(\":\");\n return idx >= 0 ? name.slice(idx + 1) : name;\n}\n\n// ---- Minimal XML parser ----\n\nfunction parseXml(xml: string): XmlElementNode {\n const root: XmlElementNode = {\n type: \"element\",\n name: \"__root__\",\n attributes: {},\n children: [],\n };\n const stack: XmlElementNode[] = [root];\n let cursor = 0;\n\n while (cursor < xml.length) {\n if (xml.startsWith(\"<!--\", cursor)) {\n const end = xml.indexOf(\"-->\", cursor);\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<?\", cursor)) {\n const end = xml.indexOf(\"?>\", cursor);\n cursor = end >= 0 ? end + 2 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<![CDATA[\", cursor)) {\n const end = xml.indexOf(\"]]>\", cursor);\n const textEnd = end >= 0 ? end : xml.length;\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text: xml.slice(cursor + 9, textEnd),\n });\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n if (xml[cursor] !== \"<\") {\n const nextTag = xml.indexOf(\"<\", cursor);\n const end = nextTag >= 0 ? nextTag : xml.length;\n const text = decodeXmlEntities(xml.slice(cursor, end));\n if (text.trim().length > 0 || (text.length > 0 && stack.length > 1)) {\n stack[stack.length - 1]?.children.push({ type: \"text\", text });\n }\n cursor = end;\n continue;\n }\n\n if (xml[cursor + 1] === \"/\") {\n const end = xml.indexOf(\">\", cursor);\n if (end < 0) break;\n stack.pop();\n cursor = end + 1;\n continue;\n }\n\n const tagEnd = xml.indexOf(\">\", cursor);\n if (tagEnd < 0) break;\n\n const tagContent = xml.slice(cursor + 1, tagEnd);\n const selfClosing = tagContent.endsWith(\"/\");\n const normalized = selfClosing ? tagContent.slice(0, -1).trimEnd() : tagContent;\n\n const spaceIndex = normalized.search(/\\s/);\n const tagName = spaceIndex >= 0 ? normalized.slice(0, spaceIndex) : normalized;\n const attrString = spaceIndex >= 0 ? normalized.slice(spaceIndex + 1) : \"\";\n const attributes = parseAttributes(attrString);\n\n const element: XmlElementNode = {\n type: \"element\",\n name: tagName,\n attributes,\n children: [],\n };\n\n stack[stack.length - 1]?.children.push(element);\n\n if (!selfClosing) {\n stack.push(element);\n }\n\n cursor = tagEnd + 1;\n }\n\n return root;\n}\n\nfunction parseAttributes(attrString: string): Record<string, string> {\n const attrs: Record<string, string> = {};\n const pattern = /([A-Za-z_:][A-Za-z0-9:._-]*)\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/gu;\n for (const match of attrString.matchAll(pattern)) {\n const name = match[1];\n const value = match[3] ?? match[4] ?? \"\";\n if (name) {\n attrs[name] = decodeXmlEntities(value);\n }\n }\n return attrs;\n}\n\nfunction decodeXmlEntities(text: string): string {\n return text\n .replace(/&amp;/g, \"&\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\")\n .replace(/&#(\\d+);/g, (_, dec) => String.fromCodePoint(Number.parseInt(dec, 10)))\n .replace(/&#x([0-9a-fA-F]+);/g, (_, hex) =>\n String.fromCodePoint(Number.parseInt(hex, 16)),\n );\n}\n","import type {\n FooterDocument,\n HeaderDocument,\n InlineNode,\n ParagraphNode,\n TextMark,\n} from \"../../model/canonical-document.ts\";\n\nexport const WORD_HEADER_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml\";\nexport const WORD_FOOTER_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml\";\n\nconst W_NS = `xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"`;\nconst R_NS = `xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"`;\n\n/**\n * Serialize a HeaderDocument into a headerN.xml string.\n */\nexport function serializeHeaderXml(header: HeaderDocument): string {\n const body = serializeBlocks(header.blocks);\n return [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n `<w:hdr ${W_NS} ${R_NS}>${body}</w:hdr>`,\n ].join(\"\\n\");\n}\n\n/**\n * Serialize a FooterDocument into a footerN.xml string.\n */\nexport function serializeFooterXml(footer: FooterDocument): string {\n const body = serializeBlocks(footer.blocks);\n return [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n `<w:ftr ${W_NS} ${R_NS}>${body}</w:ftr>`,\n ].join(\"\\n\");\n}\n\n// ---- Internal serialization ----\n\nfunction serializeBlocks(\n blocks: HeaderDocument[\"blocks\"] | FooterDocument[\"blocks\"],\n): string {\n if (blocks.length === 0) {\n // A valid header/footer must have at least one paragraph\n return `<w:p><w:r><w:t></w:t></w:r></w:p>`;\n }\n\n return blocks\n .map((block) => {\n if (block.type === \"paragraph\") {\n return serializeParagraph(block);\n }\n // opaque_block: emit empty paragraph to preserve structure\n return `<w:p/>`;\n })\n .join(\"\");\n}\n\nfunction serializeParagraph(paragraph: ParagraphNode): string {\n let xml = \"<w:p>\";\n\n const propertiesXml = buildParagraphPropertiesXml(paragraph);\n if (propertiesXml) {\n xml += propertiesXml;\n }\n\n const childrenXml = paragraph.children\n .map((child) => serializeInlineNode(child))\n .join(\"\");\n xml += childrenXml || \"<w:r><w:t></w:t></w:r>\";\n xml += \"</w:p>\";\n\n return xml;\n}\n\nfunction buildParagraphPropertiesXml(paragraph: ParagraphNode): string {\n const parts: string[] = [];\n\n if (paragraph.styleId) {\n parts.push(`<w:pStyle w:val=\"${escapeAttribute(paragraph.styleId)}\"/>`);\n }\n if (paragraph.alignment) {\n parts.push(`<w:jc w:val=\"${escapeAttribute(paragraph.alignment)}\"/>`);\n }\n\n return parts.length > 0 ? `<w:pPr>${parts.join(\"\")}</w:pPr>` : \"\";\n}\n\nfunction serializeInlineNode(node: InlineNode): string {\n switch (node.type) {\n case \"text\": {\n const properties = buildRunPropertiesXml(node.marks);\n const preserve = requiresPreservedSpace(node.text)\n ? ` xml:space=\"preserve\"`\n : \"\";\n return `<w:r>${properties}<w:t${preserve}>${escapeXml(node.text)}</w:t></w:r>`;\n }\n case \"tab\":\n return \"<w:r><w:tab/></w:r>\";\n case \"hard_break\":\n return \"<w:r><w:br/></w:r>\";\n case \"footnote_ref\": {\n const refElement =\n node.noteKind === \"footnote\"\n ? `<w:footnoteReference w:id=\"${escapeAttribute(node.noteId)}\"/>`\n : `<w:endnoteReference w:id=\"${escapeAttribute(node.noteId)}\"/>`;\n return `<w:r><w:rPr><w:rStyle w:val=\"${node.noteKind === \"footnote\" ? \"FootnoteReference\" : \"EndnoteReference\"}\"/></w:rPr>${refElement}</w:r>`;\n }\n case \"opaque_inline\":\n // Cannot reproduce opaque inline content without original XML; emit empty\n return \"\";\n case \"hyperlink\": {\n const childrenXml = node.children\n .map((child) => {\n switch (child.type) {\n case \"text\": {\n const properties = buildRunPropertiesXml(undefined);\n const preserve = requiresPreservedSpace(child.text)\n ? ` xml:space=\"preserve\"`\n : \"\";\n return `<w:r>${properties}<w:t${preserve}>${escapeXml(child.text)}</w:t></w:r>`;\n }\n case \"tab\":\n return \"<w:r><w:tab/></w:r>\";\n case \"hard_break\":\n return \"<w:r><w:br/></w:r>\";\n default:\n return \"\";\n }\n })\n .join(\"\");\n // Hyperlinks in headers/footers typically use bookmark anchors or external URLs.\n // Emit as a plain run since we don't retain the relationship ID here.\n return childrenXml;\n }\n case \"image\":\n case \"field\":\n case \"bookmark_start\":\n case \"bookmark_end\":\n case \"column_break\":\n case \"symbol\":\n // These node types are not parsed from headers/footers by parse-headers-footers.ts\n return \"\";\n }\n}\n\nfunction buildRunPropertiesXml(marks: TextMark[] | undefined): string {\n if (!marks || marks.length === 0) {\n return \"\";\n }\n\n const parts: string[] = [];\n for (const mark of marks) {\n switch (mark.type) {\n case \"bold\":\n parts.push(\"<w:b/>\");\n break;\n case \"italic\":\n parts.push(\"<w:i/>\");\n break;\n case \"underline\":\n parts.push(\"<w:u w:val=\\\"single\\\"/>\");\n break;\n case \"strikethrough\":\n parts.push(\"<w:strike/>\");\n break;\n case \"doubleStrikethrough\":\n parts.push(\"<w:dstrike/>\");\n break;\n default:\n // Other mark types not parsed from headers/footers\n break;\n }\n }\n\n return parts.length > 0 ? `<w:rPr>${parts.join(\"\")}</w:rPr>` : \"\";\n}\n\nfunction requiresPreservedSpace(text: string): boolean {\n return (\n text.length > 0 &&\n (text[0] === \" \" || text[text.length - 1] === \" \" || text.includes(\" \"))\n );\n}\n\nfunction escapeXml(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\n}\n\nfunction escapeAttribute(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n","import type {\n FootnoteCollection,\n FootnoteDefinition,\n InlineNode,\n ParagraphNode,\n TextMark,\n} from \"../../model/canonical-document.ts\";\n\nexport const WORD_FOOTNOTES_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml\";\nexport const WORD_ENDNOTES_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml\";\n\nconst W_NS = `xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"`;\nconst R_NS = `xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"`;\n\n/**\n * Serialize the footnotes portion of a FootnoteCollection to footnotes.xml.\n * Includes the required separator and continuation-separator stubs.\n */\nexport function serializeFootnotesXml(collection: FootnoteCollection): string {\n const entries = Object.values(collection.footnotes).sort(compareNoteIds);\n const body = [\n serializeSeparatorStub(\"footnote\", \"-1\", \"separator\"),\n serializeSeparatorStub(\"footnote\", \"0\", \"continuationSeparator\"),\n ...entries.map((entry) => serializeNoteDefinition(\"footnote\", entry)),\n ].join(\"\");\n\n return [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n `<w:footnotes ${W_NS} ${R_NS}>${body}</w:footnotes>`,\n ].join(\"\\n\");\n}\n\n/**\n * Serialize the endnotes portion of a FootnoteCollection to endnotes.xml.\n * Includes the required separator and continuation-separator stubs.\n */\nexport function serializeEndnotesXml(collection: FootnoteCollection): string {\n const entries = Object.values(collection.endnotes).sort(compareNoteIds);\n const body = [\n serializeSeparatorStub(\"endnote\", \"-1\", \"separator\"),\n serializeSeparatorStub(\"endnote\", \"0\", \"continuationSeparator\"),\n ...entries.map((entry) => serializeNoteDefinition(\"endnote\", entry)),\n ].join(\"\");\n\n return [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n `<w:endnotes ${W_NS} ${R_NS}>${body}</w:endnotes>`,\n ].join(\"\\n\");\n}\n\n// ---- Internal serialization ----\n\nfunction serializeSeparatorStub(\n kind: \"footnote\" | \"endnote\",\n id: string,\n type: \"separator\" | \"continuationSeparator\",\n): string {\n const tag = kind === \"footnote\" ? \"w:footnote\" : \"w:endnote\";\n return `<${tag} w:type=\"${type}\" w:id=\"${id}\"><w:p/></${tag}>`;\n}\n\nfunction serializeNoteDefinition(\n kind: \"footnote\" | \"endnote\",\n definition: FootnoteDefinition,\n): string {\n const tag = kind === \"footnote\" ? \"w:footnote\" : \"w:endnote\";\n const blocks = definition.blocks\n .map((block) => {\n if (block.type === \"paragraph\") {\n return serializeParagraph(block);\n }\n // opaque_block: emit empty paragraph\n return `<w:p/>`;\n })\n .join(\"\");\n\n const body = blocks || `<w:p><w:r><w:t></w:t></w:r></w:p>`;\n return `<${tag} w:id=\"${escapeAttribute(definition.noteId)}\">${body}</${tag}>`;\n}\n\nfunction serializeParagraph(paragraph: ParagraphNode): string {\n let xml = \"<w:p>\";\n\n const propertiesXml = buildParagraphPropertiesXml(paragraph);\n if (propertiesXml) {\n xml += propertiesXml;\n }\n\n const childrenXml = paragraph.children\n .map((child) => serializeInlineNode(child))\n .join(\"\");\n xml += childrenXml || \"<w:r><w:t></w:t></w:r>\";\n xml += \"</w:p>\";\n\n return xml;\n}\n\nfunction buildParagraphPropertiesXml(paragraph: ParagraphNode): string {\n const parts: string[] = [];\n\n if (paragraph.styleId) {\n parts.push(`<w:pStyle w:val=\"${escapeAttribute(paragraph.styleId)}\"/>`);\n }\n if (paragraph.alignment) {\n parts.push(`<w:jc w:val=\"${escapeAttribute(paragraph.alignment)}\"/>`);\n }\n\n return parts.length > 0 ? `<w:pPr>${parts.join(\"\")}</w:pPr>` : \"\";\n}\n\nfunction serializeInlineNode(node: InlineNode): string {\n switch (node.type) {\n case \"text\": {\n const properties = buildRunPropertiesXml(node.marks);\n const preserve = requiresPreservedSpace(node.text)\n ? ` xml:space=\"preserve\"`\n : \"\";\n return `<w:r>${properties}<w:t${preserve}>${escapeXml(node.text)}</w:t></w:r>`;\n }\n case \"tab\":\n return \"<w:r><w:tab/></w:r>\";\n case \"hard_break\":\n return \"<w:r><w:br/></w:r>\";\n case \"footnote_ref\": {\n const refElement =\n node.noteKind === \"footnote\"\n ? `<w:footnoteReference w:id=\"${escapeAttribute(node.noteId)}\"/>`\n : `<w:endnoteReference w:id=\"${escapeAttribute(node.noteId)}\"/>`;\n const styleVal =\n node.noteKind === \"footnote\"\n ? \"FootnoteReference\"\n : \"EndnoteReference\";\n return `<w:r><w:rPr><w:rStyle w:val=\"${styleVal}\"/></w:rPr>${refElement}</w:r>`;\n }\n case \"opaque_inline\":\n return \"\";\n case \"hyperlink\": {\n return node.children\n .map((child) => {\n if (child.type === \"text\") {\n const preserve = requiresPreservedSpace(child.text)\n ? ` xml:space=\"preserve\"`\n : \"\";\n return `<w:r><w:t${preserve}>${escapeXml(child.text)}</w:t></w:r>`;\n }\n if (child.type === \"tab\") return \"<w:r><w:tab/></w:r>\";\n if (child.type === \"hard_break\") return \"<w:r><w:br/></w:r>\";\n return \"\";\n })\n .join(\"\");\n }\n default:\n return \"\";\n }\n}\n\nfunction buildRunPropertiesXml(marks: TextMark[] | undefined): string {\n if (!marks || marks.length === 0) {\n return \"\";\n }\n\n const parts: string[] = [];\n for (const mark of marks) {\n switch (mark.type) {\n case \"bold\":\n parts.push(\"<w:b/>\");\n break;\n case \"italic\":\n parts.push(\"<w:i/>\");\n break;\n case \"underline\":\n parts.push(\"<w:u w:val=\\\"single\\\"/>\");\n break;\n case \"strikethrough\":\n parts.push(\"<w:strike/>\");\n break;\n case \"doubleStrikethrough\":\n parts.push(\"<w:dstrike/>\");\n break;\n default:\n break;\n }\n }\n\n return parts.length > 0 ? `<w:rPr>${parts.join(\"\")}</w:rPr>` : \"\";\n}\n\nfunction compareNoteIds(\n left: FootnoteDefinition,\n right: FootnoteDefinition,\n): number {\n return Number.parseInt(left.noteId, 10) - Number.parseInt(right.noteId, 10);\n}\n\nfunction requiresPreservedSpace(text: string): boolean {\n return (\n text.length > 0 &&\n (text[0] === \" \" || text[text.length - 1] === \" \" || text.includes(\" \"))\n );\n}\n\nfunction escapeXml(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\n}\n\nfunction escapeAttribute(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n","import type {\n CompatibilityReport as PublicCompatibilityReport,\n EditorError,\n EditorWarning as PublicEditorWarning,\n EditorAnchorProjection as PublicEditorAnchorProjection,\n ExportDocxOptions,\n ExportResult,\n PersistedEditorSnapshot,\n} from \"../api/public-types.ts\";\nimport type {\n CanonicalDocumentEnvelope,\n CompatibilityFeatureEntry as InternalCompatibilityFeatureEntry,\n CompatibilityReport as InternalCompatibilityReport,\n CommentThreadRecord,\n EditorError as InternalEditorError,\n RevisionRecord as RuntimeRevisionRecord,\n EditorWarning as InternalEditorWarning,\n} from \"../core/state/editor-state.ts\";\nimport { createCanonicalDocumentId } from \"../core/state/editor-state.ts\";\nimport {\n createDetachedAnchor,\n type EditorAnchorProjection as InternalEditorAnchorProjection,\n} from \"../core/selection/mapping.ts\";\nimport { DOCX_MIME_TYPE } from \"./opc/docx-package.ts\";\nimport { readOpcPackage, type OpcPackage } from \"./opc/package-reader.ts\";\nimport { parseMainDocumentXml } from \"./ooxml/parse-main-document.ts\";\nimport { normalizeParsedTextDocument } from \"./normalize/normalize-text.ts\";\nimport {\n normalizePartPath,\n resolveRelationshipTarget,\n type OpcRelationship,\n} from \"./ooxml/part-manifest.ts\";\nimport {\n classifyCorruptPackageError,\n createBrokenRelationshipIssue,\n createMissingPartIssue,\n} from \"./opc/corrupt-package.ts\";\nimport { createExportSession } from \"./export/export-session.ts\";\nimport { serializeMainDocument } from \"./export/serialize-main-document.ts\";\nimport { parseRevisionsFromDocumentXml, type ParsedRevisionsResult } from \"./ooxml/parse-revisions.ts\";\nimport { parseCommentsFromOoxml } from \"./ooxml/parse-comments.ts\";\nimport { parseNumberingXml } from \"./ooxml/parse-numbering.ts\";\nimport {\n createCommentExportIdMap,\n serializeCommentAnchorsIntoDocumentXml,\n serializeMergedCommentsXml,\n} from \"./export/serialize-comments.ts\";\nimport { splitDocumentAtReviewBoundaries } from \"./export/split-review-boundaries.ts\";\nimport { serializeRuntimeRevisionsIntoDocumentXml } from \"./export/serialize-runtime-revisions.ts\";\nimport { createCommentStoreFromRuntimeComments } from \"../review/store/runtime-comment-store.ts\";\nimport type { CommentThread } from \"../review/store/comment-store.ts\";\nimport type { RevisionRecord as ReviewRevisionRecord } from \"../review/store/revision-types.ts\";\nimport { getRevisionActionability } from \"../review/store/revision-types.ts\";\nimport { buildCompatibilityReport } from \"../validation/compatibility-engine.ts\";\nimport {\n createPackageImportDiagnostics,\n createValidationImportDiagnostics,\n type ImportDiagnosticsResult,\n} from \"../validation/import-diagnostics.ts\";\nimport type {\n FootnoteCollection,\n HeaderDocument,\n FooterDocument,\n MediaCatalog,\n NumberingCatalog,\n OpaqueFragmentRecord,\n PreservedPackagePart,\n SubPartsCatalog,\n} from \"../model/canonical-document.ts\";\nimport { createCanonicalDocumentSignature } from \"../model/canonical-document.ts\";\nimport type {\n CommentImportDiagnostic,\n ImportedCommentDefinition,\n ParsedCommentsResult,\n} from \"./ooxml/parse-comments.ts\";\nimport { createReadOnlyDiagnosticsRuntime } from \"../runtime/read-only-diagnostics-runtime.ts\";\nimport {\n WORD_NUMBERING_CONTENT_TYPE,\n serializeNumberingXml,\n} from \"./export/serialize-numbering.ts\";\nimport {\n parseHeaderFooterReferences,\n parseHeaderXml,\n parseFooterXml,\n} from \"./ooxml/parse-headers-footers.ts\";\nimport { parseFootnotesXml, parseEndnotesXml } from \"./ooxml/parse-footnotes.ts\";\nimport { parseThemeXml } from \"./ooxml/parse-theme.ts\";\nimport {\n serializeHeaderXml,\n serializeFooterXml,\n WORD_HEADER_CONTENT_TYPE,\n WORD_FOOTER_CONTENT_TYPE,\n} from \"./export/serialize-headers-footers.ts\";\nimport {\n serializeFootnotesXml,\n serializeEndnotesXml,\n WORD_FOOTNOTES_CONTENT_TYPE,\n WORD_ENDNOTES_CONTENT_TYPE,\n} from \"./export/serialize-footnotes.ts\";\n\nconst MAIN_DOCUMENT_PATH = \"/word/document.xml\";\nconst NUMBERING_PART_PATH = \"/word/numbering.xml\";\nconst COMMENTS_PART_PATH = \"/word/comments.xml\";\nconst COMMENTS_EXTENDED_PART_PATH = \"/word/commentsExtended.xml\";\nconst COMMENTS_IDS_PART_PATH = \"/word/commentsIds.xml\";\nconst PEOPLE_PART_PATH = \"/word/people.xml\";\nconst MAIN_DOCUMENT_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\";\nconst NUMBERING_RELATIONSHIP_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering\";\nconst COMMENTS_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml\";\nconst COMMENTS_EXTENDED_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.commentsExtended+xml\";\nconst COMMENTS_IDS_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.commentsIds+xml\";\nconst PEOPLE_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.people+xml\";\nconst COMMENTS_RELATIONSHIP_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments\";\nconst COMMENTS_EXTENDED_RELATIONSHIP_TYPE =\n \"http://schemas.microsoft.com/office/2011/relationships/commentsExtended\";\nconst COMMENTS_IDS_RELATIONSHIP_TYPE =\n \"http://schemas.microsoft.com/office/2016/09/relationships/commentsIds\";\nconst PEOPLE_RELATIONSHIP_TYPE =\n \"http://schemas.microsoft.com/office/2011/relationships/people\";\nconst HEADER_RELATIONSHIP_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/header\";\nconst FOOTER_RELATIONSHIP_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer\";\nconst FOOTNOTES_RELATIONSHIP_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes\";\nconst ENDNOTES_RELATIONSHIP_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/endnotes\";\nconst FOOTNOTES_PART_PATH = \"/word/footnotes.xml\";\nconst ENDNOTES_PART_PATH = \"/word/endnotes.xml\";\n\ninterface LoadDocxEditorSessionOptions {\n documentId: string;\n sourceLabel?: string;\n bytes: Uint8Array | ArrayBuffer;\n editorBuild: string;\n}\n\nexport interface LoadedDocxEditorSession {\n initialSnapshot: PersistedEditorSnapshot;\n fatalError?: EditorError;\n readOnly: boolean;\n exportDocx: (\n snapshot: PersistedEditorSnapshot,\n options?: ExportDocxOptions,\n ) => Promise<ExportResult>;\n}\n\ninterface ImportedDocxState {\n sourceBytes: Uint8Array;\n sourcePackage: OpcPackage;\n sourceDocumentRelationships: readonly OpcRelationship[];\n sourceDocumentAttributes: Record<string, string>;\n sourceNumberingPartPath?: string;\n sourceNumberingRelationshipId?: string;\n sourceCommentsPartPath?: string;\n sourceCommentsRelationshipId?: string;\n sourceCommentsRootTag?: string;\n sourceCommentsExtendedPartPath?: string;\n sourceCommentsExtendedRelationshipId?: string;\n sourceCommentsExtendedRootTag?: string;\n sourceCommentsIdsPartPath?: string;\n sourceCommentsIdsRelationshipId?: string;\n sourceCommentsIdsRootTag?: string;\n sourcePeoplePartPath?: string;\n sourcePeopleRelationshipId?: string;\n sourcePeopleRootTag?: string;\n sourcePeopleAuthors: readonly string[];\n preservedCommentDefinitions: readonly ImportedCommentDefinition[];\n blockingCommentDiagnostics: readonly CommentImportDiagnostic[];\n initialCanonicalSignature: string;\n sourceSubPartPaths: {\n headers: Array<{ partPath: string; relationshipId: string }>;\n footers: Array<{ partPath: string; relationshipId: string }>;\n footnotesPartPath?: string;\n footnotesRelationshipId?: string;\n endnotesPartPath?: string;\n endnotesRelationshipId?: string;\n themePartPath?: string;\n themeRelationshipId?: string;\n };\n}\n\ninterface NormalizedImportedCommentsResult extends ParsedCommentsResult {\n preservedDefinitions: readonly ImportedCommentDefinition[];\n}\n\nconst BLOCKING_COMMENT_DIAGNOSTIC_CODES = new Set<CommentImportDiagnostic[\"code\"]>([\n \"missing_comment_definition\",\n \"missing_anchor_reference\",\n \"multi_paragraph_anchor_preserve_only\",\n \"opaque_anchor_preserve_only\",\n \"preserve_only_revision_overlap\",\n]);\n\nexport function loadDocxEditorSession(\n options: LoadDocxEditorSessionOptions,\n): LoadedDocxEditorSession {\n const sourceBytes = toUint8Array(options.bytes);\n let sourcePackage: OpcPackage;\n\n try {\n sourcePackage = readOpcPackage(sourceBytes);\n } catch (error) {\n return createDiagnosticsSession(\n options,\n createPackageImportDiagnostics({\n issue: classifyCorruptPackageError(error),\n }),\n );\n }\n\n const brokenRelationshipIssues = collectBrokenInternalRelationshipIssues(sourcePackage);\n if (brokenRelationshipIssues.length > 0) {\n return createDiagnosticsSession(\n options,\n createPackageImportDiagnostics({\n issue: {\n ...brokenRelationshipIssues[0],\n message: summarizeBrokenRelationshipIssues(brokenRelationshipIssues),\n details: {\n issueCount: brokenRelationshipIssues.length,\n targets: brokenRelationshipIssues.map((issue) => issue.targetPartPath).filter(Boolean),\n },\n },\n }),\n );\n }\n\n const documentPart = sourcePackage.parts.get(MAIN_DOCUMENT_PATH);\n if (!documentPart) {\n return createDiagnosticsSession(\n options,\n createPackageImportDiagnostics({\n issue: createMissingPartIssue(MAIN_DOCUMENT_PATH),\n }),\n );\n }\n\n try {\n const sourceDocumentXml = decodeUtf8(documentPart.bytes);\n const importedRevisions = parseRevisionsFromDocumentXml(sourceDocumentXml);\n const numberingPartPath = resolveDocumentRelatedPartPath(\n sourcePackage,\n documentPart.relationships,\n NUMBERING_RELATIONSHIP_TYPE,\n NUMBERING_PART_PATH,\n );\n const parsedNumbering = numberingPartPath\n ? parseNumberingXml(\n decodeUtf8(sourcePackage.parts.get(numberingPartPath)?.bytes ?? new Uint8Array()),\n )\n : createEmptyNumberingCatalog();\n const mediaParts = collectInlineMediaParts(sourcePackage);\n const parsedDocument = parseMainDocumentXml(\n sourceDocumentXml,\n documentPart.relationships,\n mediaParts,\n MAIN_DOCUMENT_PATH,\n );\n const normalizedDocument = normalizeParsedTextDocument(\n parsedDocument,\n MAIN_DOCUMENT_PATH,\n );\n const commentsPartPath = resolveCommentsPartPath(sourcePackage, documentPart.relationships);\n const commentsExtendedPartPath = resolveDocumentRelatedPartPath(\n sourcePackage,\n documentPart.relationships,\n COMMENTS_EXTENDED_RELATIONSHIP_TYPE,\n COMMENTS_EXTENDED_PART_PATH,\n );\n const commentsIdsPartPath = resolveDocumentRelatedPartPath(\n sourcePackage,\n documentPart.relationships,\n COMMENTS_IDS_RELATIONSHIP_TYPE,\n COMMENTS_IDS_PART_PATH,\n );\n const peoplePartPath = resolveDocumentRelatedPartPath(\n sourcePackage,\n documentPart.relationships,\n PEOPLE_RELATIONSHIP_TYPE,\n PEOPLE_PART_PATH,\n );\n const parsedComments = commentsPartPath\n ? parseCommentsFromOoxml(\n sourceDocumentXml,\n {\n commentsXml: decodeUtf8(sourcePackage.parts.get(commentsPartPath)?.bytes ?? new Uint8Array()),\n commentsExtendedXml: decodeUtf8(\n sourcePackage.parts.get(commentsExtendedPartPath ?? \"\")?.bytes ?? new Uint8Array(),\n ),\n commentsIdsXml: decodeUtf8(\n sourcePackage.parts.get(commentsIdsPartPath ?? \"\")?.bytes ?? new Uint8Array(),\n ),\n peopleXml: decodeUtf8(\n sourcePackage.parts.get(peoplePartPath ?? \"\")?.bytes ?? new Uint8Array(),\n ),\n },\n )\n : {\n threads: [] as CommentThread[],\n diagnostics: [] as CommentImportDiagnostic[],\n definitions: [] as ImportedCommentDefinition[],\n sourceRootTag: undefined,\n sourceExtendedRootTag: undefined,\n sourceIdsRootTag: undefined,\n sourcePeopleRootTag: undefined,\n peopleAuthors: [] as string[],\n };\n const normalizedRevisions = normalizeImportedRevisionRecords(\n importedRevisions,\n normalizedDocument.content,\n normalizedDocument.preservation.opaqueFragments,\n );\n const normalizedComments = normalizeImportedCommentThreads(\n parsedComments,\n normalizedDocument.preservation.opaqueFragments,\n normalizedRevisions.revisions,\n );\n // ---- Parse sub-parts: headers, footers, footnotes, endnotes, theme ----\n const headerFooterRefs = parseHeaderFooterReferences(sourceDocumentXml);\n const parsedHeaders: HeaderDocument[] = [];\n const parsedFooters: FooterDocument[] = [];\n const sourceHeaderPaths: Array<{ partPath: string; relationshipId: string }> = [];\n const sourceFooterPaths: Array<{ partPath: string; relationshipId: string }> = [];\n const seenSubPartRelIds = new Set<string>();\n\n for (const ref of headerFooterRefs) {\n if (seenSubPartRelIds.has(ref.relationshipId)) {\n continue;\n }\n seenSubPartRelIds.add(ref.relationshipId);\n\n const relationship = documentPart.relationships.find(\n (r) => r.id === ref.relationshipId && r.targetMode === \"internal\",\n );\n if (!relationship) {\n continue;\n }\n\n const partPath = resolveRelationshipTarget(MAIN_DOCUMENT_PATH, relationship);\n const partBytes = sourcePackage.parts.get(partPath)?.bytes;\n if (!partBytes) {\n continue;\n }\n\n const xml = decodeUtf8(partBytes);\n if (ref.kind === \"header\") {\n const parsed = parseHeaderXml(xml);\n parsedHeaders.push({\n variant: ref.variant,\n partPath,\n relationshipId: ref.relationshipId,\n blocks: parsed.blocks,\n });\n sourceHeaderPaths.push({ partPath, relationshipId: ref.relationshipId });\n } else {\n const parsed = parseFooterXml(xml);\n parsedFooters.push({\n variant: ref.variant,\n partPath,\n relationshipId: ref.relationshipId,\n blocks: parsed.blocks,\n });\n sourceFooterPaths.push({ partPath, relationshipId: ref.relationshipId });\n }\n }\n\n const footnotesPartPath = resolveDocumentRelatedPartPath(\n sourcePackage,\n documentPart.relationships,\n FOOTNOTES_RELATIONSHIP_TYPE,\n FOOTNOTES_PART_PATH,\n );\n const footnotesRelationshipId = documentPart.relationships.find(\n (r) => r.type === FOOTNOTES_RELATIONSHIP_TYPE && r.targetMode === \"internal\",\n )?.id;\n const endnotesPartPath = resolveDocumentRelatedPartPath(\n sourcePackage,\n documentPart.relationships,\n ENDNOTES_RELATIONSHIP_TYPE,\n ENDNOTES_PART_PATH,\n );\n const endnotesRelationshipId = documentPart.relationships.find(\n (r) => r.type === ENDNOTES_RELATIONSHIP_TYPE && r.targetMode === \"internal\",\n )?.id;\n\n let footnoteCollection: FootnoteCollection | undefined;\n if (footnotesPartPath) {\n footnoteCollection = parseFootnotesXml(\n decodeUtf8(sourcePackage.parts.get(footnotesPartPath)?.bytes ?? new Uint8Array()),\n );\n }\n if (endnotesPartPath) {\n footnoteCollection = parseEndnotesXml(\n decodeUtf8(sourcePackage.parts.get(endnotesPartPath)?.bytes ?? new Uint8Array()),\n footnoteCollection,\n );\n }\n\n const themeRelationship = documentPart.relationships.find(\n (r) => r.type === \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\" &&\n r.targetMode === \"internal\",\n );\n const themePartPath = themeRelationship\n ? resolveRelationshipTarget(MAIN_DOCUMENT_PATH, themeRelationship)\n : undefined;\n const parsedTheme =\n themePartPath && sourcePackage.parts.has(themePartPath)\n ? parseThemeXml(\n decodeUtf8(sourcePackage.parts.get(themePartPath)?.bytes ?? new Uint8Array()),\n )\n : undefined;\n\n const subParts: SubPartsCatalog | undefined =\n parsedHeaders.length > 0 ||\n parsedFooters.length > 0 ||\n footnoteCollection !== undefined ||\n parsedTheme !== undefined\n ? {\n headers: parsedHeaders,\n footers: parsedFooters,\n ...(footnoteCollection !== undefined ? { footnoteCollection } : {}),\n ...(parsedTheme !== undefined ? { theme: parsedTheme } : {}),\n }\n : undefined;\n\n const timestamp = new Date().toISOString();\n const document = createImportedCanonicalDocument({\n documentId: options.documentId,\n timestamp,\n numbering: parsedNumbering,\n media: normalizedDocument.media,\n content: normalizedDocument.content,\n subParts,\n preservation: {\n ...normalizedDocument.preservation,\n packageParts: {\n ...normalizedDocument.preservation.packageParts,\n ...collectPreservedPackageParts(sourcePackage, [\n numberingPartPath,\n commentsPartPath,\n commentsExtendedPartPath,\n commentsIdsPartPath,\n peoplePartPath,\n ]),\n },\n },\n diagnostics: {\n warnings: [\n ...normalizedDocument.diagnostics.warnings,\n ...normalizedRevisions.diagnostics.map((diagnostic, index) => ({\n diagnosticId: `diagnostic:revision-import-${index + 1}`,\n warningId: `warning:revision-import-${diagnostic.revisionId}`,\n source: \"review\" as const,\n message: diagnostic.message,\n })),\n ...normalizedComments.diagnostics.map((diagnostic, index) => ({\n diagnosticId: `diagnostic:comment-import-${index + 1}`,\n warningId: `warning:comment-import-${diagnostic.commentId}`,\n source: \"review\" as const,\n message: diagnostic.message,\n })),\n ],\n errors: [],\n },\n review: {\n comments: toRuntimeCommentRecords(normalizedComments.threads),\n revisions: toRuntimeRevisionRecords(normalizedRevisions.revisions),\n },\n });\n const compatibility = buildCompatibilityReport({\n document,\n generatedAt: timestamp,\n });\n const snapshot = createImportedSnapshot({\n documentId: options.documentId,\n editorBuild: options.editorBuild,\n timestamp,\n document,\n compatibility: toPublicCompatibilityReport(compatibility),\n });\n const importedState: ImportedDocxState = {\n sourceBytes: new Uint8Array(sourceBytes),\n sourcePackage,\n sourceDocumentRelationships: documentPart.relationships,\n sourceDocumentAttributes: extractDocumentRootAttributes(sourceDocumentXml),\n sourceNumberingPartPath: numberingPartPath,\n sourceNumberingRelationshipId: documentPart.relationships.find(\n (relationship) =>\n relationship.type === NUMBERING_RELATIONSHIP_TYPE &&\n relationship.targetMode === \"internal\",\n )?.id,\n sourceCommentsPartPath: commentsPartPath,\n sourceCommentsRelationshipId: documentPart.relationships.find(\n (relationship) =>\n relationship.type === COMMENTS_RELATIONSHIP_TYPE &&\n relationship.targetMode === \"internal\",\n )?.id,\n sourceCommentsRootTag: normalizedComments.sourceRootTag,\n sourceCommentsExtendedPartPath: commentsExtendedPartPath,\n sourceCommentsExtendedRelationshipId: documentPart.relationships.find(\n (relationship) =>\n relationship.type === COMMENTS_EXTENDED_RELATIONSHIP_TYPE &&\n relationship.targetMode === \"internal\",\n )?.id,\n sourceCommentsExtendedRootTag: normalizedComments.sourceExtendedRootTag,\n sourceCommentsIdsPartPath: commentsIdsPartPath,\n sourceCommentsIdsRelationshipId: documentPart.relationships.find(\n (relationship) =>\n relationship.type === COMMENTS_IDS_RELATIONSHIP_TYPE &&\n relationship.targetMode === \"internal\",\n )?.id,\n sourceCommentsIdsRootTag: normalizedComments.sourceIdsRootTag,\n sourcePeoplePartPath: peoplePartPath,\n sourcePeopleRelationshipId: documentPart.relationships.find(\n (relationship) =>\n relationship.type === PEOPLE_RELATIONSHIP_TYPE &&\n relationship.targetMode === \"internal\",\n )?.id,\n sourcePeopleRootTag: normalizedComments.sourcePeopleRootTag,\n sourcePeopleAuthors: normalizedComments.peopleAuthors,\n preservedCommentDefinitions: normalizedComments.preservedDefinitions,\n blockingCommentDiagnostics: normalizedComments.diagnostics.filter((diagnostic) =>\n BLOCKING_COMMENT_DIAGNOSTIC_CODES.has(diagnostic.code),\n ),\n initialCanonicalSignature: serializeCanonicalDocumentForExport(document),\n sourceSubPartPaths: {\n headers: sourceHeaderPaths,\n footers: sourceFooterPaths,\n footnotesPartPath,\n footnotesRelationshipId,\n endnotesPartPath,\n endnotesRelationshipId,\n themePartPath,\n themeRelationshipId: themeRelationship?.id,\n },\n };\n\n return {\n initialSnapshot: snapshot,\n readOnly: false,\n exportDocx: async (nextSnapshot, exportOptions) =>\n exportDocxEditorSession(importedState, nextSnapshot, exportOptions),\n };\n } catch (error) {\n return createDiagnosticsSession(\n options,\n createImportDiagnosticsFromError(error),\n );\n }\n}\n\nfunction exportDocxEditorSession(\n state: ImportedDocxState,\n snapshot: PersistedEditorSnapshot,\n options?: ExportDocxOptions,\n): ExportResult {\n if (snapshot.compatibility.blockExport) {\n throw new Error(\"DOCX export is blocked by the current compatibility report.\");\n }\n\n const currentDocument = snapshot.canonicalDocument as CanonicalDocumentEnvelope;\n if (\n serializeCanonicalDocumentForExport(currentDocument) ===\n state.initialCanonicalSignature &&\n canReuseSourceBytesForCurrentDocument(state, currentDocument)\n ) {\n return {\n bytes: new Uint8Array(state.sourceBytes),\n mimeType: DOCX_MIME_TYPE,\n fileName: options?.fileName ?? `${snapshot.documentId}.docx`,\n };\n }\n if (state.blockingCommentDiagnostics.length > 0) {\n throw new Error(\n `DOCX export is blocked because ${state.blockingCommentDiagnostics.length} preserve-only comment anchors cannot be safely remapped after runtime edits.`,\n );\n }\n const currentRevisions = toReviewRevisionRecords(currentDocument.review.revisions);\n const actionableRevisions = currentRevisions.filter(\n (revision) => getRevisionActionability(revision) === \"actionable\",\n );\n const commentThreads = Object.values(\n createCommentStoreFromRuntimeComments(currentDocument.review.comments).threads,\n );\n const preservedCommentIds = new Set(\n state.preservedCommentDefinitions.map((definition) => definition.commentId),\n );\n const ownedCommentThreads = commentThreads.filter(\n (thread) => !preservedCommentIds.has(thread.commentId),\n );\n const serialized = serializeMainDocument(\n splitDocumentAtReviewBoundaries(\n currentDocument.content as never,\n ownedCommentThreads,\n actionableRevisions,\n ) as never,\n currentDocument.preservation as never,\n state.sourceDocumentRelationships,\n {\n documentAttributes: state.sourceDocumentAttributes,\n media: currentDocument.media as MediaCatalog,\n },\n );\n const revisionDocument = serializeRuntimeRevisionsIntoDocumentXml(\n serialized.documentXml,\n actionableRevisions,\n serialized.paragraphBoundaries,\n );\n if (revisionDocument.skippedRevisionIds.length > 0) {\n throw new Error(\n `DOCX export is blocked because ${revisionDocument.skippedRevisionIds.length} active revisions overlap unsupported serialization boundaries.`,\n );\n }\n\n const strippedDocumentXml = stripCommentMarkup(\n revisionDocument.documentXml,\n ownedCommentThreads.map((thread) => thread.commentId),\n );\n const exportCommentIds = createCommentExportIdMap(\n ownedCommentThreads,\n state.preservedCommentDefinitions,\n );\n const serializedComments = serializeMergedCommentsXml(ownedCommentThreads, {\n exportCommentIds,\n preservedDefinitions: state.preservedCommentDefinitions,\n sourceRootTag: state.sourceCommentsRootTag,\n sourceExtendedRootTag: state.sourceCommentsExtendedRootTag,\n sourceIdsRootTag: state.sourceCommentsIdsRootTag,\n sourcePeopleRootTag: state.sourcePeopleRootTag,\n peopleAuthors: state.sourcePeopleAuthors,\n });\n const annotatedDocument = serializeCommentAnchorsIntoDocumentXml(\n strippedDocumentXml,\n ownedCommentThreads,\n undefined,\n {\n exportCommentIds,\n },\n );\n const blockingSkippedCommentIds = annotatedDocument.skippedCommentIds.filter((commentId) => {\n const thread = ownedCommentThreads.find((candidate) => candidate.commentId === commentId);\n return !thread || thread.anchor.kind !== \"detached\";\n });\n if (blockingSkippedCommentIds.length > 0) {\n throw new Error(\n `DOCX export is blocked because ${blockingSkippedCommentIds.length} comments no longer map to serializable ranges.`,\n );\n }\n const commentsPartPath =\n state.sourceCommentsPartPath ?? COMMENTS_PART_PATH;\n const commentsExtendedPartPath =\n state.sourceCommentsExtendedPartPath ?? COMMENTS_EXTENDED_PART_PATH;\n const commentsIdsPartPath =\n state.sourceCommentsIdsPartPath ?? COMMENTS_IDS_PART_PATH;\n const peoplePartPath =\n state.sourcePeoplePartPath ?? PEOPLE_PART_PATH;\n const numberingPartPath =\n state.sourceNumberingPartPath ?? NUMBERING_PART_PATH;\n const serializedNumberingXml = hasNumberingEntries(currentDocument.numbering as NumberingCatalog)\n ? serializeNumberingXml(currentDocument.numbering as NumberingCatalog)\n : undefined;\n const nextRelationships = withDocumentRelatedParts(\n serialized.relationships,\n [\n {\n relationshipType: NUMBERING_RELATIONSHIP_TYPE,\n partPath: numberingPartPath,\n existingRelationshipId: state.sourceNumberingRelationshipId,\n include:\n Boolean(serializedNumberingXml) ||\n Boolean(state.sourceNumberingPartPath),\n },\n {\n relationshipType: COMMENTS_RELATIONSHIP_TYPE,\n partPath: commentsPartPath,\n existingRelationshipId: state.sourceCommentsRelationshipId,\n include:\n serializedComments.serializedCommentIds.length > 0 ||\n Boolean(state.sourceCommentsPartPath),\n },\n {\n relationshipType: COMMENTS_EXTENDED_RELATIONSHIP_TYPE,\n partPath: commentsExtendedPartPath,\n existingRelationshipId: state.sourceCommentsExtendedRelationshipId,\n include:\n Boolean(serializedComments.commentsExtendedXml) ||\n Boolean(state.sourceCommentsExtendedPartPath),\n },\n {\n relationshipType: COMMENTS_IDS_RELATIONSHIP_TYPE,\n partPath: commentsIdsPartPath,\n existingRelationshipId: state.sourceCommentsIdsRelationshipId,\n include:\n Boolean(serializedComments.commentsIdsXml) ||\n Boolean(state.sourceCommentsIdsPartPath),\n },\n {\n relationshipType: PEOPLE_RELATIONSHIP_TYPE,\n partPath: peoplePartPath,\n existingRelationshipId: state.sourcePeopleRelationshipId,\n include:\n Boolean(serializedComments.peopleXml) ||\n Boolean(state.sourcePeoplePartPath),\n },\n ],\n );\n\n const exportedSubParts = currentDocument.subParts as SubPartsCatalog | undefined;\n const subPartOwnedPaths: string[] = [];\n if (exportedSubParts) {\n for (const header of exportedSubParts.headers) {\n subPartOwnedPaths.push(header.partPath);\n }\n for (const footer of exportedSubParts.footers) {\n subPartOwnedPaths.push(footer.partPath);\n }\n if (exportedSubParts.footnoteCollection) {\n if (state.sourceSubPartPaths.footnotesPartPath) {\n subPartOwnedPaths.push(state.sourceSubPartPaths.footnotesPartPath);\n }\n if (state.sourceSubPartPaths.endnotesPartPath) {\n subPartOwnedPaths.push(state.sourceSubPartPaths.endnotesPartPath);\n }\n }\n if (exportedSubParts.theme && state.sourceSubPartPaths.themePartPath) {\n subPartOwnedPaths.push(state.sourceSubPartPaths.themePartPath);\n }\n }\n\n const exportSession = createExportSession(state.sourcePackage, [\n MAIN_DOCUMENT_PATH,\n numberingPartPath,\n commentsPartPath,\n commentsExtendedPartPath,\n commentsIdsPartPath,\n peoplePartPath,\n ...subPartOwnedPaths,\n ]);\n\n exportSession.replaceOwnedPart({\n path: MAIN_DOCUMENT_PATH,\n bytes: new TextEncoder().encode(annotatedDocument.documentXml),\n contentType: MAIN_DOCUMENT_CONTENT_TYPE,\n relationships: nextRelationships,\n });\n\n if (serializedNumberingXml || state.sourceNumberingPartPath) {\n exportSession.replaceOwnedPart({\n path: numberingPartPath,\n bytes: new TextEncoder().encode(\n serializedNumberingXml ??\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<w:numbering xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"></w:numbering>`,\n ),\n contentType:\n state.sourcePackage.parts.get(numberingPartPath)?.contentType ??\n WORD_NUMBERING_CONTENT_TYPE,\n });\n }\n\n if (serializedComments.serializedCommentIds.length > 0 || state.sourceCommentsPartPath) {\n exportSession.replaceOwnedPart({\n path: commentsPartPath,\n bytes: new TextEncoder().encode(serializedComments.commentsXml),\n contentType:\n state.sourcePackage.parts.get(commentsPartPath)?.contentType ?? COMMENTS_CONTENT_TYPE,\n });\n }\n\n if (serializedComments.commentsExtendedXml || state.sourceCommentsExtendedPartPath) {\n exportSession.replaceOwnedPart({\n path: commentsExtendedPartPath,\n bytes: new TextEncoder().encode(\n serializedComments.commentsExtendedXml ?? `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<w15:commentsEx xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\"></w15:commentsEx>`,\n ),\n contentType:\n state.sourcePackage.parts.get(commentsExtendedPartPath)?.contentType ??\n COMMENTS_EXTENDED_CONTENT_TYPE,\n });\n }\n\n if (serializedComments.commentsIdsXml || state.sourceCommentsIdsPartPath) {\n exportSession.replaceOwnedPart({\n path: commentsIdsPartPath,\n bytes: new TextEncoder().encode(\n serializedComments.commentsIdsXml ?? `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<w16cid:commentsIds xmlns:w16cid=\"http://schemas.microsoft.com/office/word/2016/wordml/cid\"></w16cid:commentsIds>`,\n ),\n contentType:\n state.sourcePackage.parts.get(commentsIdsPartPath)?.contentType ??\n COMMENTS_IDS_CONTENT_TYPE,\n });\n }\n\n if (serializedComments.peopleXml || state.sourcePeoplePartPath) {\n exportSession.replaceOwnedPart({\n path: peoplePartPath,\n bytes: new TextEncoder().encode(\n serializedComments.peopleXml ?? `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<w15:people xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\"></w15:people>`,\n ),\n contentType:\n state.sourcePackage.parts.get(peoplePartPath)?.contentType ??\n PEOPLE_CONTENT_TYPE,\n });\n }\n\n if (exportedSubParts) {\n for (const header of exportedSubParts.headers) {\n exportSession.replaceOwnedPart({\n path: header.partPath,\n bytes: new TextEncoder().encode(serializeHeaderXml(header)),\n contentType:\n state.sourcePackage.parts.get(header.partPath)?.contentType ?? WORD_HEADER_CONTENT_TYPE,\n });\n }\n for (const footer of exportedSubParts.footers) {\n exportSession.replaceOwnedPart({\n path: footer.partPath,\n bytes: new TextEncoder().encode(serializeFooterXml(footer)),\n contentType:\n state.sourcePackage.parts.get(footer.partPath)?.contentType ?? WORD_FOOTER_CONTENT_TYPE,\n });\n }\n if (exportedSubParts.footnoteCollection) {\n if (state.sourceSubPartPaths.footnotesPartPath) {\n exportSession.replaceOwnedPart({\n path: state.sourceSubPartPaths.footnotesPartPath,\n bytes: new TextEncoder().encode(serializeFootnotesXml(exportedSubParts.footnoteCollection)),\n contentType:\n state.sourcePackage.parts.get(state.sourceSubPartPaths.footnotesPartPath)?.contentType ??\n WORD_FOOTNOTES_CONTENT_TYPE,\n });\n }\n if (state.sourceSubPartPaths.endnotesPartPath) {\n exportSession.replaceOwnedPart({\n path: state.sourceSubPartPaths.endnotesPartPath,\n bytes: new TextEncoder().encode(serializeEndnotesXml(exportedSubParts.footnoteCollection)),\n contentType:\n state.sourcePackage.parts.get(state.sourceSubPartPaths.endnotesPartPath)?.contentType ??\n WORD_ENDNOTES_CONTENT_TYPE,\n });\n }\n }\n if (exportedSubParts.theme && state.sourceSubPartPaths.themePartPath) {\n const sourceThemePart = state.sourcePackage.parts.get(state.sourceSubPartPaths.themePartPath);\n if (sourceThemePart) {\n exportSession.replaceOwnedPart({\n path: state.sourceSubPartPaths.themePartPath,\n bytes: sourceThemePart.bytes,\n contentType: sourceThemePart.contentType,\n relationships: sourceThemePart.relationships,\n compression: sourceThemePart.compression,\n });\n }\n }\n }\n\n return {\n bytes: exportSession.serialize(),\n mimeType: DOCX_MIME_TYPE,\n fileName: options?.fileName ?? `${snapshot.documentId}.docx`,\n };\n}\n\nfunction createImportedCanonicalDocument(input: {\n documentId: string;\n timestamp: string;\n numbering: CanonicalDocumentEnvelope[\"numbering\"];\n media: CanonicalDocumentEnvelope[\"media\"];\n content: CanonicalDocumentEnvelope[\"content\"];\n subParts?: SubPartsCatalog;\n preservation: CanonicalDocumentEnvelope[\"preservation\"];\n diagnostics: CanonicalDocumentEnvelope[\"diagnostics\"];\n review: CanonicalDocumentEnvelope[\"review\"];\n}): CanonicalDocumentEnvelope {\n return {\n schemaVersion: \"cds/1.0.0\",\n docId: createCanonicalDocumentId(input.documentId),\n createdAt: input.timestamp,\n updatedAt: input.timestamp,\n metadata: {\n customProperties: {},\n },\n styles: {\n paragraphs: {},\n characters: {},\n tables: {},\n },\n numbering: input.numbering,\n media: input.media,\n content: input.content,\n review: input.review,\n preservation: input.preservation,\n diagnostics: input.diagnostics,\n ...(input.subParts !== undefined ? { subParts: input.subParts } : {}),\n };\n}\n\nfunction createImportedSnapshot(input: {\n documentId: string;\n editorBuild: string;\n timestamp: string;\n document: CanonicalDocumentEnvelope;\n compatibility: PersistedEditorSnapshot[\"compatibility\"];\n}): PersistedEditorSnapshot {\n return {\n snapshotVersion: \"persisted-editor-snapshot/1\",\n schemaVersion: input.document.schemaVersion,\n documentId: input.documentId,\n docId: input.document.docId,\n createdAt: input.document.createdAt,\n updatedAt: input.document.updatedAt,\n savedAt: input.timestamp,\n editorBuild: input.editorBuild,\n canonicalDocument: input.document,\n compatibility: input.compatibility,\n warningLog: input.compatibility.warnings,\n };\n}\n\nfunction toPublicAnchorProjection(\n anchor: InternalEditorAnchorProjection,\n): PublicEditorAnchorProjection {\n switch (anchor.kind) {\n case \"range\":\n return {\n kind: \"range\",\n from: anchor.range.from,\n to: anchor.range.to,\n assoc: anchor.assoc,\n };\n case \"node\":\n return {\n kind: \"node\",\n at: anchor.at,\n assoc: anchor.assoc,\n };\n case \"detached\":\n return {\n kind: \"detached\",\n lastKnownRange: anchor.lastKnownRange,\n reason: anchor.reason,\n };\n }\n}\n\nfunction toPublicCompatibilityFeatureEntry(entry: InternalCompatibilityFeatureEntry) {\n return {\n ...entry,\n affectedAnchor: entry.affectedAnchor\n ? toPublicAnchorProjection(entry.affectedAnchor)\n : undefined,\n };\n}\n\nfunction toPublicWarning(warning: InternalEditorWarning): PublicEditorWarning {\n return {\n ...warning,\n affectedAnchor: warning.affectedAnchor\n ? toPublicAnchorProjection(warning.affectedAnchor)\n : undefined,\n };\n}\n\nfunction toPublicError(error: InternalEditorError): EditorError {\n return { ...error };\n}\n\nfunction toPublicCompatibilityReport(\n report: InternalCompatibilityReport,\n): PublicCompatibilityReport {\n return {\n reportVersion: report.reportVersion,\n generatedAt: report.generatedAt,\n blockExport: report.blockExport,\n featureEntries: report.featureEntries.map((entry) =>\n toPublicCompatibilityFeatureEntry(entry),\n ),\n warnings: report.warnings.map((warning) => toPublicWarning(warning)),\n errors: report.errors.map((error) => toPublicError(error)),\n };\n}\n\nfunction createDiagnosticsSession(\n options: LoadDocxEditorSessionOptions,\n diagnostics: ImportDiagnosticsResult,\n): LoadedDocxEditorSession {\n const timestamp = new Date().toISOString();\n const runtime = createReadOnlyDiagnosticsRuntime({\n documentId: options.documentId,\n sourceLabel: options.sourceLabel,\n editorBuild: options.editorBuild,\n generatedAt: timestamp,\n diagnostics,\n });\n const initialSnapshot = runtime.getPersistedSnapshot();\n\n return {\n initialSnapshot,\n fatalError: diagnostics.fatalError,\n readOnly: true,\n exportDocx: async (_snapshot, exportOptions) => runtime.exportDocx(exportOptions),\n };\n}\n\nfunction createImportDiagnosticsFromError(error: unknown): ImportDiagnosticsResult {\n if (isPackageImportError(error)) {\n return createPackageImportDiagnostics({\n issue: classifyCorruptPackageError(error),\n });\n }\n\n return createValidationImportDiagnostics({\n message:\n error instanceof Error\n ? error.message\n : \"DOCX import failed during validation.\",\n });\n}\n\nfunction normalizeImportedRevisionRecords(\n parsed: ParsedRevisionsResult,\n content: CanonicalDocumentEnvelope[\"content\"],\n opaqueFragments: Record<string, OpaqueFragmentRecord>,\n): ParsedRevisionsResult {\n const opaqueRanges = Object.values(opaqueFragments).map((fragment) => fragment.lastKnownRange);\n const paragraphRanges = collectCanonicalParagraphRanges(content);\n if (opaqueRanges.length === 0) {\n return {\n ...parsed,\n revisions: parsed.revisions.map((revision) => {\n if (revision.anchor.kind !== \"range\" || revision.metadata.preserveOnlyReason) {\n return revision;\n }\n\n const preserveOnlyReason = getStructuralPreserveOnlyReason(\n revision,\n paragraphRanges,\n );\n if (!preserveOnlyReason) {\n return revision;\n }\n\n return {\n ...revision,\n metadata: {\n ...revision.metadata,\n preserveOnlyReason,\n },\n };\n }),\n };\n }\n\n return {\n ...parsed,\n revisions: parsed.revisions.map((revision) => {\n if (revision.anchor.kind !== \"range\" || revision.metadata.preserveOnlyReason) {\n return revision;\n }\n\n const preserveOnlyReason =\n getStructuralPreserveOnlyReason(revision, paragraphRanges) ??\n (opaqueRanges.some((range) => rangesIntersect(range, revision.anchor.range))\n ? \"Imported revision overlaps preserve-only OOXML and remains preserve-only.\"\n : undefined);\n\n if (!preserveOnlyReason) {\n return revision;\n }\n\n return {\n ...revision,\n metadata: {\n ...revision.metadata,\n preserveOnlyReason,\n },\n };\n }),\n };\n}\n\nfunction normalizeImportedCommentThreads(\n parsed: ParsedCommentsResult,\n opaqueFragments: Record<string, OpaqueFragmentRecord>,\n revisions: readonly ReviewRevisionRecord[],\n): NormalizedImportedCommentsResult {\n const opaqueRanges = Object.values(opaqueFragments).map((fragment) => fragment.lastKnownRange);\n const preserveOnlyRevisionRanges = revisions\n .filter(\n (revision) =>\n revision.anchor.kind === \"range\" &&\n typeof revision.metadata.preserveOnlyReason === \"string\" &&\n revision.metadata.preserveOnlyReason.length > 0,\n )\n .map((revision) => revision.anchor.range);\n const preserveOnlyCommentIds = new Set(parsed.diagnostics.map((diagnostic) => diagnostic.commentId));\n const additionalDiagnostics: CommentImportDiagnostic[] = [];\n const normalizedThreads = parsed.threads.map((thread) => {\n if (thread.anchor.kind !== \"range\") {\n preserveOnlyCommentIds.add(thread.commentId);\n return thread;\n }\n\n const opaqueOverlap = opaqueRanges.some((range) => rangesIntersect(range, thread.anchor.range));\n if (opaqueOverlap) {\n preserveOnlyCommentIds.add(thread.commentId);\n additionalDiagnostics.push({\n commentId: thread.commentId,\n code: \"opaque_anchor_preserve_only\",\n message:\n \"Comment anchor intersects preserve-only OOXML and remains preserve-only on export.\",\n featureClass: \"preserve-only\",\n });\n return {\n ...thread,\n anchor: createDetachedAnchor(thread.anchor.range, \"importAmbiguity\"),\n status: \"detached\",\n };\n }\n\n const preserveOnlyRevisionOverlap = preserveOnlyRevisionRanges.some((range) =>\n rangesIntersect(range, thread.anchor.range),\n );\n if (preserveOnlyRevisionOverlap) {\n preserveOnlyCommentIds.add(thread.commentId);\n additionalDiagnostics.push({\n commentId: thread.commentId,\n code: \"preserve_only_revision_overlap\",\n message:\n \"Comment anchor overlaps preserve-only review markup and remains preserve-only on export.\",\n featureClass: \"preserve-only\",\n });\n return {\n ...thread,\n anchor: createDetachedAnchor(thread.anchor.range, \"importAmbiguity\"),\n status: \"detached\",\n };\n }\n\n return thread;\n });\n\n return {\n ...parsed,\n threads: normalizedThreads,\n diagnostics: [...parsed.diagnostics, ...additionalDiagnostics],\n definitions: parsed.definitions,\n preservedDefinitions: parsed.definitions.filter((definition) =>\n preserveOnlyCommentIds.has(\n resolveDefinitionRootCommentId(definition, parsed.definitions),\n ),\n ),\n };\n}\n\nfunction resolveDefinitionRootCommentId(\n definition: ImportedCommentDefinition,\n definitions: readonly ImportedCommentDefinition[],\n): string {\n if (!definition.parentParaId) {\n return definition.commentId;\n }\n\n const definitionsByParaId = new Map(\n definitions\n .filter((candidate) => typeof candidate.paraId === \"string\")\n .map((candidate) => [candidate.paraId!, candidate]),\n );\n const visited = new Set<string>();\n let current: ImportedCommentDefinition | undefined = definition;\n\n while (current?.parentParaId) {\n if (visited.has(current.parentParaId)) {\n break;\n }\n visited.add(current.parentParaId);\n const parent = definitionsByParaId.get(current.parentParaId);\n if (!parent) {\n break;\n }\n current = parent;\n }\n\n return current?.commentId ?? definition.commentId;\n}\n\nfunction getStructuralPreserveOnlyReason(\n revision: ReviewRevisionRecord,\n paragraphRanges: ReadonlyArray<{ start: number; end: number }>,\n): string | undefined {\n const form = revision.metadata.importedRevisionForm;\n if (!form || revision.anchor.kind !== \"range\") {\n return undefined;\n }\n\n if (\n (form === \"run-insertion\" || form === \"run-deletion\") &&\n revision.anchor.range.from === revision.anchor.range.to\n ) {\n return \"Imported zero-width run revision remains preserve-only.\";\n }\n\n if (form === \"paragraph-insertion\" || form === \"paragraph-deletion\") {\n const paragraphBoundary = paragraphRanges.find(\n (boundary) =>\n boundary.end === revision.anchor.range.from ||\n (revision.anchor.range.from >= boundary.start &&\n revision.anchor.range.from <= boundary.end),\n );\n return paragraphBoundary\n ? undefined\n : \"Imported revision spans paragraph-level structure and remains preserve-only.\";\n }\n\n const paragraphBoundary = paragraphRanges.find(\n (boundary) =>\n revision.anchor.range.from >= boundary.start &&\n revision.anchor.range.to <= boundary.end,\n );\n return paragraphBoundary\n ? undefined\n : \"Imported revision spans structural boundaries and remains preserve-only.\";\n}\n\nfunction collectCanonicalParagraphRanges(\n content: CanonicalDocumentEnvelope[\"content\"],\n): Array<{ start: number; end: number }> {\n const ranges: Array<{ start: number; end: number }> = [];\n let cursor = 0;\n let previousWasParagraph = false;\n\n for (const block of content.children) {\n if (block.type === \"paragraph\") {\n if (previousWasParagraph) {\n cursor += 1;\n }\n const start = cursor;\n cursor += measureCanonicalParagraph(block);\n ranges.push({ start, end: cursor });\n previousWasParagraph = true;\n continue;\n }\n\n cursor += 1;\n previousWasParagraph = false;\n }\n\n return ranges;\n}\n\nfunction measureCanonicalParagraph(paragraph: CanonicalDocumentEnvelope[\"content\"][\"children\"][number] & { type: \"paragraph\" }): number {\n return paragraph.children.reduce((size, child) => {\n switch (child.type) {\n case \"text\":\n return size + child.text.length;\n case \"tab\":\n case \"hard_break\":\n case \"image\":\n case \"opaque_inline\":\n return size + 1;\n case \"hyperlink\":\n return (\n size +\n child.children.reduce((childSize, entry) => {\n switch (entry.type) {\n case \"text\":\n return childSize + entry.text.length;\n case \"tab\":\n case \"hard_break\":\n return childSize + 1;\n }\n }, 0)\n );\n }\n }, 0);\n}\n\nfunction rangesIntersect(\n left: { from: number; to: number },\n right: { from: number; to: number },\n): boolean {\n return left.from < right.to && right.from < left.to;\n}\n\nfunction resolveCommentsPartPath(\n sourcePackage: OpcPackage,\n relationships: readonly OpcRelationship[],\n): string | undefined {\n return resolveDocumentRelatedPartPath(\n sourcePackage,\n relationships,\n COMMENTS_RELATIONSHIP_TYPE,\n COMMENTS_PART_PATH,\n );\n}\n\nfunction resolveDocumentRelatedPartPath(\n sourcePackage: OpcPackage,\n relationships: readonly OpcRelationship[],\n relationshipType: string,\n fallbackPartPath: string,\n): string | undefined {\n const relationship = relationships.find(\n (candidate) =>\n candidate.type === relationshipType &&\n candidate.targetMode === \"internal\",\n );\n if (!relationship) {\n return sourcePackage.parts.has(fallbackPartPath) ? fallbackPartPath : undefined;\n }\n\n const targetPath = resolveRelationshipTarget(MAIN_DOCUMENT_PATH, relationship);\n return sourcePackage.parts.has(targetPath) ? targetPath : undefined;\n}\n\nfunction toRuntimeCommentRecords(\n threads: readonly CommentThread[],\n): Record<string, CommentThreadRecord> {\n return Object.fromEntries(\n threads.map((thread) => {\n return [\n thread.commentId,\n {\n commentId: thread.commentId,\n body: thread.entries.map((entry) => entry.body).join(\"\\n\"),\n anchor: thread.anchor,\n createdBy: thread.createdBy,\n authorId: thread.createdBy,\n createdAt: thread.createdAt,\n entries: thread.entries.map((entry) => ({\n entryId: entry.entryId,\n authorId: entry.authorId,\n body: entry.body,\n createdAt: entry.createdAt,\n metadata: entry.metadata\n ? {\n ooxmlCommentId: entry.metadata.ooxmlCommentId,\n paraId: entry.metadata.paraId,\n parentParaId: entry.metadata.parentParaId,\n durableId: entry.metadata.durableId,\n initials: entry.metadata.initials,\n }\n : undefined,\n })),\n status: thread.status,\n resolution: thread.resolution\n ? {\n resolvedAt: thread.resolution.resolvedAt,\n resolvedBy: thread.resolution.resolvedBy,\n }\n : undefined,\n resolvedAt: thread.resolution?.resolvedAt,\n warningIds: [...thread.warningIds],\n isResolved: thread.status === \"resolved\",\n metadata: thread.metadata\n ? {\n source: thread.metadata.source,\n rootOoxmlCommentId: thread.metadata.rootOoxmlCommentId,\n rootParaId: thread.metadata.rootParaId,\n }\n : undefined,\n } satisfies CommentThreadRecord,\n ];\n }),\n );\n}\n\nfunction toRuntimeRevisionRecords(\n revisions: readonly ReviewRevisionRecord[],\n): Record<string, RuntimeRevisionRecord> {\n return Object.fromEntries(\n revisions.map((revision) => [\n revision.revisionId,\n {\n changeId: revision.revisionId,\n kind: revision.kind,\n anchor: revision.anchor,\n authorId: revision.authorId,\n createdAt: revision.createdAt,\n warningIds: [...revision.warningIds],\n metadata: {\n source: revision.metadata.source,\n preserveOnlyReason: revision.metadata.preserveOnlyReason,\n importedRevisionForm: revision.metadata.importedRevisionForm,\n originalRevisionType: revision.metadata.originalRevisionType,\n ooxmlRevisionId: revision.metadata.ooxmlRevisionId,\n },\n status: revision.status === \"active\" ? \"open\" : revision.status,\n } satisfies RuntimeRevisionRecord,\n ]),\n );\n}\n\nfunction toReviewRevisionRecords(\n revisions: CanonicalDocumentEnvelope[\"review\"][\"revisions\"],\n): ReviewRevisionRecord[] {\n return Object.values(revisions).map((revision) => ({\n revisionId: revision.changeId,\n kind: revision.kind,\n anchor: revision.anchor,\n authorId: revision.authorId ?? \"unknown\",\n createdAt: revision.createdAt,\n warningIds: [...(revision.warningIds ?? [])],\n metadata: {\n source: revision.metadata?.source ?? \"runtime\",\n preserveOnlyReason: revision.metadata?.preserveOnlyReason,\n importedRevisionForm: revision.metadata?.importedRevisionForm,\n originalRevisionType: revision.metadata?.originalRevisionType,\n ooxmlRevisionId: revision.metadata?.ooxmlRevisionId,\n },\n status: revision.status === \"open\" ? \"active\" : revision.status,\n }));\n}\n\nexport function stripCommentMarkup(\n documentXml: string,\n ownedCommentIds: readonly string[],\n): string {\n if (ownedCommentIds.length === 0) {\n return documentXml;\n }\n\n let output = documentXml;\n for (const commentId of ownedCommentIds) {\n const escapedCommentId = escapeRegExp(commentId);\n const attributePattern = `(?:w:id|id)=[\"']${escapedCommentId}[\"']`;\n output = output\n .replace(\n new RegExp(`<w:commentRangeStart\\\\b[^>]*${attributePattern}[^>]*/>`, \"gu\"),\n \"\",\n )\n .replace(\n new RegExp(`<w:commentRangeEnd\\\\b[^>]*${attributePattern}[^>]*/>`, \"gu\"),\n \"\",\n )\n .replace(\n new RegExp(\n `<w:r\\\\b[^>]*>(?:(?!<w:t\\\\b|</w:r>)[\\\\s\\\\S])*?<w:commentReference\\\\b[^>]*${attributePattern}[^>]*/>(?:(?!<w:t\\\\b|</w:r>)[\\\\s\\\\S])*?</w:r>`,\n \"gu\",\n ),\n \"\",\n );\n }\n\n return output;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction withDocumentRelatedParts(\n relationships: readonly OpcRelationship[],\n relatedParts: ReadonlyArray<{\n relationshipType: string;\n partPath: string;\n existingRelationshipId?: string;\n include: boolean;\n }>,\n): OpcRelationship[] {\n const filteredTypes = new Set(relatedParts.map((part) => part.relationshipType));\n const nextRelationships = relationships\n .filter((relationship) => !filteredTypes.has(relationship.type))\n .map(cloneRelationship);\n\n for (const part of relatedParts) {\n if (!part.include) {\n continue;\n }\n\n nextRelationships.push({\n id: part.existingRelationshipId ?? createCommentsRelationshipId(nextRelationships),\n type: part.relationshipType,\n target: toDocumentRelativeTarget(part.partPath),\n targetMode: \"internal\",\n });\n }\n\n return nextRelationships;\n}\n\nfunction collectPreservedPackageParts(\n sourcePackage: OpcPackage,\n ownedPartPaths: ReadonlyArray<string | undefined>,\n): Record<string, PreservedPackagePart> {\n const normalizedOwnedPaths = new Set(\n ownedPartPaths\n .filter((value): value is string => typeof value === \"string\")\n .map((path) => normalizePartPath(path)),\n );\n return Object.fromEntries(\n [...sourcePackage.parts.values()]\n .filter((part) =>\n shouldPreservePackagePart(part.path, part.surfaceKind, normalizedOwnedPaths),\n )\n .map((part) => [\n part.path,\n {\n packagePartName: part.path,\n contentType: part.contentType ?? \"application/octet-stream\",\n relationshipIds: findRelationshipIdsTargetingPart(sourcePackage, part.path),\n } satisfies PreservedPackagePart,\n ]),\n );\n}\n\nfunction collectInlineMediaParts(\n sourcePackage: OpcPackage,\n): ReadonlyMap<string, { path: string; contentType: string }> {\n return new Map(\n [...sourcePackage.parts.values()]\n .filter(\n (part) =>\n part.path.startsWith(\"/word/media/\") && typeof part.contentType === \"string\",\n )\n .map((part) => [\n part.path,\n {\n path: part.path,\n contentType: part.contentType ?? \"application/octet-stream\",\n },\n ]),\n );\n}\n\nfunction createEmptyNumberingCatalog(): NumberingCatalog {\n return {\n abstractDefinitions: {},\n instances: {},\n };\n}\n\nfunction hasNumberingEntries(catalog: NumberingCatalog): boolean {\n return (\n Object.keys(catalog.abstractDefinitions ?? {}).length > 0 ||\n Object.keys(catalog.instances ?? {}).length > 0\n );\n}\n\nfunction collectBrokenInternalRelationshipIssues(\n sourcePackage: OpcPackage,\n): ReturnType<typeof createBrokenRelationshipIssue>[] {\n const brokenTargets = new Map<string, ReturnType<typeof createBrokenRelationshipIssue>>();\n\n for (const relationship of sourcePackage.manifest.packageRelationships) {\n if (relationship.targetMode !== \"internal\") {\n continue;\n }\n\n const target = resolveRelationshipTarget(null, relationship);\n if (!sourcePackage.parts.has(target)) {\n brokenTargets.set(\n `package:${relationship.id}:${target}`,\n createBrokenRelationshipIssue({\n relationshipSourcePath: null,\n relationshipId: relationship.id,\n targetPartPath: target,\n }),\n );\n }\n }\n\n for (const part of sourcePackage.parts.values()) {\n for (const relationship of part.relationships) {\n if (relationship.targetMode !== \"internal\") {\n continue;\n }\n\n const target = resolveRelationshipTarget(part.path, relationship);\n if (!sourcePackage.parts.has(target)) {\n brokenTargets.set(\n `${part.path}:${relationship.id}:${target}`,\n createBrokenRelationshipIssue({\n relationshipSourcePath: part.path,\n relationshipId: relationship.id,\n targetPartPath: target,\n }),\n );\n }\n }\n }\n\n return [...brokenTargets.values()].sort((left, right) =>\n `${left.relationshipSourcePath ?? \"\"}:${left.relationshipId}:${left.targetPartPath}`.localeCompare(\n `${right.relationshipSourcePath ?? \"\"}:${right.relationshipId}:${right.targetPartPath}`,\n ),\n );\n}\n\nfunction summarizeBrokenRelationshipIssues(\n issues: readonly ReturnType<typeof createBrokenRelationshipIssue>[],\n): string {\n return `DOCX package has unresolved internal relationships: ${issues\n .map((issue) => issue.targetPartPath ?? issue.message)\n .slice(0, 3)\n .join(\", \")}${issues.length > 3 ? \", ...\" : \"\"}.`;\n}\n\nfunction shouldPreservePackagePart(\n partPath: string,\n surfaceKind: OpcPackage[\"parts\"] extends Map<string, infer T>\n ? T extends { surfaceKind: infer U }\n ? U\n : never\n : never,\n ownedPartPaths: ReadonlySet<string>,\n): boolean {\n if (surfaceKind !== \"content\") {\n return false;\n }\n\n if (\n partPath === MAIN_DOCUMENT_PATH ||\n ownedPartPaths.has(partPath) ||\n partPath.startsWith(\"/word/media/\") ||\n CORE_NON_PRESERVED_PART_PATHS.has(partPath)\n ) {\n return false;\n }\n\n return true;\n}\n\nfunction findRelationshipIdsTargetingPart(\n sourcePackage: OpcPackage,\n targetPartPath: string,\n): string[] {\n const ids = new Set<string>();\n\n for (const relationship of sourcePackage.manifest.packageRelationships) {\n if (\n relationship.targetMode === \"internal\" &&\n resolveRelationshipTarget(null, relationship) === targetPartPath\n ) {\n ids.add(relationship.id);\n }\n }\n\n for (const part of sourcePackage.parts.values()) {\n for (const relationship of part.relationships) {\n if (\n relationship.targetMode === \"internal\" &&\n resolveRelationshipTarget(part.path, relationship) === targetPartPath\n ) {\n ids.add(relationship.id);\n }\n }\n }\n\n return [...ids].sort();\n}\n\nfunction extractDocumentRootAttributes(documentXml: string): Record<string, string> {\n const match = documentXml.match(\n /<(?:[A-Za-z_][A-Za-z0-9:._-]*:)?document\\b([^>]*)>/u,\n );\n if (!match) {\n return {};\n }\n\n const attributes: Record<string, string> = {};\n const pattern = /([A-Za-z_][A-Za-z0-9:._-]*)\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/gu;\n for (const attributeMatch of (match[1] ?? \"\").matchAll(pattern)) {\n const name = attributeMatch[1];\n const value = attributeMatch[3] ?? attributeMatch[4] ?? \"\";\n if (!name) {\n continue;\n }\n attributes[name] = value;\n }\n\n return attributes;\n}\n\nfunction isPackageImportError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n const normalized = error.message.toLowerCase();\n return (\n normalized.includes(\"zip\") ||\n normalized.includes(\"opc package\") ||\n normalized.includes(\"compression\") ||\n normalized.includes(\"relationship\") ||\n normalized.includes(\"/[content_types].xml\") ||\n normalized.includes(\"/word/document.xml\") ||\n normalized.includes(\"xml\")\n );\n}\n\nconst CORE_NON_PRESERVED_PART_PATHS = new Set([\n \"/docProps/app.xml\",\n \"/docProps/core.xml\",\n \"/docProps/custom.xml\",\n \"/word/fontTable.xml\",\n \"/word/numbering.xml\",\n \"/word/settings.xml\",\n \"/word/styles.xml\",\n \"/word/stylesWithEffects.xml\",\n \"/word/webSettings.xml\",\n]);\n\nfunction createCommentsRelationshipId(\n relationships: readonly OpcRelationship[],\n): string {\n let nextIndex = 1;\n while (relationships.some((relationship) => relationship.id === `rIdComments${nextIndex}`)) {\n nextIndex += 1;\n }\n\n return `rIdComments${nextIndex}`;\n}\n\nfunction toDocumentRelativeTarget(partPath: string): string {\n const normalized = normalizePartPath(partPath);\n return normalized.startsWith(\"/word/\") ? normalized.slice(\"/word/\".length) : normalized.slice(1);\n}\n\nfunction cloneRelationship(relationship: OpcRelationship): OpcRelationship {\n return { ...relationship };\n}\n\nfunction decodeUtf8(bytes: Uint8Array | undefined): string {\n if (!bytes) {\n return \"\";\n }\n\n return Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength).toString(\"utf8\");\n}\n\nfunction toUint8Array(bytes: Uint8Array | ArrayBuffer): Uint8Array {\n return bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);\n}\n\nfunction serializeCanonicalDocumentForExport(document: CanonicalDocumentEnvelope): string {\n return createCanonicalDocumentSignature(document);\n}\n\nfunction canReuseSourceBytesForCurrentDocument(\n state: ImportedDocxState,\n document: CanonicalDocumentEnvelope,\n): boolean {\n const commentThreads = Object.values(document.review.comments);\n const hasLiveComments = commentThreads.some((thread) => thread.anchor.kind !== \"detached\");\n if (!hasLiveComments) {\n return true;\n }\n\n return Boolean(\n state.sourceCommentsPartPath &&\n state.sourceCommentsExtendedPartPath &&\n state.sourceCommentsIdsPartPath &&\n state.sourcePeoplePartPath,\n );\n}\n","import type { PersistedEditorSnapshot } from \"../../api/public-types\";\nimport {\n DOCX_DOCUMENT_CONTENT_TYPE,\n DOCX_DOCUMENT_RELATIONSHIP_TYPE,\n writeDocxPackage,\n} from \"../opc/docx-package.ts\";\n\nexport function exportSnapshotToMinimalDocx(\n snapshot: PersistedEditorSnapshot,\n): Uint8Array {\n const paragraphs = collectParagraphTexts(snapshot.canonicalDocument.content);\n const documentXml = buildDocumentXml(paragraphs);\n\n return writeDocxPackage({\n documentXml,\n documentContentType: DOCX_DOCUMENT_CONTENT_TYPE,\n packageRelationshipType: DOCX_DOCUMENT_RELATIONSHIP_TYPE,\n });\n}\n\nfunction collectParagraphTexts(content: unknown): string[] {\n const paragraphs = collectParagraphs(content).map((paragraph) =>\n paragraph.length > 0 ? paragraph : \"\",\n );\n return paragraphs.length > 0 ? paragraphs : [\"\"];\n}\n\nfunction collectParagraphs(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value.flatMap((entry) => collectParagraphs(entry));\n }\n\n if (typeof value === \"string\") {\n return [value];\n }\n\n if (!isRecord(value)) {\n return [];\n }\n\n if (value.type === \"doc\" && Array.isArray(value.children)) {\n return value.children.flatMap((entry) => collectParagraphs(entry));\n }\n\n if (value.type === \"paragraph\") {\n return [collectInlineText(value.children)];\n }\n\n return [];\n}\n\nfunction collectInlineText(value: unknown): string {\n if (Array.isArray(value)) {\n return value.map((entry) => collectInlineText(entry)).join(\"\");\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n if (!isRecord(value)) {\n return \"\";\n }\n\n switch (value.type) {\n case \"text\":\n return typeof value.text === \"string\" ? value.text : \"\";\n case \"tab\":\n return \"\\t\";\n case \"hard_break\":\n return \"\\n\";\n case \"hyperlink\":\n return collectInlineText(value.children);\n case \"image\":\n return typeof value.altText === \"string\" ? value.altText : \"[Image]\";\n case \"opaque_inline\":\n return \"[Preserved content]\";\n default:\n return Array.isArray(value.children) ? collectInlineText(value.children) : \"\";\n }\n}\n\nfunction buildDocumentXml(paragraphs: string[]): string {\n const body = paragraphs\n .map(\n (paragraph) =>\n ` <w:p><w:r><w:t xml:space=\"preserve\">${escapeXml(\n paragraph,\n )}</w:t></w:r></w:p>`,\n )\n .join(\"\\n\");\n\n return [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n `<w:document xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">`,\n ` <w:body>`,\n body,\n ` <w:sectPr/>`,\n ` </w:body>`,\n `</w:document>`,\n ].join(\"\\n\");\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&apos;\");\n}\n\nfunction isRecord(value: unknown): value is Record<string, any> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n","import React, { type FocusEventHandler, useEffect, useMemo, useRef } from \"react\";\nimport { EditorView } from \"prosemirror-view\";\n\nimport type {\n EditorUser,\n RuntimeRenderSnapshot,\n SelectionSnapshot,\n} from \"../../api/public-types\";\nimport {\n createCommentDecorationModel,\n type MarkupDisplay,\n} from \"../../ui/headless/comment-decoration-model\";\nimport { createRevisionDecorationModel } from \"../../ui/headless/revision-decoration-model\";\nimport { createPMStateFromSnapshot } from \"./pm-state-from-snapshot\";\nimport {\n createCommandBridgePlugins,\n type CommandBridgeCallbacks,\n} from \"./pm-command-bridge\";\nimport { buildDecorations } from \"./pm-decorations\";\nimport type { PositionMap } from \"./pm-position-map\";\nimport { tableNodeViews } from \"./tw-table-node-view\";\n\n/**\n * Same props interface as the legacy TwEditorSurface — drop-in replacement.\n */\nexport interface TwProseMirrorSurfaceProps {\n currentUser: EditorUser;\n snapshot: RuntimeRenderSnapshot;\n reviewMode: \"editing\" | \"review\";\n markupDisplay: MarkupDisplay;\n activeRevisionId?: string;\n showTrackedChanges?: boolean;\n onFocus: FocusEventHandler<HTMLDivElement>;\n onBlur: FocusEventHandler<HTMLDivElement>;\n onSelectionChange?: (selection: SelectionSnapshot) => void;\n onInsertText?: (text: string) => void;\n onDeleteBackward?: () => void;\n onDeleteForward?: () => void;\n onInsertTab?: () => void;\n onInsertHardBreak?: () => void;\n onSplitParagraph?: () => void;\n onCommentActivated?: (commentId: string) => void;\n onRevisionActivated?: (revisionId: string) => void;\n}\n\nexport function TwProseMirrorSurface(props: TwProseMirrorSurfaceProps) {\n const {\n currentUser,\n snapshot,\n markupDisplay,\n onFocus,\n onBlur,\n } = props;\n const surface = snapshot.surface;\n\n const canEdit = Boolean(\n surface && snapshot.isReady && !snapshot.readOnly && !snapshot.fatalError,\n );\n\n const mountRef = useRef<HTMLDivElement>(null);\n const viewRef = useRef<EditorView | null>(null);\n const positionMapRef = useRef<PositionMap | null>(null);\n const callbacksRef = useRef<CommandBridgeCallbacks | null>(null);\n\n // Keep callbacks ref up to date (avoids stale closures in PM plugins)\n callbacksRef.current = {\n onInsertText: (text) => props.onInsertText?.(text),\n onDeleteBackward: () => props.onDeleteBackward?.(),\n onDeleteForward: () => props.onDeleteForward?.(),\n onSplitParagraph: () => props.onSplitParagraph?.(),\n onInsertHardBreak: () => props.onInsertHardBreak?.(),\n onInsertTab: () => props.onInsertTab?.(),\n onUndo: () => {}, // Handled by toolbar, not PM\n onRedo: () => {}, // Handled by toolbar, not PM\n onSelectionChange: (sel) => props.onSelectionChange?.(sel),\n getPositionMap: () => positionMapRef.current,\n };\n\n // Comment/revision decoration models\n const commentModel = useMemo(\n () => createCommentDecorationModel(snapshot.comments),\n [snapshot.comments],\n );\n const showTrackedChanges = props.showTrackedChanges !== false;\n // Always create the revision model — needed for deletion hiding in clean mode\n // even when the tracked changes display toggle is off.\n const revisionModel = useMemo(\n () => createRevisionDecorationModel(snapshot.trackedChanges, props.activeRevisionId),\n [snapshot.trackedChanges, props.activeRevisionId],\n );\n\n // Create PM plugins (stable across renders — callbacks accessed via ref)\n const plugins = useMemo(() => {\n return createCommandBridgePlugins({\n onInsertText: (text) => callbacksRef.current?.onInsertText(text),\n onDeleteBackward: () => callbacksRef.current?.onDeleteBackward(),\n onDeleteForward: () => callbacksRef.current?.onDeleteForward(),\n onSplitParagraph: () => callbacksRef.current?.onSplitParagraph(),\n onInsertHardBreak: () => callbacksRef.current?.onInsertHardBreak(),\n onInsertTab: () => callbacksRef.current?.onInsertTab(),\n onUndo: () => callbacksRef.current?.onUndo(),\n onRedo: () => callbacksRef.current?.onRedo(),\n onSelectionChange: (sel) => callbacksRef.current?.onSelectionChange(sel),\n getPositionMap: () => callbacksRef.current?.getPositionMap() ?? null,\n });\n }, []);\n\n // Create or update PM view whenever surface becomes available or changes.\n // The view is created lazily — if surface is null on first render (loading),\n // it will be created when the runtime provides a real snapshot.\n useEffect(() => {\n if (!mountRef.current || !surface) return;\n\n const { state, positionMap } = createPMStateFromSnapshot(\n surface,\n snapshot.selection,\n plugins,\n );\n positionMapRef.current = positionMap;\n\n const decorations = buildDecorations(\n state.doc,\n positionMap,\n commentModel,\n revisionModel,\n markupDisplay,\n showTrackedChanges,\n );\n\n if (!viewRef.current) {\n // First time surface is available — create the EditorView\n const view = new EditorView(mountRef.current, {\n state,\n nodeViews: tableNodeViews,\n editable: () => canEdit,\n decorations: () => decorations,\n dispatchTransaction(tr) {\n const newState = view.state.apply(tr);\n view.updateState(newState);\n },\n });\n viewRef.current = view;\n } else {\n // View exists — update state and decorations\n viewRef.current.setProps({\n editable: () => canEdit,\n decorations: () => decorations,\n });\n viewRef.current.updateState(state);\n }\n }, [snapshot.revisionToken, surface, commentModel, revisionModel, markupDisplay, canEdit]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n viewRef.current?.destroy();\n viewRef.current = null;\n };\n }, []);\n\n const fontClass =\n markupDisplay === \"clean\"\n ? \"font-[family-name:var(--font-legal-sans)]\"\n : \"font-[family-name:var(--font-legal-serif)]\";\n\n return (\n <section aria-label=\"Document canvas\" className=\"min-w-0\">\n {/* ProseMirror mount point — document content including headings is editable */}\n {surface ? (\n <div\n ref={mountRef}\n role=\"textbox\"\n aria-multiline=\"true\"\n className={`px-12 py-10 ${fontClass} text-[15px] text-primary leading-relaxed prosemirror-surface outline-none`}\n onFocus={onFocus as unknown as React.FocusEventHandler<HTMLDivElement>}\n onBlur={onBlur as unknown as React.FocusEventHandler<HTMLDivElement>}\n onClick={(e) => {\n // Activate comment or revision when clicking on decorated text\n const target = e.target as HTMLElement;\n const commentEl = target.closest?.(\"[data-comment-id]\");\n if (commentEl) {\n const commentId = commentEl.getAttribute(\"data-comment-id\");\n if (commentId) {\n props.onCommentActivated?.(commentId);\n return;\n }\n }\n const revisionEl = target.closest?.(\"[data-revision-id]\");\n if (revisionEl) {\n const revisionId = revisionEl.getAttribute(\"data-revision-id\");\n if (revisionId) {\n props.onRevisionActivated?.(revisionId);\n }\n }\n }}\n aria-label=\"Document surface\"\n />\n ) : (\n <div className=\"px-12 pb-10\">\n <p className=\"text-sm text-secondary leading-relaxed\">\n Loading the review surface...\n </p>\n </div>\n )}\n\n {snapshot.fatalError ? (\n <div className=\"px-12 pb-10\">\n <p className=\"text-sm text-danger\">\n Fatal runtime error: {snapshot.fatalError.message}\n </p>\n </div>\n ) : null}\n </section>\n );\n}\n","import { Fragment, type Node as PMNode } from \"prosemirror-model\";\nimport { EditorState, type Plugin, TextSelection } from \"prosemirror-state\";\n\nimport type {\n EditorSurfaceSnapshot,\n SelectionSnapshot,\n SurfaceBlockSnapshot,\n SurfaceInlineSegment,\n SurfaceTableRowSnapshot,\n SurfaceTableCellSnapshot,\n} from \"../../api/public-types\";\nimport { editorSchema } from \"./pm-schema\";\nimport { buildPositionMap, type PositionMap } from \"./pm-position-map\";\n\nexport interface PMStateResult {\n state: EditorState;\n positionMap: PositionMap;\n}\n\n/**\n * Create a ProseMirror EditorState from a runtime surface snapshot.\n *\n * The PM document mirrors the snapshot for rendering and input.\n * It is NOT the canonical source — the runtime owns that.\n */\nexport function createPMStateFromSnapshot(\n surface: EditorSurfaceSnapshot,\n selection: SelectionSnapshot,\n plugins: Plugin[],\n): PMStateResult {\n const doc = buildPMDoc(surface);\n const positionMap = buildPositionMap(surface);\n\n // Convert runtime selection to PM selection\n const pmAnchor = clamp(\n positionMap.runtimeToPm(selection.anchor),\n 1,\n positionMap.pmDocSize - 1,\n );\n const pmHead = clamp(\n positionMap.runtimeToPm(selection.head),\n 1,\n positionMap.pmDocSize - 1,\n );\n\n let pmSelection: TextSelection;\n try {\n pmSelection = TextSelection.create(doc, pmAnchor, pmHead);\n } catch {\n // If the position is invalid (e.g., inside an atom), fall back to start\n pmSelection = TextSelection.create(doc, 1);\n }\n\n const state = EditorState.create({\n doc,\n selection: pmSelection,\n plugins,\n });\n\n return { state, positionMap };\n}\n\nfunction buildPMDoc(surface: EditorSurfaceSnapshot): PMNode {\n const blocks: PMNode[] = [];\n\n for (const block of surface.blocks) {\n if (block.kind === \"paragraph\") {\n blocks.push(buildParagraph(block));\n } else if (block.kind === \"table\") {\n blocks.push(buildTable(block));\n } else if (block.kind === \"sdt_block\") {\n blocks.push(buildSdtBlock(block));\n } else {\n blocks.push(buildOpaqueBlock(block));\n }\n }\n\n // Ensure at least one block (PM requires non-empty doc)\n if (blocks.length === 0) {\n blocks.push(editorSchema.nodes.paragraph.create());\n }\n\n return editorSchema.nodes.doc.create(null, Fragment.from(blocks));\n}\n\nfunction buildParagraph(\n block: Extract<SurfaceBlockSnapshot, { kind: \"paragraph\" }>,\n): PMNode {\n const content: PMNode[] = [];\n\n for (const segment of block.segments) {\n const nodes = buildInlineContent(segment);\n content.push(...nodes);\n }\n\n return editorSchema.nodes.paragraph.create(\n {\n styleId: block.styleId ?? null,\n numberingInstanceId: block.numbering?.numberingInstanceId ?? null,\n numberingLevel: block.numbering?.level ?? null,\n },\n content.length > 0 ? Fragment.from(content) : undefined,\n );\n}\n\nfunction buildInlineContent(segment: SurfaceInlineSegment): PMNode[] {\n switch (segment.kind) {\n case \"text\": {\n if (!segment.text) return [];\n\n // Build PM marks from segment marks\n let marks = editorSchema.marks.bold.isInSet([])\n ? [] // shouldn't happen, just type safety\n : [];\n\n const pmMarks = [];\n if (segment.marks) {\n for (const mark of segment.marks) {\n const pmMark = editorSchema.marks[mark];\n if (pmMark) {\n pmMarks.push(pmMark.create());\n }\n }\n }\n if (segment.hyperlinkHref) {\n pmMarks.push(editorSchema.marks.link.create({ href: segment.hyperlinkHref }));\n }\n\n return [editorSchema.text(segment.text, pmMarks.length > 0 ? pmMarks : undefined)];\n }\n\n case \"hard_break\":\n return [editorSchema.nodes.hard_break.create()];\n\n case \"tab\":\n return [editorSchema.nodes.tab_char.create()];\n\n case \"image\":\n return [\n editorSchema.nodes.image_atom.create({\n mediaId: segment.mediaId,\n altText: segment.altText ?? null,\n state: segment.state,\n display: segment.display ?? \"inline\",\n detail: segment.detail ?? null,\n }),\n ];\n\n case \"opaque_inline\":\n return [buildOpaqueInlineOrComplexAtom(segment)];\n\n default:\n return [];\n }\n}\n\nfunction buildTable(\n block: Extract<SurfaceBlockSnapshot, { kind: \"table\" }>,\n): PMNode {\n const rows: PMNode[] = [];\n for (const row of block.rows) {\n const cells: PMNode[] = [];\n for (const cell of row.cells) {\n const cellContent: PMNode[] = [];\n for (const child of cell.content) {\n if (child.kind === \"paragraph\") {\n cellContent.push(buildParagraph(child as Extract<SurfaceBlockSnapshot, { kind: \"paragraph\" }>));\n } else if (child.kind === \"table\") {\n cellContent.push(buildNestedTablePlaceholder(child as Extract<SurfaceBlockSnapshot, { kind: \"table\" }>));\n } else if (child.kind === \"sdt_block\") {\n cellContent.push(buildOpaqueBlock({\n blockId: child.blockId,\n kind: \"opaque_block\",\n from: child.from,\n to: child.to,\n fragmentId: child.blockId,\n warningId: child.blockId,\n label: child.alias ?? child.tag ?? \"Content control\",\n detail: \"Structured content control remains read-only inside table cells.\",\n state: \"locked-preserve-only\",\n }));\n } else if (child.kind === \"opaque_block\") {\n cellContent.push(buildOpaqueBlock(child as Extract<SurfaceBlockSnapshot, { kind: \"opaque_block\" }>));\n }\n }\n // Ensure at least one paragraph in cell (PM requires non-empty)\n if (cellContent.length === 0) {\n cellContent.push(editorSchema.nodes.paragraph.create());\n }\n cells.push(\n editorSchema.nodes.table_cell.create(\n {\n colspan: cell.colspan,\n rowspan: cell.rowspan,\n gridSpan: cell.gridSpan,\n verticalMerge: cell.verticalMerge,\n },\n Fragment.from(cellContent),\n ),\n );\n }\n rows.push(editorSchema.nodes.table_row.create(null, Fragment.from(cells)));\n }\n return editorSchema.nodes.table.create(\n {\n styleId: block.styleId ?? null,\n gridColumns: block.gridColumns,\n },\n Fragment.from(rows),\n );\n}\n\nfunction buildNestedTablePlaceholder(\n block: Extract<SurfaceBlockSnapshot, { kind: \"table\" }>,\n): PMNode {\n return buildOpaqueBlock({\n blockId: block.blockId,\n kind: \"opaque_block\",\n from: block.from,\n to: block.to,\n fragmentId: block.blockId,\n warningId: block.blockId,\n label: \"Nested table\",\n detail: \"Nested table remains read-only in the live ProseMirror cell surface.\",\n state: \"locked-preserve-only\",\n });\n}\n\nfunction buildSdtBlock(\n block: Extract<SurfaceBlockSnapshot, { kind: \"sdt_block\" }>,\n): PMNode {\n const children = block.children.map((child) => {\n if (child.kind === \"paragraph\") {\n return buildParagraph(child);\n }\n if (child.kind === \"table\") {\n return buildTable(child);\n }\n if (child.kind === \"sdt_block\") {\n return buildSdtBlock(child);\n }\n return buildOpaqueBlock(child);\n });\n\n if (children.length === 0) {\n children.push(editorSchema.nodes.paragraph.create());\n }\n\n return editorSchema.nodes.sdt_block.create(\n {\n sdtType: block.sdtType ?? null,\n alias: block.alias ?? null,\n tag: block.tag ?? null,\n lock: block.lock ?? null,\n },\n Fragment.from(children),\n );\n}\n\n/**\n * Map an opaque_inline surface segment to a dedicated complex-rendering PM atom\n * node when the label identifies a known complex content type, or fall back to\n * the generic opaque_inline node.\n */\nfunction buildOpaqueInlineOrComplexAtom(\n segment: Extract<import(\"../../api/public-types\").SurfaceInlineSegment, { kind: \"opaque_inline\" }>,\n): PMNode {\n const label = segment.label;\n const detail = segment.detail;\n\n if (label === \"Chart\") {\n return editorSchema.nodes.chart_atom.create({ detail });\n }\n if (label === \"SmartArt\") {\n return editorSchema.nodes.smartart_atom.create({ detail });\n }\n if (label === \"Shape\") {\n // Extract text hint from detail if present\n const textMatch = /Text: \"([^\"]+)\"/.exec(detail);\n const geometryMatch = /Geometry: ([^.]+)\\./.exec(detail);\n return editorSchema.nodes.shape_atom.create({\n text: textMatch ? textMatch[1] : null,\n geometry: geometryMatch ? geometryMatch[1] : null,\n detail,\n });\n }\n if (label === \"WordArt\") {\n const textMatch = /Text: \"([^\"]+)\"/.exec(detail);\n const effectMatch = /Effect: ([^.]+)\\./.exec(detail);\n return editorSchema.nodes.wordart_atom.create({\n text: textMatch ? textMatch[1] : \"\",\n geometry: effectMatch ? effectMatch[1] : null,\n detail,\n });\n }\n if (label === \"VML shape\") {\n const textMatch = /Text: \"([^\"]+)\"/.exec(detail);\n const typeMatch = /Type: ([^.]+)\\./.exec(detail);\n return editorSchema.nodes.vml_atom.create({\n text: textMatch ? textMatch[1] : null,\n shapeType: typeMatch ? typeMatch[1] : null,\n detail,\n });\n }\n\n return editorSchema.nodes.opaque_inline.create({\n fragmentId: segment.fragmentId,\n warningId: segment.warningId,\n label,\n detail,\n });\n}\n\nfunction buildOpaqueBlock(\n block: Extract<SurfaceBlockSnapshot, { kind: \"opaque_block\" }>,\n): PMNode {\n return editorSchema.nodes.opaque_block.create({\n fragmentId: block.fragmentId,\n warningId: block.warningId,\n label: block.label,\n detail: block.detail,\n });\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n","import { Schema } from \"prosemirror-model\";\nimport {\n tableNodeSpec,\n tableRowNodeSpec,\n tableCellNodeSpec,\n tableHeaderCellNodeSpec,\n} from \"../../runtime/table-schema.ts\";\n\n/**\n * ProseMirror schema for the supported live surface slice.\n *\n * Maps canonical document node types to PM nodes and marks.\n * This schema is used for rendering and input capture only —\n * ProseMirror does not own the canonical document state.\n */\nexport const editorSchema = new Schema({\n nodes: {\n doc: {\n content: \"block+\",\n },\n\n paragraph: {\n content: \"inline*\",\n group: \"block\",\n attrs: {\n styleId: { default: null },\n numberingInstanceId: { default: null },\n numberingLevel: { default: null },\n alignment: { default: null },\n },\n parseDOM: [{ tag: \"p\" }],\n toDOM(node) {\n const classes: string[] = [\"leading-relaxed\"];\n const styleId = node.attrs.styleId as string | null;\n if (styleId) {\n const lower = styleId.toLowerCase();\n if (lower === \"heading1\") classes.push(\"text-2xl font-medium\");\n else if (lower === \"heading2\") classes.push(\"text-xl font-medium\");\n else if (lower === \"heading3\") classes.push(\"text-lg font-medium\");\n }\n const attrs: Record<string, string> = { class: classes.join(\" \") };\n const alignment = node.attrs.alignment as string | null;\n if (alignment) attrs.style = `text-align: ${alignment}`;\n return [\"p\", attrs, 0];\n },\n },\n\n text: {\n group: \"inline\",\n },\n\n hard_break: {\n inline: true,\n group: \"inline\",\n selectable: false,\n parseDOM: [{ tag: \"br\" }],\n toDOM() {\n return [\"br\"];\n },\n },\n\n tab_char: {\n inline: true,\n group: \"inline\",\n atom: true,\n selectable: false,\n toDOM() {\n return [\"span\", { class: \"inline-block w-8\", \"data-node-type\": \"tab\" }, \"\\u00A0\"];\n },\n },\n\n image_atom: {\n inline: true,\n group: \"inline\",\n atom: true,\n attrs: {\n mediaId: { default: \"\" },\n altText: { default: null },\n state: { default: \"editable\" },\n display: { default: \"inline\" },\n detail: { default: null },\n },\n toDOM(node) {\n const isMissing = node.attrs.state === \"missing\";\n const isFloating = node.attrs.display === \"floating\";\n return [\n \"span\",\n {\n class: `inline-flex items-center gap-1 mx-0.5 px-1.5 py-0.5 rounded text-xs border-none ${\n isMissing ? \"text-danger bg-delete-soft\" : \"text-secondary bg-surface\"\n }`,\n \"data-node-type\": \"image\",\n title: (node.attrs.detail as string) ?? (node.attrs.altText as string) ?? \"Image\",\n },\n \"\\uD83D\\uDCF7 \" + ((node.attrs.altText as string) ?? (isMissing ? \"Missing\" : isFloating ? \"Floating image\" : \"Image\")),\n ];\n },\n },\n\n sdt_block: {\n group: \"block\",\n content: \"block+\",\n isolating: true,\n attrs: {\n sdtType: { default: null },\n alias: { default: null },\n tag: { default: null },\n lock: { default: null },\n },\n toDOM(node) {\n const meta = [node.attrs.alias, node.attrs.tag, node.attrs.sdtType].filter(Boolean).join(\" · \");\n return [\n \"section\",\n {\n class: \"my-2 rounded-xl border border-primary/15 bg-surface-raised/60 px-3 py-2\",\n \"data-node-type\": \"sdt_block\",\n },\n [\n \"div\",\n {\n class: \"mb-2 text-[11px] uppercase tracking-[0.18em] text-tertiary\",\n contenteditable: \"false\",\n },\n meta || \"Content control\",\n ],\n [\"div\", 0],\n ];\n },\n },\n\n opaque_inline: {\n inline: true,\n group: \"inline\",\n atom: true,\n selectable: false,\n attrs: {\n fragmentId: { default: \"\" },\n warningId: { default: \"\" },\n label: { default: \"Locked\" },\n detail: { default: \"\" },\n },\n toDOM(node) {\n return [\n \"span\",\n {\n class: \"inline-flex items-center gap-1 mx-0.5 px-1.5 py-0.5 rounded text-xs text-comment bg-warning-soft\",\n \"data-node-type\": \"opaque_inline\",\n title: node.attrs.detail as string,\n },\n \"\\uD83D\\uDD12 \" + (node.attrs.label as string),\n ];\n },\n },\n\n table: tableNodeSpec,\n table_row: tableRowNodeSpec,\n table_cell: tableCellNodeSpec,\n table_header_cell: tableHeaderCellNodeSpec,\n\n // ---- Complex rendering atoms (read-only previews) ----\n\n chart_atom: {\n inline: true,\n group: \"inline\",\n atom: true,\n selectable: false,\n attrs: {\n previewMediaId: { default: null },\n detail: { default: null },\n },\n toDOM(node) {\n return [\n \"span\",\n {\n class: \"inline-flex items-center gap-1 mx-0.5 px-1.5 py-0.5 rounded text-xs text-blue-700 bg-blue-50 border border-blue-200\",\n \"data-node-type\": \"chart_atom\",\n contenteditable: \"false\",\n title: (node.attrs.detail as string) ?? \"Chart\",\n },\n \"\\uD83D\\uDCC8 Chart\",\n ];\n },\n },\n\n smartart_atom: {\n inline: true,\n group: \"inline\",\n atom: true,\n selectable: false,\n attrs: {\n previewMediaId: { default: null },\n detail: { default: null },\n },\n toDOM(node) {\n return [\n \"span\",\n {\n class: \"inline-flex items-center gap-1 mx-0.5 px-1.5 py-0.5 rounded text-xs text-purple-700 bg-purple-50 border border-purple-200\",\n \"data-node-type\": \"smartart_atom\",\n contenteditable: \"false\",\n title: (node.attrs.detail as string) ?? \"SmartArt\",\n },\n \"\\uD83D\\uDDFA SmartArt\",\n ];\n },\n },\n\n shape_atom: {\n inline: true,\n group: \"inline\",\n atom: true,\n selectable: false,\n attrs: {\n text: { default: null },\n geometry: { default: null },\n detail: { default: null },\n },\n toDOM(node) {\n const text = node.attrs.text as string | null;\n const label = text ? `Shape: ${text}` : \"Shape\";\n return [\n \"span\",\n {\n class: \"inline-flex items-center gap-1 mx-0.5 px-1.5 py-0.5 rounded text-xs text-green-700 bg-green-50 border border-green-200\",\n \"data-node-type\": \"shape_atom\",\n contenteditable: \"false\",\n title: (node.attrs.detail as string) ?? label,\n },\n \"\\u25A1 \" + label,\n ];\n },\n },\n\n wordart_atom: {\n inline: true,\n group: \"inline\",\n atom: true,\n selectable: false,\n attrs: {\n text: { default: \"\" },\n geometry: { default: null },\n detail: { default: null },\n },\n toDOM(node) {\n const text = node.attrs.text as string;\n return [\n \"span\",\n {\n class: \"inline-flex items-center gap-1 mx-0.5 px-1.5 py-0.5 rounded text-xs text-orange-700 bg-orange-50 border border-orange-200 font-medium italic\",\n \"data-node-type\": \"wordart_atom\",\n contenteditable: \"false\",\n title: (node.attrs.detail as string) ?? `WordArt: ${text}`,\n },\n \"\\u2728 \" + (text || \"WordArt\"),\n ];\n },\n },\n\n vml_atom: {\n inline: true,\n group: \"inline\",\n atom: true,\n selectable: false,\n attrs: {\n text: { default: null },\n shapeType: { default: null },\n detail: { default: null },\n },\n toDOM(node) {\n const text = node.attrs.text as string | null;\n const label = text ? `VML: ${text}` : \"VML shape\";\n return [\n \"span\",\n {\n class: \"inline-flex items-center gap-1 mx-0.5 px-1.5 py-0.5 rounded text-xs text-gray-600 bg-gray-100 border border-gray-300\",\n \"data-node-type\": \"vml_atom\",\n contenteditable: \"false\",\n title: (node.attrs.detail as string) ?? label,\n },\n \"\\u25A6 \" + label,\n ];\n },\n },\n\n opaque_block: {\n group: \"block\",\n atom: true,\n selectable: false,\n attrs: {\n fragmentId: { default: \"\" },\n warningId: { default: \"\" },\n label: { default: \"Locked\" },\n detail: { default: \"\" },\n },\n toDOM(node) {\n return [\n \"div\",\n {\n class: \"border-l-2 border-dashed border-warning/30 pl-4 py-2 rounded-r bg-warning-soft/20 my-2\",\n contenteditable: \"false\",\n \"data-node-type\": \"opaque_block\",\n },\n [\n \"div\",\n { class: \"flex items-center gap-1.5 text-xs text-tertiary mb-1\" },\n \"\\uD83D\\uDD12 \" + (node.attrs.label as string),\n ],\n [\"p\", { class: \"text-sm text-secondary\" }, node.attrs.detail as string],\n ];\n },\n },\n },\n\n marks: {\n bold: {\n parseDOM: [{ tag: \"strong\" }, { tag: \"b\" }],\n toDOM() {\n return [\"strong\", 0];\n },\n },\n italic: {\n parseDOM: [{ tag: \"em\" }, { tag: \"i\" }],\n toDOM() {\n return [\"em\", 0];\n },\n },\n underline: {\n parseDOM: [{ tag: \"u\" }],\n toDOM() {\n return [\"u\", 0];\n },\n },\n strikethrough: {\n parseDOM: [{ tag: \"s\" }, { tag: \"del\" }],\n toDOM() {\n return [\"s\", 0];\n },\n },\n superscript: {\n excludes: \"subscript\",\n parseDOM: [{ tag: \"sup\" }],\n toDOM() {\n return [\"sup\", 0];\n },\n },\n subscript: {\n excludes: \"superscript\",\n parseDOM: [{ tag: \"sub\" }],\n toDOM() {\n return [\"sub\", 0];\n },\n },\n small_caps: {\n parseDOM: [\n {\n style: \"font-variant\",\n getAttrs: (value) => (value === \"small-caps\" ? null : false),\n },\n ],\n toDOM() {\n return [\"span\", { style: \"font-variant: small-caps\" }, 0];\n },\n },\n all_caps: {\n parseDOM: [\n {\n style: \"text-transform\",\n getAttrs: (value) => (value === \"uppercase\" ? null : false),\n },\n ],\n toDOM() {\n return [\"span\", { style: \"text-transform: uppercase\" }, 0];\n },\n },\n font_family: {\n attrs: { family: { default: null } },\n parseDOM: [\n {\n style: \"font-family\",\n getAttrs: (value) => ({ family: (value as string).replace(/['\"]/g, \"\") }),\n },\n ],\n toDOM(mark) {\n return [\"span\", { style: `font-family: ${mark.attrs.family as string}` }, 0];\n },\n },\n font_size: {\n attrs: { size: { default: null } },\n parseDOM: [\n {\n style: \"font-size\",\n getAttrs: (value) => {\n const match = (value as string).match(/^(\\d+(?:\\.\\d+)?)/);\n return match ? { size: Number.parseFloat(match[1]) } : false;\n },\n },\n ],\n toDOM(mark) {\n return [\"span\", { style: `font-size: ${mark.attrs.size as number}pt` }, 0];\n },\n },\n text_color: {\n attrs: { color: { default: null } },\n parseDOM: [\n {\n style: \"color\",\n getAttrs: (value) => ({ color: value }),\n },\n ],\n toDOM(mark) {\n const color = mark.attrs.color as string;\n return [\"span\", { style: `color: ${color}` }, 0];\n },\n },\n highlight: {\n attrs: { color: { default: \"yellow\" } },\n parseDOM: [\n {\n tag: \"mark\",\n getAttrs: (dom) => ({ color: (dom as HTMLElement).style.backgroundColor || \"yellow\" }),\n },\n ],\n toDOM(mark) {\n return [\"mark\", { style: `background-color: ${mark.attrs.color as string}` }, 0];\n },\n },\n link: {\n attrs: { href: { default: \"\" } },\n inclusive: false,\n parseDOM: [\n {\n tag: \"a[href]\",\n getAttrs(dom) {\n return { href: (dom as HTMLElement).getAttribute(\"href\") };\n },\n },\n ],\n toDOM(mark) {\n return [\n \"a\",\n {\n href: mark.attrs.href as string,\n class: \"text-accent underline decoration-1 underline-offset-2\",\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n },\n 0,\n ];\n },\n },\n },\n});\n","/**\n * ProseMirror table node specifications for first-class table editing.\n *\n * These specs define the structure required for tables in the ProseMirror schema,\n * compatible with prosemirror-tables when used as a dependency, or standalone for\n * basic cell-content editing.\n *\n * All four specs must be included together when merging into a schema because\n * table_row references both table_cell and table_header_cell in its content model.\n */\n\nimport type { NodeSpec } from \"prosemirror-model\";\n\nexport const tableNodeSpec: NodeSpec = {\n content: \"table_row+\",\n tableRole: \"table\",\n group: \"block\",\n isolating: true,\n attrs: {\n styleId: { default: null },\n propertiesXml: { default: null },\n gridColumns: { default: [] },\n },\n parseDOM: [{ tag: \"table\" }],\n toDOM() {\n return [\"table\", { class: \"border-collapse w-full my-2 text-sm\" }, [\"tbody\", 0]];\n },\n};\n\nexport const tableRowNodeSpec: NodeSpec = {\n content: \"(table_cell | table_header_cell)+\",\n tableRole: \"row\",\n attrs: {\n propertiesXml: { default: null },\n },\n parseDOM: [{ tag: \"tr\" }],\n toDOM() {\n return [\"tr\", 0];\n },\n};\n\nexport const tableCellNodeSpec: NodeSpec = {\n content: \"paragraph+\",\n tableRole: \"cell\",\n isolating: true,\n attrs: {\n propertiesXml: { default: null },\n gridSpan: { default: 1 },\n verticalMerge: { default: null },\n colspan: { default: 1 },\n rowspan: { default: 1 },\n colwidth: { default: null },\n },\n parseDOM: [\n {\n tag: \"td\",\n getAttrs(dom: HTMLElement) {\n const colspan = dom.getAttribute(\"colspan\");\n const rowspan = dom.getAttribute(\"rowspan\");\n return {\n colspan: colspan ? Number.parseInt(colspan, 10) : 1,\n rowspan: rowspan ? Number.parseInt(rowspan, 10) : 1,\n };\n },\n },\n ],\n toDOM(node) {\n const attrs: Record<string, string> = {\n class: \"border border-primary/20 p-2 align-top\",\n };\n if (node.attrs.colspan > 1) attrs.colspan = String(node.attrs.colspan);\n if (node.attrs.rowspan > 1) attrs.rowspan = String(node.attrs.rowspan);\n return [\"td\", attrs, 0];\n },\n};\n\nexport const tableHeaderCellNodeSpec: NodeSpec = {\n content: \"paragraph+\",\n tableRole: \"header_cell\",\n isolating: true,\n attrs: {\n propertiesXml: { default: null },\n gridSpan: { default: 1 },\n verticalMerge: { default: null },\n colspan: { default: 1 },\n rowspan: { default: 1 },\n colwidth: { default: null },\n },\n parseDOM: [\n {\n tag: \"th\",\n getAttrs(dom: HTMLElement) {\n const colspan = dom.getAttribute(\"colspan\");\n const rowspan = dom.getAttribute(\"rowspan\");\n return {\n colspan: colspan ? Number.parseInt(colspan, 10) : 1,\n rowspan: rowspan ? Number.parseInt(rowspan, 10) : 1,\n };\n },\n },\n ],\n toDOM(node) {\n const attrs: Record<string, string> = {\n class: \"border border-primary/20 p-2 align-top font-semibold bg-surface-raised\",\n };\n if (node.attrs.colspan > 1) attrs.colspan = String(node.attrs.colspan);\n if (node.attrs.rowspan > 1) attrs.rowspan = String(node.attrs.rowspan);\n return [\"th\", attrs, 0];\n },\n};\n\n/**\n * Returns a record of all four table node specs to merge into an existing ProseMirror Schema.\n *\n * All four must be included together because table_row references both table_cell and\n * table_header_cell in its content model.\n */\nexport function getTableNodeSpecs(): Record<string, NodeSpec> {\n return {\n table: tableNodeSpec,\n table_row: tableRowNodeSpec,\n table_cell: tableCellNodeSpec,\n table_header_cell: tableHeaderCellNodeSpec,\n };\n}\n","import type { EditorSurfaceSnapshot, SurfaceBlockSnapshot } from \"../../api/public-types\";\n\nexport interface PositionMap {\n runtimeToPm(runtimePos: number): number;\n pmToRuntime(pmPos: number): number;\n pmDocSize: number;\n runtimeStorySize: number;\n}\n\ninterface MapEntry {\n runtimeStart: number;\n pmStart: number;\n runtimeEnd: number;\n pmEnd: number;\n}\n\nexport function buildPositionMap(surface: EditorSurfaceSnapshot): PositionMap {\n const entries: MapEntry[] = [];\n const pmDocSize = walkBlocks(surface.blocks, 1, entries);\n const runtimeStorySize = surface.storySize;\n\n return {\n runtimeToPm(runtimePos: number): number {\n if (runtimePos <= 0) {\n return entries[0]?.pmStart ?? 1;\n }\n if (runtimePos >= runtimeStorySize) {\n return pmDocSize - 1;\n }\n\n for (const entry of entries) {\n if (runtimePos >= entry.runtimeStart && runtimePos <= entry.runtimeEnd) {\n return entry.pmStart + (runtimePos - entry.runtimeStart);\n }\n if (runtimePos < entry.runtimeStart) {\n return entry.pmStart;\n }\n }\n\n return entries[entries.length - 1]?.pmEnd ?? 1;\n },\n\n pmToRuntime(pmPos: number): number {\n if (pmPos <= 1) {\n return 0;\n }\n if (pmPos >= pmDocSize - 1) {\n return runtimeStorySize;\n }\n\n for (const entry of entries) {\n if (pmPos >= entry.pmStart && pmPos <= entry.pmEnd) {\n return entry.runtimeStart + (pmPos - entry.pmStart);\n }\n if (pmPos < entry.pmStart) {\n return entry.runtimeStart;\n }\n }\n\n return runtimeStorySize;\n },\n\n pmDocSize,\n runtimeStorySize,\n };\n}\n\nfunction walkBlocks(\n blocks: SurfaceBlockSnapshot[],\n pmCursor: number,\n entries: MapEntry[],\n): number {\n let nextPmCursor = pmCursor;\n\n for (const block of blocks) {\n switch (block.kind) {\n case \"paragraph\": {\n const pmContentStart = nextPmCursor + 1;\n const runtimeLength = block.to - block.from;\n entries.push({\n runtimeStart: block.from,\n pmStart: pmContentStart,\n runtimeEnd: block.to,\n pmEnd: pmContentStart + runtimeLength,\n });\n nextPmCursor += runtimeLength + 2;\n break;\n }\n case \"opaque_block\": {\n entries.push({\n runtimeStart: block.from,\n pmStart: nextPmCursor,\n runtimeEnd: block.to,\n pmEnd: nextPmCursor + 1,\n });\n nextPmCursor += 1;\n break;\n }\n case \"sdt_block\": {\n nextPmCursor += 1;\n nextPmCursor = walkBlocks(block.children, nextPmCursor, entries);\n nextPmCursor += 1;\n break;\n }\n case \"table\": {\n nextPmCursor += 1;\n for (const row of block.rows) {\n nextPmCursor += 1;\n for (const cell of row.cells) {\n nextPmCursor += 1;\n nextPmCursor = walkBlocks(cell.content, nextPmCursor, entries);\n nextPmCursor += 1;\n }\n nextPmCursor += 1;\n }\n nextPmCursor += 1;\n break;\n }\n }\n }\n\n return nextPmCursor;\n}\n","import { Plugin, PluginKey } from \"prosemirror-state\";\nimport { keymap } from \"prosemirror-keymap\";\nimport { columnResizing, goToNextCell, isInTable, tableEditing } from \"prosemirror-tables\";\n\nimport type { SelectionSnapshot } from \"../../api/public-types\";\nimport { createSelectionSnapshot } from \"../../ui/headless/selection-helpers\";\nimport type { PositionMap } from \"./pm-position-map\";\n\nexport interface CommandBridgeCallbacks {\n onInsertText: (text: string) => void;\n onDeleteBackward: () => void;\n onDeleteForward: () => void;\n onSplitParagraph: () => void;\n onInsertHardBreak: () => void;\n onInsertTab: () => void;\n onUndo: () => void;\n onRedo: () => void;\n onSelectionChange: (selection: SelectionSnapshot) => void;\n getPositionMap: () => PositionMap | null;\n}\n\nconst bridgeKey = new PluginKey(\"command-bridge\");\n\n/**\n * Creates ProseMirror plugins that intercept user input and dispatch\n * runtime commands instead of letting PM mutate its own state.\n *\n * All doc-changing transactions are blocked. Only the explicit input\n * hooks below are allowed to trigger runtime commands.\n */\nexport function createCommandBridgePlugins(\n callbacks: CommandBridgeCallbacks,\n): Plugin[] {\n // Transaction filter: block ALL doc-changing transactions.\n // The runtime is the sole authority for document mutations.\n const filterPlugin = new Plugin({\n key: bridgeKey,\n filterTransaction(tr) {\n // Allow selection-only and metadata-only transactions\n if (!tr.docChanged) return true;\n // Block doc changes — runtime handles mutations via callbacks\n return false;\n },\n });\n\n // Selection sync: when PM selection changes, notify the runtime.\n const selectionPlugin = new Plugin({\n view() {\n return {\n update(view, prevState) {\n if (!view.state.selection.eq(prevState.selection)) {\n const posMap = callbacks.getPositionMap();\n if (!posMap) return;\n\n const { from, to } = view.state.selection;\n const runtimeAnchor = posMap.pmToRuntime(from);\n const runtimeHead = posMap.pmToRuntime(to);\n callbacks.onSelectionChange(\n createSelectionSnapshot(runtimeAnchor, runtimeHead),\n );\n }\n },\n };\n },\n });\n\n // Text input hook: intercept typed characters.\n const inputPlugin = new Plugin({\n props: {\n handleTextInput(_view, _from, _to, text) {\n callbacks.onInsertText(text);\n return true; // Block PM from processing\n },\n\n // Block paste (rich paste is not safe, plain paste via text.insert is TODO)\n handlePaste() {\n return true; // Block\n },\n\n // Block drop\n handleDrop() {\n return true; // Block\n },\n },\n });\n\n // Keymap: intercept editing keys and dispatch runtime commands.\n const keymapPlugin = keymap({\n Backspace: () => {\n callbacks.onDeleteBackward();\n return true;\n },\n Delete: () => {\n callbacks.onDeleteForward();\n return true;\n },\n Enter: () => {\n callbacks.onSplitParagraph();\n return true;\n },\n \"Shift-Enter\": () => {\n callbacks.onInsertHardBreak();\n return true;\n },\n Tab: (state, dispatch, view) => {\n if (isInTable(state)) {\n return goToNextCell(1)(state, dispatch, view);\n }\n callbacks.onInsertTab();\n return true;\n },\n \"Shift-Tab\": (state, dispatch, view) => {\n if (isInTable(state)) {\n return goToNextCell(-1)(state, dispatch, view);\n }\n return false;\n },\n \"Mod-z\": () => {\n callbacks.onUndo();\n return true;\n },\n \"Mod-y\": () => {\n callbacks.onRedo();\n return true;\n },\n \"Shift-Mod-z\": () => {\n callbacks.onRedo();\n return true;\n },\n });\n\n // Table editing: provides Tab/Shift-Tab navigation between cells and\n // selection handles. Doc-changing table transactions (new rows, etc.) are\n // filtered by the runtime filter above; navigation-only steps pass through.\n const tablePlugin = tableEditing();\n const columnResizingPlugin = columnResizing();\n\n return [filterPlugin, selectionPlugin, inputPlugin, keymapPlugin, tablePlugin, columnResizingPlugin];\n}\n","import { Decoration, DecorationSet } from \"prosemirror-view\";\n\nimport type { CommentDecorationModel } from \"../../ui/headless/comment-decoration-model\";\nimport { getCommentHighlightClass, type MarkupDisplay } from \"../../ui/headless/comment-decoration-model\";\nimport type { RevisionDecorationModel } from \"../../ui/headless/revision-decoration-model\";\nimport { getRevisionHighlightClass } from \"../../ui/headless/revision-decoration-model\";\nimport type { PositionMap } from \"./pm-position-map\";\nimport type { Node as PMNode } from \"prosemirror-model\";\n\n/**\n * Build ProseMirror DecorationSet from runtime comment and revision models.\n *\n * Uses the existing headless decoration models to compute Tailwind class\n * strings, then converts them to PM inline decorations at the correct\n * PM positions via the PositionMap.\n */\nexport function buildDecorations(\n doc: PMNode,\n positionMap: PositionMap,\n commentModel: CommentDecorationModel | undefined,\n revisionModel: RevisionDecorationModel | undefined,\n markupDisplay: MarkupDisplay,\n showTrackedChanges = true,\n): DecorationSet {\n const decorations: Decoration[] = [];\n\n // Walk comment threads and create inline decorations\n if (commentModel) {\n for (const thread of commentModel.threads) {\n const cls = getCommentHighlightClass(\n commentModel,\n thread.from,\n thread.to,\n markupDisplay,\n );\n if (!cls) continue;\n\n const pmFrom = positionMap.runtimeToPm(thread.from);\n const pmTo = positionMap.runtimeToPm(thread.to);\n if (pmFrom < pmTo) {\n decorations.push(\n Decoration.inline(pmFrom, pmTo, {\n class: cls,\n \"data-comment-id\": thread.commentId,\n }),\n );\n }\n }\n }\n\n // Walk revision entries and create inline decorations.\n // Deletion hiding in clean mode ALWAYS applies, even when showTrackedChanges is off.\n // Visual styling (underlines, colors) only applies when showTrackedChanges is on.\n if (revisionModel) {\n for (const rev of revisionModel.revisions) {\n // Always hide deletions in clean mode (final-text semantics).\n // This is the critical behavior: \"hide tracked changes\" must show\n // the document as if accepted, not show deleted text as kept text.\n if (markupDisplay === \"clean\" && rev.kind === \"deletion\") {\n const pmFrom = positionMap.runtimeToPm(rev.from);\n const pmTo = positionMap.runtimeToPm(rev.to);\n if (pmFrom < pmTo) {\n decorations.push(\n Decoration.inline(pmFrom, pmTo, {\n class: \"hidden\",\n \"data-revision-id\": rev.revisionId,\n }),\n );\n }\n continue;\n }\n\n // Skip visual styling when tracked changes display is off\n if (!showTrackedChanges) continue;\n\n const cls = getRevisionHighlightClass(\n revisionModel,\n rev.from,\n rev.to,\n markupDisplay,\n );\n if (!cls) continue;\n\n const pmFrom = positionMap.runtimeToPm(rev.from);\n const pmTo = positionMap.runtimeToPm(rev.to);\n if (pmFrom < pmTo) {\n decorations.push(\n Decoration.inline(pmFrom, pmTo, {\n class: cls,\n \"data-revision-id\": rev.revisionId,\n }),\n );\n }\n }\n }\n\n return DecorationSet.create(doc, decorations);\n}\n","/**\n * ProseMirror NodeView implementations for table nodes.\n *\n * These NodeViews render table structure as proper HTML tables with\n * colspan/rowspan support for merged cells (from gridSpan/verticalMerge attrs).\n *\n * Usage with EditorView:\n * new EditorView(mount, {\n * nodeViews: tableNodeViews,\n * ...\n * })\n */\n\nimport type { Node as PMNode } from \"prosemirror-model\";\n\n/**\n * NodeView for the table node.\n * Renders as <table><tbody>...</tbody></table>.\n * ProseMirror places row content into the tbody via contentDOM.\n */\nexport class TableNodeView {\n dom: HTMLElement;\n contentDOM: HTMLElement;\n\n constructor(_node: PMNode) {\n const table = document.createElement(\"table\");\n table.className = \"border-collapse w-full my-2 text-sm\";\n\n const tbody = document.createElement(\"tbody\");\n table.appendChild(tbody);\n\n this.dom = table;\n this.contentDOM = tbody;\n }\n}\n\n/**\n * NodeView for table_row nodes.\n * Renders as <tr>...</tr>.\n */\nexport class TableRowNodeView {\n dom: HTMLElement;\n contentDOM: HTMLElement;\n\n constructor(_node: PMNode) {\n const tr = document.createElement(\"tr\");\n this.dom = tr;\n this.contentDOM = tr;\n }\n}\n\n/**\n * NodeView for table_cell and table_header_cell nodes.\n *\n * Applies colspan/rowspan from node attrs (mapped from gridSpan/verticalMerge\n * in the OOXML model). Distinguishes header cells by tableRole spec attribute.\n */\nexport class TableCellNodeView {\n dom: HTMLElement;\n contentDOM: HTMLElement;\n\n constructor(node: PMNode) {\n const isHeader = (node.type.spec as { tableRole?: string }).tableRole === \"header_cell\";\n const cell = document.createElement(isHeader ? \"th\" : \"td\");\n\n cell.className = isHeader\n ? \"border border-primary/20 p-2 align-top font-semibold bg-surface-raised\"\n : \"border border-primary/20 p-2 align-top\";\n\n const colspan = node.attrs.colspan as number;\n const rowspan = node.attrs.rowspan as number;\n if (colspan > 1) (cell as HTMLTableCellElement).colSpan = colspan;\n if (rowspan > 1) (cell as HTMLTableCellElement).rowSpan = rowspan;\n\n this.dom = cell;\n this.contentDOM = cell;\n }\n\n /**\n * Update the DOM when the node's attrs change (e.g., after a merge/split operation).\n * Return false to let ProseMirror rebuild the node view from scratch.\n */\n update(node: PMNode): boolean {\n const isHeader = (node.type.spec as { tableRole?: string }).tableRole === \"header_cell\";\n const expectedTag = isHeader ? \"TH\" : \"TD\";\n if (this.dom.tagName !== expectedTag) return false;\n\n const colspan = node.attrs.colspan as number;\n const rowspan = node.attrs.rowspan as number;\n const cell = this.dom as HTMLTableCellElement;\n cell.colSpan = colspan > 1 ? colspan : 1;\n cell.rowSpan = rowspan > 1 ? rowspan : 1;\n return true;\n }\n}\n\n/**\n * NodeView factory map for use with EditorView.nodeViews.\n *\n * Pass this object directly to the EditorView constructor options:\n * new EditorView(mount, { nodeViews: tableNodeViews, ... })\n */\nexport const tableNodeViews = {\n table: (node: PMNode) => new TableNodeView(node),\n table_row: (node: PMNode) => new TableRowNodeView(node),\n table_cell: (node: PMNode) => new TableCellNodeView(node),\n table_header_cell: (node: PMNode) => new TableCellNodeView(node),\n};\n"],"mappings":"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","names":["useEffect","useMemo","useRef","document","validateExactObjectKeys","createSelectionSnapshot","createPersistedEditorSnapshot","document","createSelectionSnapshot","document","normalizeRange","resultingStatus","textResult","createSelectionSnapshot","nextStore","boundaryIndex","document","createSelectionSnapshot","priorityForStatus","normalizeDocumentRoot","document","document","normalizeDocumentRoot","createPlainText","cloneMarks","createPersistedEditorSnapshot","extractText","decodeXmlEntities","name","parseXml","localName","localName","parseXml","decodeXmlEntities","name","findTagEnd","parseTag","parseXml","findChildElement","localName","readOptionalAttribute","decodeXmlEntities","name","findTagEnd","parseTag","document","cloneRelationship","HYPERLINK_RELATIONSHIP_TYPE","cloneRelationship","escapeAttribute","escapeXml","localName","findChildElement","decodeXmlEntities","tagEnd","node","parseAttributes","localName","findChildElement","parseXml","findChildElement","localName","normalizeImportedTimestamp","text","parseTag","escapeAttribute","serializeText","parseXml","findChildElement","localName","requiresPreservedSpace","escapeXml","text","parseTag","decodeXmlText","splitParagraph","escapeAttribute","parseXml","findChildElementOptional","localName","decodeXmlEntities","parseAttributes","parseXml","findChildElementOptional","localName","parseParagraphElement","parseRunElement","parseRunProperties","extractTextContent","decodeXmlEntities","parseAttributes","parseXml","findChildElementOptional","localName","decodeXmlEntities","parseAttributes","serializeParagraph","buildParagraphPropertiesXml","serializeInlineNode","escapeAttribute","requiresPreservedSpace","escapeXml","W_NS","R_NS","serializeParagraph","escapeAttribute","buildParagraphPropertiesXml","serializeInlineNode","buildRunPropertiesXml","requiresPreservedSpace","escapeXml","document","toPublicCompatibilityReport","toPublicAnchorProjection","toPublicCompatibilityFeatureEntry","toPublicWarning","toPublicError","paragraphBoundary","cloneRelationship","isRecord","escapeXml","pmFrom","pmTo","jsx","WordReviewEditor","useRef","useEffect","useMemo","jsx","collapsedSelection","collapsedSelection"]}