@agent-native/core-corpus 0.214.0 → 0.217.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 (1217) 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/.agents/skills/session-replay/SKILL.md +61 -1
  4. package/corpus/templates/analytics/AGENTS.md +1 -1
  5. package/corpus/templates/analytics/CHANGELOG.md +2 -0
  6. package/corpus/templates/analytics/actions/get-session-replay-summary.ts +9 -65
  7. package/corpus/templates/analytics/actions/list-event-catalog.ts +1 -1
  8. package/corpus/templates/analytics/actions/list-session-outputs.ts +40 -0
  9. package/corpus/templates/analytics/actions/list-session-recordings.ts +17 -4
  10. package/corpus/templates/analytics/actions/view-screen.ts +29 -3
  11. package/corpus/templates/analytics/app/i18n/en-US.ts +27 -0
  12. package/corpus/templates/analytics/app/pages/sessions/EventCatalogPage.tsx +18 -1
  13. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +3 -1
  14. package/corpus/templates/analytics/app/pages/sessions/SessionOutputs.tsx +197 -0
  15. package/corpus/templates/analytics/app/pages/sessions/SessionsTriagePage.tsx +114 -4
  16. package/corpus/templates/analytics/changelog/2026-10-15-sessions-can-find-people-who-made-a-slides-deck-but-didn-t-p.md +6 -0
  17. package/corpus/templates/analytics/changelog/2026-10-16-the-activation-funnel-counts-visitors-who-decline-analytics-.md +6 -0
  18. package/corpus/templates/analytics/changelog/2026-10-21-session-replay-quotas-count-the-compressed-size-analytics-st.md +6 -0
  19. package/corpus/templates/analytics/server/db/schema.ts +67 -0
  20. package/corpus/templates/analytics/server/lib/canonical-first-party-dashboard-repair.ts +9 -0
  21. package/corpus/templates/analytics/server/lib/first-party-analytics.ts +28 -22
  22. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +36 -1
  23. package/corpus/templates/analytics/server/lib/output-outcomes.ts +712 -0
  24. package/corpus/templates/analytics/server/lib/replay-origins.ts +33 -0
  25. package/corpus/templates/analytics/server/lib/session-event-index.ts +20 -0
  26. package/corpus/templates/analytics/server/lib/session-performance.ts +6 -40
  27. package/corpus/templates/analytics/server/lib/session-recording-associations.ts +30 -1
  28. package/corpus/templates/analytics/server/lib/session-replay-triage.ts +99 -0
  29. package/corpus/templates/analytics/server/lib/session-replay.ts +85 -40
  30. package/corpus/templates/analytics/server/lib/sessions-triage-lab.ts +8 -2
  31. package/corpus/templates/analytics/server/plugins/db.ts +46 -0
  32. package/corpus/templates/analytics/shared/output-use.ts +205 -0
  33. package/corpus/templates/analytics/shared/session-events.ts +6 -0
  34. package/corpus/templates/assets/.agents/skills/actions/references/action-fields.md +1 -1
  35. package/corpus/templates/brain/.agents/skills/actions/references/action-fields.md +1 -1
  36. package/corpus/templates/calendar/.agents/skills/actions/references/action-fields.md +1 -1
  37. package/corpus/templates/calendar/CHANGELOG.md +6 -0
  38. package/corpus/templates/calendar/actions/create-event.ts +2 -4
  39. package/corpus/templates/calendar/actions/update-event.ts +35 -6
  40. package/corpus/templates/calendar/changelog/2026-10-21-solo-events-avoid-notification-approval.md +6 -0
  41. package/corpus/templates/chat/.agents/skills/actions/references/action-fields.md +1 -1
  42. package/corpus/templates/clips/.agents/skills/actions/references/action-fields.md +1 -1
  43. package/corpus/templates/community/qr/package.json +1 -1
  44. package/corpus/templates/content/.agents/skills/actions/references/action-fields.md +1 -1
  45. package/corpus/templates/content/.agents/skills/content-product-development/references/verification.md +36 -0
  46. package/corpus/templates/content/.agents/skills/document-editing/SKILL.md +10 -0
  47. package/corpus/templates/content/.agents/skills/document-editing/references/databases.md +17 -3
  48. package/corpus/templates/content/.agents/skills/notion-integration/SKILL.md +4 -2
  49. package/corpus/templates/content/CHANGELOG.md +54 -0
  50. package/corpus/templates/content/acceptance/_writers.ts +604 -0
  51. package/corpus/templates/content/acceptance/generate-action-registry.ts +10 -0
  52. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/create-document.json +75 -0
  53. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/duplicate-page.json +75 -0
  54. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/edit-document-find-and-replace-without-a-revision.json +75 -0
  55. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/edit-document-find-and-replace.json +75 -0
  56. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/edit-document-initializecontent.json +75 -0
  57. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/import-content.json +75 -0
  58. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/local-files-import-content-source-existing-page.json +75 -0
  59. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/local-files-import-content-source-new-page.json +75 -0
  60. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/local-files-sync-local-folder-source-changed-file.json +75 -0
  61. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/local-files-sync-local-folder-source-new-file.json +75 -0
  62. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/restore-document-version.json +75 -0
  63. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/set-document-property-primary-blocks-field.json +75 -0
  64. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/set-image-alt-text.json +75 -0
  65. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/undo-content-import.json +75 -0
  66. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/update-document-browser-full-rewrite.json +75 -0
  67. package/corpus/templates/content/acceptance/known-loss.ts +69 -0
  68. package/corpus/templates/content/acceptance/round-trip-corpus.ts +1397 -0
  69. package/corpus/templates/content/actions/_blocks-field-identity.ts +35 -1
  70. package/corpus/templates/content/actions/_browser-document-save-attempt.ts +23 -1
  71. package/corpus/templates/content/actions/_builder-cms-blob-custody.ts +467 -0
  72. package/corpus/templates/content/actions/_builder-cms-execution-lease.ts +17 -0
  73. package/corpus/templates/content/actions/_builder-cms-intent-lookup.ts +5 -0
  74. package/corpus/templates/content/actions/_builder-cms-read-client.ts +881 -21
  75. package/corpus/templates/content/actions/_builder-cms-write-adapter.ts +28 -2
  76. package/corpus/templates/content/actions/_builder-cms-write-client.ts +109 -11
  77. package/corpus/templates/content/actions/_builder-docs-client.ts +1 -0
  78. package/corpus/templates/content/actions/_builder-private-blob.test-fixture.ts +90 -0
  79. package/corpus/templates/content/actions/_builder-source-execution-guard.ts +48 -0
  80. package/corpus/templates/content/actions/_content-database-lifecycle.ts +11 -11
  81. package/corpus/templates/content/actions/_content-database-personal-view.ts +2 -0
  82. package/corpus/templates/content/actions/_content-favorites.ts +37 -0
  83. package/corpus/templates/content/actions/_content-save-outcomes.ts +5 -0
  84. package/corpus/templates/content/actions/_database-membership-lock.ts +39 -8
  85. package/corpus/templates/content/actions/_database-navigation.ts +19 -21
  86. package/corpus/templates/content/actions/_database-row-batch.ts +41 -18
  87. package/corpus/templates/content/actions/_database-row-mutation.ts +17 -28
  88. package/corpus/templates/content/actions/_database-source-utils.ts +308 -9
  89. package/corpus/templates/content/actions/_database-utils.ts +96 -7
  90. package/corpus/templates/content/actions/_database-view-setup.ts +37 -2
  91. package/corpus/templates/content/actions/_delete-content-space.ts +8 -1
  92. package/corpus/templates/content/actions/_document-edit-mutation.ts +33 -32
  93. package/corpus/templates/content/actions/_document-flush.ts +593 -171
  94. package/corpus/templates/content/actions/_document-save-locks.ts +54 -0
  95. package/corpus/templates/content/actions/_document-save-row.ts +133 -0
  96. package/corpus/templates/content/actions/_github-source-freshness.ts +30 -4
  97. package/corpus/templates/content/actions/_github-source.ts +18 -8
  98. package/corpus/templates/content/actions/_move-page-to-space.ts +189 -25
  99. package/corpus/templates/content/actions/_nfm-syntax.ts +2 -0
  100. package/corpus/templates/content/actions/_row-lock-order.ts +115 -0
  101. package/corpus/templates/content/actions/add-content-database-source-field-property.ts +23 -6
  102. package/corpus/templates/content/actions/cancel-prepared-builder-source-update.ts +110 -26
  103. package/corpus/templates/content/actions/change-content-database-source-role.ts +51 -7
  104. package/corpus/templates/content/actions/create-content-database.ts +11 -0
  105. package/corpus/templates/content/actions/create-document.ts +13 -1
  106. package/corpus/templates/content/actions/delete-content-database.ts +17 -14
  107. package/corpus/templates/content/actions/delete-document-property.ts +5 -0
  108. package/corpus/templates/content/actions/delete-document.ts +311 -100
  109. package/corpus/templates/content/actions/disconnect-content-database-source.ts +68 -2
  110. package/corpus/templates/content/actions/disconnect-local-folder-source.ts +33 -2
  111. package/corpus/templates/content/actions/edit-document.ts +18 -5
  112. package/corpus/templates/content/actions/execute-builder-source-execution.ts +900 -140
  113. package/corpus/templates/content/actions/export-document.ts +3 -0
  114. package/corpus/templates/content/actions/get-blocks-field-word-count.ts +22 -5
  115. package/corpus/templates/content/actions/get-document.ts +2 -0
  116. package/corpus/templates/content/actions/import-content-source.ts +170 -54
  117. package/corpus/templates/content/actions/move-document.ts +191 -73
  118. package/corpus/templates/content/actions/permanently-delete-document.ts +6 -0
  119. package/corpus/templates/content/actions/prepare-builder-source-execution.ts +155 -13
  120. package/corpus/templates/content/actions/prepare-builder-source-review.ts +299 -73
  121. package/corpus/templates/content/actions/pull-document.ts +8 -2
  122. package/corpus/templates/content/actions/remove-database-items.ts +23 -4
  123. package/corpus/templates/content/actions/restore-content-database.ts +76 -55
  124. package/corpus/templates/content/actions/restore-document-version.ts +19 -35
  125. package/corpus/templates/content/actions/restore-document.ts +65 -53
  126. package/corpus/templates/content/actions/rollback-created-slash-document.ts +11 -16
  127. package/corpus/templates/content/actions/set-document-property.ts +15 -1
  128. package/corpus/templates/content/actions/set-live-body-switch.ts +45 -0
  129. package/corpus/templates/content/actions/share-local-file-document.ts +18 -14
  130. package/corpus/templates/content/actions/suggest-document-edit.ts +2 -3
  131. package/corpus/templates/content/actions/sync-local-folder-source.ts +35 -1
  132. package/corpus/templates/content/actions/undo-content-import.ts +16 -12
  133. package/corpus/templates/content/actions/update-content-database-view.ts +2 -0
  134. package/corpus/templates/content/actions/update-document.ts +158 -34
  135. package/corpus/templates/content/actions/validate-builder-source-execution.ts +135 -26
  136. package/corpus/templates/content/app/components/editor/BubbleToolbar.tsx +1 -6
  137. package/corpus/templates/content/app/components/editor/CommentsSidebar.tsx +49 -3
  138. package/corpus/templates/content/app/components/editor/ContentImportDialog.tsx +2 -0
  139. package/corpus/templates/content/app/components/editor/DocumentBlockFields.tsx +53 -11
  140. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +608 -353
  141. package/corpus/templates/content/app/components/editor/StaticDocumentBody.tsx +765 -0
  142. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +233 -80
  143. package/corpus/templates/content/app/components/editor/blockFieldSaveController.ts +32 -3
  144. package/corpus/templates/content/app/components/editor/blockFieldSaveRegistry.ts +88 -23
  145. package/corpus/templates/content/app/components/editor/comment-anchors.ts +19 -0
  146. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +228 -71
  147. package/corpus/templates/content/app/components/editor/database/GitHubSourceStatusLine.tsx +27 -2
  148. package/corpus/templates/content/app/components/editor/database/ListItemLayout.tsx +32 -8
  149. package/corpus/templates/content/app/components/editor/database/ListItemRow.tsx +27 -2
  150. package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +1 -0
  151. package/corpus/templates/content/app/components/editor/document-flush-participant.ts +253 -0
  152. package/corpus/templates/content/app/components/editor/editor-transaction-meta.ts +28 -0
  153. package/corpus/templates/content/app/components/editor/extensions/AudioBlock.tsx +2 -1
  154. package/corpus/templates/content/app/components/editor/extensions/ImageBlock.tsx +27 -6
  155. package/corpus/templates/content/app/components/editor/extensions/LocalMdxComponentNode.tsx +0 -1
  156. package/corpus/templates/content/app/components/editor/extensions/NotionExtensions.tsx +4 -4
  157. package/corpus/templates/content/app/components/editor/extensions/SuggestionHighlight.ts +24 -2
  158. package/corpus/templates/content/app/components/editor/extensions/VideoBlock.tsx +25 -6
  159. package/corpus/templates/content/app/components/editor/pending-document-persistence.ts +59 -1
  160. package/corpus/templates/content/app/components/editor/stored-body-images.ts +27 -0
  161. package/corpus/templates/content/app/components/editor/suggestions/presentation-rebase.ts +17 -0
  162. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +11 -4
  163. package/corpus/templates/content/app/components/trash/TrashBrowser.tsx +4 -1
  164. package/corpus/templates/content/app/global.css +21 -0
  165. package/corpus/templates/content/app/hooks/use-content-database.ts +40 -2
  166. package/corpus/templates/content/app/hooks/use-content-trash.ts +8 -0
  167. package/corpus/templates/content/app/hooks/use-documents.ts +14 -0
  168. package/corpus/templates/content/app/i18n-data.ts +1 -0
  169. package/corpus/templates/content/app/import-messages.ts +25 -0
  170. package/corpus/templates/content/app/trash-messages.ts +16 -0
  171. 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
  172. package/corpus/templates/content/changelog/2026-10-16-a-page-restored-from-trash-returns-to-its-place-in-its-colle.md +6 -0
  173. package/corpus/templates/content/changelog/2026-10-16-agent-written-markdown-keeps-nested-lists-indented-with-spac.md +6 -0
  174. package/corpus/templates/content/changelog/2026-10-16-opening-a-page-you-can-edit-no-longer-rebuilds-its-editor-on.md +6 -0
  175. package/corpus/templates/content/changelog/2026-10-16-pages-moved-or-imported-at-the-same-time-can-no-longer-end-u.md +6 -0
  176. package/corpus/templates/content/changelog/2026-10-16-re-importing-a-markdown-export-of-a-page-no-longer-reports-t.md +6 -0
  177. package/corpus/templates/content/changelog/2026-10-16-saving-a-page-or-restoring-one-of-its-versions-no-longer-fai.md +6 -0
  178. package/corpus/templates/content/changelog/2026-10-17-agents-reading-a-page-you-have-open-no-longer-wait-or-fail-w.md +6 -0
  179. package/corpus/templates/content/changelog/2026-10-17-builder-content-avoids-retrying-a-write-when-builder-accepte.md +6 -0
  180. package/corpus/templates/content/changelog/2026-10-18-link-a-new-collection-to-a-github-folder-from-its-sources.md +1 -1
  181. package/corpus/templates/content/changelog/2026-10-19-fresh-document-reads-require-confirmation-from-every-open-ed.md +6 -0
  182. package/corpus/templates/content/changelog/2026-10-20-builder-content-sync-keeps-read-and-write-status-accurate-wh.md +6 -0
  183. package/corpus/templates/content/changelog/2026-10-20-html-table-cells-preserve-a-trailing-backslash-when-opening-.md +6 -0
  184. package/corpus/templates/content/changelog/2026-10-20-preserve-empty-paragraph-colors-and-refuse-unsupported-inlin.md +6 -0
  185. package/corpus/templates/content/changelog/2026-10-20-the-advanced-filter-and-each-filter-group-inside-it-have-the.md +6 -0
  186. package/corpus/templates/content/changelog/2026-10-21-blocks-fields-keep-unconfirmed-saves-visible-and-agent-reads.md +6 -0
  187. package/corpus/templates/content/changelog/2026-10-21-list-rows-can-show-each-pages-first-lines.md +6 -0
  188. package/corpus/templates/content/changelog/2026-10-21-preserve-compact-table-row-groups-and-report-invalid-block-colors.md +6 -0
  189. package/corpus/templates/content/changelog/2026-10-21-suggested-edits-show-an-agent-s-whole-reason-open-a-group-to.md +6 -0
  190. package/corpus/templates/content/changelog/2026-10-21-suggestions-keep-refusing-unmatched-emphasis-in-stored-markd.md +6 -0
  191. package/corpus/templates/content/changelog/2026-10-22-a-collection-linked-to-a-big-github-folder-fills-faster-and-p.md +6 -0
  192. package/corpus/templates/content/changelog/2026-10-22-accept-remaining-and-reject-remaining-show-the-result-for-ev.md +6 -0
  193. package/corpus/templates/content/changelog/2026-10-22-accepting-a-group-of-suggested-edits-saves-faster-and-adds-o.md +6 -0
  194. package/corpus/templates/content/changelog/2026-10-22-agents-read-saved-page-text-after-failed-icon-change.md +6 -0
  195. 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
  196. package/corpus/templates/content/changelog/2026-10-22-text-an-agent-writes-inside-a-callout-column-or-synced-block.md +6 -0
  197. package/corpus/templates/content/docs/product/capabilities/content.source.adapters.md +29 -0
  198. package/corpus/templates/content/e2e/auth-files.ts +28 -0
  199. package/corpus/templates/content/e2e/convergence-summary.ts +84 -29
  200. package/corpus/templates/content/e2e/gate-arm.ts +15 -0
  201. package/corpus/templates/content/e2e/global-setup.ts +43 -75
  202. package/corpus/templates/content/e2e/global-teardown.ts +34 -0
  203. package/corpus/templates/content/e2e/helpers.ts +598 -92
  204. package/corpus/templates/content/e2e/live-body-gate.ts +188 -0
  205. package/corpus/templates/content/e2e/playwright.config.ts +12 -3
  206. package/corpus/templates/content/e2e/server-identity.ts +47 -0
  207. package/corpus/templates/content/e2e/stored-form/collab-blocks.ts +123 -0
  208. package/corpus/templates/content/package.json +1 -1
  209. package/corpus/templates/content/parity/matrix.md +42 -42
  210. package/corpus/templates/content/parity/matrix.ts +3 -1
  211. package/corpus/templates/content/scripts/_stored-form-census-kinds.ts +30 -2
  212. package/corpus/templates/content/scripts/historical-icon-apply.ts +9 -1
  213. package/corpus/templates/content/scripts/trace-startup.mjs +460 -133
  214. package/corpus/templates/content/server/db/exec.ts +58 -0
  215. package/corpus/templates/content/server/db/schema.ts +21 -0
  216. package/corpus/templates/content/server/lib/content-trash-purge.ts +222 -144
  217. package/corpus/templates/content/server/lib/document-metadata-updated-at.ts +43 -1
  218. package/corpus/templates/content/server/lib/document-revision.ts +23 -0
  219. package/corpus/templates/content/server/lib/live-body-writer.ts +311 -0
  220. package/corpus/templates/content/server/lib/notion-sync.ts +63 -29
  221. package/corpus/templates/content/server/lib/notion.ts +5 -5
  222. package/corpus/templates/content/server/lib/suggested-edits.ts +357 -230
  223. package/corpus/templates/content/server/live-copy/binding.ts +31 -0
  224. package/corpus/templates/content/server/live-copy/bounded-task.d.ts +6 -0
  225. package/corpus/templates/content/server/live-copy/exec-db.ts +1 -0
  226. package/corpus/templates/content/server/live-copy/holds.ts +59 -0
  227. package/corpus/templates/content/server/live-copy/persist.ts +656 -0
  228. package/corpus/templates/content/server/live-copy/switch.ts +136 -0
  229. package/corpus/templates/content/server/live-copy/task-names.ts +4 -0
  230. package/corpus/templates/content/server/live-copy/tasks.ts +183 -0
  231. package/corpus/templates/content/server/live-copy/write-cause.ts +85 -0
  232. package/corpus/templates/content/server/live-copy/write.ts +85 -0
  233. package/corpus/templates/content/server/plugins/builder-private-payload-cleanup.ts +22 -0
  234. package/corpus/templates/content/server/plugins/collab.ts +3 -0
  235. package/corpus/templates/content/server/plugins/db.ts +33 -0
  236. package/corpus/templates/content/server/routes/api/documents/[id]/move.patch.ts +50 -168
  237. package/corpus/templates/content/shared/api.ts +32 -1
  238. package/corpus/templates/content/shared/blocks-fields-manifest.ts +106 -0
  239. package/corpus/templates/content/shared/database-item-layout.ts +54 -22
  240. package/corpus/templates/content/shared/database-query.ts +192 -30
  241. package/corpus/templates/content/shared/document-export.ts +12 -14
  242. package/corpus/templates/content/shared/document-flush-protocol.ts +88 -0
  243. package/corpus/templates/content/shared/document-intent-merge.ts +16 -9
  244. package/corpus/templates/content/shared/editor-save-state.ts +97 -0
  245. package/corpus/templates/content/shared/feature-flags.ts +10 -0
  246. package/corpus/templates/content/shared/import/markdown.ts +91 -7
  247. package/corpus/templates/content/shared/import/types.ts +2 -0
  248. package/corpus/templates/content/shared/inline-math.ts +6 -4
  249. package/corpus/templates/content/shared/nfm-fidelity.ts +247 -0
  250. package/corpus/templates/content/shared/nfm.ts +1933 -340
  251. package/corpus/templates/content/shared/og-description.ts +258 -36
  252. package/corpus/templates/content/shared/suggestion-diff.ts +13 -0
  253. package/corpus/templates/content/shared/suggestion-formatting.ts +143 -20
  254. package/corpus/templates/content/shared/suggestion-text.ts +39 -0
  255. package/corpus/templates/content/vitest.config.ts +10 -0
  256. package/corpus/templates/crm/.agents/skills/actions/references/action-fields.md +1 -1
  257. package/corpus/templates/design/.agents/skills/actions/references/action-fields.md +1 -1
  258. package/corpus/templates/design/.agents/skills/design-templates/SKILL.md +5 -1
  259. package/corpus/templates/design/.agents/skills/native-effects/SKILL.md +9 -2
  260. package/corpus/templates/design/.generated/bridge/shader-fill-preview.generated.ts +3 -249
  261. package/corpus/templates/design/.generated/bridge/shader-runtime.generated.ts +30 -92
  262. package/corpus/templates/design/AGENTS.md +1 -3
  263. package/corpus/templates/design/CHANGELOG.md +34 -0
  264. package/corpus/templates/design/CODE_NATIVE_DESIGN_STUDIO_IMPLEMENTATION_PLAN.md +1 -6
  265. package/corpus/templates/design/DESIGN-STUDIO-PLAN.md +5 -7
  266. package/corpus/templates/design/actions/_native-local-export-server.ts +44 -31
  267. package/corpus/templates/design/actions/_native-render-contexts.ts +76 -21
  268. package/corpus/templates/design/actions/claim-native-local-export.ts +5 -0
  269. package/corpus/templates/design/actions/finish-native-local-export.ts +13 -2
  270. package/corpus/templates/design/actions/get-getting-started.ts +53 -0
  271. package/corpus/templates/design/actions/get-native-shader-approvals.ts +35 -0
  272. package/corpus/templates/design/actions/get-shader.ts +134 -219
  273. package/corpus/templates/design/actions/list-design-extensions.ts +3 -58
  274. package/corpus/templates/design/actions/request-native-local-export.ts +32 -6
  275. package/corpus/templates/design/actions/run-design-extension-action.ts +0 -29
  276. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +141 -108
  277. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +0 -218
  278. package/corpus/templates/design/app/components/design/DesignThumbnail.tsx +59 -3
  279. package/corpus/templates/design/app/components/design/EditPanel.tsx +35 -47
  280. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +242 -62
  281. package/corpus/templates/design/app/components/design/NativePreviewErrorBoundary.tsx +53 -0
  282. package/corpus/templates/design/app/components/design/bridge/codegen.ts +18 -3
  283. package/corpus/templates/design/app/components/design/bridge/native-composition-clock.ts +5 -4
  284. package/corpus/templates/design/app/components/design/bridge/native-dom.ts +37 -0
  285. package/corpus/templates/design/app/components/design/bridge/native-intrinsic-image.ts +2 -1
  286. package/corpus/templates/design/app/components/design/bridge/native-mesh-grid.ts +90 -0
  287. package/corpus/templates/design/app/components/design/bridge/native-opaque-public-asset.ts +363 -0
  288. package/corpus/templates/design/app/components/design/bridge/native-opaque-worker-lease.ts +179 -0
  289. package/corpus/templates/design/app/components/design/bridge/native-preview-geometry.ts +132 -7
  290. package/corpus/templates/design/app/components/design/bridge/native-preview-policy.ts +4 -0
  291. package/corpus/templates/design/app/components/design/bridge/native-preview-viewport-transport.ts +378 -0
  292. package/corpus/templates/design/app/components/design/bridge/native-scene-body-transform.ts +62 -0
  293. package/corpus/templates/design/app/components/design/bridge/native-scene-presentation-element.ts +10 -0
  294. package/corpus/templates/design/app/components/design/bridge/native-shader-runtime.bridge.ts +778 -246
  295. package/corpus/templates/design/app/components/design/bridge/native-source-provider.ts +512 -320
  296. package/corpus/templates/design/app/components/design/bridge/native-stateful-resource.ts +2 -2
  297. package/corpus/templates/design/app/components/design/bridge/native-stateless-compute.ts +5 -2
  298. package/corpus/templates/design/app/components/design/bridge/native-svg-source.ts +11 -1
  299. package/corpus/templates/design/app/components/design/bridge/native-worker-broker.ts +6 -0
  300. package/corpus/templates/design/app/components/design/bridge/native-worker-entry.ts +761 -303
  301. package/corpus/templates/design/app/components/design/bridge/native-worker-fill.ts +16 -6
  302. package/corpus/templates/design/app/components/design/bridge/native-worker-gpu.ts +854 -91
  303. package/corpus/templates/design/app/components/design/bridge/native-worker-host.ts +15 -1
  304. package/corpus/templates/design/app/components/design/bridge/native-worker-input-assets.ts +200 -0
  305. package/corpus/templates/design/app/components/design/bridge/native-worker-protocol.ts +40 -1
  306. package/corpus/templates/design/app/components/design/bridge/native-worker-scene-host.ts +540 -161
  307. package/corpus/templates/design/app/components/design/bridge/native-worker-source-snapshot.ts +21 -0
  308. package/corpus/templates/design/app/components/design/bridge/shader-fill-preview.bridge.ts +5 -371
  309. package/corpus/templates/design/app/components/design/bridge/shader-runtime.bridge.ts +45 -150
  310. package/corpus/templates/design/app/components/design/design-canvas/interact-document.ts +5 -9
  311. package/corpus/templates/design/app/components/design/design-canvas/native-preview-surface.ts +150 -0
  312. package/corpus/templates/design/app/components/design/design-canvas/native-public-asset-preview.ts +409 -0
  313. package/corpus/templates/design/app/components/design/design-canvas/native-public-worker-preview.ts +1086 -0
  314. package/corpus/templates/design/app/components/design/design-canvas/private-replay-screenshot-preview.ts +2 -2
  315. package/corpus/templates/design/app/components/design/design-canvas/text-content-change-result.ts +46 -12
  316. package/corpus/templates/design/app/components/design/edit-panel/effects-properties.tsx +15 -26
  317. package/corpus/templates/design/app/components/design/edit-panel/fill-properties.tsx +74 -67
  318. package/corpus/templates/design/app/components/design/edit-panel/panel-primitives.tsx +7 -19
  319. package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +39 -30
  320. package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +4 -0
  321. package/corpus/templates/design/app/components/design/inspector/NativeShaderColorControls.tsx +3 -7
  322. package/corpus/templates/design/app/components/design/inspector/NativeShaderPaintControls.tsx +12 -5
  323. package/corpus/templates/design/app/components/design/inspector/NativeShaderPanel.tsx +705 -190
  324. package/corpus/templates/design/app/components/design/inspector/fill-field-reading.ts +1 -2
  325. package/corpus/templates/design/app/components/design/inspector/index.ts +0 -6
  326. package/corpus/templates/design/app/components/design/inspector/native-catalog-display.ts +26 -5
  327. package/corpus/templates/design/app/components/design/inspector/native-shader-catalog-fixture.ts +42 -0
  328. package/corpus/templates/design/app/components/design/inspector/native-shader-catalog-preview.ts +51 -33
  329. package/corpus/templates/design/app/components/design/inspector/native-shader-paint.ts +1 -0
  330. package/corpus/templates/design/app/components/design/inspector/native-shader-property-draft.ts +89 -23
  331. package/corpus/templates/design/app/components/design/inspector/saved-glsl-shader.tsx +243 -0
  332. package/corpus/templates/design/app/components/design/multi-screen/board-surface-html.ts +54 -5
  333. package/corpus/templates/design/app/components/design/shader-source-coordination.ts +66 -0
  334. package/corpus/templates/design/app/components/design/use-native-shader-approvals.ts +36 -8
  335. package/corpus/templates/design/app/components/home/DesignHomeLibrary.tsx +15 -8
  336. package/corpus/templates/design/app/components/layout/GettingStarted.tsx +50 -0
  337. package/corpus/templates/design/app/components/layout/Sidebar.tsx +3 -0
  338. package/corpus/templates/design/app/components/templates/DesignTemplateGrid.tsx +163 -0
  339. package/corpus/templates/design/app/components/templates/DesignTemplateLibrary.tsx +65 -78
  340. package/corpus/templates/design/app/components/templates/TemplatePreview.tsx +66 -5
  341. package/corpus/templates/design/app/global.css +6 -0
  342. package/corpus/templates/design/app/i18n/en-US.ts +95 -2
  343. package/corpus/templates/design/app/lib/canvas-load-outcome.ts +147 -0
  344. package/corpus/templates/design/app/lib/canvas-outcome-tracking.ts +531 -0
  345. package/corpus/templates/design/app/lib/canvas-style-kind.ts +50 -0
  346. package/corpus/templates/design/app/pages/Index.tsx +10 -3
  347. package/corpus/templates/design/app/pages/Present.tsx +36 -1
  348. package/corpus/templates/design/app/pages/design-editor/commands/apply-file-content-update.ts +1 -1
  349. package/corpus/templates/design/app/pages/design-editor/commands/apply-local-content-update.ts +1 -1
  350. package/corpus/templates/design/app/pages/design-editor/commands/commit-visual-styles.ts +88 -32
  351. package/corpus/templates/design/app/pages/design-editor/commands/cross-screen-element-drop.ts +1 -1
  352. package/corpus/templates/design/app/pages/design-editor/commands/layer-move-to-screen.ts +1 -1
  353. package/corpus/templates/design/app/pages/design-editor/commands/paste-selection.ts +1 -1
  354. package/corpus/templates/design/app/pages/design-editor/commands/paste-svg-layer.ts +1 -1
  355. package/corpus/templates/design/app/pages/design-editor/commands/prepare-content-history-replay.ts +1 -1
  356. package/corpus/templates/design/app/pages/design-editor/commands/redo.ts +1 -1
  357. package/corpus/templates/design/app/pages/design-editor/commands/render-png-blob.ts +84 -41
  358. package/corpus/templates/design/app/pages/design-editor/commands/save-file-content.ts +38 -3
  359. package/corpus/templates/design/app/pages/design-editor/commands/shader-source-edit.ts +1 -1
  360. package/corpus/templates/design/app/pages/design-editor/commands/undo.ts +1 -1
  361. package/corpus/templates/design/app/pages/design-editor/design-editor-view.tsx +0 -2
  362. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-content-and-components.ts +4 -33
  363. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-core.ts +9 -0
  364. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-export-and-handoff.ts +2 -2
  365. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-files-and-saving.ts +2 -0
  366. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-history.ts +0 -11
  367. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-layer-models.ts +2 -55
  368. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-screen-rendering.tsx +0 -3
  369. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-selection-and-styles.ts +0 -24
  370. package/corpus/templates/design/app/pages/design-editor/text-edit-utils.ts +0 -16
  371. package/corpus/templates/design/app/pages/design-editor/use-native-local-export-requests.ts +70 -11
  372. package/corpus/templates/design/app/pages/design-editor/view/single-screen-canvas.tsx +0 -2
  373. package/corpus/templates/design/changelog/2026-10-20-folded-mesh-adds-an-animated-sculpted-fill-with-editable-col.md +6 -0
  374. package/corpus/templates/design/changelog/2026-10-20-read-only-design-views-render-native-shader-previews-in-nest.md +6 -0
  375. package/corpus/templates/design/changelog/2026-10-20-selected-screens-with-shader-effects-can-be-exported-togethe.md +6 -0
  376. package/corpus/templates/design/changelog/2026-10-20-shader-previews-reuse-validated-scene-data-while-panning-inc.md +6 -0
  377. package/corpus/templates/design/changelog/2026-10-20-shader-previews-stay-aligned-while-you-zoom.md +6 -0
  378. package/corpus/templates/design/changelog/2026-10-20-signed-out-sessions-no-longer-watch-for-private-png-export-r.md +6 -0
  379. package/corpus/templates/design/changelog/2026-10-21-a-getting-started-checklist-at-the-bottom-of-the-sidebar-tra.md +6 -0
  380. package/corpus/templates/design/changelog/2026-10-21-effect-thumbnails-show-richer-previews.md +6 -0
  381. package/corpus/templates/design/changelog/2026-10-21-native-effects-render-across-previews.md +6 -0
  382. package/corpus/templates/design/changelog/2026-10-21-native-shader-previews-use-less-gpu-memory-when-many-mesh-ef.md +6 -0
  383. package/corpus/templates/design/changelog/2026-10-21-opening-design-no-longer-shows-png-export-errors-when-no-exp.md +6 -0
  384. package/corpus/templates/design/changelog/2026-10-21-pulsing-border-controls-grouped.md +6 -0
  385. package/corpus/templates/design/changelog/2026-10-21-pulsing-border-follows-element-outlines.md +6 -0
  386. package/corpus/templates/design/changelog/2026-10-21-remove-obsolete-shader-fills.md +6 -0
  387. package/corpus/templates/design/changelog/2026-10-21-shader-previews-recover-from-temporary-gpu-and-image-failure.md +6 -0
  388. package/corpus/templates/design/changelog/2026-10-21-templates-now-open-a-read-only-preview-from-the-card-and-the.md +6 -0
  389. package/corpus/templates/design/changelog/2026-10-22-collapsed-shader-layers-no-longer-interrupt-other-shaders-on.md +6 -0
  390. package/corpus/templates/design/changelog/2026-10-22-shader-fills-and-effects-render-correctly-on-canvas-elements.md +6 -0
  391. package/corpus/templates/design/changelog/2026-10-22-shader-fills-keep-rendering-when-other-screen-content-cannot.md +6 -0
  392. package/corpus/templates/design/package.json +0 -1
  393. package/corpus/templates/design/playwright.config.ts +1 -1
  394. package/corpus/templates/design/scripts/design-export-validation/export-baseline.json +24 -0
  395. package/corpus/templates/design/scripts/runtime-budget-zoom.ts +9 -21
  396. package/corpus/templates/design/scripts/runtime-budget.ts +10 -24
  397. package/corpus/templates/design/server/lib/getting-started.ts +267 -0
  398. package/corpus/templates/design/server/plugins/agent-chat.ts +0 -2
  399. package/corpus/templates/design/server/plugins/getting-started.ts +5 -0
  400. package/corpus/templates/design/shared/design-template-presets/analytics-dashboard.ts +127 -0
  401. package/corpus/templates/design/shared/design-template-presets/design-studio.ts +98 -0
  402. package/corpus/templates/design/shared/design-template-presets/messaging-app.ts +101 -0
  403. package/corpus/templates/design/shared/design-template-presets/project-tasks.ts +120 -0
  404. package/corpus/templates/design/shared/design-template-presets.ts +8 -0
  405. package/corpus/templates/design/shared/effect-graph.ts +46 -1
  406. package/corpus/templates/design/shared/generation-output-receipt.ts +0 -1
  407. package/corpus/templates/design/shared/native-effect-animation-capability.ts +6 -0
  408. package/corpus/templates/design/shared/native-effect-folded-mesh-v1.ts +268 -0
  409. package/corpus/templates/design/shared/native-effect-folded-mesh-v2.ts +310 -0
  410. package/corpus/templates/design/shared/native-effect-folded-mesh.ts +489 -0
  411. package/corpus/templates/design/shared/native-effect-gallery-additions.ts +2 -2
  412. package/corpus/templates/design/shared/native-effect-paint.ts +8 -0
  413. package/corpus/templates/design/shared/native-effect-parameter-constraints.ts +8 -1
  414. package/corpus/templates/design/shared/native-effect-presets.ts +18 -1
  415. package/corpus/templates/design/shared/native-effect-property-presentation.ts +81 -0
  416. package/corpus/templates/design/shared/native-effect-pulsing-border-v3.ts +281 -0
  417. package/corpus/templates/design/shared/native-effect-pulsing-border-v4.ts +284 -0
  418. package/corpus/templates/design/shared/native-effect-pulsing-border.ts +300 -0
  419. package/corpus/templates/design/shared/native-effect-trust.ts +6 -0
  420. package/corpus/templates/design/shared/native-effect-wgsl.ts +12 -0
  421. package/corpus/templates/design/shared/native-effects.ts +528 -15
  422. package/corpus/templates/design/shared/native-input-resources.ts +36 -0
  423. package/corpus/templates/design/shared/native-local-export.ts +14 -0
  424. package/corpus/templates/design/shared/native-parameter-animation.ts +1 -0
  425. package/corpus/templates/design/shared/native-pointer-input.ts +9 -11
  426. package/corpus/templates/design/shared/shader-fills.ts +0 -513
  427. package/corpus/templates/design/vitest.setup.ts +7 -1
  428. package/corpus/templates/dispatch/.agents/skills/actions/references/action-fields.md +1 -1
  429. package/corpus/templates/dispatch/.agents/skills/turn-into-app/SKILL.md +20 -18
  430. package/corpus/templates/factory/.agents/skills/actions/references/action-fields.md +1 -1
  431. package/corpus/templates/factory/.agents/skills/review-latest-feedback/SKILL.md +36 -80
  432. package/corpus/templates/factory/.agents/skills/review-latest-feedback/references/channel-inventory.md +54 -16
  433. package/corpus/templates/factory/.agents/skills/review-latest-feedback/references/slack-reaction-replies.md +50 -73
  434. package/corpus/templates/factory/.agents/skills/turn-into-app/SKILL.md +20 -18
  435. package/corpus/templates/forms/.agents/skills/actions/references/action-fields.md +1 -1
  436. package/corpus/templates/forms/server/plugins/agent-chat.ts +1 -1
  437. package/corpus/templates/mail/.agents/skills/actions/references/action-fields.md +1 -1
  438. package/corpus/templates/plan/.agents/skills/actions/references/action-fields.md +1 -1
  439. package/corpus/templates/slides/.agents/skills/actions/references/action-fields.md +1 -1
  440. package/corpus/templates/slides/CHANGELOG.md +6 -0
  441. package/corpus/templates/slides/actions/delete-deck.ts +7 -0
  442. package/corpus/templates/slides/changelog/2026-10-21-connected-deck-deletion-requires-approval.md +6 -0
  443. package/corpus/templates/slides/scripts/edit-fidelity/client-action.ts +61 -0
  444. package/corpus/templates/slides/scripts/edit-fidelity/run.ts +10 -0
  445. package/corpus/templates/slides-2/.agents/skills/actions/SKILL.md +199 -0
  446. package/corpus/templates/slides-2/.agents/skills/actions/references/action-fields.md +145 -0
  447. package/corpus/templates/slides-2/.agents/skills/actions/references/examples.md +96 -0
  448. package/corpus/templates/slides-2/.agents/skills/actions/references/provider-apis.md +95 -0
  449. package/corpus/templates/slides-2/.agents/skills/adding-a-feature/SKILL.md +235 -0
  450. package/corpus/templates/slides-2/.agents/skills/agent-native-docs/SKILL.md +161 -0
  451. package/corpus/templates/slides-2/.agents/skills/agent-native-toolkit/SKILL.md +314 -0
  452. package/corpus/templates/slides-2/.agents/skills/analytics-data-for-decks/SKILL.md +44 -0
  453. package/corpus/templates/slides-2/.agents/skills/apply-slide-comments/SKILL.md +63 -0
  454. package/corpus/templates/slides-2/.agents/skills/client-side-routing/SKILL.md +87 -0
  455. package/corpus/templates/slides-2/.agents/skills/context-awareness/SKILL.md +282 -0
  456. package/corpus/templates/slides-2/.agents/skills/create-deck/SKILL.md +263 -0
  457. package/corpus/templates/slides-2/.agents/skills/create-deck/references/reference-inputs.md +72 -0
  458. package/corpus/templates/slides-2/.agents/skills/create-deck/references/slide-templates.md +93 -0
  459. package/corpus/templates/slides-2/.agents/skills/create-deck/references/source-material.md +16 -0
  460. package/corpus/templates/slides-2/.agents/skills/creative-context/SKILL.md +134 -0
  461. package/corpus/templates/slides-2/.agents/skills/customizing-agent-native/SKILL.md +219 -0
  462. package/corpus/templates/slides-2/.agents/skills/deck-management/SKILL.md +182 -0
  463. package/corpus/templates/slides-2/.agents/skills/delegate-to-agent/SKILL.md +62 -0
  464. package/corpus/templates/slides-2/.agents/skills/design-systems/SKILL.md +233 -0
  465. package/corpus/templates/slides-2/.agents/skills/external-agents/SKILL.md +549 -0
  466. package/corpus/templates/slides-2/.agents/skills/external-agents/references/mcp-apps-embedding.md +169 -0
  467. package/corpus/templates/slides-2/.agents/skills/frontend-design/SKILL.md +102 -0
  468. package/corpus/templates/slides-2/.agents/skills/frontend-design/references/visual-direction.md +102 -0
  469. package/corpus/templates/slides-2/.agents/skills/image-generation-via-a2a/SKILL.md +134 -0
  470. package/corpus/templates/slides-2/.agents/skills/performance/SKILL.md +79 -0
  471. package/corpus/templates/slides-2/.agents/skills/portability/SKILL.md +108 -0
  472. package/corpus/templates/slides-2/.agents/skills/real-time-sync/SKILL.md +146 -0
  473. package/corpus/templates/slides-2/.agents/skills/reliable-mutations/SKILL.md +72 -0
  474. package/corpus/templates/slides-2/.agents/skills/secrets/SKILL.md +82 -0
  475. package/corpus/templates/slides-2/.agents/skills/security/SKILL.md +80 -0
  476. package/corpus/templates/slides-2/.agents/skills/self-modifying-code/SKILL.md +123 -0
  477. package/corpus/templates/slides-2/.agents/skills/shadcn-ui/SKILL.md +71 -0
  478. package/corpus/templates/slides-2/.agents/skills/sharing/SKILL.md +286 -0
  479. package/corpus/templates/slides-2/.agents/skills/slide-design/SKILL.md +144 -0
  480. package/corpus/templates/slides-2/.agents/skills/slide-editing/SKILL.md +284 -0
  481. package/corpus/templates/slides-2/.agents/skills/slide-editing/references/animations.md +33 -0
  482. package/corpus/templates/slides-2/.agents/skills/slide-editing/references/freeform-objects.md +22 -0
  483. package/corpus/templates/slides-2/.agents/skills/slide-editing/references/restyling.md +69 -0
  484. package/corpus/templates/slides-2/.agents/skills/slide-editing/references/transitions.md +26 -0
  485. package/corpus/templates/slides-2/.agents/skills/slide-editing/references/video.md +45 -0
  486. package/corpus/templates/slides-2/.agents/skills/slide-images/SKILL.md +136 -0
  487. package/corpus/templates/slides-2/.agents/skills/storing-data/SKILL.md +234 -0
  488. package/corpus/templates/slides-2/.agents/skills/turn-into-skill/SKILL.md +112 -0
  489. package/corpus/templates/slides-2/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  490. package/corpus/templates/slides-2/.agents/skills/workspace-conventions/SKILL.md +103 -0
  491. package/corpus/templates/slides-2/.builder/rules/deploy-app.mdc +22 -0
  492. package/corpus/templates/slides-2/.builder/rules/organize-ui.mdc +9 -0
  493. package/corpus/templates/slides-2/.dockerignore +61 -0
  494. package/corpus/templates/slides-2/.env.example +23 -0
  495. package/corpus/templates/slides-2/.ignore +3 -0
  496. package/corpus/templates/slides-2/.mcp.json +8 -0
  497. package/corpus/templates/slides-2/.oxfmtrc.json +8 -0
  498. package/corpus/templates/slides-2/AGENTS.md +66 -0
  499. package/corpus/templates/slides-2/CHANGELOG.md +76 -0
  500. package/corpus/templates/slides-2/DEVELOPING.md +157 -0
  501. package/corpus/templates/slides-2/README.md +58 -0
  502. package/corpus/templates/slides-2/THIRD_PARTY_NOTICES.md +33 -0
  503. package/corpus/templates/slides-2/_gitignore +38 -0
  504. package/corpus/templates/slides-2/actions/_agent-presence.ts +29 -0
  505. package/corpus/templates/slides-2/actions/_app-url.ts +37 -0
  506. package/corpus/templates/slides-2/actions/_deck-app-scope.ts +30 -0
  507. package/corpus/templates/slides-2/actions/_deck-tracking.ts +260 -0
  508. package/corpus/templates/slides-2/actions/_deck-write.ts +206 -0
  509. package/corpus/templates/slides-2/actions/_imported-slide-source.ts +162 -0
  510. package/corpus/templates/slides-2/actions/_inline-image-storage.ts +1013 -0
  511. package/corpus/templates/slides-2/actions/_linked-design-system.ts +83 -0
  512. package/corpus/templates/slides-2/actions/_presenter-notes.ts +83 -0
  513. package/corpus/templates/slides-2/actions/_render-artifacts.ts +111 -0
  514. package/corpus/templates/slides-2/actions/_slide-source.ts +344 -0
  515. package/corpus/templates/slides-2/actions/_tab-state.ts +51 -0
  516. package/corpus/templates/slides-2/actions/_test-brandfetch.ts +31 -0
  517. package/corpus/templates/slides-2/actions/_uploaded-files.ts +114 -0
  518. package/corpus/templates/slides-2/actions/add-deck.ts +123 -0
  519. package/corpus/templates/slides-2/actions/add-slide-comment.ts +267 -0
  520. package/corpus/templates/slides-2/actions/add-slide.ts +888 -0
  521. package/corpus/templates/slides-2/actions/analyze-brand-assets.ts +66 -0
  522. package/corpus/templates/slides-2/actions/apply-design-system.ts +111 -0
  523. package/corpus/templates/slides-2/actions/approve-deck-access-request.ts +287 -0
  524. package/corpus/templates/slides-2/actions/audit-contrast.ts +143 -0
  525. package/corpus/templates/slides-2/actions/check-image-gen.ts +17 -0
  526. package/corpus/templates/slides-2/actions/clone-context-slide.ts +340 -0
  527. package/corpus/templates/slides-2/actions/clone-creative-context-deck.ts +143 -0
  528. package/corpus/templates/slides-2/actions/control-deck-history.ts +186 -0
  529. package/corpus/templates/slides-2/actions/control-presenter.ts +117 -0
  530. package/corpus/templates/slides-2/actions/control-slide-editor.ts +267 -0
  531. package/corpus/templates/slides-2/actions/create-deck-from-template.ts +274 -0
  532. package/corpus/templates/slides-2/actions/create-deck.ts +1243 -0
  533. package/corpus/templates/slides-2/actions/create-design-system.ts +131 -0
  534. package/corpus/templates/slides-2/actions/create-share-link.ts +127 -0
  535. package/corpus/templates/slides-2/actions/db-health.ts +22 -0
  536. package/corpus/templates/slides-2/actions/delete-asset.ts +154 -0
  537. package/corpus/templates/slides-2/actions/delete-deck.ts +427 -0
  538. package/corpus/templates/slides-2/actions/delete-design-system.ts +167 -0
  539. package/corpus/templates/slides-2/actions/delete-slide-comment.ts +143 -0
  540. package/corpus/templates/slides-2/actions/delete-staged-dataset.ts +30 -0
  541. package/corpus/templates/slides-2/actions/duplicate-deck.ts +299 -0
  542. package/corpus/templates/slides-2/actions/export-google-slides.ts +41 -0
  543. package/corpus/templates/slides-2/actions/export-html.ts +770 -0
  544. package/corpus/templates/slides-2/actions/export-pptx.ts +2203 -0
  545. package/corpus/templates/slides-2/actions/extract-pdf.ts +49 -0
  546. package/corpus/templates/slides-2/actions/generate-image-api.ts +671 -0
  547. package/corpus/templates/slides-2/actions/generate-image.ts +492 -0
  548. package/corpus/templates/slides-2/actions/get-agent-access-deck.ts +52 -0
  549. package/corpus/templates/slides-2/actions/get-deck-access-status.ts +130 -0
  550. package/corpus/templates/slides-2/actions/get-deck-design-tokens.ts +62 -0
  551. package/corpus/templates/slides-2/actions/get-deck-reference-context.ts +232 -0
  552. package/corpus/templates/slides-2/actions/get-deck-template.ts +38 -0
  553. package/corpus/templates/slides-2/actions/get-deck-version.ts +85 -0
  554. package/corpus/templates/slides-2/actions/get-deck.ts +562 -0
  555. package/corpus/templates/slides-2/actions/get-design-system-decode-job-status.ts +57 -0
  556. package/corpus/templates/slides-2/actions/get-design-system-tier-limit.ts +12 -0
  557. package/corpus/templates/slides-2/actions/get-design-system.ts +453 -0
  558. package/corpus/templates/slides-2/actions/get-google-docs-status.ts +106 -0
  559. package/corpus/templates/slides-2/actions/get-google-picker-token.ts +84 -0
  560. package/corpus/templates/slides-2/actions/get-home-suggestions.ts +52 -0
  561. package/corpus/templates/slides-2/actions/get-layout-overflows.ts +192 -0
  562. package/corpus/templates/slides-2/actions/get-slide-render.ts +125 -0
  563. package/corpus/templates/slides-2/actions/get-slide-source.ts +115 -0
  564. package/corpus/templates/slides-2/actions/get-slide-theme-preview.ts +64 -0
  565. package/corpus/templates/slides-2/actions/get-slide-theme.ts +44 -0
  566. package/corpus/templates/slides-2/actions/get-slides-2-upload-storage-status.ts +17 -0
  567. package/corpus/templates/slides-2/actions/get-slides-notification-prefs.ts +37 -0
  568. package/corpus/templates/slides-2/actions/get-workspace-defaults.ts +51 -0
  569. package/corpus/templates/slides-2/actions/image-gen-status.ts +35 -0
  570. package/corpus/templates/slides-2/actions/import-code.ts +26 -0
  571. package/corpus/templates/slides-2/actions/import-design-project.ts +49 -0
  572. package/corpus/templates/slides-2/actions/import-document.ts +125 -0
  573. package/corpus/templates/slides-2/actions/import-docx.ts +57 -0
  574. package/corpus/templates/slides-2/actions/import-file.ts +1273 -0
  575. package/corpus/templates/slides-2/actions/import-from-url.ts +25 -0
  576. package/corpus/templates/slides-2/actions/import-google-doc.ts +208 -0
  577. package/corpus/templates/slides-2/actions/import-google-font.ts +110 -0
  578. package/corpus/templates/slides-2/actions/import-google-slides-reference.ts +667 -0
  579. package/corpus/templates/slides-2/actions/import-pptx.ts +564 -0
  580. package/corpus/templates/slides-2/actions/import-svgl-logo.ts +115 -0
  581. package/corpus/templates/slides-2/actions/index-design-system-with-builder.ts +181 -0
  582. package/corpus/templates/slides-2/actions/index-uploaded-design-system-files.ts +77 -0
  583. package/corpus/templates/slides-2/actions/list-assets.ts +286 -0
  584. package/corpus/templates/slides-2/actions/list-deck-templates.ts +83 -0
  585. package/corpus/templates/slides-2/actions/list-deck-versions.ts +185 -0
  586. package/corpus/templates/slides-2/actions/list-decks.ts +591 -0
  587. package/corpus/templates/slides-2/actions/list-design-systems.ts +180 -0
  588. package/corpus/templates/slides-2/actions/list-slide-comments.ts +128 -0
  589. package/corpus/templates/slides-2/actions/list-slide-themes.ts +17 -0
  590. package/corpus/templates/slides-2/actions/list-staged-datasets.ts +14 -0
  591. package/corpus/templates/slides-2/actions/logo-config.ts +13 -0
  592. package/corpus/templates/slides-2/actions/navigate.ts +158 -0
  593. package/corpus/templates/slides-2/actions/patch-deck.ts +2378 -0
  594. package/corpus/templates/slides-2/actions/provider-api-catalog.ts +25 -0
  595. package/corpus/templates/slides-2/actions/provider-api-docs.ts +83 -0
  596. package/corpus/templates/slides-2/actions/provider-api-request.ts +222 -0
  597. package/corpus/templates/slides-2/actions/query-staged-dataset.ts +83 -0
  598. package/corpus/templates/slides-2/actions/read-composer-source.ts +108 -0
  599. package/corpus/templates/slides-2/actions/request-deck-access.ts +803 -0
  600. package/corpus/templates/slides-2/actions/restore-deck-version.ts +203 -0
  601. package/corpus/templates/slides-2/actions/run.ts +2 -0
  602. package/corpus/templates/slides-2/actions/save-deck.ts +313 -0
  603. package/corpus/templates/slides-2/actions/search-google-fonts.ts +61 -0
  604. package/corpus/templates/slides-2/actions/search-images.ts +30 -0
  605. package/corpus/templates/slides-2/actions/search-logos.ts +23 -0
  606. package/corpus/templates/slides-2/actions/search-svgl-logos.ts +42 -0
  607. package/corpus/templates/slides-2/actions/set-default-design-system.ts +88 -0
  608. package/corpus/templates/slides-2/actions/set-workspace-defaults.ts +61 -0
  609. package/corpus/templates/slides-2/actions/start-design-system-upload.ts +80 -0
  610. package/corpus/templates/slides-2/actions/sync-design-system-with-builder.ts +84 -0
  611. package/corpus/templates/slides-2/actions/toggle-slide-comment-reaction.ts +150 -0
  612. package/corpus/templates/slides-2/actions/transform-slide-objects.ts +1528 -0
  613. package/corpus/templates/slides-2/actions/update-asset.ts +499 -0
  614. package/corpus/templates/slides-2/actions/update-deck-aspect-ratio.ts +95 -0
  615. package/corpus/templates/slides-2/actions/update-deck-design-tokens.ts +175 -0
  616. package/corpus/templates/slides-2/actions/update-design-system.ts +95 -0
  617. package/corpus/templates/slides-2/actions/update-slide-comment.ts +213 -0
  618. package/corpus/templates/slides-2/actions/update-slide-source.ts +353 -0
  619. package/corpus/templates/slides-2/actions/update-slide.ts +850 -0
  620. package/corpus/templates/slides-2/actions/update-slides-notification-prefs.ts +55 -0
  621. package/corpus/templates/slides-2/actions/view-screen.ts +1098 -0
  622. package/corpus/templates/slides-2/agent-native.app-skill.json +165 -0
  623. package/corpus/templates/slides-2/agent-native.config.ts +20 -0
  624. package/corpus/templates/slides-2/agent-native.json +18 -0
  625. package/corpus/templates/slides-2/app/components/ThemeToggle.tsx +47 -0
  626. package/corpus/templates/slides-2/app/components/comments/SlideCommentPins.tsx +781 -0
  627. package/corpus/templates/slides-2/app/components/comments/SlideCommentsPanel.tsx +1075 -0
  628. package/corpus/templates/slides-2/app/components/deck/DeckCard.tsx +304 -0
  629. package/corpus/templates/slides-2/app/components/deck/DeckFilterMenu.tsx +83 -0
  630. package/corpus/templates/slides-2/app/components/deck/ExcalidrawSlide.tsx +183 -0
  631. package/corpus/templates/slides-2/app/components/deck/MermaidRenderer.tsx +126 -0
  632. package/corpus/templates/slides-2/app/components/deck/SlideRenderer.tsx +1553 -0
  633. package/corpus/templates/slides-2/app/components/design-system/DesignSystemCard.tsx +235 -0
  634. package/corpus/templates/slides-2/app/components/design-system/DesignSystemSetup.tsx +2021 -0
  635. package/corpus/templates/slides-2/app/components/design-system/builder-design-system-upload.ts +200 -0
  636. package/corpus/templates/slides-2/app/components/design-system/builder-index-response.ts +104 -0
  637. package/corpus/templates/slides-2/app/components/editor/AddSlidePopover.tsx +461 -0
  638. package/corpus/templates/slides-2/app/components/editor/AiEditingMarker.tsx +24 -0
  639. package/corpus/templates/slides-2/app/components/editor/AlignmentGuides.tsx +82 -0
  640. package/corpus/templates/slides-2/app/components/editor/AnimationsPanel.tsx +698 -0
  641. package/corpus/templates/slides-2/app/components/editor/AppMenu.tsx +356 -0
  642. package/corpus/templates/slides-2/app/components/editor/AssetLibraryPanel.tsx +508 -0
  643. package/corpus/templates/slides-2/app/components/editor/BlockBubbleMenu.tsx +548 -0
  644. package/corpus/templates/slides-2/app/components/editor/DeckAccessDeniedPage.tsx +173 -0
  645. package/corpus/templates/slides-2/app/components/editor/DeckEditorSkeleton.tsx +35 -0
  646. package/corpus/templates/slides-2/app/components/editor/DeferredPopoverFallback.tsx +148 -0
  647. package/corpus/templates/slides-2/app/components/editor/EditorActionCluster.tsx +217 -0
  648. package/corpus/templates/slides-2/app/components/editor/EditorSidebar.tsx +1047 -0
  649. package/corpus/templates/slides-2/app/components/editor/EditorToolbar.tsx +1285 -0
  650. package/corpus/templates/slides-2/app/components/editor/ExportMenu.tsx +579 -0
  651. package/corpus/templates/slides-2/app/components/editor/GeneratingOverlay.tsx +21 -0
  652. package/corpus/templates/slides-2/app/components/editor/GeneratingSlidePreview.tsx +73 -0
  653. package/corpus/templates/slides-2/app/components/editor/GoogleDocImportHint.tsx +378 -0
  654. package/corpus/templates/slides-2/app/components/editor/GoogleDriveConnectionCta.tsx +154 -0
  655. package/corpus/templates/slides-2/app/components/editor/GoogleSlidesReferenceImport.tsx +299 -0
  656. package/corpus/templates/slides-2/app/components/editor/HistoryPanel.tsx +354 -0
  657. package/corpus/templates/slides-2/app/components/editor/HomeQuickStartDialog.tsx +202 -0
  658. package/corpus/templates/slides-2/app/components/editor/ImageCropOverlay.tsx +820 -0
  659. package/corpus/templates/slides-2/app/components/editor/ImageDropPromptPopover.tsx +280 -0
  660. package/corpus/templates/slides-2/app/components/editor/ImageGenPanel.tsx +244 -0
  661. package/corpus/templates/slides-2/app/components/editor/ImageOverlay.tsx +280 -0
  662. package/corpus/templates/slides-2/app/components/editor/ImageSearchPanel.tsx +183 -0
  663. package/corpus/templates/slides-2/app/components/editor/ImportDeckButton.tsx +247 -0
  664. package/corpus/templates/slides-2/app/components/editor/LogoSearchPanel.tsx +366 -0
  665. package/corpus/templates/slides-2/app/components/editor/MermaidToExcalidrawPanel.tsx +99 -0
  666. package/corpus/templates/slides-2/app/components/editor/MissingDeckAccessPane.tsx +219 -0
  667. package/corpus/templates/slides-2/app/components/editor/NewDeckReferenceStep.tsx +812 -0
  668. package/corpus/templates/slides-2/app/components/editor/PromptDialog.tsx +963 -0
  669. package/corpus/templates/slides-2/app/components/editor/QuestionFlow.tsx +119 -0
  670. package/corpus/templates/slides-2/app/components/editor/RequestDeckAccessDialog.tsx +101 -0
  671. package/corpus/templates/slides-2/app/components/editor/ShareDialog.tsx +126 -0
  672. package/corpus/templates/slides-2/app/components/editor/SlideContextToolbar.tsx +1471 -0
  673. package/corpus/templates/slides-2/app/components/editor/SlideEditor.tsx +11183 -0
  674. package/corpus/templates/slides-2/app/components/editor/SlideOverflowWarning.tsx +82 -0
  675. package/corpus/templates/slides-2/app/components/editor/SlideScrollStack.tsx +307 -0
  676. package/corpus/templates/slides-2/app/components/editor/SlideSlashCommandMenu.tsx +692 -0
  677. package/corpus/templates/slides-2/app/components/editor/SlideThumbnailContextMenu.tsx +52 -0
  678. package/corpus/templates/slides-2/app/components/editor/SlideTransitionControl.tsx +184 -0
  679. package/corpus/templates/slides-2/app/components/editor/SlidesComposerContext.tsx +789 -0
  680. package/corpus/templates/slides-2/app/components/editor/SlidesComposerContextProvider.tsx +74 -0
  681. package/corpus/templates/slides-2/app/components/editor/SlidesLayersPanel.tsx +377 -0
  682. package/corpus/templates/slides-2/app/components/editor/SpeakerNotesPanel.tsx +119 -0
  683. package/corpus/templates/slides-2/app/components/editor/TweaksPanel.tsx +77 -0
  684. package/corpus/templates/slides-2/app/components/editor/UploadStorageGate.tsx +37 -0
  685. package/corpus/templates/slides-2/app/components/editor/bullet-editing.ts +880 -0
  686. package/corpus/templates/slides-2/app/components/editor/canvas-interactions/index.ts +12 -0
  687. package/corpus/templates/slides-2/app/components/editor/canvas-interactions/slides-canvas-adapter.ts +119 -0
  688. package/corpus/templates/slides-2/app/components/editor/commit-active-edit.ts +14 -0
  689. package/corpus/templates/slides-2/app/components/editor/editor-command-model.ts +35 -0
  690. package/corpus/templates/slides-2/app/components/editor/fit-text-object.ts +31 -0
  691. package/corpus/templates/slides-2/app/components/editor/in-place-text-session.browser-cases.json +983 -0
  692. package/corpus/templates/slides-2/app/components/editor/in-place-text-session.browser-host.ts +747 -0
  693. package/corpus/templates/slides-2/app/components/editor/in-place-text-session.ts +6891 -0
  694. package/corpus/templates/slides-2/app/components/editor/inline-edit-session.ts +26 -0
  695. package/corpus/templates/slides-2/app/components/editor/list-editing.ts +501 -0
  696. package/corpus/templates/slides-2/app/components/editor/rich-text-selection.ts +975 -0
  697. package/corpus/templates/slides-2/app/components/editor/rte-test-utils.ts +265 -0
  698. package/corpus/templates/slides-2/app/components/editor/selection-overlay-measurement.ts +191 -0
  699. package/corpus/templates/slides-2/app/components/editor/slide-escape-arbiter.ts +34 -0
  700. package/corpus/templates/slides-2/app/components/editor/slide-object-interactions.ts +6362 -0
  701. package/corpus/templates/slides-2/app/components/editor/slide-object-transform.browser-host.ts +19 -0
  702. package/corpus/templates/slides-2/app/components/editor/slide-pointer-target.ts +432 -0
  703. package/corpus/templates/slides-2/app/components/editor/slide-presence.ts +13 -0
  704. package/corpus/templates/slides-2/app/components/editor/slide-style.ts +243 -0
  705. package/corpus/templates/slides-2/app/components/editor/slide-text-targets.ts +540 -0
  706. package/corpus/templates/slides-2/app/components/editor/style-clipboard.ts +102 -0
  707. package/corpus/templates/slides-2/app/components/editor/use-prompt-import.ts +159 -0
  708. package/corpus/templates/slides-2/app/components/home/SlidesHomeLibrary.tsx +79 -0
  709. package/corpus/templates/slides-2/app/components/layout/AgentWorkIndicator.tsx +193 -0
  710. package/corpus/templates/slides-2/app/components/layout/Header.tsx +110 -0
  711. package/corpus/templates/slides-2/app/components/layout/Layout.tsx +492 -0
  712. package/corpus/templates/slides-2/app/components/layout/Sidebar.tsx +109 -0
  713. package/corpus/templates/slides-2/app/components/layout/layout-route-policy.ts +28 -0
  714. package/corpus/templates/slides-2/app/components/presentation/PresentationView.tsx +1116 -0
  715. package/corpus/templates/slides-2/app/components/presentation/PresenterView.tsx +526 -0
  716. package/corpus/templates/slides-2/app/components/presentation/SlideTransitionStage.tsx +297 -0
  717. package/corpus/templates/slides-2/app/components/presentation/present-channel.ts +31 -0
  718. package/corpus/templates/slides-2/app/components/presentation/slide-build-steps.ts +231 -0
  719. package/corpus/templates/slides-2/app/components/presentation/slide-navigation.ts +273 -0
  720. package/corpus/templates/slides-2/app/components/presentation/slide-transition-motion.ts +258 -0
  721. package/corpus/templates/slides-2/app/components/presentation/voice-navigation.ts +61 -0
  722. package/corpus/templates/slides-2/app/components/settings/notification-settings.tsx +93 -0
  723. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2AssetBrowser.tsx +726 -0
  724. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2CommandMenu.tsx +453 -0
  725. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2Comments.tsx +571 -0
  726. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2DesignTokens.tsx +345 -0
  727. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2Editor.tsx +4804 -0
  728. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2ExportMenu.tsx +671 -0
  729. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2FontBrowser.tsx +342 -0
  730. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2ImageCropControls.tsx +487 -0
  731. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2Inspector.tsx +950 -0
  732. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2SvglLogoSearchDialog.tsx +332 -0
  733. package/corpus/templates/slides-2/app/components/slides-2-editor/cross-slide-edit-history.ts +151 -0
  734. package/corpus/templates/slides-2/app/components/slides-2-editor/design-token-presets.ts +140 -0
  735. package/corpus/templates/slides-2/app/components/slides-2-editor/editor-action-errors.ts +47 -0
  736. package/corpus/templates/slides-2/app/components/slides-2-editor/editor-export-errors.ts +60 -0
  737. package/corpus/templates/slides-2/app/components/slides-2-editor/geometry.ts +275 -0
  738. package/corpus/templates/slides-2/app/components/slides-2-editor/image-crop-style.ts +82 -0
  739. package/corpus/templates/slides-2/app/components/slides-2-editor/inline-text-editor.tsx +631 -0
  740. package/corpus/templates/slides-2/app/components/slides-2-editor/keyboard-shortcuts.ts +104 -0
  741. package/corpus/templates/slides-2/app/components/slides-2-editor/object-insertion.ts +13 -0
  742. package/corpus/templates/slides-2/app/components/slides-2-editor/preview-patches.ts +54 -0
  743. package/corpus/templates/slides-2/app/components/slides-2-editor/sandbox-render-errors.ts +23 -0
  744. package/corpus/templates/slides-2/app/components/slides-2-editor/source-structure.ts +634 -0
  745. package/corpus/templates/slides-2/app/components/slides-2-editor/types.ts +85 -0
  746. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2BlackoutOverlay.tsx +13 -0
  747. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2ControlBar.tsx +285 -0
  748. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2HelpDialog.tsx +72 -0
  749. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2JumpInput.tsx +38 -0
  750. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2LaserPointer.tsx +67 -0
  751. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2Overview.tsx +161 -0
  752. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2Player.tsx +839 -0
  753. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2ProgressBar.tsx +23 -0
  754. package/corpus/templates/slides-2/app/components/slides-2-presenter/keyboard.ts +36 -0
  755. package/corpus/templates/slides-2/app/components/slides-2-presenter/presenter-channel.ts +131 -0
  756. package/corpus/templates/slides-2/app/components/slides-2-presenter/use-presenter-action-bridge.ts +296 -0
  757. package/corpus/templates/slides-2/app/components/slides-2-presenter/useSlides2TouchSwipe.ts +80 -0
  758. package/corpus/templates/slides-2/app/components/slides-2-runtime/SandboxedSlide.tsx +724 -0
  759. package/corpus/templates/slides-2/app/components/slides-2-runtime/SlideContentRenderer.tsx +137 -0
  760. package/corpus/templates/slides-2/app/components/slides-2-runtime/Slides2Canvas.tsx +99 -0
  761. package/corpus/templates/slides-2/app/components/slides-2-runtime/constants.ts +4 -0
  762. package/corpus/templates/slides-2/app/components/slides-2-runtime/protocol.ts +1400 -0
  763. package/corpus/templates/slides-2/app/components/slides-2-runtime/transition-frame.ts +439 -0
  764. package/corpus/templates/slides-2/app/components/templates/DeckTemplateLibrary.tsx +314 -0
  765. package/corpus/templates/slides-2/app/components/templates/DeckTemplatePreview.tsx +60 -0
  766. package/corpus/templates/slides-2/app/components/templates/DeckTemplateStage.tsx +45 -0
  767. package/corpus/templates/slides-2/app/components/ui/alert-dialog.tsx +1 -0
  768. package/corpus/templates/slides-2/app/components/ui/avatar.tsx +1 -0
  769. package/corpus/templates/slides-2/app/components/ui/button-group.tsx +1 -0
  770. package/corpus/templates/slides-2/app/components/ui/button.tsx +1 -0
  771. package/corpus/templates/slides-2/app/components/ui/card.tsx +1 -0
  772. package/corpus/templates/slides-2/app/components/ui/command.tsx +1 -0
  773. package/corpus/templates/slides-2/app/components/ui/context-menu.tsx +32 -0
  774. package/corpus/templates/slides-2/app/components/ui/dialog.tsx +1 -0
  775. package/corpus/templates/slides-2/app/components/ui/dropdown-menu.tsx +1 -0
  776. package/corpus/templates/slides-2/app/components/ui/filter-trigger.tsx +1 -0
  777. package/corpus/templates/slides-2/app/components/ui/input.tsx +1 -0
  778. package/corpus/templates/slides-2/app/components/ui/label.tsx +1 -0
  779. package/corpus/templates/slides-2/app/components/ui/popover.tsx +1 -0
  780. package/corpus/templates/slides-2/app/components/ui/progress.tsx +1 -0
  781. package/corpus/templates/slides-2/app/components/ui/scroll-area.tsx +1 -0
  782. package/corpus/templates/slides-2/app/components/ui/select.tsx +1 -0
  783. package/corpus/templates/slides-2/app/components/ui/separator.tsx +1 -0
  784. package/corpus/templates/slides-2/app/components/ui/sheet.tsx +1 -0
  785. package/corpus/templates/slides-2/app/components/ui/skeleton.tsx +1 -0
  786. package/corpus/templates/slides-2/app/components/ui/slider.tsx +1 -0
  787. package/corpus/templates/slides-2/app/components/ui/spinner.tsx +1 -0
  788. package/corpus/templates/slides-2/app/components/ui/switch.tsx +1 -0
  789. package/corpus/templates/slides-2/app/components/ui/tabs.tsx +59 -0
  790. package/corpus/templates/slides-2/app/components/ui/textarea.tsx +1 -0
  791. package/corpus/templates/slides-2/app/components/ui/toggle-group.tsx +1 -0
  792. package/corpus/templates/slides-2/app/components/ui/toolkit-provider.tsx +17 -0
  793. package/corpus/templates/slides-2/app/components/ui/tooltip.tsx +1 -0
  794. package/corpus/templates/slides-2/app/components/visual-editor/CanvasCommentPins.tsx +46 -0
  795. package/corpus/templates/slides-2/app/components/visual-editor/DrawOverlay.tsx +27 -0
  796. package/corpus/templates/slides-2/app/components/visual-editor/MultiSelectChip.tsx +97 -0
  797. package/corpus/templates/slides-2/app/components/visual-editor/SaveStatusIndicator.tsx +273 -0
  798. package/corpus/templates/slides-2/app/components/visual-editor/index.ts +4 -0
  799. package/corpus/templates/slides-2/app/context/DeckContext.tsx +7486 -0
  800. package/corpus/templates/slides-2/app/design-system.ts +3 -0
  801. package/corpus/templates/slides-2/app/entry.client.tsx +10 -0
  802. package/corpus/templates/slides-2/app/entry.server.tsx +10 -0
  803. package/corpus/templates/slides-2/app/global.css +1626 -0
  804. package/corpus/templates/slides-2/app/hooks/use-agent-generating.ts +517 -0
  805. package/corpus/templates/slides-2/app/hooks/use-compact-editor-layout.ts +26 -0
  806. package/corpus/templates/slides-2/app/hooks/use-contrast-audit-bridge.ts +49 -0
  807. package/corpus/templates/slides-2/app/hooks/use-deck-access-reload.ts +70 -0
  808. package/corpus/templates/slides-2/app/hooks/use-deck-access.ts +50 -0
  809. package/corpus/templates/slides-2/app/hooks/use-deck-design-system.ts +146 -0
  810. package/corpus/templates/slides-2/app/hooks/use-deck-history-action-bridge.ts +266 -0
  811. package/corpus/templates/slides-2/app/hooks/use-deck-presence.ts +89 -0
  812. package/corpus/templates/slides-2/app/hooks/use-deck-role.ts +46 -0
  813. package/corpus/templates/slides-2/app/hooks/use-deck-versions.ts +43 -0
  814. package/corpus/templates/slides-2/app/hooks/use-design-system-workflows.ts +11 -0
  815. package/corpus/templates/slides-2/app/hooks/use-design-systems.ts +31 -0
  816. package/corpus/templates/slides-2/app/hooks/use-generating-slide-preview.ts +115 -0
  817. package/corpus/templates/slides-2/app/hooks/use-navigation-state.ts +229 -0
  818. package/corpus/templates/slides-2/app/hooks/use-new-deck-generation-signal.ts +46 -0
  819. package/corpus/templates/slides-2/app/hooks/use-new-deck-generation.ts +710 -0
  820. package/corpus/templates/slides-2/app/hooks/use-sidebar-collapsed.ts +95 -0
  821. package/corpus/templates/slides-2/app/hooks/use-slide-comments.ts +202 -0
  822. package/corpus/templates/slides-2/app/hooks/use-slide-file-storage-status.ts +55 -0
  823. package/corpus/templates/slides-2/app/hooks/use-undo-selection.ts +66 -0
  824. package/corpus/templates/slides-2/app/hooks/use-workspace-defaults.ts +31 -0
  825. package/corpus/templates/slides-2/app/i18n/en-US.ts +1507 -0
  826. package/corpus/templates/slides-2/app/i18n/index.ts +19 -0
  827. package/corpus/templates/slides-2/app/lib/agent-visible-message.ts +21 -0
  828. package/corpus/templates/slides-2/app/lib/aspect-ratios.ts +7 -0
  829. package/corpus/templates/slides-2/app/lib/asset-error-copy.ts +59 -0
  830. package/corpus/templates/slides-2/app/lib/canvas-zoom.ts +47 -0
  831. package/corpus/templates/slides-2/app/lib/composer-context.ts +152 -0
  832. package/corpus/templates/slides-2/app/lib/composer-draft.ts +34 -0
  833. package/corpus/templates/slides-2/app/lib/contrast-audit.ts +390 -0
  834. package/corpus/templates/slides-2/app/lib/contrast-resolve.ts +240 -0
  835. package/corpus/templates/slides-2/app/lib/create-deck-generation.ts +938 -0
  836. package/corpus/templates/slides-2/app/lib/deck-access-lost.ts +4 -0
  837. package/corpus/templates/slides-2/app/lib/deck-backup.ts +186 -0
  838. package/corpus/templates/slides-2/app/lib/deck-editor-loading.ts +91 -0
  839. package/corpus/templates/slides-2/app/lib/deck-export-file-client.ts +77 -0
  840. package/corpus/templates/slides-2/app/lib/deck-filter.ts +52 -0
  841. package/corpus/templates/slides-2/app/lib/deck-list-loading.ts +16 -0
  842. package/corpus/templates/slides-2/app/lib/deck-preview-frame.ts +15 -0
  843. package/corpus/templates/slides-2/app/lib/deck-share-links.ts +9 -0
  844. package/corpus/templates/slides-2/app/lib/deck-sorting.ts +19 -0
  845. package/corpus/templates/slides-2/app/lib/deferred-editor-surfaces.ts +24 -0
  846. package/corpus/templates/slides-2/app/lib/design-system-selection.ts +11 -0
  847. package/corpus/templates/slides-2/app/lib/design-systems.ts +231 -0
  848. package/corpus/templates/slides-2/app/lib/dynamic-import.ts +50 -0
  849. package/corpus/templates/slides-2/app/lib/editor-agent-handoff.ts +92 -0
  850. package/corpus/templates/slides-2/app/lib/editor-shortcuts.ts +153 -0
  851. package/corpus/templates/slides-2/app/lib/export-google-slides-client.ts +168 -0
  852. package/corpus/templates/slides-2/app/lib/export-pdf-client.ts +684 -0
  853. package/corpus/templates/slides-2/app/lib/export-pptx-client.ts +2420 -0
  854. package/corpus/templates/slides-2/app/lib/generation-lifecycle.ts +24 -0
  855. package/corpus/templates/slides-2/app/lib/generation-state.ts +247 -0
  856. package/corpus/templates/slides-2/app/lib/google-docs-client.ts +110 -0
  857. package/corpus/templates/slides-2/app/lib/google-slides-export-availability-client.ts +53 -0
  858. package/corpus/templates/slides-2/app/lib/google-slides-reference-source.ts +18 -0
  859. package/corpus/templates/slides-2/app/lib/image-download.ts +85 -0
  860. package/corpus/templates/slides-2/app/lib/image-drop-to-agent.ts +210 -0
  861. package/corpus/templates/slides-2/app/lib/import-uploaded-deck.ts +132 -0
  862. package/corpus/templates/slides-2/app/lib/inline-edit-remote.ts +55 -0
  863. package/corpus/templates/slides-2/app/lib/localize-slides-changelog.ts +47 -0
  864. package/corpus/templates/slides-2/app/lib/mermaid-blocks.ts +18 -0
  865. package/corpus/templates/slides-2/app/lib/new-deck-reference-selection.ts +174 -0
  866. package/corpus/templates/slides-2/app/lib/normalize-slide-padding.ts +74 -0
  867. package/corpus/templates/slides-2/app/lib/pending-deck-changes.ts +33 -0
  868. package/corpus/templates/slides-2/app/lib/portaled-layer.ts +7 -0
  869. package/corpus/templates/slides-2/app/lib/pptx-google-slides.ts +204 -0
  870. package/corpus/templates/slides-2/app/lib/prompt-attachment-adapter.ts +37 -0
  871. package/corpus/templates/slides-2/app/lib/prompt-file-uploads.ts +557 -0
  872. package/corpus/templates/slides-2/app/lib/recent-references.ts +106 -0
  873. package/corpus/templates/slides-2/app/lib/reference-document-hydration.ts +406 -0
  874. package/corpus/templates/slides-2/app/lib/register-chat-renderers.tsx +645 -0
  875. package/corpus/templates/slides-2/app/lib/reveal-after-delete.ts +55 -0
  876. package/corpus/templates/slides-2/app/lib/sanitize-slide-html.ts +752 -0
  877. package/corpus/templates/slides-2/app/lib/slide-agent-context.ts +148 -0
  878. package/corpus/templates/slides-2/app/lib/slide-animation-elements.ts +900 -0
  879. package/corpus/templates/slides-2/app/lib/slide-clipboard.ts +534 -0
  880. package/corpus/templates/slides-2/app/lib/slide-comment-anchor.ts +286 -0
  881. package/corpus/templates/slides-2/app/lib/slide-content-merge.ts +295 -0
  882. package/corpus/templates/slides-2/app/lib/slide-image-replacement.ts +1919 -0
  883. package/corpus/templates/slides-2/app/lib/slide-live-remote.ts +215 -0
  884. package/corpus/templates/slides-2/app/lib/slide-scroll.ts +56 -0
  885. package/corpus/templates/slides-2/app/lib/slide-source-map.ts +1099 -0
  886. package/corpus/templates/slides-2/app/lib/slide-video.ts +390 -0
  887. package/corpus/templates/slides-2/app/lib/slides-relay-tracking.ts +114 -0
  888. package/corpus/templates/slides-2/app/lib/streaming-slide-html.ts +77 -0
  889. package/corpus/templates/slides-2/app/lib/tab-id.ts +3 -0
  890. package/corpus/templates/slides-2/app/lib/template-navigation.ts +15 -0
  891. package/corpus/templates/slides-2/app/lib/text-tool-shortcut.ts +75 -0
  892. package/corpus/templates/slides-2/app/lib/undo-reveal.ts +332 -0
  893. package/corpus/templates/slides-2/app/lib/upload-response.ts +107 -0
  894. package/corpus/templates/slides-2/app/lib/utils.ts +38 -0
  895. package/corpus/templates/slides-2/app/lib/validate-native-slide-html.ts +177 -0
  896. package/corpus/templates/slides-2/app/lib/video-upload.ts +354 -0
  897. package/corpus/templates/slides-2/app/pages/DeckEditor.tsx +6158 -0
  898. package/corpus/templates/slides-2/app/pages/DesignSystems.tsx +363 -0
  899. package/corpus/templates/slides-2/app/pages/Index.tsx +3254 -0
  900. package/corpus/templates/slides-2/app/pages/NotFound.tsx +33 -0
  901. package/corpus/templates/slides-2/app/pages/Presentation.tsx +120 -0
  902. package/corpus/templates/slides-2/app/pages/SharedPresentation.tsx +174 -0
  903. package/corpus/templates/slides-2/app/pages/SlideThemeDetail.tsx +227 -0
  904. package/corpus/templates/slides-2/app/pages/SlideThemes.tsx +155 -0
  905. package/corpus/templates/slides-2/app/pages/Slides2EditorPage.tsx +1618 -0
  906. package/corpus/templates/slides-2/app/pages/Slides2PresenterConsolePage.tsx +937 -0
  907. package/corpus/templates/slides-2/app/pages/Slides2PresenterPage.tsx +979 -0
  908. package/corpus/templates/slides-2/app/pages/Templates.tsx +32 -0
  909. package/corpus/templates/slides-2/app/root.tsx +391 -0
  910. package/corpus/templates/slides-2/app/routes/$.tsx +10 -0
  911. package/corpus/templates/slides-2/app/routes/_index.tsx +1 -0
  912. package/corpus/templates/slides-2/app/routes/access-request.approve.tsx +276 -0
  913. package/corpus/templates/slides-2/app/routes/agent.tsx +19 -0
  914. package/corpus/templates/slides-2/app/routes/chat.$threadId.tsx +1 -0
  915. package/corpus/templates/slides-2/app/routes/chat.tsx +190 -0
  916. package/corpus/templates/slides-2/app/routes/deck.$id.tsx +10 -0
  917. package/corpus/templates/slides-2/app/routes/deck.$id_.present.tsx +10 -0
  918. package/corpus/templates/slides-2/app/routes/design-systems.tsx +10 -0
  919. package/corpus/templates/slides-2/app/routes/extensions.$id.$slug.tsx +2 -0
  920. package/corpus/templates/slides-2/app/routes/extensions.$id.tsx +5 -0
  921. package/corpus/templates/slides-2/app/routes/extensions._index.tsx +5 -0
  922. package/corpus/templates/slides-2/app/routes/extensions.tsx +5 -0
  923. package/corpus/templates/slides-2/app/routes/home-layout.tsx +31 -0
  924. package/corpus/templates/slides-2/app/routes/home.tsx +22 -0
  925. package/corpus/templates/slides-2/app/routes/p.$id.tsx +195 -0
  926. package/corpus/templates/slides-2/app/routes/settings.$.tsx +1 -0
  927. package/corpus/templates/slides-2/app/routes/settings.tsx +131 -0
  928. package/corpus/templates/slides-2/app/routes/share.$token.tsx +137 -0
  929. package/corpus/templates/slides-2/app/routes/slide.tsx +209 -0
  930. package/corpus/templates/slides-2/app/routes/team.tsx +11 -0
  931. package/corpus/templates/slides-2/app/routes/templates.tsx +1 -0
  932. package/corpus/templates/slides-2/app/routes/themes.$id.tsx +1 -0
  933. package/corpus/templates/slides-2/app/routes/themes.tsx +1 -0
  934. package/corpus/templates/slides-2/app/routes.ts +24 -0
  935. package/corpus/templates/slides-2/app/vite-env.d.ts +24 -0
  936. package/corpus/templates/slides-2/changelog/2026-10-17-find-and-switch-decks-from-the-presenter-console.md +6 -0
  937. package/corpus/templates/slides-2/changelog/2026-10-17-meet-slides-2-create-and-refine-editable-slide-decks-with-an.md +6 -0
  938. package/corpus/templates/slides-2/changelog/2026-10-17-pptx-image-export.md +6 -0
  939. package/corpus/templates/slides-2/changelog/2026-10-17-visual-editor.md +6 -0
  940. package/corpus/templates/slides-2/changelog/2026-10-18-apply-an-accessible-design-system-to-an-existing-deck-before.md +6 -0
  941. package/corpus/templates/slides-2/changelog/2026-10-18-choose-a-template-or-start-a-new-presentation-from-the-slide.md +6 -0
  942. package/corpus/templates/slides-2/changelog/2026-10-18-generate-decks-from-a-prompt-then-edit-slide-elements-direct.md +6 -0
  943. package/corpus/templates/slides-2/changelog/2026-10-18-generate-presentation-decks-from-a-prompt-and-edit-every-sli.md +6 -0
  944. package/corpus/templates/slides-2/changelog/2026-10-18-new-presentation-drafts-save-before-generation-starts-so-you.md +6 -0
  945. package/corpus/templates/slides-2/changelog/2026-10-18-the-assistant-can-undo-redo-and-save-pending-edits-in-the-vi.md +6 -0
  946. package/corpus/templates/slides-2/changelog/2026-10-19-agents-can-insert-duplicate-and-delete-canvas-objects-in-sou.md +6 -0
  947. package/corpus/templates/slides-2/changelog/2026-10-19-browse-slide-themes.md +6 -0
  948. package/corpus/templates/slides-2/changelog/2026-10-19-clicking-a-slide-preview-in-overview-selects-that-slide.md +6 -0
  949. package/corpus/templates/slides-2/changelog/2026-10-19-create-decks-from-a-prompt-and-edit-slides-directly-on-the-c.md +6 -0
  950. package/corpus/templates/slides-2/changelog/2026-10-19-creating-and-editing-decks-now-starts-with-the-tools-most-re.md +6 -0
  951. package/corpus/templates/slides-2/changelog/2026-10-19-deleting-decks-revokes-public-links.md +7 -0
  952. package/corpus/templates/slides-2/changelog/2026-10-19-escape-cancels-an-in-progress-slide-drag-without-losing-earl.md +6 -0
  953. package/corpus/templates/slides-2/changelog/2026-10-19-import-failures-now-show-clear-localized-descriptions-instea.md +6 -0
  954. package/corpus/templates/slides-2/changelog/2026-10-19-presenter-controls-stay-responsive-when-moving-over-the-slid.md +6 -0
  955. package/corpus/templates/slides-2/changelog/2026-10-19-presenter-notes-stay-private-from-viewers-and-commenters.md +6 -0
  956. package/corpus/templates/slides-2/changelog/2026-10-19-preview-generated-slides-in-chat.md +6 -0
  957. package/corpus/templates/slides-2/changelog/2026-10-19-remote-image-previews-accept-supported-raster-formats.md +6 -0
  958. 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
  959. package/corpus/templates/slides-2/changelog/2026-10-19-slide-generation-explains-when-react-effect-hooks-cannot-run.md +6 -0
  960. package/corpus/templates/slides-2/changelog/2026-10-19-the-editor-highlights-hovered-objects-and-keeps-image-replac.md +6 -0
  961. package/corpus/templates/slides-2/changelog/2026-10-19-the-slide-editor-uses-the-shared-agent-native-controls.md +6 -0
  962. package/corpus/templates/slides-2/changelog/2026-10-20-deck-editing-controls-match-the-workspace.md +6 -0
  963. package/corpus/templates/slides-2/changelog/2026-10-20-google-slides-imports-now-report-missing-image-data-instead-.md +6 -0
  964. package/corpus/templates/slides-2/changelog/2026-10-20-imports-and-previews-handle-large-content-safely.md +6 -0
  965. package/corpus/templates/slides-2/changelog/2026-10-20-public-deck-pages-can-export-source-backed-slides-to-pdf.md +6 -0
  966. package/corpus/templates/slides-2/changelog/2026-10-20-saved-slide-images-stay-available.md +6 -0
  967. package/corpus/templates/slides-2/changelog/2026-10-20-scope-global-media-picks-to-assets-the-current-deck-can-reso.md +6 -0
  968. package/corpus/templates/slides-2/components.json +20 -0
  969. package/corpus/templates/slides-2/drizzle.config.ts +3 -0
  970. package/corpus/templates/slides-2/learnings.defaults.md +5 -0
  971. package/corpus/templates/slides-2/netlify.toml +24 -0
  972. package/corpus/templates/slides-2/package.json +147 -0
  973. package/corpus/templates/slides-2/public/agent-native-icon-dark.svg +10 -0
  974. package/corpus/templates/slides-2/public/agent-native-icon-light.svg +10 -0
  975. package/corpus/templates/slides-2/public/agent-native-logo-dark.svg +21 -0
  976. package/corpus/templates/slides-2/public/agent-native-logo-light.svg +21 -0
  977. package/corpus/templates/slides-2/public/assets/builder-logo-white.svg +15 -0
  978. package/corpus/templates/slides-2/public/assets/generated/preview.html +61 -0
  979. package/corpus/templates/slides-2/public/assets/intuit-logo-white.svg +6 -0
  980. package/corpus/templates/slides-2/public/assets/walmart-logo-white.svg +6 -0
  981. package/corpus/templates/slides-2/public/chatgpt-plugin-icon.svg +7 -0
  982. package/corpus/templates/slides-2/public/favicon.svg +1 -0
  983. package/corpus/templates/slides-2/public/icon-180.svg +1 -0
  984. package/corpus/templates/slides-2/public/icon-192.svg +1 -0
  985. package/corpus/templates/slides-2/public/icon-512.svg +1 -0
  986. package/corpus/templates/slides-2/public/manifest.json +20 -0
  987. package/corpus/templates/slides-2/public/placeholder.svg +1 -0
  988. package/corpus/templates/slides-2/public/robots.txt +14 -0
  989. package/corpus/templates/slides-2/public/visual-edit-structure-proof.html +99 -0
  990. package/corpus/templates/slides-2/react-router.config.ts +7 -0
  991. package/corpus/templates/slides-2/scripts/edit-fidelity/README.md +499 -0
  992. package/corpus/templates/slides-2/scripts/edit-fidelity/authoring-fuzz.ts +9517 -0
  993. package/corpus/templates/slides-2/scripts/edit-fidelity/baseline.json +16427 -0
  994. package/corpus/templates/slides-2/scripts/edit-fidelity/dev-server-url.ts +10 -0
  995. package/corpus/templates/slides-2/scripts/edit-fidelity/lib/in-page.ts +1975 -0
  996. package/corpus/templates/slides-2/scripts/edit-fidelity/lib/metrics.ts +1401 -0
  997. package/corpus/templates/slides-2/scripts/edit-fidelity/retry-infra.ts +7 -0
  998. package/corpus/templates/slides-2/scripts/edit-fidelity/run-options.ts +21 -0
  999. package/corpus/templates/slides-2/scripts/edit-fidelity/run-outcomes.ts +127 -0
  1000. package/corpus/templates/slides-2/scripts/edit-fidelity/run.ts +8451 -0
  1001. package/corpus/templates/slides-2/scripts/export-fidelity/README.md +116 -0
  1002. package/corpus/templates/slides-2/scripts/export-fidelity/compare-layout-lib.ts +241 -0
  1003. package/corpus/templates/slides-2/scripts/export-fidelity/compare-layout.ts +30 -0
  1004. package/corpus/templates/slides-2/scripts/export-fidelity/diff.ts +222 -0
  1005. package/corpus/templates/slides-2/scripts/export-fidelity/export.ts +765 -0
  1006. package/corpus/templates/slides-2/scripts/export-fidelity/fixtures/agent-dark-deck.json +48 -0
  1007. package/corpus/templates/slides-2/scripts/export-fidelity/generate-calibration.ts +765 -0
  1008. package/corpus/templates/slides-2/scripts/export-fidelity/google-export.ts +137 -0
  1009. package/corpus/templates/slides-2/scripts/export-fidelity/google-layout.ts +82 -0
  1010. package/corpus/templates/slides-2/scripts/export-fidelity/resolve-pkg.ts +29 -0
  1011. package/corpus/templates/slides-2/scripts/migrate-production.ts +22 -0
  1012. package/corpus/templates/slides-2/server/db/index.ts +73 -0
  1013. package/corpus/templates/slides-2/server/db/schema.ts +189 -0
  1014. package/corpus/templates/slides-2/server/handlers/assets-url.ts +13 -0
  1015. package/corpus/templates/slides-2/server/handlers/assets.ts +3217 -0
  1016. package/corpus/templates/slides-2/server/handlers/decks.ts +185 -0
  1017. package/corpus/templates/slides-2/server/handlers/demo.ts +9 -0
  1018. package/corpus/templates/slides-2/server/handlers/design-systems.ts +219 -0
  1019. package/corpus/templates/slides-2/server/handlers/google-docs-auth.ts +165 -0
  1020. package/corpus/templates/slides-2/server/handlers/image-gen.ts +153 -0
  1021. package/corpus/templates/slides-2/server/handlers/image-providers/gemini.ts +209 -0
  1022. package/corpus/templates/slides-2/server/handlers/image-providers/index.ts +61 -0
  1023. package/corpus/templates/slides-2/server/handlers/image-providers/openai.ts +288 -0
  1024. package/corpus/templates/slides-2/server/handlers/image-providers/types.ts +35 -0
  1025. package/corpus/templates/slides-2/server/handlers/import/docx-parser.ts +31 -0
  1026. package/corpus/templates/slides-2/server/handlers/import/html-converter.ts +1534 -0
  1027. package/corpus/templates/slides-2/server/handlers/import/pdf-fidelity-parser.ts +1039 -0
  1028. package/corpus/templates/slides-2/server/handlers/import/pdf-sidecar-reader.ts +81 -0
  1029. package/corpus/templates/slides-2/server/handlers/import/pdf-style-digest.ts +187 -0
  1030. package/corpus/templates/slides-2/server/handlers/import/pptx-assets.ts +155 -0
  1031. package/corpus/templates/slides-2/server/handlers/import/pptx-parser.ts +57 -0
  1032. package/corpus/templates/slides-2/server/handlers/request-auth-context.ts +108 -0
  1033. package/corpus/templates/slides-2/server/handlers/share.ts +52 -0
  1034. package/corpus/templates/slides-2/server/handlers/uploads-chunked.ts +1066 -0
  1035. package/corpus/templates/slides-2/server/handlers/uploads.ts +457 -0
  1036. package/corpus/templates/slides-2/server/lib/access-request-email.ts +66 -0
  1037. package/corpus/templates/slides-2/server/lib/assets-image-delegation.ts +331 -0
  1038. package/corpus/templates/slides-2/server/lib/bounded-multipart.ts +49 -0
  1039. package/corpus/templates/slides-2/server/lib/builder-design-system-proxy.ts +122 -0
  1040. package/corpus/templates/slides-2/server/lib/chat-attachments.ts +425 -0
  1041. package/corpus/templates/slides-2/server/lib/chatgpt-directory-tools.ts +246 -0
  1042. package/corpus/templates/slides-2/server/lib/chunked-upload-session.ts +195 -0
  1043. package/corpus/templates/slides-2/server/lib/comment-notifications.ts +184 -0
  1044. package/corpus/templates/slides-2/server/lib/deck-access-requests.ts +102 -0
  1045. package/corpus/templates/slides-2/server/lib/deck-asset-scope.ts +150 -0
  1046. package/corpus/templates/slides-2/server/lib/deck-export-tracking.ts +119 -0
  1047. package/corpus/templates/slides-2/server/lib/deck-templates/a-case-study.ts +154 -0
  1048. package/corpus/templates/slides-2/server/lib/deck-templates/a-company.ts +160 -0
  1049. package/corpus/templates/slides-2/server/lib/deck-templates/a-pitch.ts +151 -0
  1050. package/corpus/templates/slides-2/server/lib/deck-templates/a-quarterly.ts +264 -0
  1051. package/corpus/templates/slides-2/server/lib/deck-templates/a-shared.ts +35 -0
  1052. package/corpus/templates/slides-2/server/lib/deck-templates/a-update.ts +188 -0
  1053. package/corpus/templates/slides-2/server/lib/deck-templates/a-workshop.ts +196 -0
  1054. package/corpus/templates/slides-2/server/lib/deck-templates/b-keynote.ts +131 -0
  1055. package/corpus/templates/slides-2/server/lib/deck-templates/b-lesson.ts +209 -0
  1056. package/corpus/templates/slides-2/server/lib/deck-templates/b-manifesto.ts +149 -0
  1057. package/corpus/templates/slides-2/server/lib/deck-templates/b-portfolio.ts +144 -0
  1058. package/corpus/templates/slides-2/server/lib/deck-templates/b-research.ts +221 -0
  1059. package/corpus/templates/slides-2/server/lib/deck-templates/b-roadmap.ts +264 -0
  1060. package/corpus/templates/slides-2/server/lib/deck-templates/b-shared.ts +44 -0
  1061. package/corpus/templates/slides-2/server/lib/deck-templates/group-a.ts +16 -0
  1062. package/corpus/templates/slides-2/server/lib/deck-templates/group-b.ts +16 -0
  1063. package/corpus/templates/slides-2/server/lib/deck-templates/legacy.ts +567 -0
  1064. package/corpus/templates/slides-2/server/lib/deck-templates.ts +60 -0
  1065. package/corpus/templates/slides-2/server/lib/deck-versions.ts +233 -0
  1066. package/corpus/templates/slides-2/server/lib/design-system-workflows.ts +22 -0
  1067. package/corpus/templates/slides-2/server/lib/emails.ts +84 -0
  1068. package/corpus/templates/slides-2/server/lib/env-config.ts +15 -0
  1069. package/corpus/templates/slides-2/server/lib/fetch-remote-image.ts +245 -0
  1070. package/corpus/templates/slides-2/server/lib/generation-completion.ts +278 -0
  1071. package/corpus/templates/slides-2/server/lib/google-docs-access.ts +51 -0
  1072. package/corpus/templates/slides-2/server/lib/google-docs-error.ts +54 -0
  1073. package/corpus/templates/slides-2/server/lib/google-docs-oauth.ts +422 -0
  1074. package/corpus/templates/slides-2/server/lib/google-fonts.ts +509 -0
  1075. package/corpus/templates/slides-2/server/lib/google-oauth-preflight.ts +119 -0
  1076. package/corpus/templates/slides-2/server/lib/google-slides-export-availability.ts +55 -0
  1077. package/corpus/templates/slides-2/server/lib/image-proxy-response.ts +16 -0
  1078. package/corpus/templates/slides-2/server/lib/image-proxy-url.ts +155 -0
  1079. package/corpus/templates/slides-2/server/lib/import-asset-storage.ts +214 -0
  1080. package/corpus/templates/slides-2/server/lib/imported-asset-batch.ts +218 -0
  1081. package/corpus/templates/slides-2/server/lib/legacy-slide-source.ts +692 -0
  1082. package/corpus/templates/slides-2/server/lib/media-search-providers.ts +216 -0
  1083. package/corpus/templates/slides-2/server/lib/native-creative-context.ts +295 -0
  1084. package/corpus/templates/slides-2/server/lib/pdf-parse-setup.ts +115 -0
  1085. package/corpus/templates/slides-2/server/lib/provider-api.ts +57 -0
  1086. package/corpus/templates/slides-2/server/lib/request-wait-until.ts +30 -0
  1087. package/corpus/templates/slides-2/server/lib/shared-deck.ts +29 -0
  1088. package/corpus/templates/slides-2/server/lib/slide-asset-references.ts +309 -0
  1089. package/corpus/templates/slides-2/server/lib/slide-content-patch.ts +1004 -0
  1090. package/corpus/templates/slides-2/server/lib/slide-hygiene.ts +731 -0
  1091. package/corpus/templates/slides-2/server/lib/slide-image-insertion.ts +136 -0
  1092. package/corpus/templates/slides-2/server/lib/slide-reveal-issues.ts +41 -0
  1093. package/corpus/templates/slides-2/server/lib/slide-source-editing/babel-walk.ts +117 -0
  1094. package/corpus/templates/slides-2/server/lib/slide-source-editing/batch-edit.ts +152 -0
  1095. package/corpus/templates/slides-2/server/lib/slide-source-editing/edit-ops.ts +1478 -0
  1096. package/corpus/templates/slides-2/server/lib/slide-source-editing/image-target.ts +128 -0
  1097. package/corpus/templates/slides-2/server/lib/slide-source-editing/text-diff.ts +23 -0
  1098. package/corpus/templates/slides-2/server/lib/slide-source-limits.ts +9 -0
  1099. package/corpus/templates/slides-2/server/lib/slide-source.ts +1786 -0
  1100. package/corpus/templates/slides-2/server/lib/slide-theme-demo-sources.ts +2106 -0
  1101. package/corpus/templates/slides-2/server/lib/slide-themes.ts +2174 -0
  1102. package/corpus/templates/slides-2/server/lib/slide-worker-runtime.ts +1995 -0
  1103. package/corpus/templates/slides-2/server/lib/slides-tracking.ts +73 -0
  1104. package/corpus/templates/slides-2/server/lib/source-import.ts +213 -0
  1105. package/corpus/templates/slides-2/server/lib/svgl.ts +364 -0
  1106. package/corpus/templates/slides-2/server/lib/tenant-files.ts +179 -0
  1107. package/corpus/templates/slides-2/server/lib/upload-storage-status.ts +9 -0
  1108. package/corpus/templates/slides-2/server/lib/uploaded-asset-cleanup-outbox.ts +521 -0
  1109. package/corpus/templates/slides-2/server/lib/uploaded-asset-object-lifecycle.ts +404 -0
  1110. package/corpus/templates/slides-2/server/lib/uploaded-fonts.ts +696 -0
  1111. package/corpus/templates/slides-2/server/lib/uploaded-reference-storage.ts +77 -0
  1112. package/corpus/templates/slides-2/server/lib/validate-slide-animations.ts +341 -0
  1113. package/corpus/templates/slides-2/server/middleware/auth.ts +6 -0
  1114. package/corpus/templates/slides-2/server/plugins/_dev-upload-stub.ts +6 -0
  1115. package/corpus/templates/slides-2/server/plugins/agent-chat.ts +402 -0
  1116. package/corpus/templates/slides-2/server/plugins/auth.ts +31 -0
  1117. package/corpus/templates/slides-2/server/plugins/collab.ts +30 -0
  1118. package/corpus/templates/slides-2/server/plugins/config.ts +6 -0
  1119. package/corpus/templates/slides-2/server/plugins/core-routes.ts +30 -0
  1120. package/corpus/templates/slides-2/server/plugins/creative-context.ts +187 -0
  1121. package/corpus/templates/slides-2/server/plugins/db.ts +462 -0
  1122. package/corpus/templates/slides-2/server/plugins/feature-flags.ts +5 -0
  1123. package/corpus/templates/slides-2/server/plugins/labs.ts +8 -0
  1124. package/corpus/templates/slides-2/server/plugins/orphaned-asset-cleanup.ts +17 -0
  1125. package/corpus/templates/slides-2/server/plugins/otel.ts +6 -0
  1126. package/corpus/templates/slides-2/server/plugins/transactional-emails.ts +5 -0
  1127. package/corpus/templates/slides-2/server/register-secrets.ts +209 -0
  1128. package/corpus/templates/slides-2/server/routes/[...page].get.ts +5 -0
  1129. package/corpus/templates/slides-2/server/routes/[...page].head.ts +1 -0
  1130. package/corpus/templates/slides-2/server/routes/[base]/_agent-native/google-docs/auth-url.get.ts +1 -0
  1131. package/corpus/templates/slides-2/server/routes/[base]/_agent-native/google-docs/callback.get.ts +1 -0
  1132. package/corpus/templates/slides-2/server/routes/_agent-native/google-docs/auth-url.get.ts +1 -0
  1133. package/corpus/templates/slides-2/server/routes/_agent-native/google-docs/callback.get.ts +1 -0
  1134. package/corpus/templates/slides-2/server/routes/api/assets/upload-video.post.ts +1 -0
  1135. package/corpus/templates/slides-2/server/routes/api/assets/upload.post.ts +1 -0
  1136. package/corpus/templates/slides-2/server/routes/api/assets/video-uploads.delete.ts +1 -0
  1137. package/corpus/templates/slides-2/server/routes/api/deck-agent-context.json.get.ts +105 -0
  1138. package/corpus/templates/slides-2/server/routes/api/decks/events.get.ts +1 -0
  1139. package/corpus/templates/slides-2/server/routes/api/demo.get.ts +1 -0
  1140. package/corpus/templates/slides-2/server/routes/api/exports/[filename].get.ts +221 -0
  1141. package/corpus/templates/slides-2/server/routes/api/exports/google-slides.post.ts +240 -0
  1142. package/corpus/templates/slides-2/server/routes/api/exports/html.post.ts +67 -0
  1143. package/corpus/templates/slides-2/server/routes/api/exports/pptx.post.ts +100 -0
  1144. package/corpus/templates/slides-2/server/routes/api/gen-preview/[...].get.ts +24 -0
  1145. package/corpus/templates/slides-2/server/routes/api/generated/[...].get.ts +24 -0
  1146. package/corpus/templates/slides-2/server/routes/api/image-proxy.get.ts +518 -0
  1147. package/corpus/templates/slides-2/server/routes/api/import-assets/[token].get.ts +70 -0
  1148. package/corpus/templates/slides-2/server/routes/api/preview-images.get.ts +20 -0
  1149. package/corpus/templates/slides-2/server/routes/api/share/[token].get.ts +1 -0
  1150. package/corpus/templates/slides-2/server/routes/api/uploads-chunked/[sessionId]/chunk.post.ts +1 -0
  1151. package/corpus/templates/slides-2/server/routes/api/uploads-chunked/[sessionId]/status.get.ts +1 -0
  1152. package/corpus/templates/slides-2/server/routes/api/uploads-chunked/[sessionId].delete.ts +1 -0
  1153. package/corpus/templates/slides-2/server/routes/api/uploads-chunked/start.post.ts +1 -0
  1154. package/corpus/templates/slides-2/server/routes/api/uploads.delete.ts +1 -0
  1155. package/corpus/templates/slides-2/server/routes/api/uploads.post.ts +1 -0
  1156. package/corpus/templates/slides-2/server/workspace-defaults.ts +196 -0
  1157. package/corpus/templates/slides-2/shared/action-ui.ts +147 -0
  1158. package/corpus/templates/slides-2/shared/agent-readable.ts +2 -0
  1159. package/corpus/templates/slides-2/shared/api.ts +406 -0
  1160. package/corpus/templates/slides-2/shared/app-state-tabs.ts +30 -0
  1161. package/corpus/templates/slides-2/shared/app-storage.ts +9 -0
  1162. package/corpus/templates/slides-2/shared/aspect-ratios.ts +49 -0
  1163. package/corpus/templates/slides-2/shared/blank-slide.ts +179 -0
  1164. package/corpus/templates/slides-2/shared/client-compatibility.ts +2 -0
  1165. package/corpus/templates/slides-2/shared/contrast-audit.ts +255 -0
  1166. package/corpus/templates/slides-2/shared/deck-access.ts +26 -0
  1167. package/corpus/templates/slides-2/shared/deck-app-scope.ts +14 -0
  1168. package/corpus/templates/slides-2/shared/deck-content.ts +37 -0
  1169. package/corpus/templates/slides-2/shared/deck-history-control.ts +79 -0
  1170. package/corpus/templates/slides-2/shared/deck-scope.ts +5 -0
  1171. package/corpus/templates/slides-2/shared/deck-title.ts +199 -0
  1172. package/corpus/templates/slides-2/shared/deck-write.ts +61 -0
  1173. package/corpus/templates/slides-2/shared/design-flags.ts +7 -0
  1174. package/corpus/templates/slides-2/shared/design-system-validation.ts +88 -0
  1175. package/corpus/templates/slides-2/shared/editor-control.ts +120 -0
  1176. package/corpus/templates/slides-2/shared/generation-timing.ts +19 -0
  1177. package/corpus/templates/slides-2/shared/google-docs.ts +69 -0
  1178. package/corpus/templates/slides-2/shared/labs.ts +10 -0
  1179. package/corpus/templates/slides-2/shared/overview-navigation.ts +34 -0
  1180. package/corpus/templates/slides-2/shared/ownership.ts +6 -0
  1181. package/corpus/templates/slides-2/shared/pdf-sidecar.ts +130 -0
  1182. package/corpus/templates/slides-2/shared/presenter-control.ts +111 -0
  1183. package/corpus/templates/slides-2/shared/representative-slide.ts +89 -0
  1184. package/corpus/templates/slides-2/shared/slide-background.ts +30 -0
  1185. package/corpus/templates/slides-2/shared/slide-comment-anchor.ts +117 -0
  1186. package/corpus/templates/slides-2/shared/slide-comment-reactions.ts +47 -0
  1187. package/corpus/templates/slides-2/shared/slide-design-tokens.ts +92 -0
  1188. package/corpus/templates/slides-2/shared/slide-fit.ts +78 -0
  1189. package/corpus/templates/slides-2/shared/slide-ids.ts +133 -0
  1190. package/corpus/templates/slides-2/shared/slide-number.ts +124 -0
  1191. package/corpus/templates/slides-2/shared/slide-object-structure.ts +790 -0
  1192. package/corpus/templates/slides-2/shared/slide-text-range-selection.ts +50 -0
  1193. package/corpus/templates/slides-2/shared/slide-transitions.ts +70 -0
  1194. package/corpus/templates/slides-2/shared/slides-2-transition.ts +194 -0
  1195. package/corpus/templates/slides-2/shared/slides-user-prefs.ts +22 -0
  1196. package/corpus/templates/slides-2/shared/source-import-errors.ts +12 -0
  1197. package/corpus/templates/slides-2/shared/source-runtime-export.ts +76 -0
  1198. package/corpus/templates/slides-2/shared/upload-types.ts +41 -0
  1199. package/corpus/templates/slides-2/ssr-entry.ts +11 -0
  1200. package/corpus/templates/slides-2/tsconfig.json +27 -0
  1201. package/corpus/templates/slides-2/vite.config.ts +77 -0
  1202. package/corpus/templates/slides-2/vitest.config.ts +28 -0
  1203. package/corpus/templates/tasks/.agents/skills/actions/references/action-fields.md +1 -1
  1204. package/package.json +1 -1
  1205. package/corpus/templates/design/.agents/skills/shader-fills/SKILL.md +0 -182
  1206. package/corpus/templates/design/actions/apply-shader-fill.ts +0 -450
  1207. package/corpus/templates/design/actions/apply-shader.ts +0 -257
  1208. package/corpus/templates/design/actions/preview-shader-fill.ts +0 -157
  1209. package/corpus/templates/design/app/components/design/inspector/GlslShaderPanel.tsx +0 -1144
  1210. package/corpus/templates/design/app/components/design/inspector/SHADER_INTEGRATION.md +0 -450
  1211. package/corpus/templates/design/app/components/design/inspector/ShaderControls.stories.tsx +0 -71
  1212. package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +0 -555
  1213. package/corpus/templates/design/app/components/design/inspector/ShaderEffectRow.tsx +0 -105
  1214. package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +0 -433
  1215. package/corpus/templates/design/app/components/design/inspector/color-picker-shader-pane.tsx +0 -648
  1216. package/corpus/templates/design/shared/shader-fill.ts +0 -174
  1217. package/corpus/templates/design/shared/shader-presets.ts +0 -1523
