nudge-ui 0.2.1 → 0.2.3

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.
Files changed (258) hide show
  1. package/README.md +164 -46
  2. package/dist/client.mjs +252 -54
  3. package/dist/css/value-semantics/colorSemantics.d.ts +4 -0
  4. package/dist/css/value-semantics/colorSemantics.js +17 -0
  5. package/dist/hosts/astro/astroRuntimeConfig.js +1 -0
  6. package/dist/hosts/astro/clientTransport.js +41 -32
  7. package/dist/hosts/astro/integration.d.ts +2 -2
  8. package/dist/hosts/astro/integration.js +9 -4
  9. package/dist/hosts/astro/markdownIdentity.d.ts +28 -0
  10. package/dist/hosts/astro/markdownIdentity.js +81 -0
  11. package/dist/hosts/environment.d.ts +15 -0
  12. package/dist/hosts/environment.js +16 -0
  13. package/dist/hosts/next/manifest.js +1 -1
  14. package/dist/hosts/next/sidecar.js +12 -2
  15. package/dist/hosts/next/wrapper.d.ts +2 -0
  16. package/dist/hosts/next/wrapper.js +2 -1
  17. package/dist/hosts/projectBridge.d.ts +1 -0
  18. package/dist/hosts/projectBridge.js +1 -0
  19. package/dist/hosts/static/manifest.js +3 -1
  20. package/dist/hosts/static/server.js +4 -0
  21. package/dist/hosts/vite/vite.d.ts +4 -0
  22. package/dist/hosts/vite/vite.js +28 -5
  23. package/dist/inspector/agent/McpConnectionDialog.d.ts +3 -2
  24. package/dist/inspector/agent/McpConnectionDialog.js +23 -22
  25. package/dist/inspector/agent/activity.d.ts +18 -0
  26. package/dist/inspector/agent/activity.js +70 -0
  27. package/dist/inspector/agent/client.d.ts +8 -0
  28. package/dist/inspector/agent/client.js +65 -5
  29. package/dist/inspector/agent/connectionStatus.d.ts +3 -3
  30. package/dist/inspector/agent/connectionStatus.js +9 -2
  31. package/dist/inspector/agent/httpTransport.d.ts +6 -0
  32. package/dist/inspector/agent/httpTransport.js +50 -3
  33. package/dist/inspector/agent/protocol.d.ts +9 -3
  34. package/dist/inspector/agent/protocol.js +1 -1
  35. package/dist/inspector/agent/verification.d.ts +11 -1
  36. package/dist/inspector/agent/verification.js +53 -25
  37. package/dist/inspector/canvas/AgentActivityOverlay.d.ts +13 -0
  38. package/dist/inspector/canvas/AgentActivityOverlay.js +111 -0
  39. package/dist/inspector/canvas/CanvasCard.d.ts +9 -2
  40. package/dist/inspector/canvas/CanvasCard.js +133 -38
  41. package/dist/inspector/canvas/CanvasElementOverlay.js +200 -22
  42. package/dist/inspector/canvas/CanvasToolIcons.d.ts +10 -0
  43. package/dist/inspector/canvas/CanvasToolIcons.js +20 -0
  44. package/dist/inspector/canvas/CanvasToolbar.js +8 -4
  45. package/dist/inspector/canvas/CanvasWorkspace.js +243 -56
  46. package/dist/inspector/canvas/StaleChangeIndicator.js +3 -13
  47. package/dist/inspector/canvas/agentPresentation.d.ts +8 -8
  48. package/dist/inspector/canvas/agentPresentation.js +64 -52
  49. package/dist/inspector/canvas/canvasGestures.d.ts +1 -1
  50. package/dist/inspector/canvas/canvasGestures.js +1 -1
  51. package/dist/inspector/canvas/canvasStore.d.ts +46 -82
  52. package/dist/inspector/canvas/canvasStore.js +251 -284
  53. package/dist/inspector/canvas/frameContent.d.ts +21 -0
  54. package/dist/inspector/canvas/frameContent.js +44 -0
  55. package/dist/inspector/canvas/frameProtocol.d.ts +34 -4
  56. package/dist/inspector/canvas/frameProtocol.js +9 -2
  57. package/dist/inspector/canvas/keyboardShortcuts.d.ts +4 -1
  58. package/dist/inspector/canvas/keyboardShortcuts.js +5 -3
  59. package/dist/inspector/canvas/layout.d.ts +52 -0
  60. package/dist/inspector/canvas/layout.js +106 -0
  61. package/dist/inspector/canvas/linkEligibility.d.ts +0 -5
  62. package/dist/inspector/canvas/linkEligibility.js +0 -29
  63. package/dist/inspector/canvas/projection.d.ts +15 -5
  64. package/dist/inspector/canvas/projection.js +69 -13
  65. package/dist/inspector/canvas/rendererBootstrap.js +45 -4
  66. package/dist/inspector/canvas/rendererElementSelector.d.ts +1 -1
  67. package/dist/inspector/canvas/rendererElementSelector.js +102 -45
  68. package/dist/inspector/canvas/rendererStylesheet.js +2 -2
  69. package/dist/inspector/canvas/resizeHandleScale.js +1 -1
  70. package/dist/inspector/canvas/sessionStore.d.ts +11 -26
  71. package/dist/inspector/canvas/sessionStore.js +43 -183
  72. package/dist/inspector/canvas/staleChangeDetector.js +9 -3
  73. package/dist/inspector/canvas/useCanvasLayoutAnimation.d.ts +5 -0
  74. package/dist/inspector/canvas/useCanvasLayoutAnimation.js +107 -0
  75. package/dist/inspector/canvas/viewStore.d.ts +38 -0
  76. package/dist/inspector/canvas/viewStore.js +104 -0
  77. package/dist/inspector/canvas/wheelPan.d.ts +8 -0
  78. package/dist/inspector/canvas/wheelPan.js +8 -0
  79. package/dist/inspector/changes/changesLog.d.ts +6 -5
  80. package/dist/inspector/changes/changesLog.js +40 -32
  81. package/dist/inspector/changes/draftChanges.d.ts +56 -0
  82. package/dist/inspector/changes/draftChanges.js +300 -0
  83. package/dist/inspector/changes/previewDiagnostics.d.ts +4 -2
  84. package/dist/inspector/changes/previewDiagnostics.js +11 -25
  85. package/dist/inspector/clientManifest.d.ts +3 -1
  86. package/dist/inspector/clientManifest.js +1 -0
  87. package/dist/inspector/comments/CommentsOverlay.d.ts +2 -0
  88. package/dist/inspector/comments/CommentsOverlay.js +250 -0
  89. package/dist/inspector/comments/element.d.ts +6 -0
  90. package/dist/inspector/comments/element.js +47 -0
  91. package/dist/inspector/comments/store.d.ts +29 -0
  92. package/dist/inspector/comments/store.js +121 -0
  93. package/dist/inspector/comments/verification.d.ts +5 -0
  94. package/dist/inspector/comments/verification.js +52 -0
  95. package/dist/inspector/drafts/model.d.ts +35 -0
  96. package/dist/inspector/drafts/model.js +45 -0
  97. package/dist/inspector/drafts/store.d.ts +28 -0
  98. package/dist/inspector/drafts/store.js +231 -0
  99. package/dist/inspector/index.js +26 -35
  100. package/dist/inspector/inline-text/inlineTextEditor.js +7 -0
  101. package/dist/inspector/inspection/useBrowserCssInspection.js +15 -1
  102. package/dist/inspector/iterations/capture.d.ts +2 -0
  103. package/dist/inspector/iterations/capture.js +173 -0
  104. package/dist/inspector/iterations/client.d.ts +7 -0
  105. package/dist/inspector/iterations/client.js +52 -0
  106. package/dist/inspector/iterations/coordinator.d.ts +15 -0
  107. package/dist/inspector/iterations/coordinator.js +130 -0
  108. package/dist/inspector/iterations/prompt.d.ts +3 -0
  109. package/dist/inspector/iterations/prompt.js +26 -0
  110. package/dist/inspector/overlay/DomNavigator.d.ts +10 -0
  111. package/dist/inspector/overlay/DomNavigator.js +46 -0
  112. package/dist/inspector/overlay/InspectorOverlay.js +6 -2
  113. package/dist/inspector/overlay/clickPolicy.d.ts +18 -2
  114. package/dist/inspector/overlay/clickPolicy.js +34 -3
  115. package/dist/inspector/overlay/elementSelector.d.ts +1 -1
  116. package/dist/inspector/overlay/elementSelector.js +18 -7
  117. package/dist/inspector/overlay/interactionStyles.js +3 -1
  118. package/dist/inspector/overlay/spacingGestures.d.ts +15 -3
  119. package/dist/inspector/overlay/spacingGestures.js +88 -13
  120. package/dist/inspector/projection/{workspaceProjection.d.ts → draftProjection.d.ts} +6 -6
  121. package/dist/inspector/projection/{workspaceProjection.js → draftProjection.js} +4 -4
  122. package/dist/inspector/projection/renderedInstance.d.ts +2 -1
  123. package/dist/inspector/projection/renderedInstance.js +9 -5
  124. package/dist/inspector/projection/structuralProjection.d.ts +2 -1
  125. package/dist/inspector/projection/structuralProjection.js +19 -15
  126. package/dist/inspector/projection/textProjection.d.ts +2 -1
  127. package/dist/inspector/projection/textProjection.js +8 -4
  128. package/dist/inspector/prompt/PromptSettingsDialog.js +1 -5
  129. package/dist/inspector/prompt/clipboardHandoff.d.ts +10 -18
  130. package/dist/inspector/prompt/clipboardHandoff.js +92 -143
  131. package/dist/inspector/prompt/generatePrompt.d.ts +4 -1
  132. package/dist/inspector/prompt/generatePrompt.js +17 -16
  133. package/dist/inspector/runtime/runtimeConfig.d.ts +10 -1
  134. package/dist/inspector/runtime/runtimeConfig.js +24 -0
  135. package/dist/inspector/selection/hierarchy.d.ts +6 -0
  136. package/dist/inspector/selection/hierarchy.js +8 -0
  137. package/dist/inspector/settings/SettingsDialog.d.ts +1 -1
  138. package/dist/inspector/settings/SettingsDialog.js +22 -9
  139. package/dist/inspector/shell/AgentStatusButton.d.ts +11 -0
  140. package/dist/inspector/shell/AgentStatusButton.js +36 -0
  141. package/dist/inspector/shell/AppShell.js +4 -2
  142. package/dist/inspector/shell/ChangesLog.js +47 -27
  143. package/dist/inspector/shell/CopyPromptButton.js +146 -90
  144. package/dist/inspector/shell/EmptyState.js +9 -8
  145. package/dist/inspector/shell/InspectorShell.js +14 -25
  146. package/dist/inspector/shell/PeekOriginalButton.js +24 -23
  147. package/dist/inspector/shell/originalPreview.js +5 -5
  148. package/dist/inspector/shell/shortcuts.d.ts +3 -0
  149. package/dist/inspector/shell/shortcuts.js +11 -0
  150. package/dist/inspector/sketch/SketchEditor.js +14 -14
  151. package/dist/inspector/sketch/SketchEntryButton.js +1 -1
  152. package/dist/inspector/sketch/SketchFrameOverlay.d.ts +3 -1
  153. package/dist/inspector/sketch/SketchFrameOverlay.js +11 -8
  154. package/dist/inspector/sketch/SketchLayersPanel.js +13 -5
  155. package/dist/inspector/sketch/SketchOverlay.js +7 -7
  156. package/dist/inspector/sketch/SketchWorkspace.js +18 -12
  157. package/dist/inspector/sketch/interaction.d.ts +1 -0
  158. package/dist/inspector/sketch/interaction.js +8 -4
  159. package/dist/inspector/sketch/model.d.ts +5 -0
  160. package/dist/inspector/sketch/model.js +6 -2
  161. package/dist/inspector/sketch/raster.d.ts +1 -2
  162. package/dist/inspector/sketch/raster.js +68 -4
  163. package/dist/inspector/sketch/store.js +48 -23
  164. package/dist/inspector/styleEditors/BackgroundEditor.d.ts +4 -0
  165. package/dist/inspector/styleEditors/BackgroundEditor.js +195 -0
  166. package/dist/inspector/styleEditors/BorderEditor.js +49 -78
  167. package/dist/inspector/styleEditors/BorderRadiusEditor.js +6 -1
  168. package/dist/inspector/styleEditors/BoxShadowEditor.d.ts +1 -2
  169. package/dist/inspector/styleEditors/BoxShadowEditor.js +132 -4
  170. package/dist/inspector/styleEditors/ColorPicker.d.ts +5 -1
  171. package/dist/inspector/styleEditors/ColorPicker.js +10 -4
  172. package/dist/inspector/styleEditors/GapField.js +3 -5
  173. package/dist/inspector/styleEditors/GridChildSection.d.ts +1 -1
  174. package/dist/inspector/styleEditors/GridChildSection.js +18 -9
  175. package/dist/inspector/styleEditors/GridPicker.d.ts +1 -1
  176. package/dist/inspector/styleEditors/GridPicker.js +8 -2
  177. package/dist/inspector/styleEditors/GridSection.js +1 -1
  178. package/dist/inspector/styleEditors/GridValueField.js +19 -14
  179. package/dist/inspector/styleEditors/ImageBackgroundEditor.d.ts +18 -0
  180. package/dist/inspector/styleEditors/ImageBackgroundEditor.js +118 -0
  181. package/dist/inspector/styleEditors/LayoutBlockedIndicator.d.ts +2 -2
  182. package/dist/inspector/styleEditors/LayoutBlockedIndicator.js +3 -3
  183. package/dist/inspector/styleEditors/LayoutComboField.js +6 -4
  184. package/dist/inspector/styleEditors/LayoutDropdown.js +6 -3
  185. package/dist/inspector/styleEditors/LayoutSection.js +32 -11
  186. package/dist/inspector/styleEditors/SpacingBox.js +16 -9
  187. package/dist/inspector/styleEditors/Typography.js +11 -3
  188. package/dist/inspector/styleEditors/backgroundLayers.d.ts +24 -0
  189. package/dist/inspector/styleEditors/backgroundLayers.js +51 -0
  190. package/dist/inspector/styleEditors/gradientValue.d.ts +17 -0
  191. package/dist/inspector/styleEditors/gradientValue.js +114 -0
  192. package/dist/inspector/styleEditors/inlineAuthored.d.ts +10 -0
  193. package/dist/inspector/styleEditors/inlineAuthored.js +114 -0
  194. package/dist/inspector/styleEditors/layoutValue.d.ts +0 -8
  195. package/dist/inspector/styleEditors/layoutValue.js +0 -42
  196. package/dist/inspector/styleEditors/nudgeValue.d.ts +4 -4
  197. package/dist/inspector/styleEditors/nudgeValue.js +41 -11
  198. package/dist/inspector/tokens/TokenField.d.ts +7 -0
  199. package/dist/inspector/tokens/TokenField.js +49 -22
  200. package/dist/inspector/tokens/TokenLabel.js +5 -14
  201. package/dist/inspector/tokens/TokensPanel.js +2 -1
  202. package/dist/inspector/tokens/dragPointerLock.d.ts +8 -0
  203. package/dist/inspector/tokens/dragPointerLock.js +70 -0
  204. package/dist/inspector/tokens/editActions.d.ts +1 -1
  205. package/dist/inspector/tokens/editActions.js +1 -1
  206. package/dist/inspector/ui/AtRuleContext.js +4 -6
  207. package/dist/inspector/ui/Button.d.ts +6 -2
  208. package/dist/inspector/ui/Button.js +4 -3
  209. package/dist/inspector/ui/ControlSurface.d.ts +2 -2
  210. package/dist/inspector/ui/ControlSurface.js +4 -3
  211. package/dist/inspector/ui/Disclosure.d.ts +22 -0
  212. package/dist/inspector/ui/Disclosure.js +13 -0
  213. package/dist/inspector/ui/InlineStyleWarning.d.ts +11 -0
  214. package/dist/inspector/ui/InlineStyleWarning.js +13 -0
  215. package/dist/inspector/ui/InspectorPopover.d.ts +2 -1
  216. package/dist/inspector/ui/InspectorPopover.js +4 -5
  217. package/dist/inspector/ui/PopoverListbox.d.ts +2 -1
  218. package/dist/inspector/ui/PopoverListbox.js +8 -7
  219. package/dist/inspector/ui/SegmentedControl.d.ts +2 -1
  220. package/dist/inspector/ui/SegmentedControl.js +2 -2
  221. package/dist/inspector/ui/Select.d.ts +6 -1
  222. package/dist/inspector/ui/Select.js +7 -11
  223. package/dist/inspector/ui/SideValuesField.js +1 -1
  224. package/dist/inspector/ui/Tooltip.d.ts +26 -0
  225. package/dist/inspector/ui/Tooltip.js +32 -0
  226. package/dist/inspector/ui/classNames.d.ts +2 -0
  227. package/dist/inspector/ui/classNames.js +4 -0
  228. package/dist/inspector/ui/customCursors.d.ts +23 -0
  229. package/dist/inspector/ui/customCursors.js +122 -0
  230. package/dist/inspector/ui/dragCursor.d.ts +6 -0
  231. package/dist/inspector/ui/dragCursor.js +13 -0
  232. package/dist/inspector/ui/portalContainer.d.ts +2 -0
  233. package/dist/inspector/ui/portalContainer.js +6 -0
  234. package/dist/inspector/ui/styles.js +34 -24
  235. package/dist/inspector/workspace/commands.d.ts +9 -0
  236. package/dist/inspector/workspace/commands.js +82 -0
  237. package/dist/inspector/workspace/controller.d.ts +4 -0
  238. package/dist/inspector/workspace/controller.js +66 -0
  239. package/dist/inspector/workspace/handoff.d.ts +42 -0
  240. package/dist/inspector/workspace/handoff.js +115 -0
  241. package/dist/inspector/workspace/timeline.d.ts +30 -0
  242. package/dist/inspector/workspace/timeline.js +108 -0
  243. package/dist/internal/agent-protocol.d.ts +19 -2
  244. package/dist/internal/agent-protocol.js +13 -0
  245. package/dist/nudge-ui.mjs +560 -299
  246. package/dist/project/artifacts.d.ts +13 -0
  247. package/dist/project/artifacts.js +253 -0
  248. package/dist/transport/artifacts.d.ts +8 -0
  249. package/dist/transport/artifacts.js +9 -0
  250. package/dist/transport/editor.d.ts +20 -1
  251. package/dist/transport/editor.js +44 -11
  252. package/dist/transport/routes.d.ts +6 -1
  253. package/dist/transport/routes.js +6 -1
  254. package/package.json +6 -2
  255. package/dist/inspector/changes/workspaceChanges.d.ts +0 -43
  256. package/dist/inspector/changes/workspaceChanges.js +0 -239
  257. package/dist/inspector/shell/DomNavigation.d.ts +0 -8
  258. package/dist/inspector/shell/DomNavigation.js +0 -30
