@agent-native/core-corpus 0.214.0 → 0.216.0

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 (1096) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/templates/analytics/.agents/skills/actions/references/action-fields.md +1 -1
  3. package/corpus/templates/analytics/CHANGELOG.md +1 -0
  4. package/corpus/templates/analytics/changelog/2026-10-21-session-replay-quotas-count-the-compressed-size-analytics-st.md +6 -0
  5. package/corpus/templates/analytics/server/lib/session-replay.ts +40 -9
  6. package/corpus/templates/assets/.agents/skills/actions/references/action-fields.md +1 -1
  7. package/corpus/templates/brain/.agents/skills/actions/references/action-fields.md +1 -1
  8. package/corpus/templates/calendar/.agents/skills/actions/references/action-fields.md +1 -1
  9. package/corpus/templates/chat/.agents/skills/actions/references/action-fields.md +1 -1
  10. package/corpus/templates/clips/.agents/skills/actions/references/action-fields.md +1 -1
  11. package/corpus/templates/community/qr/package.json +1 -1
  12. package/corpus/templates/content/.agents/skills/actions/references/action-fields.md +1 -1
  13. package/corpus/templates/content/.agents/skills/content-product-development/references/verification.md +36 -0
  14. package/corpus/templates/content/.agents/skills/document-editing/SKILL.md +10 -0
  15. package/corpus/templates/content/.agents/skills/document-editing/references/databases.md +11 -0
  16. package/corpus/templates/content/.agents/skills/notion-integration/SKILL.md +4 -2
  17. package/corpus/templates/content/CHANGELOG.md +46 -0
  18. package/corpus/templates/content/acceptance/_writers.ts +604 -0
  19. package/corpus/templates/content/acceptance/generate-action-registry.ts +10 -0
  20. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/create-document.json +75 -0
  21. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/duplicate-page.json +75 -0
  22. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/edit-document-find-and-replace-without-a-revision.json +75 -0
  23. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/edit-document-find-and-replace.json +75 -0
  24. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/edit-document-initializecontent.json +75 -0
  25. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/import-content.json +75 -0
  26. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/local-files-import-content-source-existing-page.json +75 -0
  27. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/local-files-import-content-source-new-page.json +75 -0
  28. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/local-files-sync-local-folder-source-changed-file.json +75 -0
  29. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/local-files-sync-local-folder-source-new-file.json +75 -0
  30. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/restore-document-version.json +75 -0
  31. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/set-document-property-primary-blocks-field.json +75 -0
  32. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/set-image-alt-text.json +75 -0
  33. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/undo-content-import.json +75 -0
  34. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/update-document-browser-full-rewrite.json +75 -0
  35. package/corpus/templates/content/acceptance/known-loss.ts +69 -0
  36. package/corpus/templates/content/acceptance/round-trip-corpus.ts +1397 -0
  37. package/corpus/templates/content/actions/_blocks-field-identity.ts +35 -1
  38. package/corpus/templates/content/actions/_content-database-lifecycle.ts +11 -11
  39. package/corpus/templates/content/actions/_content-database-personal-view.ts +2 -0
  40. package/corpus/templates/content/actions/_content-favorites.ts +37 -0
  41. package/corpus/templates/content/actions/_database-membership-lock.ts +39 -8
  42. package/corpus/templates/content/actions/_database-navigation.ts +19 -21
  43. package/corpus/templates/content/actions/_database-row-batch.ts +41 -18
  44. package/corpus/templates/content/actions/_database-row-mutation.ts +17 -28
  45. package/corpus/templates/content/actions/_database-source-utils.ts +18 -1
  46. package/corpus/templates/content/actions/_database-utils.ts +3 -0
  47. package/corpus/templates/content/actions/_database-view-setup.ts +16 -0
  48. package/corpus/templates/content/actions/_document-edit-mutation.ts +33 -32
  49. package/corpus/templates/content/actions/_document-flush.ts +593 -171
  50. package/corpus/templates/content/actions/_document-save-locks.ts +54 -0
  51. package/corpus/templates/content/actions/_document-save-row.ts +133 -0
  52. package/corpus/templates/content/actions/_github-source.ts +18 -8
  53. package/corpus/templates/content/actions/_move-page-to-space.ts +189 -25
  54. package/corpus/templates/content/actions/_nfm-syntax.ts +2 -0
  55. package/corpus/templates/content/actions/_row-lock-order.ts +115 -0
  56. package/corpus/templates/content/actions/create-content-database.ts +11 -0
  57. package/corpus/templates/content/actions/create-document.ts +13 -1
  58. package/corpus/templates/content/actions/delete-content-database.ts +17 -14
  59. package/corpus/templates/content/actions/delete-document-property.ts +5 -0
  60. package/corpus/templates/content/actions/delete-document.ts +270 -97
  61. package/corpus/templates/content/actions/edit-document.ts +18 -5
  62. package/corpus/templates/content/actions/export-document.ts +3 -0
  63. package/corpus/templates/content/actions/get-blocks-field-word-count.ts +22 -5
  64. package/corpus/templates/content/actions/import-content-source.ts +170 -54
  65. package/corpus/templates/content/actions/move-document.ts +191 -73
  66. package/corpus/templates/content/actions/pull-document.ts +8 -2
  67. package/corpus/templates/content/actions/remove-database-items.ts +23 -4
  68. package/corpus/templates/content/actions/restore-content-database.ts +76 -55
  69. package/corpus/templates/content/actions/restore-document-version.ts +19 -35
  70. package/corpus/templates/content/actions/restore-document.ts +65 -53
  71. package/corpus/templates/content/actions/rollback-created-slash-document.ts +11 -16
  72. package/corpus/templates/content/actions/set-document-property.ts +15 -1
  73. package/corpus/templates/content/actions/share-local-file-document.ts +18 -14
  74. package/corpus/templates/content/actions/suggest-document-edit.ts +2 -3
  75. package/corpus/templates/content/actions/sync-local-folder-source.ts +35 -1
  76. package/corpus/templates/content/actions/undo-content-import.ts +16 -12
  77. package/corpus/templates/content/actions/update-content-database-view.ts +2 -0
  78. package/corpus/templates/content/actions/update-document.ts +19 -14
  79. package/corpus/templates/content/app/components/editor/BubbleToolbar.tsx +1 -6
  80. package/corpus/templates/content/app/components/editor/CommentsSidebar.tsx +49 -3
  81. package/corpus/templates/content/app/components/editor/ContentImportDialog.tsx +2 -0
  82. package/corpus/templates/content/app/components/editor/DocumentBlockFields.tsx +53 -11
  83. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +608 -353
  84. package/corpus/templates/content/app/components/editor/StaticDocumentBody.tsx +765 -0
  85. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +233 -80
  86. package/corpus/templates/content/app/components/editor/blockFieldSaveController.ts +32 -3
  87. package/corpus/templates/content/app/components/editor/blockFieldSaveRegistry.ts +88 -23
  88. package/corpus/templates/content/app/components/editor/comment-anchors.ts +19 -0
  89. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +205 -71
  90. package/corpus/templates/content/app/components/editor/document-flush-participant.ts +253 -0
  91. package/corpus/templates/content/app/components/editor/editor-transaction-meta.ts +28 -0
  92. package/corpus/templates/content/app/components/editor/extensions/AudioBlock.tsx +2 -1
  93. package/corpus/templates/content/app/components/editor/extensions/ImageBlock.tsx +27 -6
  94. package/corpus/templates/content/app/components/editor/extensions/LocalMdxComponentNode.tsx +0 -1
  95. package/corpus/templates/content/app/components/editor/extensions/NotionExtensions.tsx +4 -4
  96. package/corpus/templates/content/app/components/editor/extensions/SuggestionHighlight.ts +24 -2
  97. package/corpus/templates/content/app/components/editor/extensions/VideoBlock.tsx +25 -6
  98. package/corpus/templates/content/app/components/editor/pending-document-persistence.ts +59 -1
  99. package/corpus/templates/content/app/components/editor/stored-body-images.ts +27 -0
  100. package/corpus/templates/content/app/components/editor/suggestions/presentation-rebase.ts +17 -0
  101. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +11 -4
  102. package/corpus/templates/content/app/components/trash/TrashBrowser.tsx +4 -1
  103. package/corpus/templates/content/app/global.css +21 -0
  104. package/corpus/templates/content/app/hooks/use-content-trash.ts +8 -0
  105. package/corpus/templates/content/app/import-messages.ts +25 -0
  106. package/corpus/templates/content/app/trash-messages.ts +16 -0
  107. package/corpus/templates/content/changelog/2026-10-16-a-page-open-in-a-tab-that-shows-it-s-in-the-trash-reopens-wi.md +6 -0
  108. package/corpus/templates/content/changelog/2026-10-16-a-page-restored-from-trash-returns-to-its-place-in-its-colle.md +6 -0
  109. package/corpus/templates/content/changelog/2026-10-16-agent-written-markdown-keeps-nested-lists-indented-with-spac.md +6 -0
  110. package/corpus/templates/content/changelog/2026-10-16-opening-a-page-you-can-edit-no-longer-rebuilds-its-editor-on.md +6 -0
  111. package/corpus/templates/content/changelog/2026-10-16-pages-moved-or-imported-at-the-same-time-can-no-longer-end-u.md +6 -0
  112. package/corpus/templates/content/changelog/2026-10-16-re-importing-a-markdown-export-of-a-page-no-longer-reports-t.md +6 -0
  113. package/corpus/templates/content/changelog/2026-10-16-saving-a-page-or-restoring-one-of-its-versions-no-longer-fai.md +6 -0
  114. package/corpus/templates/content/changelog/2026-10-17-agents-reading-a-page-you-have-open-no-longer-wait-or-fail-w.md +6 -0
  115. package/corpus/templates/content/changelog/2026-10-19-fresh-document-reads-require-confirmation-from-every-open-ed.md +6 -0
  116. package/corpus/templates/content/changelog/2026-10-20-html-table-cells-preserve-a-trailing-backslash-when-opening-.md +6 -0
  117. package/corpus/templates/content/changelog/2026-10-20-preserve-empty-paragraph-colors-and-refuse-unsupported-inlin.md +6 -0
  118. package/corpus/templates/content/changelog/2026-10-20-the-advanced-filter-and-each-filter-group-inside-it-have-the.md +6 -0
  119. package/corpus/templates/content/changelog/2026-10-21-blocks-fields-keep-unconfirmed-saves-visible-and-agent-reads.md +6 -0
  120. package/corpus/templates/content/changelog/2026-10-21-preserve-compact-table-row-groups-and-report-invalid-block-colors.md +6 -0
  121. package/corpus/templates/content/changelog/2026-10-21-suggested-edits-show-an-agent-s-whole-reason-open-a-group-to.md +6 -0
  122. package/corpus/templates/content/changelog/2026-10-21-suggestions-keep-refusing-unmatched-emphasis-in-stored-markd.md +6 -0
  123. package/corpus/templates/content/changelog/2026-10-22-accept-remaining-and-reject-remaining-show-the-result-for-ev.md +6 -0
  124. package/corpus/templates/content/changelog/2026-10-22-accepting-a-group-of-suggested-edits-saves-faster-and-adds-o.md +6 -0
  125. package/corpus/templates/content/changelog/2026-10-22-agents-read-saved-page-text-after-failed-icon-change.md +6 -0
  126. package/corpus/templates/content/changelog/2026-10-22-changes-made-from-a-menu-or-popover-such-as-an-image-s-alt-t.md +6 -0
  127. package/corpus/templates/content/changelog/2026-10-22-text-an-agent-writes-inside-a-callout-column-or-synced-block.md +6 -0
  128. package/corpus/templates/content/e2e/auth-files.ts +28 -0
  129. package/corpus/templates/content/e2e/convergence-summary.ts +84 -29
  130. package/corpus/templates/content/e2e/gate-arm.ts +15 -0
  131. package/corpus/templates/content/e2e/global-setup.ts +43 -75
  132. package/corpus/templates/content/e2e/global-teardown.ts +34 -0
  133. package/corpus/templates/content/e2e/helpers.ts +598 -92
  134. package/corpus/templates/content/e2e/live-body-gate.ts +188 -0
  135. package/corpus/templates/content/e2e/playwright.config.ts +12 -3
  136. package/corpus/templates/content/e2e/server-identity.ts +47 -0
  137. package/corpus/templates/content/e2e/stored-form/collab-blocks.ts +123 -0
  138. package/corpus/templates/content/package.json +1 -1
  139. package/corpus/templates/content/scripts/_stored-form-census-kinds.ts +30 -2
  140. package/corpus/templates/content/scripts/historical-icon-apply.ts +9 -1
  141. package/corpus/templates/content/scripts/trace-startup.mjs +460 -133
  142. package/corpus/templates/content/server/db/exec.ts +58 -0
  143. package/corpus/templates/content/server/db/schema.ts +1 -0
  144. package/corpus/templates/content/server/lib/content-trash-purge.ts +208 -144
  145. package/corpus/templates/content/server/lib/document-metadata-updated-at.ts +43 -1
  146. package/corpus/templates/content/server/lib/document-revision.ts +23 -0
  147. package/corpus/templates/content/server/lib/live-body-writer.ts +199 -0
  148. package/corpus/templates/content/server/lib/notion-sync.ts +63 -29
  149. package/corpus/templates/content/server/lib/notion.ts +5 -5
  150. package/corpus/templates/content/server/lib/suggested-edits.ts +357 -230
  151. package/corpus/templates/content/server/plugins/db.ts +5 -0
  152. package/corpus/templates/content/server/routes/api/documents/[id]/move.patch.ts +50 -168
  153. package/corpus/templates/content/shared/api.ts +2 -0
  154. package/corpus/templates/content/shared/blocks-fields-manifest.ts +106 -0
  155. package/corpus/templates/content/shared/database-query.ts +192 -30
  156. package/corpus/templates/content/shared/document-export.ts +12 -14
  157. package/corpus/templates/content/shared/document-flush-protocol.ts +88 -0
  158. package/corpus/templates/content/shared/editor-save-state.ts +97 -0
  159. package/corpus/templates/content/shared/feature-flags.ts +10 -0
  160. package/corpus/templates/content/shared/import/markdown.ts +91 -7
  161. package/corpus/templates/content/shared/import/types.ts +2 -0
  162. package/corpus/templates/content/shared/inline-math.ts +6 -4
  163. package/corpus/templates/content/shared/nfm-fidelity.ts +247 -0
  164. package/corpus/templates/content/shared/nfm.ts +1933 -340
  165. package/corpus/templates/content/shared/suggestion-diff.ts +13 -0
  166. package/corpus/templates/content/shared/suggestion-formatting.ts +143 -20
  167. package/corpus/templates/content/shared/suggestion-text.ts +39 -0
  168. package/corpus/templates/content/vitest.config.ts +10 -0
  169. package/corpus/templates/crm/.agents/skills/actions/references/action-fields.md +1 -1
  170. package/corpus/templates/design/.agents/skills/actions/references/action-fields.md +1 -1
  171. package/corpus/templates/design/.agents/skills/native-effects/SKILL.md +9 -2
  172. package/corpus/templates/design/.generated/bridge/shader-fill-preview.generated.ts +3 -249
  173. package/corpus/templates/design/.generated/bridge/shader-runtime.generated.ts +5 -88
  174. package/corpus/templates/design/AGENTS.md +1 -3
  175. package/corpus/templates/design/CHANGELOG.md +32 -0
  176. package/corpus/templates/design/CODE_NATIVE_DESIGN_STUDIO_IMPLEMENTATION_PLAN.md +1 -6
  177. package/corpus/templates/design/DESIGN-STUDIO-PLAN.md +5 -7
  178. package/corpus/templates/design/actions/_native-local-export-server.ts +44 -31
  179. package/corpus/templates/design/actions/_native-render-contexts.ts +76 -21
  180. package/corpus/templates/design/actions/claim-native-local-export.ts +5 -0
  181. package/corpus/templates/design/actions/finish-native-local-export.ts +13 -2
  182. package/corpus/templates/design/actions/get-native-shader-approvals.ts +35 -0
  183. package/corpus/templates/design/actions/get-shader.ts +134 -219
  184. package/corpus/templates/design/actions/list-design-extensions.ts +3 -58
  185. package/corpus/templates/design/actions/request-native-local-export.ts +32 -6
  186. package/corpus/templates/design/actions/run-design-extension-action.ts +0 -29
  187. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +131 -108
  188. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +0 -218
  189. package/corpus/templates/design/app/components/design/DesignThumbnail.tsx +59 -3
  190. package/corpus/templates/design/app/components/design/EditPanel.tsx +35 -47
  191. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +242 -62
  192. package/corpus/templates/design/app/components/design/NativePreviewErrorBoundary.tsx +53 -0
  193. package/corpus/templates/design/app/components/design/bridge/codegen.ts +18 -3
  194. package/corpus/templates/design/app/components/design/bridge/native-composition-clock.ts +5 -4
  195. package/corpus/templates/design/app/components/design/bridge/native-dom.ts +37 -0
  196. package/corpus/templates/design/app/components/design/bridge/native-intrinsic-image.ts +2 -1
  197. package/corpus/templates/design/app/components/design/bridge/native-mesh-grid.ts +90 -0
  198. package/corpus/templates/design/app/components/design/bridge/native-opaque-public-asset.ts +363 -0
  199. package/corpus/templates/design/app/components/design/bridge/native-opaque-worker-lease.ts +179 -0
  200. package/corpus/templates/design/app/components/design/bridge/native-preview-geometry.ts +132 -7
  201. package/corpus/templates/design/app/components/design/bridge/native-preview-policy.ts +4 -0
  202. package/corpus/templates/design/app/components/design/bridge/native-preview-viewport-transport.ts +378 -0
  203. package/corpus/templates/design/app/components/design/bridge/native-scene-body-transform.ts +62 -0
  204. package/corpus/templates/design/app/components/design/bridge/native-scene-presentation-element.ts +10 -0
  205. package/corpus/templates/design/app/components/design/bridge/native-shader-runtime.bridge.ts +646 -167
  206. package/corpus/templates/design/app/components/design/bridge/native-source-provider.ts +246 -192
  207. package/corpus/templates/design/app/components/design/bridge/native-stateful-resource.ts +2 -2
  208. package/corpus/templates/design/app/components/design/bridge/native-stateless-compute.ts +5 -2
  209. package/corpus/templates/design/app/components/design/bridge/native-svg-source.ts +11 -1
  210. package/corpus/templates/design/app/components/design/bridge/native-worker-broker.ts +6 -0
  211. package/corpus/templates/design/app/components/design/bridge/native-worker-entry.ts +761 -303
  212. package/corpus/templates/design/app/components/design/bridge/native-worker-fill.ts +16 -6
  213. package/corpus/templates/design/app/components/design/bridge/native-worker-gpu.ts +854 -91
  214. package/corpus/templates/design/app/components/design/bridge/native-worker-host.ts +15 -1
  215. package/corpus/templates/design/app/components/design/bridge/native-worker-input-assets.ts +200 -0
  216. package/corpus/templates/design/app/components/design/bridge/native-worker-protocol.ts +40 -1
  217. package/corpus/templates/design/app/components/design/bridge/native-worker-scene-host.ts +425 -126
  218. package/corpus/templates/design/app/components/design/bridge/native-worker-source-snapshot.ts +21 -0
  219. package/corpus/templates/design/app/components/design/bridge/shader-fill-preview.bridge.ts +5 -371
  220. package/corpus/templates/design/app/components/design/bridge/shader-runtime.bridge.ts +4 -146
  221. package/corpus/templates/design/app/components/design/design-canvas/interact-document.ts +5 -9
  222. package/corpus/templates/design/app/components/design/design-canvas/native-preview-surface.ts +150 -0
  223. package/corpus/templates/design/app/components/design/design-canvas/native-public-asset-preview.ts +409 -0
  224. package/corpus/templates/design/app/components/design/design-canvas/native-public-worker-preview.ts +1086 -0
  225. package/corpus/templates/design/app/components/design/design-canvas/private-replay-screenshot-preview.ts +2 -2
  226. package/corpus/templates/design/app/components/design/edit-panel/effects-properties.tsx +15 -26
  227. package/corpus/templates/design/app/components/design/edit-panel/fill-properties.tsx +74 -67
  228. package/corpus/templates/design/app/components/design/edit-panel/panel-primitives.tsx +7 -19
  229. package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +39 -30
  230. package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +4 -0
  231. package/corpus/templates/design/app/components/design/inspector/NativeShaderColorControls.tsx +3 -7
  232. package/corpus/templates/design/app/components/design/inspector/NativeShaderPaintControls.tsx +12 -5
  233. package/corpus/templates/design/app/components/design/inspector/NativeShaderPanel.tsx +705 -190
  234. package/corpus/templates/design/app/components/design/inspector/fill-field-reading.ts +1 -2
  235. package/corpus/templates/design/app/components/design/inspector/index.ts +0 -6
  236. package/corpus/templates/design/app/components/design/inspector/native-catalog-display.ts +26 -5
  237. package/corpus/templates/design/app/components/design/inspector/native-shader-catalog-fixture.ts +42 -0
  238. package/corpus/templates/design/app/components/design/inspector/native-shader-catalog-preview.ts +51 -33
  239. package/corpus/templates/design/app/components/design/inspector/native-shader-paint.ts +1 -0
  240. package/corpus/templates/design/app/components/design/inspector/native-shader-property-draft.ts +89 -23
  241. package/corpus/templates/design/app/components/design/inspector/saved-glsl-shader.tsx +243 -0
  242. package/corpus/templates/design/app/components/design/multi-screen/board-surface-html.ts +54 -5
  243. package/corpus/templates/design/app/components/design/shader-source-coordination.ts +66 -0
  244. package/corpus/templates/design/app/components/design/use-native-shader-approvals.ts +36 -8
  245. package/corpus/templates/design/app/components/templates/TemplatePreview.tsx +60 -3
  246. package/corpus/templates/design/app/i18n/en-US.ts +78 -2
  247. package/corpus/templates/design/app/pages/Present.tsx +36 -1
  248. package/corpus/templates/design/app/pages/design-editor/commands/apply-file-content-update.ts +1 -1
  249. package/corpus/templates/design/app/pages/design-editor/commands/apply-local-content-update.ts +1 -1
  250. package/corpus/templates/design/app/pages/design-editor/commands/commit-visual-styles.ts +2 -3
  251. package/corpus/templates/design/app/pages/design-editor/commands/cross-screen-element-drop.ts +1 -1
  252. package/corpus/templates/design/app/pages/design-editor/commands/layer-move-to-screen.ts +1 -1
  253. package/corpus/templates/design/app/pages/design-editor/commands/paste-selection.ts +1 -1
  254. package/corpus/templates/design/app/pages/design-editor/commands/paste-svg-layer.ts +1 -1
  255. package/corpus/templates/design/app/pages/design-editor/commands/prepare-content-history-replay.ts +1 -1
  256. package/corpus/templates/design/app/pages/design-editor/commands/redo.ts +1 -1
  257. package/corpus/templates/design/app/pages/design-editor/commands/render-png-blob.ts +84 -41
  258. package/corpus/templates/design/app/pages/design-editor/commands/shader-source-edit.ts +1 -1
  259. package/corpus/templates/design/app/pages/design-editor/commands/undo.ts +1 -1
  260. package/corpus/templates/design/app/pages/design-editor/design-editor-view.tsx +0 -2
  261. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-content-and-components.ts +4 -33
  262. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-export-and-handoff.ts +2 -2
  263. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-history.ts +0 -11
  264. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-layer-models.ts +2 -55
  265. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-screen-rendering.tsx +0 -3
  266. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-selection-and-styles.ts +0 -24
  267. package/corpus/templates/design/app/pages/design-editor/text-edit-utils.ts +0 -16
  268. package/corpus/templates/design/app/pages/design-editor/use-native-local-export-requests.ts +70 -11
  269. package/corpus/templates/design/app/pages/design-editor/view/single-screen-canvas.tsx +0 -2
  270. package/corpus/templates/design/changelog/2026-10-20-folded-mesh-adds-an-animated-sculpted-fill-with-editable-col.md +6 -0
  271. package/corpus/templates/design/changelog/2026-10-20-read-only-design-views-render-native-shader-previews-in-nest.md +6 -0
  272. package/corpus/templates/design/changelog/2026-10-20-selected-screens-with-shader-effects-can-be-exported-togethe.md +6 -0
  273. package/corpus/templates/design/changelog/2026-10-20-shader-previews-reuse-validated-scene-data-while-panning-inc.md +6 -0
  274. package/corpus/templates/design/changelog/2026-10-20-shader-previews-stay-aligned-while-you-zoom.md +6 -0
  275. package/corpus/templates/design/changelog/2026-10-20-signed-out-sessions-no-longer-watch-for-private-png-export-r.md +6 -0
  276. package/corpus/templates/design/changelog/2026-10-21-effect-thumbnails-show-richer-previews.md +6 -0
  277. package/corpus/templates/design/changelog/2026-10-21-native-effects-render-across-previews.md +6 -0
  278. package/corpus/templates/design/changelog/2026-10-21-native-shader-previews-use-less-gpu-memory-when-many-mesh-ef.md +6 -0
  279. package/corpus/templates/design/changelog/2026-10-21-opening-design-no-longer-shows-png-export-errors-when-no-exp.md +6 -0
  280. package/corpus/templates/design/changelog/2026-10-21-pulsing-border-controls-grouped.md +6 -0
  281. package/corpus/templates/design/changelog/2026-10-21-pulsing-border-follows-element-outlines.md +6 -0
  282. package/corpus/templates/design/changelog/2026-10-21-remove-obsolete-shader-fills.md +6 -0
  283. package/corpus/templates/design/changelog/2026-10-21-shader-previews-recover-from-temporary-gpu-and-image-failure.md +6 -0
  284. package/corpus/templates/design/changelog/2026-10-22-shader-fills-and-effects-render-correctly-on-canvas-elements.md +6 -0
  285. package/corpus/templates/design/package.json +0 -1
  286. package/corpus/templates/design/playwright.config.ts +1 -1
  287. package/corpus/templates/design/scripts/runtime-budget-zoom.ts +9 -21
  288. package/corpus/templates/design/scripts/runtime-budget.ts +10 -24
  289. package/corpus/templates/design/server/plugins/agent-chat.ts +0 -2
  290. package/corpus/templates/design/shared/effect-graph.ts +46 -1
  291. package/corpus/templates/design/shared/generation-output-receipt.ts +0 -1
  292. package/corpus/templates/design/shared/native-effect-animation-capability.ts +6 -0
  293. package/corpus/templates/design/shared/native-effect-folded-mesh-v1.ts +268 -0
  294. package/corpus/templates/design/shared/native-effect-folded-mesh-v2.ts +310 -0
  295. package/corpus/templates/design/shared/native-effect-folded-mesh.ts +489 -0
  296. package/corpus/templates/design/shared/native-effect-gallery-additions.ts +2 -2
  297. package/corpus/templates/design/shared/native-effect-paint.ts +8 -0
  298. package/corpus/templates/design/shared/native-effect-parameter-constraints.ts +8 -1
  299. package/corpus/templates/design/shared/native-effect-presets.ts +18 -1
  300. package/corpus/templates/design/shared/native-effect-property-presentation.ts +81 -0
  301. package/corpus/templates/design/shared/native-effect-pulsing-border-v3.ts +281 -0
  302. package/corpus/templates/design/shared/native-effect-pulsing-border-v4.ts +284 -0
  303. package/corpus/templates/design/shared/native-effect-pulsing-border.ts +300 -0
  304. package/corpus/templates/design/shared/native-effect-trust.ts +6 -0
  305. package/corpus/templates/design/shared/native-effect-wgsl.ts +12 -0
  306. package/corpus/templates/design/shared/native-effects.ts +528 -15
  307. package/corpus/templates/design/shared/native-input-resources.ts +36 -0
  308. package/corpus/templates/design/shared/native-local-export.ts +14 -0
  309. package/corpus/templates/design/shared/native-parameter-animation.ts +1 -0
  310. package/corpus/templates/design/shared/native-pointer-input.ts +9 -11
  311. package/corpus/templates/design/shared/shader-fills.ts +0 -513
  312. package/corpus/templates/design/vitest.setup.ts +7 -1
  313. package/corpus/templates/dispatch/.agents/skills/actions/references/action-fields.md +1 -1
  314. package/corpus/templates/dispatch/.agents/skills/turn-into-app/SKILL.md +20 -18
  315. package/corpus/templates/factory/.agents/skills/actions/references/action-fields.md +1 -1
  316. package/corpus/templates/factory/.agents/skills/review-latest-feedback/SKILL.md +36 -80
  317. package/corpus/templates/factory/.agents/skills/review-latest-feedback/references/channel-inventory.md +54 -16
  318. package/corpus/templates/factory/.agents/skills/review-latest-feedback/references/slack-reaction-replies.md +50 -73
  319. package/corpus/templates/factory/.agents/skills/turn-into-app/SKILL.md +20 -18
  320. package/corpus/templates/forms/.agents/skills/actions/references/action-fields.md +1 -1
  321. package/corpus/templates/mail/.agents/skills/actions/references/action-fields.md +1 -1
  322. package/corpus/templates/plan/.agents/skills/actions/references/action-fields.md +1 -1
  323. package/corpus/templates/slides/.agents/skills/actions/references/action-fields.md +1 -1
  324. package/corpus/templates/slides-2/.agents/skills/actions/SKILL.md +199 -0
  325. package/corpus/templates/slides-2/.agents/skills/actions/references/action-fields.md +145 -0
  326. package/corpus/templates/slides-2/.agents/skills/actions/references/examples.md +96 -0
  327. package/corpus/templates/slides-2/.agents/skills/actions/references/provider-apis.md +95 -0
  328. package/corpus/templates/slides-2/.agents/skills/adding-a-feature/SKILL.md +235 -0
  329. package/corpus/templates/slides-2/.agents/skills/agent-native-docs/SKILL.md +161 -0
  330. package/corpus/templates/slides-2/.agents/skills/agent-native-toolkit/SKILL.md +314 -0
  331. package/corpus/templates/slides-2/.agents/skills/analytics-data-for-decks/SKILL.md +44 -0
  332. package/corpus/templates/slides-2/.agents/skills/apply-slide-comments/SKILL.md +63 -0
  333. package/corpus/templates/slides-2/.agents/skills/client-side-routing/SKILL.md +87 -0
  334. package/corpus/templates/slides-2/.agents/skills/context-awareness/SKILL.md +282 -0
  335. package/corpus/templates/slides-2/.agents/skills/create-deck/SKILL.md +263 -0
  336. package/corpus/templates/slides-2/.agents/skills/create-deck/references/reference-inputs.md +72 -0
  337. package/corpus/templates/slides-2/.agents/skills/create-deck/references/slide-templates.md +93 -0
  338. package/corpus/templates/slides-2/.agents/skills/create-deck/references/source-material.md +16 -0
  339. package/corpus/templates/slides-2/.agents/skills/creative-context/SKILL.md +134 -0
  340. package/corpus/templates/slides-2/.agents/skills/customizing-agent-native/SKILL.md +219 -0
  341. package/corpus/templates/slides-2/.agents/skills/deck-management/SKILL.md +182 -0
  342. package/corpus/templates/slides-2/.agents/skills/delegate-to-agent/SKILL.md +62 -0
  343. package/corpus/templates/slides-2/.agents/skills/design-systems/SKILL.md +233 -0
  344. package/corpus/templates/slides-2/.agents/skills/external-agents/SKILL.md +549 -0
  345. package/corpus/templates/slides-2/.agents/skills/external-agents/references/mcp-apps-embedding.md +169 -0
  346. package/corpus/templates/slides-2/.agents/skills/frontend-design/SKILL.md +102 -0
  347. package/corpus/templates/slides-2/.agents/skills/frontend-design/references/visual-direction.md +102 -0
  348. package/corpus/templates/slides-2/.agents/skills/image-generation-via-a2a/SKILL.md +134 -0
  349. package/corpus/templates/slides-2/.agents/skills/performance/SKILL.md +79 -0
  350. package/corpus/templates/slides-2/.agents/skills/portability/SKILL.md +108 -0
  351. package/corpus/templates/slides-2/.agents/skills/real-time-sync/SKILL.md +146 -0
  352. package/corpus/templates/slides-2/.agents/skills/reliable-mutations/SKILL.md +72 -0
  353. package/corpus/templates/slides-2/.agents/skills/secrets/SKILL.md +82 -0
  354. package/corpus/templates/slides-2/.agents/skills/security/SKILL.md +80 -0
  355. package/corpus/templates/slides-2/.agents/skills/self-modifying-code/SKILL.md +123 -0
  356. package/corpus/templates/slides-2/.agents/skills/shadcn-ui/SKILL.md +71 -0
  357. package/corpus/templates/slides-2/.agents/skills/sharing/SKILL.md +286 -0
  358. package/corpus/templates/slides-2/.agents/skills/slide-design/SKILL.md +144 -0
  359. package/corpus/templates/slides-2/.agents/skills/slide-editing/SKILL.md +284 -0
  360. package/corpus/templates/slides-2/.agents/skills/slide-editing/references/animations.md +33 -0
  361. package/corpus/templates/slides-2/.agents/skills/slide-editing/references/freeform-objects.md +22 -0
  362. package/corpus/templates/slides-2/.agents/skills/slide-editing/references/restyling.md +69 -0
  363. package/corpus/templates/slides-2/.agents/skills/slide-editing/references/transitions.md +26 -0
  364. package/corpus/templates/slides-2/.agents/skills/slide-editing/references/video.md +45 -0
  365. package/corpus/templates/slides-2/.agents/skills/slide-images/SKILL.md +136 -0
  366. package/corpus/templates/slides-2/.agents/skills/storing-data/SKILL.md +234 -0
  367. package/corpus/templates/slides-2/.agents/skills/turn-into-skill/SKILL.md +112 -0
  368. package/corpus/templates/slides-2/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  369. package/corpus/templates/slides-2/.agents/skills/workspace-conventions/SKILL.md +103 -0
  370. package/corpus/templates/slides-2/.builder/rules/deploy-app.mdc +22 -0
  371. package/corpus/templates/slides-2/.builder/rules/organize-ui.mdc +9 -0
  372. package/corpus/templates/slides-2/.dockerignore +61 -0
  373. package/corpus/templates/slides-2/.env.example +23 -0
  374. package/corpus/templates/slides-2/.ignore +3 -0
  375. package/corpus/templates/slides-2/.mcp.json +8 -0
  376. package/corpus/templates/slides-2/.oxfmtrc.json +8 -0
  377. package/corpus/templates/slides-2/AGENTS.md +66 -0
  378. package/corpus/templates/slides-2/CHANGELOG.md +76 -0
  379. package/corpus/templates/slides-2/DEVELOPING.md +157 -0
  380. package/corpus/templates/slides-2/README.md +58 -0
  381. package/corpus/templates/slides-2/THIRD_PARTY_NOTICES.md +33 -0
  382. package/corpus/templates/slides-2/_gitignore +38 -0
  383. package/corpus/templates/slides-2/actions/_agent-presence.ts +29 -0
  384. package/corpus/templates/slides-2/actions/_app-url.ts +37 -0
  385. package/corpus/templates/slides-2/actions/_deck-app-scope.ts +30 -0
  386. package/corpus/templates/slides-2/actions/_deck-tracking.ts +260 -0
  387. package/corpus/templates/slides-2/actions/_deck-write.ts +206 -0
  388. package/corpus/templates/slides-2/actions/_imported-slide-source.ts +162 -0
  389. package/corpus/templates/slides-2/actions/_inline-image-storage.ts +1013 -0
  390. package/corpus/templates/slides-2/actions/_linked-design-system.ts +83 -0
  391. package/corpus/templates/slides-2/actions/_presenter-notes.ts +83 -0
  392. package/corpus/templates/slides-2/actions/_render-artifacts.ts +111 -0
  393. package/corpus/templates/slides-2/actions/_slide-source.ts +344 -0
  394. package/corpus/templates/slides-2/actions/_tab-state.ts +51 -0
  395. package/corpus/templates/slides-2/actions/_test-brandfetch.ts +31 -0
  396. package/corpus/templates/slides-2/actions/_uploaded-files.ts +114 -0
  397. package/corpus/templates/slides-2/actions/add-deck.ts +123 -0
  398. package/corpus/templates/slides-2/actions/add-slide-comment.ts +267 -0
  399. package/corpus/templates/slides-2/actions/add-slide.ts +888 -0
  400. package/corpus/templates/slides-2/actions/analyze-brand-assets.ts +66 -0
  401. package/corpus/templates/slides-2/actions/apply-design-system.ts +111 -0
  402. package/corpus/templates/slides-2/actions/approve-deck-access-request.ts +287 -0
  403. package/corpus/templates/slides-2/actions/audit-contrast.ts +143 -0
  404. package/corpus/templates/slides-2/actions/check-image-gen.ts +17 -0
  405. package/corpus/templates/slides-2/actions/clone-context-slide.ts +340 -0
  406. package/corpus/templates/slides-2/actions/clone-creative-context-deck.ts +143 -0
  407. package/corpus/templates/slides-2/actions/control-deck-history.ts +186 -0
  408. package/corpus/templates/slides-2/actions/control-presenter.ts +117 -0
  409. package/corpus/templates/slides-2/actions/control-slide-editor.ts +267 -0
  410. package/corpus/templates/slides-2/actions/create-deck-from-template.ts +274 -0
  411. package/corpus/templates/slides-2/actions/create-deck.ts +1243 -0
  412. package/corpus/templates/slides-2/actions/create-design-system.ts +131 -0
  413. package/corpus/templates/slides-2/actions/create-share-link.ts +127 -0
  414. package/corpus/templates/slides-2/actions/db-health.ts +22 -0
  415. package/corpus/templates/slides-2/actions/delete-asset.ts +154 -0
  416. package/corpus/templates/slides-2/actions/delete-deck.ts +427 -0
  417. package/corpus/templates/slides-2/actions/delete-design-system.ts +167 -0
  418. package/corpus/templates/slides-2/actions/delete-slide-comment.ts +143 -0
  419. package/corpus/templates/slides-2/actions/delete-staged-dataset.ts +30 -0
  420. package/corpus/templates/slides-2/actions/duplicate-deck.ts +299 -0
  421. package/corpus/templates/slides-2/actions/export-google-slides.ts +41 -0
  422. package/corpus/templates/slides-2/actions/export-html.ts +770 -0
  423. package/corpus/templates/slides-2/actions/export-pptx.ts +2203 -0
  424. package/corpus/templates/slides-2/actions/extract-pdf.ts +49 -0
  425. package/corpus/templates/slides-2/actions/generate-image-api.ts +671 -0
  426. package/corpus/templates/slides-2/actions/generate-image.ts +492 -0
  427. package/corpus/templates/slides-2/actions/get-agent-access-deck.ts +52 -0
  428. package/corpus/templates/slides-2/actions/get-deck-access-status.ts +130 -0
  429. package/corpus/templates/slides-2/actions/get-deck-design-tokens.ts +62 -0
  430. package/corpus/templates/slides-2/actions/get-deck-reference-context.ts +232 -0
  431. package/corpus/templates/slides-2/actions/get-deck-template.ts +38 -0
  432. package/corpus/templates/slides-2/actions/get-deck-version.ts +85 -0
  433. package/corpus/templates/slides-2/actions/get-deck.ts +562 -0
  434. package/corpus/templates/slides-2/actions/get-design-system-decode-job-status.ts +57 -0
  435. package/corpus/templates/slides-2/actions/get-design-system-tier-limit.ts +12 -0
  436. package/corpus/templates/slides-2/actions/get-design-system.ts +453 -0
  437. package/corpus/templates/slides-2/actions/get-google-docs-status.ts +106 -0
  438. package/corpus/templates/slides-2/actions/get-google-picker-token.ts +84 -0
  439. package/corpus/templates/slides-2/actions/get-home-suggestions.ts +52 -0
  440. package/corpus/templates/slides-2/actions/get-layout-overflows.ts +192 -0
  441. package/corpus/templates/slides-2/actions/get-slide-render.ts +125 -0
  442. package/corpus/templates/slides-2/actions/get-slide-source.ts +115 -0
  443. package/corpus/templates/slides-2/actions/get-slide-theme-preview.ts +64 -0
  444. package/corpus/templates/slides-2/actions/get-slide-theme.ts +44 -0
  445. package/corpus/templates/slides-2/actions/get-slides-2-upload-storage-status.ts +17 -0
  446. package/corpus/templates/slides-2/actions/get-slides-notification-prefs.ts +37 -0
  447. package/corpus/templates/slides-2/actions/get-workspace-defaults.ts +51 -0
  448. package/corpus/templates/slides-2/actions/image-gen-status.ts +35 -0
  449. package/corpus/templates/slides-2/actions/import-code.ts +26 -0
  450. package/corpus/templates/slides-2/actions/import-design-project.ts +49 -0
  451. package/corpus/templates/slides-2/actions/import-document.ts +125 -0
  452. package/corpus/templates/slides-2/actions/import-docx.ts +57 -0
  453. package/corpus/templates/slides-2/actions/import-file.ts +1273 -0
  454. package/corpus/templates/slides-2/actions/import-from-url.ts +25 -0
  455. package/corpus/templates/slides-2/actions/import-google-doc.ts +208 -0
  456. package/corpus/templates/slides-2/actions/import-google-font.ts +110 -0
  457. package/corpus/templates/slides-2/actions/import-google-slides-reference.ts +667 -0
  458. package/corpus/templates/slides-2/actions/import-pptx.ts +564 -0
  459. package/corpus/templates/slides-2/actions/import-svgl-logo.ts +115 -0
  460. package/corpus/templates/slides-2/actions/index-design-system-with-builder.ts +181 -0
  461. package/corpus/templates/slides-2/actions/index-uploaded-design-system-files.ts +77 -0
  462. package/corpus/templates/slides-2/actions/list-assets.ts +286 -0
  463. package/corpus/templates/slides-2/actions/list-deck-templates.ts +83 -0
  464. package/corpus/templates/slides-2/actions/list-deck-versions.ts +185 -0
  465. package/corpus/templates/slides-2/actions/list-decks.ts +591 -0
  466. package/corpus/templates/slides-2/actions/list-design-systems.ts +180 -0
  467. package/corpus/templates/slides-2/actions/list-slide-comments.ts +128 -0
  468. package/corpus/templates/slides-2/actions/list-slide-themes.ts +17 -0
  469. package/corpus/templates/slides-2/actions/list-staged-datasets.ts +14 -0
  470. package/corpus/templates/slides-2/actions/logo-config.ts +13 -0
  471. package/corpus/templates/slides-2/actions/navigate.ts +158 -0
  472. package/corpus/templates/slides-2/actions/patch-deck.ts +2378 -0
  473. package/corpus/templates/slides-2/actions/provider-api-catalog.ts +25 -0
  474. package/corpus/templates/slides-2/actions/provider-api-docs.ts +83 -0
  475. package/corpus/templates/slides-2/actions/provider-api-request.ts +222 -0
  476. package/corpus/templates/slides-2/actions/query-staged-dataset.ts +83 -0
  477. package/corpus/templates/slides-2/actions/read-composer-source.ts +108 -0
  478. package/corpus/templates/slides-2/actions/request-deck-access.ts +803 -0
  479. package/corpus/templates/slides-2/actions/restore-deck-version.ts +203 -0
  480. package/corpus/templates/slides-2/actions/run.ts +2 -0
  481. package/corpus/templates/slides-2/actions/save-deck.ts +313 -0
  482. package/corpus/templates/slides-2/actions/search-google-fonts.ts +61 -0
  483. package/corpus/templates/slides-2/actions/search-images.ts +30 -0
  484. package/corpus/templates/slides-2/actions/search-logos.ts +23 -0
  485. package/corpus/templates/slides-2/actions/search-svgl-logos.ts +42 -0
  486. package/corpus/templates/slides-2/actions/set-default-design-system.ts +88 -0
  487. package/corpus/templates/slides-2/actions/set-workspace-defaults.ts +61 -0
  488. package/corpus/templates/slides-2/actions/start-design-system-upload.ts +80 -0
  489. package/corpus/templates/slides-2/actions/sync-design-system-with-builder.ts +84 -0
  490. package/corpus/templates/slides-2/actions/toggle-slide-comment-reaction.ts +150 -0
  491. package/corpus/templates/slides-2/actions/transform-slide-objects.ts +1528 -0
  492. package/corpus/templates/slides-2/actions/update-asset.ts +499 -0
  493. package/corpus/templates/slides-2/actions/update-deck-aspect-ratio.ts +95 -0
  494. package/corpus/templates/slides-2/actions/update-deck-design-tokens.ts +175 -0
  495. package/corpus/templates/slides-2/actions/update-design-system.ts +95 -0
  496. package/corpus/templates/slides-2/actions/update-slide-comment.ts +213 -0
  497. package/corpus/templates/slides-2/actions/update-slide-source.ts +353 -0
  498. package/corpus/templates/slides-2/actions/update-slide.ts +850 -0
  499. package/corpus/templates/slides-2/actions/update-slides-notification-prefs.ts +55 -0
  500. package/corpus/templates/slides-2/actions/view-screen.ts +1098 -0
  501. package/corpus/templates/slides-2/agent-native.app-skill.json +165 -0
  502. package/corpus/templates/slides-2/agent-native.config.ts +20 -0
  503. package/corpus/templates/slides-2/agent-native.json +18 -0
  504. package/corpus/templates/slides-2/app/components/ThemeToggle.tsx +47 -0
  505. package/corpus/templates/slides-2/app/components/comments/SlideCommentPins.tsx +781 -0
  506. package/corpus/templates/slides-2/app/components/comments/SlideCommentsPanel.tsx +1075 -0
  507. package/corpus/templates/slides-2/app/components/deck/DeckCard.tsx +304 -0
  508. package/corpus/templates/slides-2/app/components/deck/DeckFilterMenu.tsx +83 -0
  509. package/corpus/templates/slides-2/app/components/deck/ExcalidrawSlide.tsx +183 -0
  510. package/corpus/templates/slides-2/app/components/deck/MermaidRenderer.tsx +126 -0
  511. package/corpus/templates/slides-2/app/components/deck/SlideRenderer.tsx +1553 -0
  512. package/corpus/templates/slides-2/app/components/design-system/DesignSystemCard.tsx +235 -0
  513. package/corpus/templates/slides-2/app/components/design-system/DesignSystemSetup.tsx +2021 -0
  514. package/corpus/templates/slides-2/app/components/design-system/builder-design-system-upload.ts +200 -0
  515. package/corpus/templates/slides-2/app/components/design-system/builder-index-response.ts +104 -0
  516. package/corpus/templates/slides-2/app/components/editor/AddSlidePopover.tsx +461 -0
  517. package/corpus/templates/slides-2/app/components/editor/AiEditingMarker.tsx +24 -0
  518. package/corpus/templates/slides-2/app/components/editor/AlignmentGuides.tsx +82 -0
  519. package/corpus/templates/slides-2/app/components/editor/AnimationsPanel.tsx +698 -0
  520. package/corpus/templates/slides-2/app/components/editor/AppMenu.tsx +356 -0
  521. package/corpus/templates/slides-2/app/components/editor/AssetLibraryPanel.tsx +508 -0
  522. package/corpus/templates/slides-2/app/components/editor/BlockBubbleMenu.tsx +548 -0
  523. package/corpus/templates/slides-2/app/components/editor/DeckAccessDeniedPage.tsx +173 -0
  524. package/corpus/templates/slides-2/app/components/editor/DeckEditorSkeleton.tsx +35 -0
  525. package/corpus/templates/slides-2/app/components/editor/DeferredPopoverFallback.tsx +148 -0
  526. package/corpus/templates/slides-2/app/components/editor/EditorActionCluster.tsx +217 -0
  527. package/corpus/templates/slides-2/app/components/editor/EditorSidebar.tsx +1047 -0
  528. package/corpus/templates/slides-2/app/components/editor/EditorToolbar.tsx +1285 -0
  529. package/corpus/templates/slides-2/app/components/editor/ExportMenu.tsx +579 -0
  530. package/corpus/templates/slides-2/app/components/editor/GeneratingOverlay.tsx +21 -0
  531. package/corpus/templates/slides-2/app/components/editor/GeneratingSlidePreview.tsx +73 -0
  532. package/corpus/templates/slides-2/app/components/editor/GoogleDocImportHint.tsx +378 -0
  533. package/corpus/templates/slides-2/app/components/editor/GoogleDriveConnectionCta.tsx +154 -0
  534. package/corpus/templates/slides-2/app/components/editor/GoogleSlidesReferenceImport.tsx +299 -0
  535. package/corpus/templates/slides-2/app/components/editor/HistoryPanel.tsx +354 -0
  536. package/corpus/templates/slides-2/app/components/editor/HomeQuickStartDialog.tsx +202 -0
  537. package/corpus/templates/slides-2/app/components/editor/ImageCropOverlay.tsx +820 -0
  538. package/corpus/templates/slides-2/app/components/editor/ImageDropPromptPopover.tsx +280 -0
  539. package/corpus/templates/slides-2/app/components/editor/ImageGenPanel.tsx +244 -0
  540. package/corpus/templates/slides-2/app/components/editor/ImageOverlay.tsx +280 -0
  541. package/corpus/templates/slides-2/app/components/editor/ImageSearchPanel.tsx +183 -0
  542. package/corpus/templates/slides-2/app/components/editor/ImportDeckButton.tsx +247 -0
  543. package/corpus/templates/slides-2/app/components/editor/LogoSearchPanel.tsx +366 -0
  544. package/corpus/templates/slides-2/app/components/editor/MermaidToExcalidrawPanel.tsx +99 -0
  545. package/corpus/templates/slides-2/app/components/editor/MissingDeckAccessPane.tsx +219 -0
  546. package/corpus/templates/slides-2/app/components/editor/NewDeckReferenceStep.tsx +812 -0
  547. package/corpus/templates/slides-2/app/components/editor/PromptDialog.tsx +963 -0
  548. package/corpus/templates/slides-2/app/components/editor/QuestionFlow.tsx +119 -0
  549. package/corpus/templates/slides-2/app/components/editor/RequestDeckAccessDialog.tsx +101 -0
  550. package/corpus/templates/slides-2/app/components/editor/ShareDialog.tsx +126 -0
  551. package/corpus/templates/slides-2/app/components/editor/SlideContextToolbar.tsx +1471 -0
  552. package/corpus/templates/slides-2/app/components/editor/SlideEditor.tsx +11183 -0
  553. package/corpus/templates/slides-2/app/components/editor/SlideOverflowWarning.tsx +82 -0
  554. package/corpus/templates/slides-2/app/components/editor/SlideScrollStack.tsx +307 -0
  555. package/corpus/templates/slides-2/app/components/editor/SlideSlashCommandMenu.tsx +692 -0
  556. package/corpus/templates/slides-2/app/components/editor/SlideThumbnailContextMenu.tsx +52 -0
  557. package/corpus/templates/slides-2/app/components/editor/SlideTransitionControl.tsx +184 -0
  558. package/corpus/templates/slides-2/app/components/editor/SlidesComposerContext.tsx +789 -0
  559. package/corpus/templates/slides-2/app/components/editor/SlidesComposerContextProvider.tsx +74 -0
  560. package/corpus/templates/slides-2/app/components/editor/SlidesLayersPanel.tsx +377 -0
  561. package/corpus/templates/slides-2/app/components/editor/SpeakerNotesPanel.tsx +119 -0
  562. package/corpus/templates/slides-2/app/components/editor/TweaksPanel.tsx +77 -0
  563. package/corpus/templates/slides-2/app/components/editor/UploadStorageGate.tsx +37 -0
  564. package/corpus/templates/slides-2/app/components/editor/bullet-editing.ts +880 -0
  565. package/corpus/templates/slides-2/app/components/editor/canvas-interactions/index.ts +12 -0
  566. package/corpus/templates/slides-2/app/components/editor/canvas-interactions/slides-canvas-adapter.ts +119 -0
  567. package/corpus/templates/slides-2/app/components/editor/commit-active-edit.ts +14 -0
  568. package/corpus/templates/slides-2/app/components/editor/editor-command-model.ts +35 -0
  569. package/corpus/templates/slides-2/app/components/editor/fit-text-object.ts +31 -0
  570. package/corpus/templates/slides-2/app/components/editor/in-place-text-session.browser-cases.json +983 -0
  571. package/corpus/templates/slides-2/app/components/editor/in-place-text-session.browser-host.ts +747 -0
  572. package/corpus/templates/slides-2/app/components/editor/in-place-text-session.ts +6891 -0
  573. package/corpus/templates/slides-2/app/components/editor/inline-edit-session.ts +26 -0
  574. package/corpus/templates/slides-2/app/components/editor/list-editing.ts +501 -0
  575. package/corpus/templates/slides-2/app/components/editor/rich-text-selection.ts +975 -0
  576. package/corpus/templates/slides-2/app/components/editor/rte-test-utils.ts +265 -0
  577. package/corpus/templates/slides-2/app/components/editor/selection-overlay-measurement.ts +191 -0
  578. package/corpus/templates/slides-2/app/components/editor/slide-escape-arbiter.ts +34 -0
  579. package/corpus/templates/slides-2/app/components/editor/slide-object-interactions.ts +6362 -0
  580. package/corpus/templates/slides-2/app/components/editor/slide-object-transform.browser-host.ts +19 -0
  581. package/corpus/templates/slides-2/app/components/editor/slide-pointer-target.ts +432 -0
  582. package/corpus/templates/slides-2/app/components/editor/slide-presence.ts +13 -0
  583. package/corpus/templates/slides-2/app/components/editor/slide-style.ts +243 -0
  584. package/corpus/templates/slides-2/app/components/editor/slide-text-targets.ts +540 -0
  585. package/corpus/templates/slides-2/app/components/editor/style-clipboard.ts +102 -0
  586. package/corpus/templates/slides-2/app/components/editor/use-prompt-import.ts +159 -0
  587. package/corpus/templates/slides-2/app/components/home/SlidesHomeLibrary.tsx +79 -0
  588. package/corpus/templates/slides-2/app/components/layout/AgentWorkIndicator.tsx +193 -0
  589. package/corpus/templates/slides-2/app/components/layout/Header.tsx +110 -0
  590. package/corpus/templates/slides-2/app/components/layout/Layout.tsx +492 -0
  591. package/corpus/templates/slides-2/app/components/layout/Sidebar.tsx +109 -0
  592. package/corpus/templates/slides-2/app/components/layout/layout-route-policy.ts +28 -0
  593. package/corpus/templates/slides-2/app/components/presentation/PresentationView.tsx +1116 -0
  594. package/corpus/templates/slides-2/app/components/presentation/PresenterView.tsx +526 -0
  595. package/corpus/templates/slides-2/app/components/presentation/SlideTransitionStage.tsx +297 -0
  596. package/corpus/templates/slides-2/app/components/presentation/present-channel.ts +31 -0
  597. package/corpus/templates/slides-2/app/components/presentation/slide-build-steps.ts +231 -0
  598. package/corpus/templates/slides-2/app/components/presentation/slide-navigation.ts +273 -0
  599. package/corpus/templates/slides-2/app/components/presentation/slide-transition-motion.ts +258 -0
  600. package/corpus/templates/slides-2/app/components/presentation/voice-navigation.ts +61 -0
  601. package/corpus/templates/slides-2/app/components/settings/notification-settings.tsx +93 -0
  602. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2AssetBrowser.tsx +726 -0
  603. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2CommandMenu.tsx +453 -0
  604. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2Comments.tsx +571 -0
  605. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2DesignTokens.tsx +345 -0
  606. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2Editor.tsx +4804 -0
  607. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2ExportMenu.tsx +671 -0
  608. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2FontBrowser.tsx +342 -0
  609. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2ImageCropControls.tsx +487 -0
  610. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2Inspector.tsx +950 -0
  611. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2SvglLogoSearchDialog.tsx +332 -0
  612. package/corpus/templates/slides-2/app/components/slides-2-editor/cross-slide-edit-history.ts +151 -0
  613. package/corpus/templates/slides-2/app/components/slides-2-editor/design-token-presets.ts +140 -0
  614. package/corpus/templates/slides-2/app/components/slides-2-editor/editor-action-errors.ts +47 -0
  615. package/corpus/templates/slides-2/app/components/slides-2-editor/editor-export-errors.ts +60 -0
  616. package/corpus/templates/slides-2/app/components/slides-2-editor/geometry.ts +275 -0
  617. package/corpus/templates/slides-2/app/components/slides-2-editor/image-crop-style.ts +82 -0
  618. package/corpus/templates/slides-2/app/components/slides-2-editor/inline-text-editor.tsx +631 -0
  619. package/corpus/templates/slides-2/app/components/slides-2-editor/keyboard-shortcuts.ts +104 -0
  620. package/corpus/templates/slides-2/app/components/slides-2-editor/object-insertion.ts +13 -0
  621. package/corpus/templates/slides-2/app/components/slides-2-editor/preview-patches.ts +54 -0
  622. package/corpus/templates/slides-2/app/components/slides-2-editor/sandbox-render-errors.ts +23 -0
  623. package/corpus/templates/slides-2/app/components/slides-2-editor/source-structure.ts +634 -0
  624. package/corpus/templates/slides-2/app/components/slides-2-editor/types.ts +85 -0
  625. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2BlackoutOverlay.tsx +13 -0
  626. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2ControlBar.tsx +285 -0
  627. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2HelpDialog.tsx +72 -0
  628. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2JumpInput.tsx +38 -0
  629. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2LaserPointer.tsx +67 -0
  630. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2Overview.tsx +161 -0
  631. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2Player.tsx +839 -0
  632. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2ProgressBar.tsx +23 -0
  633. package/corpus/templates/slides-2/app/components/slides-2-presenter/keyboard.ts +36 -0
  634. package/corpus/templates/slides-2/app/components/slides-2-presenter/presenter-channel.ts +131 -0
  635. package/corpus/templates/slides-2/app/components/slides-2-presenter/use-presenter-action-bridge.ts +296 -0
  636. package/corpus/templates/slides-2/app/components/slides-2-presenter/useSlides2TouchSwipe.ts +80 -0
  637. package/corpus/templates/slides-2/app/components/slides-2-runtime/SandboxedSlide.tsx +724 -0
  638. package/corpus/templates/slides-2/app/components/slides-2-runtime/SlideContentRenderer.tsx +137 -0
  639. package/corpus/templates/slides-2/app/components/slides-2-runtime/Slides2Canvas.tsx +99 -0
  640. package/corpus/templates/slides-2/app/components/slides-2-runtime/constants.ts +4 -0
  641. package/corpus/templates/slides-2/app/components/slides-2-runtime/protocol.ts +1400 -0
  642. package/corpus/templates/slides-2/app/components/slides-2-runtime/transition-frame.ts +439 -0
  643. package/corpus/templates/slides-2/app/components/templates/DeckTemplateLibrary.tsx +314 -0
  644. package/corpus/templates/slides-2/app/components/templates/DeckTemplatePreview.tsx +60 -0
  645. package/corpus/templates/slides-2/app/components/templates/DeckTemplateStage.tsx +45 -0
  646. package/corpus/templates/slides-2/app/components/ui/alert-dialog.tsx +1 -0
  647. package/corpus/templates/slides-2/app/components/ui/avatar.tsx +1 -0
  648. package/corpus/templates/slides-2/app/components/ui/button-group.tsx +1 -0
  649. package/corpus/templates/slides-2/app/components/ui/button.tsx +1 -0
  650. package/corpus/templates/slides-2/app/components/ui/card.tsx +1 -0
  651. package/corpus/templates/slides-2/app/components/ui/command.tsx +1 -0
  652. package/corpus/templates/slides-2/app/components/ui/context-menu.tsx +32 -0
  653. package/corpus/templates/slides-2/app/components/ui/dialog.tsx +1 -0
  654. package/corpus/templates/slides-2/app/components/ui/dropdown-menu.tsx +1 -0
  655. package/corpus/templates/slides-2/app/components/ui/filter-trigger.tsx +1 -0
  656. package/corpus/templates/slides-2/app/components/ui/input.tsx +1 -0
  657. package/corpus/templates/slides-2/app/components/ui/label.tsx +1 -0
  658. package/corpus/templates/slides-2/app/components/ui/popover.tsx +1 -0
  659. package/corpus/templates/slides-2/app/components/ui/progress.tsx +1 -0
  660. package/corpus/templates/slides-2/app/components/ui/scroll-area.tsx +1 -0
  661. package/corpus/templates/slides-2/app/components/ui/select.tsx +1 -0
  662. package/corpus/templates/slides-2/app/components/ui/separator.tsx +1 -0
  663. package/corpus/templates/slides-2/app/components/ui/sheet.tsx +1 -0
  664. package/corpus/templates/slides-2/app/components/ui/skeleton.tsx +1 -0
  665. package/corpus/templates/slides-2/app/components/ui/slider.tsx +1 -0
  666. package/corpus/templates/slides-2/app/components/ui/spinner.tsx +1 -0
  667. package/corpus/templates/slides-2/app/components/ui/switch.tsx +1 -0
  668. package/corpus/templates/slides-2/app/components/ui/tabs.tsx +59 -0
  669. package/corpus/templates/slides-2/app/components/ui/textarea.tsx +1 -0
  670. package/corpus/templates/slides-2/app/components/ui/toggle-group.tsx +1 -0
  671. package/corpus/templates/slides-2/app/components/ui/toolkit-provider.tsx +17 -0
  672. package/corpus/templates/slides-2/app/components/ui/tooltip.tsx +1 -0
  673. package/corpus/templates/slides-2/app/components/visual-editor/CanvasCommentPins.tsx +46 -0
  674. package/corpus/templates/slides-2/app/components/visual-editor/DrawOverlay.tsx +27 -0
  675. package/corpus/templates/slides-2/app/components/visual-editor/MultiSelectChip.tsx +97 -0
  676. package/corpus/templates/slides-2/app/components/visual-editor/SaveStatusIndicator.tsx +273 -0
  677. package/corpus/templates/slides-2/app/components/visual-editor/index.ts +4 -0
  678. package/corpus/templates/slides-2/app/context/DeckContext.tsx +7486 -0
  679. package/corpus/templates/slides-2/app/design-system.ts +3 -0
  680. package/corpus/templates/slides-2/app/entry.client.tsx +10 -0
  681. package/corpus/templates/slides-2/app/entry.server.tsx +10 -0
  682. package/corpus/templates/slides-2/app/global.css +1626 -0
  683. package/corpus/templates/slides-2/app/hooks/use-agent-generating.ts +517 -0
  684. package/corpus/templates/slides-2/app/hooks/use-compact-editor-layout.ts +26 -0
  685. package/corpus/templates/slides-2/app/hooks/use-contrast-audit-bridge.ts +49 -0
  686. package/corpus/templates/slides-2/app/hooks/use-deck-access-reload.ts +70 -0
  687. package/corpus/templates/slides-2/app/hooks/use-deck-access.ts +50 -0
  688. package/corpus/templates/slides-2/app/hooks/use-deck-design-system.ts +146 -0
  689. package/corpus/templates/slides-2/app/hooks/use-deck-history-action-bridge.ts +266 -0
  690. package/corpus/templates/slides-2/app/hooks/use-deck-presence.ts +89 -0
  691. package/corpus/templates/slides-2/app/hooks/use-deck-role.ts +46 -0
  692. package/corpus/templates/slides-2/app/hooks/use-deck-versions.ts +43 -0
  693. package/corpus/templates/slides-2/app/hooks/use-design-system-workflows.ts +11 -0
  694. package/corpus/templates/slides-2/app/hooks/use-design-systems.ts +31 -0
  695. package/corpus/templates/slides-2/app/hooks/use-generating-slide-preview.ts +115 -0
  696. package/corpus/templates/slides-2/app/hooks/use-navigation-state.ts +229 -0
  697. package/corpus/templates/slides-2/app/hooks/use-new-deck-generation-signal.ts +46 -0
  698. package/corpus/templates/slides-2/app/hooks/use-new-deck-generation.ts +710 -0
  699. package/corpus/templates/slides-2/app/hooks/use-sidebar-collapsed.ts +95 -0
  700. package/corpus/templates/slides-2/app/hooks/use-slide-comments.ts +202 -0
  701. package/corpus/templates/slides-2/app/hooks/use-slide-file-storage-status.ts +55 -0
  702. package/corpus/templates/slides-2/app/hooks/use-undo-selection.ts +66 -0
  703. package/corpus/templates/slides-2/app/hooks/use-workspace-defaults.ts +31 -0
  704. package/corpus/templates/slides-2/app/i18n/en-US.ts +1507 -0
  705. package/corpus/templates/slides-2/app/i18n/index.ts +19 -0
  706. package/corpus/templates/slides-2/app/lib/agent-visible-message.ts +21 -0
  707. package/corpus/templates/slides-2/app/lib/aspect-ratios.ts +7 -0
  708. package/corpus/templates/slides-2/app/lib/asset-error-copy.ts +59 -0
  709. package/corpus/templates/slides-2/app/lib/canvas-zoom.ts +47 -0
  710. package/corpus/templates/slides-2/app/lib/composer-context.ts +152 -0
  711. package/corpus/templates/slides-2/app/lib/composer-draft.ts +34 -0
  712. package/corpus/templates/slides-2/app/lib/contrast-audit.ts +390 -0
  713. package/corpus/templates/slides-2/app/lib/contrast-resolve.ts +240 -0
  714. package/corpus/templates/slides-2/app/lib/create-deck-generation.ts +938 -0
  715. package/corpus/templates/slides-2/app/lib/deck-access-lost.ts +4 -0
  716. package/corpus/templates/slides-2/app/lib/deck-backup.ts +186 -0
  717. package/corpus/templates/slides-2/app/lib/deck-editor-loading.ts +91 -0
  718. package/corpus/templates/slides-2/app/lib/deck-export-file-client.ts +77 -0
  719. package/corpus/templates/slides-2/app/lib/deck-filter.ts +52 -0
  720. package/corpus/templates/slides-2/app/lib/deck-list-loading.ts +16 -0
  721. package/corpus/templates/slides-2/app/lib/deck-preview-frame.ts +15 -0
  722. package/corpus/templates/slides-2/app/lib/deck-share-links.ts +9 -0
  723. package/corpus/templates/slides-2/app/lib/deck-sorting.ts +19 -0
  724. package/corpus/templates/slides-2/app/lib/deferred-editor-surfaces.ts +24 -0
  725. package/corpus/templates/slides-2/app/lib/design-system-selection.ts +11 -0
  726. package/corpus/templates/slides-2/app/lib/design-systems.ts +231 -0
  727. package/corpus/templates/slides-2/app/lib/dynamic-import.ts +50 -0
  728. package/corpus/templates/slides-2/app/lib/editor-agent-handoff.ts +92 -0
  729. package/corpus/templates/slides-2/app/lib/editor-shortcuts.ts +153 -0
  730. package/corpus/templates/slides-2/app/lib/export-google-slides-client.ts +168 -0
  731. package/corpus/templates/slides-2/app/lib/export-pdf-client.ts +684 -0
  732. package/corpus/templates/slides-2/app/lib/export-pptx-client.ts +2420 -0
  733. package/corpus/templates/slides-2/app/lib/generation-lifecycle.ts +24 -0
  734. package/corpus/templates/slides-2/app/lib/generation-state.ts +247 -0
  735. package/corpus/templates/slides-2/app/lib/google-docs-client.ts +110 -0
  736. package/corpus/templates/slides-2/app/lib/google-slides-export-availability-client.ts +53 -0
  737. package/corpus/templates/slides-2/app/lib/google-slides-reference-source.ts +18 -0
  738. package/corpus/templates/slides-2/app/lib/image-download.ts +85 -0
  739. package/corpus/templates/slides-2/app/lib/image-drop-to-agent.ts +210 -0
  740. package/corpus/templates/slides-2/app/lib/import-uploaded-deck.ts +132 -0
  741. package/corpus/templates/slides-2/app/lib/inline-edit-remote.ts +55 -0
  742. package/corpus/templates/slides-2/app/lib/localize-slides-changelog.ts +47 -0
  743. package/corpus/templates/slides-2/app/lib/mermaid-blocks.ts +18 -0
  744. package/corpus/templates/slides-2/app/lib/new-deck-reference-selection.ts +174 -0
  745. package/corpus/templates/slides-2/app/lib/normalize-slide-padding.ts +74 -0
  746. package/corpus/templates/slides-2/app/lib/pending-deck-changes.ts +33 -0
  747. package/corpus/templates/slides-2/app/lib/portaled-layer.ts +7 -0
  748. package/corpus/templates/slides-2/app/lib/pptx-google-slides.ts +204 -0
  749. package/corpus/templates/slides-2/app/lib/prompt-attachment-adapter.ts +37 -0
  750. package/corpus/templates/slides-2/app/lib/prompt-file-uploads.ts +557 -0
  751. package/corpus/templates/slides-2/app/lib/recent-references.ts +106 -0
  752. package/corpus/templates/slides-2/app/lib/reference-document-hydration.ts +406 -0
  753. package/corpus/templates/slides-2/app/lib/register-chat-renderers.tsx +645 -0
  754. package/corpus/templates/slides-2/app/lib/reveal-after-delete.ts +55 -0
  755. package/corpus/templates/slides-2/app/lib/sanitize-slide-html.ts +752 -0
  756. package/corpus/templates/slides-2/app/lib/slide-agent-context.ts +148 -0
  757. package/corpus/templates/slides-2/app/lib/slide-animation-elements.ts +900 -0
  758. package/corpus/templates/slides-2/app/lib/slide-clipboard.ts +534 -0
  759. package/corpus/templates/slides-2/app/lib/slide-comment-anchor.ts +286 -0
  760. package/corpus/templates/slides-2/app/lib/slide-content-merge.ts +295 -0
  761. package/corpus/templates/slides-2/app/lib/slide-image-replacement.ts +1919 -0
  762. package/corpus/templates/slides-2/app/lib/slide-live-remote.ts +215 -0
  763. package/corpus/templates/slides-2/app/lib/slide-scroll.ts +56 -0
  764. package/corpus/templates/slides-2/app/lib/slide-source-map.ts +1099 -0
  765. package/corpus/templates/slides-2/app/lib/slide-video.ts +390 -0
  766. package/corpus/templates/slides-2/app/lib/slides-relay-tracking.ts +114 -0
  767. package/corpus/templates/slides-2/app/lib/streaming-slide-html.ts +77 -0
  768. package/corpus/templates/slides-2/app/lib/tab-id.ts +3 -0
  769. package/corpus/templates/slides-2/app/lib/template-navigation.ts +15 -0
  770. package/corpus/templates/slides-2/app/lib/text-tool-shortcut.ts +75 -0
  771. package/corpus/templates/slides-2/app/lib/undo-reveal.ts +332 -0
  772. package/corpus/templates/slides-2/app/lib/upload-response.ts +107 -0
  773. package/corpus/templates/slides-2/app/lib/utils.ts +38 -0
  774. package/corpus/templates/slides-2/app/lib/validate-native-slide-html.ts +177 -0
  775. package/corpus/templates/slides-2/app/lib/video-upload.ts +354 -0
  776. package/corpus/templates/slides-2/app/pages/DeckEditor.tsx +6158 -0
  777. package/corpus/templates/slides-2/app/pages/DesignSystems.tsx +363 -0
  778. package/corpus/templates/slides-2/app/pages/Index.tsx +3254 -0
  779. package/corpus/templates/slides-2/app/pages/NotFound.tsx +33 -0
  780. package/corpus/templates/slides-2/app/pages/Presentation.tsx +120 -0
  781. package/corpus/templates/slides-2/app/pages/SharedPresentation.tsx +174 -0
  782. package/corpus/templates/slides-2/app/pages/SlideThemeDetail.tsx +227 -0
  783. package/corpus/templates/slides-2/app/pages/SlideThemes.tsx +155 -0
  784. package/corpus/templates/slides-2/app/pages/Slides2EditorPage.tsx +1618 -0
  785. package/corpus/templates/slides-2/app/pages/Slides2PresenterConsolePage.tsx +937 -0
  786. package/corpus/templates/slides-2/app/pages/Slides2PresenterPage.tsx +979 -0
  787. package/corpus/templates/slides-2/app/pages/Templates.tsx +32 -0
  788. package/corpus/templates/slides-2/app/root.tsx +391 -0
  789. package/corpus/templates/slides-2/app/routes/$.tsx +10 -0
  790. package/corpus/templates/slides-2/app/routes/_index.tsx +1 -0
  791. package/corpus/templates/slides-2/app/routes/access-request.approve.tsx +276 -0
  792. package/corpus/templates/slides-2/app/routes/agent.tsx +19 -0
  793. package/corpus/templates/slides-2/app/routes/chat.$threadId.tsx +1 -0
  794. package/corpus/templates/slides-2/app/routes/chat.tsx +190 -0
  795. package/corpus/templates/slides-2/app/routes/deck.$id.tsx +10 -0
  796. package/corpus/templates/slides-2/app/routes/deck.$id_.present.tsx +10 -0
  797. package/corpus/templates/slides-2/app/routes/design-systems.tsx +10 -0
  798. package/corpus/templates/slides-2/app/routes/extensions.$id.$slug.tsx +2 -0
  799. package/corpus/templates/slides-2/app/routes/extensions.$id.tsx +5 -0
  800. package/corpus/templates/slides-2/app/routes/extensions._index.tsx +5 -0
  801. package/corpus/templates/slides-2/app/routes/extensions.tsx +5 -0
  802. package/corpus/templates/slides-2/app/routes/home-layout.tsx +31 -0
  803. package/corpus/templates/slides-2/app/routes/home.tsx +22 -0
  804. package/corpus/templates/slides-2/app/routes/p.$id.tsx +195 -0
  805. package/corpus/templates/slides-2/app/routes/settings.$.tsx +1 -0
  806. package/corpus/templates/slides-2/app/routes/settings.tsx +131 -0
  807. package/corpus/templates/slides-2/app/routes/share.$token.tsx +137 -0
  808. package/corpus/templates/slides-2/app/routes/slide.tsx +209 -0
  809. package/corpus/templates/slides-2/app/routes/team.tsx +11 -0
  810. package/corpus/templates/slides-2/app/routes/templates.tsx +1 -0
  811. package/corpus/templates/slides-2/app/routes/themes.$id.tsx +1 -0
  812. package/corpus/templates/slides-2/app/routes/themes.tsx +1 -0
  813. package/corpus/templates/slides-2/app/routes.ts +24 -0
  814. package/corpus/templates/slides-2/app/vite-env.d.ts +24 -0
  815. package/corpus/templates/slides-2/changelog/2026-10-17-find-and-switch-decks-from-the-presenter-console.md +6 -0
  816. package/corpus/templates/slides-2/changelog/2026-10-17-meet-slides-2-create-and-refine-editable-slide-decks-with-an.md +6 -0
  817. package/corpus/templates/slides-2/changelog/2026-10-17-pptx-image-export.md +6 -0
  818. package/corpus/templates/slides-2/changelog/2026-10-17-visual-editor.md +6 -0
  819. package/corpus/templates/slides-2/changelog/2026-10-18-apply-an-accessible-design-system-to-an-existing-deck-before.md +6 -0
  820. package/corpus/templates/slides-2/changelog/2026-10-18-choose-a-template-or-start-a-new-presentation-from-the-slide.md +6 -0
  821. package/corpus/templates/slides-2/changelog/2026-10-18-generate-decks-from-a-prompt-then-edit-slide-elements-direct.md +6 -0
  822. package/corpus/templates/slides-2/changelog/2026-10-18-generate-presentation-decks-from-a-prompt-and-edit-every-sli.md +6 -0
  823. package/corpus/templates/slides-2/changelog/2026-10-18-new-presentation-drafts-save-before-generation-starts-so-you.md +6 -0
  824. package/corpus/templates/slides-2/changelog/2026-10-18-the-assistant-can-undo-redo-and-save-pending-edits-in-the-vi.md +6 -0
  825. package/corpus/templates/slides-2/changelog/2026-10-19-agents-can-insert-duplicate-and-delete-canvas-objects-in-sou.md +6 -0
  826. package/corpus/templates/slides-2/changelog/2026-10-19-browse-slide-themes.md +6 -0
  827. package/corpus/templates/slides-2/changelog/2026-10-19-clicking-a-slide-preview-in-overview-selects-that-slide.md +6 -0
  828. package/corpus/templates/slides-2/changelog/2026-10-19-create-decks-from-a-prompt-and-edit-slides-directly-on-the-c.md +6 -0
  829. package/corpus/templates/slides-2/changelog/2026-10-19-creating-and-editing-decks-now-starts-with-the-tools-most-re.md +6 -0
  830. package/corpus/templates/slides-2/changelog/2026-10-19-deleting-decks-revokes-public-links.md +7 -0
  831. package/corpus/templates/slides-2/changelog/2026-10-19-escape-cancels-an-in-progress-slide-drag-without-losing-earl.md +6 -0
  832. package/corpus/templates/slides-2/changelog/2026-10-19-import-failures-now-show-clear-localized-descriptions-instea.md +6 -0
  833. package/corpus/templates/slides-2/changelog/2026-10-19-presenter-controls-stay-responsive-when-moving-over-the-slid.md +6 -0
  834. package/corpus/templates/slides-2/changelog/2026-10-19-presenter-notes-stay-private-from-viewers-and-commenters.md +6 -0
  835. package/corpus/templates/slides-2/changelog/2026-10-19-preview-generated-slides-in-chat.md +6 -0
  836. package/corpus/templates/slides-2/changelog/2026-10-19-remote-image-previews-accept-supported-raster-formats.md +6 -0
  837. package/corpus/templates/slides-2/changelog/2026-10-19-search-the-svgl-catalog-and-add-svg-logos-to-a-deck-or-the-g.md +6 -0
  838. package/corpus/templates/slides-2/changelog/2026-10-19-slide-generation-explains-when-react-effect-hooks-cannot-run.md +6 -0
  839. package/corpus/templates/slides-2/changelog/2026-10-19-the-editor-highlights-hovered-objects-and-keeps-image-replac.md +6 -0
  840. package/corpus/templates/slides-2/changelog/2026-10-19-the-slide-editor-uses-the-shared-agent-native-controls.md +6 -0
  841. package/corpus/templates/slides-2/changelog/2026-10-20-deck-editing-controls-match-the-workspace.md +6 -0
  842. package/corpus/templates/slides-2/changelog/2026-10-20-google-slides-imports-now-report-missing-image-data-instead-.md +6 -0
  843. package/corpus/templates/slides-2/changelog/2026-10-20-imports-and-previews-handle-large-content-safely.md +6 -0
  844. package/corpus/templates/slides-2/changelog/2026-10-20-public-deck-pages-can-export-source-backed-slides-to-pdf.md +6 -0
  845. package/corpus/templates/slides-2/changelog/2026-10-20-saved-slide-images-stay-available.md +6 -0
  846. package/corpus/templates/slides-2/changelog/2026-10-20-scope-global-media-picks-to-assets-the-current-deck-can-reso.md +6 -0
  847. package/corpus/templates/slides-2/components.json +20 -0
  848. package/corpus/templates/slides-2/drizzle.config.ts +3 -0
  849. package/corpus/templates/slides-2/learnings.defaults.md +5 -0
  850. package/corpus/templates/slides-2/netlify.toml +24 -0
  851. package/corpus/templates/slides-2/package.json +147 -0
  852. package/corpus/templates/slides-2/public/agent-native-icon-dark.svg +10 -0
  853. package/corpus/templates/slides-2/public/agent-native-icon-light.svg +10 -0
  854. package/corpus/templates/slides-2/public/agent-native-logo-dark.svg +21 -0
  855. package/corpus/templates/slides-2/public/agent-native-logo-light.svg +21 -0
  856. package/corpus/templates/slides-2/public/assets/builder-logo-white.svg +15 -0
  857. package/corpus/templates/slides-2/public/assets/generated/preview.html +61 -0
  858. package/corpus/templates/slides-2/public/assets/intuit-logo-white.svg +6 -0
  859. package/corpus/templates/slides-2/public/assets/walmart-logo-white.svg +6 -0
  860. package/corpus/templates/slides-2/public/chatgpt-plugin-icon.svg +7 -0
  861. package/corpus/templates/slides-2/public/favicon.svg +1 -0
  862. package/corpus/templates/slides-2/public/icon-180.svg +1 -0
  863. package/corpus/templates/slides-2/public/icon-192.svg +1 -0
  864. package/corpus/templates/slides-2/public/icon-512.svg +1 -0
  865. package/corpus/templates/slides-2/public/manifest.json +20 -0
  866. package/corpus/templates/slides-2/public/placeholder.svg +1 -0
  867. package/corpus/templates/slides-2/public/robots.txt +14 -0
  868. package/corpus/templates/slides-2/public/visual-edit-structure-proof.html +99 -0
  869. package/corpus/templates/slides-2/react-router.config.ts +7 -0
  870. package/corpus/templates/slides-2/scripts/edit-fidelity/README.md +499 -0
  871. package/corpus/templates/slides-2/scripts/edit-fidelity/authoring-fuzz.ts +9517 -0
  872. package/corpus/templates/slides-2/scripts/edit-fidelity/baseline.json +16427 -0
  873. package/corpus/templates/slides-2/scripts/edit-fidelity/dev-server-url.ts +10 -0
  874. package/corpus/templates/slides-2/scripts/edit-fidelity/lib/in-page.ts +1975 -0
  875. package/corpus/templates/slides-2/scripts/edit-fidelity/lib/metrics.ts +1401 -0
  876. package/corpus/templates/slides-2/scripts/edit-fidelity/retry-infra.ts +7 -0
  877. package/corpus/templates/slides-2/scripts/edit-fidelity/run-options.ts +21 -0
  878. package/corpus/templates/slides-2/scripts/edit-fidelity/run-outcomes.ts +127 -0
  879. package/corpus/templates/slides-2/scripts/edit-fidelity/run.ts +8451 -0
  880. package/corpus/templates/slides-2/scripts/export-fidelity/README.md +116 -0
  881. package/corpus/templates/slides-2/scripts/export-fidelity/compare-layout-lib.ts +241 -0
  882. package/corpus/templates/slides-2/scripts/export-fidelity/compare-layout.ts +30 -0
  883. package/corpus/templates/slides-2/scripts/export-fidelity/diff.ts +222 -0
  884. package/corpus/templates/slides-2/scripts/export-fidelity/export.ts +765 -0
  885. package/corpus/templates/slides-2/scripts/export-fidelity/fixtures/agent-dark-deck.json +48 -0
  886. package/corpus/templates/slides-2/scripts/export-fidelity/generate-calibration.ts +765 -0
  887. package/corpus/templates/slides-2/scripts/export-fidelity/google-export.ts +137 -0
  888. package/corpus/templates/slides-2/scripts/export-fidelity/google-layout.ts +82 -0
  889. package/corpus/templates/slides-2/scripts/export-fidelity/resolve-pkg.ts +29 -0
  890. package/corpus/templates/slides-2/scripts/migrate-production.ts +22 -0
  891. package/corpus/templates/slides-2/server/db/index.ts +73 -0
  892. package/corpus/templates/slides-2/server/db/schema.ts +189 -0
  893. package/corpus/templates/slides-2/server/handlers/assets-url.ts +13 -0
  894. package/corpus/templates/slides-2/server/handlers/assets.ts +3217 -0
  895. package/corpus/templates/slides-2/server/handlers/decks.ts +185 -0
  896. package/corpus/templates/slides-2/server/handlers/demo.ts +9 -0
  897. package/corpus/templates/slides-2/server/handlers/design-systems.ts +219 -0
  898. package/corpus/templates/slides-2/server/handlers/google-docs-auth.ts +165 -0
  899. package/corpus/templates/slides-2/server/handlers/image-gen.ts +153 -0
  900. package/corpus/templates/slides-2/server/handlers/image-providers/gemini.ts +209 -0
  901. package/corpus/templates/slides-2/server/handlers/image-providers/index.ts +61 -0
  902. package/corpus/templates/slides-2/server/handlers/image-providers/openai.ts +288 -0
  903. package/corpus/templates/slides-2/server/handlers/image-providers/types.ts +35 -0
  904. package/corpus/templates/slides-2/server/handlers/import/docx-parser.ts +31 -0
  905. package/corpus/templates/slides-2/server/handlers/import/html-converter.ts +1534 -0
  906. package/corpus/templates/slides-2/server/handlers/import/pdf-fidelity-parser.ts +1039 -0
  907. package/corpus/templates/slides-2/server/handlers/import/pdf-sidecar-reader.ts +81 -0
  908. package/corpus/templates/slides-2/server/handlers/import/pdf-style-digest.ts +187 -0
  909. package/corpus/templates/slides-2/server/handlers/import/pptx-assets.ts +155 -0
  910. package/corpus/templates/slides-2/server/handlers/import/pptx-parser.ts +57 -0
  911. package/corpus/templates/slides-2/server/handlers/request-auth-context.ts +108 -0
  912. package/corpus/templates/slides-2/server/handlers/share.ts +52 -0
  913. package/corpus/templates/slides-2/server/handlers/uploads-chunked.ts +1066 -0
  914. package/corpus/templates/slides-2/server/handlers/uploads.ts +457 -0
  915. package/corpus/templates/slides-2/server/lib/access-request-email.ts +66 -0
  916. package/corpus/templates/slides-2/server/lib/assets-image-delegation.ts +331 -0
  917. package/corpus/templates/slides-2/server/lib/bounded-multipart.ts +49 -0
  918. package/corpus/templates/slides-2/server/lib/builder-design-system-proxy.ts +122 -0
  919. package/corpus/templates/slides-2/server/lib/chat-attachments.ts +425 -0
  920. package/corpus/templates/slides-2/server/lib/chatgpt-directory-tools.ts +246 -0
  921. package/corpus/templates/slides-2/server/lib/chunked-upload-session.ts +195 -0
  922. package/corpus/templates/slides-2/server/lib/comment-notifications.ts +184 -0
  923. package/corpus/templates/slides-2/server/lib/deck-access-requests.ts +102 -0
  924. package/corpus/templates/slides-2/server/lib/deck-asset-scope.ts +150 -0
  925. package/corpus/templates/slides-2/server/lib/deck-export-tracking.ts +119 -0
  926. package/corpus/templates/slides-2/server/lib/deck-templates/a-case-study.ts +154 -0
  927. package/corpus/templates/slides-2/server/lib/deck-templates/a-company.ts +160 -0
  928. package/corpus/templates/slides-2/server/lib/deck-templates/a-pitch.ts +151 -0
  929. package/corpus/templates/slides-2/server/lib/deck-templates/a-quarterly.ts +264 -0
  930. package/corpus/templates/slides-2/server/lib/deck-templates/a-shared.ts +35 -0
  931. package/corpus/templates/slides-2/server/lib/deck-templates/a-update.ts +188 -0
  932. package/corpus/templates/slides-2/server/lib/deck-templates/a-workshop.ts +196 -0
  933. package/corpus/templates/slides-2/server/lib/deck-templates/b-keynote.ts +131 -0
  934. package/corpus/templates/slides-2/server/lib/deck-templates/b-lesson.ts +209 -0
  935. package/corpus/templates/slides-2/server/lib/deck-templates/b-manifesto.ts +149 -0
  936. package/corpus/templates/slides-2/server/lib/deck-templates/b-portfolio.ts +144 -0
  937. package/corpus/templates/slides-2/server/lib/deck-templates/b-research.ts +221 -0
  938. package/corpus/templates/slides-2/server/lib/deck-templates/b-roadmap.ts +264 -0
  939. package/corpus/templates/slides-2/server/lib/deck-templates/b-shared.ts +44 -0
  940. package/corpus/templates/slides-2/server/lib/deck-templates/group-a.ts +16 -0
  941. package/corpus/templates/slides-2/server/lib/deck-templates/group-b.ts +16 -0
  942. package/corpus/templates/slides-2/server/lib/deck-templates/legacy.ts +567 -0
  943. package/corpus/templates/slides-2/server/lib/deck-templates.ts +60 -0
  944. package/corpus/templates/slides-2/server/lib/deck-versions.ts +233 -0
  945. package/corpus/templates/slides-2/server/lib/design-system-workflows.ts +22 -0
  946. package/corpus/templates/slides-2/server/lib/emails.ts +84 -0
  947. package/corpus/templates/slides-2/server/lib/env-config.ts +15 -0
  948. package/corpus/templates/slides-2/server/lib/fetch-remote-image.ts +245 -0
  949. package/corpus/templates/slides-2/server/lib/generation-completion.ts +278 -0
  950. package/corpus/templates/slides-2/server/lib/google-docs-access.ts +51 -0
  951. package/corpus/templates/slides-2/server/lib/google-docs-error.ts +54 -0
  952. package/corpus/templates/slides-2/server/lib/google-docs-oauth.ts +422 -0
  953. package/corpus/templates/slides-2/server/lib/google-fonts.ts +509 -0
  954. package/corpus/templates/slides-2/server/lib/google-oauth-preflight.ts +119 -0
  955. package/corpus/templates/slides-2/server/lib/google-slides-export-availability.ts +55 -0
  956. package/corpus/templates/slides-2/server/lib/image-proxy-response.ts +16 -0
  957. package/corpus/templates/slides-2/server/lib/image-proxy-url.ts +155 -0
  958. package/corpus/templates/slides-2/server/lib/import-asset-storage.ts +214 -0
  959. package/corpus/templates/slides-2/server/lib/imported-asset-batch.ts +218 -0
  960. package/corpus/templates/slides-2/server/lib/legacy-slide-source.ts +692 -0
  961. package/corpus/templates/slides-2/server/lib/media-search-providers.ts +216 -0
  962. package/corpus/templates/slides-2/server/lib/native-creative-context.ts +295 -0
  963. package/corpus/templates/slides-2/server/lib/pdf-parse-setup.ts +115 -0
  964. package/corpus/templates/slides-2/server/lib/provider-api.ts +57 -0
  965. package/corpus/templates/slides-2/server/lib/request-wait-until.ts +30 -0
  966. package/corpus/templates/slides-2/server/lib/shared-deck.ts +29 -0
  967. package/corpus/templates/slides-2/server/lib/slide-asset-references.ts +309 -0
  968. package/corpus/templates/slides-2/server/lib/slide-content-patch.ts +1004 -0
  969. package/corpus/templates/slides-2/server/lib/slide-hygiene.ts +731 -0
  970. package/corpus/templates/slides-2/server/lib/slide-image-insertion.ts +136 -0
  971. package/corpus/templates/slides-2/server/lib/slide-reveal-issues.ts +41 -0
  972. package/corpus/templates/slides-2/server/lib/slide-source-editing/babel-walk.ts +117 -0
  973. package/corpus/templates/slides-2/server/lib/slide-source-editing/batch-edit.ts +152 -0
  974. package/corpus/templates/slides-2/server/lib/slide-source-editing/edit-ops.ts +1478 -0
  975. package/corpus/templates/slides-2/server/lib/slide-source-editing/image-target.ts +128 -0
  976. package/corpus/templates/slides-2/server/lib/slide-source-editing/text-diff.ts +23 -0
  977. package/corpus/templates/slides-2/server/lib/slide-source-limits.ts +9 -0
  978. package/corpus/templates/slides-2/server/lib/slide-source.ts +1786 -0
  979. package/corpus/templates/slides-2/server/lib/slide-theme-demo-sources.ts +2106 -0
  980. package/corpus/templates/slides-2/server/lib/slide-themes.ts +2174 -0
  981. package/corpus/templates/slides-2/server/lib/slide-worker-runtime.ts +1995 -0
  982. package/corpus/templates/slides-2/server/lib/slides-tracking.ts +73 -0
  983. package/corpus/templates/slides-2/server/lib/source-import.ts +213 -0
  984. package/corpus/templates/slides-2/server/lib/svgl.ts +364 -0
  985. package/corpus/templates/slides-2/server/lib/tenant-files.ts +179 -0
  986. package/corpus/templates/slides-2/server/lib/upload-storage-status.ts +9 -0
  987. package/corpus/templates/slides-2/server/lib/uploaded-asset-cleanup-outbox.ts +521 -0
  988. package/corpus/templates/slides-2/server/lib/uploaded-asset-object-lifecycle.ts +404 -0
  989. package/corpus/templates/slides-2/server/lib/uploaded-fonts.ts +696 -0
  990. package/corpus/templates/slides-2/server/lib/uploaded-reference-storage.ts +77 -0
  991. package/corpus/templates/slides-2/server/lib/validate-slide-animations.ts +341 -0
  992. package/corpus/templates/slides-2/server/middleware/auth.ts +6 -0
  993. package/corpus/templates/slides-2/server/plugins/_dev-upload-stub.ts +6 -0
  994. package/corpus/templates/slides-2/server/plugins/agent-chat.ts +402 -0
  995. package/corpus/templates/slides-2/server/plugins/auth.ts +31 -0
  996. package/corpus/templates/slides-2/server/plugins/collab.ts +30 -0
  997. package/corpus/templates/slides-2/server/plugins/config.ts +6 -0
  998. package/corpus/templates/slides-2/server/plugins/core-routes.ts +30 -0
  999. package/corpus/templates/slides-2/server/plugins/creative-context.ts +187 -0
  1000. package/corpus/templates/slides-2/server/plugins/db.ts +462 -0
  1001. package/corpus/templates/slides-2/server/plugins/feature-flags.ts +5 -0
  1002. package/corpus/templates/slides-2/server/plugins/labs.ts +8 -0
  1003. package/corpus/templates/slides-2/server/plugins/orphaned-asset-cleanup.ts +17 -0
  1004. package/corpus/templates/slides-2/server/plugins/otel.ts +6 -0
  1005. package/corpus/templates/slides-2/server/plugins/transactional-emails.ts +5 -0
  1006. package/corpus/templates/slides-2/server/register-secrets.ts +209 -0
  1007. package/corpus/templates/slides-2/server/routes/[...page].get.ts +5 -0
  1008. package/corpus/templates/slides-2/server/routes/[...page].head.ts +1 -0
  1009. package/corpus/templates/slides-2/server/routes/[base]/_agent-native/google-docs/auth-url.get.ts +1 -0
  1010. package/corpus/templates/slides-2/server/routes/[base]/_agent-native/google-docs/callback.get.ts +1 -0
  1011. package/corpus/templates/slides-2/server/routes/_agent-native/google-docs/auth-url.get.ts +1 -0
  1012. package/corpus/templates/slides-2/server/routes/_agent-native/google-docs/callback.get.ts +1 -0
  1013. package/corpus/templates/slides-2/server/routes/api/assets/upload-video.post.ts +1 -0
  1014. package/corpus/templates/slides-2/server/routes/api/assets/upload.post.ts +1 -0
  1015. package/corpus/templates/slides-2/server/routes/api/assets/video-uploads.delete.ts +1 -0
  1016. package/corpus/templates/slides-2/server/routes/api/deck-agent-context.json.get.ts +105 -0
  1017. package/corpus/templates/slides-2/server/routes/api/decks/events.get.ts +1 -0
  1018. package/corpus/templates/slides-2/server/routes/api/demo.get.ts +1 -0
  1019. package/corpus/templates/slides-2/server/routes/api/exports/[filename].get.ts +221 -0
  1020. package/corpus/templates/slides-2/server/routes/api/exports/google-slides.post.ts +240 -0
  1021. package/corpus/templates/slides-2/server/routes/api/exports/html.post.ts +67 -0
  1022. package/corpus/templates/slides-2/server/routes/api/exports/pptx.post.ts +100 -0
  1023. package/corpus/templates/slides-2/server/routes/api/gen-preview/[...].get.ts +24 -0
  1024. package/corpus/templates/slides-2/server/routes/api/generated/[...].get.ts +24 -0
  1025. package/corpus/templates/slides-2/server/routes/api/image-proxy.get.ts +518 -0
  1026. package/corpus/templates/slides-2/server/routes/api/import-assets/[token].get.ts +70 -0
  1027. package/corpus/templates/slides-2/server/routes/api/preview-images.get.ts +20 -0
  1028. package/corpus/templates/slides-2/server/routes/api/share/[token].get.ts +1 -0
  1029. package/corpus/templates/slides-2/server/routes/api/uploads-chunked/[sessionId]/chunk.post.ts +1 -0
  1030. package/corpus/templates/slides-2/server/routes/api/uploads-chunked/[sessionId]/status.get.ts +1 -0
  1031. package/corpus/templates/slides-2/server/routes/api/uploads-chunked/[sessionId].delete.ts +1 -0
  1032. package/corpus/templates/slides-2/server/routes/api/uploads-chunked/start.post.ts +1 -0
  1033. package/corpus/templates/slides-2/server/routes/api/uploads.delete.ts +1 -0
  1034. package/corpus/templates/slides-2/server/routes/api/uploads.post.ts +1 -0
  1035. package/corpus/templates/slides-2/server/workspace-defaults.ts +196 -0
  1036. package/corpus/templates/slides-2/shared/action-ui.ts +147 -0
  1037. package/corpus/templates/slides-2/shared/agent-readable.ts +2 -0
  1038. package/corpus/templates/slides-2/shared/api.ts +406 -0
  1039. package/corpus/templates/slides-2/shared/app-state-tabs.ts +30 -0
  1040. package/corpus/templates/slides-2/shared/app-storage.ts +9 -0
  1041. package/corpus/templates/slides-2/shared/aspect-ratios.ts +49 -0
  1042. package/corpus/templates/slides-2/shared/blank-slide.ts +179 -0
  1043. package/corpus/templates/slides-2/shared/client-compatibility.ts +2 -0
  1044. package/corpus/templates/slides-2/shared/contrast-audit.ts +255 -0
  1045. package/corpus/templates/slides-2/shared/deck-access.ts +26 -0
  1046. package/corpus/templates/slides-2/shared/deck-app-scope.ts +14 -0
  1047. package/corpus/templates/slides-2/shared/deck-content.ts +37 -0
  1048. package/corpus/templates/slides-2/shared/deck-history-control.ts +79 -0
  1049. package/corpus/templates/slides-2/shared/deck-scope.ts +5 -0
  1050. package/corpus/templates/slides-2/shared/deck-title.ts +199 -0
  1051. package/corpus/templates/slides-2/shared/deck-write.ts +61 -0
  1052. package/corpus/templates/slides-2/shared/design-flags.ts +7 -0
  1053. package/corpus/templates/slides-2/shared/design-system-validation.ts +88 -0
  1054. package/corpus/templates/slides-2/shared/editor-control.ts +120 -0
  1055. package/corpus/templates/slides-2/shared/generation-timing.ts +19 -0
  1056. package/corpus/templates/slides-2/shared/google-docs.ts +69 -0
  1057. package/corpus/templates/slides-2/shared/labs.ts +10 -0
  1058. package/corpus/templates/slides-2/shared/overview-navigation.ts +34 -0
  1059. package/corpus/templates/slides-2/shared/ownership.ts +6 -0
  1060. package/corpus/templates/slides-2/shared/pdf-sidecar.ts +130 -0
  1061. package/corpus/templates/slides-2/shared/presenter-control.ts +111 -0
  1062. package/corpus/templates/slides-2/shared/representative-slide.ts +89 -0
  1063. package/corpus/templates/slides-2/shared/slide-background.ts +30 -0
  1064. package/corpus/templates/slides-2/shared/slide-comment-anchor.ts +117 -0
  1065. package/corpus/templates/slides-2/shared/slide-comment-reactions.ts +47 -0
  1066. package/corpus/templates/slides-2/shared/slide-design-tokens.ts +92 -0
  1067. package/corpus/templates/slides-2/shared/slide-fit.ts +78 -0
  1068. package/corpus/templates/slides-2/shared/slide-ids.ts +133 -0
  1069. package/corpus/templates/slides-2/shared/slide-number.ts +124 -0
  1070. package/corpus/templates/slides-2/shared/slide-object-structure.ts +790 -0
  1071. package/corpus/templates/slides-2/shared/slide-text-range-selection.ts +50 -0
  1072. package/corpus/templates/slides-2/shared/slide-transitions.ts +70 -0
  1073. package/corpus/templates/slides-2/shared/slides-2-transition.ts +194 -0
  1074. package/corpus/templates/slides-2/shared/slides-user-prefs.ts +22 -0
  1075. package/corpus/templates/slides-2/shared/source-import-errors.ts +12 -0
  1076. package/corpus/templates/slides-2/shared/source-runtime-export.ts +76 -0
  1077. package/corpus/templates/slides-2/shared/upload-types.ts +41 -0
  1078. package/corpus/templates/slides-2/ssr-entry.ts +11 -0
  1079. package/corpus/templates/slides-2/tsconfig.json +27 -0
  1080. package/corpus/templates/slides-2/vite.config.ts +77 -0
  1081. package/corpus/templates/slides-2/vitest.config.ts +28 -0
  1082. package/corpus/templates/tasks/.agents/skills/actions/references/action-fields.md +1 -1
  1083. package/package.json +1 -1
  1084. package/corpus/templates/design/.agents/skills/shader-fills/SKILL.md +0 -182
  1085. package/corpus/templates/design/actions/apply-shader-fill.ts +0 -450
  1086. package/corpus/templates/design/actions/apply-shader.ts +0 -257
  1087. package/corpus/templates/design/actions/preview-shader-fill.ts +0 -157
  1088. package/corpus/templates/design/app/components/design/inspector/GlslShaderPanel.tsx +0 -1144
  1089. package/corpus/templates/design/app/components/design/inspector/SHADER_INTEGRATION.md +0 -450
  1090. package/corpus/templates/design/app/components/design/inspector/ShaderControls.stories.tsx +0 -71
  1091. package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +0 -555
  1092. package/corpus/templates/design/app/components/design/inspector/ShaderEffectRow.tsx +0 -105
  1093. package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +0 -433
  1094. package/corpus/templates/design/app/components/design/inspector/color-picker-shader-pane.tsx +0 -648
  1095. package/corpus/templates/design/shared/shader-fill.ts +0 -174
  1096. package/corpus/templates/design/shared/shader-presets.ts +0 -1523
