@agent-native/core 0.176.1 → 0.176.2-nightly-20260831185956

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 (1037) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +4 -0
  3. package/corpus/templates/analytics/.agents/skills/secrets/SKILL.md +47 -0
  4. package/corpus/templates/analytics/AGENTS.md +13 -2
  5. package/corpus/templates/analytics/CHANGELOG.md +8 -0
  6. package/corpus/templates/analytics/actions/certify-dashboard.ts +39 -0
  7. package/corpus/templates/analytics/actions/get-sql-dashboard.ts +1 -1
  8. package/corpus/templates/analytics/actions/list-analysis-revisions.ts +4 -2
  9. package/corpus/templates/analytics/actions/list-dashboard-revisions.ts +4 -2
  10. package/corpus/templates/analytics/actions/search-analytics-query-catalog.ts +1 -0
  11. package/corpus/templates/analytics/actions/search-dashboard-references.ts +2 -1
  12. package/corpus/templates/analytics/actions/set-workspace-feature-flag.ts +2 -2
  13. package/corpus/templates/analytics/app/components/agents/FeatureFlagsFleetPanel.tsx +16 -1
  14. package/corpus/templates/analytics/app/components/layout/Layout.tsx +58 -0
  15. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +7 -19
  16. package/corpus/templates/analytics/app/global.css +0 -7
  17. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +1 -1
  18. package/corpus/templates/analytics/app/i18n-data.ts +42 -0
  19. package/corpus/templates/analytics/app/lib/track-metric.ts +15 -0
  20. package/corpus/templates/analytics/app/pages/NotFound.tsx +1 -1
  21. package/corpus/templates/analytics/app/pages/Placeholder.tsx +1 -1
  22. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +115 -2
  23. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +8 -0
  24. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +23 -25
  25. package/corpus/templates/analytics/app/root.tsx +5 -5
  26. package/corpus/templates/analytics/app/routes/_index.tsx +18 -20
  27. package/corpus/templates/analytics/app/routes/dashboard.tsx +1 -1
  28. package/corpus/templates/analytics/app/routes/home.tsx +39 -0
  29. package/corpus/templates/analytics/changelog/2026-08-27-show-analytics-s-own-registered-flags-in-fleet-feature-flag-.md +6 -0
  30. package/corpus/templates/analytics/changelog/2026-08-28-analytics-loading-placeholders-now-use-a-smooth-whole-surfac.md +6 -0
  31. package/corpus/templates/analytics/changelog/2026-08-28-analytics-loading-states-use-a-softer-whole-surfac.md +6 -0
  32. package/corpus/templates/analytics/changelog/2026-08-28-analytics-sidebar-horizontal-spacing-is-tighter.md +6 -0
  33. package/corpus/templates/analytics/changelog/2026-08-28-sidebar-branding-matches-the-app-text-color-with-a-tighter-m.md +6 -0
  34. package/corpus/templates/analytics/changelog/2026-08-28-sidebar-branding-uses-a-monochrome-agent-native-mark.md +6 -0
  35. package/corpus/templates/analytics/changelog/2026-08-29-analytics-loading-shine-is-more-subtle.md +6 -0
  36. package/corpus/templates/analytics/changelog/2026-08-29-chat-edits-can-be-reverted-to-saved-checkpoints.md +6 -0
  37. package/corpus/templates/analytics/changelog/2026-08-29-dashboard-certification-lives-in-the-overflow-menu.md +6 -0
  38. package/corpus/templates/analytics/changelog/2026-08-29-public-marketing-home.md +6 -0
  39. package/corpus/templates/analytics/package.json +2 -0
  40. package/corpus/templates/analytics/public/manifest.json +1 -1
  41. package/corpus/templates/analytics/server/db/schema.ts +4 -0
  42. package/corpus/templates/analytics/server/handlers/events.ts +10 -1
  43. package/corpus/templates/analytics/server/handlers/first-party-analytics.ts +9 -1
  44. package/corpus/templates/analytics/server/handlers/session-replay.ts +10 -1
  45. package/corpus/templates/analytics/server/lib/agent-readable-resource-context.ts +22 -2
  46. package/corpus/templates/analytics/server/lib/analytics-query-catalog.ts +82 -7
  47. package/corpus/templates/analytics/server/lib/dashboard-certification.ts +58 -0
  48. package/corpus/templates/analytics/server/lib/dashboard-report.ts +1 -0
  49. package/corpus/templates/analytics/server/lib/dashboards-store.ts +429 -46
  50. package/corpus/templates/analytics/server/lib/workspace-feature-flags.ts +204 -32
  51. package/corpus/templates/analytics/server/plugins/agent-chat.ts +139 -0
  52. package/corpus/templates/analytics/server/plugins/auth.ts +1 -0
  53. package/corpus/templates/analytics/server/plugins/core-routes.ts +3 -2
  54. package/corpus/templates/analytics/server/plugins/db.ts +11 -0
  55. package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +4 -0
  56. package/corpus/templates/assets/.agents/skills/secrets/SKILL.md +47 -0
  57. package/corpus/templates/assets/app/components/layout/Header.tsx +2 -2
  58. package/corpus/templates/assets/app/components/layout/Layout.tsx +4 -3
  59. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +14 -27
  60. package/corpus/templates/assets/app/hooks/use-navigation-state.ts +2 -2
  61. package/corpus/templates/assets/app/root.tsx +29 -9
  62. package/corpus/templates/assets/app/routes/_index.tsx +15 -116
  63. package/corpus/templates/assets/app/routes/chat.$threadId.tsx +1 -1
  64. package/corpus/templates/assets/app/routes/home.tsx +137 -0
  65. package/corpus/templates/assets/app/routes/library.tsx +5 -1
  66. package/corpus/templates/assets/app/routes/settings.tsx +28 -25
  67. package/corpus/templates/assets/changelog/2026-08-26-templates-across-brand-kits.md +1 -0
  68. package/corpus/templates/assets/public/manifest.json +1 -1
  69. package/corpus/templates/assets/server/plugins/auth.ts +1 -0
  70. package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +4 -0
  71. package/corpus/templates/brain/.agents/skills/secrets/SKILL.md +47 -0
  72. package/corpus/templates/brain/app/components/layout/Layout.tsx +3 -3
  73. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +10 -23
  74. package/corpus/templates/brain/app/lib/brain.ts +2 -2
  75. package/corpus/templates/brain/app/root.tsx +13 -3
  76. package/corpus/templates/brain/app/routes/_index.tsx +15 -55
  77. package/corpus/templates/brain/app/routes/home.tsx +76 -0
  78. package/corpus/templates/brain/app/routes.ts +1 -0
  79. package/corpus/templates/brain/public/manifest.json +1 -1
  80. package/corpus/templates/brain/server/lib/brain-health.ts +2 -2
  81. package/corpus/templates/brain/server/plugins/auth.ts +1 -1
  82. package/corpus/templates/brain/server/plugins/core-routes.ts +2 -1
  83. package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +4 -0
  84. package/corpus/templates/calendar/.agents/skills/secrets/SKILL.md +47 -0
  85. package/corpus/templates/calendar/CHANGELOG.md +12 -0
  86. package/corpus/templates/calendar/actions/event-action-helpers.ts +2 -1
  87. package/corpus/templates/calendar/actions/manage-event-draft.ts +1 -1
  88. package/corpus/templates/calendar/actions/update-event.ts +8 -1
  89. package/corpus/templates/calendar/amplify.yml +15 -0
  90. package/corpus/templates/calendar/app/components/calendar/ApolloPanel.tsx +2 -2
  91. package/corpus/templates/calendar/app/components/calendar/CreateEventDialog.tsx +102 -109
  92. package/corpus/templates/calendar/app/components/calendar/DayView.tsx +23 -10
  93. package/corpus/templates/calendar/app/components/calendar/DeleteEventDialog.tsx +2 -11
  94. package/corpus/templates/calendar/app/components/calendar/EventAttendeesSection.tsx +150 -141
  95. package/corpus/templates/calendar/app/components/calendar/EventCard.tsx +3 -1
  96. package/corpus/templates/calendar/app/components/calendar/EventDescription.tsx +2 -2
  97. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +359 -222
  98. package/corpus/templates/calendar/app/components/calendar/InlineEventPickers.tsx +13 -5
  99. package/corpus/templates/calendar/app/components/calendar/WeekView.tsx +21 -9
  100. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +21 -32
  101. package/corpus/templates/calendar/app/global.css +11 -0
  102. package/corpus/templates/calendar/app/hooks/use-meeting-start-notifications.ts +10 -0
  103. package/corpus/templates/calendar/app/hooks/use-navigation-state.ts +3 -3
  104. package/corpus/templates/calendar/app/i18n-data.ts +110 -0
  105. package/corpus/templates/calendar/app/lib/calendar-timezone.ts +12 -3
  106. package/corpus/templates/calendar/app/lib/event-popover-style.ts +43 -0
  107. package/corpus/templates/calendar/app/lib/mcp-embed.ts +8 -2
  108. package/corpus/templates/calendar/app/lib/utils.ts +3 -1
  109. package/corpus/templates/calendar/app/pages/BookingPage.tsx +2 -8
  110. package/corpus/templates/calendar/app/pages/CalendarView.tsx +9 -11
  111. package/corpus/templates/calendar/app/pages/ManageBookingPage.tsx +2 -6
  112. package/corpus/templates/calendar/app/pages/NotFound.tsx +1 -1
  113. package/corpus/templates/calendar/app/pages/Settings.tsx +54 -0
  114. package/corpus/templates/calendar/app/root.tsx +9 -1
  115. package/corpus/templates/calendar/app/routes/{_app._index.tsx → _app.home.tsx} +1 -1
  116. package/corpus/templates/calendar/app/routes/_index.tsx +34 -0
  117. package/corpus/templates/calendar/app/routes/event.tsx +2 -6
  118. package/corpus/templates/calendar/changelog/2026-08-28-all-day-events-stay-in-the-compact-top-bar-in-day-and-week-v.md +6 -0
  119. package/corpus/templates/calendar/changelog/2026-08-28-calendar-organizer-note-emails-now-link-back-to-agent-native.md +6 -0
  120. package/corpus/templates/calendar/changelog/2026-08-28-calendar-shows-google-profile-photos-in-the-desktop-app.md +6 -0
  121. package/corpus/templates/calendar/changelog/2026-08-28-event-creators-can-choose-whether-a-meeting-shows-as-free-or.md +6 -0
  122. package/corpus/templates/calendar/changelog/2026-08-28-event-popovers-match-notion-calendar-s-density-a-284px-blurr.md +6 -0
  123. package/corpus/templates/calendar/changelog/2026-08-28-fixed-calendar-navigation-scheduling-permissions-and-action-.md +6 -0
  124. package/corpus/templates/calendar/changelog/2026-08-28-google-calendar-connections-use-the-registered-callback-on-m.md +6 -0
  125. package/corpus/templates/calendar/changelog/2026-08-28-sidebar-branding-matches-the-app-text-color-with-a-tighter-m.md +6 -0
  126. package/corpus/templates/calendar/changelog/2026-08-28-sidebar-branding-uses-a-monochrome-agent-native-mark.md +6 -0
  127. package/corpus/templates/calendar/changelog/2026-08-28-the-calendar-sidebar-keeps-the-settings-link-compact.md +6 -0
  128. package/corpus/templates/calendar/changelog/2026-08-28-the-calendar-sidebar-keeps-the-workspace-picker-compact.md +6 -0
  129. package/corpus/templates/calendar/changelog/2026-08-29-public-marketing-home.md +6 -0
  130. package/corpus/templates/calendar/public/manifest.json +1 -1
  131. package/corpus/templates/calendar/server/handlers/google-auth.ts +10 -2
  132. package/corpus/templates/calendar/server/lib/emails.ts +2 -1
  133. package/corpus/templates/calendar/server/lib/event-guest-notifications.ts +31 -5
  134. package/corpus/templates/calendar/server/lib/google-calendar.ts +4 -2
  135. package/corpus/templates/calendar/server/plugins/auth.ts +1 -0
  136. package/corpus/templates/calendar/server/plugins/core-routes.ts +5 -3
  137. package/corpus/templates/calendar/shared/event-permissions.ts +12 -0
  138. package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +4 -0
  139. package/corpus/templates/chat/.agents/skills/secrets/SKILL.md +47 -0
  140. package/corpus/templates/chat/AGENTS.md +5 -4
  141. package/corpus/templates/chat/app/components/layout/Header.tsx +1 -1
  142. package/corpus/templates/chat/app/components/layout/Layout.tsx +5 -4
  143. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +16 -25
  144. package/corpus/templates/chat/app/hooks/use-navigation-state.ts +5 -5
  145. package/corpus/templates/chat/app/root.tsx +16 -3
  146. package/corpus/templates/chat/app/routes/_index.tsx +17 -74
  147. package/corpus/templates/chat/app/routes/chat.$threadId.tsx +1 -1
  148. package/corpus/templates/chat/app/routes/home.tsx +94 -0
  149. package/corpus/templates/chat/netlify.toml +2 -1
  150. package/corpus/templates/chat/public/manifest.json +1 -1
  151. package/corpus/templates/chat/server/plugins/auth.ts +1 -0
  152. package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +4 -0
  153. package/corpus/templates/clips/.agents/skills/secrets/SKILL.md +47 -0
  154. package/corpus/templates/clips/actions/add-comment.ts +18 -1
  155. package/corpus/templates/clips/actions/get-recording-player-data.ts +2 -0
  156. package/corpus/templates/clips/actions/list-comments.ts +2 -0
  157. package/corpus/templates/clips/actions/list-notifications.ts +60 -28
  158. package/corpus/templates/clips/actions/list-recording-mention-members.ts +64 -0
  159. package/corpus/templates/clips/actions/list-recordings.ts +1 -1
  160. package/corpus/templates/clips/actions/reply-to-comment.ts +17 -1
  161. package/corpus/templates/clips/actions/update-comment.ts +36 -2
  162. package/corpus/templates/clips/app/components/library/empty-state.tsx +1 -3
  163. package/corpus/templates/clips/app/components/library/library-grid.tsx +18 -6
  164. package/corpus/templates/clips/app/components/library/library-layout.tsx +6 -58
  165. package/corpus/templates/clips/app/components/library/recording-card.tsx +101 -3
  166. package/corpus/templates/clips/app/components/library/sort-menu.tsx +2 -2
  167. package/corpus/templates/clips/app/components/player/comment-composer.tsx +284 -0
  168. package/corpus/templates/clips/app/components/player/comments-panel.tsx +162 -46
  169. package/corpus/templates/clips/app/components/player/transcript-panel.tsx +38 -133
  170. package/corpus/templates/clips/app/components/player/video-player.tsx +1 -1
  171. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +99 -20
  172. package/corpus/templates/clips/app/components/recorder/recording-toolbar.tsx +110 -116
  173. package/corpus/templates/clips/app/components/recorder/storage-setup-card.tsx +83 -60
  174. package/corpus/templates/clips/app/components/settings/ai-setup-section.tsx +17 -11
  175. package/corpus/templates/clips/app/components/settings/types.ts +5 -1
  176. package/corpus/templates/clips/app/components/settings/video-storage-section.tsx +21 -12
  177. package/corpus/templates/clips/app/global.css +0 -27
  178. package/corpus/templates/clips/app/hooks/use-desktop-promo.ts +3 -17
  179. package/corpus/templates/clips/app/hooks/use-mention-members.ts +24 -0
  180. package/corpus/templates/clips/app/hooks/use-navigation-state.ts +2 -2
  181. package/corpus/templates/clips/app/i18n/en-US.ts +15 -0
  182. package/corpus/templates/clips/app/lib/recording-backup.ts +245 -0
  183. package/corpus/templates/clips/app/lib/recording-retry.ts +189 -0
  184. package/corpus/templates/clips/app/lib/recording-status.ts +32 -0
  185. package/corpus/templates/clips/app/root.tsx +11 -2
  186. package/corpus/templates/clips/app/routes/_app.home.tsx +62 -0
  187. package/corpus/templates/clips/app/routes/_app.notifications.tsx +45 -12
  188. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +2 -0
  189. package/corpus/templates/clips/app/routes/_index.tsx +11 -40
  190. package/corpus/templates/clips/app/routes/download.tsx +148 -15
  191. package/corpus/templates/clips/app/routes/embed.$shareId.tsx +4 -3
  192. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +6 -11
  193. package/corpus/templates/clips/app/routes/record.tsx +72 -13
  194. package/corpus/templates/clips/app/routes/share.$shareId.tsx +40 -24
  195. package/corpus/templates/clips/app/routes/share.meeting.$meetingId.tsx +2 -7
  196. package/corpus/templates/clips/changelog/2026-08-28-chrome-extension-download-help.md +6 -0
  197. package/corpus/templates/clips/changelog/2026-08-28-clips-loading-skeletons-use-a-softer-whole-surface.md +6 -0
  198. package/corpus/templates/clips/changelog/2026-08-28-comment-composer-no-longer-has-an-outer-border.md +6 -0
  199. package/corpus/templates/clips/changelog/2026-08-29-clips-loading-shine-is-more-subtle.md +6 -0
  200. package/corpus/templates/clips/desktop/src/app.tsx +377 -476
  201. package/corpus/templates/clips/desktop/src/components/ui/skeleton.tsx +1 -1
  202. package/corpus/templates/clips/desktop/src/components/ui/spinner.tsx +1 -17
  203. package/corpus/templates/clips/desktop/src/lib/recorder.ts +4 -0
  204. package/corpus/templates/clips/desktop/src/overlays/countdown.tsx +0 -8
  205. package/corpus/templates/clips/desktop/src/overlays/record-pill.tsx +221 -460
  206. package/corpus/templates/clips/desktop/src/styles.css +0 -40
  207. package/corpus/templates/clips/desktop/src/tailwind.css +28 -14
  208. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +15 -11
  209. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +9 -0
  210. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +192 -57
  211. package/corpus/templates/clips/desktop/src-tauri/src/recording_indicator.rs +9 -3
  212. package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +12 -0
  213. package/corpus/templates/clips/desktop/src-tauri/src/util.rs +97 -3
  214. package/corpus/templates/clips/public/manifest.json +1 -1
  215. package/corpus/templates/clips/server/db/schema.ts +1 -0
  216. package/corpus/templates/clips/server/lib/activity-notifications.ts +30 -5
  217. package/corpus/templates/clips/server/lib/comment-mentions.ts +23 -0
  218. package/corpus/templates/clips/server/lib/emails.ts +2 -2
  219. package/corpus/templates/clips/server/lib/recording-page-access.ts +16 -0
  220. package/corpus/templates/clips/server/lib/transactional-email-templates.ts +14 -7
  221. package/corpus/templates/clips/server/plugins/auth.ts +1 -0
  222. package/corpus/templates/clips/server/plugins/core-routes.ts +5 -0
  223. package/corpus/templates/clips/server/plugins/db.ts +5 -0
  224. package/corpus/templates/clips/server/routes/api/auth/google-calendar.get.ts +4 -2
  225. package/corpus/templates/clips/server/routes/api/clips-latest.json.get.ts +77 -22
  226. package/corpus/templates/clips/server/routes/api/public-recording.get.ts +11 -0
  227. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/interrupt.post.ts +4 -4
  228. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/resume.get.ts +1 -1
  229. package/corpus/templates/clips/shared/comment-mentions.ts +71 -0
  230. package/corpus/templates/clips/shared/prerendered-public-paths.ts +1 -1
  231. package/corpus/templates/clips/shared/recording-core.ts +5 -0
  232. package/corpus/templates/clips/shared/recording-playhead.css +207 -0
  233. package/corpus/templates/clips/shared/recording-playhead.tsx +616 -0
  234. package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +4 -0
  235. package/corpus/templates/content/.agents/skills/secrets/SKILL.md +47 -0
  236. package/corpus/templates/content/CHANGELOG.md +6 -0
  237. package/corpus/templates/content/actions/_property-utils.ts +45 -9
  238. package/corpus/templates/content/actions/edit-document.ts +17 -0
  239. package/corpus/templates/content/actions/get-document.ts +31 -11
  240. package/corpus/templates/content/actions/list-document-properties.ts +30 -2
  241. package/corpus/templates/content/actions/list-document-versions.ts +49 -17
  242. package/corpus/templates/content/actions/list-documents.ts +13 -2
  243. package/corpus/templates/content/actions/restore-document-version.ts +8 -1
  244. package/corpus/templates/content/actions/update-document.ts +8 -0
  245. package/corpus/templates/content/app/components/QueryErrorState.tsx +1 -0
  246. package/corpus/templates/content/app/components/editor/DocumentBlockFields.tsx +28 -8
  247. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +94 -61
  248. package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +24 -10
  249. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +16 -13
  250. package/corpus/templates/content/app/components/editor/database/settings.tsx +16 -13
  251. package/corpus/templates/content/app/components/layout/Layout.tsx +35 -1
  252. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +5 -18
  253. package/corpus/templates/content/app/hooks/use-document-properties.ts +5 -3
  254. package/corpus/templates/content/app/hooks/use-documents.ts +3 -1
  255. package/corpus/templates/content/app/hooks/use-navigation-state.ts +3 -3
  256. package/corpus/templates/content/app/root.tsx +9 -4
  257. package/corpus/templates/content/app/routes/{_app._index.tsx → _app.home.tsx} +12 -4
  258. package/corpus/templates/content/app/routes/_index.tsx +33 -0
  259. package/corpus/templates/content/changelog/2026-08-26-shared-page-load-failures-now-stay-visible-and-safe.md +6 -0
  260. package/corpus/templates/content/docs/product/capabilities/content.workspace.session-restore.md +2 -2
  261. package/corpus/templates/content/e2e/playwright.config.ts +1 -1
  262. package/corpus/templates/content/package.json +2 -0
  263. package/corpus/templates/content/parity/matrix.md +1 -1
  264. package/corpus/templates/content/parity/matrix.ts +1 -1
  265. package/corpus/templates/content/public/manifest.json +1 -1
  266. package/corpus/templates/content/server/db/schema.ts +1 -0
  267. package/corpus/templates/content/server/lib/document-version-context.ts +67 -0
  268. package/corpus/templates/content/server/plugins/agent-chat.ts +155 -0
  269. package/corpus/templates/content/server/plugins/auth.ts +1 -0
  270. package/corpus/templates/content/server/plugins/core-routes.ts +3 -2
  271. package/corpus/templates/content/server/plugins/db.ts +5 -0
  272. package/corpus/templates/content/shared/api.ts +6 -4
  273. package/corpus/templates/crm/.agents/skills/frontend-design/SKILL.md +4 -0
  274. package/corpus/templates/crm/.agents/skills/secrets/SKILL.md +47 -0
  275. package/corpus/templates/crm/actions/list-crm-dashboard-revisions.ts +1 -1
  276. package/corpus/templates/crm/agent-native.app-skill.json +1 -1
  277. package/corpus/templates/crm/app/components/layout/CrmCommandMenu.tsx +1 -1
  278. package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +36 -1
  279. package/corpus/templates/crm/app/components/layout/CrmSidebar.tsx +3 -3
  280. package/corpus/templates/crm/app/root.tsx +28 -7
  281. package/corpus/templates/crm/app/routes/_index.tsx +28 -18
  282. package/corpus/templates/crm/app/routes/home.tsx +27 -0
  283. package/corpus/templates/crm/app/routes/setup.tsx +2 -2
  284. package/corpus/templates/crm/app/routes.ts +1 -0
  285. package/corpus/templates/crm/public/manifest.json +1 -1
  286. package/corpus/templates/crm/server/plugins/agent-chat.ts +81 -0
  287. package/corpus/templates/crm/server/plugins/auth.ts +1 -0
  288. package/corpus/templates/crm/server/plugins/core-routes.ts +2 -1
  289. package/corpus/templates/crm/server/plugins/db.ts +7 -1
  290. package/corpus/templates/crm/shared/crm-navigation.ts +3 -2
  291. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +13 -0
  292. package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +4 -0
  293. package/corpus/templates/design/.agents/skills/secrets/SKILL.md +47 -0
  294. package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +22 -10
  295. package/corpus/templates/design/AGENTS.md +1 -1
  296. package/corpus/templates/design/actions/add-breakpoint.ts +3 -1
  297. package/corpus/templates/design/actions/add-fusion-screens.ts +2 -0
  298. package/corpus/templates/design/actions/add-localhost-screens.ts +16 -11
  299. package/corpus/templates/design/actions/apply-a11y-fix.ts +6 -8
  300. package/corpus/templates/design/actions/apply-component-prop-edit.ts +3 -1
  301. package/corpus/templates/design/actions/apply-design-token-edit.ts +3 -1
  302. package/corpus/templates/design/actions/apply-motion-edit.ts +18 -13
  303. package/corpus/templates/design/actions/apply-shader-fill.ts +3 -1
  304. package/corpus/templates/design/actions/apply-source-edit.ts +6 -1
  305. package/corpus/templates/design/actions/apply-tweaks.ts +3 -1
  306. package/corpus/templates/design/actions/apply-visual-edit.ts +14 -9
  307. package/corpus/templates/design/actions/clone-creative-context-design.ts +6 -1
  308. package/corpus/templates/design/actions/create-component.ts +3 -1
  309. package/corpus/templates/design/actions/create-file.ts +3 -1
  310. package/corpus/templates/design/actions/delete-file.ts +3 -1
  311. package/corpus/templates/design/actions/detach-component-instance.ts +3 -1
  312. package/corpus/templates/design/actions/edit-design.ts +16 -11
  313. package/corpus/templates/design/actions/generate-design.ts +19 -14
  314. package/corpus/templates/design/actions/get-design-branch-diff.ts +26 -31
  315. package/corpus/templates/design/actions/get-design-review.ts +25 -31
  316. package/corpus/templates/design/actions/get-design-system-index-status.ts +55 -0
  317. package/corpus/templates/design/actions/get-design-system.ts +1 -1
  318. package/corpus/templates/design/actions/hydrate-figma-paste-images.ts +3 -1
  319. package/corpus/templates/design/actions/import-design-source.ts +16 -9
  320. package/corpus/templates/design/actions/import-design-tokens.ts +3 -1
  321. package/corpus/templates/design/actions/import-figma-clipboard.ts +28 -16
  322. package/corpus/templates/design/actions/import-figma-frame.ts +3 -1
  323. package/corpus/templates/design/actions/insert-asset.ts +3 -1
  324. package/corpus/templates/design/actions/insert-design-native-asset.ts +3 -1
  325. package/corpus/templates/design/actions/insert-figma-library-asset.ts +3 -1
  326. package/corpus/templates/design/actions/list-design-versions.ts +23 -0
  327. package/corpus/templates/design/actions/migrate-board-objects-to-file.ts +3 -1
  328. package/corpus/templates/design/actions/open-visual-edit.ts +23 -20
  329. package/corpus/templates/design/actions/present-design-variants.ts +7 -2
  330. package/corpus/templates/design/actions/refresh-design-system-with-builder.ts +66 -10
  331. package/corpus/templates/design/actions/remove-breakpoint.ts +3 -1
  332. package/corpus/templates/design/actions/remove-motion-timeline.ts +3 -1
  333. package/corpus/templates/design/actions/restore-design-version.ts +16 -0
  334. package/corpus/templates/design/actions/set-layout-grid.ts +94 -0
  335. package/corpus/templates/design/actions/swap-component-instance.ts +6 -1
  336. package/corpus/templates/design/actions/update-design.ts +16 -11
  337. package/corpus/templates/design/actions/update-file.ts +2 -0
  338. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +25 -0
  339. package/corpus/templates/design/app/components/design/EditPanel.tsx +36 -8
  340. package/corpus/templates/design/app/components/design/LayersPanel.tsx +6 -6
  341. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +185 -29
  342. package/corpus/templates/design/app/components/design/ReviewCommentsPanel.tsx +4 -4
  343. package/corpus/templates/design/app/components/design/ReviewPanel.tsx +1 -1
  344. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +35 -10
  345. package/corpus/templates/design/app/components/design/canvas-primitive-style.ts +16 -9
  346. package/corpus/templates/design/app/components/design/edit-panel/component-section.tsx +51 -21
  347. package/corpus/templates/design/app/components/design/edit-panel/effects-properties.tsx +18 -17
  348. package/corpus/templates/design/app/components/design/edit-panel/field-primitives.tsx +6 -1
  349. package/corpus/templates/design/app/components/design/edit-panel/frame-presets-panel.tsx +3 -3
  350. package/corpus/templates/design/app/components/design/edit-panel/layout-grid-properties.tsx +88 -0
  351. package/corpus/templates/design/app/components/design/edit-panel/panel-primitives.tsx +5 -2
  352. package/corpus/templates/design/app/components/design/edit-panel/position-layout-properties.tsx +8 -4
  353. package/corpus/templates/design/app/components/design/edit-panel/typography-helpers.ts +8 -103
  354. package/corpus/templates/design/app/components/design/edit-panel/typography-properties.tsx +68 -83
  355. package/corpus/templates/design/app/components/design/editor/MakeRealDialog.tsx +35 -10
  356. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +29 -24
  357. package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +6 -0
  358. package/corpus/templates/design/app/components/design/inspector/GlslShaderPanel.tsx +72 -71
  359. package/corpus/templates/design/app/components/design/inspector/InspectorControlPopover.tsx +1 -1
  360. package/corpus/templates/design/app/components/design/keyboard-shortcuts.ts +9 -0
  361. package/corpus/templates/design/app/components/design/multi-screen/types.ts +8 -0
  362. package/corpus/templates/design/app/components/layout/Layout.tsx +32 -0
  363. package/corpus/templates/design/app/components/layout/Sidebar.tsx +8 -21
  364. package/corpus/templates/design/app/global.css +72 -1
  365. package/corpus/templates/design/app/hooks/use-navigation-state.ts +1 -1
  366. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +32 -1
  367. package/corpus/templates/design/app/i18n-data.ts +116 -12
  368. package/corpus/templates/design/app/i18n-keyboard-shortcuts.ts +3 -1
  369. package/corpus/templates/design/app/lib/design-system-data.ts +36 -0
  370. package/corpus/templates/design/app/pages/DesignEditor.tsx +170 -34
  371. package/corpus/templates/design/app/pages/DesignSystems.tsx +126 -11
  372. package/corpus/templates/design/app/pages/Index.tsx +15 -7
  373. package/corpus/templates/design/app/pages/NotFound.tsx +1 -1
  374. package/corpus/templates/design/app/pages/Templates.tsx +18 -3
  375. package/corpus/templates/design/app/pages/VisualEdit.tsx +1 -1
  376. package/corpus/templates/design/app/pages/design-editor/code-layer-state.ts +3 -3
  377. package/corpus/templates/design/app/pages/design-editor/commands/README.md +1 -0
  378. package/corpus/templates/design/app/pages/design-editor/commands/geometry-commit.ts +2 -1
  379. package/corpus/templates/design/app/pages/design-editor/commands/set-layout-grid.ts +66 -0
  380. package/corpus/templates/design/app/pages/design-editor/design-data-geometry-utils.ts +5 -0
  381. package/corpus/templates/design/app/pages/design-editor/effects/publish-agent-selection-context.ts +9 -1
  382. package/corpus/templates/design/app/pages/design-editor/effects/resume-pending-generation.ts +39 -9
  383. package/corpus/templates/design/app/pages/design-editor/generation-prompt-directives.ts +31 -2
  384. package/corpus/templates/design/app/pages/design-editor/geometry-persistence.ts +26 -0
  385. package/corpus/templates/design/app/pages/design-editor/intake-question-topics.ts +335 -0
  386. package/corpus/templates/design/app/pages/design-editor/nudge-intent.ts +8 -1
  387. package/corpus/templates/design/app/root.tsx +12 -2
  388. package/corpus/templates/design/app/routes/_index.tsx +14 -1
  389. package/corpus/templates/design/app/routes/home.tsx +21 -0
  390. package/corpus/templates/design/changelog/2026-08-21-builder-design-system-imports-reconcile-after-indexing.md +1 -1
  391. package/corpus/templates/design/changelog/2026-08-28-frames-can-carry-an-8px-layout-grid-that-positions-snap-to.md +6 -0
  392. package/corpus/templates/design/changelog/2026-08-28-x-and-y-are-always-whole-numbers.md +6 -0
  393. package/corpus/templates/design/public/manifest.json +1 -1
  394. package/corpus/templates/design/server/db/schema.ts +2 -0
  395. package/corpus/templates/design/server/handlers/design-system-builder-link.ts +84 -0
  396. package/corpus/templates/design/server/lib/builder-design-system-proxy.ts +9 -1
  397. package/corpus/templates/design/server/lib/design-versions.ts +1017 -0
  398. package/corpus/templates/design/server/plugins/agent-chat.ts +144 -0
  399. package/corpus/templates/design/server/plugins/auth.ts +1 -1
  400. package/corpus/templates/design/server/plugins/core-routes.ts +3 -2
  401. package/corpus/templates/design/server/plugins/db.ts +7 -0
  402. package/corpus/templates/design/server/routes/api/design-system-builder-link.get.ts +1 -0
  403. package/corpus/templates/design/shared/canvas-math.ts +106 -14
  404. package/corpus/templates/design/shared/layout-grid.ts +80 -0
  405. package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +4 -0
  406. package/corpus/templates/dispatch/.agents/skills/secrets/SKILL.md +47 -0
  407. package/corpus/templates/dispatch/AGENTS.md +11 -13
  408. package/corpus/templates/dispatch/actions/list-workspace-connections.ts +10 -5
  409. package/corpus/templates/dispatch/app/i18n-data.ts +120 -0
  410. package/corpus/templates/dispatch/app/root.tsx +11 -1
  411. package/corpus/templates/dispatch/app/routes/_index.tsx +34 -7
  412. package/corpus/templates/dispatch/app/routes/home.tsx +7 -0
  413. package/corpus/templates/dispatch/package.json +1 -0
  414. package/corpus/templates/dispatch/public/manifest.json +1 -1
  415. package/corpus/templates/factory/.agents/skills/factory-graphs/SKILL.md +11 -2
  416. package/corpus/templates/factory/.agents/skills/frontend-design/SKILL.md +4 -0
  417. package/corpus/templates/factory/.agents/skills/secrets/SKILL.md +47 -0
  418. package/corpus/templates/factory/.env.example +2 -14
  419. package/corpus/templates/factory/AGENTS.md +12 -11
  420. package/corpus/templates/factory/README.md +15 -17
  421. package/corpus/templates/factory/actions/{babysit-agent-native-pull-request.ts → babysit-factory-pull-request.ts} +125 -88
  422. package/corpus/templates/factory/actions/create-factory-automation.ts +161 -0
  423. package/corpus/templates/factory/actions/create-factory.ts +4 -124
  424. package/corpus/templates/factory/actions/delete-factory.ts +11 -23
  425. package/corpus/templates/factory/actions/{start-builder-for-item.ts → dispatch-factory-item.ts} +169 -57
  426. package/corpus/templates/factory/actions/get-slack-feedback-context.ts +30 -10
  427. package/corpus/templates/factory/actions/get-triage-config.ts +22 -0
  428. package/corpus/templates/factory/actions/get-triage-item.ts +49 -2
  429. package/corpus/templates/factory/actions/{govern-agent-native-pull-request.ts → govern-factory-pull-request.ts} +95 -112
  430. package/corpus/templates/factory/actions/ingest-github-observation.ts +9 -2
  431. package/corpus/templates/factory/actions/list-factory-audit.ts +85 -12
  432. package/corpus/templates/factory/actions/list-factory-automation-templates.ts +56 -0
  433. package/corpus/templates/factory/actions/list-factory-automations.ts +36 -3
  434. package/corpus/templates/factory/actions/list-factory-graph-versions.ts +37 -10
  435. package/corpus/templates/factory/actions/list-triage-items.ts +120 -15
  436. package/corpus/templates/factory/actions/poll-github-sources.ts +102 -58
  437. package/corpus/templates/factory/actions/poll-sentry-errors.ts +73 -36
  438. package/corpus/templates/factory/actions/poll-slack-channel.ts +112 -28
  439. package/corpus/templates/factory/actions/{babysit-pull-request.ts → propose-pr-babysit-status.ts} +9 -47
  440. package/corpus/templates/factory/actions/reconcile-triage-run.ts +1 -1
  441. package/corpus/templates/factory/actions/save-factory-automation.ts +131 -33
  442. package/corpus/templates/factory/actions/save-factory-graph.ts +31 -8
  443. package/corpus/templates/factory/actions/save-triage-config.ts +7 -27
  444. package/corpus/templates/factory/actions/save-triage-rule.ts +1 -1
  445. package/corpus/templates/factory/app/components/factory/CreateFactoryAutomationView.tsx +258 -0
  446. package/corpus/templates/factory/app/components/factory/FactoryAuditView.tsx +349 -106
  447. package/corpus/templates/factory/app/components/factory/FactoryAutomationFields.tsx +614 -0
  448. package/corpus/templates/factory/app/components/factory/FactoryInboxView.tsx +1136 -0
  449. package/corpus/templates/factory/app/components/factory/FactoryInspector.tsx +7 -14
  450. package/corpus/templates/factory/app/components/factory/FactorySettingsView.tsx +4 -223
  451. package/corpus/templates/factory/app/components/factory/NewFactoryForm.tsx +10 -205
  452. package/corpus/templates/factory/app/components/factory/SlackMrkdwn.tsx +100 -0
  453. package/corpus/templates/factory/app/components/factory/audit-filters.ts +30 -0
  454. package/corpus/templates/factory/app/components/factory/factory-automation-form.ts +120 -0
  455. package/corpus/templates/factory/app/components/factory/inbox-filters.ts +84 -0
  456. package/corpus/templates/factory/app/components/factory/inbox-source-url.ts +23 -0
  457. package/corpus/templates/factory/app/components/factory/slack-emoji.ts +165 -0
  458. package/corpus/templates/factory/app/components/factory/slack-mrkdwn.ts +128 -0
  459. package/corpus/templates/factory/app/components/layout/Header.tsx +1 -1
  460. package/corpus/templates/factory/app/components/layout/Layout.tsx +63 -6
  461. package/corpus/templates/factory/app/components/layout/Sidebar.tsx +13 -26
  462. package/corpus/templates/factory/app/components/triage/triage-status-pill.tsx +63 -14
  463. package/corpus/templates/factory/app/global.css +106 -0
  464. package/corpus/templates/factory/app/hooks/use-navigation-state.ts +16 -10
  465. package/corpus/templates/factory/app/i18n/en-US.ts +154 -7
  466. package/corpus/templates/factory/app/lib/factory-tab-params.ts +59 -0
  467. package/corpus/templates/factory/app/lib/safe-http-url.ts +8 -0
  468. package/corpus/templates/factory/app/root.tsx +16 -3
  469. package/corpus/templates/factory/app/routes/_index.tsx +27 -5
  470. package/corpus/templates/factory/app/routes/factory.tsx +325 -733
  471. package/corpus/templates/factory/app/routes/home.tsx +13 -0
  472. package/corpus/templates/factory/app/routes/new-factory.tsx +3 -5
  473. package/corpus/templates/factory/changelog/2026-08-26-inbox-full-screen-thread.md +6 -0
  474. package/corpus/templates/factory/changelog/2026-08-26-inbox-thread-and-audit-labels.md +6 -0
  475. package/corpus/templates/factory/changelog/2026-08-27-audit-run-list-stacks.md +6 -0
  476. package/corpus/templates/factory/changelog/2026-08-27-audit-run-names-wrap.md +6 -0
  477. package/corpus/templates/factory/changelog/2026-08-27-factory-opens-on-inbox.md +6 -0
  478. package/corpus/templates/factory/changelog/2026-08-27-github-repository-url.md +6 -0
  479. package/corpus/templates/factory/changelog/2026-08-27-inbox-filters.md +6 -0
  480. package/corpus/templates/factory/changelog/2026-08-27-polling-does-not-enable-automations.md +6 -0
  481. package/corpus/templates/factory/changelog/2026-08-27-pr-babysit-can-poll-github.md +6 -0
  482. package/corpus/templates/factory/changelog/2026-08-28-factory-automations-use-workspace-connections.md +6 -0
  483. package/corpus/templates/factory/changelog/2026-08-28-inbox-approve-and-start-removed.md +6 -0
  484. package/corpus/templates/factory/changelog/2026-08-28-pr-babysit-audit-shows-decisions.md +6 -0
  485. package/corpus/templates/factory/changelog/2026-08-28-pr-babysit-reviews-next-github-prs.md +6 -0
  486. package/corpus/templates/factory/changelog/2026-08-28-pr-babysit-sticky-out-of-scope.md +6 -0
  487. package/corpus/templates/factory/changelog/2026-08-28-pr-babysit-uses-github-evidence.md +6 -0
  488. package/corpus/templates/factory/changelog/2026-08-29-audit-filters-pagination-scroll.md +6 -0
  489. package/corpus/templates/factory/changelog/2026-08-29-create-factory-automations.md +6 -0
  490. package/corpus/templates/factory/changelog/2026-08-29-dispatch-reaction-argument.md +6 -0
  491. package/corpus/templates/factory/changelog/2026-08-29-factory-action-names-match-behavior.md +6 -0
  492. package/corpus/templates/factory/public/manifest.json +1 -1
  493. package/corpus/templates/factory/server/connectors/slack.ts +8 -6
  494. package/corpus/templates/factory/server/db/schema.ts +23 -0
  495. package/corpus/templates/factory/server/lib/audit-cursor.ts +44 -0
  496. package/corpus/templates/factory/server/lib/factory-action-names.ts +15 -0
  497. package/corpus/templates/factory/server/lib/factory-audit-report.ts +29 -9
  498. package/corpus/templates/factory/server/lib/factory-automation-caller.ts +38 -0
  499. package/corpus/templates/factory/server/lib/factory-automation-config.ts +543 -0
  500. package/corpus/templates/factory/server/lib/factory-automation-plan.ts +0 -48
  501. package/corpus/templates/factory/server/lib/factory-automation-repair.ts +2 -18
  502. package/corpus/templates/factory/server/lib/factory-poll-cursors.ts +98 -0
  503. package/corpus/templates/factory/server/lib/factory-scope.ts +8 -0
  504. package/corpus/templates/factory/server/lib/github-repository.ts +104 -0
  505. package/corpus/templates/factory/server/lib/inbox-cursor.ts +34 -0
  506. package/corpus/templates/factory/server/lib/pr-babysit-prompt.ts +33 -0
  507. package/corpus/templates/factory/server/lib/require-factory-automation.ts +58 -17
  508. package/corpus/templates/factory/server/lib/safe-http-url.ts +8 -0
  509. package/corpus/templates/factory/server/lib/slack-feedback-prompt.ts +19 -10
  510. package/corpus/templates/factory/server/lib/source-reaction.ts +37 -0
  511. package/corpus/templates/factory/server/plugins/agent-chat.ts +18 -22
  512. package/corpus/templates/factory/server/plugins/auth.ts +1 -0
  513. package/corpus/templates/factory/server/plugins/factory-migrations.ts +26 -0
  514. package/corpus/templates/factory/server/plugins/factory-scheduler-job.ts +277 -164
  515. package/corpus/templates/factory/server/plugins/integrations.ts +5 -7
  516. package/corpus/templates/factory/server/triage/github-client.ts +274 -3
  517. package/corpus/templates/factory/server/triage/github-ingestion.ts +3 -1
  518. package/corpus/templates/factory/server/triage/metadata.ts +12 -0
  519. package/corpus/templates/factory/server/triage/pr-babysit.ts +22 -21
  520. package/corpus/templates/factory/server/triage/review-skill-alignment.ts +11 -11
  521. package/corpus/templates/factory/server/triage/review-state.ts +39 -0
  522. package/corpus/templates/factory/server/triage/slack-client.ts +14 -6
  523. package/corpus/templates/factory/server/triage/slack-poller.ts +34 -65
  524. package/corpus/templates/factory/server/triage/slack-user-labels.ts +126 -0
  525. package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +4 -0
  526. package/corpus/templates/forms/.agents/skills/secrets/SKILL.md +47 -0
  527. package/corpus/templates/forms/AGENTS.md +4 -3
  528. package/corpus/templates/forms/actions/response-insights.ts +4 -4
  529. package/corpus/templates/forms/actions/retry-response-deliveries.ts +26 -0
  530. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +8 -33
  531. package/corpus/templates/forms/app/hooks/use-navigation-state.ts +1 -1
  532. package/corpus/templates/forms/app/lib/route-prewarm.ts +1 -1
  533. package/corpus/templates/forms/app/root.tsx +3 -2
  534. package/corpus/templates/forms/app/routes/_app.home.tsx +47 -0
  535. package/corpus/templates/forms/app/routes/_app.tsx +2 -1
  536. package/corpus/templates/forms/app/routes/_index.tsx +10 -23
  537. package/corpus/templates/forms/public/manifest.json +1 -1
  538. package/corpus/templates/forms/server/db/schema.ts +64 -17
  539. package/corpus/templates/forms/server/handlers/submissions.ts +1022 -94
  540. package/corpus/templates/forms/server/lib/integrations.ts +100 -33
  541. package/corpus/templates/forms/server/middleware/00-public-cors.ts +1 -1
  542. package/corpus/templates/forms/server/plugins/auth.ts +1 -0
  543. package/corpus/templates/forms/server/plugins/core-routes.ts +1 -0
  544. package/corpus/templates/forms/server/plugins/db.ts +40 -0
  545. package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +4 -0
  546. package/corpus/templates/macros/.agents/skills/secrets/SKILL.md +47 -0
  547. package/corpus/templates/macros/actions/view-screen.ts +1 -1
  548. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +9 -21
  549. package/corpus/templates/macros/app/components/layout/Header.tsx +1 -1
  550. package/corpus/templates/macros/app/root.tsx +22 -8
  551. package/corpus/templates/macros/app/routes/_index.tsx +16 -291
  552. package/corpus/templates/macros/app/routes/home.tsx +312 -0
  553. package/corpus/templates/macros/server/plugins/auth.ts +9 -7
  554. package/corpus/templates/macros/server/plugins/core-routes.ts +1 -0
  555. package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +4 -0
  556. package/corpus/templates/mail/.agents/skills/inbox-automations/SKILL.md +13 -2
  557. package/corpus/templates/mail/.agents/skills/inbox-reads-and-triage/SKILL.md +1 -1
  558. package/corpus/templates/mail/.agents/skills/secrets/SKILL.md +47 -0
  559. package/corpus/templates/mail/AGENTS.md +5 -2
  560. package/corpus/templates/mail/actions/apply-ai-filter.ts +294 -0
  561. package/corpus/templates/mail/actions/create-automation.ts +1 -0
  562. package/corpus/templates/mail/actions/get-ai-filter.ts +19 -0
  563. package/corpus/templates/mail/actions/manage-automations.ts +162 -157
  564. package/corpus/templates/mail/actions/manage-email-rules.ts +3 -0
  565. package/corpus/templates/mail/actions/navigate.ts +1 -1
  566. package/corpus/templates/mail/actions/update-automation.ts +1 -0
  567. package/corpus/templates/mail/actions/update-mail-preferences.ts +1 -0
  568. package/corpus/templates/mail/app/components/email/AiFilterDialog.tsx +127 -0
  569. package/corpus/templates/mail/app/components/email/EmailList.tsx +63 -0
  570. package/corpus/templates/mail/app/components/email/EmailThread.tsx +95 -0
  571. package/corpus/templates/mail/app/components/email/MobileActionBar.tsx +35 -3
  572. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +17 -22
  573. package/corpus/templates/mail/app/components/settings/AiFilterSection.tsx +401 -0
  574. package/corpus/templates/mail/app/hooks/use-ai-filter.ts +48 -0
  575. package/corpus/templates/mail/app/hooks/use-automations.ts +1 -0
  576. package/corpus/templates/mail/app/hooks/use-emails.ts +11 -3
  577. package/corpus/templates/mail/app/i18n/en-US.ts +55 -0
  578. package/corpus/templates/mail/app/lib/automation-visibility.ts +17 -0
  579. package/corpus/templates/mail/app/pages/InboxPage.tsx +5 -2
  580. package/corpus/templates/mail/app/pages/SettingsPage.tsx +16 -8
  581. package/corpus/templates/mail/app/pages/inbox-zero.ts +1 -2
  582. package/corpus/templates/mail/app/root.tsx +20 -8
  583. package/corpus/templates/mail/app/routes/_index.tsx +16 -55
  584. package/corpus/templates/mail/app/routes/home.tsx +71 -0
  585. package/corpus/templates/mail/changelog/2026-08-28-mail-settings-show-chat-created-automations.md +6 -0
  586. package/corpus/templates/mail/public/manifest.json +1 -1
  587. package/corpus/templates/mail/server/db/schema.ts +3 -0
  588. package/corpus/templates/mail/server/handlers/emails.ts +34 -11
  589. package/corpus/templates/mail/server/handlers/google-auth.ts +1 -1
  590. package/corpus/templates/mail/server/lib/ai-filter.ts +103 -0
  591. package/corpus/templates/mail/server/lib/automation-actions.ts +14 -9
  592. package/corpus/templates/mail/server/lib/automation-engine.ts +142 -18
  593. package/corpus/templates/mail/server/lib/automations.ts +9 -0
  594. package/corpus/templates/mail/server/lib/email-state.ts +7 -2
  595. package/corpus/templates/mail/server/lib/gmail-query.ts +10 -0
  596. package/corpus/templates/mail/server/lib/google-auth.ts +5 -8
  597. package/corpus/templates/mail/server/lib/jobs.ts +1 -5
  598. package/corpus/templates/mail/server/onboarding.ts +2 -2
  599. package/corpus/templates/mail/server/plugins/agent-chat.ts +5 -2
  600. package/corpus/templates/mail/server/plugins/auth.ts +1 -0
  601. package/corpus/templates/mail/server/plugins/core-routes.ts +4 -1
  602. package/corpus/templates/mail/server/plugins/db.ts +6 -0
  603. package/corpus/templates/mail/server/routes/api/attachments.get.ts +1 -5
  604. package/corpus/templates/mail/shared/ai-filter.ts +74 -0
  605. package/corpus/templates/mail/shared/types.ts +2 -0
  606. package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +4 -0
  607. package/corpus/templates/plan/.agents/skills/secrets/SKILL.md +47 -0
  608. package/corpus/templates/plan/actions/list-plan-versions.ts +20 -5
  609. package/corpus/templates/plan/agent-native.json +1 -4
  610. package/corpus/templates/plan/app/components/editor/PlanDocumentEditor.tsx +5 -2
  611. package/corpus/templates/plan/app/components/layout/Layout.tsx +41 -1
  612. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +4 -16
  613. package/corpus/templates/plan/app/components/plan/PlanMarkdownEditor.tsx +7 -4
  614. package/corpus/templates/plan/app/components/plan/wireframe/Wireframe.tsx +1 -1
  615. package/corpus/templates/plan/app/components/plan/wireframe/html-artboard.css +15 -0
  616. package/corpus/templates/plan/app/components/plan/wireframe/kit/plan-wireframe-tokens.css +0 -15
  617. package/corpus/templates/plan/app/components/plan/wireframe/kit/primitives.tsx +2 -2
  618. package/corpus/templates/plan/app/hooks/use-plan-presence.ts +20 -10
  619. package/corpus/templates/plan/app/pages/PlansPage.tsx +2 -2
  620. package/corpus/templates/plan/app/root.tsx +13 -7
  621. package/corpus/templates/plan/app/routes/_index.tsx +31 -6
  622. package/corpus/templates/plan/app/routes/chat.tsx +3 -6
  623. package/corpus/templates/plan/app/routes/home.tsx +11 -0
  624. package/corpus/templates/plan/app/routes/local-plans.$slug.tsx +2 -6
  625. package/corpus/templates/plan/app/routes/plans.$id.tsx +3 -6
  626. package/corpus/templates/plan/app/routes/plans.tsx +3 -6
  627. package/corpus/templates/plan/app/routes/recaps.$id.tsx +3 -6
  628. package/corpus/templates/plan/app/routes/recaps.tsx +3 -6
  629. package/corpus/templates/plan/changelog/2026-08-28-plan-loading-skeletons-use-a-softer-whole-surface.md +6 -0
  630. package/corpus/templates/plan/changelog/2026-08-29-plan-loading-shine-is-more-subtle.md +6 -0
  631. package/corpus/templates/plan/public/manifest.json +1 -1
  632. package/corpus/templates/plan/server/db/schema.ts +1 -0
  633. package/corpus/templates/plan/server/lib/plan-versions.ts +57 -0
  634. package/corpus/templates/plan/server/plugins/agent-chat.ts +83 -0
  635. package/corpus/templates/plan/server/plugins/core-routes.ts +1 -0
  636. package/corpus/templates/plan/server/plugins/db.ts +10 -0
  637. package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +4 -0
  638. package/corpus/templates/slides/.agents/skills/secrets/SKILL.md +47 -0
  639. package/corpus/templates/slides/CHANGELOG.md +9 -0
  640. package/corpus/templates/slides/actions/_deck-write.ts +65 -0
  641. package/corpus/templates/slides/actions/add-slide.ts +44 -24
  642. package/corpus/templates/slides/actions/clone-context-slide.ts +22 -12
  643. package/corpus/templates/slides/actions/create-deck.ts +36 -21
  644. package/corpus/templates/slides/actions/delete-design-system.ts +10 -3
  645. package/corpus/templates/slides/actions/import-file.ts +9 -3
  646. package/corpus/templates/slides/actions/import-pptx.ts +11 -4
  647. package/corpus/templates/slides/actions/list-deck-versions.ts +20 -8
  648. package/corpus/templates/slides/actions/patch-deck.ts +29 -3
  649. package/corpus/templates/slides/actions/restore-deck-version.ts +37 -22
  650. package/corpus/templates/slides/actions/save-deck.ts +35 -22
  651. package/corpus/templates/slides/actions/update-deck-aspect-ratio.ts +31 -16
  652. package/corpus/templates/slides/actions/update-slide.ts +250 -37
  653. package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +10 -4
  654. package/corpus/templates/slides/app/components/editor/EditorActionCluster.tsx +2 -2
  655. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +7 -8
  656. package/corpus/templates/slides/app/components/editor/ImageOverlay.tsx +78 -12
  657. package/corpus/templates/slides/app/components/editor/SlideContextToolbar.tsx +42 -4
  658. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +381 -53
  659. package/corpus/templates/slides/app/components/editor/SlidesLayersPanel.tsx +20 -34
  660. package/corpus/templates/slides/app/components/editor/slide-style.ts +5 -0
  661. package/corpus/templates/slides/app/components/editor/style-clipboard.ts +2 -0
  662. package/corpus/templates/slides/app/components/layout/AgentWorkIndicator.tsx +18 -2
  663. package/corpus/templates/slides/app/components/layout/Header.tsx +1 -1
  664. package/corpus/templates/slides/app/components/layout/Layout.tsx +39 -10
  665. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +7 -20
  666. package/corpus/templates/slides/app/components/presentation/PresenterView.tsx +35 -15
  667. package/corpus/templates/slides/app/components/presentation/present-channel.ts +12 -0
  668. package/corpus/templates/slides/app/global.css +45 -13
  669. package/corpus/templates/slides/app/hooks/use-navigation-state.ts +1 -1
  670. package/corpus/templates/slides/app/i18n/en-US.ts +11 -0
  671. package/corpus/templates/slides/app/lib/sanitize-slide-html.ts +133 -5
  672. package/corpus/templates/slides/app/lib/slide-image-replacement.ts +741 -17
  673. package/corpus/templates/slides/app/lib/validate-native-slide-html.ts +1 -0
  674. package/corpus/templates/slides/app/pages/DeckEditor.tsx +288 -95
  675. package/corpus/templates/slides/app/pages/DesignSystems.tsx +5 -5
  676. package/corpus/templates/slides/app/pages/Index.tsx +7 -7
  677. package/corpus/templates/slides/app/pages/NotFound.tsx +1 -1
  678. package/corpus/templates/slides/app/pages/SharedPresentation.tsx +1 -1
  679. package/corpus/templates/slides/app/root.tsx +4 -23
  680. package/corpus/templates/slides/app/routes/_index.tsx +18 -7
  681. package/corpus/templates/slides/app/routes/home.tsx +26 -0
  682. package/corpus/templates/slides/changelog/2026-08-27-image-fit-controls-apply-cover-crops-and-position.md +6 -0
  683. package/corpus/templates/slides/changelog/2026-08-28-image-edits-persist-while-dropped-images-finish-uploading.md +6 -0
  684. package/corpus/templates/slides/changelog/2026-08-28-shared-slides-with-a-style-block-render-again.md +6 -0
  685. package/corpus/templates/slides/changelog/2026-08-28-slides-loading-skeletons-use-a-softer-whole-surface.md +6 -0
  686. package/corpus/templates/slides/changelog/2026-08-28-standard-empty-home-layout.md +6 -0
  687. package/corpus/templates/slides/changelog/2026-08-29-chat-imports-attached-decks-on-request.md +6 -0
  688. package/corpus/templates/slides/changelog/2026-08-29-slides-loading-shine-is-more-subtle.md +6 -0
  689. package/corpus/templates/slides/package.json +3 -0
  690. package/corpus/templates/slides/public/manifest.json +1 -1
  691. package/corpus/templates/slides/server/db/schema.ts +1 -0
  692. package/corpus/templates/slides/server/handlers/google-docs-auth.ts +1 -1
  693. package/corpus/templates/slides/server/lib/chat-attachments.ts +102 -7
  694. package/corpus/templates/slides/server/lib/deck-versions.ts +77 -2
  695. package/corpus/templates/slides/server/plugins/agent-chat.ts +95 -1
  696. package/corpus/templates/slides/server/plugins/auth.ts +1 -0
  697. package/corpus/templates/slides/server/plugins/core-routes.ts +8 -1
  698. package/corpus/templates/slides/server/plugins/db.ts +5 -0
  699. package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +4 -0
  700. package/corpus/templates/tasks/.agents/skills/secrets/SKILL.md +47 -0
  701. package/corpus/templates/tasks/AGENTS.md +2 -1
  702. package/corpus/templates/tasks/README.md +3 -1
  703. package/corpus/templates/tasks/app/components/layout/Sidebar.tsx +5 -18
  704. package/corpus/templates/tasks/app/root.tsx +19 -3
  705. package/corpus/templates/tasks/app/routes/_index.tsx +28 -14
  706. package/corpus/templates/tasks/app/routes/home.tsx +24 -0
  707. package/corpus/templates/tasks/public/manifest.json +1 -1
  708. package/corpus/templates/tasks/server/plugins/auth.ts +1 -0
  709. package/dist/a2a/client.d.ts +4 -0
  710. package/dist/a2a/client.js +15 -2
  711. package/dist/action.d.ts +3 -1
  712. package/dist/agent/engine/ai-sdk-engine.js +13 -9
  713. package/dist/agent/engine/anthropic-engine.js +2 -1
  714. package/dist/agent/engine/builder-engine.js +23 -5
  715. package/dist/agent/engine/limit-provider-tools.d.ts +3 -0
  716. package/dist/agent/engine/limit-provider-tools.js +23 -0
  717. package/dist/agent/engine/openai-compatible-endpoint.d.ts +2 -0
  718. package/dist/agent/engine/openai-compatible-endpoint.js +4 -0
  719. package/dist/agent/engine/output-tokens.d.ts +12 -6
  720. package/dist/agent/engine/output-tokens.js +42 -16
  721. package/dist/agent/engine/registry.d.ts +1 -1
  722. package/dist/agent/engine/registry.js +69 -16
  723. package/dist/agent/production-agent.js +107 -13
  724. package/dist/agent/run-manager.d.ts +9 -0
  725. package/dist/agent/run-manager.js +35 -6
  726. package/dist/agent/thread-data-builder.d.ts +6 -1
  727. package/dist/agent/thread-data-builder.js +74 -17
  728. package/dist/agent/types.d.ts +2 -0
  729. package/dist/app-config/agent.d.ts +4 -0
  730. package/dist/app-config/agent.js +44 -0
  731. package/dist/app-config/integrations.d.ts +1 -0
  732. package/dist/app-config/integrations.js +8 -0
  733. package/dist/app-config/migration.d.ts +1 -0
  734. package/dist/app-config/migration.js +4 -0
  735. package/dist/app-config/observability.d.ts +4 -1
  736. package/dist/app-config/observability.js +25 -1
  737. package/dist/app-config/schema.d.ts +9 -0
  738. package/dist/app-config/store.js +1 -0
  739. package/dist/client/AgentAskPopover.d.ts +2 -1
  740. package/dist/client/AgentAskPopover.js +2 -2
  741. package/dist/client/AgentPanel.d.ts +35 -10
  742. package/dist/client/AgentPanel.js +136 -119
  743. package/dist/client/AssistantChat.d.ts +9 -2
  744. package/dist/client/AssistantChat.js +166 -41
  745. package/dist/client/ConnectBuilderCard.js +3 -1
  746. package/dist/client/DefaultSpinner.d.ts +13 -1
  747. package/dist/client/DefaultSpinner.js +52 -46
  748. package/dist/client/FeedbackButton.d.ts +12 -0
  749. package/dist/client/FeedbackButton.js +62 -28
  750. package/dist/client/MultiTabAssistantChat.js +30 -11
  751. package/dist/client/NewWorkspaceAppFlow.js +5 -3
  752. package/dist/client/agent-chat/index.d.ts +1 -0
  753. package/dist/client/agent-chat/index.js +1 -0
  754. package/dist/client/agent-chat-adapter.js +16 -1
  755. package/dist/client/agent-chat.d.ts +9 -0
  756. package/dist/client/agent-chat.js +6 -3
  757. package/dist/client/agent-page/AgentJobsTab.d.ts +2 -1
  758. package/dist/client/agent-page/AgentJobsTab.js +8 -5
  759. package/dist/client/agent-page/AgentTabsPage.js +2 -2
  760. package/dist/client/analytics.d.ts +2 -0
  761. package/dist/client/analytics.js +86 -15
  762. package/dist/client/app-providers.js +13 -1
  763. package/dist/client/auth/AuthPage.d.ts +87 -0
  764. package/dist/client/auth/AuthPage.js +1847 -0
  765. package/dist/client/auth/ResetPasswordPage.d.ts +9 -0
  766. package/dist/client/auth/ResetPasswordPage.js +119 -0
  767. package/dist/client/auth/entry.d.ts +1 -0
  768. package/dist/client/auth/entry.js +15 -0
  769. package/dist/client/chat/message-components.d.ts +53 -0
  770. package/dist/client/chat/message-components.js +181 -11
  771. package/dist/client/chat/run-recovery.d.ts +4 -1
  772. package/dist/client/chat/run-recovery.js +30 -12
  773. package/dist/client/chat/tool-call-display.d.ts +4 -2
  774. package/dist/client/chat/tool-call-display.js +16 -11
  775. package/dist/client/chat-first.js +8 -2
  776. package/dist/client/chat-model-groups.js +11 -1
  777. package/dist/client/collab/index.d.ts +1 -1
  778. package/dist/client/components/CodeRequiredDialog.js +22 -35
  779. package/dist/client/components/icons/AgentNativeIcon.d.ts +3 -3
  780. package/dist/client/components/icons/AgentNativeIcon.js +4 -4
  781. package/dist/client/components/ui/message-scroller.js +1 -1
  782. package/dist/client/composer/runtime-adapters.js +2 -0
  783. package/dist/client/feedback-context.d.ts +1 -0
  784. package/dist/client/feedback-context.js +3 -2
  785. package/dist/client/host-bridge.d.ts +1 -0
  786. package/dist/client/index.d.ts +2 -2
  787. package/dist/client/index.js +1 -1
  788. package/dist/client/integrations/IntegrationsPanel.d.ts +2 -1
  789. package/dist/client/integrations/IntegrationsPanel.js +3 -3
  790. package/dist/client/observability/ThumbsFeedback.js +73 -10
  791. package/dist/client/onboarding/FirstRunOnboarding.js +24 -15
  792. package/dist/client/onboarding/OnboardingPanel.js +5 -3
  793. package/dist/client/onboarding/first-run-startup-gate.js +7 -1
  794. package/dist/client/resources/McpIntegrationDialog.d.ts +2 -1
  795. package/dist/client/resources/McpIntegrationDialog.js +10 -2
  796. package/dist/client/session-replay.js +10 -0
  797. package/dist/client/settings/BuilderConnectPopover.d.ts +25 -0
  798. package/dist/client/settings/BuilderConnectPopover.js +55 -0
  799. package/dist/client/settings/SettingsPanel.js +21 -7
  800. package/dist/client/settings/SettingsTabsPage.d.ts +1 -1
  801. package/dist/client/settings/SettingsTabsPage.js +42 -25
  802. package/dist/client/settings/VoiceTranscriptionSection.js +16 -22
  803. package/dist/client/settings/index.d.ts +1 -0
  804. package/dist/client/settings/index.js +1 -0
  805. package/dist/client/settings/useBuilderStatus.d.ts +7 -0
  806. package/dist/client/settings/useBuilderStatus.js +77 -21
  807. package/dist/client/setup-connections/BuilderConnectCard.js +2 -1
  808. package/dist/client/setup-connections/useBuilderConnectCardController.d.ts +3 -1
  809. package/dist/client/setup-connections/useBuilderConnectCardController.js +4 -2
  810. package/dist/client/sse-event-processor.js +8 -0
  811. package/dist/client/terminal/AgentTerminal.js +6 -7
  812. package/dist/client/transcription/BuilderTranscriptionCta.js +17 -69
  813. package/dist/client/ui/index.d.ts +1 -0
  814. package/dist/client/ui/index.js +1 -0
  815. package/dist/client/use-chat-models.js +5 -4
  816. package/dist/client/webmcp.d.ts +4 -0
  817. package/dist/client/webmcp.js +51 -4
  818. package/dist/collab/client.d.ts +13 -0
  819. package/dist/collab/client.js +96 -21
  820. package/dist/collab/struct-routes.d.ts +1 -1
  821. package/dist/dashboard-storage/index.d.ts +1 -1
  822. package/dist/dashboard-storage/schema.d.ts +19 -0
  823. package/dist/dashboard-storage/schema.js +1 -0
  824. package/dist/dashboard-storage/store.d.ts +9 -0
  825. package/dist/dashboard-storage/store.js +93 -3
  826. package/dist/deploy/build.d.ts +19 -3
  827. package/dist/deploy/build.js +262 -10
  828. package/dist/index.browser.d.ts +1 -1
  829. package/dist/index.browser.js +1 -1
  830. package/dist/index.d.ts +1 -1
  831. package/dist/index.js +1 -1
  832. package/dist/ingestion/media.js +7 -2
  833. package/dist/integrations/config-store.js +2 -4
  834. package/dist/integrations/google-docs-poller.d.ts +1 -1
  835. package/dist/integrations/google-docs-poller.js +100 -24
  836. package/dist/integrations/plugin.js +45 -15
  837. package/dist/integrations/webhook-handler.js +2 -1
  838. package/dist/jobs/background-automation-runner.js +17 -1
  839. package/dist/localization/core-messages/ar-SA.js +19 -0
  840. package/dist/localization/core-messages/de-DE.js +19 -0
  841. package/dist/localization/core-messages/en-US.d.ts +19 -0
  842. package/dist/localization/core-messages/en-US.js +19 -0
  843. package/dist/localization/core-messages/es-ES.js +19 -0
  844. package/dist/localization/core-messages/fr-FR.js +19 -0
  845. package/dist/localization/core-messages/hi-IN.js +19 -0
  846. package/dist/localization/core-messages/ja-JP.js +19 -0
  847. package/dist/localization/core-messages/ko-KR.js +19 -0
  848. package/dist/localization/core-messages/pt-BR.js +19 -0
  849. package/dist/localization/core-messages/zh-CN.js +19 -0
  850. package/dist/localization/core-messages/zh-TW.js +19 -0
  851. package/dist/localization/core-messages.d.ts +19 -0
  852. package/dist/localization/default-messages.d.ts +11 -0
  853. package/dist/localization/default-messages.js +11 -0
  854. package/dist/mcp/analytics.d.ts +103 -0
  855. package/dist/mcp/analytics.js +204 -0
  856. package/dist/mcp/build-server.d.ts +7 -0
  857. package/dist/mcp/build-server.js +132 -35
  858. package/dist/mcp/screen-memory-stdio.d.ts +7 -7
  859. package/dist/mcp/server.js +37 -8
  860. package/dist/mcp/stdio.js +1 -0
  861. package/dist/mcp-client/errors.js +30 -10
  862. package/dist/mcp-client/oauth-routes.d.ts +7 -2
  863. package/dist/mcp-client/oauth-routes.js +12 -3
  864. package/dist/mcp-client/routes.js +2 -1
  865. package/dist/notifications/routes.d.ts +1 -1
  866. package/dist/oauth-tokens/store.js +6 -3
  867. package/dist/observability/routes.d.ts +3 -3
  868. package/dist/observability/routes.js +8 -2
  869. package/dist/observability/store.d.ts +1 -1
  870. package/dist/observability/store.js +18 -3
  871. package/dist/observability/types.d.ts +1 -0
  872. package/dist/onboarding/plugin.js +16 -4
  873. package/dist/provider-api/actions/custom-provider-registration.d.ts +16 -16
  874. package/dist/provider-api/actions/provider-api.d.ts +12 -12
  875. package/dist/resources/handlers.d.ts +2 -2
  876. package/dist/secrets/routes.d.ts +9 -9
  877. package/dist/server/action-routes.d.ts +1 -6
  878. package/dist/server/action-routes.js +61 -18
  879. package/dist/server/agent-chat/plugin-options.d.ts +8 -1
  880. package/dist/server/agent-chat-plugin.d.ts +3 -0
  881. package/dist/server/agent-chat-plugin.js +49 -4
  882. package/dist/server/agent-run-context.d.ts +1 -0
  883. package/dist/server/agent-run-context.js +6 -0
  884. package/dist/server/analytics.d.ts +3 -2
  885. package/dist/server/analytics.js +18 -7
  886. package/dist/server/app-url.d.ts +5 -2
  887. package/dist/server/app-url.js +4 -3
  888. package/dist/server/auth.d.ts +25 -0
  889. package/dist/server/auth.js +168 -21
  890. package/dist/server/better-auth-instance.js +29 -4
  891. package/dist/server/better-auth-migrations.d.ts +14 -0
  892. package/dist/server/better-auth-migrations.js +5 -1
  893. package/dist/server/builder-api-auth.js +30 -6
  894. package/dist/server/builder-browser.d.ts +10 -0
  895. package/dist/server/builder-browser.js +22 -5
  896. package/dist/server/builder-design-systems.d.ts +11 -0
  897. package/dist/server/builder-design-systems.js +52 -3
  898. package/dist/server/builder-oauth.d.ts +13 -6
  899. package/dist/server/builder-oauth.js +121 -63
  900. package/dist/server/capture-error.js +3 -0
  901. package/dist/server/cookie-namespace.d.ts +1 -0
  902. package/dist/server/cookie-namespace.js +3 -0
  903. package/dist/server/core-routes-plugin.d.ts +25 -9
  904. package/dist/server/core-routes-plugin.js +180 -76
  905. package/dist/server/credential-provider.js +22 -12
  906. package/dist/server/email.d.ts +4 -0
  907. package/dist/server/email.js +13 -5
  908. package/dist/server/framework-request-handler.js +6 -3
  909. package/dist/server/google-credential-check.d.ts +7 -3
  910. package/dist/server/google-credential-check.js +71 -0
  911. package/dist/server/google-oauth-credentials.d.ts +4 -3
  912. package/dist/server/google-oauth-credentials.js +7 -8
  913. package/dist/server/google-oauth.d.ts +9 -4
  914. package/dist/server/google-oauth.js +14 -93
  915. package/dist/server/index.d.ts +1 -1
  916. package/dist/server/index.js +1 -1
  917. package/dist/server/jwks-secret-rotation.d.ts +29 -0
  918. package/dist/server/jwks-secret-rotation.js +150 -0
  919. package/dist/server/onboarding-html.d.ts +2 -14
  920. package/dist/server/onboarding-html.js +254 -2519
  921. package/dist/server/origin-allowlist.d.ts +15 -0
  922. package/dist/server/origin-allowlist.js +93 -0
  923. package/dist/server/realtime-token.d.ts +1 -1
  924. package/dist/server/release-migrations.js +48 -0
  925. package/dist/server/request-context.d.ts +2 -0
  926. package/dist/server/request-context.js +7 -2
  927. package/dist/server/self-dispatch.js +5 -0
  928. package/dist/server/sentry.js +5 -0
  929. package/dist/server/ssr-handler.js +5 -0
  930. package/dist/server/workspace-provider-oauth.d.ts +9 -0
  931. package/dist/server/workspace-provider-oauth.js +96 -31
  932. package/dist/shared/index.d.ts +2 -0
  933. package/dist/shared/index.js +2 -0
  934. package/dist/shared/loading-labels.d.ts +1 -0
  935. package/dist/shared/loading-labels.js +55 -0
  936. package/dist/shared/qa-test-email.d.ts +1 -0
  937. package/dist/shared/qa-test-email.js +42 -0
  938. package/dist/shared/route-warmup-config.js +2 -2
  939. package/dist/shared/sign-in-journey.js +1 -1
  940. package/dist/shared/ssr-auth-redirect.d.ts +8 -0
  941. package/dist/shared/ssr-auth-redirect.js +56 -0
  942. package/dist/shared/test-traffic.d.ts +8 -0
  943. package/dist/shared/test-traffic.js +11 -0
  944. package/dist/styles/agent-native.css +50 -14
  945. package/dist/styles/blocks.css +0 -6
  946. package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +4 -0
  947. package/dist/templates/chat/.agents/skills/secrets/SKILL.md +47 -0
  948. package/dist/templates/chat/AGENTS.md +5 -4
  949. package/dist/templates/chat/app/components/layout/Header.tsx +1 -1
  950. package/dist/templates/chat/app/components/layout/Layout.tsx +5 -4
  951. package/dist/templates/chat/app/components/layout/Sidebar.tsx +16 -25
  952. package/dist/templates/chat/app/hooks/use-navigation-state.ts +5 -5
  953. package/dist/templates/chat/app/root.tsx +16 -3
  954. package/dist/templates/chat/app/routes/_index.tsx +17 -74
  955. package/dist/templates/chat/app/routes/chat.$threadId.tsx +1 -1
  956. package/dist/templates/chat/app/routes/home.tsx +94 -0
  957. package/dist/templates/chat/netlify.toml +2 -1
  958. package/dist/templates/chat/public/manifest.json +1 -1
  959. package/dist/templates/chat/server/plugins/auth.ts +1 -0
  960. package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +4 -0
  961. package/dist/templates/default/.agents/skills/secrets/SKILL.md +47 -0
  962. package/dist/templates/default/AGENTS.md +10 -6
  963. package/dist/templates/default/DEVELOPING.md +8 -1
  964. package/dist/templates/default/app/hooks/use-navigation-state.ts +1 -1
  965. package/dist/templates/default/app/root.tsx +10 -3
  966. package/dist/templates/default/app/routes/_index.tsx +10 -86
  967. package/dist/templates/default/app/routes/home.tsx +94 -0
  968. package/dist/templates/default/app/routes/settings.tsx +1 -1
  969. package/dist/templates/default/public/manifest.json +1 -1
  970. package/dist/templates/default/server/plugins/auth.ts +5 -0
  971. package/dist/templates/headless/.agents/skills/secrets/SKILL.md +47 -0
  972. package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +4 -0
  973. package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +47 -0
  974. package/dist/templates/workspace-root/.env.example +3 -2
  975. package/dist/terminal/pty-server.d.ts +2 -0
  976. package/dist/terminal/pty-server.js +22 -5
  977. package/dist/tracking/registry.d.ts +1 -0
  978. package/dist/tracking/registry.js +12 -0
  979. package/dist/usage/store.d.ts +1 -0
  980. package/dist/usage/store.js +16 -7
  981. package/dist/vite/client.d.ts +1 -1
  982. package/dist/vite/client.js +59 -0
  983. package/dist/workspace-connections/index.d.ts +1 -1
  984. package/dist/workspace-connections/index.js +1 -1
  985. package/dist/workspace-connections/store.d.ts +1 -0
  986. package/dist/workspace-connections/store.js +4 -0
  987. package/docs/content/aws-amplify.mdx +179 -0
  988. package/docs/content/client-agent-chat.mdx +1 -1
  989. package/docs/content/deploy-an-app.mdx +2 -1
  990. package/docs/content/deployment.mdx +14 -3
  991. package/docs/content/environment-variables.mdx +1 -0
  992. package/docs/content/template-forms-agent.mdx +65 -0
  993. package/docs/content/template-forms-developers.mdx +220 -65
  994. package/docs/content/template-forms-features.mdx +154 -0
  995. package/docs/content/template-forms-integrations.mdx +40 -0
  996. package/docs/content/template-forms.mdx +49 -36
  997. package/docs/content/template-mail-developers.mdx +3 -3
  998. package/docs/content/toolkit-settings.mdx +3 -3
  999. package/docs/content/webmcp.mdx +31 -12
  1000. package/package.json +3 -3
  1001. package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +4 -0
  1002. package/src/templates/chat/.agents/skills/secrets/SKILL.md +47 -0
  1003. package/src/templates/chat/AGENTS.md +5 -4
  1004. package/src/templates/chat/app/components/layout/Header.tsx +1 -1
  1005. package/src/templates/chat/app/components/layout/Layout.tsx +5 -4
  1006. package/src/templates/chat/app/components/layout/Sidebar.tsx +16 -25
  1007. package/src/templates/chat/app/hooks/use-navigation-state.ts +5 -5
  1008. package/src/templates/chat/app/root.tsx +16 -3
  1009. package/src/templates/chat/app/routes/_index.tsx +17 -74
  1010. package/src/templates/chat/app/routes/chat.$threadId.tsx +1 -1
  1011. package/src/templates/chat/app/routes/home.tsx +94 -0
  1012. package/src/templates/chat/netlify.toml +2 -1
  1013. package/src/templates/chat/public/manifest.json +1 -1
  1014. package/src/templates/chat/server/plugins/auth.ts +1 -0
  1015. package/src/templates/default/.agents/skills/frontend-design/SKILL.md +4 -0
  1016. package/src/templates/default/.agents/skills/secrets/SKILL.md +47 -0
  1017. package/src/templates/default/AGENTS.md +10 -6
  1018. package/src/templates/default/DEVELOPING.md +8 -1
  1019. package/src/templates/default/app/hooks/use-navigation-state.ts +1 -1
  1020. package/src/templates/default/app/root.tsx +10 -3
  1021. package/src/templates/default/app/routes/_index.tsx +10 -86
  1022. package/src/templates/default/app/routes/home.tsx +94 -0
  1023. package/src/templates/default/app/routes/settings.tsx +1 -1
  1024. package/src/templates/default/public/manifest.json +1 -1
  1025. package/src/templates/default/server/plugins/auth.ts +5 -0
  1026. package/src/templates/headless/.agents/skills/secrets/SKILL.md +47 -0
  1027. package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +4 -0
  1028. package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +47 -0
  1029. package/src/templates/workspace-root/.env.example +3 -2
  1030. package/corpus/templates/factory/actions/approve-factory-item.ts +0 -244
  1031. package/corpus/templates/factory/app/components/factory/FactorySourceSettingsGroup.tsx +0 -33
  1032. package/corpus/templates/factory/server/routes/_agent-native/factory/builder-callback.post.ts +0 -116
  1033. package/corpus/templates/factory/server/triage/ai-services-git.ts +0 -205
  1034. package/corpus/templates/factory/server/triage/builder-executor.ts +0 -123
  1035. package/docs/content/template-forms-building-publishing.mdx +0 -135
  1036. package/docs/content/template-forms-responses.mdx +0 -120
  1037. /package/corpus/templates/clips/{server/lib → shared}/upload-interruption.ts +0 -0