@@ -1,6 +1,6 @@
1
1
  import type { StyleRule } from "../projection/managedStylesheet.js";
2
2
  import type { ChangeRecord } from "./types.js";
3
- import { type CommitResult } from "./workspaceChanges.js";
3
+ import { type CommitResult } from "./draftChanges.js";
4
4
  import type { StructuralChange } from "./structuralTypes.js";
5
5
  export { isComponentChange, isElementChange, isTextContentChange, isTextContentChangeValue, isPreviewableChange, isTokenChange, } from "./types.js";
6
6
  export type { ChangeRecord, ComponentChangeRecord, ElementChangeRecord, PreviewableChangeRecord, TextContentChangeRecord, TokenChangeRecord, RuntimeElementEvidence, } from "./types.js";
@@ -25,7 +25,7 @@ export declare function revertChange(change: ChangeRecord): void;
25
25
  */
26
26
  export declare function reconcileVerifiedChanges(verifiedKeys: ReadonlySet<string>): number;
27
27
  /** Atomically reconciles ordinary and structural intent from one agent handoff. */
28
- export declare function reconcileVerifiedWorkspaceChanges(verifiedKeys: ReadonlySet<string>, verifiedStructuralIds: ReadonlySet<string>): number;
28
+ export declare function reconcileVerifiedDraftChanges(verifiedKeys: ReadonlySet<string>, verifiedStructuralIds: ReadonlySet<string>): number;
29
29
  export declare function discardChangesForSelector(selector: string): void;
