@agent-native/core 0.149.1 → 0.149.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (422) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/templates/analytics/.agents/skills/actions/SKILL.md +54 -488
  3. package/corpus/templates/analytics/.agents/skills/actions/references/action-fields.md +136 -0
  4. package/corpus/templates/analytics/.agents/skills/actions/references/examples.md +94 -0
  5. package/corpus/templates/analytics/.agents/skills/actions/references/provider-apis.md +95 -0
  6. package/corpus/templates/analytics/.agents/skills/create-skill/SKILL.md +9 -35
  7. package/corpus/templates/analytics/.agents/skills/creative-context/SKILL.md +4 -2
  8. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +2 -0
  9. package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +4 -5
  10. package/corpus/templates/analytics/.agents/skills/turn-into-app/SKILL.md +18 -31
  11. package/corpus/templates/analytics/AGENTS.md +25 -32
  12. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +150 -46
  13. package/corpus/templates/analytics/app/global.css +1 -1
  14. package/corpus/templates/analytics/app/i18n-data.ts +37 -0
  15. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +1 -1
  16. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +32 -0
  17. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +2 -0
  18. package/corpus/templates/analytics/changelog/2026-08-10-dashboard-tables-can-be-copied-and-sorted-by-multiple-column.md +6 -0
  19. package/corpus/templates/analytics/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
  20. package/corpus/templates/analytics/changelog/2026-08-11-full-page-chat-composers-stay-at-a-focused-750px-width.md +6 -0
  21. package/corpus/templates/assets/.agents/skills/actions/SKILL.md +54 -488
  22. package/corpus/templates/assets/.agents/skills/actions/references/action-fields.md +136 -0
  23. package/corpus/templates/assets/.agents/skills/actions/references/examples.md +94 -0
  24. package/corpus/templates/assets/.agents/skills/actions/references/provider-apis.md +95 -0
  25. package/corpus/templates/assets/.agents/skills/create-skill/SKILL.md +9 -35
  26. package/corpus/templates/assets/.agents/skills/creative-context/SKILL.md +4 -2
  27. package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +4 -5
  28. package/corpus/templates/assets/.agents/skills/turn-into-app/SKILL.md +18 -31
  29. package/corpus/templates/assets/AGENTS.md +6 -9
  30. package/corpus/templates/assets/app/global.css +1 -1
  31. package/corpus/templates/assets/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
  32. package/corpus/templates/assets/changelog/2026-08-11-full-page-chat-composers-stay-at-a-focused-750px-width.md +6 -0
  33. package/corpus/templates/brain/.agents/skills/actions/SKILL.md +54 -488
  34. package/corpus/templates/brain/.agents/skills/actions/references/action-fields.md +136 -0
  35. package/corpus/templates/brain/.agents/skills/actions/references/examples.md +94 -0
  36. package/corpus/templates/brain/.agents/skills/actions/references/provider-apis.md +95 -0
  37. package/corpus/templates/brain/.agents/skills/create-skill/SKILL.md +9 -35
  38. package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +4 -5
  39. package/corpus/templates/brain/.agents/skills/turn-into-app/SKILL.md +18 -31
  40. package/corpus/templates/brain/AGENTS.md +5 -12
  41. package/corpus/templates/brain/app/global.css +1 -1
  42. package/corpus/templates/brain/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
  43. package/corpus/templates/brain/changelog/2026-08-11-full-page-chat-composers-stay-at-a-focused-750px-width.md +6 -0
  44. package/corpus/templates/calendar/.agents/skills/actions/SKILL.md +54 -488
  45. package/corpus/templates/calendar/.agents/skills/actions/references/action-fields.md +136 -0
  46. package/corpus/templates/calendar/.agents/skills/actions/references/examples.md +94 -0
  47. package/corpus/templates/calendar/.agents/skills/actions/references/provider-apis.md +95 -0
  48. package/corpus/templates/calendar/.agents/skills/create-skill/SKILL.md +9 -35
  49. package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +4 -5
  50. package/corpus/templates/calendar/.agents/skills/turn-into-app/SKILL.md +18 -31
  51. package/corpus/templates/calendar/AGENTS.md +8 -9
  52. package/corpus/templates/chat/.agents/skills/actions/SKILL.md +54 -488
  53. package/corpus/templates/chat/.agents/skills/actions/references/action-fields.md +136 -0
  54. package/corpus/templates/chat/.agents/skills/actions/references/examples.md +94 -0
  55. package/corpus/templates/chat/.agents/skills/actions/references/provider-apis.md +95 -0
  56. package/corpus/templates/chat/.agents/skills/create-skill/SKILL.md +9 -35
  57. package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +4 -5
  58. package/corpus/templates/chat/.agents/skills/turn-into-app/SKILL.md +18 -31
  59. package/corpus/templates/chat/AGENTS.md +32 -80
  60. package/corpus/templates/chat/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
  61. package/corpus/templates/clips/.agents/skills/actions/SKILL.md +54 -488
  62. package/corpus/templates/clips/.agents/skills/actions/references/action-fields.md +136 -0
  63. package/corpus/templates/clips/.agents/skills/actions/references/examples.md +94 -0
  64. package/corpus/templates/clips/.agents/skills/actions/references/provider-apis.md +95 -0
  65. package/corpus/templates/clips/.agents/skills/create-skill/SKILL.md +9 -35
  66. package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +4 -5
  67. package/corpus/templates/clips/.agents/skills/turn-into-app/SKILL.md +18 -31
  68. package/corpus/templates/clips/AGENTS.md +25 -31
  69. package/corpus/templates/clips/changelog/2026-08-10-clips-desktop-sign-in-now-starts-with-magic-links-and-google.md +6 -0
  70. package/corpus/templates/clips/chrome-extension/src/overlay.css +1 -0
  71. package/corpus/templates/clips/desktop/src/app.tsx +274 -137
  72. package/corpus/templates/clips/desktop/src/styles.css +35 -0
  73. package/corpus/templates/content/.agents/skills/actions/SKILL.md +54 -488
  74. package/corpus/templates/content/.agents/skills/actions/references/action-fields.md +136 -0
  75. package/corpus/templates/content/.agents/skills/actions/references/examples.md +94 -0
  76. package/corpus/templates/content/.agents/skills/actions/references/provider-apis.md +95 -0
  77. package/corpus/templates/content/.agents/skills/create-skill/SKILL.md +9 -35
  78. package/corpus/templates/content/.agents/skills/creative-context/SKILL.md +4 -2
  79. package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +4 -5
  80. package/corpus/templates/content/.agents/skills/turn-into-app/SKILL.md +18 -31
  81. package/corpus/templates/content/AGENTS.md +5 -9
  82. package/corpus/templates/content/app/global.css +1 -0
  83. package/corpus/templates/crm/.agents/skills/turn-into-app/SKILL.md +18 -31
  84. package/corpus/templates/crm/AGENTS.md +7 -11
  85. package/corpus/templates/crm/app/global.css +1 -1
  86. package/corpus/templates/crm/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
  87. package/corpus/templates/crm/changelog/2026-08-11-full-page-chat-composers-stay-at-a-focused-750px-width.md +6 -0
  88. package/corpus/templates/design/.agents/skills/actions/SKILL.md +54 -488
  89. package/corpus/templates/design/.agents/skills/actions/references/action-fields.md +136 -0
  90. package/corpus/templates/design/.agents/skills/actions/references/examples.md +94 -0
  91. package/corpus/templates/design/.agents/skills/actions/references/provider-apis.md +95 -0
  92. package/corpus/templates/design/.agents/skills/create-skill/SKILL.md +9 -35
  93. package/corpus/templates/design/.agents/skills/creative-context/SKILL.md +4 -2
  94. package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +4 -5
  95. package/corpus/templates/design/.agents/skills/turn-into-app/SKILL.md +18 -31
  96. package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +70 -3
  97. package/corpus/templates/design/AGENTS.md +13 -21
  98. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +12 -0
  99. package/corpus/templates/design/app/components/design/LayersPanel.tsx +19 -2
  100. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +115 -7
  101. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +82 -7
  102. package/corpus/templates/design/app/components/design/design-trace.ts +120 -0
  103. package/corpus/templates/design/app/components/design/dnd-debug.ts +2 -1
  104. package/corpus/templates/design/app/components/design/edit-panel/position-layout-properties.tsx +40 -26
  105. package/corpus/templates/design/app/components/design/multi-screen/board-surface-html.ts +4 -1
  106. package/corpus/templates/design/app/components/design/multi-screen/frame-geometry.ts +12 -3
  107. package/corpus/templates/design/app/components/design/multi-screen/screen-content-cache.ts +4 -0
  108. package/corpus/templates/design/app/components/design/multi-screen/types.ts +7 -0
  109. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +3 -2
  110. package/corpus/templates/design/app/components/layout/Sidebar.tsx +2 -2
  111. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +3 -0
  112. package/corpus/templates/design/app/i18n-data.ts +1 -0
  113. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +5 -5
  114. package/corpus/templates/design/app/pages/DesignSystems.tsx +3 -2
  115. package/corpus/templates/design/app/pages/design-editor/canvas-primitive-insert.ts +100 -13
  116. package/corpus/templates/design/app/pages/design-editor/cross-screen-text-color.ts +1 -1
  117. package/corpus/templates/design/app/pages/design-editor/data-operations.ts +14 -0
  118. package/corpus/templates/design/changelog/2026-08-10-marquee-selecting-layers-far-down-a-tall-screen-now-selects-.md +6 -0
  119. package/corpus/templates/design/changelog/2026-08-10-the-frame-tool-draws-a-plain-frame-by-default-with-screen-av.md +6 -0
  120. package/corpus/templates/design/e2e/global-setup.ts +27 -32
  121. package/corpus/templates/design/playwright.config.ts +3 -5
  122. package/corpus/templates/design/shared/breakpoint-media.ts +9 -2
  123. package/corpus/templates/dispatch/.agents/skills/actions/SKILL.md +54 -488
  124. package/corpus/templates/dispatch/.agents/skills/actions/references/action-fields.md +136 -0
  125. package/corpus/templates/dispatch/.agents/skills/actions/references/examples.md +94 -0
  126. package/corpus/templates/dispatch/.agents/skills/actions/references/provider-apis.md +95 -0
  127. package/corpus/templates/dispatch/.agents/skills/create-skill/SKILL.md +9 -35
  128. package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +4 -5
  129. package/corpus/templates/dispatch/.agents/skills/turn-into-app/SKILL.md +18 -31
  130. package/corpus/templates/dispatch/AGENTS.md +9 -16
  131. package/corpus/templates/dispatch/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
  132. package/corpus/templates/factory/.agents/skills/actions/SKILL.md +54 -488
  133. package/corpus/templates/factory/.agents/skills/actions/references/action-fields.md +136 -0
  134. package/corpus/templates/factory/.agents/skills/actions/references/examples.md +94 -0
  135. package/corpus/templates/factory/.agents/skills/actions/references/provider-apis.md +95 -0
  136. package/corpus/templates/factory/.agents/skills/create-skill/SKILL.md +9 -35
  137. package/corpus/templates/factory/.agents/skills/frontend-design/SKILL.md +4 -5
  138. package/corpus/templates/factory/.agents/skills/turn-into-app/SKILL.md +18 -31
  139. package/corpus/templates/factory/AGENTS.md +10 -24
  140. package/corpus/templates/factory/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
  141. package/corpus/templates/forms/.agents/skills/actions/SKILL.md +54 -488
  142. package/corpus/templates/forms/.agents/skills/actions/references/action-fields.md +136 -0
  143. package/corpus/templates/forms/.agents/skills/actions/references/examples.md +94 -0
  144. package/corpus/templates/forms/.agents/skills/actions/references/provider-apis.md +95 -0
  145. package/corpus/templates/forms/.agents/skills/create-skill/SKILL.md +9 -35
  146. package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +4 -5
  147. package/corpus/templates/forms/.agents/skills/turn-into-app/SKILL.md +18 -31
  148. package/corpus/templates/forms/AGENTS.md +11 -17
  149. package/corpus/templates/forms/app/global.css +1 -0
  150. package/corpus/templates/forms/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
  151. package/corpus/templates/forms/changelog/2026-08-11-full-page-chat-composers-stay-at-a-focused-750px-width.md +6 -0
  152. package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +4 -5
  153. package/corpus/templates/macros/.agents/skills/turn-into-app/SKILL.md +18 -31
  154. package/corpus/templates/macros/AGENTS.md +8 -8
  155. package/corpus/templates/mail/.agents/skills/actions/SKILL.md +54 -488
  156. package/corpus/templates/mail/.agents/skills/actions/references/action-fields.md +136 -0
  157. package/corpus/templates/mail/.agents/skills/actions/references/examples.md +94 -0
  158. package/corpus/templates/mail/.agents/skills/actions/references/provider-apis.md +95 -0
  159. package/corpus/templates/mail/.agents/skills/create-skill/SKILL.md +9 -35
  160. package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +4 -5
  161. package/corpus/templates/mail/.agents/skills/turn-into-app/SKILL.md +18 -31
  162. package/corpus/templates/mail/AGENTS.md +5 -6
  163. package/corpus/templates/plan/.agents/skills/actions/SKILL.md +54 -488
  164. package/corpus/templates/plan/.agents/skills/actions/references/action-fields.md +136 -0
  165. package/corpus/templates/plan/.agents/skills/actions/references/examples.md +94 -0
  166. package/corpus/templates/plan/.agents/skills/actions/references/provider-apis.md +95 -0
  167. package/corpus/templates/plan/.agents/skills/create-skill/SKILL.md +9 -35
  168. package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +4 -5
  169. package/corpus/templates/plan/.agents/skills/turn-into-app/SKILL.md +18 -31
  170. package/corpus/templates/plan/AGENTS.md +5 -14
  171. package/corpus/templates/plan/app/global.css +1 -0
  172. package/corpus/templates/plan/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
  173. package/corpus/templates/plan/changelog/2026-08-11-plan-no-longer-reloads-when-runtime-state-changes.md +6 -0
  174. package/corpus/templates/plan/server/ui-plan-html.ts +4 -1
  175. package/corpus/templates/plan/vite.config.ts +5 -0
  176. package/corpus/templates/slides/.agents/skills/actions/SKILL.md +54 -488
  177. package/corpus/templates/slides/.agents/skills/actions/references/action-fields.md +136 -0
  178. package/corpus/templates/slides/.agents/skills/actions/references/examples.md +94 -0
  179. package/corpus/templates/slides/.agents/skills/actions/references/provider-apis.md +95 -0
  180. package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +2 -2
  181. package/corpus/templates/slides/.agents/skills/create-skill/SKILL.md +9 -35
  182. package/corpus/templates/slides/.agents/skills/creative-context/SKILL.md +6 -3
  183. package/corpus/templates/slides/.agents/skills/deck-management/SKILL.md +6 -1
  184. package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +4 -5
  185. package/corpus/templates/slides/.agents/skills/image-generation-via-a2a/SKILL.md +3 -2
  186. package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +3 -0
  187. package/corpus/templates/slides/.agents/skills/slide-images/SKILL.md +3 -3
  188. package/corpus/templates/slides/.agents/skills/turn-into-app/SKILL.md +18 -31
  189. package/corpus/templates/slides/AGENTS.md +33 -35
  190. package/corpus/templates/slides/actions/add-deck.ts +2 -0
  191. package/corpus/templates/slides/actions/add-slide.ts +15 -1
  192. package/corpus/templates/slides/actions/create-deck.ts +18 -6
  193. package/corpus/templates/slides/actions/get-deck-reference-context.ts +2 -2
  194. package/corpus/templates/slides/actions/get-deck.ts +83 -7
  195. package/corpus/templates/slides/actions/import-file.ts +2 -1
  196. package/corpus/templates/slides/actions/patch-deck.ts +165 -9
  197. package/corpus/templates/slides/actions/save-deck.ts +24 -1
  198. package/corpus/templates/slides/actions/update-slide.ts +1 -1
  199. package/corpus/templates/slides/app/components/comments/SlideCommentsPanel.tsx +2 -2
  200. package/corpus/templates/slides/app/components/deck/DeckCard.tsx +1 -23
  201. package/corpus/templates/slides/app/components/design-system/DesignSystemCard.tsx +2 -2
  202. package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +6 -6
  203. package/corpus/templates/slides/app/components/editor/AnimationsPanel.tsx +3 -3
  204. package/corpus/templates/slides/app/components/editor/DeckEditorSkeleton.tsx +4 -4
  205. package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +1 -1
  206. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +432 -668
  207. package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +296 -259
  208. package/corpus/templates/slides/app/components/editor/GeneratingSlidePreview.tsx +1 -1
  209. package/corpus/templates/slides/app/components/editor/GoogleDriveConnectionCta.tsx +13 -1
  210. package/corpus/templates/slides/app/components/editor/NewDeckReferenceStep.tsx +56 -174
  211. package/corpus/templates/slides/app/components/editor/PromptDialog.tsx +241 -116
  212. package/corpus/templates/slides/app/components/editor/SlideContextToolbar.tsx +1 -1
  213. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +42 -14
  214. package/corpus/templates/slides/app/components/editor/SpeakerNotesPanel.tsx +6 -12
  215. package/corpus/templates/slides/app/components/editor/editor-command-model.ts +35 -0
  216. package/corpus/templates/slides/app/components/layout/AgentWorkIndicator.tsx +1 -1
  217. package/corpus/templates/slides/app/components/layout/Layout.tsx +34 -35
  218. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +8 -10
  219. package/corpus/templates/slides/app/components/layout/layout-route-policy.ts +2 -5
  220. package/corpus/templates/slides/app/components/onboarding/FirstDeckOnboardingFlow.tsx +45 -40
  221. package/corpus/templates/slides/app/components/presentation/PresentationView.tsx +63 -16
  222. package/corpus/templates/slides/app/context/DeckContext.tsx +2 -1
  223. package/corpus/templates/slides/app/global.css +76 -1
  224. package/corpus/templates/slides/app/hooks/use-generating-slide-preview.ts +25 -3
  225. package/corpus/templates/slides/app/i18n/en-US.ts +2 -0
  226. package/corpus/templates/slides/app/lib/create-deck-generation.ts +52 -23
  227. package/corpus/templates/slides/app/lib/recent-references.ts +23 -1
  228. package/corpus/templates/slides/app/lib/slide-animation-elements.ts +104 -3
  229. package/corpus/templates/slides/app/pages/DeckEditor.tsx +17 -33
  230. package/corpus/templates/slides/app/pages/DesignSystems.tsx +2 -2
  231. package/corpus/templates/slides/app/pages/Index.tsx +315 -151
  232. package/corpus/templates/slides/app/root.tsx +43 -0
  233. package/corpus/templates/slides/changelog/2026-08-10-ai-editing-avatar-badge.md +6 -0
  234. package/corpus/templates/slides/changelog/2026-08-10-generated-decks-keep-a-clear-human-readable-title.md +6 -0
  235. package/corpus/templates/slides/changelog/2026-08-10-new-deck-creation-now-shows-progress-opens-the-editor-direct.md +6 -0
  236. package/corpus/templates/slides/changelog/2026-08-10-presentation-reveals-now-follow-valid-targets.md +6 -0
  237. package/corpus/templates/slides/changelog/2026-08-10-slides-editing-controls-are-consolidated-into-one-focused-me.md +6 -0
  238. package/corpus/templates/slides/changelog/2026-08-10-slides-now-verify-and-restyle-every-imported-slide-in-one-pa.md +6 -0
  239. package/corpus/templates/slides/changelog/2026-08-10-slides-only-suggests-a-google-connection-for-relevant-reques.md +6 -0
  240. package/corpus/templates/slides/changelog/2026-08-10-the-google-slides-import-option-is-now-labeled-slides.md +6 -0
  241. package/corpus/templates/slides/changelog/2026-08-11-faster-slides-chat-deck-reads.md +6 -0
  242. package/corpus/templates/slides/changelog/2026-08-11-slides-chat-can-read-one-slide-without-loading-the-full-deck.md +6 -0
  243. package/corpus/templates/slides/changelog/2026-08-11-slides-clearly-indicate-when-an-ai-agent-is-editing-alongsid.md +6 -0
  244. package/corpus/templates/slides/package.json +1 -0
  245. package/corpus/templates/slides/server/lib/chat-attachments.ts +1 -1
  246. package/corpus/templates/slides/server/lib/validate-slide-animations.ts +163 -0
  247. package/corpus/templates/slides/server/plugins/agent-chat.ts +8 -5
  248. package/corpus/templates/slides/shared/api.ts +47 -15
  249. package/corpus/templates/slides/shared/deck-title.ts +135 -0
  250. package/corpus/templates/tasks/.agents/skills/actions/SKILL.md +54 -488
  251. package/corpus/templates/tasks/.agents/skills/actions/references/action-fields.md +136 -0
  252. package/corpus/templates/tasks/.agents/skills/actions/references/examples.md +94 -0
  253. package/corpus/templates/tasks/.agents/skills/actions/references/provider-apis.md +95 -0
  254. package/corpus/templates/tasks/.agents/skills/agent-watchdog/SKILL.md +1 -0
  255. package/corpus/templates/tasks/.agents/skills/create-skill/SKILL.md +9 -35
  256. package/corpus/templates/tasks/.agents/skills/efficient-fable/SKILL.md +1 -0
  257. package/corpus/templates/tasks/.agents/skills/efficient-frontier/SKILL.md +1 -0
  258. package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +4 -5
  259. package/corpus/templates/tasks/.agents/skills/plan-arbiter/SKILL.md +1 -0
  260. package/corpus/templates/tasks/.agents/skills/plow-ahead/SKILL.md +1 -0
  261. package/corpus/templates/tasks/.agents/skills/quick-recap/SKILL.md +1 -0
  262. package/corpus/templates/tasks/.agents/skills/read-the-damn-docs/SKILL.md +1 -0
  263. package/corpus/templates/tasks/.agents/skills/stay-within-limits/SKILL.md +1 -0
  264. package/corpus/templates/tasks/.agents/skills/turn-into-app/SKILL.md +18 -31
  265. package/corpus/templates/tasks/AGENTS.md +5 -20
  266. package/corpus/templates/tasks/app/components/tasks/TaskListRow.tsx +4 -1
  267. package/dist/agent/engine/ai-sdk-engine.js +1 -1
  268. package/dist/agent/production-agent.d.ts +21 -1
  269. package/dist/agent/production-agent.js +505 -355
  270. package/dist/agent/run-manager.js +156 -14
  271. package/dist/agent/run-store.d.ts +11 -10
  272. package/dist/agent/run-store.js +17 -13
  273. package/dist/agent/tool-approval-store.d.ts +18 -0
  274. package/dist/agent/tool-approval-store.js +122 -0
  275. package/dist/agent/types.d.ts +1 -1
  276. package/dist/cli/code-agent-executor.js +11 -2
  277. package/dist/client/AgentPanel.js +31 -6
  278. package/dist/client/AssistantChat.d.ts +9 -4
  279. package/dist/client/AssistantChat.js +221 -149
  280. package/dist/client/active-run-state.d.ts +9 -1
  281. package/dist/client/active-run-state.js +34 -3
  282. package/dist/client/agent-chat/index.d.ts +1 -1
  283. package/dist/client/agent-chat-adapter.d.ts +8 -0
  284. package/dist/client/agent-chat-adapter.js +125 -28
  285. package/dist/client/agent-chat.d.ts +1 -1
  286. package/dist/client/chat/markdown-renderer.js +14 -2
  287. package/dist/client/chat/message-components.d.ts +13 -3
  288. package/dist/client/chat/message-components.js +57 -52
  289. package/dist/client/chat/run-recovery.d.ts +1 -0
  290. package/dist/client/chat/run-recovery.js +8 -0
  291. package/dist/client/chat/tool-call-display.d.ts +5 -5
  292. package/dist/client/chat/tool-call-display.js +9 -212
  293. package/dist/client/chat-first/apps-rail.js +3 -3
  294. package/dist/client/chat-first/browser-pane.js +4 -1
  295. package/dist/client/chat-first/chat-history.d.ts +3 -1
  296. package/dist/client/chat-first/chat-history.js +7 -4
  297. package/dist/client/chat-first/surface-tabs.d.ts +1 -1
  298. package/dist/client/chat-first/surface-tabs.js +52 -41
  299. package/dist/client/chat-first/types.d.ts +3 -0
  300. package/dist/client/chat-first.d.ts +10 -0
  301. package/dist/client/chat-first.js +37 -2
  302. package/dist/client/components/ui/message-scroller.js +4 -1
  303. package/dist/client/i18n.js +3 -1
  304. package/dist/client/resources/McpConnectionSuggestion.js +9 -1
  305. package/dist/client/sse-event-processor.d.ts +4 -2
  306. package/dist/client/sse-event-processor.js +46 -6
  307. package/dist/client/use-chat-models.js +156 -80
  308. package/dist/client/use-run-stuck-detection.d.ts +2 -0
  309. package/dist/client/use-run-stuck-detection.js +85 -9
  310. package/dist/collab/awareness.d.ts +2 -2
  311. package/dist/collab/routes.d.ts +1 -1
  312. package/dist/collab/struct-routes.d.ts +1 -1
  313. package/dist/integrations/adapters/slack.d.ts +0 -4
  314. package/dist/integrations/adapters/slack.js +6 -30
  315. package/dist/integrations/catalog.js +1 -1
  316. package/dist/integrations/pending-tasks-store.d.ts +0 -8
  317. package/dist/integrations/pending-tasks-store.js +0 -21
  318. package/dist/integrations/slack-manifest.d.ts +2 -2
  319. package/dist/integrations/slack-manifest.js +0 -3
  320. package/dist/integrations/webhook-handler.js +1 -1
  321. package/dist/mcp/screen-memory-stdio.d.ts +7 -7
  322. package/dist/observability/routes.d.ts +3 -3
  323. package/dist/provider-api/actions/custom-provider-registration.d.ts +4 -4
  324. package/dist/provider-api/actions/provider-api.d.ts +8 -8
  325. package/dist/scripts/docs/source-search.js +2 -2
  326. package/dist/server/agent-chat/framework-prompts.js +7 -2
  327. package/dist/server/agent-chat/prompt-resources.js +2 -2
  328. package/dist/server/agent-chat/skill-frontmatter.d.ts +31 -2
  329. package/dist/server/agent-chat/skill-frontmatter.js +41 -15
  330. package/dist/server/agent-chat-plugin.js +3 -3
  331. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  332. package/dist/server/agents-bundle.d.ts +16 -19
  333. package/dist/server/agents-bundle.js +19 -35
  334. package/dist/server/auth.js +262 -31
  335. package/dist/server/better-auth-instance.d.ts +1 -0
  336. package/dist/server/better-auth-instance.js +17 -2
  337. package/dist/server/onboarding-html.js +56 -9
  338. package/dist/server/prompts/framework-core-compact.d.ts +6 -1
  339. package/dist/server/prompts/framework-core-compact.js +12 -9
  340. package/dist/server/prompts/framework-core.d.ts +6 -1
  341. package/dist/server/prompts/framework-core.js +11 -9
  342. package/dist/server/prompts/index.d.ts +1 -1
  343. package/dist/server/prompts/index.js +1 -1
  344. package/dist/server/prompts/shared-rules.d.ts +15 -11
  345. package/dist/server/prompts/shared-rules.js +17 -13
  346. package/dist/server/realtime-token.d.ts +1 -1
  347. package/dist/server/transcribe-voice.d.ts +1 -1
  348. package/dist/shared/reasoning-effort.d.ts +8 -8
  349. package/dist/shared/reasoning-effort.js +10 -10
  350. package/dist/shared/streaming-text-smoothing.js +41 -11
  351. package/dist/styles/agent-native.css +19 -32
  352. package/dist/templates/chat/.agents/skills/actions/SKILL.md +54 -488
  353. package/dist/templates/chat/.agents/skills/actions/references/action-fields.md +136 -0
  354. package/dist/templates/chat/.agents/skills/actions/references/examples.md +94 -0
  355. package/dist/templates/chat/.agents/skills/actions/references/provider-apis.md +95 -0
  356. package/dist/templates/chat/.agents/skills/create-skill/SKILL.md +9 -35
  357. package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +4 -5
  358. package/dist/templates/chat/.agents/skills/turn-into-app/SKILL.md +18 -31
  359. package/dist/templates/chat/AGENTS.md +32 -80
  360. package/dist/templates/chat/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
  361. package/dist/templates/default/.agents/skills/actions/SKILL.md +54 -488
  362. package/dist/templates/default/.agents/skills/actions/references/action-fields.md +136 -0
  363. package/dist/templates/default/.agents/skills/actions/references/examples.md +94 -0
  364. package/dist/templates/default/.agents/skills/actions/references/provider-apis.md +95 -0
  365. package/dist/templates/default/.agents/skills/create-skill/SKILL.md +9 -35
  366. package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +4 -5
  367. package/dist/templates/default/.agents/skills/turn-into-app/SKILL.md +18 -31
  368. package/dist/templates/headless/.agents/skills/actions/SKILL.md +54 -488
  369. package/dist/templates/headless/.agents/skills/actions/references/action-fields.md +136 -0
  370. package/dist/templates/headless/.agents/skills/actions/references/examples.md +94 -0
  371. package/dist/templates/headless/.agents/skills/actions/references/provider-apis.md +95 -0
  372. package/dist/templates/headless/.agents/skills/turn-into-app/SKILL.md +18 -31
  373. package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +54 -488
  374. package/dist/templates/workspace-core/.agents/skills/actions/references/action-fields.md +136 -0
  375. package/dist/templates/workspace-core/.agents/skills/actions/references/examples.md +94 -0
  376. package/dist/templates/workspace-core/.agents/skills/actions/references/provider-apis.md +95 -0
  377. package/dist/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +1 -0
  378. package/dist/templates/workspace-core/.agents/skills/agent-page/SKILL.md +1 -0
  379. package/dist/templates/workspace-core/.agents/skills/create-skill/SKILL.md +9 -35
  380. package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +4 -5
  381. package/dist/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +21 -29
  382. package/dist/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +18 -31
  383. package/dist/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +7 -17
  384. package/dist/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +3 -3
  385. package/dist/templates/workspace-core/AGENTS.md +7 -16
  386. package/docs/content/messaging.mdx +6 -7
  387. package/docs/content/template-chat.mdx +1 -1
  388. package/package.json +2 -2
  389. package/src/templates/chat/.agents/skills/actions/SKILL.md +54 -488
  390. package/src/templates/chat/.agents/skills/actions/references/action-fields.md +136 -0
  391. package/src/templates/chat/.agents/skills/actions/references/examples.md +94 -0
  392. package/src/templates/chat/.agents/skills/actions/references/provider-apis.md +95 -0
  393. package/src/templates/chat/.agents/skills/create-skill/SKILL.md +9 -35
  394. package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +4 -5
  395. package/src/templates/chat/.agents/skills/turn-into-app/SKILL.md +18 -31
  396. package/src/templates/chat/AGENTS.md +32 -80
  397. package/src/templates/chat/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
  398. package/src/templates/default/.agents/skills/actions/SKILL.md +54 -488
  399. package/src/templates/default/.agents/skills/actions/references/action-fields.md +136 -0
  400. package/src/templates/default/.agents/skills/actions/references/examples.md +94 -0
  401. package/src/templates/default/.agents/skills/actions/references/provider-apis.md +95 -0
  402. package/src/templates/default/.agents/skills/create-skill/SKILL.md +9 -35
  403. package/src/templates/default/.agents/skills/frontend-design/SKILL.md +4 -5
  404. package/src/templates/default/.agents/skills/turn-into-app/SKILL.md +18 -31
  405. package/src/templates/headless/.agents/skills/actions/SKILL.md +54 -488
  406. package/src/templates/headless/.agents/skills/actions/references/action-fields.md +136 -0
  407. package/src/templates/headless/.agents/skills/actions/references/examples.md +94 -0
  408. package/src/templates/headless/.agents/skills/actions/references/provider-apis.md +95 -0
  409. package/src/templates/headless/.agents/skills/turn-into-app/SKILL.md +18 -31
  410. package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +54 -488
  411. package/src/templates/workspace-core/.agents/skills/actions/references/action-fields.md +136 -0
  412. package/src/templates/workspace-core/.agents/skills/actions/references/examples.md +94 -0
  413. package/src/templates/workspace-core/.agents/skills/actions/references/provider-apis.md +95 -0
  414. package/src/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +1 -0
  415. package/src/templates/workspace-core/.agents/skills/agent-page/SKILL.md +1 -0
  416. package/src/templates/workspace-core/.agents/skills/create-skill/SKILL.md +9 -35
  417. package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +4 -5
  418. package/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +21 -29
  419. package/src/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +18 -31
  420. package/src/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +7 -17
  421. package/src/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +3 -3
  422. package/src/templates/workspace-core/AGENTS.md +7 -16