@@ -21,6 +21,8 @@ import {
21
21
  getNudgeDelta,
22
22
  getPanForZoomToCursor,
23
23
  getResizeCursorForHandle,
24
+ quantizeCanvasPoint,
25
+ WHOLE_PIXEL_SNAP_STEP,
24
26
  resizeFrameGroupFromDelta,
25
27
  resizeFrameGroupToBounds,
26
28
  resizeRotatedFrameFromDeltaWithSnap,
@@ -29,6 +31,7 @@ import {
29
31
  screenToCanvasPoint,
30
32
  type ArrowNudgeKey,
31
33
  } from "@shared/canvas-math";
34
+ import { resolveLayoutGridSnapStep } from "@shared/layout-grid";
32
35
  import {
33
36
  appendPenNode,
34
37
  clonePenPath,
@@ -197,6 +200,14 @@ const MAX_WHEEL_PAN_DELTA = 240;
197
200
  * element every gesture frame by applyViewToDom. React supplies the same
198
201
  * number as the var's fallback, so first paint and SSR are unaffected. */
199
202
  const CHROME_SCALE_CSS_VAR = "--an-chrome-scale";
203
+
204
+ /** A grid line lives inside the scaled world layer, so it needs the chrome
205
+ * counter-scale to stay hairline instead of fattening as you zoom in. */
206
+ const LAYOUT_GRID_LINE_CSS = `calc(1px * var(${CHROME_SCALE_CSS_VAR}, 1))`;
207
+
208
+ /** Below this on-screen spacing the lines read as a tint, not a grid. Our own
209
+ * call: Figma zoom-gates only its pixel grid and always draws layout guides. */
210
+ const MIN_LAYOUT_GRID_SCREEN_PX = 10;
200
211
  const PIXEL_GRID_ZOOM = 800;
201
212
 
202
213
  function hasScreenChildLayers(content: string): boolean {
@@ -501,6 +512,8 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
501
512
  frameToolDraws = "frame",
502
513
  onDeleteSelection,
503
514
  onNudgeSelection,
515
+ nudgeAmounts,
516
+ layoutGrids,
504
517
  onZoomChange,
505
518
  renderScreenContent,
506
519
  renderBreakpointContent,
@@ -580,6 +593,8 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
580
593
  const onGeometryChangeRef = useRef(onGeometryChange);
581
594
  const onGeometryCommitRef = useRef(onGeometryCommit);
582
595
  const onNudgeSelectionRef = useRef(onNudgeSelection);
596
+ const nudgeAmountsRef = useRef(nudgeAmounts);
597
+ const layoutGridsRef = useRef(layoutGrids);
583
598
  const screensRef = useRef(screens);
584
599
  const [draftPrimitives, setDraftPrimitives] = useState<DraftPrimitive[]>([]);
585
600
  const draftPrimitivesRef = useRef(draftPrimitives);
@@ -1177,6 +1192,44 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
1177
1192
  [getScreenMetadata, metadataById, previewDeviceFrame],
1178
1193
  );
1179
1194
 
1195
+ /** Every board<->content conversion must resolve the viewport here. A second
1196
+ * derivation drew cross-screen drop guides at 4x the hit-test geometry; the
1197
+ * live iframe size beats `resolveScreenMetadata`'s defaulted fallback. */
1198
+ const getFrameViewportSize = useCallback(
1199
+ (screen: ScreenFile): { width: number; height: number } => {
1200
+ const iframe = findCanvasIframeForScreen(
1201
+ surfaceRef.current,
1202
+ getActiveScreenIframeId(screen),
1203
+ boardFileId,
1204
+ );
1205
+ const metadata = getResolvedMetadata(screen);
1206
+ return {
1207
+ width: iframe?.clientWidth || metadata.width,
1208
+ height: iframe?.clientHeight || metadata.height,
1209
+ };
1210
+ },
1211
+ [boardFileId, getResolvedMetadata],
1212
+ );
1213
+
1214
+ /** Board-space step for a gesture inside `frameId`. Scaled because a 1280px
1215
+ * screen shown as a 320px card renders at 0.25, where snapping 8 board px
1216
+ * would commit a 32px content offset. */
1217
+ const resolveBoardSnapStepForFrame = useCallback(
1218
+ (frameId: string | null | undefined): number => {
1219
+ const grids = layoutGridsRef.current;
1220
+ if (!grids || !frameId) return WHOLE_PIXEL_SNAP_STEP;
1221
+ const contentStep = resolveLayoutGridSnapStep(grids, frameId);
1222
+ if (contentStep <= WHOLE_PIXEL_SNAP_STEP) return WHOLE_PIXEL_SNAP_STEP;
1223
+ const screen = screensRef.current.find((item) => item.id === frameId);
1224
+ const geometry = frameGeometryRef.current[frameId];
1225
+ if (!screen || !geometry?.width) return contentStep;
1226
+ const viewport = getFrameViewportSize(screen);
1227
+ const boardPerContentPx = geometry.width / Math.max(1, viewport.width);
1228
+ return contentStep * boardPerContentPx;
1229
+ },
1230
+ [getFrameViewportSize],
1231
+ );
1232
+
1180
1233
  // Per-screen entry-object reuse for canvasFrames (PF21) and per-screen
1181
1234
  // content-node cache for screenContentById (PF21). See the definitions of
1182
1235
  // canvasFrames/screenContentById below for the full invalidation-key
@@ -1209,6 +1262,14 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
1209
1262
  onNudgeSelectionRef.current = onNudgeSelection;
1210
1263
  }, [onNudgeSelection]);