30
30
  /** Relink removes every CSS declaration owned by one durable rendered target. */
31
31
  export declare function discardChangesForInstanceOverride(overrideId: string): void;
@@ -38,9 +38,10 @@ export declare function redo(): boolean;
38
38
  */
39
39
  export declare function restoreChangeRecords(incoming: ChangeRecord[]): void;
40
40
  /** Restores every canonical workspace intent as one subscriber-visible snapshot. */
41
- export declare function loadWorkspaceChanges(incoming: readonly ChangeRecord[], structuralChanges: readonly StructuralChange[]): void;
42
- /** Clears all workspace intent and its unified undo/redo timeline. */
43
- export declare function clearWorkspace(): void;
41
+ export declare function loadActiveDraftChanges(incoming: readonly ChangeRecord[], structuralChanges: readonly StructuralChange[], preserveHistory?: boolean): void;
42
+ /** Clears the active draft and its edit steps, preserving other session history. */
43
+ export declare function clearActiveDraft(): void;
44
44
  export declare function getChangesList(): ChangeRecord[];
45
45
  export { subscribe as subscribeChanges, getChangesSnapshot as getChanges };
46
46
  export declare function useChanges(): ChangeRecord[];
47
+ export declare function refreshDraftPreview(): void;
@@ -1,13 +1,14 @@
1
+ import { canEditDraft } from "./draftChanges.js";
1
2
  import { useSyncExternalStore } from "react";
