@beyondwork/docx-react-component 1.0.27 → 1.0.29
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.
- package/dist/canonical-document-BLEbzL2J.d.cts +844 -0
- package/dist/canonical-document-BLEbzL2J.d.ts +844 -0
- package/dist/chunk-2FJS5GZM.js +763 -0
- package/dist/chunk-2FJS5GZM.js.map +1 -0
- package/{src/core/commands/section-layout-commands.ts → dist/chunk-2OQBZS3F.js} +106 -340
- package/dist/chunk-2OQBZS3F.js.map +1 -0
- package/dist/chunk-2S7W4KFO.js +127 -0
- package/dist/chunk-2S7W4KFO.js.map +1 -0
- package/dist/chunk-2TG72QSW.js +3874 -0
- package/dist/chunk-2TG72QSW.js.map +1 -0
- package/{src/core/commands/table-structure-commands.ts → dist/chunk-36QNIZBO.js} +126 -315
- package/dist/chunk-36QNIZBO.js.map +1 -0
- package/dist/chunk-4AQOYAW4.js +3069 -0
- package/dist/chunk-4AQOYAW4.js.map +1 -0
- package/dist/chunk-4D5EWJ3P.js +77 -0
- package/dist/chunk-4D5EWJ3P.js.map +1 -0
- package/dist/chunk-5FN54NDH.js +2257 -0
- package/dist/chunk-5FN54NDH.js.map +1 -0
- package/dist/chunk-BOYGQYRQ.js +7306 -0
- package/dist/chunk-BOYGQYRQ.js.map +1 -0
- package/dist/chunk-CN3XMECL.js +212 -0
- package/dist/chunk-CN3XMECL.js.map +1 -0
- package/dist/chunk-EBI3BX6U.js +164 -0
- package/dist/chunk-EBI3BX6U.js.map +1 -0
- package/dist/chunk-EILUG3VB.js +1275 -0
- package/dist/chunk-EILUG3VB.js.map +1 -0
- package/dist/chunk-FUDY333O.js +70 -0
- package/dist/chunk-FUDY333O.js.map +1 -0
- package/dist/chunk-GBVOWFIK.js +1237 -0
- package/dist/chunk-GBVOWFIK.js.map +1 -0
- package/dist/chunk-H4TQ3H3Y.js +262 -0
- package/dist/chunk-H4TQ3H3Y.js.map +1 -0
- package/{src/core/commands/style-commands.ts → dist/chunk-JGB3IXZO.js} +40 -113
- package/dist/chunk-JGB3IXZO.js.map +1 -0
- package/dist/chunk-KD2QRQPY.js +4342 -0
- package/dist/chunk-KD2QRQPY.js.map +1 -0
- package/dist/chunk-KLMXQVYK.js +369 -0
- package/dist/chunk-KLMXQVYK.js.map +1 -0
- package/dist/chunk-KZUG5KFQ.js +214 -0
- package/dist/chunk-KZUG5KFQ.js.map +1 -0
- package/{src/core/state/text-transaction.ts → dist/chunk-QDAQ4CJU.js} +79 -236
- package/dist/chunk-QDAQ4CJU.js.map +1 -0
- package/{src/legal/bookmarks.ts → dist/chunk-RMH72RZI.js} +44 -130
- package/dist/chunk-RMH72RZI.js.map +1 -0
- package/dist/chunk-SWKWQZXM.js +117 -0
- package/dist/chunk-SWKWQZXM.js.map +1 -0
- package/{src/core/commands/formatting-commands.ts → dist/chunk-TJBP2K4T.js} +196 -536
- package/dist/chunk-TJBP2K4T.js.map +1 -0
- package/dist/chunk-TLCEAQDQ.js +542 -0
- package/dist/chunk-TLCEAQDQ.js.map +1 -0
- package/{src/core/commands/text-commands.ts → dist/chunk-UZXBISGO.js} +86 -142
- package/dist/chunk-UZXBISGO.js.map +1 -0
- package/dist/chunk-WGBAKP3Q.js +3220 -0
- package/dist/chunk-WGBAKP3Q.js.map +1 -0
- package/dist/compare/index.cjs +5475 -0
- package/dist/compare/index.cjs.map +1 -0
- package/dist/compare/index.d.cts +114 -0
- package/dist/compare/index.d.ts +114 -0
- package/dist/compare/index.js +731 -0
- package/dist/compare/index.js.map +1 -0
- package/dist/core/commands/formatting-commands.cjs +828 -0
- package/dist/core/commands/formatting-commands.cjs.map +1 -0
- package/dist/core/commands/formatting-commands.d.cts +63 -0
- package/dist/core/commands/formatting-commands.d.ts +63 -0
- package/dist/core/commands/formatting-commands.js +37 -0
- package/dist/core/commands/formatting-commands.js.map +1 -0
- package/dist/core/commands/image-commands.cjs +2023 -0
- package/dist/core/commands/image-commands.cjs.map +1 -0
- package/dist/core/commands/image-commands.d.cts +58 -0
- package/dist/core/commands/image-commands.d.ts +58 -0
- package/dist/core/commands/image-commands.js +18 -0
- package/dist/core/commands/image-commands.js.map +1 -0
- package/dist/core/commands/section-layout-commands.cjs +477 -0
- package/dist/core/commands/section-layout-commands.cjs.map +1 -0
- package/dist/core/commands/section-layout-commands.d.cts +62 -0
- package/dist/core/commands/section-layout-commands.d.ts +62 -0
- package/dist/core/commands/section-layout-commands.js +21 -0
- package/dist/core/commands/section-layout-commands.js.map +1 -0
- package/dist/core/commands/style-commands.cjs +214 -0
- package/dist/core/commands/style-commands.cjs.map +1 -0
- package/dist/core/commands/style-commands.d.cts +13 -0
- package/dist/core/commands/style-commands.d.ts +13 -0
- package/dist/core/commands/style-commands.js +9 -0
- package/dist/core/commands/style-commands.js.map +1 -0
- package/dist/core/commands/table-structure-commands.cjs +1883 -0
- package/dist/core/commands/table-structure-commands.cjs.map +1 -0
- package/dist/core/commands/table-structure-commands.d.cts +59 -0
- package/dist/core/commands/table-structure-commands.d.ts +59 -0
- package/dist/core/commands/table-structure-commands.js +12 -0
- package/dist/core/commands/table-structure-commands.js.map +1 -0
- package/dist/core/commands/text-commands.cjs +2391 -0
- package/dist/core/commands/text-commands.cjs.map +1 -0
- package/dist/core/commands/text-commands.d.cts +24 -0
- package/dist/core/commands/text-commands.d.ts +24 -0
- package/dist/core/commands/text-commands.js +28 -0
- package/dist/core/commands/text-commands.js.map +1 -0
- package/dist/core/selection/mapping.cjs +200 -0
- package/dist/core/selection/mapping.cjs.map +1 -0
- package/dist/core/selection/mapping.d.cts +2 -0
- package/dist/core/selection/mapping.d.ts +2 -0
- package/dist/core/selection/mapping.js +31 -0
- package/dist/core/selection/mapping.js.map +1 -0
- package/dist/core/state/editor-state.cjs +2278 -0
- package/dist/core/state/editor-state.cjs.map +1 -0
- package/dist/core/state/editor-state.d.cts +2 -0
- package/dist/core/state/editor-state.d.ts +2 -0
- package/dist/core/state/editor-state.js +26 -0
- package/dist/core/state/editor-state.js.map +1 -0
- package/dist/index.cjs +38553 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +15 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +7856 -0
- package/dist/index.js.map +1 -0
- package/dist/io/docx-session.cjs +16236 -0
- package/dist/io/docx-session.cjs.map +1 -0
- package/dist/io/docx-session.d.cts +21 -0
- package/dist/io/docx-session.d.ts +21 -0
- package/dist/io/docx-session.js +18 -0
- package/dist/io/docx-session.js.map +1 -0
- package/dist/legal/index.cjs +3900 -0
- package/dist/legal/index.cjs.map +1 -0
- package/dist/legal/index.d.cts +86 -0
- package/dist/legal/index.d.ts +86 -0
- package/dist/legal/index.js +616 -0
- package/dist/legal/index.js.map +1 -0
- package/dist/public-types-7ZL_94cz.d.ts +1573 -0
- package/dist/public-types-CeMaDueh.d.cts +1573 -0
- package/dist/public-types.cjs +19 -0
- package/dist/public-types.cjs.map +1 -0
- package/dist/public-types.d.cts +2 -0
- package/dist/public-types.d.ts +2 -0
- package/dist/public-types.js +1 -0
- package/dist/public-types.js.map +1 -0
- package/dist/runtime/document-runtime.cjs +11140 -0
- package/dist/runtime/document-runtime.cjs.map +1 -0
- package/dist/runtime/document-runtime.d.cts +231 -0
- package/dist/runtime/document-runtime.d.ts +231 -0
- package/dist/runtime/document-runtime.js +21 -0
- package/dist/runtime/document-runtime.js.map +1 -0
- package/dist/structural-helpers-CilgOVhh.d.cts +10 -0
- package/dist/structural-helpers-q0Gd-eBN.d.ts +10 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.cjs +313 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.cjs.map +1 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.d.cts +67 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.d.ts +67 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.js +23 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.js.map +1 -0
- package/dist/ui-tailwind/index.cjs +4833 -0
- package/dist/ui-tailwind/index.cjs.map +1 -0
- package/dist/ui-tailwind/index.d.cts +617 -0
- package/dist/ui-tailwind/index.d.ts +617 -0
- package/dist/ui-tailwind/index.js +575 -0
- package/dist/ui-tailwind/index.js.map +1 -0
- package/package.json +64 -54
- package/src/README.md +0 -85
- package/src/api/README.md +0 -26
- package/src/api/public-types.ts +0 -1418
- package/src/api/session-state.ts +0 -60
- package/src/compare/diff-engine.ts +0 -623
- package/src/compare/export-redlines.ts +0 -280
- package/src/compare/index.ts +0 -25
- package/src/compare/snapshot.ts +0 -97
- package/src/component-inventory.md +0 -99
- package/src/core/README.md +0 -10
- package/src/core/commands/README.md +0 -3
- package/src/core/commands/image-commands.ts +0 -373
- package/src/core/commands/index.ts +0 -1757
- package/src/core/commands/list-commands.ts +0 -565
- package/src/core/commands/paragraph-layout-commands.ts +0 -339
- package/src/core/commands/review-commands.ts +0 -108
- package/src/core/commands/structural-helpers.ts +0 -309
- package/src/core/schema/README.md +0 -3
- package/src/core/schema/text-schema.ts +0 -516
- package/src/core/search/search-text.ts +0 -357
- package/src/core/selection/README.md +0 -3
- package/src/core/selection/mapping.ts +0 -289
- package/src/core/selection/review-anchors.ts +0 -183
- package/src/core/state/README.md +0 -3
- package/src/core/state/editor-state.ts +0 -892
- package/src/formats/xlsx/io/parse-shared-strings.ts +0 -41
- package/src/formats/xlsx/io/parse-sheet.ts +0 -459
- package/src/formats/xlsx/io/parse-styles.ts +0 -59
- package/src/formats/xlsx/io/parse-workbook.ts +0 -75
- package/src/formats/xlsx/io/serialize-shared-strings.ts +0 -72
- package/src/formats/xlsx/io/serialize-sheet.ts +0 -333
- package/src/formats/xlsx/io/serialize-styles.ts +0 -98
- package/src/formats/xlsx/io/serialize-workbook.ts +0 -429
- package/src/formats/xlsx/io/xlsx-session.ts +0 -314
- package/src/formats/xlsx/model/cell.ts +0 -189
- package/src/formats/xlsx/model/sheet.ts +0 -326
- package/src/formats/xlsx/model/styles.ts +0 -118
- package/src/formats/xlsx/model/workbook.ts +0 -453
- package/src/formats/xlsx/runtime/cell-commands.ts +0 -567
- package/src/formats/xlsx/runtime/sheet-commands.ts +0 -206
- package/src/formats/xlsx/runtime/workbook-runtime.ts +0 -177
- package/src/formats/xlsx/runtime/workbook-transaction.ts +0 -822
- package/src/index.ts +0 -101
- package/src/io/README.md +0 -10
- package/src/io/docx-session.ts +0 -2882
- package/src/io/export/README.md +0 -3
- package/src/io/export/export-session.ts +0 -220
- package/src/io/export/minimal-docx.ts +0 -115
- package/src/io/export/reattach-preserved-parts.ts +0 -54
- package/src/io/export/serialize-comments.ts +0 -947
- package/src/io/export/serialize-footnotes.ts +0 -399
- package/src/io/export/serialize-headers-footers.ts +0 -372
- package/src/io/export/serialize-main-document.ts +0 -1376
- package/src/io/export/serialize-numbering.ts +0 -118
- package/src/io/export/serialize-revisions.ts +0 -389
- package/src/io/export/serialize-runtime-revisions.ts +0 -269
- package/src/io/export/serialize-tables.ts +0 -174
- package/src/io/export/split-review-boundaries.ts +0 -356
- package/src/io/normalize/README.md +0 -3
- package/src/io/normalize/normalize-text.ts +0 -639
- package/src/io/ooxml/README.md +0 -3
- package/src/io/ooxml/highlight-colors.ts +0 -39
- package/src/io/ooxml/numbering-sentinels.ts +0 -44
- package/src/io/ooxml/parse-comments.ts +0 -846
- package/src/io/ooxml/parse-complex-content.ts +0 -287
- package/src/io/ooxml/parse-fields.ts +0 -834
- package/src/io/ooxml/parse-footnotes.ts +0 -896
- package/src/io/ooxml/parse-headers-footers.ts +0 -1169
- package/src/io/ooxml/parse-inline-media.ts +0 -461
- package/src/io/ooxml/parse-main-document.ts +0 -2877
- package/src/io/ooxml/parse-numbering.ts +0 -432
- package/src/io/ooxml/parse-revisions.ts +0 -931
- package/src/io/ooxml/parse-settings.ts +0 -184
- package/src/io/ooxml/parse-shapes.ts +0 -296
- package/src/io/ooxml/parse-styles.ts +0 -463
- package/src/io/ooxml/parse-tables.ts +0 -618
- package/src/io/ooxml/parse-theme.ts +0 -346
- package/src/io/ooxml/part-manifest.ts +0 -136
- package/src/io/ooxml/revision-boundaries.ts +0 -351
- package/src/io/opc/README.md +0 -3
- package/src/io/opc/corrupt-package.ts +0 -166
- package/src/io/opc/docx-package.ts +0 -74
- package/src/io/opc/package-reader.ts +0 -325
- package/src/io/opc/package-writer.ts +0 -273
- package/src/io/source-package-provenance.ts +0 -241
- package/src/legal/cross-references.ts +0 -414
- package/src/legal/defined-terms.ts +0 -203
- package/src/legal/index.ts +0 -32
- package/src/legal/signature-blocks.ts +0 -259
- package/src/model/README.md +0 -3
- package/src/model/canonical-document.ts +0 -2632
- package/src/model/cds-1.0.0.ts +0 -212
- package/src/model/snapshot.ts +0 -649
- package/src/preservation/README.md +0 -3
- package/src/preservation/markup-compatibility.ts +0 -48
- package/src/preservation/opaque-fragment-store.ts +0 -89
- package/src/preservation/opaque-region.ts +0 -233
- package/src/preservation/package-preservation.ts +0 -113
- package/src/preservation/preserved-part-manifest.ts +0 -56
- package/src/preservation/relationship-retention.ts +0 -57
- package/src/preservation/store.ts +0 -185
- package/src/review/README.md +0 -16
- package/src/review/store/README.md +0 -3
- package/src/review/store/comment-anchors.ts +0 -70
- package/src/review/store/comment-remapping.ts +0 -154
- package/src/review/store/comment-store.ts +0 -331
- package/src/review/store/comment-thread.ts +0 -109
- package/src/review/store/revision-actions.ts +0 -394
- package/src/review/store/revision-store.ts +0 -312
- package/src/review/store/revision-types.ts +0 -171
- package/src/review/store/runtime-comment-store.ts +0 -43
- package/src/runtime/README.md +0 -3
- package/src/runtime/ai-action-policy.ts +0 -764
- package/src/runtime/collab-review-sync.ts +0 -254
- package/src/runtime/document-layout.ts +0 -332
- package/src/runtime/document-navigation.ts +0 -603
- package/src/runtime/document-runtime.ts +0 -3159
- package/src/runtime/document-search.ts +0 -145
- package/src/runtime/numbering-prefix.ts +0 -216
- package/src/runtime/page-layout-estimation.ts +0 -212
- package/src/runtime/read-only-diagnostics-runtime.ts +0 -241
- package/src/runtime/review-runtime.ts +0 -44
- package/src/runtime/revision-runtime.ts +0 -107
- package/src/runtime/session-capabilities.ts +0 -192
- package/src/runtime/story-context.ts +0 -164
- package/src/runtime/story-targeting.ts +0 -162
- package/src/runtime/surface-projection.ts +0 -1357
- package/src/runtime/table-commands.ts +0 -173
- package/src/runtime/table-schema.ts +0 -309
- package/src/runtime/view-state.ts +0 -477
- package/src/runtime/virtualized-rendering.ts +0 -258
- package/src/runtime/workflow-markup.ts +0 -353
- package/src/ui/README.md +0 -30
- package/src/ui/WordReviewEditor.tsx +0 -4097
- package/src/ui/browser-export.ts +0 -52
- package/src/ui/comments/README.md +0 -3
- package/src/ui/compatibility/README.md +0 -3
- package/src/ui/editor-command-bag.ts +0 -120
- package/src/ui/editor-runtime-boundary.ts +0 -1457
- package/src/ui/editor-shell-view.tsx +0 -142
- package/src/ui/editor-surface/README.md +0 -3
- package/src/ui/editor-surface-controller.tsx +0 -63
- package/src/ui/headless/comment-decoration-model.ts +0 -124
- package/src/ui/headless/preserve-editor-selection.ts +0 -5
- package/src/ui/headless/revision-decoration-model.ts +0 -128
- package/src/ui/headless/selection-helpers.ts +0 -54
- package/src/ui/headless/selection-toolbar-model.ts +0 -34
- package/src/ui/headless/use-editor-keyboard.ts +0 -103
- package/src/ui/review/README.md +0 -3
- package/src/ui/runtime-snapshot-selectors.ts +0 -197
- package/src/ui/shared/revision-filters.ts +0 -31
- package/src/ui/status/README.md +0 -3
- package/src/ui/theme/README.md +0 -3
- package/src/ui/toolbar/README.md +0 -3
- package/src/ui/workflow-surface-blocked-rails.ts +0 -94
- package/src/ui-tailwind/chrome/tw-alert-banner.tsx +0 -64
- package/src/ui-tailwind/chrome/tw-image-context-toolbar.tsx +0 -129
- package/src/ui-tailwind/chrome/tw-layout-panel.tsx +0 -114
- package/src/ui-tailwind/chrome/tw-object-context-toolbar.tsx +0 -34
- package/src/ui-tailwind/chrome/tw-page-ruler.tsx +0 -386
- package/src/ui-tailwind/chrome/tw-selection-toolbar.tsx +0 -186
- package/src/ui-tailwind/chrome/tw-suggestion-card.tsx +0 -139
- package/src/ui-tailwind/chrome/tw-table-context-toolbar.tsx +0 -128
- package/src/ui-tailwind/chrome/tw-unsaved-modal.tsx +0 -58
- package/src/ui-tailwind/chrome/use-before-unload.ts +0 -20
- package/src/ui-tailwind/editor-surface/perf-probe.ts +0 -179
- package/src/ui-tailwind/editor-surface/pm-collab-plugins.ts +0 -40
- package/src/ui-tailwind/editor-surface/pm-command-bridge.ts +0 -178
- package/src/ui-tailwind/editor-surface/pm-contextual-ui.ts +0 -31
- package/src/ui-tailwind/editor-surface/pm-decorations.ts +0 -427
- package/src/ui-tailwind/editor-surface/pm-position-map.ts +0 -123
- package/src/ui-tailwind/editor-surface/pm-schema.ts +0 -876
- package/src/ui-tailwind/editor-surface/pm-state-from-snapshot.ts +0 -504
- package/src/ui-tailwind/editor-surface/search-plugin.ts +0 -168
- package/src/ui-tailwind/editor-surface/surface-build-keys.ts +0 -61
- package/src/ui-tailwind/editor-surface/tw-caret.tsx +0 -12
- package/src/ui-tailwind/editor-surface/tw-editor-surface.tsx +0 -150
- package/src/ui-tailwind/editor-surface/tw-inline-token.tsx +0 -129
- package/src/ui-tailwind/editor-surface/tw-opaque-block.tsx +0 -58
- package/src/ui-tailwind/editor-surface/tw-paragraph-block.tsx +0 -151
- package/src/ui-tailwind/editor-surface/tw-prosemirror-surface.tsx +0 -973
- package/src/ui-tailwind/editor-surface/tw-segment-view.tsx +0 -111
- package/src/ui-tailwind/editor-surface/tw-table-node-view.tsx +0 -436
- package/src/ui-tailwind/index.ts +0 -62
- package/src/ui-tailwind/page-chrome-model.ts +0 -27
- package/src/ui-tailwind/review/tw-comment-sidebar.tsx +0 -406
- package/src/ui-tailwind/review/tw-health-panel.tsx +0 -149
- package/src/ui-tailwind/review/tw-review-rail.tsx +0 -120
- package/src/ui-tailwind/review/tw-revision-sidebar.tsx +0 -164
- package/src/ui-tailwind/status/tw-status-bar.tsx +0 -61
- package/src/ui-tailwind/toolbar/tw-toolbar-icon-button.tsx +0 -52
- package/src/ui-tailwind/toolbar/tw-toolbar.tsx +0 -1064
- package/src/ui-tailwind/tw-review-workspace.tsx +0 -1417
- package/src/validation/README.md +0 -3
- package/src/validation/compatibility-engine.ts +0 -634
- package/src/validation/compatibility-report.ts +0 -161
- package/src/validation/diagnostics.ts +0 -204
- package/src/validation/docx-comment-proof.ts +0 -707
- package/src/validation/import-diagnostics.ts +0 -128
- package/src/validation/low-priority-word-surfaces.ts +0 -373
- /package/{src → dist}/ui-tailwind/theme/editor-theme.css +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/commands/review-commands.ts","../src/review/store/comment-remapping.ts","../src/review/store/revision-actions.ts","../src/runtime/revision-runtime.ts","../src/core/commands/index.ts","../src/validation/compatibility-report.ts","../src/runtime/workflow-markup.ts","../src/runtime/document-runtime.ts"],"sourcesContent":["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 { 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 { 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; mapping: TransactionMapping; 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 createDetachedAnchor,\n createEmptyMapping,\n createNodeAnchor,\n createRangeAnchor,\n DEFAULT_BOUNDARY_ASSOC,\n mapAnchor,\n type BoundaryAssoc,\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 type { RevisionRecord as CanonicalRevisionRecord } from \"../../model/canonical-document.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 protectionSelection?: 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 selection?: SelectionSnapshot;\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 revisionAuthored?: { changeId: string; kind: \"insertion\" | \"deletion\" };\n commandBlocked?: { code: string; message: 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 documentMode?: \"editing\" | \"suggesting\" | \"viewing\";\n defaultAuthorId?: 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 const suggestingResult = context.documentMode === \"suggesting\"\n ? applySuggestingInsert(state, command.text, context)\n : undefined;\n if (suggestingResult) return suggestingResult;\n return applyTextCommand(state, context.timestamp, (document, selection) =>\n insertText(document, selection, command.text, context),\n );\n }\n case \"text.delete-backward\": {\n const suggestingResult = context.documentMode === \"suggesting\"\n ? applySuggestingDelete(state, \"backward\", context)\n : undefined;\n if (suggestingResult) return suggestingResult;\n return applyTextCommand(state, context.timestamp, (document, selection) =>\n deleteSelectionOrBackward(document, selection, context),\n );\n }\n case \"text.delete-forward\": {\n const suggestingResult = context.documentMode === \"suggesting\"\n ? applySuggestingDelete(state, \"forward\", context)\n : undefined;\n if (suggestingResult) return suggestingResult;\n return applyTextCommand(state, context.timestamp, (document, selection) =>\n deleteSelectionOrForward(document, selection, context),\n );\n }\n case \"text.insert-tab\": {\n const suggestingResult = context.documentMode === \"suggesting\"\n ? applySuggestingInsertUnit(state, \"tab\", context)\n : undefined;\n if (suggestingResult) return suggestingResult;\n return applyTextCommand(state, context.timestamp, (document, selection) =>\n insertTab(document, selection, context),\n );\n }\n case \"text.insert-hard-break\": {\n const suggestingResult = context.documentMode === \"suggesting\"\n ? applySuggestingInsertUnit(state, \"hard_break\", context)\n : undefined;\n if (suggestingResult) return suggestingResult;\n return applyTextCommand(state, context.timestamp, (document, selection) =>\n insertHardBreak(document, selection, context),\n );\n }\n case \"paragraph.split\":\n if (context.documentMode === \"suggesting\") {\n return createTransaction(state, {\n historyBoundary: \"skip\",\n markDirty: false,\n effects: {\n commandBlocked: {\n code: \"suggesting_unsupported\",\n message: \"Paragraph splits are not supported in suggesting mode.\",\n },\n },\n });\n }\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 = {\n ...threadToEdit,\n body: command.body,\n entries: editedEntries,\n };\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 {\n anchor: activeRange.at,\n head: activeRange.at,\n isCollapsed: true,\n activeRange,\n };\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 revisionAuthored: options.effects?.revisionAuthored,\n commandBlocked: options.effects?.commandBlocked,\n },\n };\n}\n\nfunction normalizeSelection(selection: SelectionSnapshot): SelectionSnapshot {\n const activeRange = normalizeSelectionAnchor(\n selection.activeRange,\n selection.anchor,\n selection.head,\n );\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 {\n anchor: activeRange.at,\n head: activeRange.at,\n isCollapsed: true,\n activeRange,\n };\n }\n\n return {\n anchor: activeRange.lastKnownRange.from,\n head: activeRange.lastKnownRange.to,\n isCollapsed: activeRange.lastKnownRange.from === activeRange.lastKnownRange.to,\n activeRange,\n };\n}\n\nfunction normalizeSelectionAnchor(\n value: SelectionSnapshot[\"activeRange\"],\n anchor: number,\n head: number,\n): EditorAnchorProjection {\n if (!value || typeof value !== \"object\") {\n return createRangeAnchor(anchor, head, DEFAULT_BOUNDARY_ASSOC);\n }\n\n const record = value as unknown as Record<string, unknown>;\n switch (record.kind) {\n case \"range\": {\n const assoc = normalizeBoundaryAssoc(record.assoc);\n const internalRange = record.range;\n if (\n internalRange &&\n typeof internalRange === \"object\" &&\n typeof (internalRange as { from?: unknown }).from === \"number\" &&\n typeof (internalRange as { to?: unknown }).to === \"number\"\n ) {\n return createRangeAnchor(\n (internalRange as { from: number }).from,\n (internalRange as { to: number }).to,\n assoc,\n );\n }\n\n if (typeof record.from === \"number\" && typeof record.to === \"number\") {\n return createRangeAnchor(record.from, record.to, assoc);\n }\n\n return createRangeAnchor(anchor, head, assoc);\n }\n case \"node\":\n return createNodeAnchor(\n typeof record.at === \"number\" ? record.at : anchor,\n normalizeAssoc(record.assoc),\n );\n case \"detached\": {\n const lastKnownRange = record.lastKnownRange;\n if (\n lastKnownRange &&\n typeof lastKnownRange === \"object\" &&\n typeof (lastKnownRange as { from?: unknown }).from === \"number\" &&\n typeof (lastKnownRange as { to?: unknown }).to === \"number\"\n ) {\n return createDetachedAnchor(\n {\n from: (lastKnownRange as { from: number }).from,\n to: (lastKnownRange as { to: number }).to,\n },\n normalizeDetachedReason(record.reason),\n );\n }\n\n return createDetachedAnchor({ from: anchor, to: head }, normalizeDetachedReason(record.reason));\n }\n default:\n return createRangeAnchor(anchor, head, DEFAULT_BOUNDARY_ASSOC);\n }\n}\n\nfunction normalizeBoundaryAssoc(value: unknown): BoundaryAssoc {\n if (value && typeof value === \"object\") {\n const record = value as unknown as Record<string, unknown>;\n return {\n start: normalizeAssoc(record.start),\n end: normalizeAssoc(record.end),\n };\n }\n\n return DEFAULT_BOUNDARY_ASSOC;\n}\n\nfunction normalizeAssoc(value: unknown): -1 | 1 {\n return value === -1 ? -1 : 1;\n}\n\nfunction normalizeDetachedReason(\n value: unknown,\n): \"deleted\" | \"invalidatedByStructureChange\" | \"importAmbiguity\" {\n if (\n value === \"deleted\" ||\n value === \"invalidatedByStructureChange\" ||\n value === \"importAmbiguity\"\n ) {\n return value;\n }\n\n return \"importAmbiguity\";\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 storyTarget: revision.metadata?.storyTarget,\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 storyTarget: revision.metadata.storyTarget,\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\n// ---------------------------------------------------------------------------\n// Suggesting mode: creates revision records instead of (or alongside) text mutations\n// ---------------------------------------------------------------------------\n\nlet suggestingRevisionCounter = 0;\n\nfunction createSuggestingRevisionId(\n existing: Record<string, unknown>,\n timestamp: string,\n): string {\n suggestingRevisionCounter += 1;\n const ts = timestamp.replace(/[^0-9]/gu, \"\");\n let id = `change-${ts}-s${suggestingRevisionCounter}`;\n while (existing[id]) {\n suggestingRevisionCounter += 1;\n id = `change-${ts}-s${suggestingRevisionCounter}`;\n }\n return id;\n}\n\nfunction createAuthoredRevision(\n existing: Record<string, unknown>,\n kind: \"insertion\" | \"deletion\",\n from: number,\n to: number,\n authorId: string,\n timestamp: string,\n): CanonicalRevisionRecord {\n const changeId = createSuggestingRevisionId(existing, timestamp);\n return {\n changeId,\n kind,\n anchor: {\n kind: \"range\",\n range: { from, to },\n assoc: { start: 1, end: -1 },\n },\n authorId,\n createdAt: timestamp,\n warningIds: [],\n metadata: {\n source: \"runtime\",\n },\n status: \"open\",\n };\n}\n\nfunction createSuggestingUnsupportedTransaction(\n state: EditorState,\n message: string,\n): EditorTransaction {\n return createTransaction(state, {\n historyBoundary: \"skip\",\n markDirty: false,\n effects: {\n commandBlocked: {\n code: \"suggesting_unsupported\",\n message,\n },\n },\n });\n}\n\nfunction isSingleParagraphSuggestingRange(\n document: CanonicalDocumentEnvelope,\n from: number,\n to: number,\n): boolean {\n const ranges: Array<{ start: number; end: number }> = [];\n let cursor = 0;\n let previousWasParagraph = false;\n\n for (const block of document.content.children) {\n if (block.type === \"paragraph\") {\n if (previousWasParagraph) {\n cursor += 1;\n }\n const start = cursor;\n cursor += block.children.reduce<number>((size, child) => {\n if (child.type === \"text\") {\n return size + child.text.length;\n }\n if (child.type === \"hyperlink\") {\n return size + child.children.reduce<number>((childSize, entry) => {\n if (entry.type === \"text\") {\n return childSize + entry.text.length;\n }\n return childSize + 1;\n }, 0);\n }\n return size + 1;\n }, 0);\n ranges.push({ start, end: cursor });\n previousWasParagraph = true;\n continue;\n }\n\n cursor += 1;\n previousWasParagraph = false;\n }\n\n return ranges.some((range) => from >= range.start && to <= range.end);\n}\n\nfunction applySuggestingInsert(\n state: EditorState,\n text: string,\n context: CommandExecutionContext,\n): EditorTransaction | undefined {\n if (state.readOnly) {\n return createTransaction(state, { historyBoundary: \"skip\", markDirty: false });\n }\n\n const authorId = context.defaultAuthorId ?? \"unknown\";\n const selection = state.selection;\n const from = Math.min(selection.anchor, selection.head);\n const to = Math.max(selection.anchor, selection.head);\n const isCollapsed = from === to;\n\n if (!isCollapsed && !isSingleParagraphSuggestingRange(state.document, from, to)) {\n return createSuggestingUnsupportedTransaction(\n state,\n \"Suggesting mode does not yet support multi-paragraph replacement ranges.\",\n );\n }\n\n if (isCollapsed) {\n // Pure insertion at cursor: apply normally, then create or extend an insertion revision.\n const result = insertText(state.document, selection, text, { timestamp: context.timestamp });\n const insertedFrom = from;\n const insertedTo = from + Array.from(text).length;\n\n // Remap existing review state first (comments, pre-existing revisions)\n const reviewState = remapReviewStateAfterContentChange(\n state,\n result.document,\n result.mapping,\n );\n\n // If there is an authored insertion revision that ends exactly where this\n // text was inserted (i.e. the cursor was at the end of a prior insertion),\n // extend that revision to cover the new text rather than creating a new one.\n // This groups consecutive keystrokes into a single tracked change.\n const adjacentInsertion = findAdjacentAuthoredInsertion(\n reviewState.document.review.revisions,\n insertedFrom,\n );\n\n let finalRevisionId: string;\n let finalRevisions: Record<string, CanonicalRevisionRecord>;\n\n if (adjacentInsertion && adjacentInsertion.anchor.kind === \"range\") {\n const extended: CanonicalRevisionRecord = {\n ...adjacentInsertion,\n anchor: {\n kind: \"range\",\n range: { from: adjacentInsertion.anchor.range.from, to: insertedTo },\n assoc: { start: 1, end: -1 },\n },\n };\n finalRevisionId = extended.changeId;\n finalRevisions = {\n ...reviewState.document.review.revisions,\n [extended.changeId]: extended,\n };\n } else {\n const revision = createAuthoredRevision(\n reviewState.document.review.revisions,\n \"insertion\",\n insertedFrom,\n insertedTo,\n authorId,\n context.timestamp,\n );\n finalRevisionId = revision.changeId;\n finalRevisions = {\n ...reviewState.document.review.revisions,\n [revision.changeId]: revision,\n };\n }\n\n const finalDocument: CanonicalDocumentEnvelope = {\n ...reviewState.document,\n review: {\n ...reviewState.document.review,\n revisions: finalRevisions,\n },\n };\n\n return createTransaction(\n {\n ...state,\n document: finalDocument,\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: {\n ...reviewState.effects,\n revisionAuthored: { changeId: finalRevisionId, kind: \"insertion\" },\n },\n },\n );\n }\n\n // Non-collapsed selection: mark selected text as deletion, insert new text after selection\n // Step 1: Insert new text at the end of the selection\n const insertSelection = createSelectionSnapshot(to, to);\n const result = insertText(state.document, insertSelection, text, { timestamp: context.timestamp });\n const insertedFrom = to;\n const insertedTo = to + Array.from(text).length;\n\n // Step 2: Remap existing review state through the mapping first\n const reviewState = remapReviewStateAfterContentChange(\n state,\n result.document,\n result.mapping,\n );\n\n // Step 3: Create deletion revision for the selected range (text stays in place).\n // Deletion range uses pre-mapping positions since content was not removed.\n const deletionRevision = createAuthoredRevision(\n reviewState.document.review.revisions,\n \"deletion\",\n from,\n to,\n authorId,\n context.timestamp,\n );\n\n // Step 4: Create insertion revision for the new text (positions already correct)\n const insertionRevision = createAuthoredRevision(\n {\n ...reviewState.document.review.revisions,\n [deletionRevision.changeId]: deletionRevision,\n },\n \"insertion\",\n insertedFrom,\n insertedTo,\n authorId,\n context.timestamp,\n );\n\n const finalDocument: CanonicalDocumentEnvelope = {\n ...reviewState.document,\n review: {\n ...reviewState.document.review,\n revisions: {\n ...reviewState.document.review.revisions,\n [deletionRevision.changeId]: deletionRevision,\n [insertionRevision.changeId]: insertionRevision,\n },\n },\n };\n\n // Move cursor to after inserted text\n const caretPos = insertedTo;\n\n return createTransaction(\n {\n ...state,\n document: finalDocument,\n selection: createSelectionSnapshot(caretPos, caretPos),\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: {\n ...reviewState.effects,\n revisionAuthored: { changeId: insertionRevision.changeId, kind: \"insertion\" },\n },\n },\n );\n}\n\nfunction applySuggestingDelete(\n state: EditorState,\n direction: \"backward\" | \"forward\",\n context: CommandExecutionContext,\n): EditorTransaction | undefined {\n if (state.readOnly) {\n return createTransaction(state, { historyBoundary: \"skip\", markDirty: false });\n }\n\n const authorId = context.defaultAuthorId ?? \"unknown\";\n const selection = state.selection;\n const from = Math.min(selection.anchor, selection.head);\n const to = Math.max(selection.anchor, selection.head);\n const isCollapsed = from === to;\n\n if (!isCollapsed && !isSingleParagraphSuggestingRange(state.document, from, to)) {\n return createSuggestingUnsupportedTransaction(\n state,\n \"Suggesting mode does not yet support multi-paragraph deletion ranges.\",\n );\n }\n\n let deleteFrom: number;\n let deleteTo: number;\n\n if (isCollapsed) {\n if (direction === \"backward\") {\n deleteFrom = Math.max(0, from - 1);\n deleteTo = from;\n } else {\n deleteFrom = from;\n deleteTo = from + 1;\n }\n } else {\n deleteFrom = from;\n deleteTo = to;\n }\n\n // Validate the deletion range doesn't cross protected content\n if (deleteFrom === deleteTo) {\n return createTransaction(state, { historyBoundary: \"skip\", markDirty: false });\n }\n\n // Check if the range overlaps an existing deletion revision from this suggesting session\n // If so, extend the existing revision rather than creating a new one\n const existingDeletion = findOverlappingAuthoredDeletion(\n state.document.review.revisions,\n deleteFrom,\n deleteTo,\n );\n\n if (existingDeletion) {\n // Extend the existing deletion revision to cover the new range\n const extendedFrom = Math.min(\n existingDeletion.anchor.kind === \"range\" ? existingDeletion.anchor.range.from : deleteFrom,\n deleteFrom,\n );\n const extendedTo = Math.max(\n existingDeletion.anchor.kind === \"range\" ? existingDeletion.anchor.range.to : deleteTo,\n deleteTo,\n );\n\n const updatedRevision: CanonicalRevisionRecord = {\n ...existingDeletion,\n anchor: {\n kind: \"range\",\n range: { from: extendedFrom, to: extendedTo },\n assoc: { start: 1, end: -1 },\n },\n };\n\n const nextDocument: CanonicalDocumentEnvelope = {\n ...state.document,\n updatedAt: context.timestamp,\n review: {\n ...state.document.review,\n revisions: {\n ...state.document.review.revisions,\n [updatedRevision.changeId]: updatedRevision,\n },\n },\n };\n\n const caretPos = direction === \"backward\" ? deleteFrom : deleteTo;\n\n return createTransaction(\n {\n ...state,\n document: nextDocument,\n selection: createSelectionSnapshot(caretPos, caretPos),\n },\n {\n historyBoundary: \"push\",\n markDirty: true,\n effects: {\n revisionAuthored: { changeId: updatedRevision.changeId, kind: \"deletion\" },\n },\n },\n );\n }\n\n // Create a new deletion revision — text stays in the document\n const revision = createAuthoredRevision(\n state.document.review.revisions,\n \"deletion\",\n deleteFrom,\n deleteTo,\n authorId,\n context.timestamp,\n );\n\n const nextDocument: CanonicalDocumentEnvelope = {\n ...state.document,\n updatedAt: context.timestamp,\n review: {\n ...state.document.review,\n revisions: {\n ...state.document.review.revisions,\n [revision.changeId]: revision,\n },\n },\n };\n\n const caretPos = direction === \"backward\" ? deleteFrom : deleteTo;\n\n return createTransaction(\n {\n ...state,\n document: nextDocument,\n selection: createSelectionSnapshot(caretPos, caretPos),\n },\n {\n historyBoundary: \"push\",\n markDirty: true,\n effects: {\n revisionAuthored: { changeId: revision.changeId, kind: \"deletion\" },\n },\n },\n );\n}\n\nfunction applySuggestingInsertUnit(\n state: EditorState,\n unitType: \"tab\" | \"hard_break\",\n context: CommandExecutionContext,\n): EditorTransaction | undefined {\n if (state.readOnly) {\n return createTransaction(state, { historyBoundary: \"skip\", markDirty: false });\n }\n\n const authorId = context.defaultAuthorId ?? \"unknown\";\n const selection = state.selection;\n const from = Math.min(selection.anchor, selection.head);\n const to = Math.max(selection.anchor, selection.head);\n\n if (from !== to && !isSingleParagraphSuggestingRange(state.document, from, to)) {\n return createSuggestingUnsupportedTransaction(\n state,\n \"Suggesting mode does not yet support multi-paragraph replacement ranges.\",\n );\n }\n\n // Insert the unit at the end of the selection (or at cursor if collapsed)\n const insertPos = to;\n const insertSelection = createSelectionSnapshot(insertPos, insertPos);\n const applyFn = unitType === \"tab\" ? insertTab : insertHardBreak;\n const result = applyFn(state.document, insertSelection, { timestamp: context.timestamp });\n\n // Remap existing review state first, before adding new revisions\n const reviewState = remapReviewStateAfterContentChange(\n state,\n result.document,\n result.mapping,\n );\n\n // If non-collapsed, mark selected range as deletion (positions are pre-mapping, content preserved)\n const deletionRevision = from !== to\n ? createAuthoredRevision(\n reviewState.document.review.revisions,\n \"deletion\",\n from,\n to,\n authorId,\n context.timestamp,\n )\n : undefined;\n\n // Create insertion revision for the single inserted unit (positions already correct)\n const insertionRevision = createAuthoredRevision(\n {\n ...reviewState.document.review.revisions,\n ...(deletionRevision ? { [deletionRevision.changeId]: deletionRevision } : {}),\n },\n \"insertion\",\n insertPos,\n insertPos + 1,\n authorId,\n context.timestamp,\n );\n\n const finalDocument: CanonicalDocumentEnvelope = {\n ...reviewState.document,\n review: {\n ...reviewState.document.review,\n revisions: {\n ...reviewState.document.review.revisions,\n ...(deletionRevision ? { [deletionRevision.changeId]: deletionRevision } : {}),\n [insertionRevision.changeId]: insertionRevision,\n },\n },\n };\n\n return createTransaction(\n {\n ...state,\n document: finalDocument,\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: {\n ...reviewState.effects,\n revisionAuthored: { changeId: insertionRevision.changeId, kind: \"insertion\" },\n },\n },\n );\n}\n\nfunction findOverlappingAuthoredDeletion(\n revisions: Record<string, CanonicalRevisionRecord>,\n from: number,\n to: number,\n): CanonicalRevisionRecord | undefined {\n for (const revision of Object.values(revisions)) {\n if (\n revision.kind === \"deletion\" &&\n revision.status === \"open\" &&\n revision.metadata?.source === \"runtime\" &&\n revision.anchor.kind === \"range\"\n ) {\n const revFrom = revision.anchor.range.from;\n const revTo = revision.anchor.range.to;\n // Adjacent or overlapping: the deletion is directly next to or overlapping the range\n if (\n (from >= revFrom && from <= revTo) ||\n (to >= revFrom && to <= revTo) ||\n (from === revTo) ||\n (to === revFrom)\n ) {\n return revision;\n }\n }\n }\n return undefined;\n}\n\n/**\n * Find an open authored insertion revision whose end position equals `cursorAt`.\n * Used to extend an existing insertion when the user keeps typing at the same\n * position rather than creating a new revision for every character.\n */\nfunction findAdjacentAuthoredInsertion(\n revisions: Record<string, CanonicalRevisionRecord>,\n cursorAt: number,\n): CanonicalRevisionRecord | undefined {\n for (const revision of Object.values(revisions)) {\n if (\n revision.kind === \"insertion\" &&\n revision.status === \"open\" &&\n revision.metadata?.source === \"runtime\" &&\n revision.anchor.kind === \"range\" &&\n revision.anchor.range.to === cursorAt\n ) {\n return revision;\n }\n }\n return undefined;\n}\n","import {\n type CompatibilityDiagnostics,\n type CompatibilityFeatureClass,\n type CompatibilityFeatureEntry,\n type EditorError,\n type EditorWarning,\n createDiagnostics,\n diagnosticsBlockExport,\n summarizeFeatureClasses,\n} from \"./diagnostics.ts\";\n\nexport const COMPATIBILITY_REPORT_VERSION = \"compatibility-report/1\" as const;\n\nexport const COMPATIBILITY_FEATURE_KEYS = [\n \"paragraphs\",\n \"runs\",\n \"whitespace\",\n \"headings\",\n \"lists\",\n \"restart-numbering\",\n \"tables\",\n \"merged-cells\",\n \"inline-images\",\n \"hyperlinks\",\n \"comments-single-paragraph\",\n \"comment-threads\",\n \"tracked-insertions\",\n \"tracked-deletions\",\n \"comments-multi-paragraph-ranges\",\n \"tracked-moves\",\n \"formatting-revisions\",\n \"structural-revisions\",\n \"sections\",\n \"headers-footers\",\n \"notes\",\n \"fields\",\n \"content-controls\",\n \"custom-xml\",\n \"alt-chunk\",\n \"embedded-objects\",\n \"floating-drawings\",\n \"alternate-content\",\n \"unknown-ooxml\",\n \"unknown-package-parts\",\n \"package-integrity\",\n \"relationship-integrity\",\n \"workflow-scopes\",\n] as const;\n\nexport type CompatibilityFeatureKey =\n (typeof COMPATIBILITY_FEATURE_KEYS)[number];\n\nexport interface CompatibilityReport<\n FeatureKey extends string = CompatibilityFeatureKey,\n FeatureClass extends CompatibilityFeatureClass = CompatibilityFeatureClass,\n> extends CompatibilityDiagnostics<FeatureKey, FeatureClass> {\n reportVersion: typeof COMPATIBILITY_REPORT_VERSION;\n generatedAt: string;\n blockExport: boolean;\n}\n\nexport interface CreateCompatibilityReportInput<\n FeatureKey extends string = CompatibilityFeatureKey,\n FeatureClass extends CompatibilityFeatureClass = CompatibilityFeatureClass,\n> extends Partial<CompatibilityDiagnostics<FeatureKey, FeatureClass>> {\n generatedAt: string;\n blockExport?: boolean;\n}\n\nexport interface CompatibilityReportSummary {\n generatedAt: string;\n blockExport: boolean;\n featureClassCounts: Record<CompatibilityFeatureClass, number>;\n warningCount: number;\n errorCount: number;\n}\n\nexport function createCompatibilityReport<\n FeatureKey extends string = CompatibilityFeatureKey,\n FeatureClass extends CompatibilityFeatureClass = CompatibilityFeatureClass,\n>(\n input: CreateCompatibilityReportInput<FeatureKey, FeatureClass>,\n): CompatibilityReport<FeatureKey, FeatureClass> {\n const diagnostics = createDiagnostics(input);\n\n return Object.freeze({\n reportVersion: COMPATIBILITY_REPORT_VERSION,\n generatedAt: input.generatedAt,\n blockExport: diagnosticsBlockExport(diagnostics, input.blockExport),\n featureEntries: diagnostics.featureEntries,\n warnings: diagnostics.warnings,\n errors: diagnostics.errors,\n });\n}\n\nexport function mergeCompatibilityReports<\n FeatureKey extends string = CompatibilityFeatureKey,\n FeatureClass extends CompatibilityFeatureClass = CompatibilityFeatureClass,\n>(\n reports: readonly CompatibilityReport<FeatureKey, FeatureClass>[],\n options: {\n generatedAt: string;\n blockExport?: boolean;\n },\n): CompatibilityReport<FeatureKey, FeatureClass> {\n return createCompatibilityReport({\n generatedAt: options.generatedAt,\n blockExport:\n options.blockExport ?? reports.some((report) => report.blockExport),\n featureEntries: flattenUnique(reports.flatMap((report) => report.featureEntries)),\n warnings: flattenUnique(reports.flatMap((report) => report.warnings)),\n errors: flattenUnique(reports.flatMap((report) => report.errors)),\n });\n}\n\nexport function summarizeCompatibilityReport<\n FeatureKey extends string = CompatibilityFeatureKey,\n FeatureClass extends CompatibilityFeatureClass = CompatibilityFeatureClass,\n>(\n report: CompatibilityReport<FeatureKey, FeatureClass>,\n): CompatibilityReportSummary {\n return {\n generatedAt: report.generatedAt,\n blockExport: report.blockExport,\n featureClassCounts: summarizeFeatureClasses(report.featureEntries),\n warningCount: report.warnings.length,\n errorCount: report.errors.length,\n };\n}\n\nexport function findFeatureEntry<\n FeatureKey extends string = CompatibilityFeatureKey,\n FeatureClass extends CompatibilityFeatureClass = CompatibilityFeatureClass,\n>(\n report: CompatibilityReport<FeatureKey, FeatureClass>,\n featureEntryId: string,\n): CompatibilityFeatureEntry<FeatureKey, FeatureClass> | undefined {\n return report.featureEntries.find(\n (featureEntry) => featureEntry.featureEntryId === featureEntryId,\n );\n}\n\nexport type {\n CompatibilityDiagnostics,\n CompatibilityFeatureClass,\n CompatibilityFeatureEntry,\n EditorError,\n EditorWarning,\n} from \"./diagnostics.ts\";\n\nfunction flattenUnique<Value extends object>(\n items: readonly Value[],\n): readonly Value[] {\n const deduped = new Map<string, Value>();\n\n for (const item of items) {\n deduped.set(JSON.stringify(item), item);\n }\n\n return Object.freeze([...deduped.values()]);\n}\n","import type {\n CommentSidebarSnapshot,\n EditorAnchorProjection,\n EditorStoryTarget,\n FieldSnapshot,\n ProtectionSnapshot,\n RuntimeRenderSnapshot,\n SurfaceBlockSnapshot,\n SurfaceInlineSegment,\n TrackedChangesSnapshot,\n WorkflowCandidateRange,\n WorkflowCandidateRangeOptions,\n WorkflowFieldMarkup,\n WorkflowHighlightMarkup,\n WorkflowMarkupItem,\n WorkflowMarkupSnapshot,\n WorkflowOpaqueFragmentMarkup,\n WorkflowProtectedRangeMarkup,\n WorkflowRevisionMarkup,\n WorkflowCommentMarkup,\n} from \"../api/public-types\";\nimport { MAIN_STORY_TARGET } from \"../core/selection/mapping.ts\";\nimport { searchSurfaceBlocks } from \"../core/search/search-text.ts\";\nimport { describeOpaqueFragment } from \"../preservation/store.ts\";\nimport type { CanonicalDocumentEnvelope } from \"../core/state/editor-state.ts\";\n\nconst BLOCKED_IMPORT_FEATURE_KEYS = new Set([\"alt-chunk\", \"alternate-content\", \"custom-xml\"]);\n\nexport function collectWorkflowMarkupSnapshot(input: {\n renderSnapshot: RuntimeRenderSnapshot;\n fieldSnapshot: FieldSnapshot;\n protectionSnapshot: ProtectionSnapshot;\n preservation: CanonicalDocumentEnvelope[\"preservation\"];\n}): WorkflowMarkupSnapshot {\n const highlights: WorkflowHighlightMarkup[] = [];\n const fields: WorkflowFieldMarkup[] = [];\n const opaqueFragments: WorkflowOpaqueFragmentMarkup[] = [];\n const surface = input.renderSnapshot.surface;\n\n if (surface) {\n collectSurfaceMarkup(\n surface.blocks,\n MAIN_STORY_TARGET,\n input.preservation,\n highlights,\n opaqueFragments,\n );\n for (const story of surface.secondaryStories) {\n collectSurfaceMarkup(\n story.blocks,\n story.target,\n input.preservation,\n highlights,\n opaqueFragments,\n );\n }\n\n fields.push(...collectFieldMarkup(surface, input.fieldSnapshot));\n }\n opaqueFragments.push(...collectOpaqueFragmentMarkup(input.preservation, opaqueFragments));\n\n const comments = input.renderSnapshot.comments.threads.map((thread): WorkflowCommentMarkup => ({\n markupId: `comment:${thread.commentId}`,\n kind: \"comment\",\n commentId: thread.commentId,\n anchor: thread.anchor,\n label: thread.anchorLabel,\n excerpt: thread.excerpt,\n status: thread.status,\n warningCount: thread.warningCount,\n entryCount: thread.entryCount,\n createdAt: thread.createdAt,\n createdBy: thread.createdBy,\n }));\n\n const revisions = input.renderSnapshot.trackedChanges.revisions.map(\n (revision): WorkflowRevisionMarkup => ({\n markupId: `revision:${revision.revisionId}`,\n kind: \"revision\",\n revisionId: revision.revisionId,\n revisionKind: revision.kind,\n anchor: revision.anchor,\n label: revision.label,\n excerpt: revision.excerpt,\n status: revision.status,\n actionability: revision.actionability,\n authorId: revision.authorId,\n createdAt: revision.createdAt,\n preserveOnlyReason: revision.preserveOnlyReason,\n }),\n );\n\n const protectedRanges = input.protectionSnapshot.ranges\n .filter(\n (range): range is typeof range & { start: number; end: number } =>\n typeof range.start === \"number\" && typeof range.end === \"number\",\n )\n .map(\n (range): WorkflowProtectedRangeMarkup => ({\n markupId: `protected-range:${range.rangeId}`,\n kind: \"protected_range\",\n rangeId: range.rangeId,\n anchor: createRangeAnchor(range.start, range.end),\n storyTarget: MAIN_STORY_TARGET,\n label: `Protected range ${range.rangeId}`,\n excerpt: range.enforcementReason,\n enforced: range.enforced,\n enforcementReason: range.enforcementReason,\n editorGroup: range.editorGroup,\n editor: range.editor,\n }),\n );\n\n const items: WorkflowMarkupItem[] = [\n ...highlights,\n ...comments,\n ...revisions,\n ...fields,\n ...protectedRanges,\n ...opaqueFragments,\n ];\n\n return {\n totalCount: items.length,\n items,\n highlights,\n comments,\n revisions,\n fields,\n protectedRanges,\n opaqueFragments,\n };\n}\n\nexport function deriveWorkflowCandidateRangesFromMarkup(\n snapshot: WorkflowMarkupSnapshot,\n options: WorkflowCandidateRangeOptions = {},\n): WorkflowCandidateRange[] {\n const allowedKinds = options.kinds ? new Set(options.kinds) : null;\n const includeDetached = options.includeDetached === true;\n\n return snapshot.items\n .filter((item) => (allowedKinds ? allowedKinds.has(item.kind) : true))\n .filter((item) => includeDetached || item.anchor.kind !== \"detached\")\n .map(\n (item): WorkflowCandidateRange => ({\n candidateId: item.markupId,\n storyTarget: item.storyTarget,\n anchor: item.anchor,\n label: item.label,\n source: options.source ?? \"host\",\n }),\n );\n}\n\nfunction collectSurfaceMarkup(\n blocks: readonly SurfaceBlockSnapshot[],\n storyTarget: EditorStoryTarget,\n preservation: CanonicalDocumentEnvelope[\"preservation\"],\n highlights: WorkflowHighlightMarkup[],\n opaqueFragments: WorkflowOpaqueFragmentMarkup[],\n): void {\n for (const block of blocks) {\n if (block.kind === \"paragraph\") {\n for (const segment of block.segments) {\n collectSegmentMarkup(segment, storyTarget, preservation, highlights, opaqueFragments);\n }\n continue;\n }\n\n if (block.kind === \"table\") {\n for (const row of block.rows) {\n for (const cell of row.cells) {\n collectSurfaceMarkup(cell.content, storyTarget, preservation, highlights, opaqueFragments);\n }\n }\n continue;\n }\n\n if (block.kind === \"sdt_block\") {\n collectSurfaceMarkup(block.children, storyTarget, preservation, highlights, opaqueFragments);\n continue;\n }\n\n const fragment = preservation.opaqueFragments[block.fragmentId];\n const descriptor = fragment ? describeOpaqueFragment(fragment) : null;\n const blockedReasonCode =\n fragment && BLOCKED_IMPORT_FEATURE_KEYS.has(descriptor?.featureKey ?? \"\")\n ? \"workflow_blocked_import\"\n : \"workflow_preserve_only\";\n opaqueFragments.push({\n markupId: `opaque:${block.fragmentId}`,\n kind: \"opaque_fragment\",\n fragmentId: block.fragmentId,\n warningId: block.warningId,\n anchor: createRangeAnchor(block.from, block.to),\n storyTarget,\n label: block.label,\n excerpt: block.detail,\n detail: block.detail,\n blockedReasonCode,\n });\n }\n}\n\nfunction collectSegmentMarkup(\n segment: SurfaceInlineSegment,\n storyTarget: EditorStoryTarget,\n preservation: CanonicalDocumentEnvelope[\"preservation\"],\n highlights: WorkflowHighlightMarkup[],\n opaqueFragments: WorkflowOpaqueFragmentMarkup[],\n): void {\n if (segment.kind === \"text\" && segment.markAttrs?.backgroundColor) {\n highlights.push({\n markupId: `highlight:${storyTargetKey(storyTarget)}:${segment.from}:${segment.to}:${segment.markAttrs.backgroundColor}`,\n kind: \"highlight\",\n anchor: createRangeAnchor(segment.from, segment.to),\n storyTarget,\n label: `Highlight ${segment.markAttrs.backgroundColor}`,\n excerpt: segment.text,\n color: segment.markAttrs.backgroundColor,\n text: segment.text,\n });\n return;\n }\n\n if (segment.kind === \"opaque_inline\") {\n const fragment = preservation.opaqueFragments[segment.fragmentId];\n const descriptor = fragment ? describeOpaqueFragment(fragment) : null;\n const blockedReasonCode =\n fragment && BLOCKED_IMPORT_FEATURE_KEYS.has(descriptor?.featureKey ?? \"\")\n ? \"workflow_blocked_import\"\n : \"workflow_preserve_only\";\n opaqueFragments.push({\n markupId: `opaque:${segment.fragmentId}`,\n kind: \"opaque_fragment\",\n fragmentId: segment.fragmentId,\n warningId: segment.warningId,\n anchor: createRangeAnchor(segment.from, segment.to),\n storyTarget,\n label: segment.label,\n excerpt: segment.detail,\n detail: segment.detail,\n blockedReasonCode,\n });\n }\n}\n\nfunction collectFieldMarkup(\n surface: RuntimeRenderSnapshot[\"surface\"],\n fieldSnapshot: FieldSnapshot,\n): WorkflowFieldMarkup[] {\n if (!surface) {\n return [];\n }\n\n const stories = [\n { blocks: surface.blocks, storyTarget: MAIN_STORY_TARGET },\n ...surface.secondaryStories.map((story) => ({\n blocks: story.blocks,\n storyTarget: story.target,\n })),\n ];\n\n return fieldSnapshot.fields.flatMap((field) => {\n const displayText = field.displayText.trim();\n if (!displayText) {\n return [];\n }\n\n for (const story of stories) {\n const matches = searchSurfaceBlocks(story.blocks, displayText, { limit: 2 });\n if (matches.length === 1) {\n const match = matches[0]!;\n return [\n {\n markupId: `field:${field.index}`,\n kind: \"field\",\n anchor: createRangeAnchor(match.from, match.to),\n storyTarget: story.storyTarget,\n label: displayText,\n excerpt: field.instruction,\n fieldIndex: field.index,\n fieldFamily: field.fieldFamily,\n fieldTarget: field.fieldTarget,\n refreshStatus: field.refreshStatus,\n displayText: field.displayText,\n } satisfies WorkflowFieldMarkup,\n ];\n }\n }\n\n return [];\n });\n}\n\nfunction collectOpaqueFragmentMarkup(\n preservation: CanonicalDocumentEnvelope[\"preservation\"],\n existing: WorkflowOpaqueFragmentMarkup[],\n): WorkflowOpaqueFragmentMarkup[] {\n const seen = new Set(existing.map((item) => item.fragmentId));\n\n return Object.values(preservation.opaqueFragments)\n .filter(\n (fragment) =>\n !seen.has(fragment.fragmentId)\n && fragment.packagePartName === \"/word/document.xml\",\n )\n .map((fragment) => {\n const descriptor = describeOpaqueFragment(fragment);\n const blockedReasonCode = BLOCKED_IMPORT_FEATURE_KEYS.has(descriptor.featureKey)\n ? \"workflow_blocked_import\"\n : \"workflow_preserve_only\";\n\n return {\n markupId: `opaque:${fragment.fragmentId}`,\n kind: \"opaque_fragment\",\n fragmentId: fragment.fragmentId,\n warningId: fragment.warningId,\n anchor: createRangeAnchor(fragment.lastKnownRange.from, fragment.lastKnownRange.to),\n storyTarget: MAIN_STORY_TARGET,\n label: descriptor.label,\n excerpt: descriptor.detail,\n detail: descriptor.detail,\n blockedReasonCode,\n } satisfies WorkflowOpaqueFragmentMarkup;\n });\n}\n\nfunction createRangeAnchor(from: number, to: number): EditorAnchorProjection {\n return {\n kind: \"range\",\n from,\n to,\n assoc: {\n start: -1,\n end: 1,\n },\n };\n}\n\nfunction storyTargetKey(storyTarget: EditorStoryTarget): string {\n switch (storyTarget.kind) {\n case \"main\":\n return \"main\";\n case \"header\":\n case \"footer\":\n return `${storyTarget.kind}:${storyTarget.relationshipId}:${storyTarget.variant}:${storyTarget.sectionIndex ?? \"none\"}`;\n case \"footnote\":\n case \"endnote\":\n return `${storyTarget.kind}:${storyTarget.noteId}`;\n }\n}\n","import {\n createEditorState,\n createPersistedEditorSnapshot,\n deriveDocumentStats,\n createSelectionSnapshot,\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 DocumentMode,\n DocumentNavigationSnapshot,\n EditorSessionState,\n EditorAnchorProjection,\n EditorError,\n EditorStoryTarget,\n EditorViewStateSnapshot,\n EditorWarning,\n FieldEntrySnapshot,\n FieldSnapshot,\n HeaderFooterLinkPatch,\n ExportDocxOptions,\n ExportResult,\n HostAnnotationOverlay,\n HostAnnotationSnapshot,\n InteractionGuardSnapshot,\n PageLayoutSnapshot,\n PersistedEditorSnapshot,\n ProtectionSnapshot,\n RuntimeRenderSnapshot,\n SelectionSnapshot,\n StyleCatalogSnapshot,\n TocRefreshOptions,\n TocRefreshResult,\n TrackedChangeEntrySnapshot,\n TrackedChangesSnapshot,\n UpdateFieldsOptions,\n UpdateFieldsResult,\n ViewMode,\n WorkflowCandidateRange,\n WorkflowCandidateRangeOptions,\n WorkflowBlockedCommandReason,\n WorkflowMarkupSnapshot,\n WorkflowOverlay,\n WorkflowScopeSnapshot,\n WorkspaceMode,\n WordReviewEditorEvent,\n ZoomLevel,\n} from \"../api/public-types\";\nimport {\n editorSessionStateFromPersistedSnapshot,\n persistedSnapshotFromEditorSessionState,\n} from \"../api/session-state.ts\";\nimport {\n executeEditorCommand,\n selectionChanged,\n type CommandOrigin,\n type EditorCommand,\n type EditorTransaction,\n} from \"../core/commands/index.ts\";\nimport {\n createDetachedAnchor,\n createEmptyMapping,\n createNodeAnchor,\n createRangeAnchor,\n mapRange,\n MAIN_STORY_TARGET,\n storyTargetsEqual,\n type EditorAnchorProjection as InternalEditorAnchorProjection,\n} from \"../core/selection/mapping.ts\";\nimport { canCreateDocxCommentAnchor } from \"../core/selection/review-anchors.ts\";\nimport { buildBookmarkNameMap } from \"../legal/bookmarks.ts\";\nimport {\n describeOpaqueFragment,\n findOpaqueFragmentsIntersectingRange,\n} from \"../preservation/store.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 { mergeCompatibilityReports } from \"../validation/compatibility-report.ts\";\nimport { createEditorSurfaceSnapshot } from \"./surface-projection.ts\";\nimport {\n collectWorkflowMarkupSnapshot,\n deriveWorkflowCandidateRangesFromMarkup,\n} from \"./workflow-markup.ts\";\nimport {\n createDocumentNavigationSnapshot,\n findPageForOffset,\n} from \"./document-navigation.ts\";\nimport {\n buildPageLayoutSnapshot,\n buildResolvedSections,\n resolveActiveSection,\n} from \"./document-layout.ts\";\nimport { normalizeHeaderFooterTarget } from \"./story-context.ts\";\nimport {\n getStoryBlocks,\n replaceStoryBlocks,\n storyTargetKey,\n} from \"./story-targeting.ts\";\nimport {\n createViewState,\n setViewMode as applyViewMode,\n setDocumentMode as applyDocumentMode,\n setWorkspaceMode as applyWorkspaceMode,\n setZoomLevel as applyZoomLevel,\n setFocused as applyFocused,\n setCaretAffinity as applyCaretAffinity,\n setActivePageRegion as applyActivePageRegion,\n setActiveObjectFrame as applyActiveObjectFrame,\n createEditorViewStateSnapshot,\n type ViewState,\n} from \"./view-state.ts\";\nimport type {\n BlockNode,\n FieldNode,\n FieldRefreshStatus,\n InlineNode,\n PageMargins,\n ParagraphNode,\n SubPartsCatalog,\n} from \"../model/canonical-document.ts\";\nimport {\n buildFieldRegistry,\n isSupportedFieldFamily,\n parseTocLevelRange,\n resolveRefFieldText,\n} from \"../io/ooxml/parse-fields.ts\";\nimport {\n incrementInvalidationCounter,\n recordPerfSample,\n} from \"../ui-tailwind/editor-surface/perf-probe.ts\";\n\nexport type Unsubscribe = () => void;\n\ntype RuntimeReadySource = \"docx\" | \"session\" | \"snapshot\" | \"datastore\" | \"canonical\";\n\nexport type DocumentRuntimeEvent =\n | (Omit<Extract<WordReviewEditorEvent, { type: \"ready\" }>, \"source\"> & {\n source: RuntimeReadySource;\n })\n | Exclude<WordReviewEditorEvent, { type: \"ready\" }>;\n\nexport type ActiveStoryTextCommand =\n | Extract<EditorCommand, { type: \"text.insert\" }>\n | Extract<EditorCommand, { type: \"text.delete-backward\" }>\n | Extract<EditorCommand, { type: \"text.delete-forward\" }>\n | Extract<EditorCommand, { type: \"text.insert-tab\" }>\n | Extract<EditorCommand, { type: \"text.insert-hard-break\" }>\n | Extract<EditorCommand, { type: \"paragraph.split\" }>;\n\nexport interface DocumentRuntime {\n subscribe(listener: () => void): Unsubscribe;\n subscribeToEvents(listener: (event: DocumentRuntimeEvent) => void): Unsubscribe;\n getRenderSnapshot(): RuntimeRenderSnapshot;\n getCanonicalDocument(): CanonicalDocumentEnvelope;\n getSourcePackage(): EditorSessionState[\"sourcePackage\"] | undefined;\n replaceText(text: string, target?: EditorAnchorProjection): void;\n applyActiveStoryTextCommand(command: ActiveStoryTextCommand): void;\n dispatch(command: EditorCommand): void;\n emitBlockedCommand(command: string, reasons: WorkflowBlockedCommandReason[]): void;\n undo(): void;\n redo(): void;\n focus(): void;\n blur(): void;\n setDefaultAuthorId?(authorId?: string): 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 openStory(target: EditorStoryTarget): boolean;\n closeStory(): void;\n getActiveStory(): EditorStoryTarget;\n getViewState(): EditorViewStateSnapshot;\n setViewMode(mode: ViewMode): void;\n setDocumentMode(mode: DocumentMode): void;\n getProtectionSnapshot(): ProtectionSnapshot;\n setWorkspaceMode(mode: WorkspaceMode): void;\n setZoom(level: ZoomLevel): void;\n getPageLayoutSnapshot(): PageLayoutSnapshot | null;\n getDocumentNavigationSnapshot(): DocumentNavigationSnapshot;\n getFieldSnapshot(): FieldSnapshot;\n updateFields(options?: UpdateFieldsOptions): UpdateFieldsResult;\n updateTableOfContents(options?: TocRefreshOptions): TocRefreshResult;\n getSessionState(): EditorSessionState;\n getPersistedSnapshot(): PersistedEditorSnapshot;\n getCompatibilityReport(): CompatibilityReport;\n getWarnings(): EditorWarning[];\n exportDocx(options?: ExportDocxOptions): Promise<ExportResult>;\n setWorkflowOverlay(overlay: WorkflowOverlay): void;\n clearWorkflowOverlay(): void;\n getWorkflowScopeSnapshot(): WorkflowScopeSnapshot | null;\n getInteractionGuardSnapshot(): InteractionGuardSnapshot;\n getWorkflowMarkupSnapshot(): WorkflowMarkupSnapshot;\n setHostAnnotationOverlay(overlay: HostAnnotationOverlay): void;\n clearHostAnnotationOverlay(): void;\n getHostAnnotationSnapshot(): HostAnnotationSnapshot;\n getWorkflowCandidateRanges(options?: WorkflowCandidateRangeOptions): WorkflowCandidateRange[];\n replaceWorkflowMarkupText(markupId: string, text: string): void;\n}\n\nexport interface CreateDocumentRuntimeOptions {\n documentId: string;\n initialSessionState?: EditorSessionState;\n initialSnapshot?: PersistedEditorSnapshot;\n initialCanonicalDocument?: CanonicalDocumentEnvelope;\n sourceLabel?: string;\n sourceKind?: RuntimeReadySource;\n readOnly?: boolean;\n editorBuild?: string;\n defaultAuthorId?: string;\n fatalError?: EditorError;\n clock?: () => string;\n exportDocx?: (\n sessionState: EditorSessionState,\n options?: ExportDocxOptions,\n ) => Promise<ExportResult>;\n onEvent?: (event: DocumentRuntimeEvent) => void;\n onWarning?: (warning: EditorWarning) => void;\n onError?: (error: EditorError) => void;\n initialViewState?: Partial<ViewState>;\n protectionSnapshot?: ProtectionSnapshot;\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 let defaultAuthorId = options.defaultAuthorId;\n const sessionId = createSessionId(options.documentId, clock());\n const listeners = new Set<() => void>();\n const eventListeners = new Set<(event: DocumentRuntimeEvent) => void>();\n const history: HistoryState = {\n past: [],\n future: [],\n };\n\n let activeStory: EditorStoryTarget = MAIN_STORY_TARGET;\n const storySelections = new Map<string, EditorState[\"selection\"]>();\n let viewState: ViewState = createViewState(options.initialViewState);\n let protectionSnapshot: ProtectionSnapshot =\n options.protectionSnapshot ??\n options.initialSessionState?.protectionSnapshot ??\n options.initialSnapshot?.protectionSnapshot ?? {\n hasDocumentProtection: false,\n enforcementActive: false,\n ranges: [],\n enforcedRangeCount: 0,\n preservedRangeCount: 0,\n };\n let workflowOverlay: WorkflowOverlay | null = null;\n let hostAnnotationOverlay: HostAnnotationOverlay | null = null;\n const initialPersistedSnapshot = options.initialSessionState\n ? persistedSnapshotFromEditorSessionState(options.initialSessionState, {\n savedAt: options.initialSessionState.updatedAt,\n })\n : options.initialSnapshot;\n\n let state = createEditorState({\n documentId: options.documentId,\n sessionId,\n sourceLabel: options.sourceLabel,\n readOnly: options.readOnly,\n persistedSnapshot: initialPersistedSnapshot as never,\n canonicalDocument: options.initialCanonicalDocument,\n fatalError: options.fatalError as never,\n });\n storySelections.set(storyTargetKey(MAIN_STORY_TARGET), state.selection);\n let cachedSurface:\n | {\n revisionToken: string;\n activeStoryKey: string;\n snapshot: RuntimeRenderSnapshot[\"surface\"];\n }\n | undefined;\n let cachedCompatibility:\n | {\n revisionToken: string;\n warnings: EditorState[\"warnings\"];\n fatalError: EditorState[\"fatalError\"];\n report: RuntimeRenderSnapshot[\"compatibility\"];\n }\n | undefined;\n let cachedComments:\n | {\n comments: CanonicalDocumentEnvelope[\"review\"][\"comments\"];\n activeCommentId: EditorState[\"runtime\"][\"activeCommentId\"];\n snapshot: CommentSidebarSnapshot;\n }\n | undefined;\n let cachedTrackedChanges:\n | {\n revisions: CanonicalDocumentEnvelope[\"review\"][\"revisions\"];\n revisionToken: string;\n snapshot: TrackedChangesSnapshot;\n }\n | undefined;\n let cachedPageLayout:\n | {\n revisionToken: string;\n activeStoryKey: string;\n activeSectionIndex: number | string;\n snapshot: PageLayoutSnapshot | null;\n }\n | undefined;\n let cachedNavigation:\n | {\n revisionToken: string;\n activeStoryKey: string;\n selectionHead: number;\n snapshot: DocumentNavigationSnapshot;\n }\n | undefined;\n let cachedViewStateSnapshot:\n | {\n revisionToken: string;\n activeStoryKey: string;\n selection: EditorState[\"selection\"];\n viewStateRef: ViewState;\n pageLayout: PageLayoutSnapshot | null | undefined;\n snapshot: EditorViewStateSnapshot;\n }\n | undefined;\n let cachedInteractionGuardSnapshot:\n | {\n revisionToken: string;\n activeStoryKey: string;\n selection: EditorState[\"selection\"];\n readOnly: boolean;\n documentMode: DocumentMode;\n protectionSnapshot: ProtectionSnapshot;\n workflowOverlay: WorkflowOverlay | null;\n snapshot: InteractionGuardSnapshot;\n }\n | undefined;\n let cachedWorkflowScopeSnapshot:\n | {\n workflowOverlay: WorkflowOverlay;\n interactionGuardSnapshot: InteractionGuardSnapshot;\n snapshot: WorkflowScopeSnapshot;\n }\n | undefined;\n let cachedWorkflowMarkupSnapshot:\n | {\n revisionToken: string;\n activeStoryKey: string;\n protectionSnapshot: ProtectionSnapshot;\n preservation: CanonicalDocumentEnvelope[\"preservation\"];\n snapshot: WorkflowMarkupSnapshot;\n }\n | undefined;\n\n function getCachedSurface(\n document: CanonicalDocumentEnvelope,\n nextActiveStory: EditorStoryTarget,\n ): RuntimeRenderSnapshot[\"surface\"] {\n const activeStoryKey = storyTargetKey(nextActiveStory);\n if (\n cachedSurface &&\n cachedSurface.revisionToken === state.revisionToken &&\n cachedSurface.activeStoryKey === activeStoryKey\n ) {\n return cachedSurface.snapshot;\n }\n\n const snapshot = createEditorSurfaceSnapshot(document, state.selection, nextActiveStory);\n recordPerfSample(\"snapshot.surface\");\n incrementInvalidationCounter(\"runtime.snapshot.surfaceMisses\");\n cachedSurface = {\n revisionToken: state.revisionToken,\n activeStoryKey,\n snapshot,\n };\n return snapshot;\n }\n\n function getCachedCompatibilityReport(\n nextState: EditorState,\n ): RuntimeRenderSnapshot[\"compatibility\"] {\n if (\n cachedCompatibility &&\n cachedCompatibility.revisionToken === nextState.revisionToken &&\n cachedCompatibility.warnings === nextState.warnings &&\n cachedCompatibility.fatalError === nextState.fatalError\n ) {\n return cachedCompatibility.report;\n }\n\n const derived = createDerivedCompatibility(nextState);\n recordPerfSample(\"snapshot.compatibility\");\n incrementInvalidationCounter(\"runtime.snapshot.compatibilityMisses\");\n const report = {\n blockExport: derived.blockExport,\n blockExportReasons: listBlockExportReasons(derived),\n warningCount: derived.warnings.length,\n errorCount: derived.errors.length,\n featureEntries: derived.featureEntries.map((entry) =>\n toPublicCompatibilityFeatureEntry(entry),\n ),\n };\n cachedCompatibility = {\n revisionToken: nextState.revisionToken,\n warnings: nextState.warnings,\n fatalError: nextState.fatalError,\n report,\n };\n return report;\n }\n\n function getCachedCommentSidebarSnapshot(nextState: EditorState): CommentSidebarSnapshot {\n if (\n cachedComments &&\n cachedComments.comments === nextState.document.review.comments &&\n cachedComments.activeCommentId === nextState.runtime.activeCommentId\n ) {\n return cachedComments.snapshot;\n }\n\n const snapshot = toPublicCommentSidebarSnapshot(nextState);\n cachedComments = {\n comments: nextState.document.review.comments,\n activeCommentId: nextState.runtime.activeCommentId,\n snapshot,\n };\n return snapshot;\n }\n\n function getCachedTrackedChangesSnapshot(\n nextState: EditorState,\n _surface: RuntimeRenderSnapshot[\"surface\"],\n ): TrackedChangesSnapshot {\n if (\n cachedTrackedChanges &&\n cachedTrackedChanges.revisions === nextState.document.review.revisions &&\n cachedTrackedChanges.revisionToken === nextState.revisionToken\n ) {\n return cachedTrackedChanges.snapshot;\n }\n\n const snapshot = toPublicTrackedChangesSnapshot(nextState);\n cachedTrackedChanges = {\n revisions: nextState.document.review.revisions,\n revisionToken: nextState.revisionToken,\n snapshot,\n };\n return snapshot;\n }\n\n function getCachedDocumentNavigationSnapshot(\n nextState: EditorState,\n nextActiveStory: EditorStoryTarget,\n ): DocumentNavigationSnapshot {\n const activeStoryKey = storyTargetKey(nextActiveStory);\n if (\n cachedNavigation &&\n cachedNavigation.revisionToken === nextState.revisionToken &&\n cachedNavigation.activeStoryKey === activeStoryKey\n ) {\n if (cachedNavigation.selectionHead === nextState.selection.head) {\n return cachedNavigation.snapshot;\n }\n\n const snapshot = createDocumentNavigationSnapshot(\n nextState.document,\n nextState.selection.head,\n nextActiveStory,\n );\n if (\n snapshot.activePageIndex === cachedNavigation.snapshot.activePageIndex &&\n snapshot.activeSectionIndex === cachedNavigation.snapshot.activeSectionIndex\n ) {\n cachedNavigation = {\n revisionToken: nextState.revisionToken,\n activeStoryKey,\n selectionHead: nextState.selection.head,\n snapshot: cachedNavigation.snapshot,\n };\n return cachedNavigation.snapshot;\n }\n cachedNavigation = {\n revisionToken: nextState.revisionToken,\n activeStoryKey,\n selectionHead: nextState.selection.head,\n snapshot,\n };\n return snapshot;\n }\n\n const snapshot = createDocumentNavigationSnapshot(\n nextState.document,\n nextState.selection.head,\n nextActiveStory,\n );\n recordPerfSample(\"snapshot.navigation\");\n incrementInvalidationCounter(\"runtime.snapshot.navigationMisses\");\n cachedNavigation = {\n revisionToken: nextState.revisionToken,\n activeStoryKey,\n selectionHead: nextState.selection.head,\n snapshot,\n };\n return snapshot;\n }\n\n function resolvePageLayoutActiveSectionIndex(\n nextState: EditorState,\n nextActiveStory: EditorStoryTarget,\n ): number | string {\n if (nextActiveStory.kind === \"main\") {\n return getCachedDocumentNavigationSnapshot(nextState, nextActiveStory).activeSectionIndex;\n }\n\n if (\"sectionIndex\" in nextActiveStory && typeof nextActiveStory.sectionIndex === \"number\") {\n return nextActiveStory.sectionIndex;\n }\n\n return storyTargetKey(nextActiveStory);\n }\n\n function getCachedPageLayoutSnapshot(\n nextState: EditorState,\n nextActiveStory: EditorStoryTarget,\n ): PageLayoutSnapshot | null {\n const activeStoryKey = storyTargetKey(nextActiveStory);\n const activeSectionIndex = resolvePageLayoutActiveSectionIndex(\n nextState,\n nextActiveStory,\n );\n if (\n cachedPageLayout &&\n cachedPageLayout.revisionToken === nextState.revisionToken &&\n cachedPageLayout.activeStoryKey === activeStoryKey &&\n cachedPageLayout.activeSectionIndex === activeSectionIndex\n ) {\n return cachedPageLayout.snapshot;\n }\n\n const snapshot = derivePageLayoutSnapshot(nextState, nextActiveStory, storySelections);\n cachedPageLayout = {\n revisionToken: nextState.revisionToken,\n activeStoryKey,\n activeSectionIndex,\n snapshot,\n };\n return snapshot;\n }\n\n function evaluateWorkflowBlockedReasons(\n selection: EditorState[\"selection\"],\n commandType?: string,\n ): WorkflowBlockedCommandReason[] {\n const reasons: WorkflowBlockedCommandReason[] = [];\n const selectionBounds = {\n from: Math.min(selection.anchor, selection.head),\n to: Math.max(selection.anchor, selection.head),\n };\n const selectionRange = expandSelectionRange(selectionBounds);\n const opaqueReason = deriveOpaqueWorkflowBlockedReason(selectionRange);\n\n if (opaqueReason) {\n reasons.push(opaqueReason);\n }\n\n if (state.readOnly) {\n reasons.push({\n code: \"document_read_only\",\n message: \"Document is in read-only mode.\",\n });\n }\n\n if (viewState.documentMode === \"viewing\") {\n reasons.push({\n code: \"document_viewing_mode\",\n message: \"Document is in viewing mode.\",\n });\n }\n\n if (\n isBlockedByProtection(protectionSnapshot, selection)\n ) {\n reasons.push({\n code: \"protected_range\",\n message: \"Selection falls within a protected range.\",\n });\n }\n\n const effectiveDocumentMode = getEffectiveDocumentMode(selection);\n\n if (effectiveDocumentMode === \"suggesting\" && commandType) {\n if (\n activeStory.kind !== \"main\" &&\n SUGGESTING_SECONDARY_STORY_UNSUPPORTED_COMMANDS.has(commandType)\n ) {\n reasons.push({\n code: \"suggesting_unsupported\",\n message: \"Suggesting mode is not yet export-safe in this story.\",\n });\n }\n if (SUGGESTING_UNSUPPORTED_COMMANDS.has(commandType)) {\n reasons.push({\n code: \"suggesting_unsupported\",\n message: `\"${commandType}\" is not supported in suggesting mode.`,\n });\n }\n }\n\n if (workflowOverlay) {\n const matchingScope = getMatchingWorkflowScope(selection);\n\n if (!matchingScope && workflowOverlay.scopes.length > 0) {\n reasons.push({\n code: \"outside_workflow_scope\",\n message: \"Selection is outside any active workflow scope.\",\n });\n } else if (matchingScope) {\n if (matchingScope.mode === \"comment\") {\n const isCommentCommand =\n commandType?.startsWith(\"comment.\") ?? false;\n if (!isCommentCommand) {\n reasons.push({\n code: \"workflow_comment_only\",\n message: `Scope \"${matchingScope.label ?? matchingScope.scopeId}\" allows comments only.`,\n scopeId: matchingScope.scopeId,\n workItemId: matchingScope.workItemId,\n });\n }\n } else if (matchingScope.mode === \"view\") {\n reasons.push({\n code: \"workflow_view_only\",\n message: `Scope \"${matchingScope.label ?? matchingScope.scopeId}\" is view-only.`,\n scopeId: matchingScope.scopeId,\n workItemId: matchingScope.workItemId,\n });\n }\n }\n }\n\n return reasons;\n }\n\n function getMatchingWorkflowScope(\n selection: EditorState[\"selection\"],\n ): WorkflowOverlay[\"scopes\"][number] | null {\n if (!workflowOverlay) {\n return null;\n }\n\n const selectionBounds = {\n from: Math.min(selection.anchor, selection.head),\n to: Math.max(selection.anchor, selection.head),\n };\n const activeScopes = getEffectiveWorkflowScopes(workflowOverlay);\n return activeScopes.find((scope) => {\n if (scope.anchor.kind === \"detached\") return false;\n const scopeFrom = scope.anchor.kind === \"range\" ? scope.anchor.from : scope.anchor.at;\n const scopeTo = scope.anchor.kind === \"range\" ? scope.anchor.to : scope.anchor.at;\n return selectionBounds.from >= scopeFrom && selectionBounds.to <= scopeTo;\n }) ?? null;\n }\n\n function getEffectiveDocumentMode(\n selection: EditorState[\"selection\"],\n ): DocumentMode {\n if (viewState.documentMode === \"viewing\") {\n return \"viewing\";\n }\n const matchingScope = getMatchingWorkflowScope(selection);\n if (matchingScope?.mode === \"suggest\") {\n return \"suggesting\";\n }\n return viewState.documentMode;\n }\n\n function expandSelectionRange(\n range: { from: number; to: number },\n ): { from: number; to: number } {\n return {\n from: range.from,\n to: range.to > range.from ? range.to : range.from + 1,\n };\n }\n\n function deriveOpaqueWorkflowBlockedReason(\n range: { from: number; to: number },\n ): WorkflowBlockedCommandReason | null {\n const targetPartPath = getStoryTargetOpaquePartPath(activeStory);\n if (!targetPartPath) {\n return null;\n }\n const fragments = findOpaqueFragmentsIntersectingRange(\n state.document.preservation,\n range,\n ).filter((fragment) => fragment.packagePartName === targetPartPath);\n\n if (fragments.length === 0) {\n return null;\n }\n\n const blockedImportFeatureKeys = new Set([\n \"alt-chunk\",\n \"alternate-content\",\n \"custom-xml\",\n ]);\n const blockedImportFragment =\n fragments.find((fragment) =>\n blockedImportFeatureKeys.has(describeOpaqueFragment(fragment).featureKey),\n ) ?? null;\n const fragment = blockedImportFragment ?? fragments[0]!;\n const descriptor = describeOpaqueFragment(fragment);\n const isBlockedImport = blockedImportFragment !== null;\n\n return {\n code: isBlockedImport ? \"workflow_blocked_import\" : \"workflow_preserve_only\",\n message: isBlockedImport\n ? `${descriptor.label} remains a blocked import and cannot be edited.`\n : `${descriptor.label} remains preserve-only and cannot be edited.`,\n anchor: toPublicAnchorProjection(\n createRangeAnchor(fragment.lastKnownRange.from, fragment.lastKnownRange.to, {\n start: -1,\n end: 1,\n }),\n ),\n storyTarget: activeStory,\n };\n }\n\n function getStoryTargetOpaquePartPath(storyTarget: EditorStoryTarget): string | null {\n if (storyTarget.kind === \"main\") {\n return \"/word/document.xml\";\n }\n if (storyTarget.kind === \"header\") {\n return state.document.subParts?.headers.find(\n (header) =>\n header.relationshipId === storyTarget.relationshipId\n && header.variant === storyTarget.variant\n && header.sectionIndex === storyTarget.sectionIndex,\n )?.partPath ?? null;\n }\n if (storyTarget.kind === \"footer\") {\n return state.document.subParts?.footers.find(\n (footer) =>\n footer.relationshipId === storyTarget.relationshipId\n && footer.variant === storyTarget.variant\n && footer.sectionIndex === storyTarget.sectionIndex,\n )?.partPath ?? null;\n }\n if (storyTarget.kind === \"footnote\") {\n return \"/word/footnotes.xml\";\n }\n if (storyTarget.kind === \"endnote\") {\n return \"/word/endnotes.xml\";\n }\n return null;\n }\n\n function deriveWorkflowScopeSnapshot(): WorkflowScopeSnapshot | null {\n if (!workflowOverlay) return null;\n const blockedReasons = getCachedInteractionGuardSnapshot().blockedReasons;\n const activeItem = workflowOverlay.activeWorkItemId\n ? workflowOverlay.workItems?.find(\n (item) => item.workItemId === workflowOverlay!.activeWorkItemId,\n )\n : undefined;\n return {\n overlayPresent: true,\n activeWorkItemId: workflowOverlay.activeWorkItemId ?? null,\n activeWorkItem: activeItem,\n scopes: workflowOverlay.scopes,\n candidates: workflowOverlay.candidates ?? [],\n blockedReasons,\n };\n }\n\n function deriveHostAnnotationSnapshot(): HostAnnotationSnapshot {\n return {\n totalCount: hostAnnotationOverlay?.annotations.length ?? 0,\n annotations: structuredClone(hostAnnotationOverlay?.annotations ?? []),\n };\n }\n\n function getEffectiveWorkflowScopes(overlay: WorkflowOverlay): WorkflowOverlay[\"scopes\"] {\n const activeWorkItemId = overlay.activeWorkItemId ?? null;\n const activeWorkItemScopeIds =\n activeWorkItemId === null\n ? null\n : new Set(\n overlay.workItems?.find((item) => item.workItemId === activeWorkItemId)?.scopeIds ?? [],\n );\n\n return overlay.scopes.filter((scope) => {\n const scopeStoryTarget = scope.storyTarget ?? MAIN_STORY_TARGET;\n if (!storyTargetsEqual(scopeStoryTarget, activeStory)) {\n return false;\n }\n\n if (activeWorkItemId === null) {\n return true;\n }\n\n return (\n scope.workItemId === activeWorkItemId ||\n activeWorkItemScopeIds?.has(scope.scopeId) === true\n );\n });\n }\n\n function getCachedInteractionGuardSnapshot(): InteractionGuardSnapshot {\n const activeStoryKey = storyTargetKey(activeStory);\n if (\n cachedInteractionGuardSnapshot &&\n cachedInteractionGuardSnapshot.revisionToken === state.revisionToken &&\n cachedInteractionGuardSnapshot.activeStoryKey === activeStoryKey &&\n cachedInteractionGuardSnapshot.selection === state.selection &&\n cachedInteractionGuardSnapshot.readOnly === state.readOnly &&\n cachedInteractionGuardSnapshot.documentMode === viewState.documentMode &&\n cachedInteractionGuardSnapshot.protectionSnapshot === protectionSnapshot &&\n cachedInteractionGuardSnapshot.workflowOverlay === workflowOverlay\n ) {\n return cachedInteractionGuardSnapshot.snapshot;\n }\n\n const blockedReasons = evaluateWorkflowBlockedReasons(state.selection);\n const matchingScope = getMatchingWorkflowScope(state.selection);\n const primaryBlockedReason = blockedReasons[0];\n const snapshot: InteractionGuardSnapshot = {\n effectiveMode: primaryBlockedReason\n ? (\n primaryBlockedReason.code === \"workflow_comment_only\"\n ? \"comment\"\n : primaryBlockedReason.code === \"workflow_view_only\"\n ? \"view\"\n : \"blocked\"\n )\n : getEffectiveDocumentMode(state.selection) === \"suggesting\"\n ? \"suggest\"\n : matchingScope?.mode ?? \"edit\",\n ...(matchingScope?.scopeId ? { matchedScopeId: matchingScope.scopeId } : {}),\n ...(matchingScope?.mode ? { matchedScopeMode: matchingScope.mode } : {}),\n ...(primaryBlockedReason ? { disabledReason: primaryBlockedReason.message } : {}),\n blockedReasons,\n };\n cachedInteractionGuardSnapshot = {\n revisionToken: state.revisionToken,\n activeStoryKey,\n selection: state.selection,\n readOnly: state.readOnly,\n documentMode: viewState.documentMode,\n protectionSnapshot,\n workflowOverlay,\n snapshot,\n };\n return snapshot;\n }\n\n function getCachedWorkflowScopeSnapshot(): WorkflowScopeSnapshot | null {\n if (!workflowOverlay) {\n return null;\n }\n\n const interactionGuardSnapshot = getCachedInteractionGuardSnapshot();\n if (\n cachedWorkflowScopeSnapshot &&\n cachedWorkflowScopeSnapshot.workflowOverlay === workflowOverlay &&\n cachedWorkflowScopeSnapshot.interactionGuardSnapshot === interactionGuardSnapshot\n ) {\n return cachedWorkflowScopeSnapshot.snapshot;\n }\n\n const snapshot = deriveWorkflowScopeSnapshot()!;\n cachedWorkflowScopeSnapshot = {\n workflowOverlay,\n interactionGuardSnapshot,\n snapshot,\n };\n return snapshot;\n }\n\n function getCachedWorkflowMarkupSnapshot(): WorkflowMarkupSnapshot {\n const activeStoryKey = storyTargetKey(activeStory);\n if (\n cachedWorkflowMarkupSnapshot &&\n cachedWorkflowMarkupSnapshot.revisionToken === state.revisionToken &&\n cachedWorkflowMarkupSnapshot.activeStoryKey === activeStoryKey &&\n cachedWorkflowMarkupSnapshot.protectionSnapshot === protectionSnapshot &&\n cachedWorkflowMarkupSnapshot.preservation === state.document.preservation\n ) {\n return cachedWorkflowMarkupSnapshot.snapshot;\n }\n\n const snapshot = collectWorkflowMarkupSnapshot({\n renderSnapshot: cachedRenderSnapshot,\n fieldSnapshot: buildFieldSnapshot(state.document),\n protectionSnapshot,\n preservation: state.document.preservation,\n });\n cachedWorkflowMarkupSnapshot = {\n revisionToken: state.revisionToken,\n activeStoryKey,\n protectionSnapshot,\n preservation: state.document.preservation,\n snapshot,\n };\n return snapshot;\n }\n\n function refreshRenderSnapshot(): RuntimeRenderSnapshot {\n const surface = getCachedSurface(state.document, activeStory);\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 documentMode: viewState.documentMode,\n selection: toPublicSelectionSnapshot(state.selection, activeStory),\n activeStory,\n pageLayout: getCachedPageLayoutSnapshot(state, activeStory) ?? undefined,\n documentStats: toPublicDocumentStats(state),\n comments: getCachedCommentSidebarSnapshot(state),\n trackedChanges: getCachedTrackedChangesSnapshot(state, surface),\n compatibility: getCachedCompatibilityReport(state),\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 protectionSnapshot,\n };\n }\n\n function getCachedViewStateSnapshot(): EditorViewStateSnapshot {\n const activeStoryKey = storyTargetKey(activeStory);\n const pageLayout = cachedRenderSnapshot.pageLayout;\n if (\n cachedViewStateSnapshot &&\n cachedViewStateSnapshot.revisionToken === state.revisionToken &&\n cachedViewStateSnapshot.activeStoryKey === activeStoryKey &&\n cachedViewStateSnapshot.selection === state.selection &&\n cachedViewStateSnapshot.viewStateRef === viewState &&\n cachedViewStateSnapshot.pageLayout === pageLayout\n ) {\n return cachedViewStateSnapshot.snapshot;\n }\n\n const surface = cachedRenderSnapshot.surface;\n const mainSurface =\n activeStory.kind === \"main\"\n ? surface\n : getCachedSurface(state.document, MAIN_STORY_TARGET);\n const snapshot = createEditorViewStateSnapshot(\n viewState,\n activeStory,\n toPublicSelectionSnapshot(state.selection, activeStory),\n surface,\n mainSurface,\n pageLayout,\n state.document.numbering,\n );\n cachedViewStateSnapshot = {\n revisionToken: state.revisionToken,\n activeStoryKey,\n selection: state.selection,\n viewStateRef: viewState,\n pageLayout,\n snapshot,\n };\n return snapshot;\n }\n\n let cachedRenderSnapshot = refreshRenderSnapshot();\n\n emit({\n type: \"ready\",\n documentId: state.documentId,\n sessionId: state.sessionId,\n source:\n options.sourceKind ??\n (options.initialSessionState\n ? \"session\"\n : options.initialSnapshot\n ? \"snapshot\"\n : \"canonical\"),\n stats: toPublicDocumentStats(state),\n compatibility: toPublicCompatibilityReport(createDerivedCompatibility(state)),\n comments: cachedRenderSnapshot.comments,\n trackedChanges: cachedRenderSnapshot.trackedChanges,\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 getCanonicalDocument() {\n return state.document;\n },\n getSourcePackage() {\n return state.sourcePackage;\n },\n emitBlockedCommand(command, reasons) {\n emit({\n type: \"command_blocked\",\n documentId: state.documentId,\n command,\n reasons,\n });\n },\n dispatch(command) {\n const commandSelection = getCommandSelection(command, state.selection);\n if (isMutationCommand(command)) {\n const blockedReasons = evaluateWorkflowBlockedReasons(\n commandSelection,\n command.type,\n );\n if (blockedReasons.length > 0) {\n emit({\n type: \"command_blocked\",\n documentId: state.documentId,\n command: command.type,\n reasons: blockedReasons,\n });\n return;\n }\n }\n\n if (command.type === \"history.undo\") {\n if (viewState.documentMode === \"viewing\") return;\n applyHistory(\"undo\");\n return;\n }\n\n if (command.type === \"history.redo\") {\n if (viewState.documentMode === \"viewing\") return;\n applyHistory(\"redo\");\n return;\n }\n try {\n const transaction = executeEditorCommand(state, command, {\n timestamp: command.origin?.timestamp ?? clock(),\n documentMode: getEffectiveDocumentMode(commandSelection),\n defaultAuthorId: defaultAuthorId ?? undefined,\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 viewState = applyFocused(viewState, true);\n this.dispatch({\n type: \"runtime.focus\",\n focused: true,\n origin: createOrigin(\"api\", clock()),\n });\n },\n blur() {\n viewState = applyFocused(viewState, false);\n this.dispatch({\n type: \"runtime.focus\",\n focused: false,\n origin: createOrigin(\"api\", clock()),\n });\n },\n setDefaultAuthorId(authorId) {\n defaultAuthorId = authorId;\n },\n replaceText(text, target) {\n try {\n const timestamp = clock();\n applyTextCommandInActiveStory(\n {\n type: \"text.insert\",\n text,\n origin: createOrigin(\"api\", timestamp),\n },\n {\n selection: target ? createSelectionFromPublicAnchor(target) : state.selection,\n blockedCommandName: \"replaceText\",\n },\n );\n } catch (error) {\n emitError(toRuntimeError(error));\n }\n },\n applyActiveStoryTextCommand(command) {\n try {\n applyTextCommandInActiveStory(command);\n } catch (error) {\n emitError(toRuntimeError(error));\n }\n },\n addComment(params) {\n if (viewState.documentMode === \"viewing\") {\n throw new Error(\"Cannot add comments in viewing mode.\");\n }\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 selection = params.anchor\n ? createSelectionFromPublicAnchor(params.anchor)\n : state.selection;\n if (!canCreateDocxCommentAnchor(state.document.content, anchor)) {\n const message =\n \"DOCX comments must use a non-empty range that stays within a single paragraph.\";\n emitError({\n errorId: createSessionId(\"comment-anchor\", clock()),\n code: \"validation_failed\",\n isFatal: false,\n message,\n source: \"runtime\",\n });\n throw new Error(message);\n }\n const authorId = params.authorId ?? 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 selection,\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: 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 ?? 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 openStory(target) {\n const normalizedTarget =\n target.kind === \"header\" || target.kind === \"footer\"\n ? normalizeHeaderFooterTarget(\n state.document,\n target,\n cachedRenderSnapshot.pageLayout?.sectionIndex,\n ) ?? target\n : target;\n if (storyTargetsEqual(activeStory, normalizedTarget)) {\n return true;\n }\n if (!isValidStoryTarget(state, normalizedTarget)) {\n return false;\n }\n switchActiveStory(normalizedTarget);\n return true;\n },\n closeStory() {\n if (activeStory.kind === \"main\") {\n return;\n }\n switchActiveStory(MAIN_STORY_TARGET);\n },\n getActiveStory() {\n return activeStory;\n },\n getViewState() {\n return getCachedViewStateSnapshot();\n },\n setViewMode(mode) {\n viewState = applyViewMode(viewState, mode);\n cachedRenderSnapshot = refreshRenderSnapshot();\n for (const listener of listeners) {\n listener();\n }\n },\n setDocumentMode(mode) {\n viewState = applyDocumentMode(viewState, mode);\n cachedRenderSnapshot = refreshRenderSnapshot();\n for (const listener of listeners) {\n listener();\n }\n },\n getProtectionSnapshot() {\n return cachedRenderSnapshot.protectionSnapshot;\n },\n setWorkspaceMode(mode) {\n viewState = applyWorkspaceMode(viewState, mode);\n cachedRenderSnapshot = refreshRenderSnapshot();\n for (const listener of listeners) {\n listener();\n }\n },\n setZoom(level) {\n viewState = applyZoomLevel(viewState, level);\n cachedRenderSnapshot = refreshRenderSnapshot();\n for (const listener of listeners) {\n listener();\n }\n },\n getPageLayoutSnapshot() {\n return getCachedPageLayoutSnapshot(state, activeStory);\n },\n getDocumentNavigationSnapshot() {\n return getCachedDocumentNavigationSnapshot(state, activeStory);\n },\n getFieldSnapshot() {\n return buildFieldSnapshot(state.document);\n },\n updateFields(options?: UpdateFieldsOptions): UpdateFieldsResult {\n const refreshed = refreshDocumentFields(\n state.document,\n state.selection.head,\n activeStory,\n options,\n );\n if (refreshed.changed) {\n this.dispatch({\n type: \"document.replace\",\n document: refreshed.document,\n mapping: createEmptyMapping(),\n protectionSelection: refreshed.protectionSelection,\n origin: createOrigin(\"api\", clock()),\n });\n }\n const snapshot = buildFieldSnapshot(refreshed.document);\n return {\n totalCount: snapshot.totalCount,\n updatedCount: refreshed.updatedCount,\n preserveOnlyCount: snapshot.preserveOnlyCount,\n };\n },\n updateTableOfContents(options?: TocRefreshOptions): TocRefreshResult {\n const refreshed = refreshDocumentTableOfContents(\n state.document,\n state.selection.head,\n activeStory,\n options,\n );\n if (refreshed.changed) {\n this.dispatch({\n type: \"document.replace\",\n document: refreshed.document,\n mapping: createEmptyMapping(),\n protectionSelection: refreshed.protectionSelection,\n origin: createOrigin(\"api\", clock()),\n });\n }\n return refreshed.result;\n },\n getSessionState() {\n const compatibility = createDerivedCompatibility(state);\n return editorSessionStateFromPersistedSnapshot(\n createPersistedEditorSnapshot(state, {\n editorBuild,\n savedAt: clock(),\n compatibility,\n protectionSnapshot,\n }) as unknown as PersistedEditorSnapshot,\n );\n },\n getPersistedSnapshot() {\n return persistedSnapshotFromEditorSessionState(this.getSessionState(), {\n savedAt: clock(),\n });\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(this.getSessionState(), exportOptions);\n\n emit({\n type: \"export_completed\",\n documentId: state.documentId,\n result,\n });\n\n return result;\n },\n setWorkflowOverlay(overlay) {\n workflowOverlay = structuredClone(overlay);\n cachedRenderSnapshot = refreshRenderSnapshot();\n const snapshot = deriveWorkflowScopeSnapshot()!;\n emit({\n type: \"workflow_overlay_changed\",\n documentId: state.documentId,\n snapshot,\n });\n if (workflowOverlay.activeWorkItemId !== undefined) {\n emit({\n type: \"workflow_active_work_item_changed\",\n documentId: state.documentId,\n activeWorkItemId: workflowOverlay.activeWorkItemId ?? null,\n });\n }\n for (const listener of listeners) {\n listener();\n }\n },\n clearWorkflowOverlay() {\n workflowOverlay = null;\n cachedRenderSnapshot = refreshRenderSnapshot();\n emit({\n type: \"workflow_active_work_item_changed\",\n documentId: state.documentId,\n activeWorkItemId: null,\n });\n emit({\n type: \"workflow_overlay_changed\",\n documentId: state.documentId,\n snapshot: {\n overlayPresent: false,\n activeWorkItemId: null,\n scopes: [],\n candidates: [],\n blockedReasons: [],\n },\n });\n for (const listener of listeners) {\n listener();\n }\n },\n getWorkflowScopeSnapshot() {\n return getCachedWorkflowScopeSnapshot();\n },\n getInteractionGuardSnapshot() {\n return getCachedInteractionGuardSnapshot();\n },\n getWorkflowMarkupSnapshot() {\n return getCachedWorkflowMarkupSnapshot();\n },\n setHostAnnotationOverlay(overlay) {\n hostAnnotationOverlay = structuredClone(overlay);\n emit({\n type: \"host_annotation_overlay_changed\",\n documentId: state.documentId,\n snapshot: deriveHostAnnotationSnapshot(),\n });\n for (const listener of listeners) {\n listener();\n }\n },\n clearHostAnnotationOverlay() {\n hostAnnotationOverlay = null;\n emit({\n type: \"host_annotation_overlay_changed\",\n documentId: state.documentId,\n snapshot: deriveHostAnnotationSnapshot(),\n });\n for (const listener of listeners) {\n listener();\n }\n },\n getHostAnnotationSnapshot() {\n return deriveHostAnnotationSnapshot();\n },\n getWorkflowCandidateRanges(options) {\n return deriveWorkflowCandidateRangesFromMarkup(this.getWorkflowMarkupSnapshot(), options);\n },\n replaceWorkflowMarkupText(markupId, text) {\n const target = this\n .getWorkflowMarkupSnapshot()\n .items.find((item) => item.markupId === markupId);\n if (!target || target.anchor.kind === \"detached\") {\n return;\n }\n const targetStory = target.storyTarget ?? MAIN_STORY_TARGET;\n if (!storyTargetsEqual(activeStory, targetStory)) {\n if (targetStory.kind === \"main\") {\n this.closeStory();\n } else if (!this.openStory(targetStory)) {\n return;\n }\n }\n this.replaceText(text, target.anchor);\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(), previous.revision);\n storySelections.set(storyTargetKey(activeStory), state.selection);\n cachedRenderSnapshot = refreshRenderSnapshot();\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 protectionSnapshot = remapProtectionSnapshot(protectionSnapshot, transaction.mapping);\n state = finalizeState(transaction.nextState, transaction.markDirty, clock());\n storySelections.set(storyTargetKey(activeStory), state.selection);\n cachedRenderSnapshot = refreshRenderSnapshot();\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, activeStory),\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 if (transaction.effects.revisionAuthored) {\n emit({\n type: \"change_authored\",\n documentId: next.documentId,\n changeId: transaction.effects.revisionAuthored.changeId,\n kind: transaction.effects.revisionAuthored.kind,\n });\n }\n\n if (transaction.effects.commandBlocked) {\n emit({\n type: \"command_blocked\",\n documentId: next.documentId,\n command: transaction.effects.commandBlocked.code,\n reasons: [{\n code: transaction.effects.commandBlocked.code as WorkflowBlockedCommandReason[\"code\"],\n message: transaction.effects.commandBlocked.message,\n }],\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 applyTextCommandInActiveStory(\n command: ActiveStoryTextCommand,\n options: {\n selection?: EditorState[\"selection\"];\n blockedCommandName?: string;\n } = {},\n ): void {\n const selection = options.selection ?? state.selection;\n const blockedReasons = evaluateWorkflowBlockedReasons(selection, command.type);\n if (blockedReasons.length > 0) {\n emit({\n type: \"command_blocked\",\n documentId: state.documentId,\n command: options.blockedCommandName ?? command.type,\n reasons: blockedReasons,\n });\n return;\n }\n\n const timestamp = command.origin?.timestamp ?? clock();\n const context = {\n timestamp,\n documentMode: getEffectiveDocumentMode(selection),\n defaultAuthorId: defaultAuthorId ?? undefined,\n } as const;\n const baseState = selection === state.selection\n ? state\n : {\n ...state,\n selection,\n };\n\n if (activeStory.kind === \"main\") {\n commit(executeEditorCommand(baseState, command, context));\n return;\n }\n\n const localState = createEditorState({\n documentId: state.documentId,\n sessionId,\n sourceLabel: state.sourceLabel,\n readOnly: state.readOnly,\n canonicalDocument: {\n ...state.document,\n content: {\n type: \"doc\",\n children: [...getStoryBlocks(state.document, activeStory)],\n },\n review: createSecondaryStoryLocalReviewState(state.document.review, activeStory),\n },\n compatibility: state.compatibility,\n warnings: state.warnings,\n fatalError: state.fatalError,\n });\n localState.selection = selection;\n const localTransaction = executeEditorCommand(localState, command, context);\n\n if (!localTransaction.markDirty) {\n notify(state, state, {\n nextState: state,\n mapping: createEmptyMapping(),\n effects: localTransaction.effects,\n historyBoundary: \"skip\",\n markDirty: false,\n });\n return;\n }\n\n const nextDocument = replaceStoryBlocks(\n state.document,\n activeStory,\n localTransaction.nextState.document.content.children,\n );\n const nextDocumentWithReview = {\n ...nextDocument,\n review: mergeSecondaryStoryReviewState(\n state.document.review,\n localTransaction.nextState.document.review,\n localTransaction.effects,\n activeStory,\n ),\n };\n const fullTransaction = executeEditorCommand(\n baseState,\n {\n type: \"document.replace\",\n document: nextDocumentWithReview,\n selection: localTransaction.nextState.selection,\n mapping: createEmptyMapping(),\n protectionSelection: selection,\n origin: command.origin,\n },\n context,\n );\n\n commit({\n ...fullTransaction,\n effects: mergeTransactionEffects(fullTransaction.effects, localTransaction.effects),\n });\n }\n\n function mergeTransactionEffects(\n base: EditorTransaction[\"effects\"],\n local: EditorTransaction[\"effects\"],\n ): EditorTransaction[\"effects\"] {\n return {\n warningsAdded: [...base.warningsAdded, ...local.warningsAdded],\n warningsCleared: [...base.warningsCleared, ...local.warningsCleared],\n commentAdded: base.commentAdded ?? local.commentAdded,\n commentResolved: base.commentResolved ?? local.commentResolved,\n commentReopened: base.commentReopened ?? local.commentReopened,\n commentReplyAdded: base.commentReplyAdded ?? local.commentReplyAdded,\n commentBodyEdited: base.commentBodyEdited ?? local.commentBodyEdited,\n changeAccepted: base.changeAccepted ?? local.changeAccepted,\n changeRejected: base.changeRejected ?? local.changeRejected,\n revisionAuthored: base.revisionAuthored ?? local.revisionAuthored,\n commandBlocked: base.commandBlocked ?? local.commandBlocked,\n };\n }\n\n function mergeSecondaryStoryReviewState(\n currentReview: EditorState[\"document\"][\"review\"],\n localReview: EditorState[\"document\"][\"review\"],\n effects: EditorTransaction[\"effects\"],\n storyTarget: EditorStoryTarget,\n ): EditorState[\"document\"][\"review\"] {\n const nextReview: EditorState[\"document\"][\"review\"] = {\n comments: { ...currentReview.comments },\n revisions: { ...currentReview.revisions },\n };\n\n const currentStoryRevisionIds = Object.values(currentReview.revisions)\n .filter((revision) => storyTargetsEqual(getRevisionStoryTarget(revision), storyTarget))\n .map((revision) => revision.changeId);\n for (const revisionId of currentStoryRevisionIds) {\n delete nextReview.revisions[revisionId];\n }\n for (const revision of Object.values(localReview.revisions)) {\n nextReview.revisions[revision.changeId] = {\n ...revision,\n metadata: {\n ...revision.metadata,\n storyTarget: createRevisionStoryTargetRecord(storyTarget),\n },\n };\n }\n\n if (effects.commentAdded) {\n const commentId = effects.commentAdded.commentId;\n const comment = localReview.comments[commentId];\n if (comment) {\n nextReview.comments[commentId] = comment;\n }\n }\n\n return nextReview;\n }\n\n function emit(event: DocumentRuntimeEvent): 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 storySelections.set(storyTargetKey(activeStory), state.selection);\n cachedRenderSnapshot = refreshRenderSnapshot();\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 function switchActiveStory(target: EditorStoryTarget): void {\n const previousStory = activeStory;\n const previousSelection = state.selection;\n storySelections.set(storyTargetKey(previousStory), previousSelection);\n\n const restoredSelection =\n storySelections.get(storyTargetKey(target)) ?? createSelectionSnapshot(0, 0);\n activeStory = target;\n state = {\n ...state,\n selection: restoredSelection,\n };\n storySelections.set(storyTargetKey(target), restoredSelection);\n cachedRenderSnapshot = refreshRenderSnapshot();\n\n if (selectionChanged(previousSelection, restoredSelection)) {\n emit({\n type: \"selection_changed\",\n documentId: state.documentId,\n selection: toPublicSelectionSnapshot(restoredSelection, activeStory),\n });\n }\n\n emit({\n type: \"story_changed\",\n documentId: state.documentId,\n activeStory,\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 baseRevision?: number,\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 ? (baseRevision ?? 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 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 storyTarget?: EditorStoryTarget,\n): SelectionSnapshot {\n return {\n anchor: selection.anchor,\n head: selection.head,\n isCollapsed: selection.isCollapsed,\n activeRange: toPublicAnchorProjection(selection.activeRange),\n ...(storyTarget && storyTarget.kind !== \"main\" ? { storyTarget } : {}),\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 createSelectionFromPublicAnchor(\n anchor: EditorAnchorProjection,\n): import(\"../core/state/editor-state.ts\").SelectionSnapshot {\n switch (anchor.kind) {\n case \"range\":\n return createSelectionSnapshot(anchor.from, anchor.to);\n case \"node\":\n return createSelectionSnapshot(anchor.at, anchor.at);\n case \"detached\":\n return createSelectionSnapshot(\n anchor.lastKnownRange.from,\n anchor.lastKnownRange.to,\n );\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 const derived = buildCompatibilityReport({\n document: state.document,\n warnings: state.warnings,\n fatalError: state.fatalError,\n generatedAt: state.document.updatedAt,\n });\n\n return mergeCompatibilityReports([state.compatibility as never, derived as never], {\n generatedAt: state.document.updatedAt,\n blockExport: state.compatibility.blockExport || derived.blockExport,\n }) as InternalCompatibilityReport;\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): TrackedChangesSnapshot {\n const projection = createRevisionSidebarProjection(\n createRevisionStoreFromDocument(state),\n );\n const storyPlainTextCache = new Map<string, string>();\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 storyTarget = getRevisionStoryTarget(sourceRevision);\n const preview = describeRevisionPreview(\n revision,\n sourceRevision?.anchor ??\n createDetachedAnchor({ from: 0, to: 0 }, \"importAmbiguity\"),\n getStoryPlainText(state.document, storyTarget, storyPlainTextCache),\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 storyTarget,\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 storyTarget: revision.metadata?.storyTarget,\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 getRevisionStoryTarget(\n revision: EditorState[\"document\"][\"review\"][\"revisions\"][string] | undefined,\n): EditorStoryTarget {\n const storyTarget = revision?.metadata?.storyTarget;\n return storyTarget ? { ...storyTarget } : MAIN_STORY_TARGET;\n}\n\nfunction createSecondaryStoryLocalReviewState(\n review: EditorState[\"document\"][\"review\"],\n storyTarget: EditorStoryTarget,\n): EditorState[\"document\"][\"review\"] {\n return {\n comments: {},\n revisions: Object.fromEntries(\n Object.values(review.revisions)\n .filter((revision) => storyTargetsEqual(getRevisionStoryTarget(revision), storyTarget))\n .map((revision) => [\n revision.changeId,\n {\n ...revision,\n metadata: {\n ...revision.metadata,\n storyTarget: createRevisionStoryTargetRecord(storyTarget),\n },\n },\n ]),\n ),\n };\n}\n\nfunction getStoryPlainText(\n document: CanonicalDocumentEnvelope,\n storyTarget: EditorStoryTarget,\n cache: Map<string, string>,\n): string {\n const key = storyTargetKey(storyTarget);\n const cached = cache.get(key);\n if (cached !== undefined) {\n return cached;\n }\n const plainText = createEditorSurfaceSnapshot(\n document,\n createSelectionSnapshot(0, 0),\n storyTarget,\n ).plainText;\n cache.set(key, plainText);\n return plainText;\n}\n\nfunction createRevisionStoryTargetRecord(\n storyTarget: EditorStoryTarget,\n): NonNullable<NonNullable<EditorState[\"document\"][\"review\"][\"revisions\"][string][\"metadata\"]>[\"storyTarget\"]> {\n return { ...storyTarget };\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 isValidStoryTarget(\n state: EditorState,\n target: EditorStoryTarget,\n): boolean {\n if (target.kind === \"main\") return true;\n const subParts = state.document.subParts;\n if (!subParts) return false;\n\n switch (target.kind) {\n case \"header\":\n return Boolean(normalizeHeaderFooterTarget(state.document, target));\n case \"footer\":\n return Boolean(normalizeHeaderFooterTarget(state.document, target));\n case \"footnote\":\n return Boolean(subParts.footnoteCollection?.footnotes?.[target.noteId]);\n case \"endnote\":\n return Boolean(subParts.footnoteCollection?.endnotes?.[target.noteId]);\n }\n}\n\nfunction derivePageLayoutSnapshot(\n state: EditorState,\n activeStory: EditorStoryTarget,\n storySelections?: ReadonlyMap<string, EditorState[\"selection\"]>,\n): PageLayoutSnapshot | null {\n const subParts = state.document.subParts;\n const sections = buildResolvedSections(state.document);\n if (!subParts && sections.length === 0) {\n return null;\n }\n\n const activeSection = resolveActiveSection(\n state,\n activeStory,\n sections,\n storySelections,\n );\n return buildPageLayoutSnapshot(\n activeSection?.index ?? 0,\n activeSection?.properties ?? subParts?.finalSectionProperties,\n subParts,\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\n/** Commands that are safe in viewing mode (no document mutation). */\nconst NON_MUTATION_COMMANDS = new Set([\n \"selection.set\",\n \"runtime.set-read-only\",\n \"runtime.focus\",\n \"warning.add\",\n \"warning.clear\",\n \"comment.open\",\n]);\n\n/** Mutation commands that are not yet supported in suggesting mode. */\nconst SUGGESTING_UNSUPPORTED_COMMANDS = new Set([\n \"paragraph.split\",\n]);\n\nconst SUGGESTING_SECONDARY_STORY_UNSUPPORTED_COMMANDS = new Set([\n \"text.insert\",\n \"text.delete-backward\",\n \"text.delete-forward\",\n \"text.insert-tab\",\n \"text.insert-hard-break\",\n]);\n\nfunction isMutationCommand(command: EditorCommand): boolean {\n return !NON_MUTATION_COMMANDS.has(command.type);\n}\n\n// ── Field snapshot helpers ──────────────────────────────────────────────────\n\nfunction buildFieldSnapshot(document: CanonicalDocumentEnvelope): FieldSnapshot {\n const entries: FieldEntrySnapshot[] = [];\n let index = 0;\n for (const block of document.content.children) {\n index = collectFieldsFromBlock(block, entries, index);\n }\n index = collectFieldsFromSubParts(document.subParts, entries, index);\n const supportedCount = entries.filter((e) => e.supported).length;\n return {\n totalCount: entries.length,\n supportedCount,\n preserveOnlyCount: entries.length - supportedCount,\n fields: entries,\n };\n}\n\nfunction collectFieldsFromBlock(\n block: BlockNode,\n entries: FieldEntrySnapshot[],\n index: number,\n): number {\n if (block.type === \"paragraph\") {\n for (const child of block.children) {\n index = collectFieldsFromInline(child, entries, index);\n }\n } else if (block.type === \"table\") {\n for (const row of block.rows) {\n for (const cell of row.cells) {\n for (const child of cell.children) {\n index = collectFieldsFromBlock(child, entries, index);\n }\n }\n }\n } else if (block.type === \"sdt\" || block.type === \"custom_xml\") {\n for (const child of block.children) {\n index = collectFieldsFromBlock(child, entries, index);\n }\n }\n return index;\n}\n\nfunction collectFieldsFromInline(\n node: InlineNode,\n entries: FieldEntrySnapshot[],\n index: number,\n): number {\n if (node.type === \"field\") {\n const fieldFamily = node.fieldFamily ?? \"UNKNOWN\";\n const supported = isSupportedFieldFamily(fieldFamily);\n const displayText = extractFieldDisplayText(node);\n entries.push({\n index,\n fieldFamily,\n supported,\n instruction: node.instruction,\n fieldTarget: node.fieldTarget,\n refreshStatus: node.refreshStatus ?? (supported ? \"stale\" : \"preserve-only\"),\n displayText,\n });\n index++;\n // Also walk children — fields can contain nested fields\n for (const child of node.children) {\n index = collectFieldsFromInline(child, entries, index);\n }\n } else if (node.type === \"hyperlink\") {\n for (const child of node.children) {\n index = collectFieldsFromInline(child, entries, index);\n }\n }\n return index;\n}\n\nfunction extractFieldDisplayText(field: FieldNode): string {\n return flattenInlineDisplayText(field.children);\n}\n\nfunction flattenInlineDisplayText(children: readonly InlineNode[]): string {\n return children\n .map((child) => {\n switch (child.type) {\n case \"text\":\n return child.text;\n case \"tab\":\n return \"\\t\";\n case \"hard_break\":\n case \"column_break\":\n return \"\\n\";\n case \"hyperlink\":\n case \"field\":\n return flattenInlineDisplayText(child.children);\n case \"footnote_ref\":\n return child.noteId;\n default:\n return \"\";\n }\n })\n .join(\"\");\n}\n\nfunction refreshDocumentFields(\n document: CanonicalDocumentEnvelope,\n selectionHead: number,\n activeStory: EditorStoryTarget,\n options?: UpdateFieldsOptions,\n): {\n document: CanonicalDocumentEnvelope;\n updatedCount: number;\n changed: boolean;\n protectionSelection?: import(\"../core/state/editor-state.ts\").SelectionSnapshot;\n} {\n const supportedOnly = options?.supportedOnly ?? true;\n const bookmarkMap = buildBookmarkNameMap(document);\n const paragraphs = collectParagraphContexts(document.content.children);\n const navigation = createDocumentNavigationSnapshot(document, selectionHead, activeStory);\n let updatedCount = 0;\n let changed = false;\n let changedFrom: number | undefined;\n let changedTo: number | undefined;\n\n const nextChildren = refreshBlocksWithCursor(document.content.children, (field, range) => {\n if (!field.fieldFamily || !isSupportedFieldFamily(field.fieldFamily)) {\n return field;\n }\n if (supportedOnly && field.fieldFamily === \"TOC\") {\n return field;\n }\n const display = resolveSupportedFieldDisplay(\n field,\n document,\n bookmarkMap,\n paragraphs,\n navigation,\n );\n if (!display) {\n return field;\n }\n updatedCount += 1;\n const nextField: FieldNode = {\n ...field,\n children: buildInlineNodesFromDisplayText(display.displayText),\n refreshStatus: display.refreshStatus,\n };\n if (\n nextField.refreshStatus !== field.refreshStatus ||\n flattenInlineDisplayText(nextField.children) !== flattenInlineDisplayText(field.children)\n ) {\n changed = true;\n changedFrom = changedFrom === undefined ? range.from : Math.min(changedFrom, range.from);\n changedTo = changedTo === undefined ? range.to : Math.max(changedTo, range.to);\n }\n return nextField;\n }).blocks;\n if (!changed) {\n return { document, updatedCount, changed: false };\n }\n\n const nextDocument: CanonicalDocumentEnvelope = {\n ...document,\n content: {\n ...document.content,\n children: nextChildren,\n },\n };\n const nextRegistry = buildFieldRegistry({\n content: nextDocument.content,\n styles: nextDocument.styles,\n subParts: nextDocument.subParts,\n });\n nextDocument.fieldRegistry = nextRegistry;\n let protectionSelection:\n | import(\"../core/state/editor-state.ts\").SelectionSnapshot\n | undefined;\n if (changedFrom !== undefined && changedTo !== undefined) {\n protectionSelection = createSelectionSnapshot(changedFrom, changedTo);\n }\n return {\n document: nextDocument,\n updatedCount,\n changed: true,\n ...(protectionSelection ? { protectionSelection } : {}),\n };\n}\n\nfunction refreshDocumentTableOfContents(\n document: CanonicalDocumentEnvelope,\n selectionHead: number,\n activeStory: EditorStoryTarget,\n options?: TocRefreshOptions,\n): {\n document: CanonicalDocumentEnvelope;\n result: TocRefreshResult;\n changed: boolean;\n protectionSelection?: import(\"../core/state/editor-state.ts\").SelectionSnapshot;\n} {\n const navigation = createDocumentNavigationSnapshot(document, selectionHead, activeStory);\n let changed = false;\n let resultEntries: Array<{ level: number; text: string; pageIndex: number }> = [];\n let changedFrom: number | undefined;\n let changedTo: number | undefined;\n const nextChildren = refreshBlocksWithCursor(document.content.children, (field, range) => {\n if (field.fieldFamily !== \"TOC\") {\n return field;\n }\n const levelRange = options?.maxLevel\n ? { from: 1, to: options.maxLevel }\n : parseTocLevelRange(field.instruction);\n const entries = navigation.headings\n .filter((heading) => heading.level >= levelRange.from && heading.level <= levelRange.to)\n .map((heading) => ({\n level: heading.level,\n text: heading.text,\n pageIndex: heading.pageIndex,\n }));\n if (resultEntries.length === 0) {\n resultEntries = entries;\n }\n const nextField: FieldNode = {\n ...field,\n children: buildTocInlineNodes(entries),\n refreshStatus: \"current\",\n };\n if (flattenInlineDisplayText(nextField.children) !== flattenInlineDisplayText(field.children)) {\n changed = true;\n changedFrom = changedFrom === undefined ? range.from : Math.min(changedFrom, range.from);\n changedTo = changedTo === undefined ? range.to : Math.max(changedTo, range.to);\n }\n return nextField;\n }).blocks;\n if (!changed) {\n return {\n document,\n result: { entryCount: resultEntries.length, entries: resultEntries },\n changed: false,\n };\n }\n\n const nextDocument: CanonicalDocumentEnvelope = {\n ...document,\n content: {\n ...document.content,\n children: nextChildren,\n },\n };\n const nextRegistry = buildFieldRegistry({\n content: nextDocument.content,\n styles: nextDocument.styles,\n subParts: nextDocument.subParts,\n });\n nextDocument.fieldRegistry = nextRegistry.tocStructure\n ? {\n ...nextRegistry,\n tocStructure: {\n ...nextRegistry.tocStructure,\n status: \"current\",\n },\n }\n : nextRegistry;\n let protectionSelection:\n | import(\"../core/state/editor-state.ts\").SelectionSnapshot\n | undefined;\n if (changedFrom !== undefined && changedTo !== undefined) {\n protectionSelection = createSelectionSnapshot(changedFrom, changedTo);\n }\n\n return {\n document: nextDocument,\n result: { entryCount: resultEntries.length, entries: resultEntries },\n changed: true,\n ...(protectionSelection ? { protectionSelection } : {}),\n };\n}\n\nfunction refreshBlocksWithCursor(\n blocks: readonly BlockNode[],\n visitField: (field: FieldNode, range: { from: number; to: number }) => FieldNode,\n cursor = 0,\n previousParagraph = false,\n): {\n blocks: BlockNode[];\n cursor: number;\n previousParagraph: boolean;\n} {\n const nextBlocks = blocks.map((block) => {\n if (block.type === \"paragraph\") {\n const paragraphStart = previousParagraph ? cursor + 1 : cursor;\n const refreshedChildren = refreshInlineNodesWithCursor(\n block.children,\n visitField,\n paragraphStart,\n );\n cursor = paragraphStart + refreshedChildren.cursor;\n previousParagraph = true;\n return {\n ...block,\n children: refreshedChildren.nodes,\n };\n }\n if (block.type === \"table\") {\n cursor += 1;\n previousParagraph = false;\n return {\n ...block,\n rows: block.rows.map((row) => ({\n ...row,\n cells: row.cells.map((cell) => ({\n ...cell,\n children: (() => {\n const refreshed = refreshBlocksWithCursor(cell.children, visitField, cursor, false);\n cursor = refreshed.cursor;\n return refreshed.blocks;\n })(),\n })),\n })),\n };\n }\n if (block.type === \"sdt\" || block.type === \"custom_xml\") {\n const refreshed = refreshBlocksWithCursor(\n block.children,\n visitField,\n cursor,\n previousParagraph,\n );\n cursor = refreshed.cursor;\n previousParagraph = refreshed.previousParagraph;\n return {\n ...block,\n children: refreshed.blocks,\n };\n }\n cursor += 1;\n previousParagraph = false;\n return block;\n });\n return { blocks: nextBlocks, cursor, previousParagraph };\n}\n\nfunction refreshInlineNodesWithCursor(\n nodes: readonly InlineNode[],\n visitField: (field: FieldNode, range: { from: number; to: number }) => FieldNode,\n cursor = 0,\n): {\n nodes: InlineNode[];\n cursor: number;\n} {\n const nextNodes = nodes.map((node) => {\n if (node.type === \"field\") {\n const fieldStart = cursor;\n const refreshedChildren = refreshInlineNodesWithCursor(node.children, visitField, cursor);\n const fieldLength = measureInlineNodes(node.children);\n cursor = fieldStart + fieldLength;\n return visitField({\n ...node,\n children: refreshedChildren.nodes,\n }, {\n from: fieldStart,\n to: fieldStart + fieldLength,\n });\n }\n if (node.type === \"hyperlink\") {\n cursor += measureInlineNodes(node.children);\n return {\n ...node,\n // Hyperlinks only contain text-like children in the canonical model.\n children: [...node.children],\n };\n }\n cursor += measureInlineNode(node);\n return node;\n });\n return { nodes: nextNodes, cursor };\n}\n\nfunction buildInlineNodesFromDisplayText(text: string): InlineNode[] {\n if (text.length === 0) {\n return [];\n }\n const children: InlineNode[] = [];\n let buffer = \"\";\n const flushBuffer = () => {\n if (buffer.length > 0) {\n children.push({ type: \"text\", text: buffer });\n buffer = \"\";\n }\n };\n for (const character of text) {\n if (character === \"\\t\") {\n flushBuffer();\n children.push({ type: \"tab\" });\n continue;\n }\n if (character === \"\\n\") {\n flushBuffer();\n children.push({ type: \"hard_break\" });\n continue;\n }\n buffer += character;\n }\n flushBuffer();\n return children;\n}\n\nfunction buildTocInlineNodes(\n entries: ReadonlyArray<{ level: number; text: string; pageIndex: number }>,\n): InlineNode[] {\n const children: InlineNode[] = [];\n entries.forEach((entry, index) => {\n children.push({ type: \"text\", text: entry.text });\n children.push({ type: \"tab\" });\n children.push({ type: \"text\", text: String(entry.pageIndex + 1) });\n if (index < entries.length - 1) {\n children.push({ type: \"hard_break\" });\n }\n });\n return children;\n}\n\nfunction collectFieldsFromSubParts(\n subParts: SubPartsCatalog | undefined,\n entries: FieldEntrySnapshot[],\n index: number,\n): number {\n if (!subParts) {\n return index;\n }\n let nextIndex = index;\n for (const header of subParts.headers ?? []) {\n for (const block of header.blocks) {\n nextIndex = collectFieldsFromBlock(block, entries, nextIndex);\n }\n }\n for (const footer of subParts.footers ?? []) {\n for (const block of footer.blocks) {\n nextIndex = collectFieldsFromBlock(block, entries, nextIndex);\n }\n }\n if (subParts.footnoteCollection) {\n for (const note of Object.values(subParts.footnoteCollection.footnotes)) {\n for (const block of note.blocks) {\n nextIndex = collectFieldsFromBlock(block, entries, nextIndex);\n }\n }\n for (const note of Object.values(subParts.footnoteCollection.endnotes)) {\n for (const block of note.blocks) {\n nextIndex = collectFieldsFromBlock(block, entries, nextIndex);\n }\n }\n }\n return nextIndex;\n}\n\nfunction resolveSupportedFieldDisplay(\n field: FieldNode,\n document: CanonicalDocumentEnvelope,\n bookmarkMap: Map<string, { bookmarkId: string; paragraphIndex: number }>,\n paragraphs: readonly ParagraphContext[],\n navigation: DocumentNavigationSnapshot,\n): { displayText: string; refreshStatus: FieldRefreshStatus } | undefined {\n if (!field.fieldFamily || !isSupportedFieldFamily(field.fieldFamily)) {\n return undefined;\n }\n if (!field.fieldTarget) {\n return field.fieldFamily === \"TOC\"\n ? undefined\n : { displayText: \"\", refreshStatus: \"unresolvable\" };\n }\n if (field.fieldFamily === \"REF\") {\n const result = resolveRefFieldText(document, bookmarkMap, field.fieldTarget);\n return result\n ? { displayText: result.text, refreshStatus: result.refreshStatus }\n : { displayText: \"\", refreshStatus: \"unresolvable\" };\n }\n const bookmark = bookmarkMap.get(field.fieldTarget);\n if (!bookmark) {\n return { displayText: \"\", refreshStatus: \"unresolvable\" };\n }\n if (field.fieldFamily === \"PAGEREF\") {\n const paragraph = paragraphs[bookmark.paragraphIndex];\n if (!paragraph) {\n return { displayText: \"\", refreshStatus: \"unresolvable\" };\n }\n const pageIndex = findPageForOffset(navigation.pages, paragraph.startOffset);\n return { displayText: String(pageIndex + 1), refreshStatus: \"current\" };\n }\n if (field.fieldFamily === \"NOTEREF\") {\n const paragraph = paragraphs[bookmark.paragraphIndex]?.paragraph;\n if (!paragraph) {\n return { displayText: \"\", refreshStatus: \"unresolvable\" };\n }\n const noteText = resolveNoteReferenceText(paragraph, bookmark.bookmarkId);\n return noteText\n ? { displayText: noteText, refreshStatus: \"current\" }\n : { displayText: \"\", refreshStatus: \"unresolvable\" };\n }\n return undefined;\n}\n\ninterface ParagraphContext {\n paragraph: ParagraphNode;\n startOffset: number;\n}\n\nfunction collectParagraphContexts(blocks: readonly BlockNode[]): ParagraphContext[] {\n const paragraphs: ParagraphContext[] = [];\n collectParagraphContextsFromBlocks(blocks, paragraphs, 0, false);\n return paragraphs;\n}\n\nfunction collectParagraphContextsFromBlocks(\n blocks: readonly BlockNode[],\n paragraphs: ParagraphContext[],\n cursor: number,\n previousParagraph: boolean,\n): { cursor: number; previousParagraph: boolean } {\n let nextCursor = cursor;\n let nextPreviousParagraph = previousParagraph;\n for (const block of blocks) {\n if (block.type === \"paragraph\") {\n if (nextPreviousParagraph) {\n nextCursor += 1;\n }\n paragraphs.push({ paragraph: block, startOffset: nextCursor });\n nextCursor += measureInlineNodes(block.children);\n nextPreviousParagraph = true;\n continue;\n }\n if (block.type === \"table\") {\n nextCursor += 1;\n nextPreviousParagraph = false;\n for (const row of block.rows) {\n for (const cell of row.cells) {\n const result = collectParagraphContextsFromBlocks(\n cell.children,\n paragraphs,\n nextCursor,\n false,\n );\n nextCursor = result.cursor;\n }\n }\n continue;\n }\n if (block.type === \"sdt\" || block.type === \"custom_xml\") {\n const result = collectParagraphContextsFromBlocks(\n block.children,\n paragraphs,\n nextCursor,\n nextPreviousParagraph,\n );\n nextCursor = result.cursor;\n nextPreviousParagraph = result.previousParagraph;\n continue;\n }\n nextCursor += 1;\n nextPreviousParagraph = false;\n }\n return { cursor: nextCursor, previousParagraph: nextPreviousParagraph };\n}\n\nfunction measureInlineNodes(nodes: readonly InlineNode[]): number {\n return nodes.reduce((size, node) => size + measureInlineNode(node), 0);\n}\n\nfunction measureInlineNode(node: InlineNode): number {\n switch (node.type) {\n case \"text\":\n return node.text.length;\n case \"tab\":\n case \"hard_break\":\n case \"column_break\":\n case \"footnote_ref\":\n case \"image\":\n case \"opaque_inline\":\n case \"bookmark_start\":\n case \"bookmark_end\":\n return 1;\n case \"hyperlink\":\n case \"field\":\n return measureInlineNodes(node.children);\n default:\n return 1;\n }\n}\n\nfunction resolveNoteReferenceText(paragraph: ParagraphNode, bookmarkId: string): string | undefined {\n let inside = false;\n let sawBoundary = false;\n for (const child of paragraph.children) {\n if (child.type === \"bookmark_start\" && child.bookmarkId === bookmarkId) {\n inside = true;\n sawBoundary = true;\n continue;\n }\n if (child.type === \"bookmark_end\" && child.bookmarkId === bookmarkId) {\n break;\n }\n if (!inside) {\n continue;\n }\n if (child.type === \"footnote_ref\") {\n return child.noteId;\n }\n }\n return sawBoundary ? undefined : undefined;\n}\n\nfunction getCommandSelection(\n command: EditorCommand,\n fallbackSelection: import(\"../core/state/editor-state.ts\").SelectionSnapshot,\n): import(\"../core/state/editor-state.ts\").SelectionSnapshot {\n if (\"protectionSelection\" in command && command.protectionSelection) {\n return command.protectionSelection;\n }\n if (\"selection\" in command && command.selection) {\n return command.selection;\n }\n return fallbackSelection;\n}\n\nfunction isBlockedByProtection(\n protection: ProtectionSnapshot,\n selection: import(\"../core/state/editor-state.ts\").SelectionSnapshot,\n): boolean {\n const enforcedRanges = protection.ranges.filter(\n (range): range is typeof range & { start: number; end: number } =>\n range.enforced && typeof range.start === \"number\" && typeof range.end === \"number\",\n );\n if (enforcedRanges.length === 0) {\n return false;\n }\n const from = Math.min(selection.anchor, selection.head);\n const to = Math.max(selection.anchor, selection.head);\n return !enforcedRanges.some((range) =>\n from >= range.start && to <= range.end,\n );\n}\n\nfunction remapProtectionSnapshot(\n protection: ProtectionSnapshot,\n mapping: import(\"../core/selection/mapping.ts\").TransactionMapping,\n): ProtectionSnapshot {\n if (mapping.steps.length === 0 || protection.ranges.length === 0) {\n return protection;\n }\n let changed = false;\n const nextRanges = protection.ranges.map((range) => {\n if (\n !range.enforced ||\n typeof range.start !== \"number\" ||\n typeof range.end !== \"number\"\n ) {\n return range;\n }\n const mapped = mapRange(\n { from: range.start, to: range.end },\n { start: -1, end: 1 },\n mapping,\n );\n if (mapped.kind === \"detached\") {\n changed = true;\n return {\n ...range,\n start: undefined,\n end: undefined,\n enforced: false,\n enforcementReason:\n \"preserve-only: permission range could not be remapped after runtime edits\",\n };\n }\n if (mapped.range.from !== range.start || mapped.range.to !== range.end) {\n changed = true;\n return {\n ...range,\n start: mapped.range.from,\n end: mapped.range.to,\n };\n }\n return range;\n });\n if (!changed) {\n return protection;\n }\n return {\n ...protection,\n ranges: nextRanges,\n enforcedRangeCount: nextRanges.filter((range) => range.enforced).length,\n preservedRangeCount: nextRanges.filter((range) => !range.enforced).length,\n };\n}\n"],"mappings":"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","names":["resultingStatus","textResult","nextStore","boundaryIndex","result","insertedFrom","insertedTo","reviewState","finalDocument","nextDocument","caretPos","createRangeAnchor","storyTargetKey","snapshot","fragment","options"]}
|