1211
1264
 
1265
+ useEffect(() => {
1266
+ nudgeAmountsRef.current = nudgeAmounts;
1267
+ }, [nudgeAmounts]);
1268
+
1269
+ useEffect(() => {
1270
+ layoutGridsRef.current = layoutGrids;
1271
+ }, [layoutGrids]);
1272
+
1212
1273
  useEffect(() => {
1213
1274
  onPrimitiveReparentRef.current = onPrimitiveReparent;
1214
1275
  }, [onPrimitiveReparent]);
@@ -1878,6 +1939,32 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
1878
1939
  [activeId, getSelectableFrameEntries],
1879
1940
  );
1880
1941
 
1942
+ /** Container hit-tests want "which screen is this object in", and an object
1943
+ * flush against a frame edge misses on its own corner. */
1944
+ const frameGeometryCenter = useCallback(
1945
+ (geometry: FrameGeometry | undefined): Point => ({
1946
+ x: (geometry?.x ?? 0) + (geometry?.width ?? 0) / 2,
1947
+ y: (geometry?.y ?? 0) + (geometry?.height ?? 0) / 2,
1948
+ }),
1949
+ [],
1950
+ );
1951
+
1952
+ /** A screen frame is laid out by the board, which has no grid, so any screen
1953
+ * in the selection keeps the whole-pixel floor. */
1954
+ const resolveSnapStepForTargets = useCallback(
1955
+ (targetIds: readonly string[], center: Point): number => {
1956
+ if (!layoutGridsRef.current) return WHOLE_PIXEL_SNAP_STEP;
1957
+ const movesAFrame = targetIds.some(
1958
+ (targetId) => frameGeometryRef.current[targetId] !== undefined,
1959
+ );
1960
+ if (movesAFrame) return WHOLE_PIXEL_SNAP_STEP;
1961
+ return resolveBoardSnapStepForFrame(
1962
+ getFrameEntryAtPoint(center)?.id ?? null,
1963
+ );
1964
+ },
1965
+ [getFrameEntryAtPoint, resolveBoardSnapStepForFrame],
1966
+ );
1967
+
1881
1968
  // Mirrors getFrameEntryAtPoint above, but hit-tests draft primitives