2
3
  import { getSelectedElement } from "../selection/selectionStore.js";
3
4
  import { changeKey, } from "./model.js";
4
5
  import { buildManagedStyleRules, verifyManagedStyleProjection, } from "./managedStyleProjection.js";
5
6
  import { isPreviewableChange } from "./types.js";
6
7
  import { cancelInlineTextForClear } from "../inline-text/inlineTextLifecycle.js";
7
- import { workspaceChangeStore, } from "./workspaceChanges.js";
8
+ import { draftChangeStore, } from "./draftChanges.js";
8
9
  import { beginPreviewAttempt, clearPreviewDiagnostics, getHostPreviewDocument, publishPreviewDiagnostic, } from "./previewDiagnostics.js";
9
10
  import { clearStructuralProjectionReports, pruneStructuralProjectionReports } from "../projection/structuralProjection.js";
10
- import { applyHostWorkspaceProjection, compileWorkspaceProjection, } from "../projection/workspaceProjection.js";
11
+ import { applyHostDraftProjection, compileDraftProjection, } from "../projection/draftProjection.js";
11
12
  import { isEditorShellDocument } from "../runtime/editorShell.js";
12
13
  import { isOriginalPreviewActive, subscribeOriginalPreview, } from "../shell/originalPreview.js";
13
14
  export { isComponentChange, isElementChange, isTextContentChange, isTextContentChangeValue, isPreviewableChange, isTokenChange, } from "./types.js";