@@ -0,0 +1,35 @@
1
+ import type { ComponentType } from "react";
2
+
3
+ export type EditorCommandGroup =
4
+ | "media"
5
+ | "slideTools"
6
+ | "comments"
7
+ | "deck"
8
+ | "other";
9
+
10
+ export interface EditorCommand {
11
+ id: string;
12
+ group: EditorCommandGroup;
13
+ label: string;
14
+ keywords?: string[];
15
+ icon?: ComponentType<{ className?: string; size?: number }>;
16
+ active?: boolean;
17
+ run: () => void;
18
+ }
19
+
20
+ const EMPTY_COMMANDS: readonly EditorCommand[] = [];
21
+ type EditorCommandSource = () => readonly EditorCommand[];
22
+
23
+ let activeCommandSource: EditorCommandSource | null = null;
24
+
25
+ export function registerEditorCommands(source: EditorCommandSource) {
26
+ activeCommandSource = source;
27
+
28
+ return () => {
29
+ if (activeCommandSource === source) activeCommandSource = null;
30
+ };
31
+ }
32
+
33
+ export function getEditorCommands(): readonly EditorCommand[] {
34
+ return activeCommandSource?.() ?? EMPTY_COMMANDS;
35
+ }
@@ -87,7 +87,7 @@ export function AgentWorkIndicator() {
87
87
 
88
88
  return (
89
89
  <div className="pointer-events-none fixed bottom-4 left-1/2 z-50 w-[calc(100vw-2rem)] max-w-sm -translate-x-1/2 md:bottom-5">
90
- <div className="pointer-events-auto flex items-center justify-between gap-3 rounded-lg border border-border bg-popover/95 px-3 py-2 text-popover-foreground shadow-xl shadow-black/20 backdrop-blur">
90
+ <div className="pointer-events-auto flex items-center justify-between gap-3 rounded-lg border border-border bg-popover/95 px-3 py-2 text-popover-foreground shadow-xl shadow-black/20">
91
91
  <div className="flex min-w-0 items-center gap-2">
92
92
  <IconLoader2 className="h-4 w-4 shrink-0 animate-spin text-[#609FF8]" />
93
93
  <span className="truncate text-sm font-medium">
@@ -12,13 +12,12 @@ import { useSidebarCollapsed } from "@/hooks/use-sidebar-collapsed";
12
12
  import { TAB_ID } from "@/lib/tab-id";
13
13
  import { cn } from "@/lib/utils";
14
14
 
15
- import { GoogleDriveConnectionCta } from "../editor/GoogleDriveConnectionCta";
16
15
  import { AgentWorkIndicator } from "./AgentWorkIndicator";
17
16
  import { Header } from "./Header";
18
17
  import {
19
- getDeckChatScopeLabel,
20
18
  getEffectiveSlidesSidebarCollapsed,
21
19
  isSlidesEditorRoute,
20
+ shouldShowSlidesAppSidebar,
22
21
  } from "./layout-route-policy";
23
22
  import { Sidebar } from "./Sidebar";
24
23
 
@@ -50,26 +49,24 @@ export function Layout({ children }: LayoutProps) {
50
49
  useState<EditorSidebarOverride | null>(null);
51
50
  const { collapsed: sidebarCollapsed, setCollapsed: setSidebarCollapsed } =
52
51
  useSidebarCollapsed();
53
- const { decks, getDeck, loading: decksLoading } = useDecks();
52
+ const { decks, loading: decksLoading } = useDecks();
54
53
  const isEmptyDecksState =
55
54
  location.pathname === "/" && !decksLoading && decks.length === 0;
56
55
 
57
56
  // Scope new chats to the deck the user is currently editing. The route
58
57
  // is `/deck/:id`; everywhere else (list, presentation) leaves
59
- // scope null so chats stay in the general pool. Falling back to the
60
- // raw deck id keeps the chat bound even before the deck object has
61
- // streamed in — once the title arrives the badge updates in place.
58
+ // scope null so chats stay in the general pool. Keep the visible label
59
+ // semantic so an imported deck id never leaks into the composer chip.
62
60
  const deckScope = useMemo(() => {
63
61
  const match = location.pathname.match(/^\/deck\/([^/]+)/);
64
62
  const deckId = match?.[1];
65
63
  if (!deckId) return null;
66
- const deck = getDeck(deckId);
67
64
  return {
68
65
  type: "deck" as const,
69
66
  id: deckId,
70
- label: getDeckChatScopeLabel(deck?.title, t("agent.thisDeck")),
67
+ label: t("agent.thisDeck"),
71
68
  };
72
- }, [location.pathname, getDeck, t]);
69
+ }, [location.pathname, t]);
73
70
 
74
71
  useEffect(() => {
75
72
  setSidebarOpen(false);
@@ -84,6 +81,7 @@ export function Layout({ children }: LayoutProps) {
84
81
  }, []);
85
82
 
86
83
  const ownToolbar = pageHasOwnToolbar(location.pathname);
84
+ const showAppSidebar = shouldShowSlidesAppSidebar(location.pathname);
87
85
  const editorSidebarOverrideForLocation =
88
86
  editorSidebarOverride?.locationKey === location.key
89
87
  ? editorSidebarOverride.collapsed
@@ -120,35 +118,36 @@ export function Layout({ children }: LayoutProps) {
120
118
  agentPageHref="/settings/agent"
121
119
  suppressFirstRunOnboarding={isSlidesEditorRoute(location.pathname)}
122
120
  composerSlot={<CreativeContextComposerChip />}
123
- threadFooterSlot={<GoogleDriveConnectionCta />}
124
121
  >
125
122
  <div className="agent-layout-shell flex h-screen w-full overflow-hidden bg-background text-foreground">
126
- {sidebarOpen && (
127
- <div
128
- className="fixed inset-0 z-40 bg-black/50 md:hidden"
129
- onClick={() => setSidebarOpen(false)}
130
- />
131
- )}
132
- {!isEmptyDecksState && (
133
- <div
134
- className={cn(
135
- "agent-layout-left-drawer fixed inset-y-0 start-0 z-50 transition-transform duration-200 ease-out md:static md:z-auto md:transition-none",
136
- sidebarOpen
137
- ? "translate-x-0"
138
- : "-translate-x-full rtl:translate-x-full md:translate-x-0 md:rtl:translate-x-0",
123
+ {!isEmptyDecksState && showAppSidebar && (
124
+ <>
125
+ {sidebarOpen && (
126
+ <div
127
+ className="fixed inset-0 z-40 bg-foreground/50 md:hidden"
128
+ onClick={() => setSidebarOpen(false)}
129
+ />
139
130
  )}
140
- >
141
- <Sidebar
142
- collapsed={effectiveSidebarCollapsed && !sidebarOpen}
143
- // In the mobile drawer the sidebar is forced expanded, so the
144
- // desktop collapse toggle would be a silent no-op (worse: it'd
145
- // mutate the desktop preference). Hide it while the drawer is
146
- // open.
147
- onToggleCollapsed={
148
- sidebarOpen ? undefined : toggleSidebarCollapsed
149
- }
150
- />
151
- </div>
131
+ <div
132
+ className={cn(
133
+ "agent-layout-left-drawer fixed inset-y-0 start-0 z-50 transition-transform duration-200 ease-out md:static md:z-auto md:transition-none",
134
+ sidebarOpen
135
+ ? "translate-x-0"
136
+ : "-translate-x-full rtl:translate-x-full md:translate-x-0 md:rtl:translate-x-0",
137
+ )}
138
+ >
139
+ <Sidebar
140
+ collapsed={effectiveSidebarCollapsed && !sidebarOpen}
141
+ // In the mobile drawer the sidebar is forced expanded, so the
142
+ // desktop collapse toggle would be a silent no-op (worse: it'd
143
+ // mutate the desktop preference). Hide it while the drawer is
144
+ // open.
145
+ onToggleCollapsed={
146
+ sidebarOpen ? undefined : toggleSidebarCollapsed
147
+ }
148
+ />
149
+ </div>
150
+ </>
152
151
  )}
153
152
  <div className="agent-layout-main-surface flex h-full min-w-0 flex-1 flex-col overflow-hidden">
154
153
  {/* Mobile-only nav strip with hamburger — only when there's no page toolbar */}
@@ -6,8 +6,8 @@ import { OrgSwitcher } from "@agent-native/core/client/org";
6
6
  import { FeedbackButton } from "@agent-native/core/client/ui";
7
7
  import { SidebarFooterActions } from "@agent-native/toolkit/app-shell";
8
8
  import {
9
- IconStack2,
10
- IconPalette,
9
+ IconLayoutGrid,
10
+ IconComponents,
11
11
  IconSettings,
12
12
  IconLayoutSidebarLeftCollapse,
13
13
  IconLayoutSidebarLeftExpand,
@@ -23,9 +23,9 @@ import {
23
23
  import { cn } from "@/lib/utils";
24
24
 
25
25
  const navItems = [
26
- { icon: IconStack2, labelKey: "navigation.decks", href: "/" },
26
+ { icon: IconLayoutGrid, labelKey: "navigation.decks", href: "/" },
27
27
  {
28
- icon: IconPalette,
28
+ icon: IconComponents,
29
29
  labelKey: "navigation.designSystems",
30
30
  href: "/design-systems",
31
31
  },
@@ -161,8 +161,8 @@ export function Sidebar({ collapsed, onToggleCollapsed }: SidebarProps) {
161
161
 
162
162
  if (collapsed) {
163
163
  return (
164
- <aside className="flex h-full w-12 shrink-0 flex-col items-center overflow-hidden border-e border-border bg-sidebar text-sidebar-foreground transition-[width] duration-200 ease-out">
165
- <div className="flex h-12 w-full shrink-0 items-center justify-center border-b border-border">
164
+ <aside className="flex h-full w-12 shrink-0 flex-col items-center overflow-hidden bg-sidebar text-sidebar-foreground transition-[width] duration-200 ease-out">
165
+ <div className="flex h-12 w-full shrink-0 items-center justify-center">
166
166
  {brandControl}
167
167
  </div>
168
168
  <nav className="flex min-h-0 flex-1 flex-col items-center gap-1 overflow-y-auto pt-1">
@@ -224,10 +224,8 @@ export function Sidebar({ collapsed, onToggleCollapsed }: SidebarProps) {
224
224
  }
225
225
 
226
226
  return (
227
- <aside className="flex h-full w-56 min-w-0 shrink-0 flex-col overflow-hidden border-e border-border bg-sidebar text-sidebar-foreground transition-[width] duration-200 ease-out">
228
- <div className="flex h-12 shrink-0 items-center border-b border-border px-4">
229
- {brandControl}
230
- </div>
227
+ <aside className="flex h-full w-56 min-w-0 shrink-0 flex-col overflow-hidden bg-sidebar text-sidebar-foreground transition-[width] duration-200 ease-out">
228
+ <div className="flex h-12 shrink-0 items-center px-4">{brandControl}</div>
231
229
 
232
230
  <div className="flex min-h-0 flex-1 flex-col overflow-y-auto">
233
231
  <nav className="space-y-1 px-2 py-2">
@@ -2,11 +2,8 @@ export function isSlidesEditorRoute(pathname: string): boolean {
2
2
  return /^\/deck\/[^/]+\/?$/.test(pathname);
3
3
  }
4
4
 
5
- export function getDeckChatScopeLabel(
6
- deckTitle: string | undefined,
7
- untitledDeckLabel: string,
8
- ): string {
9
- return deckTitle === "Untitled Deck" ? untitledDeckLabel : deckTitle || "";
5
+ export function shouldShowSlidesAppSidebar(pathname: string): boolean {
6
+ return !isSlidesEditorRoute(pathname);
10
7
  }
11
8
 
12
9
  export function getEffectiveSlidesSidebarCollapsed({
@@ -26,6 +26,7 @@ import { useDesignSystems } from "@/hooks/use-design-systems";
26
26
  import { useWorkspaceDefaults } from "@/hooks/use-workspace-defaults";
27
27
  import { startDeckGeneration } from "@/lib/create-deck-generation";
28
28
  import {
29
+ forgetRecentReference,
29
30
  readRecentReferences,
30
31
  rememberRecentReference,
31
32
  type RecentReference,
@@ -45,11 +46,8 @@ export function FirstDeckOnboardingFlow({
45
46
  const { session } = useSession();
46
47
  const { decks, createDeck, ensureDeckPersisted, deleteDeck, reloadDecks } =
47
48
  useDecks();
48
- const { designSystems, defaultSystem } = useDesignSystems();
49
- const {
50
- referenceDeck: workspaceReferenceDeck,
51
- designSystem: workspaceDesignSystem,
52
- } = useWorkspaceDefaults();
49
+ const { designSystems } = useDesignSystems();
50
+ const { designSystem: workspaceDesignSystem } = useWorkspaceDefaults();
53
51
  const { submit: agentSubmit } = useAgentGenerating();
54
52
  const [step, setStep] = useState<FirstDeckStep>("prompt");
55
53
  const [prompt, setPrompt] = useState("");
@@ -63,19 +61,25 @@ export function FirstDeckOnboardingFlow({
63
61
  );
64
62
 
65
63
  const initialPrompt = searchParams.get("initialPrompt")?.trim() ?? "";
66
- const workspaceReferenceDeckId =
67
- workspaceReferenceDeck && !workspaceReferenceDeck.unavailable
68
- ? workspaceReferenceDeck.id
69
- : null;
70
64
  const workspaceDesignSystemId =
71
65
  workspaceDesignSystem && !workspaceDesignSystem.unavailable
72
66
  ? workspaceDesignSystem.id
73
67
  : null;
68
+ const lastUsedDesignSystemId =
69
+ recentReferences.find(
70
+ (reference) =>
71
+ reference.kind === "design-system" &&
72
+ designSystems.some((designSystem) => designSystem.id === reference.id),
73
+ )?.id ?? null;
74
+ const lastUsedReferenceDeckId =
75
+ recentReferences.find(
76
+ (reference) =>
77
+ reference.kind === "deck" &&
78
+ decks.some((deck) => deck.id === reference.id),
79
+ )?.id ?? null;
74
80
  const initialDesignSystemId =
75
- designSystems.find((designSystem) => designSystem.isDefault)?.id ??
76
- workspaceDesignSystemId ??
77
- defaultSystem?.id ??
78
- null;
81
+ lastUsedDesignSystemId ?? workspaceDesignSystemId;
82
+ const initialReferenceDeckId = lastUsedReferenceDeckId;
79
83
 
80
84
  useEffect(() => {
81
85
  const result = readRecentReferences();
@@ -103,6 +107,10 @@ export function FirstDeckOnboardingFlow({
103
107
  },
104
108
  [],
105
109
  );
110
+ const forgetReference = useCallback((kind: RecentReference["kind"]) => {
111
+ const result = forgetRecentReference(kind);
112
+ if (result.readable) setRecentReferences(result.items);
113
+ }, []);
106
114
 
107
115
  const handlePromptSubmit = useCallback(
108
116
  async (text: string, files: File[]) => {
@@ -137,7 +145,7 @@ export function FirstDeckOnboardingFlow({
137
145
  files,
138
146
  referenceSelection: selection,
139
147
  selectedDesignSystemId: initialDesignSystemId,
140
- selectedReferenceDeckId: workspaceReferenceDeckId,
148
+ selectedReferenceDeckId: initialReferenceDeckId,
141
149
  designSystems,
142
150
  createDeck,
143
151
  ensureDeckPersisted,
@@ -185,24 +193,32 @@ export function FirstDeckOnboardingFlow({
185
193
  prompt,
186
194
  session,
187
195
  t,
188
- workspaceReferenceDeckId,
196
+ initialReferenceDeckId,
189
197
  ],
190
198
  );
191
199
 
192
200
  const handleReferenceSelect = useCallback(
193
201
  async (selection: NewDeckReferenceSelection) => {
194
- if (selection.designSystemId) {
195
- rememberReference({
196
- id: selection.designSystemId,
197
- kind: "design-system",
198
- });
202
+ if (selection.designSystemId !== undefined) {
203
+ if (selection.designSystemId) {
204
+ rememberReference({
205
+ id: selection.designSystemId,
206
+ kind: "design-system",
207
+ });
208
+ } else {
209
+ forgetReference("design-system");
210
+ }
199
211
  }
200
- if (selection.referenceDeckId) {
201
- rememberReference({ id: selection.referenceDeckId, kind: "deck" });
212
+ if (selection.referenceDeckId !== undefined) {
213
+ if (selection.referenceDeckId) {
214
+ rememberReference({ id: selection.referenceDeckId, kind: "deck" });
215
+ } else {
216
+ forgetReference("deck");
217
+ }
202
218
  }
203
219
  await startGeneration(promptFiles, selection);
204
220
  },
205
- [promptFiles, rememberReference, startGeneration],
221
+ [forgetReference, promptFiles, rememberReference, startGeneration],
206
222
  );
207
223
 
208
224
  const handleReferenceImport = useCallback(
@@ -296,7 +312,6 @@ export function FirstDeckOnboardingFlow({
296
312
  setPromptFiles((current) => [...current, ...generationFiles]);
297
313
  if (importedReference) {
298
314
  await reloadDecks();
299
- rememberReference({ id: importedReference.id, kind: "deck" });
300
315
  }
301
316
  return importedReference;
302
317
  } catch (error) {
@@ -311,15 +326,7 @@ export function FirstDeckOnboardingFlow({
311
326
  setReferenceImporting(false);
312
327
  }
313
328
  },
314
- [
315
- callAction,
316
- createDeck,
317
- deleteDeck,
318
- ensureDeckPersisted,
319
- reloadDecks,
320
- rememberReference,
321
- t,
322
- ],
329
+ [callAction, createDeck, deleteDeck, ensureDeckPersisted, reloadDecks, t],
323
330
  );
324
331
 
325
332
  const handleReferenceSourceImport = useCallback(
@@ -357,7 +364,6 @@ export function FirstDeckOnboardingFlow({
357
364
  source: "google-slides",
358
365
  };
359
366
  await reloadDecks();
360
- rememberReference({ id: importedReference.id, kind: "deck" });
361
367
  return importedReference;
362
368
  } catch (error) {
363
369
  toast.error(t("editorToolbar.uploadFailed"), {
@@ -371,15 +377,17 @@ export function FirstDeckOnboardingFlow({
371
377
  setReferenceImporting(false);
372
378
  }
373
379
  },
374
- [callAction, reloadDecks, rememberReference, t],
380
+ [callAction, reloadDecks, t],
375
381
  );
376
382
 
377
383
  const handleReferenceSkip = useCallback(() => {
384
+ forgetReference("design-system");
385
+ forgetReference("deck");
378
386
  void startGeneration(promptFiles, {
379
387
  designSystemId: null,
380
388
  referenceDeckId: null,
381
389
  });
382
- }, [promptFiles, startGeneration]);
390
+ }, [forgetReference, promptFiles, startGeneration]);
383
391
 
384
392
  if (step === "references") {
385
393
  return (
@@ -388,8 +396,7 @@ export function FirstDeckOnboardingFlow({
388
396
  decks={decks}
389
397
  designSystems={designSystems}
390
398
  defaultDesignSystemId={initialDesignSystemId}
391
- defaultReferenceDeckId={workspaceReferenceDeckId}
392
- recentReferences={recentReferences}
399
+ defaultReferenceDeckId={initialReferenceDeckId}
393
400
  onSelect={handleReferenceSelect}
394
401
  onImport={handleReferenceImport}
395
402
  onImportSource={handleReferenceSourceImport}
@@ -404,8 +411,6 @@ export function FirstDeckOnboardingFlow({
404
411
  chooseDeckLabel={t("home.referenceDeckPlaceholder")}
405
412
  importingLabel={t("raw.uploading")}
406
413
  skipLabel={t("home.referenceDeckNone")}
407
- starredLabel={t("home.referenceDeckStarredGroup")}
408
- otherDecksLabel={t("home.referenceDeckOtherGroup")}
409
414
  searchDecksLabel={t("root.searchDecks")}
410
415
  promptSummary={prompt}
411
416
  />
@@ -19,7 +19,7 @@ import type { AspectRatio } from "@/lib/aspect-ratios";
19
19
  import {
20
20
  findLegacyAnimationContainer,
21
21
  getElementPath,
22
- resolveSlideAnimationElement,
22
+ resolveSlideAnimationTargets,
23
23
  } from "@/lib/slide-animation-elements";
24
24
 
25
25
  import type { DesignSystemData } from "../../../shared/api";
@@ -40,7 +40,17 @@ interface PresentationViewProps {
40
40
  * Uses slide.animations if defined, falls back to splitByParagraph auto-detection.
41
41
  */
42
42
  function getAnimationSteps(slide: Slide): SlideAnimation[] | null {
43
- if (slide.animations && slide.animations.length > 0) return slide.animations;
43
+ if (slide.animations && slide.animations.length > 0) {
44
+ const doc = new DOMParser().parseFromString(slide.content, "text/html");
45
+ const root = doc.querySelector(".fmd-slide");
46
+ // Explicit metadata is authoritative only when every target still points
47
+ // at a unique element in the final HTML. Otherwise disable the reveal
48
+ // layer for this slide instead of counting invisible phantom steps while
49
+ // leaving the rest of the content visible.
50
+ return root && resolveSlideAnimationTargets(root, slide.animations)
51
+ ? slide.animations
52
+ : null;
53
+ }
44
54
  // Legacy splitByParagraph: auto-detect and create steps
45
55
  if (slide.splitByParagraph) {
46
56
  const doc = new DOMParser().parseFromString(slide.content, "text/html");
@@ -111,14 +121,16 @@ function annotateStepsForPresentation(
111
121
  const root = doc.querySelector(".fmd-slide");
112
122
  if (!root) return html;
113
123
 
114
- // Annotate each step element with data-pstep
115
- steps.forEach((anim, stepIdx) => {
116
- const el = resolveSlideAnimationElement(root, anim);
117
- if (el) el.setAttribute("data-pstep", String(stepIdx));
124
+ const resolvedSteps = resolveSlideAnimationTargets(root, steps);
125
+ if (!resolvedSteps) return html;
126
+
127
+ // Annotate each resolved step element with data-pstep.
128
+ resolvedSteps.forEach(({ element }, stepIdx) => {
129
+ element.setAttribute("data-pstep", String(stepIdx));
118
130
  });
119
131
 
120
- const styleLines = steps
121
- .map((anim, stepIdx) => {
132
+ const styleLines = resolvedSteps
133
+ .map(({ target }, stepIdx) => {
122
134
  if (stepIdx >= currentStep) {
123
135
  return `[data-pstep="${stepIdx}"] { opacity: 0; pointer-events: none; }`;
124
136
  } else if (stepIdx < currentStep - 1) {
@@ -126,7 +138,7 @@ function annotateStepsForPresentation(
126
138
  return `[data-pstep="${stepIdx}"] { opacity: 1; pointer-events: auto; animation: elem-appear 1ms both; }`;
127
139
  } else {
128
140
  // Newly revealed — animate with its type
129
- return `[data-pstep="${stepIdx}"] { opacity: 1; pointer-events: auto; ${getElemAnimCss(anim.type)} }`;
141
+ return `[data-pstep="${stepIdx}"] { opacity: 1; pointer-events: auto; ${getElemAnimCss(target.type)} }`;
130
142
  }
131
143
  })
132
144
  .join("\n");
@@ -219,6 +231,10 @@ export default function PresentationView({
219
231
  const [cursorVisible, setCursorVisible] = useState(true);
220
232
  const [needsFullscreenGesture, setNeedsFullscreenGesture] = useState(false);
221
233
  const enteredFullscreenRef = useRef(false);
234
+ const transitionTimerRef = useRef<number | null>(null);
235
+ const queuedNavigationRef = useRef<"next" | "prev" | null>(null);
236
+ const goNextRef = useRef<() => void>(() => {});
237
+ const goPrevRef = useRef<() => void>(() => {});
222
238
  const navigate = useNavigate();
223
239
 
224
240
  const isShared = deckId.startsWith("__shared__/");
@@ -230,9 +246,23 @@ export default function PresentationView({
230
246
  );
231
247
  }, [clampIndex, safeSlides.length]);
232
248
 
249
+ const clearTransitionTimer = useCallback(() => {
250
+ if (transitionTimerRef.current !== null) {
251
+ window.clearTimeout(transitionTimerRef.current);
252
+ transitionTimerRef.current = null;
253
+ }
254
+ }, []);
255
+
256
+ useEffect(() => clearTransitionTimer, [clearTransitionTimer]);
257
+
233
258
  useEffect(() => {
259
+ clearTransitionTimer();
260
+ queuedNavigationRef.current = null;
234
261
  setCurrentIndex(clampIndex(startIndex));
235
- }, [clampIndex, startIndex]);
262
+ setCurrentStep(0);
263
+ setPrevIndex(null);
264
+ setAnimating(false);
265
+ }, [clearTransitionTimer, clampIndex, startIndex]);
236
266
 
237
267
  const currentSlide = safeSlides[currentIndex];
238
268
  const animSteps = currentSlide ? getAnimationSteps(currentSlide) : null;
@@ -247,7 +277,11 @@ export default function PresentationView({
247
277
  const initialStep =
248
278
  dir === "prev" ? (incomingSteps ? incomingSteps.length : 0) : 0;
249
279
 
280
+ clearTransitionTimer();
281
+ queuedNavigationRef.current = null;
250
282
  if (isInstant(t)) {
283
+ setPrevIndex(null);
284
+ setAnimating(false);
251
285
  setCurrentIndex(newIndex);
252
286
  setCurrentStep(initialStep);
253
287
  return;
@@ -259,16 +293,28 @@ export default function PresentationView({
259
293
  setCurrentIndex(newIndex);
260
294
  setCurrentStep(initialStep);
261
295
 
262
- setTimeout(() => {
296
+ transitionTimerRef.current = window.setTimeout(() => {
297
+ transitionTimerRef.current = null;
263
298
  setPrevIndex(null);
264
299
  setAnimating(false);
300
+ const queued = queuedNavigationRef.current;
301
+ queuedNavigationRef.current = null;
302
+ if (queued) {
303
+ window.setTimeout(() => {
304
+ if (queued === "next") goNextRef.current();
305
+ else goPrevRef.current();
306
+ }, 0);
307
+ }
265
308
  }, 400);
266
309
  },
267
- [currentIndex, safeSlides],
310
+ [clearTransitionTimer, currentIndex, safeSlides],
268
311
  );
269
312
 
270
313
  const goNext = useCallback(() => {
271
- if (animating) return;
314
+ if (animating) {
315
+ queuedNavigationRef.current = "next";
316
+ return;
317
+ }
272
318
  // Reveal next paragraph step if enabled
273
319
  if (maxSteps > 0 && currentStep < maxSteps /* i18n-ignore */) {
274
320
  setCurrentStep((prev) => prev + 1);
@@ -286,7 +332,10 @@ export default function PresentationView({
286
332
  ]);
287
333
 
288
334
  const goPrev = useCallback(() => {
289
- if (animating) return;
335
+ if (animating) {
336
+ queuedNavigationRef.current = "prev";
337
+ return;
338
+ }
290
339
  if (currentIndex <= 0) return;
291
340
  startTransition(currentIndex - 1, "prev");
292
341
  }, [animating, currentIndex, startTransition]);
@@ -307,8 +356,6 @@ export default function PresentationView({
307
356
  // commands and mirrors whatever we echo back — so build steps stay
308
357
  // authoritative here.
309
358
  const channelRef = useRef<BroadcastChannel | null>(null);
310
- const goNextRef = useRef(goNext);
311
- const goPrevRef = useRef(goPrev);
312
359
  goNextRef.current = goNext;
313
360
  goPrevRef.current = goPrev;
314
361
 
@@ -8,6 +8,7 @@ import { callAction } from "@agent-native/core/client/hooks";
8
8
  import { isEmbedAuthActive } from "@agent-native/core/client/host";
9
9
  import { useOrg } from "@agent-native/core/client/org";
10
10
  import { subscribeSyncEvents } from "@agent-native/core/client/use-db-sync";
11
+ import { DEFAULT_DECK_TITLE } from "@shared/deck-title";
11
12
  import { nanoid } from "nanoid";
12
13
  import {
13
14
  createContext,
@@ -1760,7 +1761,7 @@ export function DeckProvider({ children }: { children: ReactNode }) {
1760
1761
  const insertIndex = decksRef.current.length;
1761
1762
  const newDeck: Deck = {
1762
1763
  id: nanoid(10),
1763
- title: title || "Untitled Deck",
1764
+ title: title?.trim() || DEFAULT_DECK_TITLE,
1764
1765
  createdAt: new Date().toISOString(),
1765
1766
  updatedAt: new Date().toISOString(),
1766
1767
  createdByMe: true,
@@ -143,7 +143,7 @@ button[title="Open agent sidebar"] {
143
143
  }
144
144
 
145
145
  .slide-style-inspector .slides-inspector-section {
146
- border-bottom: 1px solid var(--slides-inspector-divider);
146
+ border-bottom: 0;
147
147
  border-radius: 0;
148
148
  padding: 0.625rem 0.75rem;
149
149
  }
@@ -239,6 +239,81 @@ button[title="Open agent sidebar"] {
239
239
  container-type: inline-size;
240
240
  }
241
241
 
242
+ .deck-editor-shell {
243
+ --slides-editor-surface: hsl(var(--background));
244
+ container-type: inline-size;
245
+ container-name: deck-editor;
246
+ }
247
+
248
+ @supports (background: color-mix(in srgb, white, black)) {
249
+ .deck-editor-shell {
250
+ --slides-editor-surface: color-mix(
251
+ in srgb,
252
+ hsl(var(--background)) 35%,
253
+ var(--agent-native-lower-surface, hsl(var(--background))) 65%
254
+ );
255
+ }
256
+ }
257
+
258
+ .deck-editor-context-toolbar-host {
259
+ min-width: 0;
260
+ overflow: hidden;
261
+ }
262
+
263
+ .deck-editor-context-toolbar-host--wide {
264
+ display: none;
265
+ }
266
+
267
+ .deck-editor-context-toolbar-host--narrow {
268
+ display: flex;
269
+ justify-content: flex-end;
270
+ }
271
+
272
+ .deck-editor-context-toolbar-host--narrow
273
+ > [data-slide-inline-edit-surface="true"] {
274
+ min-width: 0;
275
+ width: fit-content;
276
+ max-width: 100%;
277
+ flex: 0 1 auto;
278
+ }
279
+
280
+ @container deck-editor (max-width: 1149px) {
281
+ .deck-editor-context-toolbar-host--wide {
282
+ display: none;
283
+ }
284
+
285
+ .deck-editor-context-toolbar-host--narrow {
286
+ display: flex;
287
+ }
288
+ }
289
+
290
+ @container deck-editor (min-width: 1150px) {
291
+ .deck-editor-context-toolbar-host--narrow {
292
+ display: none;
293
+ }
294
+
295
+ .deck-editor-context-toolbar-host--wide[data-context-toolbar-visible="true"] {
296
+ display: flex;
297
+ flex: 1 1 0%;
298
+ align-items: center;
299
+ justify-content: flex-end;
300
+ }
301
+
302
+ .deck-editor-context-toolbar-host--wide
303
+ > [data-slide-inline-edit-surface="true"] {
304
+ min-width: 0;
305
+ max-width: 100%;
306
+ }
307
+
308
+ .deck-editor-context-toolbar-host--wide .slide-context-toolbar--top-row {
309
+ height: 2.75rem;
310
+ justify-content: flex-end;
311
+ border: 0;
312
+ background: transparent;
313
+ padding-inline: 0;
314
+ }
315
+ }
316
+
242
317
  @container (max-width: 36rem) {
243
318
  .deck-grid {
244
319
  grid-template-columns: minmax(0, 1fr);