1882
1969
  // instead of committed screens/frames — used by the alt-hover measurement
1883
1970
  // (Figma parity) so hovering an uncommitted draft while a selection exists
@@ -2067,26 +2154,15 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
2067
2154
  crossScreenLastHitResultRef.current.clear();
2068
2155
  };
2069
2156
 
2070
- // Single source of truth for a target screen's "viewport" dimensions used
2071
- // to scale board<->iframe coordinates. MUST prefer the iframe's live
2072
- // clientWidth/clientHeight over resolveScreenMetadata's DEFAULTED
2073
- // 1280x2560 fallback (used for screens — e.g. duplicated screens — with
2074
- // no screenMetadata entry in designs.data). runHitTest and
2075
- // getTargetLocalPoint already did this correctly; requestCrossScreenDropGuide
2076
- // previously called getResolvedMetadata directly with no iframe fallback,
2077
- // so the drawn guide used different (often wrong-by-4x) geometry than the
2078
- // hit-test that produced it — guides rendered squashed/mispositioned for
2079
- // any screen missing metadata. Centralizing here keeps all three call
2080
- // sites in sync going forward.
2157
+ // Routed through getFrameViewportSize so this effect, the draft-commit
2158
+ // conversion, and grid snapping cannot disagree.
2081
2159
  const getTargetViewportMetadata = (
2082
2160
  targetScreen: (typeof screensRef.current)[number],
2083
2161
  targetIframe: HTMLIFrameElement | null | undefined,
2084
- ): { width: number; height: number } => ({
2085
- width:
2086
- targetIframe?.clientWidth || getResolvedMetadata(targetScreen).width,
2087
- height:
2088
- targetIframe?.clientHeight || getResolvedMetadata(targetScreen).height,
2089
- });
2162
+ ): { width: number; height: number } =>
2163
+ targetIframe?.clientWidth && targetIframe.clientHeight
2164
+ ? { width: targetIframe.clientWidth, height: targetIframe.clientHeight }
2165
+ : getFrameViewportSize(targetScreen);
2090
2166
 