@@ -19,12 +20,12 @@ export { isComponentChange, isElementChange, isTextContentChange, isTextContentC
19
20
  let pendingVerificationTargets = new Map();
20
21
  let verificationHandle = null;
21
22
  function subscribe(cb) {
22
- return workspaceChangeStore.subscribe(cb);
23
+ return draftChangeStore.subscribe(cb);
23
24
  }
24
25
  function getChangesSnapshot() {
25
26
  // SAFETY: The public change model is the concrete record union stored by
26
27
  // the workspace snapshot; this module preserves the mutable array facade.
27
- return workspaceChangeStore.getSnapshot().changes;
28
+ return draftChangeStore.getSnapshot().changes;
28
29
  }
29
30
  export function getPendingRules() {
30
31
  return buildManagedStyleRules(getChangesSnapshot());
@@ -36,7 +37,7 @@ function reapply(workspace) {
36
37
  if (isOriginalPreviewActive())
37
38
  return;
38
39
  if (!isEditorShellDocument())
39
- applyHostWorkspaceProjection(compileWorkspaceProjection(workspace));
40
+ applyHostDraftProjection(compileDraftProjection(workspace));
40
41
  }
41
42
  function flushVerification() {
42
43
  verificationHandle = null;
@@ -53,7 +54,7 @@ function flushVerification() {
53
54
  if (isEditorShellDocument())
54
55
  return;
55
56
  const current = getChangesSnapshot();
56
- const attempt = beginPreviewAttempt(getHostPreviewDocument(), workspaceChangeStore.getSnapshot().revision);
57
+ const attempt = beginPreviewAttempt(getHostPreviewDocument(), draftChangeStore.getSnapshot().revision);
57
58
  if (!attempt)
58
59
  return;
59
60
  for (let i = 0; i < current.length; i++) {
@@ -125,10 +126,10 @@ subscribeOriginalPreview(() => {
125
126
  });
126
127
  /** Append records and report whether canonical workspace state changed. */
127
128
  export function appendChanges(incoming, options = {}) {
128
- const result = workspaceChangeStore.commitChangeRecords(incoming);
129
+ const result = draftChangeStore.commitChangeRecords(incoming);
129
130
  if (result !== "applied")
130
131
  return result;
131
- reapply(workspaceChangeStore.getSnapshot());
132
+ reapply(draftChangeStore.getSnapshot());
132
133
  // Re-verify the full surviving set so earlier diagnostics are refreshed at
133
134
  // the new revision instead of being orphaned at the old one.
134
135
  markForVerification(getChangesSnapshot().map(changeKey), options.verificationTargets);
@@ -138,9 +139,9 @@ export function appendChange(change) {
138
139
  return appendChanges([change]);
139
140
  }
140
141
  export function revertChange(change) {
141
- if (!workspaceChangeStore.revertChangeRecord(change))
142
+ if (!draftChangeStore.revertChangeRecord(change))
142
143
  return;
143
- reapply(workspaceChangeStore.getSnapshot());
144
+ reapply(draftChangeStore.getSnapshot());
144
145
  markForVerification(getChangesSnapshot().map(changeKey));
145
146
  }
146
147
  /**
@@ -152,46 +153,46 @@ export function revertChange(change) {
152
153
  * preserving newer, unsent edits and their remaining undo history.
153
154
  */
154
155
  export function reconcileVerifiedChanges(verifiedKeys) {
155
- const removed = reconcileVerifiedWorkspaceChanges(verifiedKeys, new Set());
156
+ const removed = reconcileVerifiedDraftChanges(verifiedKeys, new Set());
156
157
  if (removed === 0)
157
158
  return 0;
158
159
  return removed;
159
160
  }
160
161
  /** Atomically reconciles ordinary and structural intent from one agent handoff. */
161
- export function reconcileVerifiedWorkspaceChanges(verifiedKeys, verifiedStructuralIds) {
162
- const removed = workspaceChangeStore.reconcileWorkspaceChanges(verifiedKeys, verifiedStructuralIds);
162
+ export function reconcileVerifiedDraftChanges(verifiedKeys, verifiedStructuralIds) {
163
+ const removed = draftChangeStore.reconcileActiveDraftChanges(verifiedKeys, verifiedStructuralIds);
163
164
  if (removed === 0)
164
165
  return 0;
165
- reapply(workspaceChangeStore.getSnapshot());
166
+ reapply(draftChangeStore.getSnapshot());
166
167
  pruneStructuralProjectionReports(verifiedStructuralIds);
167
168
  markForVerification(getChangesSnapshot().map(changeKey));
168
169
  return removed;
169
170
  }
170
171
  export function discardChangesForSelector(selector) {
171
- if (!workspaceChangeStore.discardChangeRecords({ kind: "selector", selector }))
172
+ if (!draftChangeStore.discardChangeRecords({ kind: "selector", selector }))
172
173
  return;
173
- reapply(workspaceChangeStore.getSnapshot());
174
+ reapply(draftChangeStore.getSnapshot());
174
175
  markForVerification(getChangesSnapshot().map(changeKey));
175
176
  }
176
177
  /** Relink removes every CSS declaration owned by one durable rendered target. */
177
178
  export function discardChangesForInstanceOverride(overrideId) {
178
- if (!workspaceChangeStore.discardChangeRecords({ kind: "instance-override", id: overrideId }))
179
+ if (!draftChangeStore.discardChangeRecords({ kind: "instance-override", id: overrideId }))
179
180
  return;
180
- reapply(workspaceChangeStore.getSnapshot());
181
+ reapply(draftChangeStore.getSnapshot());
181
182
  markForVerification(getChangesSnapshot().map(changeKey));
182
183
  }
183
184
  export function undo() {
184
- const undone = workspaceChangeStore.undoWorkspaceChange();
185
+ const undone = draftChangeStore.undoChange();
185
186
  if (undone)
186
- reapply(workspaceChangeStore.getSnapshot());
187
+ reapply(draftChangeStore.getSnapshot());
187
188
  if (undone)
188
189
  markForVerification(getChangesSnapshot().map(changeKey));
189
190
  return undone;
190
191
  }
191
192
  export function redo() {
192
- const redone = workspaceChangeStore.redoWorkspaceChange();
193
+ const redone = draftChangeStore.redoChange();
193
194
  if (redone)
194
- reapply(workspaceChangeStore.getSnapshot());
195
+ reapply(draftChangeStore.getSnapshot());
195
196
  if (redone)
196
197
  markForVerification(getChangesSnapshot().map(changeKey));
197
198
  return redone;
@@ -207,28 +208,30 @@ export function restoreChangeRecords(incoming) {
207
208
  // inspect a newly loaded record with its old selection context.
208
209
  pendingVerificationTargets.clear();
209
210
  clearPreviewDiagnostics();
210
- const workspace = workspaceChangeStore.getSnapshot();
211
- workspaceChangeStore.restoreWorkspaceChanges({ changes: incoming, structuralChanges: workspace.structuralChanges });
212
- reapply(workspaceChangeStore.getSnapshot());
211
+ const workspace = draftChangeStore.getSnapshot();
212
+ draftChangeStore.restoreActiveDraftChanges({ changes: incoming, structuralChanges: workspace.structuralChanges });
213
+ reapply(draftChangeStore.getSnapshot());
213
214
  }
214
215
  /** Restores every canonical workspace intent as one subscriber-visible snapshot. */
215
- export function loadWorkspaceChanges(incoming, structuralChanges) {
216
+ export function loadActiveDraftChanges(incoming, structuralChanges, preserveHistory = false) {
216
217
  pendingVerificationTargets.clear();
217
218
  clearPreviewDiagnostics();
218
219
  clearStructuralProjectionReports();
219
- workspaceChangeStore.restoreWorkspaceChanges({ changes: incoming, structuralChanges });
220
- reapply(workspaceChangeStore.getSnapshot());
220
+ draftChangeStore.restoreActiveDraftChanges({ changes: incoming, structuralChanges }, preserveHistory);
221
+ reapply(draftChangeStore.getSnapshot());
221
222
  }
222
- /** Clears all workspace intent and its unified undo/redo timeline. */
223
- export function clearWorkspace() {
223
+ /** Clears the active draft and its edit steps, preserving other session history. */
224
+ export function clearActiveDraft() {
225
+ if (!canEditDraft())
226
+ return;
224
227
  // A pending blur/composition timer must not be able to append a draft after
225
228
  // the canonical set has been cleared.
226
229
  cancelInlineTextForClear();
227
230
  pendingVerificationTargets.clear();
228
231
  clearPreviewDiagnostics();
229
232
  clearStructuralProjectionReports();
230
- workspaceChangeStore.clearWorkspaceChanges();
231
- reapply(workspaceChangeStore.getSnapshot());
233
+ draftChangeStore.clearActiveDraftChanges();
234
+ reapply(draftChangeStore.getSnapshot());
232
235
  }
233
236
  export function getChangesList() {
234
237
  return [...getChangesSnapshot()];
@@ -237,3 +240,8 @@ export { subscribe as subscribeChanges, getChangesSnapshot as getChanges };
237
240
  export function useChanges() {
238
241
  return useSyncExternalStore(subscribe, getChangesSnapshot, getChangesSnapshot);
239
242
  }
243
+ export function refreshDraftPreview() {
244
+ pendingVerificationTargets.clear();
245
+ reapply(draftChangeStore.getSnapshot());
246
+ markForVerification(getChangesSnapshot().map(changeKey));
247
+ }
@@ -0,0 +1,56 @@
1
+ import { type ChangeRecord } from "./types.js";
2
+ import type { StructuralChange } from "./structuralTypes.js";
3
+ export { recordCanvasChange, discardCanvasHistory, discardDraftHistory, clearSessionUndoHistory, createChangeHistoryGroup, } from "../workspace/timeline.js";
4
+ export interface DraftContents {
5
+ readonly changes: readonly ChangeRecord[];
6
+ readonly structuralChanges: readonly StructuralChange[];
7
+ }
8
+ export interface DraftChangesSnapshot extends DraftContents {
9
+ readonly draftId: string;
10
+ readonly revision: number;
11
+ readonly canUndo: boolean;
12
+ readonly canRedo: boolean;
13
+ }
14
+ export declare function lockDraft(id: string): () => void;
15
+ export declare function isDraftLocked(id?: string): boolean;
16
+ export declare function canEditDraft(id?: string): boolean;
17
+ export declare function setActiveDraft(id: string, activate?: () => void): void;
18
+ export type DraftProjector = (snapshot: DraftChangesSnapshot) => void;
19
+ export type CommitResult = "applied" | "unchanged" | "blocked";
20
+ export interface DraftChangeStore {
21
+ getSnapshot(): DraftChangesSnapshot;
22
+ subscribe(listener: () => void): () => void;
23
+ commitChangeRecords(incoming: readonly ChangeRecord[]): CommitResult;
24
+ revertChangeRecord(change: ChangeRecord): boolean;
25
+ discardChangeRecords(target: {
26
+ kind: "selector";
27
+ selector: string;
28
+ } | {
29
+ kind: "instance-override";
30
+ id: string;
31
+ }): boolean;
32
+ commitStructuralChange(change: StructuralChange): boolean;
33
+ revertStructuralChangeRecord(changeId: string): boolean;
34
+ reconcileActiveDraftChanges(verifiedKeys: ReadonlySet<string>, verifiedStructuralIds: ReadonlySet<string>): number;
35
+ undoChange(): boolean;
36
+ redoChange(): boolean;
37
+ restoreActiveDraftChanges(next: DraftContents, preserveHistory?: boolean): void;
38
+ clearActiveDraftChanges(): void;
39
+ }
40
+ export declare function subscribeDraftChanges(listener: (draftId: string) => void): () => void;
41
+ export declare function getDraftChanges(id: string): DraftChangesSnapshot;
42
+ export declare function restoreDraftChanges(id: string, next: DraftContents, revision?: number): void;
43
+ export declare function reconcileDraftChanges(id: string, verifiedKeys: ReadonlySet<string>, verifiedStructuralIds: ReadonlySet<string>): number;
44
+ export declare function clearDraftChanges(id: string, expectedRevision?: number): boolean;
45
+ export declare function listDraftIds(): readonly string[];
46
+ /** Drops a draft whose content no longer exists, such as a deleted iteration. */
47
+ export declare function forgetDraft(id: string): void;
48
+ export declare const draftChangeStore: DraftChangeStore;
49
+ export declare function getActiveDraftChanges(): DraftChangesSnapshot;
50
+ export declare function subscribeActiveDraftChanges(listener: () => void): () => void;
51
+ export declare function commitChangeRecords(incoming: readonly ChangeRecord[], project: DraftProjector): CommitResult;
52
+ export declare function commitStructuralChange(change: StructuralChange, project: DraftProjector): boolean;
53
+ export declare function undoChange(project: DraftProjector): boolean;
54
+ export declare function redoChange(project: DraftProjector): boolean;
55
+ export declare function restoreActiveDraftChanges(next: DraftContents, project: DraftProjector): void;
56
+ export declare function resetDraftChanges(): void;
@@ -0,0 +1,300 @@
1
+ import { canWriteWorkspace } from "../canvas/workspaceLease.js";
2
+ import { applicationTarget, targetKey } from "../drafts/model.js";
3
+ import { changeKey, mergeChange, sameEffectiveChanges, selectorForChange } from "./model.js";
4
+ import { isElementChange } from "./types.js";
5
+ import { recordEdit, replayTimeline, pruneDraftHistory, timelineStatus, subscribeTimeline, clearSessionUndoHistory, discardDraftHistory, } from "../workspace/timeline.js";
6
+ export { recordCanvasChange, discardCanvasHistory, discardDraftHistory, clearSessionUndoHistory, createChangeHistoryGroup, } from "../workspace/timeline.js";
7
+ const drafts = new Map();
8
+ const lockedDrafts = new Set();
9
+ const listeners = new Set();
10
+ const draftListeners = new Set();
11
+ /** Until a frame is activated, edits belong to the current page's draft. */
12
+ let activeDraftId = null;
13
+ function activeId() {
14
+ return activeDraftId ??= targetKey(applicationTarget());
15
+ }
16
+ function draftState(id = activeId()) {
17
+ let draft = drafts.get(id);
18
+ if (!draft) {
19
+ draft = { id, revision: 0, contents: { changes: [], structuralChanges: [] } };
20
+ drafts.set(id, draft);
21
+ }
22
+ return draft;
23
+ }
24
+ export function lockDraft(id) {
25
+ if (lockedDrafts.has(id))
26
+ throw new Error("This iteration is already saving.");
27
+ lockedDrafts.add(id);
28
+ return () => { lockedDrafts.delete(id); };
29
+ }
30
+ export function isDraftLocked(id) {
31
+ return id === undefined ? lockedDrafts.size > 0 : lockedDrafts.has(id);
32
+ }
33
+ export function canEditDraft(id = activeId()) {
34
+ return canWriteWorkspace() && !lockedDrafts.has(id);
35
+ }
36
+ export function setActiveDraft(id, activate) {
37
+ draftState(id).activate = activate;
38
+ if (activeId() === id)
39
+ return;
40
+ activeDraftId = id;
41
+ publishSelection();
42
+ }
43
+ let snapshot = null;
44
+ function cloneContents(value) {
45
+ return {
46
+ changes: value.changes.map((change) => cloneValue(change)),
47
+ structuralChanges: value.structuralChanges.map((change) => cloneValue(change)),
48
+ };
49
+ }
50
+ function cloneValue(value, key) {
51
+ if (key === "oldToken" || key === "newToken")
52
+ return value;
53
+ if (Array.isArray(value))
54
+ return value.map((item) => cloneValue(item));
55
+ if (value !== null && typeof value === "object") {
56
+ const clone = {};
57
+ for (const [key, child] of Object.entries(value)) {
58
+ clone[key] = cloneValue(child, key);
59
+ }
60
+ return clone;
61
+ }
62
+ return value;
63
+ }
64
+ function freezeValue(value, key) {
65
+ if (key === "oldToken" || key === "newToken")
66
+ return value;
67
+ if (value !== null && typeof value === "object" && !Object.isFrozen(value)) {
68
+ for (const [childKey, child] of Object.entries(value))
69
+ freezeValue(child, childKey);
70
+ Object.freeze(value);
71
+ }
72
+ return value;
73
+ }
74
+ function createSnapshot() {
75
+ const draft = draftState();
76
+ return Object.freeze({ draftId: draft.id, revision: draft.revision, ...draft.contents, ...timelineStatus() });
77
+ }
78
+ let notificationDepth = 0;
79
+ let notificationPending = false;
80
+ function mutate(operation) {
81
+ notificationDepth += 1;
82
+ try {
83
+ return operation();
84
+ }
85
+ finally {
86
+ notificationDepth -= 1;
87
+ if (notificationDepth === 0 && notificationPending) {
88
+ notificationPending = false;
89
+ publishSelection();
90
+ }
91
+ }
92
+ }
93
+ function publishSelection() {
94
+ if (notificationDepth > 0) {
95
+ notificationPending = true;
96
+ return;
97
+ }
98
+ snapshot = null;
99
+ for (const listener of listeners)
100
+ listener();
101
+ }
102
+ subscribeTimeline(publishSelection);
103
+ function replaceContents(draft, next) {
104
+ draft.contents = freezeValue(cloneContents(next));
105
+ draft.revision += 1;
106
+ for (const listener of draftListeners)
107
+ listener(draft.id);
108
+ publishSelection();
109
+ }
110
+ export function subscribeDraftChanges(listener) {
111
+ draftListeners.add(listener);
112
+ return () => draftListeners.delete(listener);
113
+ }
114
+ export function getDraftChanges(id) {
115
+ const draft = drafts.get(id);
116
+ return {
117
+ draftId: id,
118
+ revision: draft?.revision ?? 0,
119
+ changes: draft?.contents.changes ?? [],
120
+ structuralChanges: draft?.contents.structuralChanges ?? [],
121
+ ...timelineStatus(),
122
+ };
123
+ }
124
+ export function restoreDraftChanges(id, next, revision = 1) {
125
+ const draft = draftState(id);
126
+ draft.contents = freezeValue(cloneContents(next));
127
+ draft.revision = revision;
128
+ publishSelection();
129
+ }
130
+ function commit(next) {
131
+ if (!canEditDraft())
132
+ return false;
133
+ const draft = draftState();
134
+ const before = draft.contents;
135
+ mutate(() => {
136
+ replaceContents(draft, next);
137
+ recordEdit({ draftId: draft.id, activate: draft.activate, before, after: draft.contents }, sameDraftContents);
138
+ });
139
+ return true;
140
+ }
141
+ function getSnapshot() { return snapshot ??= createSnapshot(); }
142
+ function subscribe(listener) {
143
+ listeners.add(listener);
144
+ return () => listeners.delete(listener);
145
+ }
146
+ function commitChangeRecordsImpl(incoming) {
147
+ if (incoming.length === 0)
148
+ return "unchanged";
149
+ const contents = draftState().contents;
150
+ const changes = incoming.reduce((current, change) => mergeChange(current, change), [...contents.changes]);
151
+ if (sameEffectiveChanges([...contents.changes], changes))
152
+ return "unchanged";
153
+ return commit({ ...contents, changes }) ? "applied" : "blocked";
154
+ }
155
+ function revertChangeRecordImpl(change) {
156
+ const contents = draftState().contents;
157
+ const changes = contents.changes.filter((candidate) => changeKey(candidate) !== changeKey(change));
158
+ return changes.length !== contents.changes.length && commit({ ...contents, changes });
159
+ }
160
+ function discardChangeRecordsImpl(target) {
161
+ const contents = draftState().contents;
162
+ const changes = contents.changes.filter((change) => target.kind === "selector"
163
+ ? selectorForChange(change) !== target.selector
164
+ : !isElementChange(change) || change.instanceOverride?.id !== target.id);
165
+ return changes.length !== contents.changes.length && commit({ ...contents, changes });
166
+ }
167
+ function commitStructuralChangeImpl(change) {
168
+ const contents = draftState().contents;
169
+ if (contents.structuralChanges.some((candidate) => candidate.id === change.id))
170
+ return false;
171
+ return commit({ ...contents, structuralChanges: [...contents.structuralChanges, change] });
172
+ }
173
+ function revertStructuralChangeRecordImpl(changeId) {
174
+ const contents = draftState().contents;
175
+ const structuralChanges = contents.structuralChanges.filter((change) => change.id !== changeId);
176
+ return structuralChanges.length !== contents.structuralChanges.length && commit({ ...contents, structuralChanges });
177
+ }
178
+ export function reconcileDraftChanges(id, verifiedKeys, verifiedStructuralIds) {
179
+ if (!canEditDraft(id))
180
+ return 0;
181
+ const draft = draftState(id);
182
+ const retain = (value) => ({
183
+ changes: value.changes.filter((change) => !verifiedKeys.has(changeKey(change))),
184
+ structuralChanges: value.structuralChanges.filter((change) => !verifiedStructuralIds.has(change.id)),
185
+ });
186
+ const next = retain(draft.contents);
187
+ const removed = draft.contents.changes.length - next.changes.length + draft.contents.structuralChanges.length - next.structuralChanges.length;
188
+ if (removed === 0)
189
+ return 0;
190
+ mutate(() => {
191
+ replaceContents(draft, next);
192
+ pruneDraftHistory(id, retain, sameDraftContents);
193
+ });
194
+ return removed;
195
+ }
196
+ function reconcileActiveDraftChangesImpl(keys, ids) {
197
+ return reconcileDraftChanges(activeId(), keys, ids);
198
+ }
199
+ function sameDraftContents(left, right) {
200
+ return sameEffectiveChanges([...left.changes], [...right.changes])
201
+ && JSON.stringify(left.structuralChanges) === JSON.stringify(right.structuralChanges);
202
+ }
203
+ function replay(direction) {
204
+ if (isDraftLocked() || !canWriteWorkspace())
205
+ return false;
206
+ return mutate(() => replayTimeline(direction, (entry, next) => {
207
+ replaceContents(draftState(entry.draftId), next);
208
+ entry.activate?.();
209
+ if (!entry.activate)
210
+ setActiveDraft(entry.draftId);
211
+ }));
212
+ }
213
+ function restoreActiveDraftChangesImpl(next, preserveHistory = false) {
214
+ mutate(() => {
215
+ replaceContents(draftState(), next);
216
+ if (!preserveHistory)
217
+ clearSessionUndoHistory();
218
+ });
219
+ }
220
+ export function clearDraftChanges(id, expectedRevision) {
221
+ const draft = draftState(id);
222
+ if (!canEditDraft(id) || (expectedRevision !== undefined && draft.revision !== expectedRevision))
223
+ return false;
224
+ mutate(() => {
225
+ replaceContents(draft, { changes: [], structuralChanges: [] });
226
+ discardDraftHistory(id);
227
+ });
228
+ return true;
229
+ }
230
+ export function listDraftIds() {
231
+ return [...drafts.keys()];
232
+ }
233
+ /** Drops a draft whose content no longer exists, such as a deleted iteration. */
234
+ export function forgetDraft(id) {
235
+ if (!drafts.has(id) || lockedDrafts.has(id))
236
+ return;
237
+ discardDraftHistory(id);
238
+ drafts.delete(id);
239
+ for (const listener of draftListeners)
240
+ listener(id);
241
+ publishSelection();
242
+ }
243
+ function clearActiveDraftChangesImpl() { clearDraftChanges(activeId()); }
244
+ function resetDraftChangesImpl() {
245
+ drafts.clear();
246
+ lockedDrafts.clear();
247
+ activeDraftId = null;
248
+ clearSessionUndoHistory();
249
+ publishSelection();
250
+ }
251
+ export const draftChangeStore = {
252
+ getSnapshot, subscribe,
253
+ commitChangeRecords: commitChangeRecordsImpl,
254
+ revertChangeRecord: revertChangeRecordImpl,
255
+ discardChangeRecords: discardChangeRecordsImpl,
256
+ commitStructuralChange: commitStructuralChangeImpl,
257
+ revertStructuralChangeRecord: revertStructuralChangeRecordImpl,
258
+ reconcileActiveDraftChanges: reconcileActiveDraftChangesImpl,
259
+ undoChange: () => replay("undo"),
260
+ redoChange: () => replay("redo"),
261
+ restoreActiveDraftChanges: restoreActiveDraftChangesImpl,
262
+ clearActiveDraftChanges: clearActiveDraftChangesImpl,
263
+ };
264
+ export function getActiveDraftChanges() {
265
+ return draftChangeStore.getSnapshot();
266
+ }
267
+ export function subscribeActiveDraftChanges(listener) {
268
+ return draftChangeStore.subscribe(listener);
269
+ }
270
+ export function commitChangeRecords(incoming, project) {
271
+ const result = draftChangeStore.commitChangeRecords(incoming);
272
+ if (result === "applied")
273
+ project(draftChangeStore.getSnapshot());
274
+ return result;
275
+ }
276
+ export function commitStructuralChange(change, project) {
277
+ const changed = draftChangeStore.commitStructuralChange(change);
278
+ if (changed)
279
+ project(draftChangeStore.getSnapshot());
280
+ return changed;
281
+ }
282
+ export function undoChange(project) {
283
+ const changed = draftChangeStore.undoChange();
284
+ if (changed)
285
+ project(draftChangeStore.getSnapshot());
286
+ return changed;
287
+ }
288
+ export function redoChange(project) {
289
+ const changed = draftChangeStore.redoChange();
290
+ if (changed)
291
+ project(draftChangeStore.getSnapshot());
292
+ return changed;
293
+ }
294
+ export function restoreActiveDraftChanges(next, project) {
295
+ draftChangeStore.restoreActiveDraftChanges(next);
296
+ project(draftChangeStore.getSnapshot());
297
+ }
298
+ export function resetDraftChanges() {
299
+ resetDraftChangesImpl();
300
+ }
@@ -3,9 +3,11 @@ import type { PreviewResult } from "../projection/managedStylesheet.js";
3
3
  export interface PreviewDocument {
4
4
  readonly logicalDocument: string;
5
5
  readonly sessionId: string;
6
+ readonly draftId?: string;
6
7
  }
7
8
  export interface PreviewAttempt extends PreviewDocument {
8
- readonly workspaceRevision: number;
9
+ readonly draftId: string;
10
+ readonly draftRevision: number;
9
11
  readonly attempt: number;
10
12
  }
11
13
  export interface PreviewDiagnostic extends PreviewAttempt {
@@ -26,7 +28,7 @@ export declare function publishPreviewDiagnostic(attempt: PreviewAttempt, change
26
28
  export declare function clearPreviewDiagnostics(changeKeys?: Iterable<string>): void;
27
29
  /** Notifies consumers when verification state changes without a result. */
28
30
  export declare function notifyPreviewDiagnostics(): void;
29
- export declare function getPreviewDiagnostic(changeKey: string, logicalDocument?: string): PreviewDiagnostic | undefined;
31
+ export declare function getPreviewDiagnostic(changeKey: string, logicalDocument?: string, draftId?: string): PreviewDiagnostic | undefined;
30
32
  /**
31
33
  * Host-first read across live documents. The per-document store is observable
32
34
  * here so a Canvas-only conflict is not write-only; host remains the default