@beyondwork/docx-react-component 1.0.67 → 1.0.70
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 -932
- 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 -4797
- 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,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Field scope kind — Slice 3.
|
|
3
|
+
*
|
|
4
|
+
* A field is an inline `FieldNode` living inside a paragraph. Content is
|
|
5
|
+
* the concatenated inline text (the field's result tree). Instruction,
|
|
6
|
+
* refresh status, and family live on the formatting + audit projections
|
|
7
|
+
* so AI consumers can branch on family (`PAGE`, `REF`, `STYLEREF`, …)
|
|
8
|
+
* without re-parsing the instruction string.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { InlineNode } from "../../../model/canonical-document.ts";
|
|
12
|
+
import type { FieldEnumeratedScope } from "../enumerate-scopes.ts";
|
|
13
|
+
import { deriveReplaceability } from "../replaceability.ts";
|
|
14
|
+
import type {
|
|
15
|
+
SemanticScope,
|
|
16
|
+
SemanticScopeFormatting,
|
|
17
|
+
} from "../semantic-scope-types.ts";
|
|
18
|
+
import { buildExcerpt } from "./_paragraph-text.ts";
|
|
19
|
+
|
|
20
|
+
function flattenFieldText(children: readonly InlineNode[]): string {
|
|
21
|
+
const parts: string[] = [];
|
|
22
|
+
for (const child of children) {
|
|
23
|
+
if (child.type === "text") parts.push(child.text);
|
|
24
|
+
else if (child.type === "tab") parts.push("\t");
|
|
25
|
+
else if (child.type === "hard_break" || child.type === "column_break") parts.push("\n");
|
|
26
|
+
else if (child.type === "symbol") parts.push(child.char ?? "");
|
|
27
|
+
else if (child.type === "hyperlink" || child.type === "field") {
|
|
28
|
+
parts.push(flattenFieldText(child.children as readonly InlineNode[]));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return parts.join("");
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function compileFieldScope(entry: FieldEnumeratedScope): SemanticScope {
|
|
35
|
+
const { handle, field } = entry;
|
|
36
|
+
const text = flattenFieldText(field.children as readonly InlineNode[]);
|
|
37
|
+
const formatting: SemanticScopeFormatting = {};
|
|
38
|
+
return {
|
|
39
|
+
handle,
|
|
40
|
+
kind: "field",
|
|
41
|
+
classifications: entry.classifications,
|
|
42
|
+
content: {
|
|
43
|
+
text,
|
|
44
|
+
excerpt: buildExcerpt(text),
|
|
45
|
+
},
|
|
46
|
+
formatting,
|
|
47
|
+
layout: {},
|
|
48
|
+
geometry: {},
|
|
49
|
+
// Fields are computed — agents must not edit the result tree
|
|
50
|
+
// directly; authoring goes through the instruction. Workflow mode
|
|
51
|
+
// `view` matches replaceability `preserve-only`.
|
|
52
|
+
workflow: { scopeIds: [], effectiveMode: "view" },
|
|
53
|
+
replaceability: deriveReplaceability(entry.kind, handle.provenance),
|
|
54
|
+
audit: {
|
|
55
|
+
source: "runtime",
|
|
56
|
+
derivedFrom: [
|
|
57
|
+
"canonical",
|
|
58
|
+
`field-family:${field.fieldFamily ?? "unknown"}`,
|
|
59
|
+
`field-instruction:${field.instruction}`,
|
|
60
|
+
],
|
|
61
|
+
confidence: "medium",
|
|
62
|
+
},
|
|
63
|
+
partial: true,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Heading scope kind — Slice 1 + 2 + 2026-04-22 closure.
|
|
3
|
+
*
|
|
4
|
+
* A heading is a paragraph carrying either `outlineLevel` or a `Heading{N}`
|
|
5
|
+
* style id. Formatting flows through the scope-local seam, which delegates
|
|
6
|
+
* to Layer 03's `resolveEffectiveFormatting` when the full canonical
|
|
7
|
+
* document is threaded.
|
|
8
|
+
*
|
|
9
|
+
* When we cannot determine the outline level (neither `outlineLevel` nor a
|
|
10
|
+
* `Heading\d` style id is present on the paragraph), we OMIT `outlineLevel`
|
|
11
|
+
* from the formatting projection — silently defaulting to 0 would be a
|
|
12
|
+
* correctness surprise (consumers would see H1 when the author's intent
|
|
13
|
+
* was unknown).
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import type { CanonicalDocument } from "../../../model/canonical-document.ts";
|
|
17
|
+
import { resolveEffectiveFormattingForScope } from "../_formatting-seam.ts";
|
|
18
|
+
import type { ParagraphLikeEnumeratedScope } from "../enumerate-scopes.ts";
|
|
19
|
+
import { deriveReplaceability } from "../replaceability.ts";
|
|
20
|
+
import type {
|
|
21
|
+
SemanticScope,
|
|
22
|
+
SemanticScopeFormatting,
|
|
23
|
+
SemanticScopeWorkflow,
|
|
24
|
+
} from "../semantic-scope-types.ts";
|
|
25
|
+
|
|
26
|
+
import {
|
|
27
|
+
buildExcerpt,
|
|
28
|
+
extractParagraphText,
|
|
29
|
+
} from "./_paragraph-text.ts";
|
|
30
|
+
|
|
31
|
+
export interface CompileHeadingOptions {
|
|
32
|
+
readonly document?: CanonicalDocument;
|
|
33
|
+
readonly paragraphIndex?: number;
|
|
34
|
+
readonly workflow?: SemanticScopeWorkflow;
|
|
35
|
+
/** See `CompileParagraphOptions.sectionIndex` — coord-08 §12. */
|
|
36
|
+
readonly sectionIndex?: number;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function compileHeadingScope(
|
|
40
|
+
entry: ParagraphLikeEnumeratedScope,
|
|
41
|
+
options: CompileHeadingOptions = {},
|
|
42
|
+
): SemanticScope {
|
|
43
|
+
const { handle, paragraph } = entry;
|
|
44
|
+
const text = extractParagraphText(paragraph);
|
|
45
|
+
const effective = resolveEffectiveFormattingForScope({
|
|
46
|
+
paragraph,
|
|
47
|
+
...(options.document ? { document: options.document } : {}),
|
|
48
|
+
...(typeof options.paragraphIndex === "number"
|
|
49
|
+
? { paragraphIndex: options.paragraphIndex }
|
|
50
|
+
: {}),
|
|
51
|
+
});
|
|
52
|
+
const formatting: SemanticScopeFormatting = {
|
|
53
|
+
...(typeof effective.outlineLevel === "number"
|
|
54
|
+
? { outlineLevel: effective.outlineLevel }
|
|
55
|
+
: {}),
|
|
56
|
+
...(effective.paragraphStyleId
|
|
57
|
+
? { paragraphStyleId: effective.paragraphStyleId }
|
|
58
|
+
: {}),
|
|
59
|
+
...(effective.emphasis.length > 0 ? { emphasis: effective.emphasis } : {}),
|
|
60
|
+
};
|
|
61
|
+
return {
|
|
62
|
+
handle,
|
|
63
|
+
kind: "heading",
|
|
64
|
+
classifications: entry.classifications,
|
|
65
|
+
content: {
|
|
66
|
+
text,
|
|
67
|
+
excerpt: buildExcerpt(text),
|
|
68
|
+
},
|
|
69
|
+
formatting,
|
|
70
|
+
layout:
|
|
71
|
+
typeof options.sectionIndex === "number"
|
|
72
|
+
? { sectionIndex: options.sectionIndex }
|
|
73
|
+
: {},
|
|
74
|
+
geometry: {},
|
|
75
|
+
workflow: options.workflow ?? { scopeIds: [], effectiveMode: "edit" },
|
|
76
|
+
replaceability: deriveReplaceability(entry.kind, handle.provenance),
|
|
77
|
+
audit: {
|
|
78
|
+
source: "runtime",
|
|
79
|
+
derivedFrom: ["canonical"],
|
|
80
|
+
confidence: "medium",
|
|
81
|
+
},
|
|
82
|
+
partial: true,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* List-item scope kind — Slice 1 + 2 + 2026-04-22 closure.
|
|
3
|
+
*
|
|
4
|
+
* Carries the numbering binding on the formatting projection. When the
|
|
5
|
+
* seam has access to Layer 03 (full canonical document threaded), the
|
|
6
|
+
* resolved marker glyph ("1.", "a)", "•") lands in
|
|
7
|
+
* `formatting.numbering.label`; without it, only the instance + level are
|
|
8
|
+
* populated.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { CanonicalDocument } from "../../../model/canonical-document.ts";
|
|
12
|
+
import { resolveEffectiveFormattingForScope } from "../_formatting-seam.ts";
|
|
13
|
+
import type { ParagraphLikeEnumeratedScope } from "../enumerate-scopes.ts";
|
|
14
|
+
import { deriveReplaceability } from "../replaceability.ts";
|
|
15
|
+
import type {
|
|
16
|
+
SemanticScope,
|
|
17
|
+
SemanticScopeFormatting,
|
|
18
|
+
SemanticScopeWorkflow,
|
|
19
|
+
} from "../semantic-scope-types.ts";
|
|
20
|
+
|
|
21
|
+
import {
|
|
22
|
+
buildExcerpt,
|
|
23
|
+
extractParagraphText,
|
|
24
|
+
} from "./_paragraph-text.ts";
|
|
25
|
+
|
|
26
|
+
export interface CompileListItemOptions {
|
|
27
|
+
readonly document?: CanonicalDocument;
|
|
28
|
+
readonly paragraphIndex?: number;
|
|
29
|
+
readonly workflow?: SemanticScopeWorkflow;
|
|
30
|
+
/** See `CompileParagraphOptions.sectionIndex` — coord-08 §12. */
|
|
31
|
+
readonly sectionIndex?: number;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function compileListItemScope(
|
|
35
|
+
entry: ParagraphLikeEnumeratedScope,
|
|
36
|
+
options: CompileListItemOptions = {},
|
|
37
|
+
): SemanticScope {
|
|
38
|
+
const { handle, paragraph } = entry;
|
|
39
|
+
const text = extractParagraphText(paragraph);
|
|
40
|
+
const effective = resolveEffectiveFormattingForScope({
|
|
41
|
+
paragraph,
|
|
42
|
+
...(options.document ? { document: options.document } : {}),
|
|
43
|
+
...(typeof options.paragraphIndex === "number"
|
|
44
|
+
? { paragraphIndex: options.paragraphIndex }
|
|
45
|
+
: {}),
|
|
46
|
+
});
|
|
47
|
+
const formatting: SemanticScopeFormatting = {
|
|
48
|
+
...(effective.numbering ? { numbering: effective.numbering } : {}),
|
|
49
|
+
...(effective.paragraphStyleId
|
|
50
|
+
? { paragraphStyleId: effective.paragraphStyleId }
|
|
51
|
+
: {}),
|
|
52
|
+
...(effective.emphasis.length > 0 ? { emphasis: effective.emphasis } : {}),
|
|
53
|
+
};
|
|
54
|
+
return {
|
|
55
|
+
handle,
|
|
56
|
+
kind: "list-item",
|
|
57
|
+
classifications: entry.classifications,
|
|
58
|
+
content: {
|
|
59
|
+
text,
|
|
60
|
+
excerpt: buildExcerpt(text),
|
|
61
|
+
},
|
|
62
|
+
formatting,
|
|
63
|
+
layout:
|
|
64
|
+
typeof options.sectionIndex === "number"
|
|
65
|
+
? { sectionIndex: options.sectionIndex }
|
|
66
|
+
: {},
|
|
67
|
+
geometry: {},
|
|
68
|
+
workflow: options.workflow ?? { scopeIds: [], effectiveMode: "edit" },
|
|
69
|
+
replaceability: deriveReplaceability(entry.kind, handle.provenance),
|
|
70
|
+
audit: {
|
|
71
|
+
source: "runtime",
|
|
72
|
+
derivedFrom: ["canonical"],
|
|
73
|
+
confidence: "medium",
|
|
74
|
+
},
|
|
75
|
+
partial: true,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Paragraph scope kind — Slice 1 + 2 + 2026-04-22 closure.
|
|
3
|
+
*
|
|
4
|
+
* Routes formatting through the scope-local seam, which itself delegates
|
|
5
|
+
* to Layer 03's `resolveEffectiveFormatting` when `doc` + `paragraphIndex`
|
|
6
|
+
* are threaded. Without them, the seam degrades to a narrow paragraph-
|
|
7
|
+
* only projection (still honest, just narrower).
|
|
8
|
+
*
|
|
9
|
+
* `layout` / `geometry` / `workflow` are intentionally bounded — see
|
|
10
|
+
* module `layout-geometry-bounded.md` in the architecture doc. Paragraph
|
|
11
|
+
* scopes stay `partial: true` because those projections are not yet
|
|
12
|
+
* compiler-backed.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import type { CanonicalDocument } from "../../../model/canonical-document.ts";
|
|
16
|
+
import { resolveEffectiveFormattingForScope } from "../_formatting-seam.ts";
|
|
17
|
+
import type { ParagraphLikeEnumeratedScope } from "../enumerate-scopes.ts";
|
|
18
|
+
import { computeBlockPositions } from "../position-map.ts";
|
|
19
|
+
import { deriveReplaceability } from "../replaceability.ts";
|
|
20
|
+
import {
|
|
21
|
+
isStructuredReplacementContent,
|
|
22
|
+
type ReplacementScope,
|
|
23
|
+
type RuntimeOperationPlan,
|
|
24
|
+
type SemanticScope,
|
|
25
|
+
type SemanticScopeFormatting,
|
|
26
|
+
type SemanticScopeWorkflow,
|
|
27
|
+
} from "../semantic-scope-types.ts";
|
|
28
|
+
import type { CanonicalDocumentEnvelope } from "../../../core/state/editor-state.ts";
|
|
29
|
+
|
|
30
|
+
import {
|
|
31
|
+
buildExcerpt,
|
|
32
|
+
extractParagraphText,
|
|
33
|
+
} from "./_paragraph-text.ts";
|
|
34
|
+
|
|
35
|
+
export interface CompileParagraphOptions {
|
|
36
|
+
readonly document?: CanonicalDocument;
|
|
37
|
+
readonly paragraphIndex?: number;
|
|
38
|
+
readonly workflow?: SemanticScopeWorkflow;
|
|
39
|
+
/**
|
|
40
|
+
* 0-based section index derived by counting `section_break` blocks
|
|
41
|
+
* that appear before this paragraph's block (see
|
|
42
|
+
* `buildSectionIndexByBlockIndex` in `../compile-scope.ts`). When
|
|
43
|
+
* present, projects into `SemanticScopeLayout.sectionIndex`. Closes
|
|
44
|
+
* coord-08 §12 / harness finding E5a.
|
|
45
|
+
*/
|
|
46
|
+
readonly sectionIndex?: number;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function compileParagraphScope(
|
|
50
|
+
entry: ParagraphLikeEnumeratedScope,
|
|
51
|
+
options: CompileParagraphOptions = {},
|
|
52
|
+
): SemanticScope {
|
|
53
|
+
const { handle, paragraph } = entry;
|
|
54
|
+
const text = extractParagraphText(paragraph);
|
|
55
|
+
const effective = resolveEffectiveFormattingForScope({
|
|
56
|
+
paragraph,
|
|
57
|
+
...(options.document ? { document: options.document } : {}),
|
|
58
|
+
...(typeof options.paragraphIndex === "number"
|
|
59
|
+
? { paragraphIndex: options.paragraphIndex }
|
|
60
|
+
: {}),
|
|
61
|
+
});
|
|
62
|
+
const formatting: SemanticScopeFormatting = {
|
|
63
|
+
...(effective.paragraphStyleId
|
|
64
|
+
? { paragraphStyleId: effective.paragraphStyleId }
|
|
65
|
+
: {}),
|
|
66
|
+
...(effective.emphasis.length > 0 ? { emphasis: effective.emphasis } : {}),
|
|
67
|
+
};
|
|
68
|
+
return {
|
|
69
|
+
handle,
|
|
70
|
+
kind: "paragraph",
|
|
71
|
+
classifications: entry.classifications,
|
|
72
|
+
content: {
|
|
73
|
+
text,
|
|
74
|
+
excerpt: buildExcerpt(text),
|
|
75
|
+
},
|
|
76
|
+
formatting,
|
|
77
|
+
layout:
|
|
78
|
+
typeof options.sectionIndex === "number"
|
|
79
|
+
? { sectionIndex: options.sectionIndex }
|
|
80
|
+
: {},
|
|
81
|
+
geometry: {},
|
|
82
|
+
workflow: options.workflow ?? { scopeIds: [], effectiveMode: "edit" },
|
|
83
|
+
replaceability: deriveReplaceability(entry.kind, handle.provenance),
|
|
84
|
+
audit: {
|
|
85
|
+
source: "runtime",
|
|
86
|
+
derivedFrom:
|
|
87
|
+
entry.classifications.length > 0
|
|
88
|
+
? ["canonical", "workflow-overlay"]
|
|
89
|
+
: ["canonical"],
|
|
90
|
+
confidence: "medium",
|
|
91
|
+
},
|
|
92
|
+
partial: true,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export interface CompileParagraphReplacementOptions {
|
|
97
|
+
readonly document: CanonicalDocumentEnvelope;
|
|
98
|
+
readonly posture: "direct-edit" | "suggest-mode";
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Slice 5 — lower a paragraph-scope replacement proposal into a
|
|
103
|
+
* `RuntimeOperationPlan`. Handles two content kinds:
|
|
104
|
+
*
|
|
105
|
+
* - `kind: "text"` → single `text-replace` step spanning the
|
|
106
|
+
* paragraph's canonical block range; passes a flat string through
|
|
107
|
+
* the existing `text.insert` runtime command.
|
|
108
|
+
* - `kind: "structured"` → single `fragment-replace` step carrying
|
|
109
|
+
* a `CanonicalDocumentFragment` payload; dispatches via the
|
|
110
|
+
* runtime's `insertFragment` pipeline with the block range as
|
|
111
|
+
* selection. Unblocked 2026-04-22 once L02 shipped
|
|
112
|
+
* `CanonicalDocumentFragment` (`src/model/canonical-document.ts`).
|
|
113
|
+
*
|
|
114
|
+
* Determinism (S3): the plan is a pure projection of (blockIndex,
|
|
115
|
+
* content, posture). No timestamps, no random ids.
|
|
116
|
+
*/
|
|
117
|
+
export function compileParagraphReplacement(
|
|
118
|
+
entry: ParagraphLikeEnumeratedScope,
|
|
119
|
+
proposed: ReplacementScope,
|
|
120
|
+
options: CompileParagraphReplacementOptions,
|
|
121
|
+
): RuntimeOperationPlan | null {
|
|
122
|
+
if (proposed.operation !== "replace") return null;
|
|
123
|
+
|
|
124
|
+
const blocks = computeBlockPositions(options.document);
|
|
125
|
+
const blockRange = blocks.find((b) => b.blockIndex === entry.blockIndex);
|
|
126
|
+
if (!blockRange) return null;
|
|
127
|
+
|
|
128
|
+
if (proposed.proposedContent.kind === "text") {
|
|
129
|
+
const text = proposed.proposedContent.text ?? "";
|
|
130
|
+
const stepKind =
|
|
131
|
+
options.posture === "suggest-mode" ? "text-insert-tracked" : "text-replace";
|
|
132
|
+
return {
|
|
133
|
+
scopeId: entry.handle.scopeId,
|
|
134
|
+
targetKind: "paragraph",
|
|
135
|
+
operation: proposed.operation,
|
|
136
|
+
steps: Object.freeze([
|
|
137
|
+
{
|
|
138
|
+
kind: stepKind,
|
|
139
|
+
summary:
|
|
140
|
+
stepKind === "text-replace"
|
|
141
|
+
? `replace paragraph #${entry.blockIndex} text (len ${text.length})`
|
|
142
|
+
: `suggest-mode paragraph #${entry.blockIndex} text replace (len ${text.length})`,
|
|
143
|
+
range: { from: blockRange.from, to: blockRange.to },
|
|
144
|
+
text,
|
|
145
|
+
},
|
|
146
|
+
]),
|
|
147
|
+
...(proposed.preserve ? { preserve: proposed.preserve } : {}),
|
|
148
|
+
posture: options.posture,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (proposed.proposedContent.kind === "structured") {
|
|
153
|
+
// Structured-fragment path (L02-shipped CanonicalDocumentFragment).
|
|
154
|
+
// Suggest-mode fragment replacement is NOT wired today — it would
|
|
155
|
+
// require per-block tracked-insert/delete dispatch which depends
|
|
156
|
+
// on the same runtime-core suggest-mode primitive that blocks
|
|
157
|
+
// coord item 2. Refuse cleanly until both are ready.
|
|
158
|
+
if (options.posture === "suggest-mode") {
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
const fragment = proposed.proposedContent.structured;
|
|
162
|
+
if (!isStructuredReplacementContent(fragment)) return null;
|
|
163
|
+
const blockCount = fragment.blocks.length;
|
|
164
|
+
return {
|
|
165
|
+
scopeId: entry.handle.scopeId,
|
|
166
|
+
targetKind: "paragraph",
|
|
167
|
+
operation: proposed.operation,
|
|
168
|
+
steps: Object.freeze([
|
|
169
|
+
{
|
|
170
|
+
kind: "fragment-replace",
|
|
171
|
+
summary: `replace paragraph #${entry.blockIndex} with structured fragment (${blockCount} block(s))`,
|
|
172
|
+
range: { from: blockRange.from, to: blockRange.to },
|
|
173
|
+
fragment,
|
|
174
|
+
},
|
|
175
|
+
]),
|
|
176
|
+
...(proposed.preserve ? { preserve: proposed.preserve } : {}),
|
|
177
|
+
posture: options.posture,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Revision scope kind — Slice 3.
|
|
3
|
+
*
|
|
4
|
+
* Projects a canonical `RevisionRecord` into a scope. Content is a terse
|
|
5
|
+
* one-line summary (`<kind> by <authorId>`); richer narrative (before /
|
|
6
|
+
* after payloads, semanticKind, linkedRevisionIds) rides on the `audit`
|
|
7
|
+
* projection for agent inspection without inflating `content.text`.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { RevisionEnumeratedScope } from "../enumerate-scopes.ts";
|
|
11
|
+
import { deriveReplaceability } from "../replaceability.ts";
|
|
12
|
+
import type {
|
|
13
|
+
SemanticScope,
|
|
14
|
+
SemanticScopeWorkflow,
|
|
15
|
+
} from "../semantic-scope-types.ts";
|
|
16
|
+
|
|
17
|
+
function revisionSummary(
|
|
18
|
+
revision: RevisionEnumeratedScope["revision"],
|
|
19
|
+
): string {
|
|
20
|
+
const author = revision.authorId ?? "unknown-author";
|
|
21
|
+
return `${revision.kind} by ${author}`;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function compileRevisionScope(
|
|
25
|
+
entry: RevisionEnumeratedScope,
|
|
26
|
+
): SemanticScope {
|
|
27
|
+
const { handle, revision } = entry;
|
|
28
|
+
const text = revisionSummary(revision);
|
|
29
|
+
const workflow: SemanticScopeWorkflow = {
|
|
30
|
+
scopeIds: [revision.changeId],
|
|
31
|
+
effectiveMode: revision.status === "open" ? "suggest" : "view",
|
|
32
|
+
...(revision.status === "detached"
|
|
33
|
+
? { blockedReasons: ["revision-detached"] }
|
|
34
|
+
: {}),
|
|
35
|
+
};
|
|
36
|
+
const derivedFrom: string[] = [
|
|
37
|
+
"canonical.review.revisions",
|
|
38
|
+
`kind:${revision.kind}`,
|
|
39
|
+
`status:${revision.status}`,
|
|
40
|
+
];
|
|
41
|
+
if (revision.metadata?.semanticKind) {
|
|
42
|
+
derivedFrom.push(`semantic-kind:${revision.metadata.semanticKind}`);
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
handle,
|
|
46
|
+
kind: "revision",
|
|
47
|
+
classifications: entry.classifications,
|
|
48
|
+
content: { text },
|
|
49
|
+
formatting: {},
|
|
50
|
+
layout: {},
|
|
51
|
+
geometry: {},
|
|
52
|
+
workflow,
|
|
53
|
+
replaceability: deriveReplaceability(entry.kind, handle.provenance),
|
|
54
|
+
audit: {
|
|
55
|
+
source: revision.metadata?.source === "import" ? "import" : "runtime",
|
|
56
|
+
derivedFrom,
|
|
57
|
+
confidence: revision.status === "detached" ? "low" : "high",
|
|
58
|
+
},
|
|
59
|
+
// layout / geometry projections unpopulated until refactor/05 Slice 5.
|
|
60
|
+
partial: true,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Table-cell scope kind — Slice 2.
|
|
3
|
+
*
|
|
4
|
+
* Content is the joined text of the cell's paragraphs. Formatting carries
|
|
5
|
+
* the cell's structural role (header / body / footer) derived from the
|
|
6
|
+
* enclosing row. A cell's replaceability is `text-only` because editing
|
|
7
|
+
* structure (grid span, merge) belongs to a higher-level operation than
|
|
8
|
+
* scope-scoped replacement.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { TableCellEnumeratedScope } from "../enumerate-scopes.ts";
|
|
12
|
+
import type {
|
|
13
|
+
SemanticScope,
|
|
14
|
+
SemanticScopeFormatting,
|
|
15
|
+
SemanticScopeWorkflow,
|
|
16
|
+
} from "../semantic-scope-types.ts";
|
|
17
|
+
|
|
18
|
+
import { deriveTableCellRole } from "../_formatting-seam.ts";
|
|
19
|
+
import { buildExcerpt } from "./_paragraph-text.ts";
|
|
20
|
+
import { extractCellText } from "./_table-text.ts";
|
|
21
|
+
|
|
22
|
+
export interface CompileTableCellOptions {
|
|
23
|
+
readonly workflow?: SemanticScopeWorkflow;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function compileTableCellScope(
|
|
27
|
+
entry: TableCellEnumeratedScope,
|
|
28
|
+
options: CompileTableCellOptions = {},
|
|
29
|
+
): SemanticScope {
|
|
30
|
+
const { handle, cell, row, table, rowIndex } = entry;
|
|
31
|
+
const text = extractCellText(cell);
|
|
32
|
+
const role = deriveTableCellRole({ row, rowIndex, table }, cell);
|
|
33
|
+
const formatting: SemanticScopeFormatting = { tableRole: role };
|
|
34
|
+
return {
|
|
35
|
+
handle,
|
|
36
|
+
kind: "table-cell",
|
|
37
|
+
classifications: entry.classifications,
|
|
38
|
+
content: {
|
|
39
|
+
text,
|
|
40
|
+
excerpt: buildExcerpt(text),
|
|
41
|
+
},
|
|
42
|
+
formatting,
|
|
43
|
+
layout: {},
|
|
44
|
+
geometry: {},
|
|
45
|
+
workflow: options.workflow ?? { scopeIds: [], effectiveMode: "edit" },
|
|
46
|
+
replaceability: {
|
|
47
|
+
level: "text-only",
|
|
48
|
+
reason: "table-cell-preserves-structure",
|
|
49
|
+
},
|
|
50
|
+
audit: {
|
|
51
|
+
source: "runtime",
|
|
52
|
+
derivedFrom: ["canonical"],
|
|
53
|
+
confidence: "medium",
|
|
54
|
+
},
|
|
55
|
+
partial: true,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Table-row scope kind — Slice 2.
|
|
3
|
+
*
|
|
4
|
+
* Content is the joined text of the row's cells (pipe-separated). The row
|
|
5
|
+
* carries the structural role (header / body / footer) on the formatting
|
|
6
|
+
* projection so consumers can branch without walking structure.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { TableRowEnumeratedScope } from "../enumerate-scopes.ts";
|
|
10
|
+
import type {
|
|
11
|
+
SemanticScope,
|
|
12
|
+
SemanticScopeFormatting,
|
|
13
|
+
SemanticScopeWorkflow,
|
|
14
|
+
} from "../semantic-scope-types.ts";
|
|
15
|
+
|
|
16
|
+
import { deriveTableCellRole } from "../_formatting-seam.ts";
|
|
17
|
+
import { buildExcerpt } from "./_paragraph-text.ts";
|
|
18
|
+
import { extractRowText } from "./_table-text.ts";
|
|
19
|
+
|
|
20
|
+
export interface CompileTableRowOptions {
|
|
21
|
+
readonly workflow?: SemanticScopeWorkflow;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function compileTableRowScope(
|
|
25
|
+
entry: TableRowEnumeratedScope,
|
|
26
|
+
options: CompileTableRowOptions = {},
|
|
27
|
+
): SemanticScope {
|
|
28
|
+
const { handle, row, table, rowIndex } = entry;
|
|
29
|
+
const text = extractRowText(row);
|
|
30
|
+
// Role is a row-level concept; borrow the cell-role derivation since it
|
|
31
|
+
// reads `row.isHeader` + row position. A header row's cells are all
|
|
32
|
+
// "header"; a body row's cells are "body"; terminal row is "footer".
|
|
33
|
+
const firstCell = row.cells[0];
|
|
34
|
+
const role = firstCell
|
|
35
|
+
? deriveTableCellRole({ row, rowIndex, table }, firstCell)
|
|
36
|
+
: "body";
|
|
37
|
+
const formatting: SemanticScopeFormatting = { tableRole: role };
|
|
38
|
+
return {
|
|
39
|
+
handle,
|
|
40
|
+
kind: "table-row",
|
|
41
|
+
classifications: entry.classifications,
|
|
42
|
+
content: {
|
|
43
|
+
text,
|
|
44
|
+
excerpt: buildExcerpt(text),
|
|
45
|
+
},
|
|
46
|
+
formatting,
|
|
47
|
+
layout: {},
|
|
48
|
+
geometry: {},
|
|
49
|
+
workflow: options.workflow ?? { scopeIds: [], effectiveMode: "edit" },
|
|
50
|
+
replaceability: {
|
|
51
|
+
level: "blocked",
|
|
52
|
+
reason: "table-row-replacement-not-yet-implemented",
|
|
53
|
+
},
|
|
54
|
+
audit: {
|
|
55
|
+
source: "runtime",
|
|
56
|
+
derivedFrom: ["canonical"],
|
|
57
|
+
confidence: "medium",
|
|
58
|
+
},
|
|
59
|
+
partial: true,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Table scope kind — Slice 2.
|
|
3
|
+
*
|
|
4
|
+
* A table scope is the whole `TableNode`. Formatting projects `styleId`;
|
|
5
|
+
* content is a joined plain-text preview of the first two rows so AI
|
|
6
|
+
* bundles can disambiguate tables by opening content.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { TableEnumeratedScope } from "../enumerate-scopes.ts";
|
|
10
|
+
import type {
|
|
11
|
+
SemanticScope,
|
|
12
|
+
SemanticScopeFormatting,
|
|
13
|
+
SemanticScopeWorkflow,
|
|
14
|
+
} from "../semantic-scope-types.ts";
|
|
15
|
+
|
|
16
|
+
import { buildExcerpt } from "./_paragraph-text.ts";
|
|
17
|
+
import { extractTablePreview } from "./_table-text.ts";
|
|
18
|
+
|
|
19
|
+
export interface CompileTableOptions {
|
|
20
|
+
readonly workflow?: SemanticScopeWorkflow;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function compileTableScope(
|
|
24
|
+
entry: TableEnumeratedScope,
|
|
25
|
+
options: CompileTableOptions = {},
|
|
26
|
+
): SemanticScope {
|
|
27
|
+
const { handle, table } = entry;
|
|
28
|
+
const previewText = extractTablePreview(table);
|
|
29
|
+
const formatting: SemanticScopeFormatting = {
|
|
30
|
+
...(table.styleId ? { paragraphStyleId: table.styleId } : {}),
|
|
31
|
+
};
|
|
32
|
+
return {
|
|
33
|
+
handle,
|
|
34
|
+
kind: "table",
|
|
35
|
+
classifications: entry.classifications,
|
|
36
|
+
content: {
|
|
37
|
+
text: previewText,
|
|
38
|
+
excerpt: buildExcerpt(previewText),
|
|
39
|
+
},
|
|
40
|
+
formatting,
|
|
41
|
+
layout: {},
|
|
42
|
+
geometry: {},
|
|
43
|
+
workflow: options.workflow ?? { scopeIds: [], effectiveMode: "edit" },
|
|
44
|
+
replaceability: {
|
|
45
|
+
level: "blocked",
|
|
46
|
+
reason: "table-replacement-not-yet-implemented",
|
|
47
|
+
},
|
|
48
|
+
audit: {
|
|
49
|
+
source: "runtime",
|
|
50
|
+
derivedFrom: ["canonical"],
|
|
51
|
+
confidence: "medium",
|
|
52
|
+
},
|
|
53
|
+
partial: true,
|
|
54
|
+
};
|
|
55
|
+
}
|