2091
2167
  const runHitTest = (
2092
2168
  candidate: CrossScreenDragTarget,
@@ -2983,6 +3059,7 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
2983
3059
  boardFrameGeometry,
2984
3060
  boardSurfaceRenderGeometry,
2985
3061
  getFrameEntryAtPoint,
3062
+ getFrameViewportSize,
2986
3063
  getCanvasPoint,
2987
3064
  getResolvedMetadata,
2988
3065
  onCrossScreenElementDrop,
@@ -4755,8 +4832,16 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
4755
4832
  e.preventDefault();
4756
4833
  e.stopPropagation();
4757
4834
 
4758
- const originCanvas = getCanvasPoint(e.clientX, e.clientY);
4759
- const originFrameId = getFrameEntryAtPoint(originCanvas)?.id;
4835
+ // Quantized from the first sample: `clientPoint / zoom` is fractional at
4836
+ // every zoom but 100%, and a new object's x/y come straight off these.
4837
+ // The frame resolves from the raw point, which decides the step.
4838
+ const rawOriginCanvas = getCanvasPoint(e.clientX, e.clientY);
4839
+ const originFrameId = getFrameEntryAtPoint(rawOriginCanvas)?.id;
4840
+ const creationSnapStep = resolveBoardSnapStepForFrame(originFrameId);
4841
+ const originCanvas = quantizeCanvasPoint(
4842
+ rawOriginCanvas,
4843
+ creationSnapStep,
4844
+ );
4760
4845
  const initialGeometry = getDraftPreviewGeometryForTool(
4761
4846
  tool,
4762
4847
  originCanvas,
@@ -4790,7 +4875,10 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
4790
4875
  const handleMouseMove = (ev: MouseEvent) => {
4791
4876
  const state = dragState.current;
4792
4877
  if (!state || state.type !== "draft-create") return;
4793
- const nextCanvas = getCanvasPoint(ev.clientX, ev.clientY);
4878
+ const nextCanvas = quantizeCanvasPoint(
4879
+ getCanvasPoint(ev.clientX, ev.clientY),
4880
+ creationSnapStep,
4881
+ );
4794
4882
  if (
4795
4883
  !state.hasMoved &&
4796
4884
  Math.hypot(
@@ -4830,7 +4918,10 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
4830
4918
  return;
4831
4919
  }
4832
4920
 
4833
- const endCanvas = getCanvasPoint(ev.clientX, ev.clientY);
4921
+ const endCanvas = quantizeCanvasPoint(
4922
+ getCanvasPoint(ev.clientX, ev.clientY),
4923
+ creationSnapStep,
4924
+ );
4834
4925
  const canvasMoved =
4835
4926
  Math.hypot(
4836
4927
  endCanvas.x - state.originCanvas.x,
@@ -4944,6 +5035,7 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
4944
5035
  installDragListeners,
4945
5036
  onActiveToolChange,
4946
5037
  onCreateScreenFrame,
5038
+ resolveBoardSnapStepForFrame,
4947
5039
  toolProps,
4948
5040
  ],
4949
5041
  );
@@ -5051,7 +5143,10 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
5051
5143
  thresholdScreenPx: DEFAULT_SNAP_THRESHOLD_SCREEN_PX,
5052
5144
  zoom: zoomRef.current,
5053
5145
  bypass: ev.metaKey || ev.ctrlKey,
5054
- pixelGrid: true,
5146
+ snapStep: resolveSnapStepForTargets(
5147
+ state.targetIds,
5148
+ frameGeometryCenter(movingEntries[0]?.geometry),
5149
+ ),
5055
5150
  lockedAxes: ev.shiftKey ? { x: dx === 0, y: dy === 0 } : undefined,
5056
5151
  });
5057
5152
 
@@ -5268,6 +5363,8 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
5268
5363
  updatePrimitiveDropTarget,
5269
5364
  updateSelectedDraftIds,
5270
5365
  updateSelectedIds,
5366
+ frameGeometryCenter,
5367
+ resolveSnapStepForTargets,
5271
5368
  ],
