@beyondwork/docx-react-component 1.0.0 → 1.0.2
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 +44 -104
- package/package.json +66 -15
- package/src/api/public-types.ts +1 -1
- package/src/compare/diff-engine.ts +530 -0
- package/src/compare/export-redlines.ts +162 -0
- package/src/compare/snapshot.ts +37 -0
- package/src/core/commands/index.ts +1 -1
- package/src/core/state/editor-state.ts +2 -2
- package/src/index.ts +45 -0
- package/src/legal/bookmarks.ts +196 -0
- package/src/legal/cross-references.ts +356 -0
- package/src/legal/defined-terms.ts +203 -0
- package/src/runtime/document-runtime.ts +3 -5
- package/src/runtime/table-commands.ts +4 -1
- package/src/runtime/table-schema.ts +17 -2
- package/src/runtime/virtualized-rendering.ts +258 -0
- package/src/ui/WordReviewEditor.tsx +256 -35
- package/src/ui-tailwind/editor-surface/tw-editor-surface.tsx +2 -2
- package/src/ui-tailwind/editor-surface/tw-table-node-view.tsx +16 -2
- package/.codex/config.toml +0 -5
- package/.corepack/v1/pnpm/10.30.3/.corepack +0 -1
- package/.corepack/v1/pnpm/10.30.3/LICENSE +0 -22
- package/.corepack/v1/pnpm/10.30.3/README.md +0 -240
- package/.corepack/v1/pnpm/10.30.3/dist/node-gyp-bin/node-gyp +0 -6
- package/.corepack/v1/pnpm/10.30.3/dist/node-gyp-bin/node-gyp.cmd +0 -5
- package/.corepack/v1/pnpm/10.30.3/dist/pnpm.cjs +0 -195400
- package/.corepack/v1/pnpm/10.30.3/dist/pnpmrc +0 -2
- package/.corepack/v1/pnpm/10.30.3/dist/reflink.darwin-arm64-2HJ4WGO6.node +0 -0
- package/.corepack/v1/pnpm/10.30.3/dist/reflink.darwin-x64-3G3H6IW4.node +0 -0
- package/.corepack/v1/pnpm/10.30.3/dist/reflink.win32-arm64-msvc-Q6BARPPB.node +0 -0
- package/.corepack/v1/pnpm/10.30.3/dist/reflink.win32-x64-msvc-J2TZHRQI.node +0 -0
- package/.corepack/v1/pnpm/10.30.3/dist/templates/completion.bash +0 -31
- package/.corepack/v1/pnpm/10.30.3/dist/templates/completion.fish +0 -22
- package/.corepack/v1/pnpm/10.30.3/dist/templates/completion.ps1 +0 -193
- package/.corepack/v1/pnpm/10.30.3/dist/templates/completion.zsh +0 -27
- package/.corepack/v1/pnpm/10.30.3/dist/vendor/fastlist-0.3.0-x64.exe +0 -0
- package/.corepack/v1/pnpm/10.30.3/dist/vendor/fastlist-0.3.0-x86.exe +0 -0
- package/.corepack/v1/pnpm/10.30.3/dist/worker.js +0 -10119
- package/.corepack/v1/pnpm/10.30.3/package.json +0 -192
- package/.cursor/mcp.json +0 -7
- package/.github/workflows/ci.yml +0 -35
- package/.mcp.json +0 -7
- package/.openclaw/workspace-state.json +0 -4
- package/.pnpmrc.json +0 -1
- package/.wave-launch.sh +0 -7
- package/.workspace-marker +0 -1
- package/AGENTS.md +0 -78
- package/CHANGELOG.md +0 -177
- package/DESIGN.md +0 -929
- package/HEARTBEAT.md +0 -7
- package/IDENTITY.md +0 -23
- package/SOUL.md +0 -36
- package/TOOLS.md +0 -40
- package/USER.md +0 -17
- package/docs/README.md +0 -107
- package/docs/agents/wave-cont-eval-role.md +0 -36
- package/docs/agents/wave-cont-qa-role.md +0 -52
- package/docs/agents/wave-deploy-verifier-role.md +0 -34
- package/docs/agents/wave-design-role.md +0 -47
- package/docs/agents/wave-documentation-role.md +0 -34
- package/docs/agents/wave-infra-role.md +0 -34
- package/docs/agents/wave-integration-role.md +0 -37
- package/docs/agents/wave-launcher-role.md +0 -41
- package/docs/agents/wave-orchestrator-role.md +0 -52
- package/docs/agents/wave-planner-role.md +0 -39
- package/docs/agents/wave-security-role.md +0 -40
- package/docs/architecture/docx/README.md +0 -10
- package/docs/architecture/future/README.md +0 -8
- package/docs/architecture/ooxml-upgrade-analysis.md +0 -134
- package/docs/architecture/platform/shared-openxml-editor-platform.md +0 -153
- package/docs/architecture/xlsx/canonical-workbook-model-and-commands.md +0 -187
- package/docs/architecture/xlsx/spreadsheet-editor-frontend-architecture.md +0 -150
- package/docs/comment-redline-overview.md +0 -350
- package/docs/concepts/context7-vs-skills.md +0 -118
- package/docs/concepts/operating-modes.md +0 -91
- package/docs/concepts/runtime-agnostic-orchestration.md +0 -111
- package/docs/concepts/what-is-a-wave.md +0 -217
- package/docs/context7/bundles.json +0 -222
- package/docs/context7/planner-agent/README.md +0 -28
- package/docs/context7/planner-agent/manifest.json +0 -83
- package/docs/context7/planner-agent/papers/cooperbench-why-coding-agents-cannot-be-your-teammates-yet.md +0 -3283
- package/docs/context7/planner-agent/papers/dova-deliberation-first-multi-agent-orchestration-for-autonomous-research-automation.md +0 -1699
- package/docs/context7/planner-agent/papers/dpbench-large-language-models-struggle-with-simultaneous-coordination.md +0 -2251
- package/docs/context7/planner-agent/papers/incremental-planning-to-control-a-blackboard-based-problem-solver.md +0 -1729
- package/docs/context7/planner-agent/papers/silo-bench-a-scalable-environment-for-evaluating-distributed-coordination-in-multi-agent-llm-systems.md +0 -3747
- package/docs/context7/planner-agent/papers/todoevolve-learning-to-architect-agent-planning-systems.md +0 -1675
- package/docs/context7/planner-agent/papers/verified-multi-agent-orchestration-a-plan-execute-verify-replan-framework-for-complex-query-resolution.md +0 -1173
- package/docs/context7/planner-agent/papers/why-do-multi-agent-llm-systems-fail.md +0 -5211
- package/docs/context7/planner-agent/topics/planning-and-orchestration.md +0 -24
- package/docs/evals/arm-templates/README.md +0 -13
- package/docs/evals/arm-templates/full-wave.json +0 -15
- package/docs/evals/arm-templates/single-agent.json +0 -15
- package/docs/evals/benchmark-catalog.json +0 -670
- package/docs/evals/cases/README.md +0 -47
- package/docs/evals/cases/wave-blackboard-inbox-targeting.json +0 -73
- package/docs/evals/cases/wave-contradiction-conflict.json +0 -104
- package/docs/evals/cases/wave-expert-routing-preservation.json +0 -69
- package/docs/evals/cases/wave-hidden-profile-private-evidence.json +0 -81
- package/docs/evals/cases/wave-premature-closure-guard.json +0 -71
- package/docs/evals/cases/wave-silo-cross-agent-state.json +0 -77
- package/docs/evals/cases/wave-simultaneous-lockstep.json +0 -92
- package/docs/evals/external-benchmarks.json +0 -85
- package/docs/evals/external-command-config.sample.json +0 -9
- package/docs/evals/external-command-config.swe-bench-pro.json +0 -8
- package/docs/evals/pilots/README.md +0 -47
- package/docs/evals/pilots/swe-bench-pro-public-full-wave-review-10.json +0 -64
- package/docs/evals/pilots/swe-bench-pro-public-pilot.json +0 -111
- package/docs/evals/wave-benchmark-program.md +0 -302
- package/docs/guides/planner.md +0 -220
- package/docs/guides/recommendations-0.8.9.md +0 -133
- package/docs/guides/signal-wrappers.md +0 -165
- package/docs/guides/terminal-surfaces.md +0 -96
- package/docs/image copy.png +0 -0
- package/docs/image.png +0 -0
- package/docs/images/image.png +0 -0
- package/docs/legal-feedback-architecture.md +0 -498
- package/docs/plans/component-cutover-matrix.json +0 -1072
- package/docs/plans/component-cutover-matrix.md +0 -307
- package/docs/plans/context7-wave-orchestrator.md +0 -155
- package/docs/plans/current-state.md +0 -198
- package/docs/plans/docx/README.md +0 -9
- package/docs/plans/examples/wave-benchmark-improvement.md +0 -108
- package/docs/plans/examples/wave-example-live-proof.md +0 -435
- package/docs/plans/master-plan.md +0 -224
- package/docs/plans/migration.md +0 -538
- package/docs/plans/operations/README.md +0 -7
- package/docs/plans/operations/wave-10-word-certification.md +0 -87
- package/docs/plans/operations/wave-8-railway-staging.md +0 -153
- package/docs/plans/operations/wave-9-manual-certification.md +0 -73
- package/docs/plans/platform/README.md +0 -9
- package/docs/plans/reference/legal-checklist-coverage.md +0 -258
- package/docs/plans/wave-orchestrator.md +0 -423
- package/docs/plans/waves/README.md +0 -75
- package/docs/plans/waves/completed/wave-0.md +0 -195
- package/docs/plans/waves/completed/wave-1.md +0 -379
- package/docs/plans/waves/completed/wave-10.md +0 -670
- package/docs/plans/waves/completed/wave-11.md +0 -335
- package/docs/plans/waves/completed/wave-12.md +0 -417
- package/docs/plans/waves/completed/wave-13.md +0 -316
- package/docs/plans/waves/completed/wave-14.md +0 -319
- package/docs/plans/waves/completed/wave-15.md +0 -321
- package/docs/plans/waves/completed/wave-16.md +0 -316
- package/docs/plans/waves/completed/wave-17.md +0 -331
- package/docs/plans/waves/completed/wave-18.md +0 -328
- package/docs/plans/waves/completed/wave-2.md +0 -438
- package/docs/plans/waves/completed/wave-3.md +0 -435
- package/docs/plans/waves/completed/wave-4.md +0 -430
- package/docs/plans/waves/completed/wave-5.md +0 -430
- package/docs/plans/waves/completed/wave-6.md +0 -430
- package/docs/plans/waves/completed/wave-7.md +0 -526
- package/docs/plans/waves/completed/wave-8.md +0 -596
- package/docs/plans/waves/completed/wave-9.md +0 -552
- package/docs/plans/waves/deferred/README.md +0 -14
- package/docs/plans/waves/deferred/encrypted-intake-contracts.md +0 -282
- package/docs/plans/waves/deferred/legal-feedback-wave-expansion.md +0 -308
- package/docs/plans/waves/deferred/wave-encrypted-intake.md +0 -451
- package/docs/plans/waves/design/README.md +0 -5
- package/docs/plans/waves/design/wave-1-a1.md +0 -309
- package/docs/plans/waves/reviews/README.md +0 -5
- package/docs/plans/waves/reviews/wave-0-cont-qa.md +0 -151
- package/docs/plans/waves/reviews/wave-1-cont-qa.md +0 -46
- package/docs/plans/waves/reviews/wave-10-accessibility-and-design.md +0 -51
- package/docs/plans/waves/reviews/wave-10-cont-qa.md +0 -24
- package/docs/plans/waves/reviews/wave-10-dashboard-proof.md +0 -46
- package/docs/plans/waves/reviews/wave-10-performance-signoff.md +0 -55
- package/docs/plans/waves/reviews/wave-10-regression-proof.md +0 -23
- package/docs/plans/waves/reviews/wave-10-release-audit.md +0 -31
- package/docs/plans/waves/reviews/wave-10-service-proof.md +0 -83
- package/docs/plans/waves/reviews/wave-10-word-certification.md +0 -31
- package/docs/plans/waves/reviews/wave-18-ai-contract-closure.md +0 -277
- package/docs/plans/waves/reviews/wave-18-cont-qa.md +0 -255
- package/docs/plans/waves/reviews/wave-18-parity-proof.md +0 -271
- package/docs/plans/waves/reviews/wave-19-cont-qa.md +0 -59
- package/docs/plans/waves/reviews/wave-2-cont-qa.md +0 -72
- package/docs/plans/waves/reviews/wave-20-cont-qa.md +0 -60
- package/docs/plans/waves/reviews/wave-25-cont-qa.md +0 -48
- package/docs/plans/waves/reviews/wave-28-cont-qa.md +0 -46
- package/docs/plans/waves/reviews/wave-29-cont-qa.md +0 -53
- package/docs/plans/waves/reviews/wave-3-cont-qa.md +0 -53
- package/docs/plans/waves/reviews/wave-3-core-proof.md +0 -77
- package/docs/plans/waves/reviews/wave-3-validator-proof.md +0 -73
- package/docs/plans/waves/reviews/wave-32-cont-qa.md +0 -43
- package/docs/plans/waves/reviews/wave-33-cont-qa.md +0 -526
- package/docs/plans/waves/reviews/wave-34-cont-qa.md +0 -100
- package/docs/plans/waves/reviews/wave-35-cont-qa.md +0 -145
- package/docs/plans/waves/reviews/wave-4-cont-qa.md +0 -47
- package/docs/plans/waves/reviews/wave-4-structure-proof.md +0 -69
- package/docs/plans/waves/reviews/wave-5-comment-proof.md +0 -158
- package/docs/plans/waves/reviews/wave-5-cont-qa.md +0 -68
- package/docs/plans/waves/reviews/wave-6-cont-qa.md +0 -416
- package/docs/plans/waves/reviews/wave-6-redline-proof.md +0 -130
- package/docs/plans/waves/reviews/wave-7-cont-qa.md +0 -82
- package/docs/plans/waves/reviews/wave-7-ooxml-compliance.md +0 -85
- package/docs/plans/waves/reviews/wave-7-preservation-proof.md +0 -119
- package/docs/plans/waves/reviews/wave-7-trust-ux.md +0 -87
- package/docs/plans/waves/reviews/wave-8-accessibility-and-design.md +0 -128
- package/docs/plans/waves/reviews/wave-8-cont-qa.md +0 -92
- package/docs/plans/waves/reviews/wave-8-live-proof.md +0 -140
- package/docs/plans/waves/reviews/wave-8-security.md +0 -47
- package/docs/plans/waves/reviews/wave-9-editor-embedding.md +0 -39
- package/docs/plans/waves/reviews/wave-9-fixture-runner.md +0 -56
- package/docs/plans/waves/reviews/wave-9-live-proof.md +0 -105
- package/docs/plans/waves/reviews/wave-9-usability-and-performance.md +0 -152
- package/docs/plans/waves/specs/README.md +0 -5
- package/docs/plans/waves/specs/wave-1-component-boundaries.md +0 -322
- package/docs/plans/waves/specs/wave-1-ooxml-contracts.md +0 -323
- package/docs/plans/waves/specs/wave-1-review-and-ui-contracts.md +0 -339
- package/docs/plans/waves/specs/wave-1-runtime-contracts.md +0 -509
- package/docs/plans/waves/wave-19.md +0 -341
- package/docs/plans/waves/wave-20.md +0 -308
- package/docs/plans/waves/wave-21.md +0 -289
- package/docs/plans/waves/wave-22.md +0 -221
- package/docs/plans/waves/wave-23.md +0 -295
- package/docs/plans/waves/wave-24.md +0 -286
- package/docs/plans/waves/wave-25.md +0 -313
- package/docs/plans/waves/wave-26.md +0 -300
- package/docs/plans/waves/wave-27.md +0 -299
- package/docs/plans/waves/wave-28.md +0 -368
- package/docs/plans/waves/wave-29.md +0 -303
- package/docs/plans/waves/wave-30.md +0 -307
- package/docs/plans/waves/wave-31.md +0 -231
- package/docs/plans/waves/wave-32.md +0 -152
- package/docs/plans/waves/wave-33.md +0 -147
- package/docs/plans/waves/wave-34.md +0 -148
- package/docs/plans/waves/wave-35.md +0 -141
- package/docs/plans/waves/wave-36.md +0 -146
- package/docs/plans/xlsx/README.md +0 -14
- package/docs/plans/xlsx/xlsx-fixture-corpus-and-certification-plan.md +0 -126
- package/docs/reference/cli-reference.md +0 -600
- package/docs/reference/coordination-and-closure.md +0 -487
- package/docs/reference/deep-research-report (15).md +0 -25
- package/docs/reference/docx/README.md +0 -10
- package/docs/reference/legal-checklist.md +0 -445
- package/docs/reference/live-proof-waves.md +0 -199
- package/docs/reference/ooxml-compliance.md +0 -129
- package/docs/reference/ooxml-feature-parity-matrix.md +0 -172
- package/docs/reference/platform/shared-ooxml-platform-guidance.md +0 -77
- package/docs/reference/prototype-agent-prompt-legal-fidelity.md +0 -155
- package/docs/reference/public-api.md +0 -456
- package/docs/reference/repository-guidance.md +0 -58
- package/docs/reference/runtime-config/README.md +0 -182
- package/docs/reference/runtime-config/claude.md +0 -110
- package/docs/reference/runtime-config/codex.md +0 -82
- package/docs/reference/runtime-config/opencode.md +0 -93
- package/docs/reference/sample-waves.md +0 -105
- package/docs/reference/skills.md +0 -237
- package/docs/reference/templates/AGENTS.md +0 -78
- package/docs/reference/templates/HEARTBEAT.md +0 -7
- package/docs/reference/templates/IDENTITY.md +0 -23
- package/docs/reference/templates/SOUL.md +0 -36
- package/docs/reference/templates/TOOLS.md +0 -40
- package/docs/reference/templates/USER.md +0 -17
- package/docs/reference/wave-control.md +0 -184
- package/docs/reference/wave-planning-lessons.md +0 -167
- package/docs/reference/word-review-editor-frontend-architecture.md +0 -479
- package/docs/reference/word-review-editor-ux-guide.md +0 -253
- package/docs/reference/xlsx/xlsx-ooxml-compliance.md +0 -137
- package/docs/research/agent-context-sources.md +0 -178
- package/docs/research/coordination-failure-review.md +0 -290
- package/docs/research/docx-react-component/Canonical Document Schema Specification for a React-based Word-compatible Editor.md +0 -2317
- package/docs/research/docx-react-component/Feature Compatibility Matrix for a React Word Compatible Legal Editor v1.md +0 -219
- package/docs/research/docx-react-component/React Component Architecture and Front-End Structure Specification for a Word-Compatible Legal Review Editor.md +0 -1112
- package/docs/research/docx-react-component/document_compatibility_and_testing_spec.md +0 -751
- package/docs/research/xlsx/raw/README.md +0 -13
- package/docs/roadmap.md +0 -174
- package/docs/superpowers/plans/2026-03-28-harness-control-bar.md +0 -677
- package/docs/superpowers/specs/2026-03-28-harness-control-bar-design.md +0 -274
- package/docs/xlsx-react/README.md +0 -38
- package/docs/xlsx-react/agent-llm-interaction-layer-docx-xlsx.md +0 -621
- package/docs/xlsx-react/canonical-workbook-model-and-commands.md +0 -948
- package/docs/xlsx-react/shared-openxml-editor-platform-docx-xlsx.md +0 -228
- package/docs/xlsx-react/spreadsheet-editor-component-architecture.md +0 -809
- package/docs/xlsx-react/spreadsheet-editor-frontend-architecture.md +0 -537
- package/docs/xlsx-react/spreadsheet-editor-ux-guide.md +0 -520
- package/docs/xlsx-react/xlsx-editor-research-pack.md +0 -871
- package/docs/xlsx-react/xlsx-fixture-corpus-and-certification-plan.md +0 -436
- package/docs/xlsx-react/xlsx-ooxml-compliance.md +0 -320
- package/examples/README.md +0 -16
- package/memory/MEMORY.md +0 -24
- package/pnpm-workspace.yaml +0 -4
- package/scripts/check-no-authored-js.sh +0 -13
- package/scripts/context7-api-check.sh +0 -65
- package/scripts/context7-export-env.sh +0 -42
- package/scripts/run-context7-mcp.sh +0 -8
- package/scripts/run-workspace-tests.sh +0 -15
- package/scripts/start-wave-10-local.sh +0 -189
- package/scripts/wave-agent-attach.sh +0 -47
- package/scripts/wave-auto-answer.sh +0 -118
- package/scripts/wave-dashboard-attach.sh +0 -13
- package/scripts/wave-launch.sh +0 -273
- package/scripts/wave-overnight-supervisor.sh +0 -145
- package/scripts/wave-status.sh +0 -379
- package/scripts/wave-watch.sh +0 -231
- package/services/README.md +0 -17
- package/services/openxml-validator/Dockerfile +0 -29
- package/services/openxml-validator/OpenXmlValidator.Api.csproj +0 -12
- package/services/openxml-validator/Program.cs +0 -436
- package/services/openxml-validator/README.md +0 -152
- package/services/openxml-validator/railway.json +0 -16
- package/services/react-word-editor/.tmp-a4/src/api/public-types.ts +0 -318
- package/services/react-word-editor/.tmp-a4/src/ui/WordReviewEditor.tsx +0 -1302
- package/services/react-word-editor/.tmp-a4/src/ui/editor-surface/editor-surface.tsx +0 -546
- package/services/react-word-editor/.tmp-a4/test/ui/word-review-editor.test.tsx +0 -146
- package/services/react-word-editor/.tmp-a4-build/src/api/public-types.js +0 -2
- package/services/react-word-editor/.tmp-a4-build/src/ui/WordReviewEditor.js +0 -818
- package/services/react-word-editor/.tmp-a4-build/src/ui/editor-surface/editor-surface.js +0 -229
- package/services/react-word-editor/.tmp-a4-build/test/ui/word-review-editor.test.js +0 -121
- package/services/react-word-editor/.tmp-wave-4-a3-tsconfig.json +0 -21
- package/services/react-word-editor/.tmp-wave-4-a3-tsconfig.tsbuildinfo +0 -1
- package/services/react-word-editor/Dockerfile +0 -26
- package/services/react-word-editor/README.md +0 -254
- package/services/react-word-editor/app/api/certification/route.ts +0 -79
- package/services/react-word-editor/app/api/demo-sessions/route.ts +0 -109
- package/services/react-word-editor/app/api/deploy-health/route.ts +0 -23
- package/services/react-word-editor/app/api/exports/[exportId]/route.ts +0 -34
- package/services/react-word-editor/app/api/exports/route.ts +0 -81
- package/services/react-word-editor/app/api/fixtures/[fixtureId]/run/route.ts +0 -100
- package/services/react-word-editor/app/api/health/route.ts +0 -70
- package/services/react-word-editor/app/api/runs/[runId]/route.ts +0 -36
- package/services/react-word-editor/app/api/scenarios/[scenarioId]/run/route.ts +0 -85
- package/services/react-word-editor/app/api/sessions/[sessionId]/route.ts +0 -199
- package/services/react-word-editor/app/api/sessions/[sessionId]/source/route.ts +0 -45
- package/services/react-word-editor/app/api/uploads/route.ts +0 -70
- package/services/react-word-editor/app/api/validate/route.ts +0 -310
- package/services/react-word-editor/app/certification/[runId]/page.tsx +0 -14
- package/services/react-word-editor/app/certification/page.tsx +0 -32
- package/services/react-word-editor/app/dashboard/page.tsx +0 -7
- package/services/react-word-editor/app/demo/page.tsx +0 -30
- package/services/react-word-editor/app/demo/prototype-client.tsx +0 -1080
- package/services/react-word-editor/app/editor/[sessionId]/page.tsx +0 -33
- package/services/react-word-editor/app/fixtures/page.tsx +0 -7
- package/services/react-word-editor/app/globals.css +0 -121
- package/services/react-word-editor/app/layout.tsx +0 -32
- package/services/react-word-editor/app/page.tsx +0 -30
- package/services/react-word-editor/app/runs/[runId]/page.tsx +0 -34
- package/services/react-word-editor/app/wave-10-word-review/page.tsx +0 -7
- package/services/react-word-editor/components/harness-control-bar.tsx +0 -289
- package/services/react-word-editor/components/harness-editor-session-client.tsx +0 -1214
- package/services/react-word-editor/components/harness-workspace-page.tsx +0 -715
- package/services/react-word-editor/components/reduced-motion-toggle.tsx +0 -79
- package/services/react-word-editor/components/workspace-certification-panel.tsx +0 -307
- package/services/react-word-editor/lib/certification-bundle.ts +0 -796
- package/services/react-word-editor/lib/certification-store.ts +0 -661
- package/services/react-word-editor/lib/demo-fixtures.test.mjs +0 -195
- package/services/react-word-editor/lib/demo-fixtures.ts +0 -1519
- package/services/react-word-editor/lib/editor-session-summary.test.mjs +0 -68
- package/services/react-word-editor/lib/editor-session-summary.ts +0 -14
- package/services/react-word-editor/lib/editor-session.ts +0 -228
- package/services/react-word-editor/lib/exports-route.test.mjs +0 -32
- package/services/react-word-editor/lib/harness-client.ts +0 -347
- package/services/react-word-editor/lib/harness-config.json +0 -30
- package/services/react-word-editor/lib/harness-config.test.mjs +0 -31
- package/services/react-word-editor/lib/harness-config.ts +0 -21
- package/services/react-word-editor/lib/harness-editor-datastore.test.mjs +0 -220
- package/services/react-word-editor/lib/harness-editor-datastore.ts +0 -161
- package/services/react-word-editor/lib/private-mode.test.mjs +0 -42
- package/services/react-word-editor/lib/private-mode.ts +0 -61
- package/services/react-word-editor/lib/regression-report.test.mjs +0 -352
- package/services/react-word-editor/lib/regression-report.ts +0 -896
- package/services/react-word-editor/lib/run-artifacts.ts +0 -934
- package/services/react-word-editor/lib/run-history.ts +0 -755
- package/services/react-word-editor/lib/scenario-artifacts.test.mjs +0 -41
- package/services/react-word-editor/lib/scenario-artifacts.ts +0 -44
- package/services/react-word-editor/lib/storage.ts +0 -953
- package/services/react-word-editor/lib/validator-client.test.mjs +0 -54
- package/services/react-word-editor/lib/validator-client.ts +0 -95
- package/services/react-word-editor/lib/workspace-navigation.ts +0 -79
- package/services/react-word-editor/middleware.ts +0 -35
- package/services/react-word-editor/next-env.d.ts +0 -6
- package/services/react-word-editor/next.config.mjs +0 -15
- package/services/react-word-editor/package.json +0 -38
- package/services/react-word-editor/postcss.config.mjs +0 -8
- package/services/react-word-editor/railway.json +0 -21
- package/services/react-word-editor/scripts/wave-10-certification.mjs +0 -101
- package/services/react-word-editor/scripts/wave-9-live-usability-pilot.mjs +0 -911
- package/services/react-word-editor/tsconfig.json +0 -39
- package/services/react-word-editor/tsconfig.tsbuildinfo +0 -1
- package/skills/README.md +0 -48
- package/skills/domain-docx-compatibility/SKILL.md +0 -44
- package/skills/domain-docx-compatibility/skill.json +0 -19
- package/skills/domain-editor-architecture/SKILL.md +0 -49
- package/skills/domain-editor-architecture/skill.json +0 -19
- package/skills/domain-legal-review/SKILL.md +0 -39
- package/skills/domain-legal-review/skill.json +0 -19
- package/skills/provider-aws/SKILL.md +0 -117
- package/skills/provider-aws/adapters/claude.md +0 -1
- package/skills/provider-aws/adapters/codex.md +0 -1
- package/skills/provider-aws/references/service-verification.md +0 -39
- package/skills/provider-aws/skill.json +0 -54
- package/skills/provider-custom-deploy/SKILL.md +0 -64
- package/skills/provider-custom-deploy/skill.json +0 -50
- package/skills/provider-docker-compose/SKILL.md +0 -96
- package/skills/provider-docker-compose/adapters/local.md +0 -1
- package/skills/provider-docker-compose/skill.json +0 -53
- package/skills/provider-github-release/SKILL.md +0 -121
- package/skills/provider-github-release/adapters/claude.md +0 -1
- package/skills/provider-github-release/adapters/codex.md +0 -1
- package/skills/provider-github-release/skill.json +0 -55
- package/skills/provider-kubernetes/SKILL.md +0 -143
- package/skills/provider-kubernetes/adapters/claude.md +0 -1
- package/skills/provider-kubernetes/adapters/codex.md +0 -1
- package/skills/provider-kubernetes/references/kubectl-patterns.md +0 -58
- package/skills/provider-kubernetes/skill.json +0 -52
- package/skills/provider-railway/SKILL.md +0 -123
- package/skills/provider-railway/adapters/claude.md +0 -1
- package/skills/provider-railway/adapters/codex.md +0 -1
- package/skills/provider-railway/adapters/local.md +0 -1
- package/skills/provider-railway/adapters/opencode.md +0 -1
- package/skills/provider-railway/references/verification-commands.md +0 -39
- package/skills/provider-railway/skill.json +0 -71
- package/skills/provider-ssh-manual/SKILL.md +0 -97
- package/skills/provider-ssh-manual/skill.json +0 -54
- package/skills/repo-coding-rules/SKILL.md +0 -55
- package/skills/repo-coding-rules/skill.json +0 -34
- package/skills/role-cont-eval/SKILL.md +0 -91
- package/skills/role-cont-eval/adapters/codex.md +0 -1
- package/skills/role-cont-eval/skill.json +0 -36
- package/skills/role-cont-qa/SKILL.md +0 -100
- package/skills/role-cont-qa/adapters/claude.md +0 -1
- package/skills/role-cont-qa/skill.json +0 -36
- package/skills/role-deploy/SKILL.md +0 -97
- package/skills/role-deploy/skill.json +0 -36
- package/skills/role-design/SKILL.md +0 -50
- package/skills/role-design/skill.json +0 -36
- package/skills/role-documentation/SKILL.md +0 -76
- package/skills/role-documentation/skill.json +0 -36
- package/skills/role-implementation/SKILL.md +0 -45
- package/skills/role-implementation/skill.json +0 -36
- package/skills/role-infra/SKILL.md +0 -81
- package/skills/role-infra/skill.json +0 -36
- package/skills/role-integration/SKILL.md +0 -91
- package/skills/role-integration/skill.json +0 -36
- package/skills/role-planner/SKILL.md +0 -39
- package/skills/role-planner/skill.json +0 -21
- package/skills/role-research/SKILL.md +0 -65
- package/skills/role-research/skill.json +0 -36
- package/skills/role-security/SKILL.md +0 -60
- package/skills/role-security/skill.json +0 -36
- package/skills/runtime-claude/SKILL.md +0 -66
- package/skills/runtime-claude/skill.json +0 -36
- package/skills/runtime-codex/SKILL.md +0 -58
- package/skills/runtime-codex/skill.json +0 -36
- package/skills/runtime-local/SKILL.md +0 -46
- package/skills/runtime-local/skill.json +0 -36
- package/skills/runtime-opencode/SKILL.md +0 -58
- package/skills/runtime-opencode/skill.json +0 -36
- package/skills/signal-hygiene/SKILL.md +0 -51
- package/skills/signal-hygiene/skill.json +0 -20
- package/skills/tui-design/SKILL.md +0 -77
- package/skills/tui-design/references/tui-design.md +0 -259
- package/skills/tui-design/skill.json +0 -36
- package/skills/wave-core/SKILL.md +0 -141
- package/skills/wave-core/references/marker-syntax.md +0 -70
- package/skills/wave-core/skill.json +0 -35
- package/test/README.md +0 -16
- package/test/core/formatting-commands.test.ts +0 -285
- package/test/core/image-commands.test.ts +0 -298
- package/test/core/mapping.test.ts +0 -186
- package/test/core/text-commands.test.ts +0 -176
- package/test/fixtures/docx/F01-basic-contract.docx +0 -0
- package/test/fixtures/docx/F01-basic-contract.md +0 -33
- package/test/fixtures/docx/F02-headings-styles.docx +0 -0
- package/test/fixtures/docx/F02-headings-styles.md +0 -33
- package/test/fixtures/docx/F03-legal-outline-numbering.docx +0 -0
- package/test/fixtures/docx/F03-legal-outline-numbering.md +0 -34
- package/test/fixtures/docx/F04-restart-numbering-schedules.docx +0 -0
- package/test/fixtures/docx/F04-restart-numbering-schedules.md +0 -33
- package/test/fixtures/docx/F05-table-heavy-agreement.docx +0 -0
- package/test/fixtures/docx/F05-table-heavy-agreement.md +0 -34
- package/test/fixtures/docx/F06-merged-cells-signature-table.docx +0 -0
- package/test/fixtures/docx/F06-merged-cells-signature-table.md +0 -34
- package/test/fixtures/docx/F07-inline-images-exhibit.docx +0 -0
- package/test/fixtures/docx/F07-inline-images-exhibit.md +0 -34
- package/test/fixtures/docx/F08-hyperlinks.docx +0 -0
- package/test/fixtures/docx/F08-hyperlinks.md +0 -33
- package/test/fixtures/docx/F09-comments-single-paragraph.docx +0 -0
- package/test/fixtures/docx/F09-comments-single-paragraph.md +0 -33
- package/test/fixtures/docx/F10-threaded-comments-resolve.docx +0 -0
- package/test/fixtures/docx/F10-threaded-comments-resolve.md +0 -33
- package/test/fixtures/docx/F11-redlines-basic.docx +0 -0
- package/test/fixtures/docx/F11-redlines-basic.md +0 -33
- package/test/fixtures/docx/F12-redlines-paragraph-joins-splits.docx +0 -0
- package/test/fixtures/docx/F12-redlines-paragraph-joins-splits.md +0 -33
- package/test/fixtures/docx/F13-comments-on-deleted-text.docx +0 -0
- package/test/fixtures/docx/F13-comments-on-deleted-text.md +0 -33
- package/test/fixtures/docx/F14-revisions-in-tables-and-lists.docx +0 -0
- package/test/fixtures/docx/F14-revisions-in-tables-and-lists.md +0 -33
- package/test/fixtures/docx/F15-sections-headers-footers.docx +0 -0
- package/test/fixtures/docx/F15-sections-headers-footers.md +0 -33
- package/test/fixtures/docx/F16-footnotes-endnotes.docx +0 -0
- package/test/fixtures/docx/F16-footnotes-endnotes.md +0 -33
- package/test/fixtures/docx/F17-fields-and-toc.docx +0 -0
- package/test/fixtures/docx/F17-fields-and-toc.md +0 -33
- package/test/fixtures/docx/F18-content-controls-template.docx +0 -0
- package/test/fixtures/docx/F18-content-controls-template.md +0 -33
- package/test/fixtures/docx/F19-custom-xml-doc-assembly.docx +0 -0
- package/test/fixtures/docx/F19-custom-xml-doc-assembly.md +0 -35
- package/test/fixtures/docx/F20-unknown-ooxml-and-alternatecontent.docx +0 -0
- package/test/fixtures/docx/F20-unknown-ooxml-and-alternatecontent.md +0 -33
- package/test/fixtures/docx/F21-malformed-broken-docx.docx +0 -0
- package/test/fixtures/docx/F21-malformed-broken-docx.md +0 -33
- package/test/fixtures/docx/README.md +0 -74
- package/test/fixtures/docx/certification-manifest.json +0 -104
- package/test/fixtures/docx/fixtures.manifest.json +0 -196
- package/test/fixtures/encrypted-docx/README.md +0 -27
- package/test/fixtures/encrypted-docx/certification-manifest.json +0 -9
- package/test/fixtures/encrypted-docx/fixtures.manifest.json +0 -47
- package/test/fixtures/scenarios/docx/README.md +0 -25
- package/test/fixtures/scenarios/docx/S01-sow-template.docx +0 -0
- package/test/fixtures/scenarios/docx/S01-sow-template.md +0 -30
- package/test/fixtures/scenarios/docx/S02-bw-partner-user-licence-agreement-redlines.docx +0 -0
- package/test/fixtures/scenarios/docx/S02-bw-partner-user-licence-agreement-redlines.md +0 -32
- package/test/fixtures/scenarios/docx/scenario-manifest.json +0 -53
- package/test/formats/xlsx/io/xlsx-import.test.ts +0 -766
- package/test/formats/xlsx/model/workbook.test.ts +0 -669
- package/test/helpers/dom-setup.ts +0 -124
- package/test/io/comment-roundtrip.test.ts +0 -272
- package/test/io/complex-content-roundtrip.test.ts +0 -632
- package/test/io/docx-compatibility-regression.test.ts +0 -199
- package/test/io/docx-session.test.ts +0 -1495
- package/test/io/footnotes-roundtrip.test.ts +0 -318
- package/test/io/headers-footers-roundtrip.test.ts +0 -547
- package/test/io/numbering-roundtrip.test.ts +0 -234
- package/test/io/package-reader.test.ts +0 -199
- package/test/io/paragraph-properties-roundtrip.test.ts +0 -129
- package/test/io/preserved-package-roundtrip.test.ts +0 -365
- package/test/io/property-completeness.test.ts +0 -292
- package/test/io/revision-roundtrip.test.ts +0 -347
- package/test/io/structural-blocks.test.ts +0 -202
- package/test/io/table-media-roundtrip.test.ts +0 -448
- package/test/io/table-properties-roundtrip.test.ts +0 -569
- package/test/io/table-roundtrip.test.ts +0 -302
- package/test/io/text-roundtrip.test.ts +0 -344
- package/test/model/canonical-document.test.ts +0 -285
- package/test/preservation/opaque-fragment-store.test.ts +0 -121
- package/test/preservation/package-preservation.test.ts +0 -395
- package/test/preservation/store.test.ts +0 -84
- package/test/review/comment-remapping.test.ts +0 -220
- package/test/review/comment-store.test.ts +0 -180
- package/test/review/move-revisions.test.ts +0 -143
- package/test/review/property-change-revisions.test.ts +0 -225
- package/test/review/revision-actions.test.ts +0 -330
- package/test/review/revision-store.test.ts +0 -193
- package/test/runtime/session-capabilities.test.ts +0 -260
- package/test/runtime/table-commands.test.ts +0 -356
- package/test/runtime/table-schema.test.ts +0 -221
- package/test/runtime/tracked-changes-toggle.test.ts +0 -107
- package/test/ui/comment-review-surface.test.tsx +0 -114
- package/test/ui/reduced-motion-toggle.test.tsx +0 -137
- package/test/ui/word-review-editor.imported-scenarios.test.tsx +0 -169
- package/test/ui/word-review-editor.interaction.test.tsx +0 -1198
- package/test/ui/word-review-editor.test.js +0 -188
- package/test/ui/word-review-editor.test.tsx +0 -280
- package/test/ui-tailwind/search-plugin.test.ts +0 -286
- package/test/validation/compatibility-engine.test.ts +0 -336
- package/test/validation/compatibility-report.test.ts +0 -189
- package/test/validation/low-priority-word-surfaces.test.ts +0 -282
- package/test/validation/malformed-doc.test.ts +0 -113
- package/test-results/.last-run.json +0 -4
- package/wave.config.json +0 -406
|
@@ -1,509 +0,0 @@
|
|
|
1
|
-
# Wave 1 - Runtime And Host Contract Lock
|
|
2
|
-
|
|
3
|
-
**Agent:** A2 (Runtime And Host Contract Lock)
|
|
4
|
-
**Date:** 2026-03-25
|
|
5
|
-
**Status:** frozen for Wave 2 implementation
|
|
6
|
-
|
|
7
|
-
This spec freezes the runtime and host-facing contract for the shipped `WordReviewEditor` component.
|
|
8
|
-
|
|
9
|
-
It is downstream of:
|
|
10
|
-
|
|
11
|
-
- `docs/plans/waves/design/wave-1-a1.md`
|
|
12
|
-
- `docs/plans/waves/specs/wave-1-component-boundaries.md`
|
|
13
|
-
|
|
14
|
-
## 1. Contract Goals
|
|
15
|
-
|
|
16
|
-
Wave 1 freezes four boundaries:
|
|
17
|
-
|
|
18
|
-
- `DocumentRuntime` is the only mutation authority for a mounted editor session.
|
|
19
|
-
- React consumes a render snapshot through an external-store subscription boundary and never owns editable document truth.
|
|
20
|
-
- Hosts persist and resume through `PersistedEditorSnapshot`, not through render snapshots or DOM reads.
|
|
21
|
-
- The public component name is `WordReviewEditor`; residual `WordEditor` naming is not part of the shipped surface.
|
|
22
|
-
|
|
23
|
-
## 2. Session Model
|
|
24
|
-
|
|
25
|
-
One mounted `WordReviewEditor` owns one `DocumentRuntime` instance.
|
|
26
|
-
|
|
27
|
-
Frozen load sources:
|
|
28
|
-
|
|
29
|
-
- `initialDocx`
|
|
30
|
-
- `initialSnapshot`
|
|
31
|
-
- datastore `load(...)` fallback when neither initial source prop is provided
|
|
32
|
-
|
|
33
|
-
Frozen reload model:
|
|
34
|
-
|
|
35
|
-
- the component is uncontrolled by default
|
|
36
|
-
- an optional replace-on-change path is allowed for host-driven document replacement
|
|
37
|
-
- replace-on-change is a full runtime teardown and reload when the host revision token changes
|
|
38
|
-
- replace-on-change is not keystroke-by-keystroke controlled editing
|
|
39
|
-
|
|
40
|
-
Frozen host reload props:
|
|
41
|
-
|
|
42
|
-
```ts
|
|
43
|
-
type ExternalDocumentSource =
|
|
44
|
-
| {
|
|
45
|
-
kind: "docx";
|
|
46
|
-
bytes: Uint8Array | ArrayBuffer;
|
|
47
|
-
sourceLabel?: string;
|
|
48
|
-
}
|
|
49
|
-
| {
|
|
50
|
-
kind: "snapshot";
|
|
51
|
-
snapshot: PersistedEditorSnapshot;
|
|
52
|
-
sourceLabel?: string;
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
interface WordReviewEditorProps {
|
|
56
|
-
externalDocumentRevision?: string;
|
|
57
|
-
externalDocSource?: ExternalDocumentSource;
|
|
58
|
-
}
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
Reload rule:
|
|
62
|
-
|
|
63
|
-
- if `externalDocumentRevision` changes and `externalDocSource` is present, the runtime disposes the current working session and loads the new source
|
|
64
|
-
- if `externalDocumentRevision` does not change, the host must not expect prop changes to mutate the active in-memory session
|
|
65
|
-
|
|
66
|
-
## 3. Runtime Boundary
|
|
67
|
-
|
|
68
|
-
The runtime contract is frozen around an external-store pair plus command dispatch.
|
|
69
|
-
|
|
70
|
-
```ts
|
|
71
|
-
type Unsubscribe = () => void;
|
|
72
|
-
|
|
73
|
-
interface DocumentRuntime {
|
|
74
|
-
subscribe(listener: () => void): Unsubscribe;
|
|
75
|
-
getRenderSnapshot(): RuntimeRenderSnapshot;
|
|
76
|
-
dispatch(command: EditorCommand): void;
|
|
77
|
-
|
|
78
|
-
undo(): void;
|
|
79
|
-
redo(): void;
|
|
80
|
-
|
|
81
|
-
focus(): void;
|
|
82
|
-
blur(): void;
|
|
83
|
-
|
|
84
|
-
addComment(params: AddCommentParams): string;
|
|
85
|
-
openComment(commentId: string): void;
|
|
86
|
-
resolveComment(commentId: string): void;
|
|
87
|
-
|
|
88
|
-
acceptChange(changeId: string): void;
|
|
89
|
-
rejectChange(changeId: string): void;
|
|
90
|
-
acceptAllChanges(): void;
|
|
91
|
-
rejectAllChanges(): void;
|
|
92
|
-
|
|
93
|
-
getPersistedSnapshot(): PersistedEditorSnapshot;
|
|
94
|
-
getCompatibilityReport(): CompatibilityReport;
|
|
95
|
-
getWarnings(): EditorWarning[];
|
|
96
|
-
exportDocx(options?: ExportDocxOptions): Promise<ExportResult>;
|
|
97
|
-
}
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
Frozen runtime rules:
|
|
101
|
-
|
|
102
|
-
- every mutating entry point routes through `command -> transaction -> mapping -> remap -> commit -> notify`
|
|
103
|
-
- `subscribe(...)` listeners fire only after remap and atomic commit complete
|
|
104
|
-
- `getRenderSnapshot()` returns a pure projection for rendering and command enablement
|
|
105
|
-
- `getPersistedSnapshot()` returns the host persistence artifact and is separate from the render projection
|
|
106
|
-
- the runtime owns warnings, errors, compatibility data, and event emission
|
|
107
|
-
|
|
108
|
-
## 4. Render Snapshot Boundary
|
|
109
|
-
|
|
110
|
-
React renders from `RuntimeRenderSnapshot`, not from `PersistedEditorSnapshot`.
|
|
111
|
-
|
|
112
|
-
```ts
|
|
113
|
-
interface RuntimeRenderSnapshot {
|
|
114
|
-
documentId: string;
|
|
115
|
-
sessionId: string;
|
|
116
|
-
sourceLabel?: string;
|
|
117
|
-
|
|
118
|
-
revisionToken: string;
|
|
119
|
-
isReady: boolean;
|
|
120
|
-
isDirty: boolean;
|
|
121
|
-
readOnly: boolean;
|
|
122
|
-
|
|
123
|
-
selection: SelectionSnapshot;
|
|
124
|
-
documentStats: DocumentStats;
|
|
125
|
-
comments: CommentSidebarSnapshot;
|
|
126
|
-
trackedChanges: TrackedChangesSnapshot;
|
|
127
|
-
|
|
128
|
-
compatibility: CompatibilityPanelSnapshot;
|
|
129
|
-
warnings: EditorWarning[];
|
|
130
|
-
fatalError?: EditorError;
|
|
131
|
-
|
|
132
|
-
commandState: CommandStateSnapshot;
|
|
133
|
-
}
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
Frozen render-snapshot rules:
|
|
137
|
-
|
|
138
|
-
- render snapshots are ephemeral runtime projections and are not persistence artifacts
|
|
139
|
-
- render snapshots may be denormalized for UI convenience
|
|
140
|
-
- render snapshots must remain derivable from runtime-owned state
|
|
141
|
-
- render snapshots must not become a second editable source of truth
|
|
142
|
-
- review surfaces that highlight or focus one thread must read the active thread id from `RuntimeRenderSnapshot.comments.activeCommentId`, not infer it from DOM state
|
|
143
|
-
|
|
144
|
-
## 5. Persisted Snapshot Boundary
|
|
145
|
-
|
|
146
|
-
`PersistedEditorSnapshot` is the only frozen host-facing resume artifact.
|
|
147
|
-
|
|
148
|
-
```ts
|
|
149
|
-
interface PersistedEditorSnapshot {
|
|
150
|
-
snapshotVersion: "persisted-editor-snapshot/1";
|
|
151
|
-
schemaVersion: "cds/1.0.0";
|
|
152
|
-
|
|
153
|
-
documentId: string;
|
|
154
|
-
docId: string;
|
|
155
|
-
|
|
156
|
-
createdAt: string;
|
|
157
|
-
updatedAt: string;
|
|
158
|
-
savedAt: string;
|
|
159
|
-
editorBuild: string;
|
|
160
|
-
|
|
161
|
-
canonicalDocument: CanonicalDocument;
|
|
162
|
-
compatibility: CompatibilityReport;
|
|
163
|
-
warningLog: EditorWarning[];
|
|
164
|
-
}
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
Frozen persisted-snapshot rules:
|
|
168
|
-
|
|
169
|
-
- `canonicalDocument` is the serialized canonical envelope with the exact Wave 1 top-level keys
|
|
170
|
-
- loading a `PersistedEditorSnapshot` resumes from canonical state and does not re-run OOXML import
|
|
171
|
-
- `savedAt` is the save checkpoint timestamp, separate from document lifecycle timestamps
|
|
172
|
-
- compatibility data in the snapshot is the last runtime-generated view at save time
|
|
173
|
-
- render-only UI state such as sidebar open state is not part of the persistence contract
|
|
174
|
-
|
|
175
|
-
## 6. Range And Selection Projection
|
|
176
|
-
|
|
177
|
-
All host-visible ranges are runtime-derived projections over the shared position model.
|
|
178
|
-
|
|
179
|
-
```ts
|
|
180
|
-
type EditorAnchorProjection =
|
|
181
|
-
| {
|
|
182
|
-
kind: "range";
|
|
183
|
-
from: number;
|
|
184
|
-
to: number;
|
|
185
|
-
assoc: {
|
|
186
|
-
start: -1 | 1;
|
|
187
|
-
end: -1 | 1;
|
|
188
|
-
};
|
|
189
|
-
}
|
|
190
|
-
| {
|
|
191
|
-
kind: "node";
|
|
192
|
-
at: number;
|
|
193
|
-
assoc: -1 | 1;
|
|
194
|
-
}
|
|
195
|
-
| {
|
|
196
|
-
kind: "detached";
|
|
197
|
-
lastKnownRange: {
|
|
198
|
-
from: number;
|
|
199
|
-
to: number;
|
|
200
|
-
};
|
|
201
|
-
reason: "deleted" | "invalidatedByStructureChange" | "importAmbiguity";
|
|
202
|
-
};
|
|
203
|
-
|
|
204
|
-
interface SelectionSnapshot {
|
|
205
|
-
anchor: number;
|
|
206
|
-
head: number;
|
|
207
|
-
isCollapsed: boolean;
|
|
208
|
-
activeRange: EditorAnchorProjection;
|
|
209
|
-
}
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
Frozen range rules:
|
|
213
|
-
|
|
214
|
-
- positions are integers in the shared canonical main-story coordinate space
|
|
215
|
-
- hosts do not receive DOM-path, node-key, or HTML offset references
|
|
216
|
-
- detached anchors remain inspectable and warning-linkable after invalidation
|
|
217
|
-
|
|
218
|
-
## 7. Warning Envelope
|
|
219
|
-
|
|
220
|
-
Warnings are host-visible, non-fatal runtime diagnostics.
|
|
221
|
-
|
|
222
|
-
```ts
|
|
223
|
-
type EditorWarningCode =
|
|
224
|
-
| "unsupported_ooxml_preserved"
|
|
225
|
-
| "unsupported_ooxml_locked"
|
|
226
|
-
| "import_normalized"
|
|
227
|
-
| "export_roundtrip_risk"
|
|
228
|
-
| "comment_anchor_detached"
|
|
229
|
-
| "revision_anchor_detached"
|
|
230
|
-
| "large_document_degraded"
|
|
231
|
-
| "font_substitution"
|
|
232
|
-
| "image_missing";
|
|
233
|
-
|
|
234
|
-
interface EditorWarning {
|
|
235
|
-
warningId: string;
|
|
236
|
-
code: EditorWarningCode;
|
|
237
|
-
severity: "info" | "warning";
|
|
238
|
-
message: string;
|
|
239
|
-
source:
|
|
240
|
-
| "import"
|
|
241
|
-
| "runtime"
|
|
242
|
-
| "review"
|
|
243
|
-
| "preservation"
|
|
244
|
-
| "validation"
|
|
245
|
-
| "export";
|
|
246
|
-
affectedAnchor?: EditorAnchorProjection;
|
|
247
|
-
featureEntryId?: string;
|
|
248
|
-
details?: Record<string, unknown>;
|
|
249
|
-
}
|
|
250
|
-
```
|
|
251
|
-
|
|
252
|
-
Frozen warning rules:
|
|
253
|
-
|
|
254
|
-
- warnings are structured and stable enough for host logging, UI linking, and snapshot persistence
|
|
255
|
-
- warnings may point to detached anchors when a prior range can no longer be attached
|
|
256
|
-
- warnings do not imply export failure on their own
|
|
257
|
-
|
|
258
|
-
## 8. Error Envelope
|
|
259
|
-
|
|
260
|
-
Errors are structured failures. Some are fatal to the editing session.
|
|
261
|
-
|
|
262
|
-
```ts
|
|
263
|
-
type EditorErrorCode =
|
|
264
|
-
| "import_failed"
|
|
265
|
-
| "export_failed"
|
|
266
|
-
| "package_corrupt"
|
|
267
|
-
| "validation_failed"
|
|
268
|
-
| "datastore_failed"
|
|
269
|
-
| "internal_invariant";
|
|
270
|
-
|
|
271
|
-
interface EditorError {
|
|
272
|
-
errorId: string;
|
|
273
|
-
code: EditorErrorCode;
|
|
274
|
-
message: string;
|
|
275
|
-
isFatal: boolean;
|
|
276
|
-
source:
|
|
277
|
-
| "import"
|
|
278
|
-
| "runtime"
|
|
279
|
-
| "validation"
|
|
280
|
-
| "datastore"
|
|
281
|
-
| "export";
|
|
282
|
-
details?: Record<string, unknown>;
|
|
283
|
-
}
|
|
284
|
-
```
|
|
285
|
-
|
|
286
|
-
Frozen error rules:
|
|
287
|
-
|
|
288
|
-
- fatal errors may place the editor into a non-editable error state
|
|
289
|
-
- non-fatal errors surface through callbacks and status surfaces without discarding the active session
|
|
290
|
-
- error envelopes remain host-visible and serializable
|
|
291
|
-
|
|
292
|
-
## 9. Compatibility Report Envelope
|
|
293
|
-
|
|
294
|
-
The public compatibility contract stays separate from render snapshots and separate from raw warning lists.
|
|
295
|
-
|
|
296
|
-
```ts
|
|
297
|
-
type CompatibilityFeatureClass =
|
|
298
|
-
| "supported-roundtrip"
|
|
299
|
-
| "preserve-only"
|
|
300
|
-
| "unsupported-fatal";
|
|
301
|
-
|
|
302
|
-
interface CompatibilityFeatureEntry {
|
|
303
|
-
featureEntryId: string;
|
|
304
|
-
featureKey: string;
|
|
305
|
-
featureClass: CompatibilityFeatureClass;
|
|
306
|
-
message: string;
|
|
307
|
-
affectedAnchor?: EditorAnchorProjection;
|
|
308
|
-
details?: Record<string, unknown>;
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
interface CompatibilityReport {
|
|
312
|
-
reportVersion: "compatibility-report/1";
|
|
313
|
-
generatedAt: string;
|
|
314
|
-
blockExport: boolean;
|
|
315
|
-
featureEntries: CompatibilityFeatureEntry[];
|
|
316
|
-
warnings: EditorWarning[];
|
|
317
|
-
errors: EditorError[];
|
|
318
|
-
}
|
|
319
|
-
```
|
|
320
|
-
|
|
321
|
-
Frozen compatibility rules:
|
|
322
|
-
|
|
323
|
-
- `blockExport` is the single export gate bit
|
|
324
|
-
- feature classes are exactly `supported-roundtrip`, `preserve-only`, and `unsupported-fatal`
|
|
325
|
-
- the report is available from both the runtime and `PersistedEditorSnapshot`
|
|
326
|
-
|
|
327
|
-
## 10. Event Model
|
|
328
|
-
|
|
329
|
-
The host event stream is a discriminated union with stable envelopes.
|
|
330
|
-
|
|
331
|
-
```ts
|
|
332
|
-
type WordReviewEditorEvent =
|
|
333
|
-
| {
|
|
334
|
-
type: "ready";
|
|
335
|
-
documentId: string;
|
|
336
|
-
sessionId: string;
|
|
337
|
-
source: "docx" | "snapshot" | "datastore" | "canonical";
|
|
338
|
-
stats: DocumentStats;
|
|
339
|
-
compatibility: CompatibilityReport;
|
|
340
|
-
}
|
|
341
|
-
| {
|
|
342
|
-
type: "dirty_changed";
|
|
343
|
-
documentId: string;
|
|
344
|
-
isDirty: boolean;
|
|
345
|
-
}
|
|
346
|
-
| {
|
|
347
|
-
type: "selection_changed";
|
|
348
|
-
documentId: string;
|
|
349
|
-
selection: SelectionSnapshot;
|
|
350
|
-
}
|
|
351
|
-
| {
|
|
352
|
-
type: "comment_added";
|
|
353
|
-
documentId: string;
|
|
354
|
-
commentId: string;
|
|
355
|
-
anchor: EditorAnchorProjection;
|
|
356
|
-
}
|
|
357
|
-
| {
|
|
358
|
-
type: "comment_resolved";
|
|
359
|
-
documentId: string;
|
|
360
|
-
commentId: string;
|
|
361
|
-
}
|
|
362
|
-
| {
|
|
363
|
-
type: "change_accepted";
|
|
364
|
-
documentId: string;
|
|
365
|
-
changeId: string;
|
|
366
|
-
}
|
|
367
|
-
| {
|
|
368
|
-
type: "change_rejected";
|
|
369
|
-
documentId: string;
|
|
370
|
-
changeId: string;
|
|
371
|
-
}
|
|
372
|
-
| {
|
|
373
|
-
type: "warning_added";
|
|
374
|
-
documentId: string;
|
|
375
|
-
warning: EditorWarning;
|
|
376
|
-
}
|
|
377
|
-
| {
|
|
378
|
-
type: "warning_cleared";
|
|
379
|
-
documentId: string;
|
|
380
|
-
warningId: string;
|
|
381
|
-
code: EditorWarningCode;
|
|
382
|
-
}
|
|
383
|
-
| {
|
|
384
|
-
type: "error";
|
|
385
|
-
documentId: string;
|
|
386
|
-
error: EditorError;
|
|
387
|
-
}
|
|
388
|
-
| {
|
|
389
|
-
type: "autosave_state";
|
|
390
|
-
documentId: string;
|
|
391
|
-
state: AutosaveState;
|
|
392
|
-
}
|
|
393
|
-
| {
|
|
394
|
-
type: "snapshot_saved";
|
|
395
|
-
documentId: string;
|
|
396
|
-
snapshot: PersistedEditorSnapshot;
|
|
397
|
-
isAutosave: boolean;
|
|
398
|
-
}
|
|
399
|
-
| {
|
|
400
|
-
type: "export_completed";
|
|
401
|
-
documentId: string;
|
|
402
|
-
result: ExportResult;
|
|
403
|
-
};
|
|
404
|
-
```
|
|
405
|
-
|
|
406
|
-
Frozen event rules:
|
|
407
|
-
|
|
408
|
-
- every event is emitted after the relevant runtime commit or completion boundary
|
|
409
|
-
- warning and error callbacks may mirror these envelopes, but the discriminated union remains the single canonical event stream
|
|
410
|
-
- the host must not infer document truth by replaying events instead of using snapshots and runtime exports
|
|
411
|
-
|
|
412
|
-
## 11. Public Ref Boundary
|
|
413
|
-
|
|
414
|
-
The host imperative ref remains a thin runtime wrapper.
|
|
415
|
-
|
|
416
|
-
```ts
|
|
417
|
-
interface WordReviewEditorRef {
|
|
418
|
-
focus(): void;
|
|
419
|
-
blur(): void;
|
|
420
|
-
|
|
421
|
-
undo(): void;
|
|
422
|
-
redo(): void;
|
|
423
|
-
|
|
424
|
-
addComment(params: AddCommentParams): string;
|
|
425
|
-
openComment(commentId: string): void;
|
|
426
|
-
resolveComment(commentId: string): void;
|
|
427
|
-
|
|
428
|
-
acceptChange(changeId: string): void;
|
|
429
|
-
rejectChange(changeId: string): void;
|
|
430
|
-
acceptAllChanges(): void;
|
|
431
|
-
rejectAllChanges(): void;
|
|
432
|
-
|
|
433
|
-
exportDocx(options?: ExportDocxOptions): Promise<ExportResult>;
|
|
434
|
-
getSnapshot(): PersistedEditorSnapshot;
|
|
435
|
-
getCompatibilityReport(): CompatibilityReport;
|
|
436
|
-
getWarnings(): EditorWarning[];
|
|
437
|
-
}
|
|
438
|
-
```
|
|
439
|
-
|
|
440
|
-
Frozen ref rules:
|
|
441
|
-
|
|
442
|
-
- the ref does not expose DOM nodes
|
|
443
|
-
- the ref does not expose mutable canonical state objects
|
|
444
|
-
- `getSnapshot()` is the public name even though the runtime method is `getPersistedSnapshot()`
|
|
445
|
-
|
|
446
|
-
## 12. Public Props Boundary
|
|
447
|
-
|
|
448
|
-
```ts
|
|
449
|
-
interface WordReviewEditorProps {
|
|
450
|
-
documentId: string;
|
|
451
|
-
currentUser: EditorUser;
|
|
452
|
-
|
|
453
|
-
initialDocx?: Uint8Array | ArrayBuffer;
|
|
454
|
-
initialSnapshot?: PersistedEditorSnapshot;
|
|
455
|
-
initialSourceLabel?: string;
|
|
456
|
-
|
|
457
|
-
externalDocumentRevision?: string;
|
|
458
|
-
externalDocSource?: ExternalDocumentSource;
|
|
459
|
-
|
|
460
|
-
readOnly?: boolean;
|
|
461
|
-
reviewMode?: "editing" | "review";
|
|
462
|
-
markupDisplay?: "clean" | "simple" | "all";
|
|
463
|
-
|
|
464
|
-
datastore?: EditorDatastoreAdapter;
|
|
465
|
-
autosave?: AutosaveConfig;
|
|
466
|
-
|
|
467
|
-
onEvent?: (event: WordReviewEditorEvent) => void;
|
|
468
|
-
onWarning?: (warning: EditorWarning) => void;
|
|
469
|
-
onError?: (error: EditorError) => void;
|
|
470
|
-
}
|
|
471
|
-
```
|
|
472
|
-
|
|
473
|
-
Frozen prop rules:
|
|
474
|
-
|
|
475
|
-
- first load accepts exactly one of `initialDocx` or `initialSnapshot` when an explicit initial source is provided
|
|
476
|
-
- `documentId` is the host-level identity key and is distinct from canonical `docId`
|
|
477
|
-
- `reviewMode` and `markupDisplay` are UI-runtime controls, not alternate persistence formats
|
|
478
|
-
|
|
479
|
-
## 13. Datastore Boundary
|
|
480
|
-
|
|
481
|
-
```ts
|
|
482
|
-
interface EditorDatastoreAdapter {
|
|
483
|
-
load(params: { documentId: string }): Promise<LoadResult>;
|
|
484
|
-
saveSnapshot(params: SaveSnapshotParams): Promise<SaveSnapshotResult>;
|
|
485
|
-
saveExport(params: SaveExportParams): Promise<SaveExportResult>;
|
|
486
|
-
logEvent?(event: EditorTelemetryEvent): void;
|
|
487
|
-
}
|
|
488
|
-
|
|
489
|
-
interface LoadResult {
|
|
490
|
-
source?:
|
|
491
|
-
| { kind: "docx"; bytes: Uint8Array; sourceLabel?: string }
|
|
492
|
-
| { kind: "snapshot"; snapshot: PersistedEditorSnapshot; sourceLabel?: string };
|
|
493
|
-
}
|
|
494
|
-
```
|
|
495
|
-
|
|
496
|
-
Frozen datastore rules:
|
|
497
|
-
|
|
498
|
-
- datastore save and load operate on the persisted snapshot or final `.docx` artifact
|
|
499
|
-
- datastore integrations do not bypass the runtime mutation pipeline
|
|
500
|
-
|
|
501
|
-
## 14. Change Control Notes
|
|
502
|
-
|
|
503
|
-
The following are frozen by this spec and require a new wave decision to change:
|
|
504
|
-
|
|
505
|
-
- the dual snapshot boundary of render snapshot versus persisted snapshot
|
|
506
|
-
- the `warning_added`, `warning_cleared`, `error`, and `snapshot_saved` event envelopes
|
|
507
|
-
- the runtime-derived `EditorAnchorProjection` contract
|
|
508
|
-
- the replace-on-change prop pair `externalDocumentRevision` and `externalDocSource`
|
|
509
|
-
- the persisted snapshot keys `snapshotVersion`, `schemaVersion`, `documentId`, `docId`, `createdAt`, `updatedAt`, `savedAt`, `editorBuild`, `canonicalDocument`, `compatibility`, and `warningLog`
|