@beyondwork/docx-react-component 1.0.106 → 1.0.108
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/package.json +19 -5
- package/src/api/geometry-overlay-rects.ts +5 -0
- package/src/api/package-version.ts +1 -1
- package/src/api/page-anchor-id.ts +5 -0
- package/src/api/public-types.ts +16 -9
- package/src/api/table-node-specs.ts +6 -0
- package/src/api/v3/_create.ts +2 -1
- package/src/api/v3/_page-anchor-id.ts +52 -0
- package/src/api/v3/_runtime-handle.ts +92 -1
- package/src/api/v3/ai/_audit-time.ts +5 -0
- package/src/api/v3/ai/_pe2-evidence.ts +38 -0
- package/src/api/v3/ai/attach.ts +7 -2
- package/src/api/v3/ai/replacement.ts +101 -18
- package/src/api/v3/ai/resolve.ts +2 -2
- package/src/api/v3/ai/review.ts +177 -3
- package/src/api/v3/index.ts +1 -0
- package/src/api/v3/runtime/collab.ts +462 -0
- package/src/api/v3/runtime/document.ts +503 -20
- package/src/api/v3/runtime/geometry.ts +97 -0
- package/src/api/v3/runtime/layout.ts +744 -0
- package/src/api/v3/runtime/perf-probe.ts +14 -0
- package/src/api/v3/runtime/viewport.ts +9 -8
- package/src/api/v3/ui/_types.ts +149 -55
- package/src/api/v3/ui/chrome-preset-model.ts +5 -5
- package/src/api/v3/ui/debug.ts +115 -2
- package/src/api/v3/ui/index.ts +13 -0
- package/src/api/v3/ui/overlays.ts +0 -8
- package/src/api/v3/ui/surface.ts +56 -0
- package/src/api/v3/ui/viewport.ts +22 -9
- package/src/core/commands/image-commands.ts +1 -0
- package/src/core/commands/index.ts +6 -0
- package/src/core/schema/text-schema.ts +43 -5
- package/src/core/selection/mapping.ts +8 -1
- package/src/core/selection/review-anchors.ts +5 -1
- package/src/core/state/text-transaction.ts +8 -2
- package/src/io/export/serialize-revisions.ts +149 -1
- package/src/io/normalize/normalize-text.ts +6 -0
- package/src/io/ooxml/parse-bookmark-references.ts +55 -0
- package/src/io/ooxml/parse-fields.ts +24 -2
- package/src/io/ooxml/parse-headers-footers.ts +38 -5
- package/src/io/ooxml/parse-main-document.ts +153 -9
- package/src/io/ooxml/parse-numbering.ts +20 -0
- package/src/io/ooxml/parse-revisions.ts +19 -8
- package/src/io/opc/package-reader.ts +98 -8
- package/src/model/anchor.ts +4 -3
- package/src/model/canonical-document.ts +220 -2
- package/src/model/canonical-hash.ts +221 -0
- package/src/model/canonical-layout-inputs.ts +245 -6
- package/src/model/layout/index.ts +1 -0
- package/src/model/layout/page-graph-types.ts +118 -1
- package/src/model/review/revision-types.ts +14 -3
- package/src/preservation/store.ts +20 -4
- package/src/review/README.md +1 -1
- package/src/review/store/revision-actions.ts +14 -2
- package/src/runtime/collab/event-types.ts +67 -1
- package/src/runtime/collab/runtime-collab-sync.ts +177 -5
- package/src/runtime/diagnostics/layout-guard-warning.ts +18 -0
- package/src/runtime/document-heading-outline.ts +147 -0
- package/src/runtime/document-navigation.ts +8 -243
- package/src/runtime/document-runtime.ts +240 -97
- package/src/runtime/edit-dispatch/dispatch-text-command.ts +11 -0
- package/src/runtime/formatting/layout-inputs.ts +38 -5
- package/src/runtime/formatting/numbering/geometry.ts +28 -2
- package/src/runtime/geometry/adjacent-geometry-intake.ts +835 -0
- package/src/runtime/geometry/caret-geometry.ts +5 -6
- package/src/runtime/geometry/geometry-facet.ts +60 -10
- package/src/runtime/geometry/geometry-index.ts +591 -20
- package/src/runtime/geometry/geometry-types.ts +59 -0
- package/src/runtime/geometry/hit-test.ts +11 -1
- package/src/runtime/geometry/overlay-rects.ts +5 -3
- package/src/runtime/geometry/project-anchors.ts +1 -1
- package/src/runtime/geometry/word-layout-v2-line-intake.ts +323 -0
- package/src/runtime/layout/index.ts +6 -0
- package/src/runtime/layout/layout-engine-instance.ts +6 -1
- package/src/runtime/layout/layout-engine-version.ts +181 -16
- package/src/runtime/layout/layout-facet-types.ts +6 -0
- package/src/runtime/layout/page-graph.ts +21 -4
- package/src/runtime/layout/paginated-layout-engine.ts +139 -15
- package/src/runtime/layout/project-block-fragments.ts +265 -7
- package/src/runtime/layout/public-facet.ts +78 -24
- package/src/runtime/layout/table-row-continuation-contract.ts +107 -0
- package/src/runtime/layout/table-row-split.ts +92 -35
- package/src/runtime/prerender/cache-envelope.ts +2 -2
- package/src/runtime/prerender/cache-key.ts +5 -4
- package/src/runtime/prerender/customxml-cache.ts +0 -1
- package/src/runtime/render/render-kernel.ts +1 -1
- package/src/runtime/revision-runtime.ts +112 -10
- package/src/runtime/scopes/_scope-dependencies.ts +1 -0
- package/src/runtime/scopes/action-validation.ts +22 -2
- package/src/runtime/scopes/capabilities.ts +316 -0
- package/src/runtime/scopes/compile-scope-bundle.ts +14 -0
- package/src/runtime/scopes/compiler-service.ts +108 -4
- package/src/runtime/scopes/content-control-evidence.ts +79 -0
- package/src/runtime/scopes/create-issue.ts +5 -5
- package/src/runtime/scopes/evidence.ts +91 -0
- package/src/runtime/scopes/formatting/apply.ts +2 -0
- package/src/runtime/scopes/geometry-evidence.ts +130 -0
- package/src/runtime/scopes/index.ts +54 -0
- package/src/runtime/scopes/issue-lifecycle.ts +224 -0
- package/src/runtime/scopes/layout-evidence.ts +374 -0
- package/src/runtime/scopes/multi-paragraph-refusal.ts +37 -0
- package/src/runtime/scopes/preservation-boundary.ts +7 -1
- package/src/runtime/scopes/replacement/apply.ts +97 -34
- package/src/runtime/scopes/scope-kinds/paragraph.ts +108 -12
- package/src/runtime/scopes/semantic-scope-types.ts +242 -3
- package/src/runtime/scopes/visualization.ts +28 -0
- package/src/runtime/surface-projection.ts +44 -5
- package/src/runtime/telemetry/perf-probe.ts +216 -0
- package/src/runtime/virtualized-rendering.ts +36 -1
- package/src/runtime/workflow/ai-issue-lifecycle.ts +253 -0
- package/src/runtime/workflow/coordinator.ts +39 -11
- package/src/runtime/workflow/derived-scope-resolver.ts +63 -9
- package/src/runtime/workflow/index.ts +3 -0
- package/src/runtime/workflow/overlay-lane-types.ts +58 -0
- package/src/runtime/workflow/overlay-lanes.ts +168 -10
- package/src/runtime/workflow/overlay-store.ts +2 -2
- package/src/runtime/workflow/redline-posture-calibration.ts +257 -0
- package/src/runtime/workflow/word-field-matrix-calibration.ts +231 -0
- package/src/session/_sync-legacy.ts +17 -27
- package/src/session/import/loader.ts +6 -4
- package/src/session/import/source-package-evidence.ts +186 -2
- package/src/session/index.ts +5 -6
- package/src/session/session.ts +30 -56
- package/src/session/types.ts +8 -13
- package/src/shell/session-bootstrap.ts +155 -81
- package/src/ui/WordReviewEditor.tsx +520 -12
- package/src/ui/editor-shell-view.tsx +14 -4
- package/src/ui/editor-surface-controller.tsx +5 -3
- package/src/ui/headless/selection-tool-resolver.ts +1 -2
- package/src/ui/presence-overlay-lane.ts +0 -1
- package/src/ui/ui-controller-factory.ts +7 -0
- package/src/ui-tailwind/chrome/build-context-menu-entries.ts +5 -1
- package/src/ui-tailwind/chrome/editor-action-registry.ts +105 -5
- package/src/ui-tailwind/chrome/editor-actions-to-palette.ts +7 -0
- package/src/ui-tailwind/chrome/layer-debug-contracts.ts +208 -0
- package/src/ui-tailwind/chrome/resolve-target-kind.ts +13 -0
- package/src/ui-tailwind/chrome/tw-alert-banner.tsx +11 -3
- package/src/ui-tailwind/chrome/tw-command-palette.tsx +36 -6
- package/src/ui-tailwind/chrome/tw-context-menu.tsx +6 -1
- package/src/ui-tailwind/chrome/tw-display-mode-selector.tsx +42 -109
- package/src/ui-tailwind/chrome/tw-inline-find-bar.tsx +26 -6
- package/src/ui-tailwind/chrome/tw-navigation-command-bar.tsx +328 -0
- package/src/ui-tailwind/chrome/tw-object-context-toolbar.tsx +8 -4
- package/src/ui-tailwind/chrome/tw-runtime-repl-dialog.tsx +129 -1
- package/src/ui-tailwind/chrome/tw-selection-tool-host.tsx +19 -5
- package/src/ui-tailwind/chrome/tw-selection-tool-structure.tsx +5 -1
- package/src/ui-tailwind/chrome/tw-workspace-chrome-host.tsx +28 -12
- package/src/ui-tailwind/chrome-overlay/tw-chrome-overlay.tsx +30 -3
- package/src/ui-tailwind/chrome-overlay/tw-object-selection-overlay.tsx +116 -10
- package/src/ui-tailwind/chrome-overlay/tw-page-stack-overlay-layer.tsx +223 -94
- package/src/ui-tailwind/chrome-overlay/tw-presence-overlay-lane.tsx +157 -0
- package/src/ui-tailwind/chrome-overlay/tw-review-overlay-lane-markers.tsx +259 -0
- package/src/ui-tailwind/chrome-overlay/tw-scope-card-layer.tsx +5 -2
- package/src/ui-tailwind/chrome-overlay/tw-substrate-overlay-lanes.tsx +314 -0
- package/src/ui-tailwind/debug/README.md +4 -1
- package/src/ui-tailwind/debug/layer11-consumer-readiness.ts +272 -0
- package/src/ui-tailwind/debug/layer11-word-field-matrix-evidence.ts +160 -0
- package/src/ui-tailwind/editor-surface/perf-probe.ts +14 -215
- package/src/ui-tailwind/editor-surface/pm-decorations.ts +42 -0
- package/src/ui-tailwind/editor-surface/pm-position-map.ts +38 -2
- package/src/ui-tailwind/editor-surface/pm-schema.ts +14 -4
- package/src/ui-tailwind/editor-surface/pm-state-from-snapshot.ts +34 -5
- package/src/ui-tailwind/editor-surface/runtime-decoration-plugin.ts +9 -19
- package/src/ui-tailwind/editor-surface/surface-build-keys.ts +2 -2
- package/src/ui-tailwind/editor-surface/tw-page-block-view.helpers.ts +145 -0
- package/src/ui-tailwind/editor-surface/tw-page-block-view.tsx +16 -11
- package/src/ui-tailwind/editor-surface/tw-prosemirror-surface.tsx +8 -10
- package/src/ui-tailwind/editor-surface/tw-table-node-view.tsx +3 -0
- package/src/ui-tailwind/page-stack/tw-page-chrome-entry.tsx +4 -2
- package/src/ui-tailwind/page-stack/tw-page-stack-chrome-layer.tsx +60 -20
- package/src/ui-tailwind/page-stack/tw-region-block-renderer.tsx +16 -11
- package/src/ui-tailwind/review/tw-health-panel.tsx +36 -17
- package/src/ui-tailwind/review/tw-review-rail.tsx +7 -4
- package/src/ui-tailwind/review-workspace/diagnostics-visibility.ts +44 -0
- package/src/ui-tailwind/review-workspace/page-shell-metrics.ts +11 -0
- package/src/ui-tailwind/review-workspace/tw-review-workspace-rail.tsx +16 -1
- package/src/ui-tailwind/review-workspace/types.ts +26 -12
- package/src/ui-tailwind/review-workspace/use-diagnostics-signal.ts +40 -11
- package/src/ui-tailwind/review-workspace/use-layout-facet-render-signal.ts +2 -1
- package/src/ui-tailwind/review-workspace/use-page-markers.ts +15 -26
- package/src/ui-tailwind/review-workspace/use-scope-card-state.ts +35 -18
- package/src/ui-tailwind/review-workspace/use-selection-toolbar-placement.ts +41 -32
- package/src/ui-tailwind/review-workspace/use-status-bar-page-facts.ts +2 -1
- package/src/ui-tailwind/review-workspace/use-workspace-side-effects.ts +2 -1
- package/src/ui-tailwind/status/tw-status-bar.tsx +6 -5
- package/src/ui-tailwind/toolbar/tw-role-action-region.tsx +52 -80
- package/src/ui-tailwind/toolbar/tw-shell-header.tsx +12 -48
- package/src/ui-tailwind/toolbar/tw-toolbar-icon-button.tsx +9 -4
- package/src/ui-tailwind/toolbar/tw-toolbar.tsx +328 -361
- package/src/ui-tailwind/tw-review-workspace.tsx +152 -286
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
export type Layer11SurfaceConsumer =
|
|
2
|
+
| "page-stack"
|
|
3
|
+
| "scope-card"
|
|
4
|
+
| "scope-rail"
|
|
5
|
+
| "object-selection"
|
|
6
|
+
| "selection-toolbar"
|
|
7
|
+
| "caret"
|
|
8
|
+
| "broad-scope"
|
|
9
|
+
| "comments"
|
|
10
|
+
| "field-matrix";
|
|
11
|
+
|
|
12
|
+
export type Layer11FactSource =
|
|
13
|
+
| "ui-api"
|
|
14
|
+
| "l05-geometry"
|
|
15
|
+
| "l04-layout"
|
|
16
|
+
| "l10-overlay-lane"
|
|
17
|
+
| "runtime-readback";
|
|
18
|
+
|
|
19
|
+
export type Layer11FallbackSource =
|
|
20
|
+
| "dom-measurement"
|
|
21
|
+
| "pm-dom"
|
|
22
|
+
| "workflow-facet"
|
|
23
|
+
| "diagnostic-evidence";
|
|
24
|
+
|
|
25
|
+
export interface Layer11ConsumerReadinessInput {
|
|
26
|
+
consumer: Layer11SurfaceConsumer;
|
|
27
|
+
facts: readonly Layer11FactSource[];
|
|
28
|
+
fallbacks?: readonly Layer11FallbackSource[];
|
|
29
|
+
exactGeometryRequired?: boolean;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface Layer11ConsumerReadiness {
|
|
33
|
+
consumer: Layer11SurfaceConsumer;
|
|
34
|
+
status: "ready" | "guarded" | "blocked";
|
|
35
|
+
canPaintFromFacts: boolean;
|
|
36
|
+
degradedFallbacks: readonly Layer11FallbackSource[];
|
|
37
|
+
reason: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export type Layer11OpenWorkStatus =
|
|
41
|
+
| "closed"
|
|
42
|
+
| "ready"
|
|
43
|
+
| "blocked-upstream";
|
|
44
|
+
|
|
45
|
+
export interface Layer11OpenWorkItem {
|
|
46
|
+
id: string;
|
|
47
|
+
owner: "L11" | "L04" | "L05" | "L10" | "architecture";
|
|
48
|
+
facts: readonly Layer11FactSource[];
|
|
49
|
+
requiredFacts?: readonly Layer11FactSource[];
|
|
50
|
+
completed?: boolean;
|
|
51
|
+
upstreamBlockers?: readonly string[];
|
|
52
|
+
ownerDecisionRequired?: boolean;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface Layer11OpenWorkReadiness {
|
|
56
|
+
id: string;
|
|
57
|
+
owner: Layer11OpenWorkItem["owner"];
|
|
58
|
+
status: Layer11OpenWorkStatus;
|
|
59
|
+
missingFacts: readonly Layer11FactSource[];
|
|
60
|
+
upstreamBlockers: readonly string[];
|
|
61
|
+
reason: string;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export interface Layer11OpenWorkSummary {
|
|
65
|
+
closedCount: number;
|
|
66
|
+
readyCount: number;
|
|
67
|
+
blockedUpstreamCount: number;
|
|
68
|
+
entries: readonly Layer11OpenWorkReadiness[];
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function evaluateLayer11ConsumerReadiness(
|
|
72
|
+
input: Layer11ConsumerReadinessInput,
|
|
73
|
+
): Layer11ConsumerReadiness {
|
|
74
|
+
const facts = new Set(input.facts);
|
|
75
|
+
const fallbacks = Array.from(new Set(input.fallbacks ?? []));
|
|
76
|
+
const hasTypedFact =
|
|
77
|
+
facts.has("ui-api") ||
|
|
78
|
+
facts.has("l04-layout") ||
|
|
79
|
+
facts.has("l05-geometry") ||
|
|
80
|
+
facts.has("l10-overlay-lane") ||
|
|
81
|
+
facts.has("runtime-readback");
|
|
82
|
+
const hasExactGeometry = facts.has("l05-geometry") || facts.has("l04-layout");
|
|
83
|
+
|
|
84
|
+
if (!hasTypedFact) {
|
|
85
|
+
return {
|
|
86
|
+
consumer: input.consumer,
|
|
87
|
+
status: "blocked",
|
|
88
|
+
canPaintFromFacts: false,
|
|
89
|
+
degradedFallbacks: fallbacks,
|
|
90
|
+
reason: "No UI API, L04 layout, L05 geometry, L10 lane, or runtime readback fact is present.",
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (input.exactGeometryRequired && !hasExactGeometry) {
|
|
95
|
+
return {
|
|
96
|
+
consumer: input.consumer,
|
|
97
|
+
status: "guarded",
|
|
98
|
+
canPaintFromFacts: false,
|
|
99
|
+
degradedFallbacks: fallbacks,
|
|
100
|
+
reason: "Typed readback is present, but exact L04/L05 geometry is still required.",
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (fallbacks.length > 0) {
|
|
105
|
+
return {
|
|
106
|
+
consumer: input.consumer,
|
|
107
|
+
status: "guarded",
|
|
108
|
+
canPaintFromFacts: true,
|
|
109
|
+
degradedFallbacks: fallbacks,
|
|
110
|
+
reason: "Typed facts are present; fallback remains compatibility-only.",
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return {
|
|
115
|
+
consumer: input.consumer,
|
|
116
|
+
status: "ready",
|
|
117
|
+
canPaintFromFacts: true,
|
|
118
|
+
degradedFallbacks: [],
|
|
119
|
+
reason: "Typed presentation facts are available and no degraded fallback is needed.",
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export function summarizeLayer11OpenWork(
|
|
124
|
+
items: readonly Layer11OpenWorkItem[],
|
|
125
|
+
): Layer11OpenWorkSummary {
|
|
126
|
+
const entries = items.map((item): Layer11OpenWorkReadiness => {
|
|
127
|
+
const facts = new Set(item.facts);
|
|
128
|
+
const missingFacts = (item.requiredFacts ?? []).filter((fact) => !facts.has(fact));
|
|
129
|
+
const upstreamBlockers = Array.from(new Set(item.upstreamBlockers ?? []));
|
|
130
|
+
|
|
131
|
+
if (item.completed) {
|
|
132
|
+
return {
|
|
133
|
+
id: item.id,
|
|
134
|
+
owner: item.owner,
|
|
135
|
+
status: "closed",
|
|
136
|
+
missingFacts: [],
|
|
137
|
+
upstreamBlockers,
|
|
138
|
+
reason: "L11 consumer slice is already complete.",
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if (
|
|
143
|
+
item.owner !== "L11" ||
|
|
144
|
+
item.ownerDecisionRequired ||
|
|
145
|
+
missingFacts.length > 0 ||
|
|
146
|
+
upstreamBlockers.length > 0
|
|
147
|
+
) {
|
|
148
|
+
return {
|
|
149
|
+
id: item.id,
|
|
150
|
+
owner: item.owner,
|
|
151
|
+
status: "blocked-upstream",
|
|
152
|
+
missingFacts,
|
|
153
|
+
upstreamBlockers,
|
|
154
|
+
reason: buildOpenWorkBlockedReason(item, missingFacts, upstreamBlockers),
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return {
|
|
159
|
+
id: item.id,
|
|
160
|
+
owner: item.owner,
|
|
161
|
+
status: "ready",
|
|
162
|
+
missingFacts: [],
|
|
163
|
+
upstreamBlockers: [],
|
|
164
|
+
reason: "L11 owns the next consumer slice and all required facts are present.",
|
|
165
|
+
};
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
return {
|
|
169
|
+
closedCount: entries.filter((entry) => entry.status === "closed").length,
|
|
170
|
+
readyCount: entries.filter((entry) => entry.status === "ready").length,
|
|
171
|
+
blockedUpstreamCount: entries.filter((entry) => entry.status === "blocked-upstream").length,
|
|
172
|
+
entries,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function buildOpenWorkBlockedReason(
|
|
177
|
+
item: Layer11OpenWorkItem,
|
|
178
|
+
missingFacts: readonly Layer11FactSource[],
|
|
179
|
+
upstreamBlockers: readonly string[],
|
|
180
|
+
): string {
|
|
181
|
+
if (item.owner !== "L11") {
|
|
182
|
+
return `Next action is owned by ${item.owner}; L11 should wait for the owning lane surface.`;
|
|
183
|
+
}
|
|
184
|
+
if (item.ownerDecisionRequired) {
|
|
185
|
+
return "Architecture/owning-layer decision is required before L11 can consume or delete this surface.";
|
|
186
|
+
}
|
|
187
|
+
if (missingFacts.length > 0) {
|
|
188
|
+
return `Missing required presentation fact(s): ${missingFacts.join(", ")}.`;
|
|
189
|
+
}
|
|
190
|
+
if (upstreamBlockers.length > 0) {
|
|
191
|
+
return `Blocked by upstream surface(s): ${upstreamBlockers.join(", ")}.`;
|
|
192
|
+
}
|
|
193
|
+
return "Blocked by an upstream owner before L11 can paint from typed facts.";
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
export type Layer11RenderEvidenceKind =
|
|
197
|
+
| "word-oracle"
|
|
198
|
+
| "render-word"
|
|
199
|
+
| "source-package"
|
|
200
|
+
| "graph-pdf"
|
|
201
|
+
| "render-libre"
|
|
202
|
+
| "runtime-dom";
|
|
203
|
+
|
|
204
|
+
export interface Layer11RenderEvidenceEntry {
|
|
205
|
+
id: string;
|
|
206
|
+
kind: Layer11RenderEvidenceKind;
|
|
207
|
+
sourceFactPresent?: boolean;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
export interface Layer11RenderCalibrationSummary {
|
|
211
|
+
primaryEvidenceCount: number;
|
|
212
|
+
secondaryEvidenceCount: number;
|
|
213
|
+
rejectedEvidenceCount: number;
|
|
214
|
+
assertionReady: boolean;
|
|
215
|
+
route: "presentation-check" | "lower-layer-fact-required" | "insufficient-evidence";
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
const PRIMARY_RENDER_EVIDENCE = new Set<Layer11RenderEvidenceKind>([
|
|
219
|
+
"word-oracle",
|
|
220
|
+
"render-word",
|
|
221
|
+
"source-package",
|
|
222
|
+
]);
|
|
223
|
+
|
|
224
|
+
const SECONDARY_RENDER_EVIDENCE = new Set<Layer11RenderEvidenceKind>([
|
|
225
|
+
"graph-pdf",
|
|
226
|
+
"render-libre",
|
|
227
|
+
]);
|
|
228
|
+
|
|
229
|
+
export function summarizeWordFirstRenderCalibration(
|
|
230
|
+
entries: readonly Layer11RenderEvidenceEntry[],
|
|
231
|
+
): Layer11RenderCalibrationSummary {
|
|
232
|
+
const primaryEvidenceCount = entries.filter((entry) =>
|
|
233
|
+
PRIMARY_RENDER_EVIDENCE.has(entry.kind),
|
|
234
|
+
).length;
|
|
235
|
+
const secondaryEvidenceCount = entries.filter((entry) =>
|
|
236
|
+
SECONDARY_RENDER_EVIDENCE.has(entry.kind),
|
|
237
|
+
).length;
|
|
238
|
+
const rejectedEvidenceCount = entries.filter(
|
|
239
|
+
(entry) =>
|
|
240
|
+
!PRIMARY_RENDER_EVIDENCE.has(entry.kind) &&
|
|
241
|
+
!SECONDARY_RENDER_EVIDENCE.has(entry.kind),
|
|
242
|
+
).length;
|
|
243
|
+
const hasSourceFact = entries.some((entry) => entry.sourceFactPresent === true);
|
|
244
|
+
|
|
245
|
+
if (primaryEvidenceCount === 0) {
|
|
246
|
+
return {
|
|
247
|
+
primaryEvidenceCount,
|
|
248
|
+
secondaryEvidenceCount,
|
|
249
|
+
rejectedEvidenceCount,
|
|
250
|
+
assertionReady: false,
|
|
251
|
+
route: "insufficient-evidence",
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
if (!hasSourceFact) {
|
|
256
|
+
return {
|
|
257
|
+
primaryEvidenceCount,
|
|
258
|
+
secondaryEvidenceCount,
|
|
259
|
+
rejectedEvidenceCount,
|
|
260
|
+
assertionReady: false,
|
|
261
|
+
route: "lower-layer-fact-required",
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
return {
|
|
266
|
+
primaryEvidenceCount,
|
|
267
|
+
secondaryEvidenceCount,
|
|
268
|
+
rejectedEvidenceCount,
|
|
269
|
+
assertionReady: true,
|
|
270
|
+
route: "presentation-check",
|
|
271
|
+
};
|
|
272
|
+
}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
UiDebugEvidenceLaneEntry,
|
|
3
|
+
UiDebugEvidenceLaneSnapshot,
|
|
4
|
+
} from "../../api/v3/ui/_types.ts";
|
|
5
|
+
|
|
6
|
+
export interface Layer11WordFieldMatrixEvidenceEntry {
|
|
7
|
+
id: string;
|
|
8
|
+
status: UiDebugEvidenceLaneEntry["status"];
|
|
9
|
+
source: string;
|
|
10
|
+
docId?: string;
|
|
11
|
+
factId?: string;
|
|
12
|
+
owner?: string;
|
|
13
|
+
route:
|
|
14
|
+
| "render-visibility-evidence"
|
|
15
|
+
| "lower-layer-fact-required"
|
|
16
|
+
| "unavailable";
|
|
17
|
+
assertion: "evidence-only" | "assertion-ready" | "unavailable";
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface Layer11WordFieldMatrixEvidenceSummary {
|
|
21
|
+
status: UiDebugEvidenceLaneSnapshot["status"];
|
|
22
|
+
revision: number;
|
|
23
|
+
renderVisibilityEvidenceCount: number;
|
|
24
|
+
lowerLayerGapCount: number;
|
|
25
|
+
assertionReadyCount: number;
|
|
26
|
+
entries: readonly Layer11WordFieldMatrixEvidenceEntry[];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function classifyEntry(
|
|
30
|
+
entry: UiDebugEvidenceLaneEntry,
|
|
31
|
+
): Layer11WordFieldMatrixEvidenceEntry["route"] {
|
|
32
|
+
if (entry.status !== "available") {
|
|
33
|
+
return "unavailable";
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const source = entry.source ?? "";
|
|
37
|
+
const payload = payloadRecord(entry);
|
|
38
|
+
const artifactKind = payload.artifactKind;
|
|
39
|
+
if (source === "pe2.word-field-matrix" || artifactKind === "pe2.word-field-matrix") {
|
|
40
|
+
return "render-visibility-evidence";
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return "lower-layer-fact-required";
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function payloadRecord(entry: UiDebugEvidenceLaneEntry): Record<string, unknown> {
|
|
47
|
+
return entry.payload && typeof entry.payload === "object"
|
|
48
|
+
? entry.payload as Record<string, unknown>
|
|
49
|
+
: {};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function payloadOwner(entry: UiDebugEvidenceLaneEntry): string | undefined {
|
|
53
|
+
const owner = payloadRecord(entry).owner;
|
|
54
|
+
return typeof owner === "string" && owner.length > 0 ? owner : undefined;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function summarizeLayer11WordFieldMatrixEvidence(
|
|
58
|
+
lane: UiDebugEvidenceLaneSnapshot,
|
|
59
|
+
options: {
|
|
60
|
+
assertionReadyEntryIds?: readonly string[];
|
|
61
|
+
renderWordDocIds?: readonly string[];
|
|
62
|
+
} = {},
|
|
63
|
+
): Layer11WordFieldMatrixEvidenceSummary {
|
|
64
|
+
if (lane.kind !== "word-field-matrix") {
|
|
65
|
+
return {
|
|
66
|
+
status: "unavailable",
|
|
67
|
+
revision: lane.revision,
|
|
68
|
+
renderVisibilityEvidenceCount: 0,
|
|
69
|
+
lowerLayerGapCount: 0,
|
|
70
|
+
assertionReadyCount: 0,
|
|
71
|
+
entries: [],
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const assertionReadyIds = new Set(options.assertionReadyEntryIds ?? []);
|
|
76
|
+
const renderWordDocIds = new Set(options.renderWordDocIds ?? []);
|
|
77
|
+
const entries = lane.entries.map((entry) => {
|
|
78
|
+
const route = classifyEntry(entry);
|
|
79
|
+
const payload = payloadRecord(entry);
|
|
80
|
+
const docId = payloadDocId(payload);
|
|
81
|
+
const factId = payloadTableFrameContextFactId(payload);
|
|
82
|
+
const hasTableFrameRenderWordEvidence =
|
|
83
|
+
factId !== undefined && docId !== undefined && renderWordDocIds.has(docId);
|
|
84
|
+
const assertion: Layer11WordFieldMatrixEvidenceEntry["assertion"] =
|
|
85
|
+
route === "unavailable"
|
|
86
|
+
? "unavailable"
|
|
87
|
+
: assertionReadyIds.has(entry.id) || hasTableFrameRenderWordEvidence
|
|
88
|
+
? "assertion-ready"
|
|
89
|
+
: "evidence-only";
|
|
90
|
+
return {
|
|
91
|
+
id: entry.id,
|
|
92
|
+
status: entry.status,
|
|
93
|
+
source: entry.source ?? lane.source,
|
|
94
|
+
...(docId ? { docId } : {}),
|
|
95
|
+
...(factId ? { factId } : {}),
|
|
96
|
+
owner: payloadOwner(entry),
|
|
97
|
+
route,
|
|
98
|
+
assertion,
|
|
99
|
+
};
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
return {
|
|
103
|
+
status: lane.status,
|
|
104
|
+
revision: lane.revision,
|
|
105
|
+
renderVisibilityEvidenceCount: entries.filter(
|
|
106
|
+
(entry) => entry.route === "render-visibility-evidence",
|
|
107
|
+
).length,
|
|
108
|
+
lowerLayerGapCount: entries.filter(
|
|
109
|
+
(entry) => entry.route === "lower-layer-fact-required",
|
|
110
|
+
).length,
|
|
111
|
+
assertionReadyCount: entries.filter(
|
|
112
|
+
(entry) => entry.assertion === "assertion-ready",
|
|
113
|
+
).length,
|
|
114
|
+
entries,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function payloadDocId(payload: Record<string, unknown>): string | undefined {
|
|
119
|
+
const direct = payload.docId;
|
|
120
|
+
if (typeof direct === "string" && direct.length > 0) {
|
|
121
|
+
return direct;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const doc = payload.doc;
|
|
125
|
+
if (doc && typeof doc === "object") {
|
|
126
|
+
const docId = (doc as Record<string, unknown>).docId;
|
|
127
|
+
if (typeof docId === "string" && docId.length > 0) {
|
|
128
|
+
return docId;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function payloadTableFrameContextFactId(
|
|
136
|
+
payload: Record<string, unknown>,
|
|
137
|
+
): string | undefined {
|
|
138
|
+
const direct = payload.tableFrameContextFactId;
|
|
139
|
+
if (typeof direct === "string" && direct.length > 0) {
|
|
140
|
+
return direct;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const factKind = payload.factKind ?? payload.contextKind;
|
|
144
|
+
const namesTableFrameContext =
|
|
145
|
+
factKind === "tableFrameContext" ||
|
|
146
|
+
payload.tableFrameContext !== undefined ||
|
|
147
|
+
payload.tableFrameContextAvailable === true;
|
|
148
|
+
if (!namesTableFrameContext) {
|
|
149
|
+
return undefined;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
for (const key of ["factId", "namedFactId", "sourceFactId", "rowId"]) {
|
|
153
|
+
const value = payload[key];
|
|
154
|
+
if (typeof value === "string" && value.length > 0) {
|
|
155
|
+
return value;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return undefined;
|
|
160
|
+
}
|
|
@@ -1,215 +1,14 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
| "pm.decorations.comments"
|
|
16
|
-
| "pm.decorations.revisions"
|
|
17
|
-
| "pm.decorations.workflow"
|
|
18
|
-
| "pm.mount"
|
|
19
|
-
| "shell.render"
|
|
20
|
-
| "workspace.chrome"
|
|
21
|
-
| "selection.sync"
|
|
22
|
-
| "layout.incremental"
|
|
23
|
-
| "layout.full"
|
|
24
|
-
| "render.frame_build"
|
|
25
|
-
| "render.frame_diff"
|
|
26
|
-
| "render.decoration_resolve"
|
|
27
|
-
| "chrome.overlay_reposition"
|
|
28
|
-
| "chrome.hit_test"
|
|
29
|
-
| "rail.segment_project";
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Counter names the FastTextEditLane emits via `incrementInvalidationCounter`.
|
|
33
|
-
* Expose them as a const so integrators can read the shape without duplicating
|
|
34
|
-
* strings.
|
|
35
|
-
*/
|
|
36
|
-
export const PREDICTED_LANE_COUNTERS = {
|
|
37
|
-
applied: "predictions.applied",
|
|
38
|
-
equivalent: "predictions.equivalent",
|
|
39
|
-
adjusted: "predictions.adjusted",
|
|
40
|
-
rejected: "predictions.rejected",
|
|
41
|
-
rollback: "predictions.rollback",
|
|
42
|
-
structuralDivergence: "predictions.structuralDivergence",
|
|
43
|
-
bailBeforePredict: "predictions.bailBeforePredict",
|
|
44
|
-
refreshSelectionOnly: "predictions.refresh.selectionOnly",
|
|
45
|
-
refreshLocalTextEquivalent: "predictions.refresh.localTextEquivalent",
|
|
46
|
-
refreshSurfaceOnly: "predictions.refresh.surfaceOnly",
|
|
47
|
-
refreshFullProjection: "predictions.refresh.fullProjection",
|
|
48
|
-
refreshBlocked: "predictions.refresh.blocked",
|
|
49
|
-
} as const;
|
|
50
|
-
|
|
51
|
-
export interface PerfProbeSample {
|
|
52
|
-
token: string;
|
|
53
|
-
kind: PerfProbeKind;
|
|
54
|
-
durationMs: number;
|
|
55
|
-
recordedAt: number;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
interface PendingProbe {
|
|
59
|
-
kind: PerfProbeKind;
|
|
60
|
-
startedAt: number;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
interface PerfProbeState {
|
|
64
|
-
enabled?: boolean;
|
|
65
|
-
nextToken?: number;
|
|
66
|
-
pending?: Record<string, PendingProbe>;
|
|
67
|
-
samples?: PerfProbeSample[];
|
|
68
|
-
maxSamples?: number;
|
|
69
|
-
invalidationCounts?: Record<string, number>;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export interface PerfProbeSummary {
|
|
73
|
-
samples: PerfProbeSample[];
|
|
74
|
-
latest: Partial<Record<PerfProbeKind, PerfProbeSample | null>>;
|
|
75
|
-
invalidationCounts: Record<string, number>;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
declare global {
|
|
79
|
-
interface Window {
|
|
80
|
-
__DOCX_REACT_PERF_PROBE__?: PerfProbeState;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
export function startPerfProbe(kind: PerfProbeKind): string | null {
|
|
85
|
-
const state = getEnabledState();
|
|
86
|
-
if (!state) {
|
|
87
|
-
return null;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
const token = `${kind}-${state.nextToken ?? 0}`;
|
|
91
|
-
state.nextToken = (state.nextToken ?? 0) + 1;
|
|
92
|
-
state.pending ??= {};
|
|
93
|
-
state.pending[token] = {
|
|
94
|
-
kind,
|
|
95
|
-
startedAt: performance.now(),
|
|
96
|
-
};
|
|
97
|
-
return token;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
export function finishPerfProbe(token: string | null | undefined): PerfProbeSample | null {
|
|
101
|
-
if (!token) {
|
|
102
|
-
return null;
|
|
103
|
-
}
|
|
104
|
-
const state = getEnabledState();
|
|
105
|
-
if (!state?.pending?.[token]) {
|
|
106
|
-
return null;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
const pending = state.pending[token];
|
|
110
|
-
delete state.pending[token];
|
|
111
|
-
|
|
112
|
-
const sample: PerfProbeSample = {
|
|
113
|
-
token,
|
|
114
|
-
kind: pending.kind,
|
|
115
|
-
durationMs: performance.now() - pending.startedAt,
|
|
116
|
-
recordedAt: Date.now(),
|
|
117
|
-
};
|
|
118
|
-
|
|
119
|
-
pushSample(state, sample);
|
|
120
|
-
|
|
121
|
-
return sample;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
export function recordPerfSample(
|
|
125
|
-
kind: PerfProbeKind,
|
|
126
|
-
durationMs = 0,
|
|
127
|
-
): PerfProbeSample | null {
|
|
128
|
-
const state = getEnabledState();
|
|
129
|
-
if (!state) {
|
|
130
|
-
return null;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
const token = `${kind}-${state.nextToken ?? 0}`;
|
|
134
|
-
state.nextToken = (state.nextToken ?? 0) + 1;
|
|
135
|
-
const sample: PerfProbeSample = {
|
|
136
|
-
token,
|
|
137
|
-
kind,
|
|
138
|
-
durationMs,
|
|
139
|
-
recordedAt: Date.now(),
|
|
140
|
-
};
|
|
141
|
-
pushSample(state, sample);
|
|
142
|
-
return sample;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
export function incrementInvalidationCounter(
|
|
146
|
-
counter: string,
|
|
147
|
-
amount = 1,
|
|
148
|
-
): number {
|
|
149
|
-
const state = getEnabledState();
|
|
150
|
-
if (!state) {
|
|
151
|
-
return 0;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
state.invalidationCounts ??= {};
|
|
155
|
-
state.invalidationCounts[counter] =
|
|
156
|
-
(state.invalidationCounts[counter] ?? 0) + amount;
|
|
157
|
-
return state.invalidationCounts[counter]!;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
export function getLatestPerfSummary(): PerfProbeSummary | null {
|
|
161
|
-
const state = getEnabledState();
|
|
162
|
-
const samples = state?.samples ?? [];
|
|
163
|
-
if (!state || samples.length === 0) {
|
|
164
|
-
return null;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
return {
|
|
168
|
-
samples: [...samples],
|
|
169
|
-
latest: buildLatestSampleMap(samples),
|
|
170
|
-
invalidationCounts: { ...(state.invalidationCounts ?? {}) },
|
|
171
|
-
};
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
export function resetPerfProbeState(): void {
|
|
175
|
-
const state = getEnabledState();
|
|
176
|
-
if (!state) {
|
|
177
|
-
return;
|
|
178
|
-
}
|
|
179
|
-
state.nextToken = 0;
|
|
180
|
-
state.pending = {};
|
|
181
|
-
state.samples = [];
|
|
182
|
-
state.invalidationCounts = {};
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
function getEnabledState(): PerfProbeState | null {
|
|
186
|
-
if (typeof window === "undefined") {
|
|
187
|
-
return null;
|
|
188
|
-
}
|
|
189
|
-
const state = window.__DOCX_REACT_PERF_PROBE__;
|
|
190
|
-
if (!state?.enabled) {
|
|
191
|
-
return null;
|
|
192
|
-
}
|
|
193
|
-
return state;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
function pushSample(state: PerfProbeState, sample: PerfProbeSample): void {
|
|
197
|
-
state.samples ??= [];
|
|
198
|
-
state.samples.push(sample);
|
|
199
|
-
const maxSamples = state.maxSamples ?? 20;
|
|
200
|
-
if (state.samples.length > maxSamples) {
|
|
201
|
-
state.samples.splice(0, state.samples.length - maxSamples);
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
function buildLatestSampleMap(
|
|
206
|
-
samples: PerfProbeSample[],
|
|
207
|
-
): Partial<Record<PerfProbeKind, PerfProbeSample | null>> {
|
|
208
|
-
const latest: Partial<Record<PerfProbeKind, PerfProbeSample | null>> = {};
|
|
209
|
-
for (const sample of [...samples].reverse()) {
|
|
210
|
-
if (latest[sample.kind] === undefined) {
|
|
211
|
-
latest[sample.kind] = sample;
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
return latest;
|
|
215
|
-
}
|
|
1
|
+
export {
|
|
2
|
+
finishPerfProbe,
|
|
3
|
+
getLatestPerfSummary,
|
|
4
|
+
incrementInvalidationCounter,
|
|
5
|
+
PREDICTED_LANE_COUNTERS,
|
|
6
|
+
recordPerfSample,
|
|
7
|
+
resetPerfProbeState,
|
|
8
|
+
startPerfProbe,
|
|
9
|
+
} from "../../api/v3/runtime/perf-probe.ts";
|
|
10
|
+
export type {
|
|
11
|
+
PerfProbeKind,
|
|
12
|
+
PerfProbeSample,
|
|
13
|
+
PerfProbeSummary,
|
|
14
|
+
} from "../../api/v3/runtime/perf-probe.ts";
|
|
@@ -840,3 +840,45 @@ export function buildDecorations(
|
|
|
840
840
|
|
|
841
841
|
return DecorationSet.create(doc, decorations);
|
|
842
842
|
}
|
|
843
|
+
|
|
844
|
+
export interface RuntimeDecorationBuildInput {
|
|
845
|
+
doc: PMNode;
|
|
846
|
+
positionMap: PositionMap;
|
|
847
|
+
commentModel: CommentDecorationModel | undefined;
|
|
848
|
+
revisionModel: RevisionDecorationModel | undefined;
|
|
849
|
+
markupDisplay: MarkupDisplay;
|
|
850
|
+
showTrackedChanges: boolean;
|
|
851
|
+
suggestionsEnabled: boolean;
|
|
852
|
+
workflowScopes: readonly WorkflowScope[] | undefined;
|
|
853
|
+
activeStory: EditorStoryTarget;
|
|
854
|
+
workflowCandidates: readonly WorkflowCandidateRange[] | undefined;
|
|
855
|
+
workflowBlockedReasons: readonly WorkflowBlockedCommandReason[] | undefined;
|
|
856
|
+
workflowLockedZones: readonly WorkflowLockedZone[] | undefined;
|
|
857
|
+
activeWorkflowWorkItemId: string | null | undefined;
|
|
858
|
+
activeWorkflowScopeIds: readonly string[] | undefined;
|
|
859
|
+
workflowMetadata: readonly WorkflowMetadataMarkup[] | undefined;
|
|
860
|
+
revisionDisplayByOffset?: ReadonlyMap<number, RevisionDisplayFlags>;
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
export function buildRuntimeDecorations(
|
|
864
|
+
input: RuntimeDecorationBuildInput,
|
|
865
|
+
): DecorationSet {
|
|
866
|
+
return buildDecorations(
|
|
867
|
+
input.doc,
|
|
868
|
+
input.positionMap,
|
|
869
|
+
input.commentModel,
|
|
870
|
+
input.revisionModel,
|
|
871
|
+
input.markupDisplay,
|
|
872
|
+
input.showTrackedChanges,
|
|
873
|
+
input.suggestionsEnabled,
|
|
874
|
+
input.workflowScopes,
|
|
875
|
+
input.activeStory,
|
|
876
|
+
input.workflowCandidates,
|
|
877
|
+
input.workflowBlockedReasons,
|
|
878
|
+
input.workflowLockedZones,
|
|
879
|
+
input.activeWorkflowWorkItemId,
|
|
880
|
+
input.activeWorkflowScopeIds,
|
|
881
|
+
input.workflowMetadata,
|
|
882
|
+
input.revisionDisplayByOffset,
|
|
883
|
+
);
|
|
884
|
+
}
|