5272
5369
  );
5273
5370
 
@@ -5378,6 +5475,10 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
5378
5475
  thresholdScreenPx: DEFAULT_SNAP_THRESHOLD_SCREEN_PX,
5379
5476
  zoom: zoomRef.current,
5380
5477
  bypass: ev.metaKey || ev.ctrlKey,
5478
+ snapStep: resolveSnapStepForTargets(
5479
+ state.targetIds,
5480
+ frameGeometryCenter(resized.bounds),
5481
+ ),
5381
5482
  },
5382
5483
  );
5383
5484
  const resizedEntries = resizeFrameGroupToBounds(
@@ -5485,6 +5586,8 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
5485
5586
  updateDraftPrimitivesRefOnly,
5486
5587
  updateSelectedDraftIds,
5487
5588
  updateSelectedIds,
5589
+ frameGeometryCenter,
5590
+ resolveSnapStepForTargets,
5488
5591
  ],
5489
5592
  );
5490
5593
 
@@ -5861,7 +5964,10 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
5861
5964
  thresholdScreenPx: DEFAULT_SNAP_THRESHOLD_SCREEN_PX,
5862
5965
  zoom: zoomRef.current,
5863
5966
  bypass: ev.metaKey || ev.ctrlKey,
5864
- pixelGrid: true,
5967
+ snapStep: resolveSnapStepForTargets(
5968
+ state.targetIds,
5969
+ frameGeometryCenter(movingEntries[0]?.geometry),
5970
+ ),
5865
5971
  lockedAxes: ev.shiftKey ? { x: dx === 0, y: dy === 0 } : undefined,