@@ -1,5 +1,5 @@
1
1
  import { generateTabId } from "@agent-native/core/client/agent-chat";
2
- import { agentNativePath } from "@agent-native/core/client/api-path";
2
+ import { readClientAppState } from "@agent-native/core/client/application-state";
3
3
  import {
4
4
  isReconcileLeadClient,
5
5
  useCollaborativeDoc,
@@ -40,6 +40,12 @@ import type {
40
40
  DocumentSyncStatus,
41
41
  } from "@shared/api";
42
42
  import { commentPropertyTarget } from "@shared/comment-property-target";
43
+ import { DOCUMENT_FLUSH_PROTOCOL } from "@shared/document-flush-protocol";
44
+ import {
45
+ claimedEditorSave,
46
+ editorSaveState,
47
+ publishesEditorSaveState,
48
+ } from "@shared/editor-save-state";
43
49
  import { LIVE_BODY_SHADOW_FLAG } from "@shared/feature-flags";
44
50
  import { canonicalizeNfm, docToNfm } from "@shared/nfm";
45
51
  import { markdownSuggestionOperations } from "@shared/suggestion-diff";
@@ -119,6 +125,7 @@ import {
119
125
  useContentSpaces,
120
126
  type ContentSpaceSummary,
121
127
  } from "@/hooks/use-content-spaces";
128
+ import { isPrivateDocumentEditorPath } from "@/hooks/use-db-sync";
122
129
  import {
123
130
  documentPropertiesResponseMatchesScope,
124
131
  useDocumentProperties,
@@ -190,6 +197,8 @@ import {
190
197
  import {
191
198
  flushAllBlockFieldSaveControllersForDocument,
192
199
  flushBlockFieldSaveController,
200
+ peekBlockFieldSaveController,
201
+ readBlockFieldEditorState,
193
202
  } from "./blockFieldSaveRegistry";
194
203
  import {
195
204
  blockFieldVisit,
@@ -231,6 +240,11 @@ import {
231
240
  documentEditorTitleRegionClassName,
232
241
  type DocumentEditorIconRow,
233
242
  } from "./document-editor-layout";
243
+ import {
244
+ createDocumentFlushParticipant,
245
+ createFlushObservedRef,
246
+ type FlushLocalSnapshot,
247
+ } from "./document-flush-participant";
234
248
  import { createHistorySession } from "./document-history-session";
235
249
  import {
236
250
  saveDocumentWithRebase,
@@ -279,13 +293,19 @@ import {
279
293
  savePageWithRecovery,
280
294
  type PageSaveResult as DocumentSaveResult,
281
295
  } from "./pageSession";
282
- import { trackPendingDocumentPersistence } from "./pending-document-persistence";
296
+ import {
297
+ settleAcceptedDocumentPersistence,
298
+ settleRevertedDocumentPersistence,
299
+ trackPendingDocumentPersistence,
300
+ type DocumentPersistenceFailure,
301
+ } from "./pending-document-persistence";
283
302
  import {
284
303
  bodyCommentThreads,
285
304
  openThreadsByProperty,
286
305
  PropertyCommentsContext,
287
306
  type PropertyCommentsValue,
288
307
  } from "./property-comments";
308
+ import { StaticDocumentBody } from "./StaticDocumentBody";
289
309
  import {
290
310
  createSuggestionAutosave,
291
311
  markSuggestionAutosaveSaved,
@@ -339,7 +359,11 @@ import {
339
359
  type ReconcileRecoveryDraft,
340
360
  type ReconcileSaveBase,
341
361
  } from "./useDocumentReconcileRecovery";
342
- import { canProjectAcceptedSuggestion, VisualEditor } from "./VisualEditor";
362
+ import {
363
+ canProjectAcceptedSuggestion,
364
+ getContentEditorSchema,
365
+ VisualEditor,
366
+ } from "./VisualEditor";
343
367
  import type {
344
368
  VisualEditorInitialSelection,
345
369
  VisualEditorSuggestion,
@@ -703,6 +727,8 @@ export function suggestionPresentations(
703
727
  transition?: SuggestionPresentationTransition,
704
728
  observedTransition?: SuggestionPresentationTransition,
705
729
  ): VisualEditorSuggestion[] {
730
+ // Decided edits have no presentation; skip their full-Page diff.
731
+ if (suggestion.status !== "pending") return [];
706
732
  const original = suggestionPresentation(
707
733
  suggestion,
708
734
  currentMarkdown,
@@ -1904,6 +1930,38 @@ export function updateAdditionalBlockContents(args: {
1904
1930
  : { ...args.current, [args.propertyId]: args.content };
1905
1931
  }
1906
1932
 
1933
+ // An editor binds to the live copy only when it mounts, so one mounted before
1934
+ // the live copy loads is replaced once it does. Until then the stored body
1935
+ // shows as static markup, and the visit mounts a single editor.
1936
+ export function documentBodyAwaitsLiveCopy(args: {
1937
+ canEdit: boolean;
1938
+ suggesting: boolean;
1939
+ liveCopyDocumentId: string | null;
1940
+ liveCopyStatus: "loading" | "ready" | "error";
1941
+ }): boolean {
1942
+ return (
1943
+ args.canEdit &&
1944
+ !args.suggesting &&
1945
+ args.liveCopyDocumentId !== null &&
1946
+ args.liveCopyStatus === "loading"
1947
+ );
1948
+ }
1949
+
1950
+ // Only the editor that mounts as the stored body leaves takes its place; one
1951
+ // that remounts later has no stored body to replace, and the stored body may
1952
+ // lag the live copy it would be drawn over.
1953
+ export function useReplacesStoredBody(
1954
+ documentId: string,
1955
+ awaitingLiveCopy: boolean,
1956
+ ): boolean {
1957
+ const [shownFor, setShownFor] = useState<string | null>(null);
1958
+ if (awaitingLiveCopy && shownFor !== documentId) setShownFor(documentId);
1959
+ useEffect(() => {
1960
+ if (!awaitingLiveCopy && shownFor !== null) setShownFor(null);
1961
+ }, [awaitingLiveCopy, shownFor]);
1962
+ return shownFor === documentId;
1963
+ }
1964
+
1907
1965
  export function visualEditorInstanceKey(args: {
1908
1966
  documentId: string;
1909
1967
  documentUpdatedAt: string | null;
@@ -1965,6 +2023,7 @@ type PendingDocumentSave = {
1965
2023
  };
1966
2024
 
1967
2025
  type DocumentSaveOptions = {
2026
+ persistenceSequence?: number;
1968
2027
  telemetryOrigin?: "recovery";
1969
2028
  historySessionId?: string;
1970
2029
  editorSessionId?: string;
@@ -3016,7 +3075,15 @@ function PageEditorSessionBody({
3016
3075
  },
3017
3076
  [flushRequestKey],
3018
3077
  );
3019
- useDbSync({ onEvent: handleFlushRequestEvent });
3078
+ // Content's root sync hook already runs the shared transport on editor
3079
+ // pages; this subscribes the flush mailbox to it. Without it a request
3080
+ // reaches an editor with unsaved edits only during a chat run in this tab.
3081
+ useDbSync({
3082
+ onEvent: handleFlushRequestEvent,
3083
+ realtime: isPrivateDocumentEditorPath(location.pathname)
3084
+ ? { reason: "an agent can ask this open editor to save before it reads" }
3085
+ : undefined,
3086
+ });
3020
3087
  const historySessionRef = useRef(createHistorySession());
3021
3088
  const saveTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
3022
3089
  const promotedBuilderBodyRef = useRef<string | null>(null);
@@ -3025,7 +3092,9 @@ function PageEditorSessionBody({
3025
3092
  const tryReleaseCreationCollaborationRef = useRef<() => void>(() => {});
3026
3093
  const initialCreationSaveStartedRef = useRef(false);
3027
3094
  const documentSaveQueueRef = useRef<Promise<void>>(Promise.resolve());
3095
+ const queuedDocumentSavesRef = useRef(0);
3028
3096
  const activeContentSavesRef = useRef(0);
3097
+ const publishEditorSaveStateRef = useRef<() => void>(() => undefined);
3029
3098
  const liveMarkdownRef = useRef<string | null>(null);
3030
3099
  const remoteSaveTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
3031
3100
  const convergedSaveAttemptRef = useRef<string | null>(null);
@@ -3055,9 +3124,18 @@ function PageEditorSessionBody({
3055
3124
  });
3056
3125
  const isInitializedRef = useRef(false);
3057
3126
  const prevDocIdRef = useRef<string | null>(null);
3058
- const localTitleRef = useRef(localTitle);
3127
+ const localSnapshotEpochRef = useRef(0);
3128
+ const localTitleRef = useRef(
3129
+ createFlushObservedRef(localTitle, () => {
3130
+ localSnapshotEpochRef.current += 1;
3131
+ }),
3132
+ ).current;
3059
3133
  localTitleRef.current = localTitle;
3060
- const localContentRef = useRef(localContent);
3134
+ const localContentRef = useRef(
3135
+ createFlushObservedRef(localContent, () => {
3136
+ localSnapshotEpochRef.current += 1;
3137
+ }),
3138
+ ).current;
3061
3139
  const contentEditVersionRef = useRef(0);
3062
3140
  const confirmedContentEditVersionRef = useRef(0);
3063
3141
  const contentObservationEpochRef = useRef(0);
@@ -3445,6 +3523,16 @@ function PageEditorSessionBody({
3445
3523
  collabSynced &&
3446
3524
  collabInitialization.status === "ready" &&
3447
3525
  !collabInitializationFailed;
3526
+ const awaitingLiveCopy = documentBodyAwaitsLiveCopy({
3527
+ canEdit,
3528
+ suggesting: isSuggesting,
3529
+ liveCopyDocumentId: collabDocumentId,
3530
+ liveCopyStatus: collabInitialization.status,
3531
+ });
3532
+ const replacesStoredBody = useReplacesStoredBody(
3533
+ documentId,
3534
+ awaitingLiveCopy,
3535
+ );
3448
3536
  const suggestionEditorIsolation = suggestedEditorIsolation({
3449
3537
  suggesting: isSuggesting,
3450
3538
  canSuggest: suggestionCapability.canContinue,
@@ -3458,6 +3546,11 @@ function PageEditorSessionBody({
3458
3546
  useEffect(() => {
3459
3547
  if (!awareness || !collabEnabled) return;
3460
3548
  awareness.setLocalStateField("canFlushDocument", editorCanEdit);
3549
+ awareness.setLocalStateField(
3550
+ "documentFlushProtocol",
3551
+ DOCUMENT_FLUSH_PROTOCOL,
3552
+ );
3553
+ awareness.setLocalStateField("editorSessionId", editorSessionIdRef.current);
3461
3554
  return () => {
3462
3555
  awareness.setLocalStateField("canFlushDocument", false);
3463
3556
  };
@@ -3603,8 +3696,9 @@ function PageEditorSessionBody({
3603
3696
  }, [document, isLinkedLocalSourceDocument, localTitle, localContent]);
3604
3697
 
3605
3698
  const pendingPersistenceRef = useRef(new Set<Promise<unknown>>());
3699
+ const persistenceSequenceRef = useRef(0);
3606
3700
  const persistenceErrorsRef = useRef(
3607
- new Map<keyof DocumentUpdates, unknown>(),
3701
+ new Map<keyof DocumentUpdates, DocumentPersistenceFailure>(),
3608
3702
  );
3609
3703
  const persistDocumentUpdatesUntracked = useCallback(
3610
3704
  async (
@@ -3816,9 +3910,17 @@ function PageEditorSessionBody({
3816
3910
  );
3817
3911
  const persistDocumentUpdates = useCallback(
3818
3912
  (updates: DocumentUpdates, options: DocumentSaveOptions = {}) => {
3913
+ options.persistenceSequence = ++persistenceSequenceRef.current;
3914
+ const persistenceIdentity = {
3915
+ editorSessionId: options.editorSessionId ?? editorSessionIdRef.current!,
3916
+ editGeneration:
3917
+ options.editGeneration ?? editorEditGenerationRef.current,
3918
+ saveAttemptId: options.saveAttemptId,
3919
+ persistenceSequence: options.persistenceSequence,
3920
+ };
3819
3921
  const fields = Object.keys(updates) as (keyof DocumentUpdates)[];
3820
3922
  const request = persistDocumentUpdatesUntracked(updates, options);
3821
- trackPendingDocumentPersistence(
3923
+ const tracked = trackPendingDocumentPersistence(
3822
3924
  pendingPersistenceRef.current,
3823
3925
  request,
3824
3926
  (result) => {
@@ -3832,7 +3934,10 @@ function PageEditorSessionBody({
3832
3934
  "The page changed before the latest edit could be saved.",
3833
3935
  );
3834
3936
  for (const field of fields) {
3835
- persistenceErrorsRef.current.set(field, error);
3937
+ persistenceErrorsRef.current.set(field, {
3938
+ error,
3939
+ ...persistenceIdentity,
3940
+ });
3836
3941
  }
3837
3942
  } else {
3838
3943
  if (
@@ -3867,19 +3972,27 @@ function PageEditorSessionBody({
3867
3972
  lastSavedContentRef.current.revision = result.revision;
3868
3973
  }
3869
3974
  }
3870
- for (const field of fields) {
3871
- persistenceErrorsRef.current.delete(field);
3872
- }
3975
+ settleAcceptedDocumentPersistence(
3976
+ persistenceErrorsRef.current,
3977
+ fields,
3978
+ persistenceIdentity,
3979
+ );
3873
3980
  }
3874
3981
  },
3875
3982
  (error) => {
3876
3983
  if (!(error instanceof AbandonedPageSaveError)) {
3877
3984
  for (const field of fields) {
3878
- persistenceErrorsRef.current.set(field, error);
3985
+ persistenceErrorsRef.current.set(field, {
3986
+ error,
3987
+ ...persistenceIdentity,
3988
+ });
3879
3989
  }
3880
3990
  }
3881
3991
  },
3882
3992
  );
3993
+ publishEditorSaveStateRef.current();
3994
+ const publish = () => publishEditorSaveStateRef.current();
3995
+ void tracked.then(publish, publish);
3883
3996
  return request;
3884
3997
  },
3885
3998
  [persistDocumentUpdatesUntracked],
@@ -4297,6 +4410,14 @@ function PageEditorSessionBody({
4297
4410
  }
4298
4411
  } else {
4299
4412
  saved = await persistDocumentUpdates(updates, options);
4413
+ if (
4414
+ isDocumentUpdateConflict(saved) &&
4415
+ (updates.title === undefined ||
4416
+ saved.document.title === updates.title) &&
4417
+ (updates.content === undefined ||
4418
+ saved.document.content === updates.content)
4419
+ )
4420
+ saved = saved.document;
4300
4421
  }
4301
4422
  if (
4302
4423
  isDocumentUpdateConflict(saved) ||
@@ -4306,6 +4427,11 @@ function PageEditorSessionBody({
4306
4427
  return { contentPersisted: false };
4307
4428
  }
4308
4429
  const savedAt = saved?.updatedAt ?? new Date().toISOString();
4430
+ settleAcceptedDocumentPersistence(
4431
+ persistenceErrorsRef.current,
4432
+ Object.keys(updates) as (keyof DocumentUpdates)[],
4433
+ options,
4434
+ );
4309
4435
  adoptConfirmedSaveWatermarks({
4310
4436
  saved,
4311
4437
  savedAt,
@@ -4635,7 +4761,9 @@ function PageEditorSessionBody({
4635
4761
  (authoredContentIntentRef.current?.editGeneration === editGeneration
4636
4762
  ? authoredContentIntentRef.current
4637
4763
  : undefined);
4638
- return enqueueDocumentSave(documentSaveQueueRef, () =>
4764
+ queuedDocumentSavesRef.current += 1;
4765
+ publishEditorSaveStateRef.current();
4766
+ const queued = enqueueDocumentSave(documentSaveQueueRef, () =>
4639
4767
  runPageSaveIfSessionActive(
4640
4768
  () =>
4641
4769
  !options.requireActiveEditorSession ||
@@ -4703,6 +4831,12 @@ function PageEditorSessionBody({
4703
4831
  }),
4704
4832
  ),
4705
4833
  );
4834
+ const settle = () => {
4835
+ queuedDocumentSavesRef.current -= 1;
4836
+ publishEditorSaveStateRef.current();
4837
+ };
4838
+ void queued.then(settle, settle);
4839
+ return queued;
4706
4840
  },
4707
4841
  [
4708
4842
  clearRecoveryDraft,
@@ -4718,6 +4852,69 @@ function PageEditorSessionBody({
4718
4852
  null,
4719
4853
  );
4720
4854
  const retryPendingSaveDelayRef = useRef(800);
4855
+ // Primary read receipts cover title/body; metadata errors still block navigation.
4856
+ const readPrimaryPersistenceError = useCallback(
4857
+ () =>
4858
+ persistenceErrorsRef.current.get("title") ??
4859
+ persistenceErrorsRef.current.get("content"),
4860
+ [],
4861
+ );
4862
+ const readEditorSaveState = useCallback(() => {
4863
+ const fieldsMatchingSaved: (keyof DocumentUpdates)[] = [];
4864
+ if (localTitleRef.current === lastSavedTitleRef.current.title)
4865
+ fieldsMatchingSaved.push("title");
4866
+ if (localContentRef.current === lastSavedContentRef.current.content)
4867
+ fieldsMatchingSaved.push("content");
4868
+ settleRevertedDocumentPersistence(
4869
+ persistenceErrorsRef.current,
4870
+ fieldsMatchingSaved,
4871
+ {
4872
+ editorSessionId: editorSessionIdRef.current!,
4873
+ editGeneration: editorEditGenerationRef.current,
4874
+ persistenceSequence: persistenceSequenceRef.current,
4875
+ },
4876
+ );
4877
+ return editorSaveState({
4878
+ saveQueued:
4879
+ saveTimeoutRef.current !== null ||
4880
+ pendingDocumentSaveRef.current !== null ||
4881
+ queuedDocumentSavesRef.current > 0 ||
4882
+ retryPendingSaveTimerRef.current !== null ||
4883
+ remoteSaveTimerRef.current !== null,
4884
+ saveInFlight:
4885
+ activeContentSavesRef.current > 0 ||
4886
+ pendingPersistenceRef.current.size > 0,
4887
+ recoveryPending:
4888
+ reconcileRecoveryStateRef.current !== null ||
4889
+ recoveryDraftRef.current !== null ||
4890
+ readPrimaryPersistenceError() !== undefined,
4891
+ localTitle: localTitleRef.current,
4892
+ localContent: localContentRef.current,
4893
+ savedTitle: lastSavedTitleRef.current,
4894
+ savedContent: lastSavedContentRef.current,
4895
+ });
4896
+ }, [readPrimaryPersistenceError]);
4897
+ publishEditorSaveStateRef.current = () => {
4898
+ const awareness = collabAwarenessRef.current;
4899
+ if (!awareness || isLocalFileDocument || isLinkedLocalSourceDocument)
4900
+ return;
4901
+ const local = awareness.getLocalState();
4902
+ if (!local) return;
4903
+ const state = readEditorSaveState();
4904
+ if (publishesEditorSaveState(local, state)) return;
4905
+ awareness.setLocalState({ ...local, ...state });
4906
+ };
4907
+ useEffect(() => {
4908
+ publishEditorSaveStateRef.current();
4909
+ }, [
4910
+ awareness,
4911
+ collabEnabled,
4912
+ document,
4913
+ documentReconcileConflict,
4914
+ editorCanEdit,
4915
+ localContent,
4916
+ localTitle,
4917
+ ]);
4721
4918
  const creationCollaborationReleaseRunningRef = useRef(false);
4722
4919
  const tryReleaseCreationCollaboration = useCallback(async () => {
4723
4920
  if (creationCollaborationReleaseRunningRef.current) return;
@@ -4820,6 +5017,7 @@ function PageEditorSessionBody({
4820
5017
  retryPendingSaveDelayRef.current = Math.min(delay * 2, 30_000);
4821
5018
  retryPendingSaveTimerRef.current = setTimeout(() => {
4822
5019
  retryPendingSaveTimerRef.current = null;
5020
+ publishEditorSaveStateRef.current();
4823
5021
  const snapshot = pendingSaveRetrySnapshot(
4824
5022
  result,
4825
5023
  pending,
@@ -4854,6 +5052,7 @@ function PageEditorSessionBody({
4854
5052
  })
4855
5053
  .catch(handleBackgroundSaveError);
4856
5054
  }, delay);
5055
+ publishEditorSaveStateRef.current();
4857
5056
  };
4858
5057
  const flushPendingDocumentSave = useCallback(
4859
5058
  (pending: PendingDocumentSave) => {
@@ -4956,6 +5155,7 @@ function PageEditorSessionBody({
4956
5155
  if (retryPendingSaveTimerRef.current)
4957
5156
  clearTimeout(retryPendingSaveTimerRef.current);
4958
5157
  retryPendingSaveTimerRef.current = null;
5158
+ publishEditorSaveStateRef.current();
4959
5159
  };
4960
5160
  }, []);
4961
5161
  const prepareHistoryRestore = useCallback(async (): Promise<string> => {
@@ -5114,6 +5314,7 @@ function PageEditorSessionBody({
5114
5314
  });
5115
5315
  pendingDocumentSaveRef.current = pending;
5116
5316
  saveTimeoutRef.current = pending.timeout;
5317
+ publishEditorSaveStateRef.current();
5117
5318
  },
5118
5319
  [
5119
5320
  flushPendingDocumentSave,
@@ -5306,121 +5507,123 @@ function PageEditorSessionBody({
5306
5507
  queryClient,
5307
5508
  ]);
5308
5509
 
5309
- const flushRequestInFlightRef = useRef(new Set<string>());
5510
+ const flushParticipantInputsRef = useRef<{
5511
+ snapshot: (propertyId?: string) => FlushLocalSnapshot;
5512
+ drain: (propertyId?: string) => Promise<void>;
5513
+ }>(null!);
5514
+ flushParticipantInputsRef.current = {
5515
+ snapshot: (propertyId) => {
5516
+ const identity =
5517
+ editorSessionActiveRef.current &&
5518
+ currentDocumentRef.current.id === documentId &&
5519
+ canEditRef.current
5520
+ ? editorSessionIdRef.current!
5521
+ : "inactive";
5522
+ if (propertyId) {
5523
+ const field = readBlockFieldEditorState(`${documentId}:${propertyId}`);
5524
+ const controller = field?.controller;
5525
+ return {
5526
+ identity,
5527
+ generation: controller?.version ?? -1,
5528
+ observation: 0,
5529
+ valueEpoch: controller?.version ?? -1,
5530
+ visualVersion: field?.visualVersion ?? null,
5531
+ title: "",
5532
+ content: controller?.pending ?? "",
5533
+ clean: identity !== "inactive" && field?.clean === true,
5534
+ claim: null,
5535
+ };
5536
+ }
5537
+ const save = readEditorSaveState();
5538
+ const controller = editorPersistenceControllerRef.current;
5539
+ return {
5540
+ identity,
5541
+ generation: editorEditGenerationRef.current,
5542
+ observation: contentObservationEpochRef.current,
5543
+ valueEpoch: localSnapshotEpochRef.current,
5544
+ visualVersion: controller?.version ?? null,
5545
+ title: localTitleRef.current,
5546
+ content: localContentRef.current,
5547
+ clean:
5548
+ identity !== "inactive" &&
5549
+ controller !== null &&
5550
+ save.unsavedEdits === false,
5551
+ claim:
5552
+ save.unsavedEdits === false
5553
+ ? { kind: "document", save: claimedEditorSave(save)! }
5554
+ : null,
5555
+ };
5556
+ },
5557
+ drain: async (propertyId) => {
5558
+ if (propertyId) {
5559
+ if (!peekBlockFieldSaveController(`${documentId}:${propertyId}`))
5560
+ throw new Error("The requested Blocks field editor is unavailable.");
5561
+ await flushBlockFieldSaveController(documentId, propertyId);
5562
+ return;
5563
+ }
5564
+ if (reconcileRecoveryStateRef.current || recoveryDraftRef.current)
5565
+ throw new Error("The document has unresolved recovery work.");
5566
+ while (pendingPersistenceRef.current.size > 0)
5567
+ await Promise.allSettled([...pendingPersistenceRef.current]);
5568
+ await documentSaveQueueRef.current;
5569
+ const controller = editorPersistenceControllerRef.current;
5570
+ if (!controller)
5571
+ throw new Error("The primary Blocks field editor is unavailable.");
5572
+ const persisted = await controller.flushLatest();
5573
+ if (!persisted)
5574
+ throw new Error("The live document could not be saved before syncing.");
5575
+ const pending = pendingDocumentSaveRef.current;
5576
+ if (pending) {
5577
+ clearTimeout(pending.timeout);
5578
+ saveTimeoutRef.current = null;
5579
+ pendingDocumentSaveRef.current = null;
5580
+ await flushPendingDocumentSave(pending);
5581
+ }
5582
+ await documentSaveQueueRef.current;
5583
+ while (pendingPersistenceRef.current.size > 0)
5584
+ await Promise.allSettled([...pendingPersistenceRef.current]);
5585
+ const error = readPrimaryPersistenceError();
5586
+ if (error !== undefined) throw error.error;
5587
+ },
5588
+ };
5589
+ const flushParticipantRef = useRef<ReturnType<
5590
+ typeof createDocumentFlushParticipant
5591
+ > | null>(null);
5592
+ if (!flushParticipantRef.current) {
5593
+ flushParticipantRef.current = createDocumentFlushParticipant({
5594
+ documentId: () => currentDocumentRef.current.id,
5595
+ identity: () =>
5596
+ collabClientIdRef.current === null
5597
+ ? null
5598
+ : {
5599
+ clientId: collabClientIdRef.current,
5600
+ editorSessionId: editorSessionIdRef.current!,
5601
+ },
5602
+ snapshot: (propertyId) =>
5603
+ flushParticipantInputsRef.current.snapshot(propertyId),
5604
+ drain: (propertyId) =>
5605
+ flushParticipantInputsRef.current.drain(propertyId),
5606
+ });
5607
+ }
5310
5608
  useEffect(() => {
5311
5609
  if (!editorCanEdit || isLocalFileDocument) return;
5312
5610
  let active = true;
5313
- const flushPath = agentNativePath(
5314
- `/_agent-native/application-state/${flushRequestKey}`,
5315
- );
5316
-
5317
- async function flushIfRequested() {
5611
+ const readRequest = async () => {
5318
5612
  try {
5319
- const res = await fetch(flushPath);
5320
- if (res.ok) {
5321
- const pending = (await res.json()) as {
5322
- id?: string;
5323
- ts?: number;
5324
- requestId?: string;
5325
- propertyId?: string;
5326
- status?: "pending" | "success" | "error";
5327
- error?: string;
5328
- } | null;
5329
- if (pending && active) {
5330
- if (pending.status === "error" || pending.status === "success") {
5331
- return;
5332
- }
5333
- const requestIdentity =
5334
- pending.requestId ??
5335
- `${pending.id ?? documentId}:${pending.ts ?? 0}`;
5336
- if (flushRequestInFlightRef.current.has(requestIdentity)) return;
5337
- flushRequestInFlightRef.current.add(requestIdentity);
5338
- const title = localTitleRef.current;
5339
- const content = localContentRef.current;
5340
- const updates: Record<string, string> = {};
5341
- if (title !== lastSavedTitleRef.current.title)
5342
- updates.title = title;
5343
- if (content !== lastSavedContentRef.current.content) {
5344
- updates.content = content;
5345
- }
5346
- try {
5347
- if (pending.propertyId) {
5348
- await flushBlockFieldSaveController(
5349
- documentId,
5350
- pending.propertyId,
5351
- );
5352
- } else if (Object.keys(updates).length > 0) {
5353
- const saved = await persistDocumentUpdatesRef.current(updates);
5354
- if (
5355
- isDocumentUpdateConflict(saved) ||
5356
- isDocumentUpdateSuperseded(saved) ||
5357
- isDocumentUpdatePreservationRequired(saved)
5358
- ) {
5359
- throw new Error(
5360
- "The document changed while preparing it for sync.",
5361
- );
5362
- }
5363
- const savedAt = saved?.updatedAt ?? new Date().toISOString();
5364
- adoptConfirmedSaveWatermarks({
5365
- saved,
5366
- savedAt,
5367
- title,
5368
- content,
5369
- updates,
5370
- lastSavedTitleRef,
5371
- lastSavedContentRef,
5372
- });
5373
- }
5374
- await fetch(flushPath, {
5375
- method: "PATCH",
5376
- headers: {
5377
- "Content-Type": "application/json",
5378
- "X-Agent-Native-CSRF": "1",
5379
- },
5380
- body: JSON.stringify({
5381
- expected: pending,
5382
- next: {
5383
- id: pending.id ?? documentId,
5384
- ts: pending.ts ?? Date.now(),
5385
- requestId: pending.requestId,
5386
- status: "success",
5387
- },
5388
- }),
5389
- }).catch(() => {});
5390
- } catch (error) {
5391
- await fetch(flushPath, {
5392
- method: "PATCH",
5393
- headers: {
5394
- "Content-Type": "application/json",
5395
- "X-Agent-Native-CSRF": "1",
5396
- },
5397
- body: JSON.stringify({
5398
- expected: pending,
5399
- next: {
5400
- id: pending.id ?? documentId,
5401
- ts: pending.ts ?? Date.now(),
5402
- requestId: pending.requestId,
5403
- status: "error",
5404
- error:
5405
- error instanceof Error
5406
- ? error.message
5407
- : t("editor.liveDocumentSaveBeforeSyncFailed"),
5408
- },
5409
- }),
5410
- }).catch(() => {});
5411
- } finally {
5412
- flushRequestInFlightRef.current.delete(requestIdentity);
5413
- }
5414
- }
5415
- }
5416
- } catch {
5417
- // Best-effort read. A later app-state event will wake the reader again.
5613
+ const request = await readClientAppState(flushRequestKey);
5614
+ if (active) await flushParticipantRef.current!(request);
5615
+ } catch (error) {
5616
+ console.error("Document flush mailbox read failed", {
5617
+ documentId,
5618
+ error,
5619
+ });
5418
5620
  }
5419
- }
5420
-
5421
- void flushIfRequested();
5621
+ };
5622
+ void readRequest();
5623
+ window.addEventListener("focus", readRequest);
5422
5624
  return () => {
5423
5625
  active = false;
5626
+ window.removeEventListener("focus", readRequest);
5424
5627
  };
5425
5628
  }, [
5426
5629
  documentId,
@@ -5428,7 +5631,6 @@ function PageEditorSessionBody({
5428
5631
  flushRequestKey,
5429
5632
  flushRequestWake,
5430
5633
  isLocalFileDocument,
5431
- t,
5432
5634
  ]);
5433
5635
 
5434
5636
  const handleTitleChange = useCallback(
@@ -5436,6 +5638,7 @@ function PageEditorSessionBody({
5436
5638
  if (!documentCanonicalMutationsEnabled(editorCanEdit, isSuggesting))
5437
5639
  return;
5438
5640
  localTitleRef.current = newTitle;
5641
+ publishEditorSaveStateRef.current();
5439
5642
  editorEditGenerationRef.current += 1;
5440
5643
  journalCurrentDraft(
5441
5644
  newTitle,
@@ -5528,18 +5731,27 @@ function PageEditorSessionBody({
5528
5731
  [documentId, savedSuggestions],
5529
5732
  );
5530
5733
  const presentedSuggestions = useMemo(() => {
5531
- if (!pendingSuggestionDecision?.continueSuggesting) return savedSuggestions;
5734
+ // Accept or Reject remaining shows its outcome on every member at once,
5735
+ // in the same render that projects the Page, until the server answers.
5736
+ const proposalMembers = pendingProposalDecision
5737
+ ? new Set(pendingProposalDecision.members.map((member) => member.id))
5738
+ : null;
5739
+ if (!pendingSuggestionDecision?.continueSuggesting && !proposalMembers)
5740
+ return savedSuggestions;
5532
5741
  return savedSuggestions.map((suggestion) =>
5533
- suggestion.id === pendingSuggestionDecision.suggestion.id
5534
- ? {
5535
- ...suggestion,
5536
- status: pendingSuggestionDecision.optimistic
5537
- ? pendingSuggestionDecision.decision
5538
- : pendingSuggestionDecision.suggestion.status,
5539
- }
5540
- : suggestion,
5742
+ proposalMembers?.has(suggestion.id) && suggestion.status === "pending"
5743
+ ? { ...suggestion, status: pendingProposalDecision!.requestedDecision }
5744
+ : pendingSuggestionDecision?.continueSuggesting &&
5745
+ suggestion.id === pendingSuggestionDecision.suggestion.id
5746
+ ? {
5747
+ ...suggestion,
5748
+ status: pendingSuggestionDecision.optimistic
5749
+ ? pendingSuggestionDecision.decision
5750
+ : pendingSuggestionDecision.suggestion.status,
5751
+ }
5752
+ : suggestion,
5541
5753
  );
5542
- }, [pendingSuggestionDecision, savedSuggestions]);
5754
+ }, [pendingProposalDecision, pendingSuggestionDecision, savedSuggestions]);
5543
5755
  const pendingSuggestionDecisionContent =
5544
5756
  pendingSuggestionDecision?.continueSuggesting
5545
5757
  ? suggestionDecisionPreviewContent(
@@ -6940,6 +7152,7 @@ function PageEditorSessionBody({
6940
7152
  candidateContent: newContent,
6941
7153
  };
6942
7154
  localContentRef.current = newContent;
7155
+ publishEditorSaveStateRef.current();
6943
7156
  journalCurrentDraft(
6944
7157
  localTitleRef.current,
6945
7158
  newContent,
@@ -7062,6 +7275,7 @@ function PageEditorSessionBody({
7062
7275
  if (content === localContentRef.current) return;
7063
7276
  contentObservationEpochRef.current += 1;
7064
7277
  localContentRef.current = content;
7278
+ publishEditorSaveStateRef.current();
7065
7279
  setLocalContent(content);
7066
7280
  if (
7067
7281
  !isSuggesting &&
@@ -7086,6 +7300,11 @@ function PageEditorSessionBody({
7086
7300
  handleContentChange(newContent);
7087
7301
  return "retained";
7088
7302
  }
7303
+ if (
7304
+ newContent === localContentRef.current &&
7305
+ !readEditorSaveState().unsavedEdits
7306
+ )
7307
+ return "unchanged";
7089
7308
  authoredContentBaseRef.current.edited(newContent);
7090
7309
  return (await handleContentSaveNow({
7091
7310
  localTitle: localTitleRef.current,
@@ -7094,7 +7313,12 @@ function PageEditorSessionBody({
7094
7313
  ? "persisted"
7095
7314
  : "failed";
7096
7315
  },
7097
- [editorCanEdit, handleContentChange, handleContentSaveNow],
7316
+ [
7317
+ editorCanEdit,
7318
+ handleContentChange,
7319
+ handleContentSaveNow,
7320
+ readEditorSaveState,
7321
+ ],
7098
7322
  );
7099
7323
 
7100
7324
  const handleBaseAwareReconcile = useCallback(
@@ -8167,12 +8391,6 @@ function PageEditorSessionBody({
8167
8391
 
8168
8392
  const title = localTitleRef.current;
8169
8393
  const content = localContentRef.current;
8170
- if (title === lastSavedTitleRef.current.title) {
8171
- persistenceErrorsRef.current.delete("title");
8172
- }
8173
- if (content === lastSavedContentRef.current.content) {
8174
- persistenceErrorsRef.current.delete("content");
8175
- }
8176
8394
  const hasUnsavedPrimaryEdit =
8177
8395
  title !== lastSavedTitleRef.current.title ||
8178
8396
  content !== lastSavedContentRef.current.content;
@@ -8219,7 +8437,7 @@ function PageEditorSessionBody({
8219
8437
  await Promise.allSettled([...pendingPersistenceRef.current]);
8220
8438
  }
8221
8439
  const persistenceError = persistenceErrorsRef.current.values().next().value;
8222
- if (persistenceError !== undefined) throw persistenceError;
8440
+ if (persistenceError !== undefined) throw persistenceError.error;
8223
8441
 
8224
8442
  if (
8225
8443
  localTitleRef.current !== lastSavedTitleRef.current.title ||
@@ -8568,6 +8786,18 @@ function PageEditorSessionBody({
8568
8786
  : current,
8569
8787
  );
8570
8788
  void suggestionsQuery.refetch();
8789
+ // Accepting moves each asking thread's quote onto the new text.
8790
+ if (
8791
+ result.suggestions.some(
8792
+ (suggestion) =>
8793
+ suggestion.status === "accepted" &&
8794
+ suggestionSourceThreadId(suggestion),
8795
+ )
8796
+ ) {
8797
+ void queryClient.invalidateQueries({
8798
+ queryKey: ["action", "list-comments", { documentId }],
8799
+ });
8800
+ }
8571
8801
  awaitingReadback = true;
8572
8802
  const readback = await refreshSuggestionDecisionDocument(
8573
8803
  continueSuggesting,
@@ -9399,6 +9629,14 @@ function PageEditorSessionBody({
9399
9629
  );
9400
9630
  }
9401
9631
 
9632
+ const visualEditorContent = isLocalFileDocument
9633
+ ? localContent
9634
+ : (pendingSuggestionDecisionContent ??
9635
+ (isSuggesting
9636
+ ? suggestionDraft
9637
+ : showLocalCreationDraft
9638
+ ? localContent
9639
+ : document.content));
9402
9640
  const primaryEditor = (
9403
9641
  <>
9404
9642
  {canEdit && collabInitializationFailed ? (
@@ -9483,219 +9721,236 @@ function PageEditorSessionBody({
9483
9721
  {t("editor.suggestionFormattingUnsupported")}
9484
9722
  </div>
9485
9723
  ) : null}
9486
- <WidgetVisualEditorBoundary
9487
- key={`${visualEditorInstanceKey({
9488
- documentId,
9489
- documentUpdatedAt:
9490
- suggestionEditorIsolation.contentUpdatedAt,
9491
- isLocalFileDocument,
9492
- canEdit,
9493
- collabEditorEnabled,
9494
- hasYDoc: Boolean(ydoc),
9495
- localFileSyncRevision,
9496
- })}:${isSuggesting ? "suggesting" : "canonical"}`}
9497
- active={mcpDirectoryWidgetReadOnly}
9498
- stage={t("editor.widgetEditorInitStage")}
9499
- action="VisualEditor"
9500
- >
9501
- <VisualEditor
9502
- visitKey={visit.key}
9503
- editorMountMode={
9504
- isSuggesting
9505
- ? "suggesting"
9506
- : canEdit
9507
- ? "editing"
9508
- : "readonly"
9509
- }
9510
- onEscape={handleEditorEscape}
9511
- onImportFiles={
9512
- canImportPages ? importDroppedFiles : undefined
9513
- }
9514
- acceptedDecisionReadback={
9515
- !isSuggesting &&
9516
- pendingSuggestionDecision?.decision ===
9517
- "accepted" &&
9518
- pendingSuggestionDecision.readbackContent !==
9519
- null
9520
- ? {
9521
- id: pendingSuggestionDecision.suggestion
9522
- .id,
9523
- content:
9524
- pendingSuggestionDecision.readbackContent,
9525
- }
9526
- : null
9527
- }
9528
- onAcceptedDecisionRendered={
9529
- handleAcceptedDecisionRendered
9530
- }
9531
- onAcceptedDecisionReadbackOutdated={
9532
- handleAcceptedDecisionReadbackOutdated
9533
- }
9534
- contentResetKey={
9535
- pendingSuggestionDecision
9536
- ? `${pendingSuggestionDecision.suggestion.id}:${pendingSuggestionDecision.decision}:${pendingSuggestionDecision.optimistic ? "optimistic" : "canonical"}`
9537
- : pendingProposalDecision
9538
- ? `proposal:${pendingProposalDecision.generation}:${pendingProposalDecision.readbackContent === null ? "pending" : "readback"}`
9724
+ {awaitingLiveCopy ? (
9725
+ <div className="visual-editor-wrapper">
9726
+ <StaticDocumentBody
9727
+ schema={getContentEditorSchema()}
9728
+ content={visualEditorContent}
9729
+ documentId={documentId}
9730
+ />
9731
+ </div>
9732
+ ) : (
9733
+ <WidgetVisualEditorBoundary
9734
+ key={`${visualEditorInstanceKey({
9735
+ documentId,
9736
+ documentUpdatedAt:
9737
+ suggestionEditorIsolation.contentUpdatedAt,
9738
+ isLocalFileDocument,
9739
+ canEdit,
9740
+ collabEditorEnabled,
9741
+ hasYDoc: Boolean(ydoc),
9742
+ localFileSyncRevision,
9743
+ })}:${isSuggesting ? "suggesting" : "canonical"}`}
9744
+ active={mcpDirectoryWidgetReadOnly}
9745
+ stage={t("editor.widgetEditorInitStage")}
9746
+ action="VisualEditor"
9747
+ >
9748
+ <VisualEditor
9749
+ visitKey={visit.key}
9750
+ editorMountMode={
9751
+ isSuggesting
9752
+ ? "suggesting"
9753
+ : canEdit
9754
+ ? "editing"
9755
+ : "readonly"
9756
+ }
9757
+ onEscape={handleEditorEscape}
9758
+ onImportFiles={
9759
+ canImportPages
9760
+ ? importDroppedFiles
9761
+ : undefined
9762
+ }
9763
+ acceptedDecisionReadback={
9764
+ !isSuggesting &&
9765
+ pendingSuggestionDecision?.decision ===
9766
+ "accepted" &&
9767
+ pendingSuggestionDecision.readbackContent !==
9768
+ null
9769
+ ? {
9770
+ id: pendingSuggestionDecision.suggestion
9771
+ .id,
9772
+ content:
9773
+ pendingSuggestionDecision.readbackContent,
9774
+ }
9539
9775
  : null
9540
- }
9541
- proposalDecisionReadback={
9542
- (!isSuggesting ||
9543
- !pendingProposalDecision?.accepted) &&
9544
- pendingProposalDecision?.readbackContent !==
9545
- null &&
9546
- pendingProposalDecision?.readbackContent !==
9547
- undefined
9548
- ? {
9549
- generation:
9550
- pendingProposalDecision.generation,
9551
- content:
9552
- pendingProposalDecision.readbackContent,
9553
- beforeContent:
9554
- pendingProposalDecision.beforeContent,
9555
- }
9556
- : null
9557
- }
9558
- onProposalDecisionRendered={
9559
- handleProposalDecisionRendered
9560
- }
9561
- onProposalDecisionReadbackOutdated={
9562
- handleProposalDecisionReadbackOutdated
9563
- }
9564
- documentId={documentId}
9565
- contentSpaceId={document.spaceId ?? undefined}
9566
- widgetLoadDiagnosticsActive={
9567
- mcpDirectoryWidgetReadOnly
9568
- }
9569
- content={
9570
- isLocalFileDocument
9571
- ? localContent
9572
- : (pendingSuggestionDecisionContent ??
9573
- (isSuggesting
9574
- ? suggestionDraft
9575
- : showLocalCreationDraft
9576
- ? localContent
9577
- : document.content))
9578
- }
9579
- contentUpdatedAt={
9580
- isLocalFileDocument || showLocalCreationDraft
9581
- ? (localContentUpdatedAt ??
9582
- document.updatedAt)
9583
- : suggestionEditorIsolation.contentUpdatedAt
9584
- }
9585
- contentRevision={
9586
- isLocalFileDocument ||
9587
- showLocalCreationDraft ||
9588
- !suggestionEditorIsolation.reconcileCanonical
9589
- ? null
9590
- : (document.revision ?? null)
9591
- }
9592
- acknowledgedLocalSnapshot={
9593
- acknowledgedLocalSnapshot
9594
- }
9595
- onBaseAwareReconcile={
9596
- suggestionEditorIsolation.reconcileCanonical
9597
- ? handleBaseAwareReconcile
9598
- : undefined
9599
- }
9600
- onRemoteSnapshotChange={
9601
- suggestionEditorIsolation.reconcileCanonical
9602
- ? handleRemoteSnapshotChange
9603
- : undefined
9604
- }
9605
- isEditorClean={isEditorClean}
9606
- collabContentRevision={
9607
- isLocalFileDocument || isSuggesting
9608
- ? null
9609
- : document.collabContentRevision
9610
- }
9611
- requestCollabSync={requestCollabSync}
9612
- onChange={
9613
- isSuggesting
9614
- ? handleSuggestionDraftChange
9615
- : handleContentChange
9616
- }
9617
- onSaveContent={
9618
- suggestionEditorIsolation.persistCanonical
9619
- ? handleImmediateContentChange
9620
- : undefined
9621
- }
9622
- ydoc={
9623
- suggestionEditorIsolation.bindCanonicalYDoc
9624
- ? ydoc
9625
- : null
9626
- }
9627
- observeLiveBody={observeLiveBody}
9628
- collabSynced={
9629
- collabEditorEnabled ? collabSynced : true
9630
- }
9631
- awareness={collabEditorEnabled ? awareness : null}
9632
- user={currentUser}
9633
- editable={
9634
- suggestionEditorIsolation.editable &&
9635
- !isStartingSuggestion &&
9636
- !isSubmittingSuggestions &&
9637
- !pendingSuggestionDecision &&
9638
- !pendingProposalDecision
9639
- }
9640
- directoryWidgetEditing={
9641
- mcpDirectoryWidgetReadOnly &&
9642
- widgetEditability.canEditDocument
9643
- }
9644
- suggesting={isSuggesting}
9645
- localFileMode={isLocalFileDocument}
9646
- localFilePath={
9647
- isLocalFileDocument
9648
- ? document.source?.path
9649
- : null
9650
- }
9651
- onComment={canComment ? handleComment : undefined}
9652
- commentThreads={editorCommentThreads}
9653
- activeThreadId={selectedThreadId}
9654
- hoveredThreadId={hoveredThreadId}
9655
- pendingHighlight={
9656
- blockFieldComments.bodyPendingHighlight
9657
- }
9658
- onActivateThread={
9659
- !isLocalFileDocument
9660
- ? activateCommentThread
9661
- : undefined
9662
- }
9663
- suggestions={visualSuggestions}
9664
- activeSuggestionId={
9665
- hoveredSuggestionId ??
9666
- editingSuggestionId ??
9667
- selectedSuggestionId
9668
- }
9669
- onActivateSuggestion={activateInlineSuggestion}
9670
- onHoverSuggestion={setHoveredSuggestionId}
9671
- onSuggestionReplacementIntent={
9672
- isSuggesting
9673
- ? handleSuggestionReplacementIntent
9674
- : undefined
9675
- }
9676
- initialSelection={visualEditorInitialSelection}
9677
- onInitialSelectionApplied={
9678
- onVisualEditorInitialSelectionApplied
9679
- }
9680
- onSuggestionAnchorsChange={
9681
- handleSuggestionAnchorsChange
9682
- }
9683
- showCommentIndicators={showCommentIndicators}
9684
- onJoinTitle={joinFirstBodyBlockToTitle}
9685
- onOpenNotionPageLink={handleOpenNotionPageLink}
9686
- notionPageId={document.notionPageId}
9687
- onHistoryControllerChange={
9688
- handleHistoryControllerChange
9689
- }
9690
- onHistoryStateChange={handleHistoryStateChange}
9691
- onSelectionControllerChange={
9692
- handleSelectionControllerChange
9693
- }
9694
- onPersistenceControllerChange={
9695
- handlePersistenceControllerChange
9696
- }
9697
- />
9698
- </WidgetVisualEditorBoundary>
9776
+ }
9777
+ onAcceptedDecisionRendered={
9778
+ handleAcceptedDecisionRendered
9779
+ }
9780
+ onAcceptedDecisionReadbackOutdated={
9781
+ handleAcceptedDecisionReadbackOutdated
9782
+ }
9783
+ contentResetKey={
9784
+ pendingSuggestionDecision
9785
+ ? `${pendingSuggestionDecision.suggestion.id}:${pendingSuggestionDecision.decision}:${pendingSuggestionDecision.optimistic ? "optimistic" : "canonical"}`
9786
+ : pendingProposalDecision
9787
+ ? `proposal:${pendingProposalDecision.generation}:${pendingProposalDecision.readbackContent === null ? "pending" : "readback"}`
9788
+ : null
9789
+ }
9790
+ proposalDecisionReadback={
9791
+ (!isSuggesting ||
9792
+ !pendingProposalDecision?.accepted) &&
9793
+ pendingProposalDecision?.readbackContent !==
9794
+ null &&
9795
+ pendingProposalDecision?.readbackContent !==
9796
+ undefined
9797
+ ? {
9798
+ generation:
9799
+ pendingProposalDecision.generation,
9800
+ content:
9801
+ pendingProposalDecision.readbackContent,
9802
+ beforeContent:
9803
+ pendingProposalDecision.beforeContent,
9804
+ }
9805
+ : null
9806
+ }
9807
+ onProposalDecisionRendered={
9808
+ handleProposalDecisionRendered
9809
+ }
9810
+ onProposalDecisionReadbackOutdated={
9811
+ handleProposalDecisionReadbackOutdated
9812
+ }
9813
+ documentId={documentId}
9814
+ contentSpaceId={document.spaceId ?? undefined}
9815
+ widgetLoadDiagnosticsActive={
9816
+ mcpDirectoryWidgetReadOnly
9817
+ }
9818
+ content={
9819
+ isLocalFileDocument
9820
+ ? localContent
9821
+ : (pendingSuggestionDecisionContent ??
9822
+ (isSuggesting
9823
+ ? suggestionDraft
9824
+ : showLocalCreationDraft
9825
+ ? localContent
9826
+ : document.content))
9827
+ }
9828
+ contentUpdatedAt={
9829
+ isLocalFileDocument || showLocalCreationDraft
9830
+ ? (localContentUpdatedAt ??
9831
+ document.updatedAt)
9832
+ : suggestionEditorIsolation.contentUpdatedAt
9833
+ }
9834
+ contentRevision={
9835
+ isLocalFileDocument ||
9836
+ showLocalCreationDraft ||
9837
+ !suggestionEditorIsolation.reconcileCanonical
9838
+ ? null
9839
+ : (document.revision ?? null)
9840
+ }
9841
+ acknowledgedLocalSnapshot={
9842
+ acknowledgedLocalSnapshot
9843
+ }
9844
+ onBaseAwareReconcile={
9845
+ suggestionEditorIsolation.reconcileCanonical
9846
+ ? handleBaseAwareReconcile
9847
+ : undefined
9848
+ }
9849
+ onRemoteSnapshotChange={
9850
+ suggestionEditorIsolation.reconcileCanonical
9851
+ ? handleRemoteSnapshotChange
9852
+ : undefined
9853
+ }
9854
+ isEditorClean={isEditorClean}
9855
+ collabContentRevision={
9856
+ isLocalFileDocument || isSuggesting
9857
+ ? null
9858
+ : document.collabContentRevision
9859
+ }
9860
+ requestCollabSync={requestCollabSync}
9861
+ onChange={
9862
+ isSuggesting
9863
+ ? handleSuggestionDraftChange
9864
+ : handleContentChange
9865
+ }
9866
+ onSaveContent={
9867
+ suggestionEditorIsolation.persistCanonical
9868
+ ? handleImmediateContentChange
9869
+ : undefined
9870
+ }
9871
+ ydoc={
9872
+ suggestionEditorIsolation.bindCanonicalYDoc
9873
+ ? ydoc
9874
+ : null
9875
+ }
9876
+ observeLiveBody={observeLiveBody}
9877
+ replacesStoredBody={replacesStoredBody}
9878
+ collabSynced={
9879
+ collabEditorEnabled ? collabSynced : true
9880
+ }
9881
+ awareness={
9882
+ collabEditorEnabled ? awareness : null
9883
+ }
9884
+ user={currentUser}
9885
+ editable={
9886
+ suggestionEditorIsolation.editable &&
9887
+ !isStartingSuggestion &&
9888
+ !isSubmittingSuggestions &&
9889
+ !pendingSuggestionDecision &&
9890
+ !pendingProposalDecision
9891
+ }
9892
+ directoryWidgetEditing={
9893
+ mcpDirectoryWidgetReadOnly &&
9894
+ widgetEditability.canEditDocument
9895
+ }
9896
+ suggesting={isSuggesting}
9897
+ localFileMode={isLocalFileDocument}
9898
+ localFilePath={
9899
+ isLocalFileDocument
9900
+ ? document.source?.path
9901
+ : null
9902
+ }
9903
+ onComment={
9904
+ canComment ? handleComment : undefined
9905
+ }
9906
+ commentThreads={editorCommentThreads}
9907
+ activeThreadId={selectedThreadId}
9908
+ hoveredThreadId={hoveredThreadId}
9909
+ pendingHighlight={
9910
+ blockFieldComments.bodyPendingHighlight
9911
+ }
9912
+ onActivateThread={
9913
+ !isLocalFileDocument
9914
+ ? activateCommentThread
9915
+ : undefined
9916
+ }
9917
+ suggestions={visualSuggestions}
9918
+ activeSuggestionId={
9919
+ hoveredSuggestionId ??
9920
+ editingSuggestionId ??
9921
+ selectedSuggestionId
9922
+ }
9923
+ onActivateSuggestion={activateInlineSuggestion}
9924
+ onHoverSuggestion={setHoveredSuggestionId}
9925
+ onSuggestionReplacementIntent={
9926
+ isSuggesting
9927
+ ? handleSuggestionReplacementIntent
9928
+ : undefined
9929
+ }
9930
+ initialSelection={visualEditorInitialSelection}
9931
+ onInitialSelectionApplied={
9932
+ onVisualEditorInitialSelectionApplied
9933
+ }
9934
+ onSuggestionAnchorsChange={
9935
+ handleSuggestionAnchorsChange
9936
+ }
9937
+ showCommentIndicators={showCommentIndicators}
9938
+ onJoinTitle={joinFirstBodyBlockToTitle}
9939
+ onOpenNotionPageLink={handleOpenNotionPageLink}
9940
+ notionPageId={document.notionPageId}
9941
+ onHistoryControllerChange={
9942
+ handleHistoryControllerChange
9943
+ }
9944
+ onHistoryStateChange={handleHistoryStateChange}
9945
+ onSelectionControllerChange={
9946
+ handleSelectionControllerChange
9947
+ }
9948
+ onPersistenceControllerChange={
9949
+ handlePersistenceControllerChange
9950
+ }
9951
+ />
9952
+ </WidgetVisualEditorBoundary>
9953
+ )}
9699
9954
  </>
9700
9955
  );
9701
9956
  if (document.databaseMembership && !isLocalFileDocument) {