@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
@@ -367,6 +367,13 @@ export function PositionLayoutProperties({
367
367
  const authoredTransform = authoredStyleValue(element, "transform");
368
368
  const constraintsValue = deriveConstraintsValue(element);
369
369
  const [constraintsExpanded, setConstraintsExpanded] = useState(false);
370
+ // position:absolute/fixed takes a child out of the parent's flex flow, so it
371
+ // still anchors and keeps constraints.
372
+ const constraintsSuppressed =
373
+ element.isFlexChild &&
374
+ !["absolute", "fixed"].includes(
375
+ (element.computedStyles?.position ?? "").toLowerCase(),
376
+ );
370
377
  // 3D rotation/perspective progressive-disclosure expander — mirrors
371
378
  // CornerRadiusControl's showIndependentCorners pattern. Default-expanded
372
379
  // when the authored transform already has non-zero X/Y rotation or
@@ -544,33 +551,40 @@ export function PositionLayoutProperties({
544
551
  hoverRevealClassName="opacity-0 group-hover/field:opacity-100"
545
552
  />
546
553
  </div>
547
- <Tooltip>
548
- <TooltipTrigger asChild>
549
- <button
550
- type="button"
551
- aria-label={
552
- "Constraints" /* i18n-ignore design inspector action */
553
- }
554
- aria-pressed={constraintsExpanded}
555
- onClick={() => setConstraintsExpanded((expanded) => !expanded)}
556
- className={cn(
557
- "flex size-7 items-center justify-center rounded-md transition-colors",
558
- "hover:bg-[var(--design-editor-control-bg)] hover:text-foreground",
559
- "focus:outline-none focus-visible:ring-1 focus-visible:ring-[var(--design-editor-accent-color)]",
560
- constraintsExpanded
561
- ? "bg-[var(--design-editor-selection-color)] text-[var(--design-editor-accent-color)] hover:text-[var(--design-editor-accent-color)]"
562
- : "text-muted-foreground",
563
- )}
564
- >
565
- <ConstraintsPreview value={constraintsValue} />
566
- </button>
567
- </TooltipTrigger>
568
- <TooltipContent>
569
- {"Constraints" /* i18n-ignore design inspector tooltip */}
570
- </TooltipContent>
571
- </Tooltip>
554
+ {/* Figma: constraints cannot apply to a child of an auto layout
555
+ frame — the parent's layout owns the position. An absolutely
556
+ positioned descendant is out of that flow and still anchors. */}
557
+ {constraintsSuppressed ? null : (
558
+ <Tooltip>
559
+ <TooltipTrigger asChild>
560
+ <button
561
+ type="button"
562
+ aria-label={
563
+ "Constraints" /* i18n-ignore design inspector action */
564
+ }
565
+ aria-pressed={constraintsExpanded}
566
+ onClick={() =>
567
+ setConstraintsExpanded((expanded) => !expanded)
568
+ }
569
+ className={cn(
570
+ "flex size-7 items-center justify-center rounded-md transition-colors",
571
+ "hover:bg-[var(--design-editor-control-bg)] hover:text-foreground",
572
+ "focus:outline-none focus-visible:ring-1 focus-visible:ring-[var(--design-editor-accent-color)]",
573
+ constraintsExpanded
574
+ ? "bg-[var(--design-editor-selection-color)] text-[var(--design-editor-accent-color)] hover:text-[var(--design-editor-accent-color)]"
575
+ : "text-muted-foreground",
576
+ )}
577
+ >
578
+ <ConstraintsPreview value={constraintsValue} />
579
+ </button>
580
+ </TooltipTrigger>
581
+ <TooltipContent>
582
+ {"Constraints" /* i18n-ignore design inspector tooltip */}
583
+ </TooltipContent>
584
+ </Tooltip>
585
+ )}
572
586
  </div>
573
- {constraintsExpanded ? (
587
+ {constraintsExpanded && !constraintsSuppressed ? (
574
588
  <ConstraintsWidget
575
589
  value={constraintsValue}
576
590
  onChange={handleConstraintsChange}
@@ -310,6 +310,8 @@ function stripExecutableStaticPreviewContent(html: string) {
310
310
  * logical board paintable without allocating or scrolling a 131k iframe.
311
311
  */
312
312
  export function getBoardSurfaceStaticPreviewContent(args: {
313
+ /** Themed canvas colour; falls back to the dark default when unresolved. */
314
+ background?: string;
313
315
  html: string;
314
316
  logicalGeometry: FrameGeometry;
315
317
  viewport: { width: number; height: number };
@@ -321,10 +323,11 @@ export function getBoardSurfaceStaticPreviewContent(args: {
321
323
  const height = Math.max(1, args.logicalGeometry.height);
322
324
  const viewportWidth = Math.max(1, args.viewport.width);
323
325
  const viewportHeight = Math.max(1, args.viewport.height);
326
+ const background = args.background?.trim() || BOARD_SURFACE_BACKGROUND;
324
327
  const scale = Math.min(viewportWidth / width, viewportHeight / height);
325
328
  const offsetX = -args.logicalGeometry.x;
326
329
  const offsetY = -args.logicalGeometry.y;
327
- const style = `<style data-agent-native-board-static-preview>*,*::before,*::after{animation:none!important;animation-delay:0s!important;transition:none!important;caret-color:transparent!important;}html{width:${viewportWidth}px!important;height:${viewportHeight}px!important;overflow:hidden!important;}html,body{background:${BOARD_SURFACE_BACKGROUND}!important;background-color:${BOARD_SURFACE_BACKGROUND}!important;background-image:none!important;}body{margin:0!important;width:${width}px!important;height:${height}px!important;overflow:visible!important;transform:scale(${scale})!important;transform-origin:0 0!important;}body>[data-agent-native-node-id]{translate:${offsetX}px ${offsetY}px!important;}</style>`;
330
+ const style = `<style data-agent-native-board-static-preview>*,*::before,*::after{animation:none!important;animation-delay:0s!important;transition:none!important;caret-color:transparent!important;}html{width:${viewportWidth}px!important;height:${viewportHeight}px!important;overflow:hidden!important;}html,body{background:${background}!important;background-color:${background}!important;background-image:none!important;}body{margin:0!important;width:${width}px!important;height:${height}px!important;overflow:visible!important;transform:scale(${scale})!important;transform-origin:0 0!important;}body>[data-agent-native-node-id]{translate:${offsetX}px ${offsetY}px!important;}</style>`;
328
331
  if (/<\/head\s*>/i.test(renderHtml)) {
329
332
  return injectDocumentMarkup(renderHtml, style, { target: "head" });
330
333
  }
@@ -337,6 +337,9 @@ export function getBreakpointFrameGeometry(args: {
337
337
  /** Measured content height at this width; wins over the primary-aspect
338
338
  * projection, which clipped narrower frames (they reflow taller). */
339
339
  contentHeightPx?: number;
340
+ /** A height the user set. Content measurement must never overwrite it, or
341
+ * the frame grows out from under them and 100vh content chases itself. */
342
+ pinnedHeightPx?: number;
340
343
  }): {
341
344
  frameWidth: number;
342
345
  frameHeight: number;
@@ -353,10 +356,16 @@ export function getBreakpointFrameGeometry(args: {
353
356
  : undefined;
354
357
  // Until the frame's own content is measured, use the pure aspect projection;
355
358
  // the device-viewport floor only applies once a real height is known.
359
+ const pinned =
360
+ args.pinnedHeightPx && args.pinnedHeightPx > 0
361
+ ? Math.round(args.pinnedHeightPx)
362
+ : undefined;
356
363
  const naturalHeight =
357
- measured !== undefined
358
- ? Math.max(deviceViewportFloorForWidth(args.widthPx), measured)
359
- : Math.round(args.widthPx * Math.max(0.01, args.naturalAspect));
364
+ pinned !== undefined
365
+ ? pinned
366
+ : measured !== undefined
367
+ ? Math.max(deviceViewportFloorForWidth(args.widthPx), measured)
368
+ : Math.round(args.widthPx * Math.max(0.01, args.naturalAspect));
360
369
  const frameWidth = Math.round(args.widthPx * scale);
361
370
  const frameHeight = Math.round(naturalHeight * scale);
362
371
  return { frameWidth, frameHeight, naturalHeight, scale };
@@ -30,6 +30,7 @@ export function sameResolvedMetadata(
30
30
  a.title === b.title &&
31
31
  a.width === b.width &&
32
32
  a.height === b.height &&
33
+ a.heightPinned === b.heightPinned &&
33
34
  a.previewUrl === b.previewUrl
34
35
  );
35
36
  }
@@ -49,6 +50,7 @@ function sameScreenMetadataInput(
49
50
  a.title === b.title &&
50
51
  a.width === b.width &&
51
52
  a.height === b.height &&
53
+ a.heightPinned === b.heightPinned &&
52
54
  a.url === b.url &&
53
55
  a.previewUrl === b.previewUrl &&
54
56
  a.bridgeUrl === b.bridgeUrl &&
@@ -187,6 +189,8 @@ export function resolveScreenMetadata(
187
189
  title: metadata.title,
188
190
  width,
189
191
  height,
192
+ // A height the user dragged. Auto-fit must not grow past it.
193
+ heightPinned: metadata.heightPinned === true,
190
194
  previewUrl,
191
195
  };
192
196
  }
@@ -32,6 +32,8 @@ export interface ScreenFile {
32
32
  updatedAt?: string;
33
33
  width?: number;
34
34
  height?: number;
35
+ /** A height the user dragged; auto-fit must not grow past it. */
36
+ heightPinned?: boolean;
35
37
  url?: string;
36
38
  previewUrl?: string;
37
39
  bridgeUrl?: string;
@@ -105,6 +107,7 @@ export interface ScreenMetadata {
105
107
  title?: string;
106
108
  width?: number;
107
109
  height?: number;
110
+ heightPinned?: boolean;
108
111
  url?: string;
109
112
  previewUrl?: string;
110
113
  bridgeUrl?: string;
@@ -195,6 +198,8 @@ export interface MultiScreenCanvasProps {
195
198
  placement: "before" | "after" | "inside";
196
199
  }) => void;
197
200
  onCreateScreenFrame?: (geometry: FrameGeometry) => void;
201
+ /** Whether the frame tool commits a top-level screen or a plain frame. */
202
+ frameToolDraws?: "screen" | "frame";
198
203
  onDeleteSelection?: (ids: string[]) => boolean | void;
199
204
  /** Return false to keep the arrow key: the host's real selection is an
200
205
  * element inside a screen, and this canvas still lists that screen in
@@ -971,6 +976,8 @@ export interface ResolvedScreenMetadata {
971
976
  title?: string;
972
977
  width: number;
973
978
  height: number;
979
+ /** A height the user dragged; auto-fit must not grow past it. */
980
+ heightPinned?: boolean;
974
981
  previewUrl?: string;
975
982
  }
976
983
 
@@ -11,6 +11,7 @@ import {
11
11
  import {
12
12
  IconApps,
13
13
  IconCheck,
14
+ IconComponents,
14
15
  IconChevronDown,
15
16
  IconPalette,
16
17
  IconPhoto,
@@ -822,7 +823,7 @@ export default function PromptPopover({
822
823
  }}
823
824
  >
824
825
  <SelectTrigger className="h-9 min-w-0 justify-start gap-2 px-2.5 text-xs [&>svg:last-child]:ms-auto">
825
- <IconPalette className="size-4 shrink-0 text-muted-foreground" />
826
+ <IconComponents className="size-4 shrink-0 text-muted-foreground" />
826
827
  <span
827
828
  className="min-w-0 flex-1 truncate text-start"
828
829
  title={
@@ -851,7 +852,7 @@ export default function PromptPopover({
851
852
  </Select>
852
853
  ) : (
853
854
  <div className="flex h-9 min-w-0 items-center gap-2 rounded-md border border-input px-2.5 text-xs text-muted-foreground">
854
- <IconPalette className="size-4 shrink-0" />
855
+ <IconComponents className="size-4 shrink-0" />
855
856
  <span className="truncate">
856
857
  {t("promptDialog.noDesignSystem")}
857
858
  </span>
@@ -8,7 +8,7 @@ import { SidebarFooterActions } from "@agent-native/toolkit/app-shell";
8
8
  import {
9
9
  IconPencil,
10
10
  IconTemplate,
11
- IconPalette,
11
+ IconComponents,
12
12
  IconSettings,
13
13
  IconLayoutSidebarLeftCollapse,
14
14
  IconLayoutSidebarLeftExpand,
@@ -28,7 +28,7 @@ const navItems = [
28
28
  { icon: IconPencil, labelKey: "navigation.designs", href: "/" },
29
29
  { icon: IconTemplate, labelKey: "navigation.templates", href: "/templates" },
30
30
  {
31
- icon: IconPalette,
31
+ icon: IconComponents,
32
32
  labelKey: "navigation.designSystems",
33
33
  href: "/design-systems",
34
34
  },
@@ -308,6 +308,9 @@ function isFocusableChromeTarget(target: EventTarget | null) {
308
308
  if (target === document.body || target === document.documentElement) {
309
309
  return false;
310
310
  }
311
+ // A layer row is a selection surface, not focus chrome — clicking one leaves
312
+ // focus on its button, and Figma traverses siblings from there.
313
+ if (target.closest("[data-layer-row-button]")) return false;
311
314
  return Boolean(
312
315
  target.closest(
313
316
  [
@@ -730,6 +730,7 @@ const enUS = {
730
730
  tools: {
731
731
  move: "Move",
732
732
  frame: "Frame",
733
+ screen: "Screen",
733
734
  rect: "Rectangle",
734
735
  line: "Line",
735
736
  arrow: "Arrow",
@@ -19,7 +19,7 @@ import {
19
19
  IconWorld,
20
20
  IconFileDescription,
21
21
  IconPhoto,
22
- IconPalette,
22
+ IconComponents,
23
23
  IconCheck,
24
24
  IconExternalLink,
25
25
  IconChevronDown,
@@ -714,7 +714,7 @@ export default function DesignSystemSetup() {
714
714
  </Section>
715
715
 
716
716
  <SourceAccordionRow
717
- icon={IconPalette}
717
+ icon={IconComponents}
718
718
  title={t("designSystemSetup.otherSources")}
719
719
  description={t("designSystemSetup.otherSourcesDescription")}
720
720
  expanded={sourcePanel === "other"}
@@ -734,7 +734,7 @@ export default function DesignSystemSetup() {
734
734
  <div className="divide-y divide-border">
735
735
  <SourceAccordionRow
736
736
  className="rounded-none border-0"
737
- icon={IconPalette}
737
+ icon={IconComponents}
738
738
  title={t("designSystemSetup.sections.company.title")}
739
739
  description={t(
740
740
  "designSystemSetup.sections.company.description",
@@ -769,7 +769,7 @@ export default function DesignSystemSetup() {
769
769
  existingSystems.length > 0) && (
770
770
  <SourceAccordionRow
771
771
  className="rounded-none border-0"
772
- icon={IconPalette}
772
+ icon={IconComponents}
773
773
  title={t(
774
774
  "designSystemSetup.sections.importExisting.title",
775
775
  )}
@@ -1134,7 +1134,7 @@ export default function DesignSystemSetup() {
1134
1134
  }`}
1135
1135
  >
1136
1136
  <div className="flex items-center gap-2">
1137
- <IconPalette className="w-3.5 h-3.5 text-muted-foreground" />
1137
+ <IconComponents className="w-3.5 h-3.5 text-muted-foreground" />
1138
1138
  <span className="text-sm text-foreground/70 truncate">
1139
1139
  {ds.title}
1140
1140
  </span>
@@ -12,6 +12,7 @@ import { VisibilityBadge } from "@agent-native/toolkit/sharing";
12
12
  import {
13
13
  IconCheckbox,
14
14
  IconChecks,
15
+ IconComponents,
15
16
  IconDots,
16
17
  IconPlus,
17
18
  IconPalette,
@@ -587,7 +588,7 @@ export default function DesignSystems() {
587
588
  {!primaryColor &&
588
589
  !secondaryColor &&
589
590
  !accentColor && (
590
- <IconPalette className="w-8 h-8 text-muted-foreground/40" />
591
+ <IconComponents className="w-8 h-8 text-muted-foreground/40" />
591
592
  )}
592
593
  </div>
593
594
  <div className="p-4 pb-3">
@@ -1229,7 +1230,7 @@ function EmptyState() {
1229
1230
  return (
1230
1231
  <div className="flex flex-col items-center justify-center py-10 sm:py-14 text-center">
1231
1232
  <div className="w-16 h-16 rounded-2xl bg-gradient-to-br from-[#609FF8]/20 to-[#4080E0]/20 border border-[#609FF8]/20 flex items-center justify-center mb-6">
1232
- <IconPalette className="w-7 h-7 text-[#609FF8]" />
1233
+ <IconComponents className="w-7 h-7 text-primary" />
1233
1234
  </div>
1234
1235
  <h2 className="text-xl font-semibold text-foreground mb-2">
1235
1236
  {t("designSystems.empty.title")}
@@ -11,7 +11,10 @@ import {
11
11
  CANVAS_TEXT_DEFAULT_FONT_FAMILY,
12
12
  defaultCanvasTextColor,
13
13
  } from "./canvas-primitives";
14
- import { BOARD_TEXT_AUTO_COLOR_MARKER } from "./cross-screen-text-color";
14
+ import {
15
+ BOARD_TEXT_AUTO_COLOR_MARKER,
16
+ destinationBackgroundIsLightForNode,
17
+ } from "./cross-screen-text-color";
15
18
  import { escapeHtmlAttributeValue, escapeHtmlText } from "./dom-utils";
16
19
  import { isStandaloneHttpUrl } from "./editor-state";
17
20
  import type { DesignFile } from "./types";
@@ -183,6 +186,81 @@ export function polygonPointsForHtmlShape(
183
186
  * adaptAutoTextColorForCrossScreenNode. Any explicit user color edit must
184
187
  * remove this attribute so the text is never "helpfully" overridden again.
185
188
  */
189
+
190
+ /** Inline absolute rect, or null when the element is not absolutely placed. */
191
+ function absoluteRect(
192
+ element: Element,
193
+ ): { x: number; y: number; w: number; h: number } | null {
194
+ const style = (element as HTMLElement).style;
195
+ if (style.position !== "absolute") return null;
196
+ const read = (value: string) => {
197
+ const parsed = Number.parseFloat(value);
198
+ return Number.isFinite(parsed) ? parsed : null;
199
+ };
200
+ const x = read(style.left);
201
+ const y = read(style.top);
202
+ const w = read(style.width);
203
+ const h = read(style.height);
204
+ if (x === null || y === null || w === null || h === null) return null;
205
+ // Inline left/top are relative to the nearest positioned ancestor, so a
206
+ // nested frame must add its own offsets or it matches the wrong origin.
207
+ let originX = 0;
208
+ let originY = 0;
209
+ for (
210
+ let ancestor = element.parentElement;
211
+ ancestor && ancestor.tagName.toLowerCase() !== "body";
212
+ ancestor = ancestor.parentElement
213
+ ) {
214
+ const position = ancestor.style.position;
215
+ if (
216
+ position !== "absolute" &&
217
+ position !== "relative" &&
218
+ position !== "fixed"
219
+ ) {
220
+ continue;
221
+ }
222
+ originX += read(ancestor.style.left) ?? 0;
223
+ originY += read(ancestor.style.top) ?? 0;
224
+ }
225
+ return { x: originX + x, y: originY + y, w, h };
226
+ }
227
+
228
+ /**
229
+ * Figma's frame is the container primitive and a rectangle is not, so only
230
+ * `data-an-primitive="frame"` adopts. Bounds come from inline geometry
231
+ * because this document is parsed, never laid out.
232
+ */
233
+ function deepestFrameContaining(
234
+ root: Element,
235
+ x: number,
236
+ y: number,
237
+ w: number,
238
+ h: number,
239
+ ): { element: Element; x: number; y: number } | null {
240
+ const contained = Array.from(
241
+ root.querySelectorAll('[data-an-primitive="frame"]'),
242
+ )
243
+ .map((element) => ({ element, rect: absoluteRect(element) }))
244
+ .filter(
245
+ (
246
+ candidate,
247
+ ): candidate is {
248
+ element: Element;
249
+ rect: { x: number; y: number; w: number; h: number };
250
+ } =>
251
+ candidate.rect !== null &&
252
+ x >= candidate.rect.x &&
253
+ y >= candidate.rect.y &&
254
+ x + w <= candidate.rect.x + candidate.rect.w &&
255
+ y + h <= candidate.rect.y + candidate.rect.h,
256
+ )
257
+ .sort((a, b) => a.rect.w * a.rect.h - b.rect.w * b.rect.h);
258
+ const best = contained[0];
259
+ return best
260
+ ? { element: best.element, x: best.rect.x, y: best.rect.y }
261
+ : null;
262
+ }
263
+
186
264
  export function appendCanvasPrimitiveToHtml(
187
265
  content: string,
188
266
  primitive: CanvasPrimitiveInsert,
@@ -208,6 +286,10 @@ export function appendCanvasPrimitiveToHtml(
208
286
  const height = Math.max(1, Math.round(geometry.height));
209
287
  const nodeId = primitive.nodeId ?? uniqueLayerId(primitive.kind);
210
288
  const layerName = primitiveLayerName(primitive);
289
+ // Resolved once so every primitive kind nests identically, and so text can
290
+ // pick a fill that is legible against its actual container.
291
+ const host = deepestFrameContaining(doc.body, left, top, width, height);
292
+ const hostOrBody: Element = host?.element ?? doc.body;
211
293
 
212
294
  if (
213
295
  primitive.kind === "path" ||
@@ -327,7 +409,7 @@ export function appendCanvasPrimitiveToHtml(
327
409
  .join(";"),
328
410
  );
329
411
  svg.appendChild(path);
330
- doc.body.appendChild(svg);
412
+ hostOrBody.appendChild(svg);
331
413
  return `<!DOCTYPE html>\n${doc.documentElement.outerHTML}`;
332
414
  }
333
415
 
@@ -370,7 +452,7 @@ export function appendCanvasPrimitiveToHtml(
370
452
  .join(";"),
371
453
  );
372
454
  svg.appendChild(polygon);
373
- doc.body.appendChild(svg);
455
+ hostOrBody.appendChild(svg);
374
456
  return `<!DOCTYPE html>\n${doc.documentElement.outerHTML}`;
375
457
  }
376
458
 
@@ -428,16 +510,17 @@ export function appendCanvasPrimitiveToHtml(
428
510
  // not centered — match that instead of centering the text block.
429
511
  element.style.alignItems = "flex-start";
430
512
  }
431
- // Board (dark infinite-canvas) text needs an explicit default fill —
432
- // "currentColor" inherits the unstyled document's black body text,
433
- // invisible on the dark canvas background. The board surface is
434
- // always dark regardless of the editor chrome theme, so this keys off
435
- // the target surface only (see defaultCanvasTextColor). Screens keep
436
- // "currentColor" so text dropped into an existing (often light)
437
- // screen still inherits its surrounding styles/theme as before.
513
+ // "currentColor" inherits the unstyled document's black body text, so
514
+ // it is invisible on any dark surface — the always-dark board, and
515
+ // equally a screen whose own background is dark. Light screens keep
516
+ // "currentColor" so text still inherits their theme.
517
+ // Measure the frame the text actually lands in: a dark frame on a light
518
+ // page would otherwise keep currentColor and render invisible.
519
+ const autoTextNeedsLightFill =
520
+ options?.isBoardTarget === true ||
521
+ !destinationBackgroundIsLightForNode(hostOrBody);
438
522
  const resolvedTextColor =
439
- primitive.fill ??
440
- defaultCanvasTextColor(options?.isBoardTarget === true);
523
+ primitive.fill ?? defaultCanvasTextColor(autoTextNeedsLightFill);
441
524
  element.style.color = resolvedTextColor;
442
525
  // Stamp the auto-color marker whenever the color came from the
443
526
  // default (no explicit primitive.fill) rather than a user-chosen
@@ -477,7 +560,11 @@ export function appendCanvasPrimitiveToHtml(
477
560
  element.style.borderRadius = canonical.borderRadius;
478
561
  }
479
562
 
480
- doc.body.appendChild(element);
563
+ if (host) {
564
+ element.style.left = `${left - host.x}px`;
565
+ element.style.top = `${top - host.y}px`;
566
+ }
567
+ hostOrBody.appendChild(element);
481
568
  return `<!DOCTYPE html>\n${doc.documentElement.outerHTML}`;
482
569
  } catch {
483
570
  return null;
@@ -209,7 +209,7 @@ function collectDestinationBackgroundSignals(
209
209
  * dark-class-hint chain when no live document is available (e.g. the
210
210
  * destination screen isn't currently mounted).
211
211
  */
212
- function destinationBackgroundIsLightForNode(
212
+ export function destinationBackgroundIsLightForNode(
213
213
  element: Element,
214
214
  liveDoc?: Document | null,
215
215
  ): boolean {
@@ -114,6 +114,8 @@ export function buildFrameGeometryDataOperations(args: {
114
114
  nextGeometry: CanvasFrameGeometryById;
115
115
  designData: Record<string, unknown>;
116
116
  syncViewportFrameIds?: readonly string[];
117
+ /** Frames whose height the user just dragged. */
118
+ pinHeightFrameIds?: readonly string[];
117
119
  }): DesignDataOperation[] {
118
120
  const operations: DesignDataOperation[] = [];
119
121
  const frameIds = new Set([
@@ -156,6 +158,18 @@ export function buildFrameGeometryDataOperations(args: {
156
158
  value: viewport.height,
157
159
  });
158
160
  }
161
+ // A resize is a deliberate height. Without this the content-fit pass in
162
+ // MultiScreenCanvas grows the frame straight back past the drag.
163
+ if (
164
+ args.pinHeightFrameIds?.includes(frameId) &&
165
+ !metadataEntry.heightPinned
166
+ ) {
167
+ operations.push({
168
+ op: "set",
169
+ path: ["screenMetadata", frameId, "heightPinned"],
170
+ value: true,
171
+ });
172
+ }
159
173
 
160
174
  const localhostEntry = recordValue(localhostScreens, frameId);
161
175
  if (Object.keys(localhostEntry).length === 0) continue;
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-08-10
4
+ ---
5
+
6
+ Marquee-selecting layers far down a tall screen now selects the layers you dragged over
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-08-10
4
+ ---
5
+
6
+ The frame tool draws a plain frame by default, with Screen available in its dropdown
@@ -173,42 +173,37 @@ export default async function globalSetup(config: FullConfig) {
173
173
  BROWSER_CHANNEL ? { channel: BROWSER_CHANNEL } : {},
174
174
  );
175
175
  const context = await browser.newContext();
176
- const page = await context.newPage();
177
176
 
178
177
  try {
179
- await page.goto(`${baseURL}/sign-in`, {
180
- waitUntil: "domcontentloaded",
181
- });
182
-
183
- const isSignIn = async () => /sign in/i.test(await page.title());
184
-
185
- if (await isSignIn()) {
186
- // Try to create the account; if it already exists, fall back to sign in.
187
- await page.locator("#s-email").fill(E2E_EMAIL);
188
- await page.locator("#s-pass").fill(E2E_PASSWORD);
189
- await page.locator("#s-pass2").fill(E2E_PASSWORD);
190
- await page.locator("#signup-form button[type='submit']").click();
191
- await page.waitForTimeout(2500);
192
-
193
- if (await isSignIn()) {
194
- // Account exists; switch to the Sign in tab and log in.
195
- await page
196
- .getByRole("button", { name: "Sign in", exact: true })
197
- .first()
198
- .click()
199
- .catch(() => {});
200
- await page.locator("#l-email").fill(E2E_EMAIL);
201
- await page.locator("#l-pass").fill(E2E_PASSWORD);
202
- await page.locator("#login-form button[type='submit']").click();
203
- await page.waitForTimeout(2500);
204
- }
178
+ const registration = await context.request.post(
179
+ `${baseURL}/_agent-native/auth/register`,
180
+ {
181
+ data: {
182
+ email: E2E_EMAIL,
183
+ password: E2E_PASSWORD,
184
+ },
185
+ headers: { "Content-Type": "application/json" },
186
+ },
187
+ );
188
+ if (!registration.ok() && registration.status() !== 409) {
189
+ throw new Error(
190
+ `registration failed: ${registration.status()} ${await registration.text()}`,
191
+ );
205
192
  }
206
193
 
207
- await page
208
- .waitForFunction(() => !/sign in/i.test(document.title), null, {
209
- timeout: 20_000,
210
- })
211
- .catch(() => {});
194
+ const login = await context.request.post(
195
+ `${baseURL}/_agent-native/auth/login`,
196
+ {
197
+ data: {
198
+ email: E2E_EMAIL,
199
+ password: E2E_PASSWORD,
200
+ },
201
+ headers: { "Content-Type": "application/json" },
202
+ },
203
+ );
204
+ if (!login.ok()) {
205
+ throw new Error(`login failed: ${login.status()} ${await login.text()}`);
206
+ }
212
207
 
213
208
  await context.storageState({ path: STATE_PATH });
214
209
 
@@ -18,11 +18,9 @@ const BASE_URL = process.env.E2E_BASE_URL ?? `http://127.0.0.1:${PORT}`;
18
18
  const AUTH_DIR = process.env.E2E_AUTH_DIR
19
19
  ? path.resolve(process.env.E2E_AUTH_DIR)
20
20
  : path.join(import.meta.dirname, "e2e", ".auth");
21
- const E2E_DATABASE_URL = `file:${path.join(
22
- import.meta.dirname,
23
- "data",
24
- "e2e.db",
25
- )}`;
21
+ const E2E_DATABASE_URL =
22
+ process.env.E2E_DATABASE_URL ??
23
+ `file:${path.join(import.meta.dirname, "data", "e2e.db")}`;
26
24
  const BROWSER_CHANNEL = process.env.E2E_BROWSER_CHANNEL;
27
25
 
28
26
  export default defineConfig({