5866
5972
  });
5867
5973
 
@@ -6068,6 +6174,8 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
6068
6174
  updatePrimitiveDropTarget,
6069
6175
  updateSelectedDraftIds,
6070
6176
  updateSelectedIds,
6177
+ frameGeometryCenter,
6178
+ resolveSnapStepForTargets,
6071
6179
  ],
6072
6180
  );
6073
6181
 
@@ -6381,6 +6489,10 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
6381
6489
  // K-scale (aspect-locked) resize away from its ratio — see
6382
6490
  // computeAspectPreservingResizeSnap in canvas-math.ts.
6383
6491
  preserveAspectRatio: lockAspectRatio,
6492
+ snapStep: resolveSnapStepForTargets(
6493
+ state.targetIds,
6494
+ frameGeometryCenter(resized.bounds),
6495
+ ),
6384
6496
  },
6385
6497
  );
6386
6498
  const resizedEntries = resizeFrameGroupToBounds(
@@ -6449,6 +6561,8 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
6449
6561
  updateFrameGeometry,
6450
6562
  updateFrameGeometryRefOnly,
6451
6563
  updateSelectedIds,
6564
+ frameGeometryCenter,
6565
+ resolveSnapStepForTargets,
6452
6566
  ],
6453
6567
  );
6454
6568
 
@@ -7585,12 +7699,19 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
7585
7699
  event.preventDefault();
7586
7700
  event.stopPropagation();
7587
7701
 