@@ -140,6 +140,6 @@ export default defineAction({
140
140
 
141
141
  When the gate is truthy and the call isn't yet approved, the loop emits an `approval_required` event and **stops the turn — `run()` never executes**. A predicate gates conditionally (e.g. only external recipients) and **fails closed**: a throw is treated as "approval required". It receives its own copy of the prepared snapshot of the validated arguments, defaults applied, and the approval binds to the snapshot's hash, so an approved call runs only with the arguments that were approved (a Date binds by its time). The human approves via the chat UI's Approve affordance, which re-issues the turn with the call's `approvalKey`, and only then does the action run.
142
142
 
143
- Approval is given in the app, so HTTP never grants it. The HTTP action route and the generated Workers entry run a gated call only for the proven app UI (a frontend call from the signed-in user, same origin, holding the short-lived UI capability; `isProvenUiRequest`, the proof `uiOnly` uses) or the app's MCP directory widget. Every other HTTP caller (bearer or API key, MCP OAuth token, org service token, A2A, extension iframe, mobile app) gets `409 approval_required`, and a service identity can never approve. The shared client presents the capability with every write from a signed-in session (minted once per user, reused for nine minutes, never for reads or public pages), so a gated button works on its first request. A call without proof gets `403 ui_capability_required`; the client then re-mints and retries once, which is only the fallback for an expired or rejected capability. Every surface evaluates the gate through `preparedCallNeedsApproval`, so a throwing predicate asks there too. A caller that must run unattended needs a different action, never a bypass of the gate.
143
+ Approval is given in the app, so HTTP never grants it. The HTTP action route and the generated Workers entry run a gated call only for the proven app UI (a frontend call from the signed-in user, same origin, holding the short-lived UI capability; `isProvenUiRequest`, the proof `uiOnly` uses) or the app's MCP directory widget. Every other direct HTTP caller (bearer or API key, MCP OAuth token, org service token, extension iframe, or mobile app) gets `409 approval_required`, and a service identity can never approve. A2A tasks use their separate approval flow. The task pauses until its owner approves, then replays the approved tool call under its approval lease. The shared client presents the capability with every write from a signed-in session (minted once per user, reused for nine minutes, never for reads or public pages), so a gated button works on its first request. A call without proof gets `403 ui_capability_required`; the client then re-mints and retries once, which is only the fallback for an expired or rejected capability. The agent loop, plan mode registry, HTTP action route, generated Workers entry, and MCP dispatch evaluate the gate through `preparedCallNeedsApproval`, so a throwing predicate asks there too. The local `pnpm action ...` CLI calls `handler.run()` directly and does not evaluate `needsApproval`. Treat it as a local development tool, not an approval boundary. A caller that must run unattended needs a different action, never a bypass of the gate.
144
144
 
145
145
  **Keep approvals rare** — the default is off and almost every action should leave it off. The canonical example is Mail's `send-email` (`needsApproval: true`). See the `security` skill and the Human Approval doc.
@@ -140,6 +140,6 @@ export default defineAction({
140
140
 
141
141
  When the gate is truthy and the call isn't yet approved, the loop emits an `approval_required` event and **stops the turn — `run()` never executes**. A predicate gates conditionally (e.g. only external recipients) and **fails closed**: a throw is treated as "approval required". It receives its own copy of the prepared snapshot of the validated arguments, defaults applied, and the approval binds to the snapshot's hash, so an approved call runs only with the arguments that were approved (a Date binds by its time). The human approves via the chat UI's Approve affordance, which re-issues the turn with the call's `approvalKey`, and only then does the action run.
142
142
 
143
- Approval is given in the app, so HTTP never grants it. The HTTP action route and the generated Workers entry run a gated call only for the proven app UI (a frontend call from the signed-in user, same origin, holding the short-lived UI capability; `isProvenUiRequest`, the proof `uiOnly` uses) or the app's MCP directory widget. Every other HTTP caller (bearer or API key, MCP OAuth token, org service token, A2A, extension iframe, mobile app) gets `409 approval_required`, and a service identity can never approve. The shared client presents the capability with every write from a signed-in session (minted once per user, reused for nine minutes, never for reads or public pages), so a gated button works on its first request. A call without proof gets `403 ui_capability_required`; the client then re-mints and retries once, which is only the fallback for an expired or rejected capability. Every surface evaluates the gate through `preparedCallNeedsApproval`, so a throwing predicate asks there too. A caller that must run unattended needs a different action, never a bypass of the gate.
143
+ Approval is given in the app, so HTTP never grants it. The HTTP action route and the generated Workers entry run a gated call only for the proven app UI (a frontend call from the signed-in user, same origin, holding the short-lived UI capability; `isProvenUiRequest`, the proof `uiOnly` uses) or the app's MCP directory widget. Every other direct HTTP caller (bearer or API key, MCP OAuth token, org service token, extension iframe, or mobile app) gets `409 approval_required`, and a service identity can never approve. A2A tasks use their separate approval flow. The task pauses until its owner approves, then replays the approved tool call under its approval lease. The shared client presents the capability with every write from a signed-in session (minted once per user, reused for nine minutes, never for reads or public pages), so a gated button works on its first request. A call without proof gets `403 ui_capability_required`; the client then re-mints and retries once, which is only the fallback for an expired or rejected capability. The agent loop, plan mode registry, HTTP action route, generated Workers entry, and MCP dispatch evaluate the gate through `preparedCallNeedsApproval`, so a throwing predicate asks there too. The local `pnpm action ...` CLI calls `handler.run()` directly and does not evaluate `needsApproval`. Treat it as a local development tool, not an approval boundary. A caller that must run unattended needs a different action, never a bypass of the gate.
144
144
 
145
145
  **Keep approvals rare** — the default is off and almost every action should leave it off. The canonical example is Mail's `send-email` (`needsApproval: true`). See the `security` skill and the Human Approval doc.
@@ -3,6 +3,12 @@
3
3
  All notable user-facing changes to Agent-Native Slides are documented here. Open it any
4
4
  time from the command menu (Cmd+K → "What's new").
5
5
 
6
+ ## 2026-10-21
7
+
8
+ ### Fixed
9
+
10
+ - Deleting a deck through an agent requires approval for each deletion.
11
+
6
12
  ## 2026-10-20
7
13
 
8
14
  ### Improved
@@ -13,6 +13,13 @@ export default defineAction({
13
13
  id: z.string().min(1).describe("Deck ID"),
14
14
  }),
15
15
  http: { method: "DELETE" },
16
+ needsApproval: true,
17
+ allowPersistentApproval: false,
18
+ mcpAnnotations: {
19
+ readOnlyHint: false,
20
+ destructiveHint: true,
21
+ openWorldHint: false,
22
+ },
16
23
  run: async ({ id }) => {
17
24
  try {
18
25
  const access = await assertAccess("deck", id, "admin");
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-10-21
4
+ ---
5
+
6
+ Deleting a deck through an agent requires approval for each deletion.
@@ -0,0 +1,61 @@
1
+ import {
2
+ ActionHttpError,
3
+ ActionRequestTimeoutError,
4
+ ActionTransportError,
5
+ isPlaywrightTargetTransportFailure,
6
+ } from "./run-outcomes.ts";
7
+
8
+ interface BrowserActionArgs {
9
+ body: Record<string, unknown>;
10
+ compatibilityVersion: string;
11
+ source: string;
12
+ timeoutMs: number;
13
+ }
14
+
15
+ interface ActionPage {
16
+ evaluate<A, R>(run: (args: A) => Promise<R>, args: A): Promise<R>;
17
+ }
18
+
19
+ export async function deleteScratchDeck<T>(
20
+ page: ActionPage,
21
+ args: BrowserActionArgs,
22
+ ): Promise<T> {
23
+ const result = await page
24
+ .evaluate(async ({ body, compatibilityVersion, source, timeoutMs }) => {
25
+ try {
26
+ const { callAction } = await import(source);
27
+ const value: T = await callAction("delete-deck", body, {
28
+ method: "DELETE",
29
+ uiOnly: true,
30
+ timeoutMs,
31
+ // Cleanup can run before Vite's client bootstrap sets define globals.
32
+ headers: {
33
+ "X-Agent-Native-Client-Compatibility": compatibilityVersion,
34
+ },
35
+ });
36
+ return { kind: "success" as const, value };
37
+ } catch (error) {
38
+ const fault = error as { status?: unknown; timedOut?: unknown } | null;
39
+ // Playwright does not preserve custom Error properties across evaluate.
40
+ return {
41
+ kind: "failure" as const,
42
+ message: String(error),
43
+ status: typeof fault?.status === "number" ? fault.status : null,
44
+ timedOut: fault?.timedOut === true,
45
+ };
46
+ }
47
+ }, args)
48
+ .catch((error: unknown) => {
49
+ if (isPlaywrightTargetTransportFailure(error)) {
50
+ throw new ActionTransportError(
51
+ `delete-deck action evaluation failed: ${String(error)}`,
52
+ );
53
+ }
54
+ throw error;
55
+ });
56
+ if (result.kind === "success") return result.value;
57
+ if (result.timedOut) throw new ActionRequestTimeoutError(result.message);
58
+ if (result.status !== null)
59
+ throw new ActionHttpError("delete-deck", result.status);
60
+ throw new ActionTransportError(result.message);
61
+ }
@@ -16,6 +16,7 @@ import { fileURLToPath } from "node:url";
16
16
  import { parse, type DefaultTreeAdapterTypes as P5 } from "parse5";
17
17
 
18
18
  import { IN_PLACE_TEXT_UNDO_LIMIT } from "../../app/components/editor/in-place-text-session.ts";
19
+ import { CLIENT_COMPATIBILITY_VERSION } from "../../shared/client-compatibility.ts";
19
20
  import {
20
21
  pick,
21
22
  resolvePnpmEntry,
@@ -53,6 +54,7 @@ import {
53
54
  shouldRetainCleanupRecoveryClaimEvidence,
54
55
  type AuthoringFuzzPersistence,
55
56
  } from "./authoring-fuzz.ts";
57
+ import { deleteScratchDeck } from "./client-action.ts";
56
58
  import { devServerListeningUrl } from "./dev-server-url.ts";
57
59
  import {
58
60
  CHROME_SELECTOR,
@@ -742,6 +744,14 @@ async function action<T = any>(
742
744
  method: "DELETE" | "GET" | "POST" = "POST",
743
745
  timeoutMs = 30_000,
744
746
  ): Promise<T> {
747
+ if (name === "delete-deck") {
748
+ return deleteScratchDeck<T>(page, {
749
+ body,
750
+ compatibilityVersion: CLIENT_COMPATIBILITY_VERSION,
751
+ source: `/@fs/${WORKTREE_ROOT.replace(/\\/g, "/")}/packages/core/src/client/use-action.ts`,
752
+ timeoutMs,
753
+ });
754
+ }
745
755
  const evaluation = page.evaluate(
746
756
  async ({ name, body, method, timeoutMs }: any) => {
747
757
  const url =
@@ -0,0 +1,199 @@
1
+ ---
2
+ name: actions
3
+ description: >-
4
+ How to create and run agent actions. Actions are the single source of truth
5
+ for app operations — the agent calls them as tools and frontend code calls
6
+ them through client hooks. Use when creating a new action, adding an API
7
+ integration, or wiring up frontend data fetching.
8
+ scope: dev
9
+ metadata:
10
+ internal: true
11
+ ---
12
+
13
+ # Agent Actions
14
+
15
+ ## Rule
16
+
17
+ Actions in `actions/` are the **single source of truth** for app operations. The agent calls them as tools, the frontend calls them through `useActionQuery` / `useActionMutation`, and the framework owns the HTTP transport behind those hooks — no duplicate `/api/` routes.
18
+
19
+ Before creating any custom route for app data, check `actions/` and the action table in `AGENTS.md`. An action already exists? Call it directly. Missing? Create or update a `defineAction`. **Stop trigger:** about to add a file under `server/routes/api/` (or middleware to guard one)? Check it against the exception list in *Custom `/api/` Routes* below first — even if you already started the route.
20
+
21
+ ## Keep Actions Deterministic
22
+
23
+ An action may call a provider API, validate data, and persist records without being an AI feature — keep it deterministic, focused, and independently useful to the agent. Don't put LLM calls or a second model runtime in app actions.
24
+
25
+ When a workflow is research, analysis, generation, recommendation, or synthesis — or spans several provider calls and writes — route it to the AgentSidebar via `sendToAgentChat({ openSidebar: true })` and let the agent orchestrate focused actions instead of hiding an AI-shaped workflow behind one opaque `generate-*`/`create-*` action just because its implementation happens to be deterministic.
26
+
27
+ ## How to Create an Action
28
+
29
+ **One action per file, default-exported. The filename is the action name** (kebab-case): `actions/list-meals.ts` is the `list-meals` action. Don't put several `defineAction`s as named exports in one file — the registry keys actions by filename and only the default export is registered, so extra named exports never become callable and won't match `.generated/action-types.d.ts`.
30
+
31
+ ```ts
32
+ // actions/list-meals.ts
33
+ import { z } from "zod";
34
+ import { defineAction } from "@agent-native/core/action";
35
+ import { getDb } from "../server/db/index.js";
36
+ import { meals } from "../server/db/schema.js";
37
+
38
+ export default defineAction({
39
+ description: "List all meals",
40
+ schema: z.object({}),
41
+ http: { method: "GET" },
42
+ run: async () => {
43
+ const db = getDb();
44
+ const rows = await db.select().from(meals);
45
+ return rows; // Return objects/arrays, NOT JSON.stringify()
46
+ },
47
+ });
48
+ ```
49
+
50
+ `schema` (Zod or Standard Schema-compatible) gives runtime validation, TS inference for `run()` args, and an auto-generated JSON Schema for the tool. Write it so an agent can call the tool correctly on the first try: `.describe()` every param and state enum values and the default in that text (`z.enum(["open","closed"]).default("open").describe('Filter status: "open" or "closed"; defaults to "open"')`); mark a field `.optional()` only when the action truly tolerates its absence — a silent default the caller cannot see is a required field in disguise; name the primary id the same way across a family (`create-/get-/update-/delete-<thing>` all take `id`, not a mix of `id` and `<thing>Id`), and if one action must differ, accept both with `.or()`; give nested objects a real schema, never a prose description; keep the one-line `description` complete enough to call the tool without a second lookup, because compact catalogs and `tool-search` show only that line. Use `z.coerce.number()` for numeric HTTP params, but write an explicit boolean parser instead of `z.coerce.boolean()`, which treats `"false"` as truthy.
51
+
52
+ Use Drizzle's PostgreSQL query builder, not raw SQL/`getDbExec()` or direct driver imports, unless Drizzle can't express the query. Never hardcode API keys/tokens/secrets - read via `readAppSecret` / `resolveCredential` / OAuth helpers; `process.env` is deploy-level config only.
53
+
54
+ **Decision order:** existing action → extend/create a `defineAction` → custom route as last resort (*Custom `/api/` Routes* below). Actions are already callable by agents, CLIs, hooks, HTTP, and MCP/A2A — don't wrap them in an umbrella REST API.
55
+
56
+ ## Keep the Action Surface Small and Orthogonal
57
+
58
+ Every agent-exposed action is a tool in the model's context window; more tools degrades tool-selection quality. Add the fewest, most orthogonal actions that cover the capability.
59
+
60
+ - **One orthogonal `update` per resource**, not one per field — `update-<thing>` taking an optional-fields patch, not `update-<thing>-name` + `update-<thing>-order` + …
61
+ - **Reach for a generic escape hatch before minting a new read action** — the `provider-api-catalog`/`docs`/`request` trio for provider data (`references/provider-apis.md`), `db-query` for ad hoc app-data reads in dev.
62
+ - **`agentTool: false`** hides a UI-only/programmatic action from the model while keeping it frontend/HTTP-callable — not `toolCallable: false`, which only blocks the sandboxed extension bridge and leaves the action visible everywhere else; reserve that one for high-blast-radius operations.
63
+ - **Delete or hide stale actions** once you confirm neither the UI nor an agent workflow uses them.
64
+
65
+ ## Key Actions — One Index, Every Surface
66
+
67
+ Document the app's primary actions in the `AGENTS.md` action table. For first-turn loading, add those action names to the plugin's `initialToolNames` (`INITIAL_TOOL_NAMES` in some templates), or mark the full starter set `deferLoading: false` on the actions. When one action opts into per-action eager loading, unmarked actions are deferred; the remaining actions stay discoverable through `tool-search`.
68
+
69
+ When MCP is enabled, its `Key tools` line is generated from `mcp.keyToolNames ?? initialToolNames` and filtered to the actions served on that surface. A configured `mcp.keyToolNames` overrides the advertised MCP/WebMCP key list; it does not change the in-app agent's first-turn list. Keep the advertised subset consistent with the primary actions in the `AGENTS.md` table and the external catalog; the table may also document other in-app actions. Do not hand-write another action list in `mcp.instructions`, a skill, or an external skill; describe when to use actions there.
70
+
71
+ ## The `http` Option
72
+
73
+ Controls HTTP exposure:
74
+
75
+ | Value | Behavior | Use for |
76
+ | --- | --- | --- |
77
+ | _(omitted)_ | `POST /_agent-native/actions/:name` | Write operations (default) |
78
+ | `{ method: "GET" }` | `GET /_agent-native/actions/:name` | Read-only queries |
79
+ | `{ method: "PUT"/"DELETE" }` | matching verb | Update / delete |
80
+ | `{ method: "GET", path: "x" }` | custom route path | Non-default path |
81
+ | `false` | never exposed as HTTP | `navigate`, `view-screen`, internal |
82
+
83
+ Mutating actions (anything but `GET`) auto-refresh the UI on success — don't call `refresh-screen` after a normal action. Overrides (`readOnly`, `parallelSafe`) and exact trigger rules: `references/action-fields.md`.
84
+
85
+ ## Return Values
86
+
87
+ Return **structured data** (objects, arrays), never `JSON.stringify()` — the framework serializes the response and only tries to parse a returned string as JSON, which isn't the same contract.
88
+
89
+ ```ts
90
+ run: async (args) => await fetchEvents(args.from, args.to); // good
91
+ run: async (args) => JSON.stringify(await fetchEvents(...)); // bad
92
+ ```
93
+
94
+ A create/update result is read by more than the caller. These keys are well-known and survive result truncation:
95
+
96
+ - `id` — the created or updated record. Pair it with a pure, synchronous `link` builder on the action (`link: (result) => ({ url: buildDeepLink({ app, view, params: { id: result.id } }), label })`) so MCP hosts and the desktop app surface an "Open …" deep link that lands in the editing view focused on the record; returning `url`/`urlPath` in the result works too.
97
+ - `nextRequiredAction` — the name of the next **tool** to call when the operation is one step of a flow the agent should keep driving (`nextRequiredAction: "update-slide"`). Never phrase it as waiting for the user: an MCP/WebMCP/A2A caller cannot receive an in-app answer. The agent loop keeps this field in continuation prompts even when the rest of a large result is dropped, and MCP callers see it as `Next: …`.
98
+ - `message`/`summary` — the one-line status external callers read; everything else stays in the structured result.
99
+ - `designSystem` — when a record can link a brand or design system, expose it as `designSystem: AgentDesignSystemContext | null` via `loadAgentDesignSystemContext(id, getDesignSystemAction)` from core's shared `design-system-agent-context`. Reads get the bounded summary (`scope: "summary"`, with a `next` line naming the full read); only the create action and `get-design-system` itself pass `{ full: true }`. `status: "unavailable"` is not `null`: keep the id and the message. Print it in text results with `formatAgentDesignSystemContext`; do not name the field anything else.
100
+
101
+ For actions that attach a `chatUI` renderer, use `chatUI.projectResult` to return
102
+ only the small structured fields the renderer needs. `chatUI.when` is evaluated
103
+ against the full successful result first; the projection is used live and saved
104
+ for interrupted-run recovery.
105
+
106
+ An action that hands control back to the user (question form, intake dialog) sets `endsTurn: true`; that hides it from MCP/WebMCP/A2A unless `mcpTool: true` is explicit — `references/action-fields.md`. For external-agent integrations, use the external-agents documentation slug listed by `agent-native-docs`.
107
+
108
+ Reach for `outputSchema` (validate the return), `_agentImages` (attach images the agent can see), `authorize` (gate who may call it), or `needsApproval` (require human sign-off per call) only when the action needs that guarantee — examples in `references/action-fields.md`.
109
+
110
+ ### Write receipts
111
+
112
+ A write action that can check its own effect returns a plain-object result with a reserved `_receipt`, so the final answer is reconciled with what the write did, not with the model's reading of a JSON string that may be truncated:
113
+
114
+ ```ts
115
+ import type { WriteReceipt } from "@agent-native/core/action";
116
+
117
+ const _receipt: WriteReceipt = {
118
+ changed: true,
119
+ verified: false,
120
+ summary: "Saved; panel 3 returned no rows.",
121
+ checks: [{ id: "panel-3", ok: false, detail: "0 rows" }],
122
+ };
123
+ return { id, _receipt };
124
+ ```
125
+
126
+ `verified` is `true` (the effect was observed), `false` (checked and did not hold), or `"unverified"` (could not be checked); `checks` and `warnings` are optional. The agent loop reads the receipt before the result is stringified and truncated (summary 200 chars, 8 checks, 5 warnings):
127
+
128
+ - `verified: false` or `changed: false` forces one honest-reconciliation retry per turn: the model must say what the receipt shows and may not call the change visible or working. If the retry is spent, the answer is prefixed with the receipt block.
129
+ - `verified: "unverified"` only prefixes that note; no retry.
130
+ - A receipt that is present but malformed counts as `unverified`, never clean. `changed: false` also records the call as `completedSideEffect: false`, unless a write nested in the action also entered its handler: a receipt, like `retrySafe`, speaks only for the action's own write.
131
+ - Set `subject` (the stable target, such as a dashboard id) so a later `changed: true, verified: true` receipt for the same subject can supersede an earlier flagged one in the same turn. When the earlier receipt had failing or unverified `checks`, the later receipts (from this action or another that writes the same subject) must carry an `ok: true` check with the same `id` for each; a receipt without checks never clears one that had them. A flagged receipt with no failing checks is superseded only by the same action. Receipts without a `subject` are never superseded.
132
+
133
+ A receipt is not an error channel. A write that did not achieve the requested state throws (`fail()`); return `changed: false` only for a benign no-op, such as the record already being in the requested state.
134
+
135
+ ## Frontend Hooks
136
+
137
+ Import from focused `@agent-native/core/client/*` entry points; the broad
138
+ `@agent-native/core/client` barrel is deprecated. Use action hooks, not
139
+ hand-written `fetch("/_agent-native/actions/...")`.
140
+
141
+ ```ts
142
+ import { useActionQuery, useActionMutation, callAction } from "@agent-native/core/client/hooks";
143
+
144
+ const { data: meals } = useActionQuery("list-meals", { date: "2025-01-01" }); // GET, types auto-inferred
145
+ const { mutate } = useActionMutation("log-meal"); // POST/PUT/DELETE
146
+ mutate({ name: "Salad", calories: 350 });
147
+ const people = await callAction("search-people", { query }, { method: "GET" }); // imperative (debounce, prefetch)
148
+ ```
149
+
150
+ Don't add manual generics like `useActionQuery<Meal[]>(...)` — types come from `.generated/action-types.d.ts`. Mutations auto-invalidate all `["action"]` query keys, so GET queries refetch. A revisit paints the persisted result for the signed-in user and org before that refetch; see `references/action-fields.md` for `persistInBrowser: false`.
151
+
152
+ When a query result varies by viewer or another client context that is not part of the action arguments, pass that stable context through `queryKeyScope`. It partitions only the local query cache; it is not sent to the action and never replaces server-side authorization.
153
+
154
+ ## How to Run (Agent)
155
+
156
+ ```bash
157
+ pnpm action log-meal --name "Salad" --calories 350
158
+ ```
159
+
160
+ CLI flags become action input fields (`--key value` or `--key=value`); the runner does not read or write files for `--input` or `--output`. The default template dispatches through core's `runScript()` in `actions/run.ts`. Action names are lowercase-with-hyphens (`pnpm action my-action` → `actions/my-action.ts`).
161
+
162
+ ## Custom `/api/` Routes
163
+
164
+ Complete exception list — justified only when the caller isn't your own UI/agent, or the payload isn't JSON: **file uploads** (actions take JSON, not multipart), **streaming** (SSE/chunked needing direct H3 control), **webhooks**, **OAuth callbacks** (fixed redirect URL patterns), **public unauthenticated endpoints** (SEO/OG images, share links), **binary/non-JSON responses**.
165
+
166
+ Everything else — CRUD, settings, search, list/detail reads, auth state, anything the UI fetches as JSON — is an action. Needing middleware to scope a route to the current user is itself a signal it should be an action. Existing template `/api/*` CRUD routes are being migrated; do not add new ones.
167
+
168
+ ## Do / Don't
169
+
170
+ - **Do** keep one action, one job; document a reusable action (when to use it, key args, return fields to preserve) in `AGENTS.md` once it's called from outside one narrow screen; promote workflow-heavy actions (provider-backed, cross-app, MCP/A2A, multi-step) into a skill.
171
+ - **Do** use `fail(message, { errorCode, statusCode })` for user-friendly errors and import primitives from `@agent-native/core`(`/action`) instead of redefining them; use the core `upload-image` action or `uploadFile()` for durable images/files — never base64 into SQL, markdown, or action results.
172
+ - **Do** signal failure by throwing, using `fail()` for expected caller-readable failures. Never return `{ error: ... }` as a failure result: a normal return is treated as a successful action. Reserve bare errors for unexpected internal faults.
173
+ - **Do** use `fail()` rather than a bare `Error` for caller-readable failures. It carries the action's message, `errorCode`, and `details` to the browser and to agents; unexpected errors become a generic 500. Reserve bare throws for internal faults.
174
+ - **Do** give `fail()` the status that matches the cause: it defaults to `400`, and `useActionQuery` retries only `429`, `502`, `503`, and `504`. Mutations do not retry; use transient statuses only for retryable failures.
175
+ - **Do** render `actionErrorMessage(error) ?? yourCopy` in UI, never bare `error.message`. The message keeps an `Action <name> failed:` prefix that belongs in a console, so a toast built from it reads "Action update-brand-kit failed: That name is taken." The helper returns only what the action wrote, and `undefined` when nothing did (network drop, proxy HTML page), which is why the fallback is not optional.
176
+ - **Do** pass a real `errorCode` when the agent should branch on the failure rather than re-read it. Codes other than the default `action_failed` are appended to the tool result as `(errorCode: not_found)`, on both the in-app agent and MCP. `details` follow as an `Error details: {...}` JSON line, and as `structuredContent.error` over MCP, capped at 2,000 characters, so keep them to what the agent acts on next: ids, limits, field names. The status never reaches either.
177
+ - **Don't** re-export actions as REST — `/_agent-native/actions/:name` is already the REST surface; duplicating it under `/api/*` hides the operation from agents.
178
+ - **Don't** reach for provider integrations, `outputSchema`, `authorize`, `needsApproval`, or `_agentImages` without checking `references/` first — each has sharp edges covered there, not here.
179
+
180
+ ## Troubleshooting
181
+
182
+ - **Action not found / type mismatch** — filename must match the command (`pnpm action foo-bar` → `actions/foo-bar.ts`), and the action must be the file's **default** export. Multiple `defineAction` named exports in one file register only the default; split them into one file each.
183
+ - **Args not parsing** — use `--key value` / `--key=value`; boolean flags are `--flag` (sets `"true"`).
184
+ - **Frontend 405** — `http.method` doesn't match the hook (`useActionQuery` for GET, `useActionMutation` for POST/PUT/DELETE).
185
+ - **Frontend gets undefined** — action must return structured data, not `JSON.stringify()`.
186
+
187
+ ## References
188
+
189
+ - `references/provider-apis.md` — wiring a credentialed provider (HubSpot, Gong, Slack, …) for querying, reporting, or cross-source research.
190
+ - `references/action-fields.md` — `outputSchema`, `authorize`, `needsApproval`, `_agentImages`, and exact auto-refresh rules.
191
+ - `references/examples.md` — a second worked example and legacy bare-export patterns.
192
+
193
+ ## Related Skills
194
+
195
+ - **storing-data** — Actions read/write data in SQL
196
+ - **delegate-to-agent** — The agent invokes actions via `pnpm action <name>`
197
+ - **real-time-sync** — Database writes from actions trigger change events to update the UI
198
+ - **adding-a-feature** — Actions are area 2 of the four-area checklist
199
+ - **client-methods** — Client code uses named helpers/hooks instead of raw REST calls
@@ -0,0 +1,145 @@
1
+ # Action Field Reference
2
+
3
+ Full detail on the less-common `defineAction` fields and automatic behaviors.
4
+ Read this when you need output validation, authorization, human approval,
5
+ image results, or the exact rules for the auto-refresh behavior — the happy
6
+ path in SKILL.md doesn't need any of these.
7
+
8
+ ## Screen Refresh (automatic)
9
+
10
+ The framework auto-refreshes the UI after any successful mutating action. On completion of a non-`GET` action, the framework emits a change event with `source: "action"` that the client's `useDbSync` picks up and uses to invalidate `["action"]` React Query keys — so `list-*` / `get-*` hooks refetch without a full page reload. In-process calls emit directly; dev-mode `pnpm action ...` calls also write a durable marker so the web server sees child-process action changes.
11
+
12
+ Rules:
13
+
14
+ - `http: { method: "GET" }` → read-only, does NOT trigger a refresh (inferred automatically).
15
+ - Any other action (default `POST`, `PUT`, `DELETE`, or `http: false`) → treated as mutating, triggers a refresh on success.
16
+ - To override the inference on an unusual action (e.g. a `POST` that only reads), pass `readOnly: true` on the action definition.
17
+ - To let a mutating action run concurrently with other same-turn tool calls, pass `parallelSafe: true`. Only do this when the action is internally concurrency-safe and order-independent (for example, it uses an app-level lock or idempotent upsert semantics). Mutating actions remain serialized by default.
18
+ - If a successful call hands control to the user — it renders a question, an intake form, or anything else the turn must wait on — pass `endsTurn: true` and make it the first or only call in the turn. It stops subsequent model steps and later calls, but cannot undo calls emitted before it. Without it a completion guard sees a turn that legitimately paused as one that failed to finish. `endsTurn: true` also hides the action from MCP, WebMCP, and A2A callers by default (`isActionExposedToExternalAgents` in core `action.ts`) — an external host has no in-app chat to receive the answer on. Pass `mcpTool: true` alongside it only when an external caller can complete the same operation without that answer.
19
+ - Read results persist in the browser per signed-in user and org, so a revisit paints the last result before it refetches. Pass `persistInBrowser: false` on a read that must not outlive the page (secrets, one-time codes, another user's private data). Mutations never persist.
20
+ - MCP hosts read tool annotations to decide how carefully to treat a call. Every MCP catalog advertises declared `mcpAnnotations` (`readOnlyHint`, `destructiveHint`, `openWorldHint`, optional `idempotentHint`); otherwise `/mcp` derives only `readOnlyHint` and an approval-based `destructiveHint`. Declare them on every action MCP advertises that is not read-only, with `destructiveHint: true` when it removes, overwrites, or replaces user content — recoverable Trash included — and mark idempotency-key-guarded writes `idempotentHint: true`. A contract test fails on a new undeclared write.
21
+
22
+ Agents do NOT need to call `refresh-screen` after a normal action — it's already handled. `refresh-screen` is only needed when the agent mutates data via a path the framework can't see (e.g. writing to an external system the app mirrors) or when the agent wants to pass a `scope` hint for narrower invalidation.
23
+
24
+ ## Returning Images the Agent Can See (`_agentImages`)
25
+
26
+ An action's return object may include the well-known optional field
27
+ `_agentImages` to attach vision images (screenshots, chart previews, rendered
28
+ designs) to the tool result. The agent literally sees them — enabling visual
29
+ self-review loops — while the field itself is stripped from the JSON text the
30
+ model reads.
31
+
32
+ ```ts
33
+ run: async ({ dashboardId }) => {
34
+ const shot = await renderDashboardPng(dashboardId); // Buffer
35
+ return {
36
+ dashboardId,
37
+ panelCount: 6,
38
+ _agentImages: [
39
+ // Either a public https URL (preferred — the provider fetches it)…
40
+ { url: "https://cdn.example.com/previews/dash-1.png", label: "overview" },
41
+ // …or base64 without a data: prefix (mediaType required; a full
42
+ // data:image/png;base64,… URL in `data` is also accepted and parsed).
43
+ { data: shot.toString("base64"), mediaType: "image/png" },
44
+ ],
45
+ };
46
+ },
47
+ ```
48
+
49
+ Rules and limits:
50
+
51
+ - Shape: `Array<{ url?: string; data?: string; mediaType?: string; label?: string }>`.
52
+ Each entry needs `url` (https only) **or** `data`. Supported media types:
53
+ `image/jpeg`, `image/png`, `image/gif`, `image/webp`.
54
+ - Caps: max **4 images** per result; max **~2MB of base64** per image.
55
+ Over-cap or invalid entries never fail the call — they become text notes in
56
+ the result telling the model what was dropped and why.
57
+ - Persistence: the run ledger stores only the string result plus compact
58
+ `[image: …]` notes (URLs verbatim; base64 as a byte-count placeholder) —
59
+ never the payload. Images are re-attached only for the live turn; replayed
60
+ history is text-only, so prefer stable `url` images the model can re-request.
61
+ - Engine support: native Anthropic and vision-capable AI-SDK providers
62
+ (anthropic, openai, google, openrouter) receive real image blocks; other
63
+ paths (Builder gateway, non-vision providers) degrade to the text notes.
64
+ - External MCP tools need no changes — standard MCP `image` content parts are
65
+ converted automatically under the same caps.
66
+
67
+ ## Validating Return Values (`outputSchema`)
68
+
69
+ `schema` validates inputs; `outputSchema` validates what the action **returns**. Pass any Standard Schema-compatible schema (Zod, Valibot, ArkType) and the framework validates the result _after_ `run()` resolves — input validated before `run`, output after.
70
+
71
+ ```ts
72
+ export default defineAction({
73
+ description: "Summarize a thread.",
74
+ schema: z.object({ threadId: z.string() }),
75
+ outputSchema: z.object({ summary: z.string(), messageCount: z.number() }),
76
+ outputErrorStrategy: "warn", // default; "strict" | "fallback"
77
+ // outputFallback: { summary: "", messageCount: 0 }, // used only by "fallback"
78
+ run: async ({ threadId }) => {
79
+ /* ... */
80
+ },
81
+ });
82
+ ```
83
+
84
+ - `"warn"` (default) — `console.warn` the issues and return the **original** result unchanged. Non-breaking, with one exception: a connection request or stop signal thrown while the result is checked (from a transform or refinement) still ends the call as that signal, with a framework message in place of its own.
85
+ - `"strict"` — throw `ActionOutputContractError` (`errorCode: "output_contract_violation"`) so a buggy action surfaces loudly.
86
+ - `"fallback"` — return `outputFallback` in place of the invalid result.
87
+
88
+ On success the validated value is returned, so coercion/defaults on `outputSchema` apply. Omit `outputSchema` and behavior is byte-for-byte unchanged (no wrapping).
89
+
90
+ The strict error and such a signal run after `run()`, so they carry `effect`: `"committed"` once a write entered its handler, in the call or in one nested in it (even under a read-only action), and `"none"` otherwise. Writes are classified from the validated arguments, defaults applied. The agent loop, the plan-mode registry, HTTP action routes, and MCP prepare each call once (validated arguments plus that classification) and run exactly that preparation: approval, plan mode, write blocking, batching, and replay all read it, and the run does not parse the arguments again. Preparation reads the validated arguments once into a frozen, plain-data snapshot and hashes it; each gate and `run()` gets its own copy of that snapshot, never the snapshot itself, so mutating `args` in a gate or a handler changes nothing anyone else reads. Validated arguments must therefore be plain data: objects, arrays, strings, numbers, booleans, `null`, `undefined`, BigInts, and valid Dates. A schema whose output holds anything else (a getter or setter, a `Map` or `Set`, a class instance, a function) makes every call fail as invalid. Preparation, its refusals and the per-consumer copies cover calls the agent loop, plan mode, HTTP action routes, and MCP dispatch; a direct `action.run()` (one action composing another, the dev action bridge) gets schema validation only. A call whose arguments are invalid fails before any of them and never reaches the handler. Every reuse of a call's outcome keys on the snapshot's hash, never on the raw input: a continued turn replays a call only when it recorded a committed effect for the same hash, reads are reused only for the same hash, and an interrupted write recovers only a result recorded for the same hash, otherwise it stops instead of running again. The message names only declared field paths and issue codes, never output values, and tells the caller not to retry a committed write. A connection request keeps its `provider`, `reason`, `appId`, and `source` in its fields, in its message, and in HTTP `details`.
91
+
92
+ MCP clients see no `outputSchema` by default. Set `mcpOutputSchema: true` (requires `outputErrorStrategy: "strict"`) only after auditing that every real result matches: the tool then advertises the schema as MCP sees it (an array root becomes `{ items }`, linked actions gain `openLink`/`url`), and each `structuredContent` is validated against it before it is returned. Roots must be an object, an object-only union, or an array, and schemas with transforms cannot opt in. The advertised schema allows for MCP's redaction (embed ticket fields dropped; a string holding an embed start URL arrives as `"[hidden embed URL]"`, so required fields stay required). A schema is refused at definition time if it uses a keyword or `format` the check cannot enforce (`not`, `$async`, an unknown format), if redaction could break its `const`, `enum`, or `uniqueItems`, or if a linked action's root limits its property names or count.
93
+
94
+ ## Authorization (`authorize`)
95
+
96
+ `authorize` decides whether the caller may run the action at all. It wraps
97
+ `run`, so it holds at **all six dispatch sites** — agent tool, HTTP, frontend
98
+ hook, MCP, A2A, CLI. Use `authorize` for "not everyone may do this"; use
99
+ `needsApproval` to ask a human to bless one call a permitted caller is already
100
+ allowed to make.
101
+
102
+ ```ts
103
+ import { coachAccess } from "../lib/access.js"; // defineAppRoles(...)
104
+
105
+ export default defineAction({
106
+ description: "Archive a client roster.",
107
+ schema: z.object({ id: z.string() }),
108
+ authorize: coachAccess.requireAny("coach-admin"),
109
+ run: async (args) => {
110
+ /* ... */
111
+ },
112
+ });
113
+ ```
114
+
115
+ The wrappers compose as `validate input -> authorize -> run -> validate output
116
+ -> audit`: the gate sits inside input validation, so a guard reading `args` gets
117
+ the parsed, coerced value, and auditing is outermost, so denials are recorded.
118
+
119
+ A guard that throws denies with its own message; returning `false` denies
120
+ generically; anything else (including `undefined`) allows. A guarded action
121
+ needs a user identity, so an unattended CLI/cron caller with no user email is
122
+ denied. `authorize` gates the operation; `accessFilter` / `assertAccess` still
123
+ scope which rows a permitted caller may touch. Use `agent-native-docs` to find
124
+ the current authentication and sharing documentation when adding role checks.
125
+
126
+ ## Human-in-the-Loop Approval (`needsApproval`)
127
+
128
+ For high-consequence, outward-facing, hard-to-undo actions (sending an email, charging a card, deleting an account), set `needsApproval` so the agent **cannot** run the action without a human approving the specific call:
129
+
130
+ ```ts
131
+ export default defineAction({
132
+ description: "Send an email via Gmail.",
133
+ schema: z.object({ to: z.string(), subject: z.string(), body: z.string() }),
134
+ needsApproval: true, // boolean, or (args, ctx) => boolean | Promise<boolean>
135
+ run: async (args) => {
136
+ /* ...actually send... */
137
+ },
138
+ });
139
+ ```
140
+
141
+ When the gate is truthy and the call isn't yet approved, the loop emits an `approval_required` event and **stops the turn — `run()` never executes**. A predicate gates conditionally (e.g. only external recipients) and **fails closed**: a throw is treated as "approval required". It receives its own copy of the prepared snapshot of the validated arguments, defaults applied, and the approval binds to the snapshot's hash, so an approved call runs only with the arguments that were approved (a Date binds by its time). The human approves via the chat UI's Approve affordance, which re-issues the turn with the call's `approvalKey`, and only then does the action run.
142
+
143
+ Approval is given in the app, so HTTP never grants it. The HTTP action route and the generated Workers entry run a gated call only for the proven app UI (a frontend call from the signed-in user, same origin, holding the short-lived UI capability; `isProvenUiRequest`, the proof `uiOnly` uses) or the app's MCP directory widget. Every other direct HTTP caller (bearer or API key, MCP OAuth token, org service token, extension iframe, or mobile app) gets `409 approval_required`, and a service identity can never approve. A2A tasks use their separate approval flow. The task pauses until its owner approves, then replays the approved tool call under its approval lease. The shared client presents the capability with every write from a signed-in session (minted once per user, reused for nine minutes, never for reads or public pages), so a gated button works on its first request. A call without proof gets `403 ui_capability_required`; the client then re-mints and retries once, which is only the fallback for an expired or rejected capability. The agent loop, plan mode registry, HTTP action route, generated Workers entry, and MCP dispatch evaluate the gate through `preparedCallNeedsApproval`, so a throwing predicate asks there too. The local `pnpm action ...` CLI calls `handler.run()` directly and does not evaluate `needsApproval`. Treat it as a local development tool, not an approval boundary. A caller that must run unattended needs a different action, never a bypass of the gate.
144
+
145
+ **Keep approvals rare** — the default is off and almost every action should leave it off. The canonical example is Mail's `send-email` (`needsApproval: true`). See the `security` skill and the Human Approval doc.
@@ -0,0 +1,96 @@
1
+ # Extra Action Examples and Compatibility Patterns
2
+
3
+ Read this for a second worked example beyond the one in SKILL.md, for the
4
+ legacy `parameters` form or CLI-only bare-export action you may find in
5
+ existing code.
6
+
7
+ ## Common Patterns
8
+
9
+ **Read action (GET):**
10
+
11
+ ```ts
12
+ import { z } from "zod";
13
+ import { defineAction } from "@agent-native/core/action";
14
+
15
+ export default defineAction({
16
+ description: "List calendar events",
17
+ schema: z.object({
18
+ from: z.string().describe("Start date"),
19
+ to: z.string().describe("End date"),
20
+ }),
21
+ http: { method: "GET" },
22
+ run: async (args) => {
23
+ return await fetchEvents(args.from, args.to);
24
+ },
25
+ });
26
+ ```
27
+
28
+ **Write action (POST, default):**
29
+
30
+ ```ts
31
+ import { z } from "zod";
32
+ import { defineAction } from "@agent-native/core/action";
33
+
34
+ export default defineAction({
35
+ description: "Log a meal",
36
+ schema: z.object({
37
+ name: z.string().describe("Meal name"),
38
+ calories: z.coerce.number().describe("Calorie count"),
39
+ }),
40
+ run: async (args) => {
41
+ // args.calories is a number — z.coerce.number() handles string-to-number conversion from HTTP
42
+ const meal = await insertMeal(args);
43
+ return meal;
44
+ },
45
+ });
46
+ ```
47
+
48
+ **Agent-only action:**
49
+
50
+ ```ts
51
+ import { z } from "zod";
52
+ import { defineAction, fail } from "@agent-native/core/action";
53
+ import { writeAppStateForCurrentTab } from "@agent-native/core/application-state";
54
+
55
+ export default defineAction({
56
+ description: "Navigate the UI to a view or path",
57
+ schema: z.object({
58
+ view: z.string().optional().describe("Target view"),
59
+ path: z.string().optional().describe("URL path to navigate to"),
60
+ }),
61
+ http: false,
62
+ run: async (args) => {
63
+ if (!args.view && !args.path) {
64
+ fail("At least --view or --path is required.", {
65
+ errorCode: "invalid_navigation",
66
+ });
67
+ }
68
+ const navigation: Record<string, string> = {};
69
+ if (args.view) navigation.view = args.view;
70
+ if (args.path) navigation.path = args.path;
71
+ navigation._writeId = `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
72
+ await writeAppStateForCurrentTab("navigate", navigation);
73
+ return { message: `Navigating to ${args.view || args.path}` };
74
+ },
75
+ });
76
+ ```
77
+
78
+ ## Legacy `parameters` Field
79
+
80
+ The older `defineAction` form accepts a JSON Schema object through `parameters`. It still supplies the agent's input schema and infers TypeScript args for supported parameter shapes, but does not provide the Standard Schema validation and transforms of `schema`. Prefer `schema: z.object({...})` for new actions and when updating existing ones.
81
+
82
+ ## Legacy Pattern (bare export)
83
+
84
+ Older actions use a bare async function export with `parseArgs`:
85
+
86
+ ```ts
87
+ import { parseArgs, loadEnv, fail } from "@agent-native/core";
88
+
89
+ export default async function myAction(args: string[]) {
90
+ loadEnv();
91
+ const parsed = parseArgs(args);
92
+ // ...
93
+ }
94
+ ```
95
+
96
+ The CLI runner still accepts this function form, but it is CLI-only: it is not registered as an agent tool, does not mount an HTTP endpoint, and has no typed frontend hook. Prefer `defineAction` for actions shared with the agent or UI. See `actions-advanced` for this legacy form and its helpers.