@beyondwork/docx-react-component 1.0.66 → 1.0.69
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/README.md +75 -931
- package/package.json +26 -27
- package/src/api/anchor-conversion.ts +43 -0
- package/src/api/editor-state-types.ts +2 -1
- package/src/api/public-types.ts +504 -101
- package/src/api/session-state.ts +4 -0
- package/src/api/v3/README.md +91 -0
- package/src/api/v3/_create.ts +146 -0
- package/src/api/v3/_layer-metadata.ts +362 -0
- package/src/api/v3/_mocks.ts +84 -0
- package/src/api/v3/_runtime-handle.ts +162 -0
- package/src/api/v3/_ux-response.ts +73 -0
- package/src/api/v3/ai/_metadata-audit.ts +225 -0
- package/src/api/v3/ai/attach.ts +235 -0
- package/src/api/v3/ai/bundle.ts +132 -0
- package/src/api/v3/ai/explain.ts +144 -0
- package/src/api/v3/ai/export.ts +54 -0
- package/src/api/v3/ai/inspect.ts +118 -0
- package/src/api/v3/ai/policy.ts +77 -0
- package/src/api/v3/ai/replacement.ts +341 -0
- package/src/api/v3/ai/resolve.ts +133 -0
- package/src/api/v3/index.ts +79 -0
- package/src/api/v3/runtime/chart.ts +310 -0
- package/src/api/v3/runtime/clipboard.ts +81 -0
- package/src/api/v3/runtime/collab.ts +331 -0
- package/src/api/v3/runtime/content.ts +236 -0
- package/src/api/v3/runtime/document.ts +282 -0
- package/src/api/v3/runtime/formatting.ts +186 -0
- package/src/api/v3/runtime/geometry.ts +349 -0
- package/src/api/v3/runtime/layout.ts +108 -0
- package/src/api/v3/runtime/review.ts +129 -0
- package/src/api/v3/runtime/search.ts +74 -0
- package/src/api/v3/runtime/table.ts +63 -0
- package/src/api/v3/runtime/workflow.ts +434 -0
- package/src/api/v3/ui/_context.ts +86 -0
- package/src/api/v3/ui/_create.ts +65 -0
- package/src/api/v3/ui/_types.ts +520 -0
- package/src/api/v3/ui/chrome-composition.ts +342 -0
- package/src/{ui-tailwind/chrome → api/v3/ui}/chrome-preset-model.ts +11 -1
- package/src/api/v3/ui/chrome.ts +476 -0
- package/src/api/v3/ui/debug.ts +124 -0
- package/src/api/v3/ui/index.ts +64 -0
- package/src/api/v3/ui/overlays-visibility.ts +170 -0
- package/src/api/v3/ui/overlays.ts +427 -0
- package/src/api/v3/ui/scope.ts +71 -0
- package/src/api/v3/ui/session.ts +100 -0
- package/src/api/v3/ui/surface.ts +170 -0
- package/src/api/v3/ui/viewport.ts +303 -0
- package/src/core/commands/index.ts +28 -6
- package/src/core/commands/list-commands.ts +3 -2
- package/src/core/commands/section-layout-commands.ts +9 -8
- package/src/core/schema/text-schema.ts +16 -0
- package/src/core/selection/mapping.ts +33 -72
- package/src/core/state/editor-state.ts +96 -189
- package/src/index.ts +23 -4
- package/src/io/chart-preview-resolver.ts +1 -1
- package/src/io/docx-session.ts +36 -4795
- package/src/io/export/build-app-properties-xml.ts +1 -1
- package/src/io/export/serialize-comments.ts +1 -1
- package/src/io/export/serialize-headers-footers.ts +6 -1
- package/src/io/export/serialize-main-document.ts +45 -0
- package/src/io/export/serialize-run-formatting.ts +17 -2
- package/src/io/export/twip.ts +1 -1
- package/src/io/normalize/normalize-text.ts +27 -20
- package/src/io/ooxml/chart/parse-series.ts +1 -1
- package/src/io/ooxml/chart/resolve-color.ts +2 -2
- package/src/io/ooxml/chart/types.ts +1 -1
- package/src/io/ooxml/classify-embedding.ts +83 -33
- package/src/io/ooxml/parse-fill.ts +1 -1
- package/src/io/ooxml/parse-main-document.ts +71 -1
- package/src/io/ooxml/parse-object.ts +14 -10
- package/src/io/ooxml/parse-run-formatting.ts +47 -1
- package/src/io/ooxml/property-grab-bag.ts +2 -2
- package/src/io/ooxml/units.ts +11 -0
- package/src/io/ooxml/workflow-payload.ts +282 -7
- package/src/model/anchor.ts +85 -0
- package/src/model/canonical-document.ts +351 -15
- package/src/model/chart-types.ts +1 -1
- package/src/model/layout/index.ts +83 -0
- package/src/model/layout/page-graph-types.ts +181 -0
- package/src/model/layout/page-layout-snapshot.ts +105 -0
- package/src/model/layout/resolved-layout-types.ts +47 -0
- package/src/model/layout/runtime-page-graph-types.ts +102 -0
- package/src/model/paragraph-scope-ids.ts +72 -0
- package/src/model/review/comment-types.ts +112 -0
- package/src/model/review/index.ts +2 -0
- package/src/model/review/revision-types.ts +215 -0
- package/src/model/snapshot.ts +32 -0
- package/src/review/store/comment-store.ts +21 -47
- package/src/review/store/revision-types.ts +40 -198
- package/src/runtime/collab/base-doc-fingerprint.ts +6 -1
- package/src/runtime/collab/runtime-collab-sync.ts +13 -3
- package/src/runtime/collab-session.ts +1 -1
- package/src/runtime/debug/build-debug-inspector-snapshot.ts +686 -0
- package/src/runtime/debug/event-ring-buffer.ts +64 -0
- package/src/runtime/debug/probability-sampler.ts +18 -0
- package/src/runtime/debug/runtime-debug-facet.ts +67 -0
- package/src/runtime/debug/stage-tokens.ts +31 -0
- package/src/runtime/debug/telemetry-bus.ts +271 -0
- package/src/runtime/debug/types.ts +275 -0
- package/src/runtime/debug/wrap-ref-for-telemetry.ts +118 -0
- package/src/runtime/document-layout.ts +8 -6
- package/src/runtime/document-runtime.ts +843 -1141
- package/src/runtime/document-search.ts +1 -1
- package/src/runtime/edit-ops/index.ts +1 -1
- package/src/runtime/external-send-runtime.ts +1 -1
- package/src/runtime/formatting/document-lookup.ts +235 -0
- package/src/runtime/formatting/field/registry.ts +41 -0
- package/src/runtime/{field-resolver.ts → formatting/field/resolver.ts} +27 -2
- package/src/runtime/formatting/font-resolution.ts +83 -0
- package/src/runtime/formatting/formatting-context.ts +903 -0
- package/src/runtime/formatting/formatting-types.ts +157 -0
- package/src/runtime/{hyperlink-color-resolver.ts → formatting/hyperlink-color.ts} +2 -2
- package/src/runtime/formatting/index.ts +125 -0
- package/src/runtime/{resolved-numbering-geometry.ts → formatting/numbering/geometry.ts} +1 -1
- package/src/runtime/{numbering-prefix.ts → formatting/numbering/prefix.ts} +170 -3
- package/src/runtime/formatting/paragraph-style-resolver.ts +92 -0
- package/src/runtime/formatting/projector.ts +75 -0
- package/src/runtime/formatting/resolve-effective.ts +407 -0
- package/src/runtime/formatting/revision-display.ts +105 -0
- package/src/runtime/{paragraph-style-resolver.ts → formatting/style-cascade.ts} +84 -141
- package/src/runtime/{table-style-resolver.ts → formatting/table-style-resolver.ts} +1 -1
- package/src/runtime/formatting/telemetry-bridge.ts +106 -0
- package/src/runtime/{theme-color-resolver.ts → formatting/theme-color.ts} +2 -30
- package/src/runtime/geometry/caret-geometry.ts +164 -0
- package/src/runtime/geometry/geometry-facet.ts +364 -0
- package/src/runtime/geometry/geometry-types.ts +256 -0
- package/src/runtime/geometry/hit-test.ts +125 -0
- package/src/runtime/geometry/index.ts +71 -0
- package/src/runtime/geometry/inert-geometry-facet.ts +43 -0
- package/src/runtime/geometry/invalidation.ts +35 -0
- package/src/runtime/geometry/object-handles.ts +77 -0
- package/src/runtime/geometry/overlay-rects.ts +85 -0
- package/src/runtime/geometry/project-anchors.ts +100 -0
- package/src/runtime/geometry/project-fragments.ts +216 -0
- package/src/runtime/geometry/projector.ts +129 -0
- package/src/runtime/geometry/replacement-envelope.ts +130 -0
- package/src/runtime/geometry/viewport.ts +218 -0
- package/src/runtime/layout/compat-input-ledger.ts +211 -0
- package/src/runtime/layout/index.ts +6 -1
- package/src/runtime/layout/inert-layout-facet.ts +12 -7
- package/src/runtime/layout/layout-engine-instance.ts +189 -11
- package/src/runtime/layout/layout-engine-version.ts +450 -1
- package/src/runtime/layout/layout-facet-types.ts +60 -0
- package/src/runtime/layout/layout-measurement-provider.ts +13 -0
- package/src/runtime/layout/measurement-backend-canvas.ts +14 -2
- package/src/runtime/layout/measurement-backend-empirical.ts +23 -4
- package/src/runtime/layout/page-graph.ts +62 -209
- package/src/runtime/layout/page-story-resolver.ts +7 -12
- package/src/runtime/layout/paginated-layout-engine.ts +186 -11
- package/src/runtime/layout/project-block-fragments.ts +11 -0
- package/src/runtime/layout/projector.ts +90 -0
- package/src/runtime/layout/public-facet.ts +187 -442
- package/src/runtime/layout/resolved-formatting-state.ts +158 -26
- package/src/runtime/layout/table-render-plan.ts +1 -1
- package/src/runtime/prerender/cache-envelope.ts +6 -1
- package/src/runtime/prerender/prerender-document.ts +18 -23
- package/src/runtime/render/decoration-resolver.ts +1 -1
- package/src/runtime/render/render-frame-types.ts +20 -0
- package/src/runtime/render/render-kernel.ts +94 -25
- package/src/runtime/scopes/_formatting-seam.ts +262 -0
- package/src/runtime/scopes/_scope-dependencies.ts +49 -0
- package/src/runtime/scopes/action-validation.ts +356 -0
- package/src/runtime/scopes/attach-explanation.ts +102 -0
- package/src/runtime/scopes/audit-bundle.ts +71 -0
- package/src/runtime/scopes/compile-scope-bundle.ts +163 -0
- package/src/runtime/scopes/compile-scope.ts +262 -0
- package/src/runtime/scopes/compiler-service.ts +431 -0
- package/src/runtime/scopes/create-issue.ts +107 -0
- package/src/runtime/scopes/enumerate-scopes.ts +543 -0
- package/src/runtime/scopes/evidence.ts +233 -0
- package/src/runtime/scopes/index.ts +150 -0
- package/src/runtime/scopes/position-map.ts +214 -0
- package/src/runtime/scopes/preservation-boundary.ts +91 -0
- package/src/runtime/scopes/projector.ts +49 -0
- package/src/runtime/scopes/replaceability.ts +87 -0
- package/src/runtime/scopes/replacement/apply.ts +228 -0
- package/src/runtime/scopes/replacement/compile.ts +59 -0
- package/src/runtime/scopes/replacement/propose.ts +42 -0
- package/src/runtime/scopes/resolve-reference.ts +347 -0
- package/src/runtime/scopes/review-bundle.ts +141 -0
- package/src/runtime/scopes/scope-kinds/_paragraph-text.ts +57 -0
- package/src/runtime/scopes/scope-kinds/_table-text.ts +42 -0
- package/src/runtime/scopes/scope-kinds/comment-thread.ts +59 -0
- package/src/runtime/scopes/scope-kinds/field.ts +65 -0
- package/src/runtime/scopes/scope-kinds/heading.ts +84 -0
- package/src/runtime/scopes/scope-kinds/list-item.ts +77 -0
- package/src/runtime/scopes/scope-kinds/paragraph.ts +182 -0
- package/src/runtime/scopes/scope-kinds/revision.ts +62 -0
- package/src/runtime/scopes/scope-kinds/table-cell.ts +57 -0
- package/src/runtime/scopes/scope-kinds/table-row.ts +61 -0
- package/src/runtime/scopes/scope-kinds/table.ts +55 -0
- package/src/runtime/scopes/scope-range.ts +208 -0
- package/src/runtime/scopes/semantic-scope-types.ts +454 -0
- package/src/runtime/scopes/workflow-overlap.ts +92 -0
- package/src/runtime/selection/index.ts +1 -1
- package/src/runtime/structure-ops/fragment-insert.ts +1 -1
- package/src/runtime/structure-ops/index.ts +1 -1
- package/src/runtime/surface-projection.ts +232 -262
- package/src/runtime/units.ts +4 -2
- package/src/runtime/workflow/coordinator.ts +1348 -0
- package/src/runtime/workflow/derived-scope-resolver.ts +125 -0
- package/src/runtime/workflow/index.ts +25 -0
- package/src/runtime/workflow/markup-mode-policy.ts +98 -0
- package/src/runtime/{workflow-markup.ts → workflow/markup.ts} +6 -6
- package/src/runtime/workflow/metadata-persistence.ts +306 -0
- package/src/runtime/workflow/metadata-writer.ts +123 -0
- package/src/runtime/workflow/overlay-store.ts +690 -0
- package/src/runtime/workflow/projector.ts +127 -0
- package/src/runtime/{query-scopes.ts → workflow/query-scopes.ts} +3 -3
- package/src/runtime/{workflow-rail-segments.ts → workflow/rail/compose.ts} +60 -165
- package/src/runtime/workflow/rail/types.ts +198 -0
- package/src/runtime/workflow/scope-rail-composer.ts +39 -0
- package/src/runtime/{scope-resolver.ts → workflow/scope-resolver.ts} +3 -3
- package/src/runtime/workflow/scope-writer.ts +188 -0
- package/src/runtime/{tamper-gate.ts → workflow/tamper-gate.ts} +1 -1
- package/src/runtime/workflow/visibility-policy.ts +129 -0
- package/src/session/_sync-legacy.ts +66 -0
- package/src/session/export/embedded-reconstitute.ts +104 -0
- package/src/session/export/export-diagnostics.ts +85 -0
- package/src/session/export/export-validation.ts +110 -0
- package/src/session/export/index.ts +34 -0
- package/src/session/export/preservation-reattach.ts +30 -0
- package/src/session/export/serialize-dispatch.ts +165 -0
- package/src/session/export/stateful-export-pipeline.ts +432 -0
- package/src/session/export/stateful-export.ts +684 -0
- package/src/session/import/canonical-assembly.ts +227 -0
- package/src/session/import/diagnostics-session.ts +54 -0
- package/src/session/import/embedded-discovery.ts +225 -0
- package/src/session/import/embedded-offload.ts +337 -0
- package/src/session/import/import-diagnostics.ts +69 -0
- package/src/session/import/loader-types.ts +313 -0
- package/src/session/import/loader.ts +1834 -0
- package/src/session/import/normalize.ts +195 -0
- package/src/session/import/package-parts.ts +217 -0
- package/src/session/import/package-read.ts +195 -0
- package/src/session/import/parse-orchestration.ts +105 -0
- package/src/session/import/part-constants.ts +70 -0
- package/src/session/import/part-discovery.ts +94 -0
- package/src/session/import/preservation-index.ts +46 -0
- package/src/{runtime/read-only-diagnostics-runtime.ts → session/import/read-only-diagnostics.ts} +24 -3
- package/src/session/import/review-import.ts +508 -0
- package/src/session/import/styles-consolidation.ts +281 -0
- package/src/session/import/workflow-scope-import.ts +256 -0
- package/src/session/index.ts +37 -0
- package/src/session/session-state.ts +69 -0
- package/src/session/session.ts +532 -0
- package/src/session/shared/protection.ts +228 -0
- package/src/session/shared/session-utils.ts +82 -0
- package/src/session/types.ts +499 -0
- package/src/shell/chart-snapshots.ts +96 -0
- package/src/shell/media-previews.ts +85 -0
- package/src/shell/overlay-anchor-bridge.ts +53 -0
- package/src/shell/paste-adapter.ts +23 -0
- package/src/shell/ref-commands.ts +1697 -0
- package/src/shell/ref-utilities.ts +48 -0
- package/src/shell/search.ts +51 -0
- package/src/{ui/editor-runtime-boundary.ts → shell/session-bootstrap.ts} +243 -67
- package/src/shell/ui-subscriber-channels.ts +81 -0
- package/src/shell/use-collab-sync.ts +116 -0
- package/src/ui/WordReviewEditor.tsx +496 -2051
- package/src/ui/editor-shell-view.tsx +30 -1
- package/src/ui/editor-surface-controller.tsx +49 -1
- package/src/ui/headless/revision-decoration-model.ts +83 -0
- package/src/{ui-tailwind/chrome → ui/headless}/role-action-sets.ts +1 -1
- package/src/ui/headless/scoped-chrome-policy.ts +2 -2
- package/src/ui/headless/selection-tool-context.ts +1 -1
- package/src/ui/headless/selection-tool-resolver.ts +1 -1
- package/src/ui/runtime-shortcut-dispatch.ts +46 -1
- package/src/ui/ui-controller-factory.ts +221 -0
- package/src/ui-tailwind/chart/ChartSurface.tsx +2 -2
- package/src/ui-tailwind/chart/layout/legend-layout.ts +1 -1
- package/src/ui-tailwind/chart/layout/plot-area.ts +2 -2
- package/src/ui-tailwind/chart/layout/title-layout.ts +1 -1
- package/src/ui-tailwind/chart/render/area.tsx +3 -3
- package/src/ui-tailwind/chart/render/bar-column.tsx +3 -3
- package/src/ui-tailwind/chart/render/bubble.tsx +3 -3
- package/src/ui-tailwind/chart/render/combo.tsx +2 -2
- package/src/ui-tailwind/chart/render/data-labels.tsx +2 -2
- package/src/ui-tailwind/chart/render/font-metrics.ts +2 -2
- package/src/ui-tailwind/chart/render/line.tsx +3 -3
- package/src/ui-tailwind/chart/render/pie.tsx +6 -6
- package/src/ui-tailwind/chart/render/scatter.tsx +3 -3
- package/src/ui-tailwind/chart/render/svg-primitives.ts +3 -3
- package/src/ui-tailwind/chart/render/unsupported.tsx +2 -2
- package/src/ui-tailwind/chrome/build-context-menu-entries.ts +88 -0
- package/src/ui-tailwind/chrome/chrome-preset-toolbar.tsx +1 -1
- package/src/ui-tailwind/chrome/collab-send-to-supplier-button.tsx +1 -1
- package/src/ui-tailwind/chrome/collab-tamper-banner.tsx +1 -1
- package/src/ui-tailwind/chrome/collab-top-nav-container.tsx +1 -1
- package/src/ui-tailwind/chrome/editor-action-registry.ts +553 -0
- package/src/ui-tailwind/chrome/editor-actions-to-palette.ts +182 -0
- package/src/ui-tailwind/chrome/local-surface-arbiter.ts +534 -0
- package/src/ui-tailwind/chrome/resolve-target-kind.ts +226 -0
- package/src/ui-tailwind/chrome/tw-alert-banner.tsx +38 -4
- package/src/ui-tailwind/chrome/tw-context-band.tsx +125 -0
- package/src/ui-tailwind/chrome/tw-context-menu-portal.tsx +248 -0
- package/src/ui-tailwind/chrome/tw-image-context-toolbar.tsx +42 -1
- package/src/ui-tailwind/chrome/tw-selection-anchor-resolver.ts +8 -7
- package/src/ui-tailwind/chrome/tw-selection-tool-blocked.tsx +38 -4
- package/src/ui-tailwind/chrome/tw-selection-tool-comment.tsx +104 -6
- package/src/ui-tailwind/chrome/tw-selection-tool-host.tsx +66 -7
- package/src/ui-tailwind/chrome/tw-selection-tool-workflow.tsx +54 -8
- package/src/ui-tailwind/chrome/tw-shortcut-hint.tsx +7 -1
- package/src/ui-tailwind/chrome/tw-suggestion-card.tsx +33 -0
- package/src/ui-tailwind/chrome/tw-table-context-toolbar.tsx +78 -1
- package/src/ui-tailwind/chrome/tw-table-grip-layer.tsx +16 -8
- package/src/ui-tailwind/chrome/tw-workspace-chrome-host.tsx +276 -0
- package/src/ui-tailwind/chrome/use-context-menu-controller.ts +201 -0
- package/src/ui-tailwind/chrome-overlay/chrome-overlay-projector.ts +1 -1
- package/src/ui-tailwind/chrome-overlay/tw-chrome-overlay.tsx +22 -4
- package/src/ui-tailwind/chrome-overlay/tw-comment-balloon-layer.tsx +1 -1
- package/src/ui-tailwind/chrome-overlay/tw-locked-block-layer.tsx +1 -1
- package/src/ui-tailwind/chrome-overlay/tw-object-selection-overlay.tsx +11 -5
- package/src/ui-tailwind/chrome-overlay/tw-page-stack-overlay-layer.tsx +197 -3
- package/src/ui-tailwind/chrome-overlay/tw-revision-margin-bar-layer.tsx +1 -1
- package/src/ui-tailwind/chrome-overlay/tw-scope-card-layer.tsx +35 -6
- package/src/ui-tailwind/chrome-overlay/tw-scope-rail-layer.tsx +24 -16
- package/src/ui-tailwind/chrome-overlay/tw-table-continuation-header.tsx +1 -1
- package/src/ui-tailwind/debug/README.md +57 -0
- package/src/ui-tailwind/debug/index.ts +3 -0
- package/src/ui-tailwind/debug/tw-debug-overlay.tsx +186 -0
- package/src/ui-tailwind/debug/tw-debug-presentation.tsx +80 -0
- package/src/ui-tailwind/debug/tw-debug-top-bar.tsx +83 -0
- package/src/ui-tailwind/editor-surface/chart-node-view.tsx +2 -2
- package/src/ui-tailwind/editor-surface/float-wrap-resolver.ts +1 -1
- package/src/ui-tailwind/editor-surface/pm-command-bridge.ts +135 -10
- package/src/ui-tailwind/editor-surface/pm-decorations.ts +40 -13
- package/src/ui-tailwind/editor-surface/pm-page-break-decorations.ts +1 -1
- package/src/ui-tailwind/editor-surface/pm-schema.ts +1 -1
- package/src/ui-tailwind/editor-surface/pm-state-from-snapshot.ts +3 -3
- package/src/ui-tailwind/editor-surface/predicted-tag-preflight.ts +1 -1
- package/src/ui-tailwind/editor-surface/remote-cursor-plugin.ts +2 -2
- package/src/ui-tailwind/editor-surface/scroll-anchor.ts +91 -9
- package/src/ui-tailwind/editor-surface/shape-renderer.ts +1 -1
- package/src/ui-tailwind/editor-surface/surface-layer.ts +1 -1
- package/src/ui-tailwind/editor-surface/tw-opaque-block.tsx +1 -1
- package/src/ui-tailwind/editor-surface/tw-page-block-view.helpers.ts +23 -6
- package/src/ui-tailwind/editor-surface/tw-prosemirror-surface.tsx +132 -22
- package/src/ui-tailwind/editor-surface/tw-table-node-view.tsx +1 -1
- package/src/ui-tailwind/index.ts +0 -5
- package/src/ui-tailwind/overlay-anchor-bridge-context.tsx +33 -0
- package/src/ui-tailwind/page-stack/floating-image-overlay-model.ts +66 -29
- package/src/ui-tailwind/page-stack/tw-floating-image-layer.tsx +25 -2
- package/src/ui-tailwind/review/comment-markdown-renderer.tsx +15 -0
- package/src/ui-tailwind/review/tw-review-rail.tsx +92 -4
- package/src/ui-tailwind/review/tw-workflow-tab.tsx +1 -1
- package/src/ui-tailwind/review-workspace/page-chrome.ts +210 -0
- package/src/ui-tailwind/review-workspace/page-shell-metrics.ts +101 -0
- package/src/ui-tailwind/review-workspace/paragraph-layout.ts +115 -0
- package/src/ui-tailwind/review-workspace/selection-toolbar-placement.ts +97 -0
- package/src/ui-tailwind/review-workspace/tw-review-workspace-navigator.tsx +130 -0
- package/src/ui-tailwind/review-workspace/tw-review-workspace-page-toolbar.tsx +240 -0
- package/src/ui-tailwind/review-workspace/tw-review-workspace-rail.tsx +59 -0
- package/src/ui-tailwind/review-workspace/types.ts +408 -0
- package/src/ui-tailwind/review-workspace/use-chrome-policy.ts +104 -0
- package/src/ui-tailwind/review-workspace/use-derived-view-state.ts +151 -0
- package/src/ui-tailwind/review-workspace/use-diagnostics-signal.ts +70 -0
- package/src/ui-tailwind/review-workspace/use-grabbed-segment-offsets.ts +40 -0
- package/src/ui-tailwind/review-workspace/use-layout-facet-render-signal.ts +55 -0
- package/src/ui-tailwind/review-workspace/use-page-markers.ts +130 -0
- package/src/ui-tailwind/review-workspace/use-pm-surface-capture.ts +60 -0
- package/src/ui-tailwind/review-workspace/use-review-rail-state.ts +63 -0
- package/src/ui-tailwind/review-workspace/use-scope-card-state.ts +170 -0
- package/src/ui-tailwind/review-workspace/use-scroll-root-capture.ts +28 -0
- package/src/ui-tailwind/review-workspace/use-selection-toolbar-placement.ts +113 -0
- package/src/ui-tailwind/review-workspace/use-shell-selection-anchor-bridge.ts +120 -0
- package/src/ui-tailwind/review-workspace/use-status-bar-page-facts.ts +55 -0
- package/src/ui-tailwind/review-workspace/use-viewport-dimensions.ts +43 -0
- package/src/ui-tailwind/review-workspace/use-workspace-arbiter.ts +25 -0
- package/src/ui-tailwind/review-workspace/use-workspace-composition.ts +86 -0
- package/src/ui-tailwind/review-workspace/use-workspace-side-effects.ts +150 -0
- package/src/ui-tailwind/theme/editor-theme.css +25 -0
- package/src/ui-tailwind/toolbar/tw-role-action-region.tsx +2 -2
- package/src/ui-tailwind/toolbar/tw-toolbar.tsx +61 -98
- package/src/ui-tailwind/tw-review-workspace.tsx +521 -1802
- package/src/ui-tailwind/ui-api-context.tsx +43 -0
- package/src/ui-tailwind/ui-shell-channels-context.tsx +49 -0
- package/src/validation/compatibility-engine.ts +6 -6
- package/src/runtime/styles-cascade.ts +0 -33
- package/src/ui-tailwind/chrome/tw-mode-dock.tsx +0 -85
- /package/src/runtime/{page-number-format.ts → formatting/field/page-number-format.ts} +0 -0
- /package/src/runtime/{ai-action-policy.ts → workflow/ai-action-policy.ts} +0 -0
- /package/src/runtime/{scope-tag-registry.ts → workflow/scope-tag-registry.ts} +0 -0
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
// @internal — Runtime debug projector types.
|
|
2
|
+
//
|
|
3
|
+
// These types are the JSON contract the React dev-drawer and the agentic
|
|
4
|
+
// debug service (`services/debug/`) both consume. They compose already-shipped
|
|
5
|
+
// public types — nothing here is a new schema invented for the projector
|
|
6
|
+
// except the scope-discrimination fields on `ScopeDebugEntry`, which expose
|
|
7
|
+
// information the runtime already tracks (`markerBackedScopeIds`,
|
|
8
|
+
// `normalizeWorkflowOverlayForDocument` detach reasons) but has never
|
|
9
|
+
// surfaced in typed form.
|
|
10
|
+
//
|
|
11
|
+
// Priority ordering follows user intent 2026-04-20:
|
|
12
|
+
// 1. OOXML audit + scope debugging (top-priority signal)
|
|
13
|
+
// 2. Rendering (secondary)
|
|
14
|
+
|
|
15
|
+
import type {
|
|
16
|
+
CompatibilityReport,
|
|
17
|
+
DocumentLocationSnapshot,
|
|
18
|
+
EditorAnchorProjection,
|
|
19
|
+
EditorStoryTarget,
|
|
20
|
+
EditorWarning,
|
|
21
|
+
InteractionGuardSnapshot,
|
|
22
|
+
RuntimeContextAnalyticsSnapshot,
|
|
23
|
+
ScopeQueryResult,
|
|
24
|
+
ScopeVisibility,
|
|
25
|
+
WorkflowBlockedCommandReason,
|
|
26
|
+
WorkflowOverlay,
|
|
27
|
+
WorkflowScope,
|
|
28
|
+
WorkflowScopeMode,
|
|
29
|
+
} from "../../api/public-types.ts";
|
|
30
|
+
import type { FormattingDebugEntry } from "../formatting/projector.ts";
|
|
31
|
+
import type { GeometryDebugEntry } from "../geometry/projector.ts";
|
|
32
|
+
import type { LayoutDebugEntry } from "../layout/projector.ts";
|
|
33
|
+
|
|
34
|
+
/* -------------------------------------------------------------------------- */
|
|
35
|
+
/* Query + channel discriminants */
|
|
36
|
+
/* -------------------------------------------------------------------------- */
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Telemetry channels the runtime can emit on. All channels are off by default;
|
|
40
|
+
* consumers of the Phase 1 `TelemetryBus` turn them on per session. Zero cost
|
|
41
|
+
* when disabled — the bus bitmap-checks before allocating the event object.
|
|
42
|
+
*
|
|
43
|
+
* Per-channel emission status (as of F-1 wiring, 2026-04-20):
|
|
44
|
+
* - `api` / `parse` / `serialize` / `io` — active, emit on every trigger.
|
|
45
|
+
* - `scope` / `warning` / `selection` — wired; emit only on triggering ops.
|
|
46
|
+
* - `render` / `command` / `commit` / `collab` / `layout` — RESERVED. The
|
|
47
|
+
* channel bits exist so `setChannels` calls stay API-stable, but no
|
|
48
|
+
* emission sites exist in `src/` yet. Phase C of the doc-debug build plan
|
|
49
|
+
* adds them. Subscribing to one of these today produces zero signal —
|
|
50
|
+
* this is documented, not a bug. See
|
|
51
|
+
* `services/debug/docs/substrate-code-review-2026-04-20.md` §F-2.
|
|
52
|
+
*/
|
|
53
|
+
export type TelemetryChannel =
|
|
54
|
+
| "api" // every public-ref-method invocation (wraps useImperativeHandle)
|
|
55
|
+
| "parse" // OOXML import dispatch per element
|
|
56
|
+
| "serialize" // OOXML export dispatch per element
|
|
57
|
+
| "render" // RESERVED (Phase C): PM projection entry
|
|
58
|
+
| "command" // RESERVED (Phase C): internal command dispatch (src/core/commands/**)
|
|
59
|
+
| "scope" // scope lifecycle (attach/detach/invalidate)
|
|
60
|
+
| "warning" // warnings emitted
|
|
61
|
+
| "selection" // selection commits
|
|
62
|
+
| "commit" // RESERVED (Phase C): the single commit entry point in the runtime
|
|
63
|
+
| "collab" // RESERVED (Phase C): remote-replay + mismatch events
|
|
64
|
+
| "layout" // RESERVED (Phase C): coarse layout-facet recompute boundary
|
|
65
|
+
| "io" // docx-session load/export
|
|
66
|
+
| "formatting"; // layer-03 cascade + theme + numbering + field resolution
|
|
67
|
+
|
|
68
|
+
export interface DebugInspectorQuery {
|
|
69
|
+
/** Include the `textProjection` section. Expensive; default `false`. */
|
|
70
|
+
readonly includeTextProjection?: boolean;
|
|
71
|
+
/** Include a tail of recent telemetry events (Phase 1+ only). Default `false`. */
|
|
72
|
+
readonly includeEvents?: boolean;
|
|
73
|
+
/** Maximum events returned when `includeEvents` is true. Default 64. */
|
|
74
|
+
readonly maxEvents?: number;
|
|
75
|
+
/** Filter scopes before projecting `ScopeDebugEntry[]`. */
|
|
76
|
+
readonly scopeFilter?: {
|
|
77
|
+
readonly scopeIds?: readonly string[];
|
|
78
|
+
readonly modes?: readonly WorkflowScopeMode[];
|
|
79
|
+
readonly source?: ScopeDebugSource | readonly ScopeDebugSource[];
|
|
80
|
+
readonly onlyDetached?: boolean;
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/* -------------------------------------------------------------------------- */
|
|
85
|
+
/* Scope debug — the top-priority section */
|
|
86
|
+
/* -------------------------------------------------------------------------- */
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* The architectural fault line the plan must surface explicitly.
|
|
90
|
+
*
|
|
91
|
+
* - `marker-backed` — scope id is present in `collectScopeLocations(doc)`
|
|
92
|
+
* AND in the overlay. Anchor can be derived from
|
|
93
|
+
* marker positions; structural edits auto-update it.
|
|
94
|
+
* - `overlay-only` — scope id is in the overlay but not in the document's
|
|
95
|
+
* `collectScopeLocations` set. Anchor is static (from
|
|
96
|
+
* overlay JSON) and can drift across edits.
|
|
97
|
+
* - `detached` — scope id was marker-backed but its markers were
|
|
98
|
+
* removed by a structural edit; anchor is now a
|
|
99
|
+
* `detached` projection with `lastKnownRange`.
|
|
100
|
+
*/
|
|
101
|
+
export type ScopeDebugSource = "marker-backed" | "overlay-only" | "detached";
|
|
102
|
+
|
|
103
|
+
/** Whether both marker nodes are present, only one, or neither. */
|
|
104
|
+
export type ScopeMarkerState = "complete" | "start-only" | "end-only" | "missing";
|
|
105
|
+
|
|
106
|
+
export interface ScopeDebugEntry {
|
|
107
|
+
readonly scopeId: string;
|
|
108
|
+
readonly label?: string;
|
|
109
|
+
readonly mode: WorkflowScopeMode;
|
|
110
|
+
readonly visibility: ScopeVisibility;
|
|
111
|
+
readonly storyTarget: EditorStoryTarget;
|
|
112
|
+
readonly source: ScopeDebugSource;
|
|
113
|
+
readonly liveAnchor: EditorAnchorProjection;
|
|
114
|
+
readonly storedOverlayAnchor: EditorAnchorProjection | null;
|
|
115
|
+
readonly trusted: boolean;
|
|
116
|
+
readonly markerState: ScopeMarkerState;
|
|
117
|
+
readonly detachedReason?:
|
|
118
|
+
| "deleted"
|
|
119
|
+
| "invalidatedByStructureChange"
|
|
120
|
+
| "importAmbiguity";
|
|
121
|
+
readonly warningId?: string;
|
|
122
|
+
readonly lastKnownRange?: { readonly from: number; readonly to: number };
|
|
123
|
+
readonly location: DocumentLocationSnapshot | null;
|
|
124
|
+
/**
|
|
125
|
+
* F-15: all metadata entries from the scope's overlay record, not just the
|
|
126
|
+
* first. One object per `overlayScope.metadata[i]` whose shape carries any
|
|
127
|
+
* of `key` / `storageRef` / `metadataVersion`. Absent when the scope has no
|
|
128
|
+
* `metadataRefs` / `metadata` attached.
|
|
129
|
+
*/
|
|
130
|
+
readonly metadataLookups?: readonly {
|
|
131
|
+
readonly metadataId?: string;
|
|
132
|
+
readonly storageRef?: string;
|
|
133
|
+
readonly metadataVersion?: number;
|
|
134
|
+
}[];
|
|
135
|
+
readonly excerpt?: {
|
|
136
|
+
readonly before: string;
|
|
137
|
+
readonly inside: string;
|
|
138
|
+
readonly after: string;
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/* -------------------------------------------------------------------------- */
|
|
143
|
+
/* Projector bundle */
|
|
144
|
+
/* -------------------------------------------------------------------------- */
|
|
145
|
+
|
|
146
|
+
export interface DebugInspectorSessionSection {
|
|
147
|
+
readonly documentId: string;
|
|
148
|
+
readonly sessionId: string;
|
|
149
|
+
readonly dirty: boolean;
|
|
150
|
+
readonly exportBlocked: boolean;
|
|
151
|
+
readonly activeStory: EditorStoryTarget;
|
|
152
|
+
readonly workspaceMode: "canvas" | "page";
|
|
153
|
+
readonly viewMode: string;
|
|
154
|
+
readonly documentMode: string;
|
|
155
|
+
readonly measurementFidelity: string | null;
|
|
156
|
+
readonly currentPage: number | null;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export interface DebugInspectorHealthSection {
|
|
160
|
+
readonly compatibility: CompatibilityReport;
|
|
161
|
+
readonly warnings: readonly EditorWarning[];
|
|
162
|
+
readonly blockedReasons: readonly WorkflowBlockedCommandReason[];
|
|
163
|
+
readonly fatalError: { readonly code: string; readonly message: string } | null;
|
|
164
|
+
readonly readOnly: boolean;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export interface DebugInspectorSelectionSection {
|
|
168
|
+
readonly anchor: EditorAnchorProjection | null;
|
|
169
|
+
readonly location: DocumentLocationSnapshot | null;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export interface DebugInspectorWorkflowSection {
|
|
173
|
+
readonly overlay: WorkflowOverlay | null;
|
|
174
|
+
readonly activeWorkItemId: string | null;
|
|
175
|
+
readonly metadataPersistenceMode: string | null;
|
|
176
|
+
readonly candidateCount: number;
|
|
177
|
+
readonly scopeCount: number;
|
|
178
|
+
readonly markerBackedCount: number;
|
|
179
|
+
readonly overlayOnlyCount: number;
|
|
180
|
+
readonly detachedCount: number;
|
|
181
|
+
/**
|
|
182
|
+
* Layer-06 Slice 3 — richer projector (`WorkflowDebugEntry`) populated
|
|
183
|
+
* when `scope` or `warning` telemetry channels are on. Carries guard
|
|
184
|
+
* snapshot, tamper-gate state, AI-policy stats, and metadata counts in
|
|
185
|
+
* one object so the debug inspector does not need a separate second
|
|
186
|
+
* pass. Absent when neither channel is active.
|
|
187
|
+
*/
|
|
188
|
+
readonly debugEntry?: import("../workflow/projector.ts").WorkflowDebugEntry;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export interface DebugInspectorReviewSection {
|
|
192
|
+
readonly unresolvedCommentCount: number;
|
|
193
|
+
readonly pendingRevisionCount: number;
|
|
194
|
+
readonly detachedCommentCount: number;
|
|
195
|
+
readonly detachedRevisionCount: number;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export interface DebugInspectorLayoutSection {
|
|
199
|
+
readonly pageCount: number | null;
|
|
200
|
+
readonly sectionCount: number | null;
|
|
201
|
+
readonly storyCount: number;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* One telemetry event. Produced by hook-points throughout the runtime and
|
|
206
|
+
* pushed through `TelemetryBus` into per-channel ring buffers.
|
|
207
|
+
*
|
|
208
|
+
* `type` is a dotted identifier — e.g. `"parse.w:p.accepted"`,
|
|
209
|
+
* `"ref.addComment"`, `"scope.detached"`. The channel + type pair is the
|
|
210
|
+
* stable join key; `payload` is channel-specific and MAY change across
|
|
211
|
+
* versions.
|
|
212
|
+
*
|
|
213
|
+
* `seq` is bus-assigned; callers must not set it. `t` is filled by the bus
|
|
214
|
+
* if absent.
|
|
215
|
+
*/
|
|
216
|
+
export interface RuntimeTelemetryEvent {
|
|
217
|
+
readonly channel: TelemetryChannel;
|
|
218
|
+
readonly type: string;
|
|
219
|
+
readonly t: number;
|
|
220
|
+
readonly payload?: unknown;
|
|
221
|
+
readonly seq?: number;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
export interface DebugInspectorSnapshot {
|
|
225
|
+
readonly schemaVersion: 1;
|
|
226
|
+
readonly generatedAtUtc: string;
|
|
227
|
+
readonly session: DebugInspectorSessionSection;
|
|
228
|
+
readonly health: DebugInspectorHealthSection;
|
|
229
|
+
readonly context: RuntimeContextAnalyticsSnapshot | null;
|
|
230
|
+
readonly selection: DebugInspectorSelectionSection;
|
|
231
|
+
readonly workflow: DebugInspectorWorkflowSection;
|
|
232
|
+
readonly scopes: readonly ScopeDebugEntry[];
|
|
233
|
+
readonly review: DebugInspectorReviewSection;
|
|
234
|
+
readonly layout: DebugInspectorLayoutSection;
|
|
235
|
+
readonly events?: readonly RuntimeTelemetryEvent[];
|
|
236
|
+
readonly textProjection?: unknown;
|
|
237
|
+
readonly partialFallbacks?: readonly string[];
|
|
238
|
+
readonly channels?: Record<TelemetryChannel, boolean>;
|
|
239
|
+
/**
|
|
240
|
+
* Layer 03 formatting-resolution summary. Populated when the
|
|
241
|
+
* `formatting` telemetry channel is enabled on the bus; absent
|
|
242
|
+
* otherwise. Produced by
|
|
243
|
+
* `src/runtime/formatting/projector.ts::buildFormattingDebugEntry`.
|
|
244
|
+
*/
|
|
245
|
+
readonly formatting?: FormattingDebugEntry;
|
|
246
|
+
/**
|
|
247
|
+
* Layer 05 geometry-projection summary. Populated when the `layout`
|
|
248
|
+
* telemetry channel is enabled on the bus; absent otherwise.
|
|
249
|
+
* Produced by
|
|
250
|
+
* `src/runtime/geometry/projector.ts::buildGeometryDebugEntry`.
|
|
251
|
+
*/
|
|
252
|
+
readonly geometry?: GeometryDebugEntry;
|
|
253
|
+
/**
|
|
254
|
+
* Layer 04 layout summary. Populated when the `layout` telemetry
|
|
255
|
+
* channel is enabled on the bus; absent otherwise. Produced by
|
|
256
|
+
* `src/runtime/layout/projector.ts::buildLayoutDebugEntry`.
|
|
257
|
+
* Complements `geometry?` — `geometry` describes the projected frame
|
|
258
|
+
* state (rects, caret, viewport); `layoutDebug` describes the
|
|
259
|
+
* pagination state (page count, sections, measurement fidelity,
|
|
260
|
+
* dirty-field families, engine version). Refactor/04 Slice 3.
|
|
261
|
+
*/
|
|
262
|
+
readonly layoutDebug?: LayoutDebugEntry;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
export interface ScopeDebugProjectionInputs {
|
|
266
|
+
readonly scopeQueryResult: ScopeQueryResult;
|
|
267
|
+
readonly overlayScope: WorkflowScope | null;
|
|
268
|
+
readonly markerBackedScopeIds: ReadonlySet<string>;
|
|
269
|
+
readonly markerPresence: {
|
|
270
|
+
readonly hasStart: boolean;
|
|
271
|
+
readonly hasEnd: boolean;
|
|
272
|
+
};
|
|
273
|
+
readonly location: DocumentLocationSnapshot | null;
|
|
274
|
+
readonly relatedWarning: EditorWarning | null;
|
|
275
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
// @internal — Wrap the public ref with a Proxy that emits `api`-channel
|
|
2
|
+
// telemetry events on every method invocation, when the channel is on.
|
|
3
|
+
//
|
|
4
|
+
// Zero cost when the `api` channel is off:
|
|
5
|
+
// - The Proxy `get` trap still runs, but all it does is return the bound
|
|
6
|
+
// method OR the wrapped version. Method wrapping is memoized on a
|
|
7
|
+
// per-property WeakMap so we don't allocate a new closure per access.
|
|
8
|
+
// - The wrapped closure's first action is `bus.isEnabled("api")`. If off,
|
|
9
|
+
// it straight-calls the target and returns — one bitmask AND + one call.
|
|
10
|
+
//
|
|
11
|
+
// Used by `src/ui/WordReviewEditor.tsx` around the ref value returned from
|
|
12
|
+
// `useImperativeHandle`. Not used inside `buildRefProjections` because all
|
|
13
|
+
// facet methods ultimately dispatch through the ref, so a single wrap at
|
|
14
|
+
// the top-level ref is enough to see every agent invocation.
|
|
15
|
+
|
|
16
|
+
import type { TelemetryBus } from "./telemetry-bus.ts";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Wrap any ref-like object. Only function properties are traced; getters /
|
|
20
|
+
* non-function values pass through untouched. A single shared cache ensures
|
|
21
|
+
* the Proxy returns stable function references per method name.
|
|
22
|
+
*/
|
|
23
|
+
export function wrapRefForTelemetry<T extends object>(ref: T, bus: TelemetryBus): T {
|
|
24
|
+
const cache = new Map<string | symbol, unknown>();
|
|
25
|
+
return new Proxy(ref, {
|
|
26
|
+
get(target, property) {
|
|
27
|
+
const original = Reflect.get(target, property, target);
|
|
28
|
+
if (typeof original !== "function") return original;
|
|
29
|
+
const cached = cache.get(property);
|
|
30
|
+
if (cached) return cached;
|
|
31
|
+
const methodName = typeof property === "symbol" ? property.description ?? "symbol" : property;
|
|
32
|
+
const wrapped = createTracedMethod(bus, target, methodName as string, original as Function);
|
|
33
|
+
cache.set(property, wrapped);
|
|
34
|
+
return wrapped;
|
|
35
|
+
},
|
|
36
|
+
}) as T;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function createTracedMethod(
|
|
40
|
+
bus: TelemetryBus,
|
|
41
|
+
thisArg: unknown,
|
|
42
|
+
methodName: string,
|
|
43
|
+
fn: Function,
|
|
44
|
+
): Function {
|
|
45
|
+
return function tracedMethod(this: unknown, ...args: unknown[]) {
|
|
46
|
+
if (!bus.isEnabled("api")) {
|
|
47
|
+
return fn.apply(thisArg, args);
|
|
48
|
+
}
|
|
49
|
+
const start = now();
|
|
50
|
+
let ok = true;
|
|
51
|
+
let err: unknown;
|
|
52
|
+
let isAsync = false;
|
|
53
|
+
try {
|
|
54
|
+
const result = fn.apply(thisArg, args);
|
|
55
|
+
if (result != null && typeof (result as { then?: unknown }).then === "function") {
|
|
56
|
+
isAsync = true;
|
|
57
|
+
return (result as PromiseLike<unknown>).then(
|
|
58
|
+
(value) => {
|
|
59
|
+
emitApiEvent(bus, methodName, args, start, true, undefined, true);
|
|
60
|
+
return value;
|
|
61
|
+
},
|
|
62
|
+
(failure) => {
|
|
63
|
+
emitApiEvent(bus, methodName, args, start, false, failure, true);
|
|
64
|
+
throw failure;
|
|
65
|
+
},
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
return result;
|
|
69
|
+
} catch (caught) {
|
|
70
|
+
ok = false;
|
|
71
|
+
err = caught;
|
|
72
|
+
throw caught;
|
|
73
|
+
} finally {
|
|
74
|
+
if (!isAsync) {
|
|
75
|
+
emitApiEvent(bus, methodName, args, start, ok, err, false);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function emitApiEvent(
|
|
82
|
+
bus: TelemetryBus,
|
|
83
|
+
methodName: string,
|
|
84
|
+
args: unknown[],
|
|
85
|
+
start: number,
|
|
86
|
+
ok: boolean,
|
|
87
|
+
error: unknown,
|
|
88
|
+
async_: boolean,
|
|
89
|
+
): void {
|
|
90
|
+
bus.emit({
|
|
91
|
+
channel: "api",
|
|
92
|
+
type: `ref.${methodName}`,
|
|
93
|
+
t: now(),
|
|
94
|
+
payload: {
|
|
95
|
+
ok,
|
|
96
|
+
ms: now() - start,
|
|
97
|
+
argc: args.length,
|
|
98
|
+
async: async_,
|
|
99
|
+
...(ok ? {} : { error: stringifyError(error) }),
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function now(): number {
|
|
105
|
+
if (typeof performance !== "undefined" && typeof performance.now === "function") {
|
|
106
|
+
return performance.now();
|
|
107
|
+
}
|
|
108
|
+
return Date.now();
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function stringifyError(err: unknown): string {
|
|
112
|
+
if (err instanceof Error) return `${err.name}: ${err.message}`;
|
|
113
|
+
try {
|
|
114
|
+
return String(err);
|
|
115
|
+
} catch {
|
|
116
|
+
return "<unstringifiable>";
|
|
117
|
+
}
|
|
118
|
+
}
|
|
@@ -14,6 +14,7 @@ import type {
|
|
|
14
14
|
SectionProperties,
|
|
15
15
|
SubPartsCatalog,
|
|
16
16
|
} from "../model/canonical-document.ts";
|
|
17
|
+
import type { ResolvedDocumentSection } from "../model/layout/resolved-layout-types.ts";
|
|
17
18
|
import { createEditorSurfaceSnapshot } from "./surface-projection.ts";
|
|
18
19
|
import { resolveDefaultPageSizeTwips } from "./layout/default-page-format.ts";
|
|
19
20
|
import {
|
|
@@ -22,12 +23,13 @@ import {
|
|
|
22
23
|
} from "./story-context.ts";
|
|
23
24
|
import { storyTargetKey } from "./story-targeting.ts";
|
|
24
25
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
26
|
+
/**
|
|
27
|
+
* Pass 2 (2026-04-22) — relocated to
|
|
28
|
+
* `src/model/layout/resolved-layout-types.ts`. Re-exported here so
|
|
29
|
+
* existing consumers of `ResolvedDocumentSection` keep working
|
|
30
|
+
* unchanged.
|
|
31
|
+
*/
|
|
32
|
+
export type { ResolvedDocumentSection } from "../model/layout/resolved-layout-types.ts";
|
|
31
33
|
|
|
32
34
|
export function buildResolvedSections(
|
|
33
35
|
document: CanonicalDocumentEnvelope,
|