7588
- const nudge = getNudgeDelta(event.key, {
7589
- altKey: event.altKey,
7590
- ctrlKey: event.ctrlKey,
7591
- metaKey: event.metaKey,
7592
- shiftKey: event.shiftKey,
7593
- });
7702
+ const nudge = getNudgeDelta(
7703
+ event.key,
7704
+ {
7705
+ altKey: event.altKey,
7706
+ ctrlKey: event.ctrlKey,
7707
+ metaKey: event.metaKey,
7708
+ shiftKey: event.shiftKey,
7709
+ },
7710
+ {
7711
+ baseStep: nudgeAmountsRef.current?.small,
7712
+ bigStep: nudgeAmountsRef.current?.big,
7713
+ },
7714
+ );
7594
7715
  const movingFrameEntries = targetIds.map((targetId) => {
7595
7716
  const origin = frameGeometryRef.current[targetId];
7596
7717
  return {
@@ -8100,6 +8221,24 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
8100
8221
  selectedLayerSelectorGroupsByScreen,
8101
8222
  ]);
8102
8223
 
8224
+ /** Uses the same content->board scale as the snap: lines that sit anywhere
8225
+ * other than where objects land are worse than no lines. 0 means no paint. */
8226
+ const layoutGridBoardSizeById = useMemo(() => {
8227
+ const sizes: Record<string, number> = {};
8228
+ if (!layoutGrids) return sizes;
8229
+ const scale = canvasZoom / 100;
8230
+ for (const { screen, metadata, geometry } of canvasFrames) {
8231
+ const grid = layoutGrids[screen.id];
8232
+ if (!grid?.visible || !geometry.width) continue;
8233
+ const viewport = getScreenPreviewViewport(metadata, geometry);
8234
+ const boardSize =
8235
+ grid.size * (geometry.width / Math.max(1, viewport.viewportWidth));
8236
+ if (boardSize * scale < MIN_LAYOUT_GRID_SCREEN_PX) continue;
8237
+ sizes[screen.id] = boardSize;
8238
+ }
8239
+ return sizes;
8240
+ }, [canvasFrames, canvasZoom, layoutGrids]);
8241
+
8103
8242
  // Resolve a bounded live-context allocation from the committed camera. The
8104
8243
  // overscan still makes imminent pan destinations live early; unlike the old
8105
8244
  // one-way hasBeenVisible Set, however, the LRU pool cannot grow forever.
@@ -8523,6 +8662,7 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
8523
8662
  return (
8524
8663
  <Screen
8525
8664
  key={screen.id}
8665
+ layoutGridBoardSize={layoutGridBoardSizeById[screen.id] ?? 0}
8526
8666
  screen={screen}
8527
8667
  metadata={metadata}
8528
8668
  geometry={geometry}
@@ -9948,9 +10088,13 @@ interface ScreenProps {
9948
10088
  ) => void;
9949
10089
  /** Item 8b — full-view entry for one breakpoint frame. */
9950
10090
  onEditBreakpoint?: (screenId: string, widthPx: number) => void;
10091
+ /** Board-space cell size for this frame's layout grid, already converted
10092
+ * from content px. 0 means draw nothing. */
10093
+ layoutGridBoardSize?: number;
9951
10094
  }
9952
10095
 
9953
10096
  const Screen = memo(function Screen({
10097
+ layoutGridBoardSize = 0,
9954
10098
  screen,
9955
10099
  metadata,
9956
10100
  geometry,
@@ -10384,6 +10528,18 @@ const Screen = memo(function Screen({
10384
10528
  />
10385
10529
  ))
10386
10530
  )}
10531
+ {layoutGridBoardSize > 0 ? (
10532
+ <span
10533
+ data-layout-grid={screen.id}
10534
+ data-layout-grid-size={layoutGridBoardSize}
10535
+ aria-hidden="true"
10536
+ className="pointer-events-none absolute inset-0 z-10"
10537
+ style={{
10538
+ backgroundImage: `linear-gradient(to right, var(--design-editor-layout-grid-color) ${LAYOUT_GRID_LINE_CSS}, transparent ${LAYOUT_GRID_LINE_CSS}), linear-gradient(to bottom, var(--design-editor-layout-grid-color) ${LAYOUT_GRID_LINE_CSS}, transparent ${LAYOUT_GRID_LINE_CSS})`,
10539
+ backgroundSize: `${layoutGridBoardSize}px ${layoutGridBoardSize}px`,
10540
+ }}
10541
+ />
10542
+ ) : null}
10387
10543
  {creationToolActive ? (
10388
10544
  <span
10389
10545
  className="pointer-events-auto absolute inset-0 z-20 cursor-crosshair"
@@ -89,16 +89,16 @@ export function ReviewCommentsPanel({
89
89
  onValueChange={(value) => setScope(value as "screen" | "all")}
90
90
  className="w-full"
91
91
  >
92
- <TabsList className="grid h-8 w-full grid-cols-2 rounded-md bg-muted p-0.5">
92
+ <TabsList className="grid min-h-[var(--design-control-height)] w-full grid-cols-2 rounded-md bg-muted p-0.5">
93
93
  <TabsTrigger
94
94
  value="screen"
95
- className="design-sidebar-section-title h-7 px-2"
95
+ className="design-sidebar-section-title min-h-[var(--design-control-height)] px-2"
96
96
  >
97
97
  {t("review.thisScreen")}
98
98
  </TabsTrigger>
99
99
  <TabsTrigger
100
100
  value="all"
101
- className="design-sidebar-section-title h-7 px-2"
101
+ className="design-sidebar-section-title min-h-[var(--design-control-height)] px-2"
102
102
  >
103
103
  {t("review.allScreens")}
104
104
  </TabsTrigger>
@@ -111,7 +111,7 @@ export function ReviewCommentsPanel({
111
111
  asChild
112
112
  variant="outline"
113
113
  size="sm"
114
- className="mx-3 mt-3 h-8 shrink-0"
114
+ className="mx-2 mt-2 min-h-[var(--design-row-height)] shrink-0"
115
115
  >
116
116
  <a href={signInHref}>{t("review.signInToComment")}</a>
117
117
  </Button>
@@ -379,7 +379,7 @@ function A11ySection({
379
379
 
380
380
  return (
381
381
  <section aria-labelledby="review-a11y-heading">
382
- <div className="flex h-7 items-center justify-between gap-2">
382
+ <div className="flex min-h-[var(--design-row-height)] items-center justify-between gap-2">
383
383
  <div className="flex items-center gap-1.5">
384
384
  <IconShieldCheck className="size-3.5 text-muted-foreground" />
385
385
  <span
@@ -9973,8 +9973,12 @@ declare var __INITIAL_SOURCE_HEAD__: string;
9973
9973
  }
9974
9974
  var currentLeft = readPx(htmlEl.style.left || cs.left);
9975
9975
  var currentTop = readPx(htmlEl.style.top || cs.top);
9976
- htmlEl.style.left = currentLeft + (oldOriginX - newOriginX) + "px";
9977
- htmlEl.style.top = currentTop + (oldOriginY - newOriginY) + "px";
9976
+ // Both origins come from getBoundingClientRect, so the raw difference is
9977
+ // subpixel and would be authored as one.
9978
+ htmlEl.style.left =
9979
+ Math.round(currentLeft + (oldOriginX - newOriginX)) + "px";
9980
+ htmlEl.style.top =
9981
+ Math.round(currentTop + (oldOriginY - newOriginY)) + "px";
9978
9982
  }
9979
9983
 
9980
9984
  /** Convert flow members to absolute positioning at their drag release point
@@ -10083,8 +10087,10 @@ declare var __INITIAL_SOURCE_HEAD__: string;
10083
10087
  }
10084
10088
  var localDx = (clientDx * yy - yx * clientDy) / determinant;
10085
10089
  var localDy = (xx * clientDy - clientDx * xy) / determinant;
10086
- htmlEl.style.left = baseLeft + localDx + "px";
10087
- htmlEl.style.top = baseTop + localDy + "px";
10090
+ // The exact client point is worth at most a subpixel here, and paying for
10091
+ // it in a fractional authored left/top is the wrong trade.
10092
+ htmlEl.style.left = Math.round(baseLeft + localDx) + "px";
10093
+ htmlEl.style.top = Math.round(baseTop + localDy) + "px";
10088
10094
  }
10089
10095
 
10090
10096
  function applyRuntimeReorder(el, target) {
@@ -10270,6 +10276,15 @@ declare var __INITIAL_SOURCE_HEAD__: string;
10270
10276
  // base converted to content px at snap time via chromeLineScale (1/zoom) to
10271
10277
  // keep the snap tolerance constant on screen at any zoom.
10272
10278
  var SNAP_THRESHOLD_PX = 6;
10279
+
10280
+ /** This screen's layout grid step in content px, pushed by the host. 1 means
10281
+ * no grid, which is the whole-pixel floor every gesture already lands on. */
10282
+ var layoutGridStep = 1;
10283
+
10284
+ function quantizeToLayoutGrid(value: number): number {
10285
+ if (!(layoutGridStep > 1)) return Math.round(value);
10286
+ return Math.round(value / layoutGridStep) * layoutGridStep;
10287
+ }
10273
10288
  var SNAP_CANDIDATE_CAP = 200;
10274
10289
 
10275
10290
  // Accepts either a real DOMRect (getBoundingClientRect()) or a plain
@@ -12285,8 +12300,10 @@ declare var __INITIAL_SOURCE_HEAD__: string;
12285
12300
  var appliedDx = nextLeft - originLeft;
12286
12301
  var appliedDy = nextTop - originTop;
12287
12302
  memberStates.forEach(function (state) {
12288
- state.el.style.left = Math.round(state.originLeft + appliedDx) + "px";
12289
- state.el.style.top = Math.round(state.originTop + appliedDy) + "px";
12303
+ state.el.style.left =
12304
+ quantizeToLayoutGrid(state.originLeft + appliedDx) + "px";
12305
+ state.el.style.top =
12306
+ quantizeToLayoutGrid(state.originTop + appliedDy) + "px";
12290
12307
  });
12291
12308
  if (!duplicatedForDrag && !isGroupDrag) {
12292
12309
  scheduleCrossScreenDragMove(ev);
@@ -12841,15 +12858,17 @@ declare var __INITIAL_SOURCE_HEAD__: string;
12841
12858
  var rect = nextRect(ev);
12842
12859
  if (rect.touchesWidth) widthTouched = true;
12843
12860
  if (rect.touchesHeight) heightTouched = true;
12844
- resizeEl.style.left = Math.round(rect.left) + "px";
12845
- resizeEl.style.top = Math.round(rect.top) + "px";
12861
+ resizeEl.style.left = quantizeToLayoutGrid(rect.left) + "px";
12862
+ resizeEl.style.top = quantizeToLayoutGrid(rect.top) + "px";
12846
12863
  // Only write width/height for an axis this gesture actually touched —
12847
12864
  // writing the untouched axis every tick (even to its own unchanged
12848
12865
  // origin value) would silently convert e.g. `width: 100%` to a px
12849
12866
  // value on a pure vertical drag, which is exactly the "shrank instead
12850
12867
  // of preserved" class of bug this fixes.
12851
- if (widthTouched) resizeEl.style.width = Math.round(rect.width) + "px";
12852
- if (heightTouched) resizeEl.style.height = Math.round(rect.height) + "px";
12868
+ if (widthTouched)
12869
+ resizeEl.style.width = quantizeToLayoutGrid(rect.width) + "px";
12870
+ if (heightTouched)
12871
+ resizeEl.style.height = quantizeToLayoutGrid(rect.height) + "px";
12853
12872
  if (scaleToolEnabled) {
12854
12873
  // Uniform scale factor: scaleToolEnabled already forces the
12855
12874
  // aspect-ratio lock above (nextRect), so width/origin.width and
@@ -14844,6 +14863,12 @@ declare var __INITIAL_SOURCE_HEAD__: string;
14844
14863
  // set-read-only: toggle the bridge's readOnly state in-place without a reload.
14845
14864
  // When readOnly becomes true the shield/selection/drag/edit entry points are
14846
14865
  // gated so the surface is safe for background/inactive display use.
14866
+ if (e.data.type === "set-layout-grid-step") {
14867
+ var nextStep = Number(e.data.step);
14868
+ layoutGridStep =
14869
+ Number.isFinite(nextStep) && nextStep >= 1 ? nextStep : 1;
14870
+ return;
14871
+ }
14847
14872
  if (e.data.type === "set-read-only") {
14848
14873
  var nextReadOnly = !!e.data.readOnly;
14849
14874
  if (readOnly === nextReadOnly) return;
@@ -13,13 +13,13 @@
13
13
  * drawn with no explicit color should look the same (a soft Figma-like
14
14
  * gray) regardless of which document theme it lands in, rather than
15
15
  * silently tinting to whatever `--primary` resolves to there.
16
- * - Stroke (rect/ellipse): `rgb(168 168 168)` — a slightly darker plain gray,
17
- * same rationale as fill above.
16
+ * - Stroke (rect/ellipse): none by default. Selection chrome supplies the
17
+ * temporary outline while a user-chosen stroke is still preserved.
18
18
  * - Frame fill: the one default that *is* theme-adaptive —
19
19
  * `hsl(var(--primary) / 0.05)`, a very faint tint of the editor's accent
20
20
  * color so a layout frame's interior reads as "structural chrome" rather
21
21
  * than a fixed gray. Its border stays a plain dashed gray, same as
22
- * rect/ellipse's border.
22
+ * a plain dashed gray border.
23
23
  * - Stroke width: 1px for div-based shapes.
24
24
  * - Ellipse: borderRadius "50%" in both paths — no more "oval on commit" jump.
25
25
  * - Rect: borderRadius "2px" (small, matches the previous committed value; the
@@ -72,14 +72,14 @@ export interface CanvasPrimitiveVisual {
72
72
  /** Default fill — a soft Figma-like neutral gray. */
73
73
  const DEFAULT_FILL = "rgb(218 218 218)";
74
74
 
75
- /** Default stroke — slightly darker so new rectangles stay visible. */
75
+ /** Default stroke used when a caller explicitly enables a stroke. */
76
76
  const DEFAULT_STROKE = "rgb(168 168 168)";
77
77
 
78
78
  /** Stroke width in pixels for div-based shapes. */
79
79
  const DEFAULT_STROKE_WIDTH_PX = 1;
80
80
 
81
- /** Border shorthand shared by rect + ellipse. */
82
- const DEFAULT_BORDER = `${DEFAULT_STROKE_WIDTH_PX}px solid ${DEFAULT_STROKE}`;
81
+ /** Shapes start un-stroked; selection chrome owns their temporary outline. */
82
+ const NO_BORDER = "0 solid transparent";
83
83
 
84
84
  /** Text nodes rely on editor chrome for outlines; the element itself is bare. */
85
85
  const TEXT_BORDER = "0 solid transparent";
@@ -134,7 +134,7 @@ export function canvasPrimitiveVisual(
134
134
  case "ellipse":
135
135
  return {
136
136
  background: DEFAULT_FILL,
137
- border: DEFAULT_BORDER,
137
+ border: NO_BORDER,
138
138
  borderRadius: "50%",
139
139
  };
140
140
  case "frame":
@@ -155,7 +155,7 @@ export function canvasPrimitiveVisual(
155
155
  default:
156
156
  return {
157
157
  background: DEFAULT_FILL,
158
- border: DEFAULT_BORDER,
158
+ border: NO_BORDER,
159
159
  borderRadius: RECT_RADIUS,
160
160
  };
161
161
  }
@@ -236,7 +236,9 @@ export function canvasPrimitiveReactStyle(
236
236
 
237
237
  let background = v.background as string | undefined;
238
238
  let borderColor: string | undefined;
239
- let borderWidth: number | string | undefined = DEFAULT_STROKE_WIDTH_PX;
239
+ let borderWidth: number | string | undefined = v.border.startsWith("0 ")
240
+ ? 0
241
+ : DEFAULT_STROKE_WIDTH_PX;
240
242
  let borderStyle: string | undefined = "solid";
241
243
 
242
244
  if (kind === "frame" || isText) {
@@ -260,6 +262,11 @@ export function canvasPrimitiveReactStyle(
260
262
  }
261
263
  if (overrides?.stroke) {
262
264
  borderColor = overrides.stroke;
265
+ if (overrides.strokeWidth === undefined) {
266
+ borderWidth = DEFAULT_STROKE_WIDTH_PX;
267
+ }
268
+ } else if (overrides?.strokeWidth !== undefined) {
269
+ borderColor = DEFAULT_STROKE;
263
270
  } else {
264
271
  // Extract from canonical border shorthand: "Npx style color"
265
272
  const borderParts = v.border.split(" ");