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

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 +20 -5
  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 +161 -36
  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/dashboard-storage/index.d.ts +1 -1
  821. package/dist/dashboard-storage/schema.d.ts +19 -0
  822. package/dist/dashboard-storage/schema.js +1 -0
  823. package/dist/dashboard-storage/store.d.ts +9 -0
  824. package/dist/dashboard-storage/store.js +93 -3
  825. package/dist/deploy/build.d.ts +19 -3
  826. package/dist/deploy/build.js +262 -10
  827. package/dist/index.browser.d.ts +1 -1
  828. package/dist/index.browser.js +1 -1
  829. package/dist/index.d.ts +1 -1
  830. package/dist/index.js +1 -1
  831. package/dist/ingestion/media.js +7 -2
  832. package/dist/integrations/config-store.js +2 -4
  833. package/dist/integrations/google-docs-poller.d.ts +1 -1
  834. package/dist/integrations/google-docs-poller.js +100 -24
  835. package/dist/integrations/plugin.js +45 -15
  836. package/dist/integrations/webhook-handler.js +2 -1
  837. package/dist/jobs/background-automation-runner.js +17 -1
  838. package/dist/localization/core-messages/ar-SA.js +19 -0
  839. package/dist/localization/core-messages/de-DE.js +19 -0
  840. package/dist/localization/core-messages/en-US.d.ts +19 -0
  841. package/dist/localization/core-messages/en-US.js +19 -0
  842. package/dist/localization/core-messages/es-ES.js +19 -0
  843. package/dist/localization/core-messages/fr-FR.js +19 -0
  844. package/dist/localization/core-messages/hi-IN.js +19 -0
  845. package/dist/localization/core-messages/ja-JP.js +19 -0
  846. package/dist/localization/core-messages/ko-KR.js +19 -0
  847. package/dist/localization/core-messages/pt-BR.js +19 -0
  848. package/dist/localization/core-messages/zh-CN.js +19 -0
  849. package/dist/localization/core-messages/zh-TW.js +19 -0
  850. package/dist/localization/core-messages.d.ts +19 -0
  851. package/dist/localization/default-messages.d.ts +11 -0
  852. package/dist/localization/default-messages.js +11 -0
  853. package/dist/mcp/analytics.d.ts +103 -0
  854. package/dist/mcp/analytics.js +204 -0
  855. package/dist/mcp/build-server.d.ts +7 -0
  856. package/dist/mcp/build-server.js +132 -35
  857. package/dist/mcp/screen-memory-stdio.d.ts +7 -7
  858. package/dist/mcp/server.js +37 -8
  859. package/dist/mcp/stdio.js +1 -0
  860. package/dist/mcp-client/errors.js +30 -10
  861. package/dist/mcp-client/oauth-routes.d.ts +7 -2
  862. package/dist/mcp-client/oauth-routes.js +12 -3
  863. package/dist/mcp-client/routes.js +2 -1
  864. package/dist/oauth-tokens/store.js +6 -3
  865. package/dist/observability/routes.d.ts +5 -5
  866. package/dist/observability/routes.js +8 -2
  867. package/dist/observability/store.d.ts +1 -1
  868. package/dist/observability/store.js +18 -3
  869. package/dist/observability/types.d.ts +1 -0
  870. package/dist/onboarding/plugin.js +16 -4
  871. package/dist/progress/routes.d.ts +1 -1
  872. package/dist/provider-api/actions/custom-provider-registration.d.ts +16 -16
  873. package/dist/provider-api/actions/provider-api.d.ts +12 -12
  874. package/dist/resources/handlers.d.ts +2 -2
  875. package/dist/secrets/routes.d.ts +9 -9
  876. package/dist/server/action-routes.d.ts +1 -6
  877. package/dist/server/action-routes.js +61 -18
  878. package/dist/server/agent-chat/plugin-options.d.ts +8 -1
  879. package/dist/server/agent-chat-plugin.d.ts +3 -0
  880. package/dist/server/agent-chat-plugin.js +49 -4
  881. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  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 +18 -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/release-migrations.js +48 -0
  924. package/dist/server/request-context.d.ts +2 -0
  925. package/dist/server/request-context.js +7 -2
  926. package/dist/server/self-dispatch.js +5 -0
  927. package/dist/server/sentry.js +5 -0
  928. package/dist/server/ssr-handler.js +5 -0
  929. package/dist/server/transcribe-voice.d.ts +1 -1
  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
@@ -4,10 +4,6 @@ import {
4
4
  IconCopy,
5
5
  IconLink,
6
6
  IconLoader2,
7
- IconPlayerPauseFilled,
8
- IconPlayerPlayFilled,
9
- IconRefresh,
10
- IconTrash,
11
7
  IconX,
12
8
  } from "@tabler/icons-react";
13
9
  import { invoke } from "@tauri-apps/api/core";
@@ -17,9 +13,12 @@ import { currentMonitor, getCurrentWindow } from "@tauri-apps/api/window";
17
13
  import { writeText } from "@tauri-apps/plugin-clipboard-manager";
18
14
  import { open as openExternal } from "@tauri-apps/plugin-shell";
19
15
  import { useEffect, useRef, useState } from "react";
20
- import type { FocusEvent } from "react";
21
- import { flushSync } from "react-dom";
22
16
 
17
+ import { RecordingPlayhead } from "../../../shared/recording-playhead";
18
+ import type {
19
+ RecordingPlayheadConfirmChange,
20
+ RecordingPlayheadIntent,
21
+ } from "../../../shared/recording-playhead";
23
22
  import { LiveWaveform } from "../components/live-waveform";
24
23
  import {
25
24
  completionCardState,
@@ -33,15 +32,13 @@ import type {
33
32
  import { toolbarEnabledEffect } from "../lib/pill-session";
34
33
  import type { PillMode } from "../lib/pill-session";
35
34
 
36
- const SEG_MS = 180;
37
- const HOVER_INTENT_MS = 150;
38
35
  // Within this distance of the right screen edge the pill anchors its RIGHT
39
36
  // edge and grows left instead, so growth never runs off-screen.
40
37
  const RIGHT_EDGE_ANCHOR_PX = 200;
38
+ const NATIVE_LAYOUT_GUARD_MS = 1_500;
39
+ const USER_DRAG_ARM_TIMEOUT_MS = 1_000;
41
40
  const FINALIZING_RESULT_STORAGE_KEY = "clips-finalizing-result";
42
41
 
43
- type Seg = "mid" | "q" | "del" | "res" | "extras";
44
-
45
42
  type RecorderSession = {
46
43
  viewUrl?: string | null;
47
44
  recordingId?: string | null;
@@ -131,20 +128,10 @@ export function RecordingPill() {
131
128
  const [paused, setPaused] = useState(false);
132
129
  const [elapsed, setElapsed] = useState(0);
133
130
  const [enabled, setEnabled] = useState(demoMode);
131
+ const [toolbarVisible, setToolbarVisible] = useState(true);
134
132
  /** Demo harness only: the meter reads capture events in the real app. */
135
133
  const [demoLevel, setDemoLevel] = useState<number | null>(null);
136
134
  const [announcement, setAnnouncement] = useState("");
137
- const [confirmQuestion, setConfirmQuestion] = useState("");
138
- // What the confirm's action button does. Both intents share the confirm
139
- // strip, but only delete is destructive-red; restart is a start-fresh
140
- // action and wears the pill's white affirmative treatment, same family
141
- // as Stop.
142
- const [confirmIntent, setConfirmIntent] = useState<"delete" | "restart">(
143
- "delete",
144
- );
145
- // Whether the delete confirm was entered from an already-paused recording:
146
- // Esc then backs out to that pause, while the Resume button always resumes.
147
- const confirmFromPausedRef = useRef(false);
148
135
  const [doneStage, setDoneStage] = useState<DoneStage>("finishing");
149
136
  const [doneDurationMs, setDoneDurationMs] = useState(0);
150
137
  const [copied, setCopied] = useState(false);
@@ -161,29 +148,25 @@ export function RecordingPill() {
161
148
  const reducedRef = useRef(
162
149
  window.matchMedia("(prefers-reduced-motion: reduce)").matches,
163
150
  );
164
- const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
165
151
  const revealedRef = useRef(false);
166
152
  const fallbackTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
167
- const shrinkTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
168
153
  const stallTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
169
154
  const animatingUntilRef = useRef(0);
155
+ const userDragActiveRef = useRef(false);
156
+ const userDragArmedRef = useRef(false);
157
+ const userDragGenerationRef = useRef(0);
158
+ const userDragChangeRef = useRef(0);
159
+ const userDragMarkerTimerRef = useRef<ReturnType<typeof setTimeout> | null>(
160
+ null,
161
+ );
162
+ const toolbarDismissedRef = useRef(false);
170
163
  const pauseTransitionRef = useRef<"pause" | "resume" | null>(null);
171
164
  const pauseTransitionTimerRef = useRef<ReturnType<typeof setTimeout> | null>(
172
165
  null,
173
166
  );
167
+ const playheadConfirmOpenRef = useRef(false);
174
168
 
175
- const settleBatchRef = useRef(0);
176
- const pendingSegsRef = useRef<Set<Seg>>(new Set());
177
- const finishSettleRef = useRef<(() => void) | null>(null);
178
- const pillRef = useRef<HTMLDivElement | null>(null);
179
169
  const cardRef = useRef<HTMLDivElement | null>(null);
180
- const segRefs = useRef<Record<Seg, HTMLSpanElement | null>>({
181
- mid: null,
182
- q: null,
183
- del: null,
184
- res: null,
185
- extras: null,
186
- });
187
170
 
188
171
  modeRef.current = mode;
189
172
  elapsedRef.current = elapsed;
@@ -197,41 +180,6 @@ export function RecordingPill() {
197
180
  }
198
181
  }
199
182
 
200
- // ---- segment motion: measure natural width, animate exact pixels ----
201
-
202
- function segInnerWidth(k: Seg): number {
203
- const el = segRefs.current[k];
204
- const inner = el?.firstElementChild as HTMLElement | null;
205
- if (!inner) return 0;
206
- return Math.ceil(inner.getBoundingClientRect().width);
207
- }
208
-
209
- function segCurrentWidth(k: Seg): number {
210
- const el = segRefs.current[k];
211
- if (!el) return 0;
212
- return el.getBoundingClientRect().width;
213
- }
214
-
215
- function setSeg(k: Seg, open: boolean, delayMs = 0) {
216
- const el = segRefs.current[k];
217
- if (!el) return;
218
- // A segment that still sits at `auto` (the Stop capsule before its first
219
- // collapse) cannot animate FROM auto — snap it to its measured pixels
220
- // and force a reflow so the width transition has a number to leave from.
221
- if (!open && (!el.style.width || el.style.width === "auto")) {
222
- el.style.transition = "none";
223
- el.style.width = `${segCurrentWidth(k)}px`;
224
- void el.offsetWidth;
225
- }
226
- const reduced = reducedRef.current;
227
- el.style.transition = reduced
228
- ? "none"
229
- : `width ${SEG_MS}ms var(--pill-ease), opacity ${SEG_MS}ms ease`;
230
- el.style.transitionDelay = reduced ? "0ms" : `${delayMs}ms`;
231
- el.style.width = open ? `${segInnerWidth(k)}px` : "0px";
232
- el.style.opacity = open ? "1" : "0";
233
- }
234
-
235
183
  // Native window ops run strictly one at a time. Concurrent
236
184
  // setSize/setPosition sequences read stale rects out from under each other
237
185
  // and strand the window clipped and offset (a half-cut pill with content
@@ -256,6 +204,9 @@ export function RecordingPill() {
256
204
  function resizeWindowTo(contentW: number, contentH: number) {
257
205
  if (!hasTauri) return;
258
206
  queueWindowOp(async () => {
207
+ // Tauri emits `moved` for these programmatic anchor corrections too;
208
+ // keep them out of the persisted user drag position.
209
+ animatingUntilRef.current = Date.now() + NATIVE_LAYOUT_GUARD_MS;
259
210
  const win = getCurrentWindow();
260
211
  const [pos, size, scale, monitor] = await Promise.all([
261
212
  win.outerPosition(),
@@ -292,136 +243,21 @@ export function RecordingPill() {
292
243
  }
293
244
 
294
245
  function syncWindowToContent() {
295
- const el =
296
- (mode === "done" ? cardRef.current : pillRef.current) ?? pillRef.current;
246
+ const el = cardRef.current;
297
247
  if (!el) return;
298
248
  // offsetWidth/Height are layout metrics, immune to the card's scale-in
299
249
  // entrance — a rect measured mid-animation locks the window too narrow.
300
250
  resizeWindowTo(el.offsetWidth, el.offsetHeight);
301
251
  }
302
252
 
303
- // Which segments are (or are animating toward) open. Live rects mid-flight
304
- // under-measure a transition target, so the window budget is computed from
305
- // this intent instead of from the DOM.
306
- const openSegsRef = useRef<Record<Seg, boolean>>({
307
- mid: true,
308
- q: false,
309
- del: false,
310
- res: false,
311
- extras: false,
312
- });
313
-
314
- /**
315
- * Run one choreographed set of segment transitions: pre-grow the window to
316
- * the post-transition budget (plus slack) so nothing clips, start every
317
- * segment's width+opacity bar, then shrink to the exact measured rect once
318
- * the last bar lands.
319
- */
320
- function transitionSegs(changes: Array<[Seg, boolean, number]>) {
321
- const pill = pillRef.current;
322
- if (!pill) return;
323
- for (const [k, open] of changes) openSegsRef.current[k] = open;
324
- const pillW = pill.getBoundingClientRect().width;
325
- const segsW = (Object.keys(openSegsRef.current) as Seg[]).reduce(
326
- (sum, k) => sum + segCurrentWidth(k),
327
- 0,
328
- );
329
- const staticW = pillW - segsW;
330
- const targetW = (Object.keys(openSegsRef.current) as Seg[]).reduce(
331
- (sum, k) => sum + (openSegsRef.current[k] ? segInnerWidth(k) : 0),
332
- staticW,
333
- );
334
- const maxDelay = changes.reduce((m, [, , d]) => Math.max(m, d), 0);
335
- const settleMs = reducedRef.current ? 16 : SEG_MS + maxDelay + 40;
336
- animatingUntilRef.current = Date.now() + settleMs;
337
- if (shrinkTimerRef.current) clearTimeout(shrinkTimerRef.current);
338
- // Budget the window for whichever is wider, plus slack for measurement
339
- // rounding — the settle pass snaps to the exact rect.
340
- resizeWindowTo(
341
- Math.ceil(Math.max(pillW, targetW)) + 12,
342
- Math.ceil(pill.getBoundingClientRect().height),
343
- );
344
- // The settle is driven by the transitions actually ending, not by a
345
- // timer — a throttled clock runs them late, and snapping on a fixed
346
- // schedule cuts the choreography off mid-motion.
347
- const batch = ++settleBatchRef.current;
348
- pendingSegsRef.current.clear();
349
- for (const [k, open, delay] of changes) {
350
- const before = segCurrentWidth(k);
351
- setSeg(k, open, delay);
352
- const el = segRefs.current[k];
353
- const after = el ? Number.parseFloat(el.style.width) : before;
354
- if (!reducedRef.current && Math.abs(after - before) > 0.5) {
355
- pendingSegsRef.current.add(k);
356
- }
357
- }
358
- const finishSettle = () => {
359
- if (settleBatchRef.current !== batch) return;
360
- if (shrinkTimerRef.current) clearTimeout(shrinkTimerRef.current);
361
- pendingSegsRef.current.clear();
362
- animatingUntilRef.current = Date.now();
363
- syncWindowToContent();
364
- };
365
- finishSettleRef.current = finishSettle;
366
- if (pendingSegsRef.current.size === 0) {
367
- finishSettle();
368
- return;
369
- }
370
- // Dead-clock fallback: if the ends never fire, force every segment to
371
- // its intended state so the pill can never strand half-open. Sized well
372
- // past any late-running transition so it never clips a live one.
373
- shrinkTimerRef.current = setTimeout(
374
- () => {
375
- if (settleBatchRef.current !== batch) return;
376
- for (const k of Object.keys(openSegsRef.current) as Seg[]) {
377
- const el = segRefs.current[k];
378
- if (!el) continue;
379
- el.style.transition = "none";
380
- el.style.width = openSegsRef.current[k]
381
- ? `${segInnerWidth(k)}px`
382
- : "0px";
383
- el.style.opacity = openSegsRef.current[k] ? "1" : "0";
384
- }
385
- finishSettle();
386
- },
387
- Math.max(1_000, settleMs * 3),
388
- );
389
- }
390
-
391
- /** Snap every segment to its resting state (Stop visible, all confirm and
392
- * hover segments collapsed) with no animation — used when the recorder
393
- * disables the pill (restart teardown, session reset). */
253
+ /** Return the outer overlay to its idle state when a session ends. */
394
254
  function resetToRest() {
395
255
  revealedRef.current = false;
396
- for (const k of ["q", "del", "res", "extras"] as Seg[]) {
397
- const el = segRefs.current[k];
398
- if (!el) continue;
399
- el.style.transition = "none";
400
- el.style.width = "0px";
401
- el.style.opacity = "0";
402
- openSegsRef.current[k] = false;
403
- }
404
- const mid = segRefs.current.mid;
405
- if (mid) {
406
- mid.style.transition = "none";
407
- mid.style.width = "auto";
408
- mid.style.opacity = "1";
409
- openSegsRef.current.mid = true;
410
- }
411
256
  setMode("recording");
412
257
  clearPauseTransition();
413
258
  setPaused(false);
414
259
  }
415
260
 
416
- // ---- reveal / confirm / done choreography ----
417
-
418
- function reveal(open: boolean) {
419
- if (open === revealedRef.current) return;
420
- if (open && modeRef.current !== "recording") return;
421
- revealedRef.current = open;
422
- transitionSegs([["extras", open, 0]]);
423
- }
424
-
425
261
  const pausedRef = useRef(false);
426
262
  pausedRef.current = paused;
427
263
  const enabledRef = useRef(false);
@@ -444,55 +280,6 @@ export function RecordingPill() {
444
280
  return () => clearInterval(t);
445
281
  }, [enabled, paused, mode]);
446
282
 
447
- function enterConfirm(intent: "delete" | "restart") {
448
- if (modeRef.current !== "recording") return;
449
- const wasPaused = pausedRef.current;
450
- confirmFromPausedRef.current = wasPaused;
451
- setMode("confirm");
452
- // The question's segment width is measured synchronously below, so the
453
- // new text (and the action button's label) must be committed to the DOM
454
- // before transitionSegs runs — without flushSync it would measure the
455
- // previous (empty) question.
456
- flushSync(() => {
457
- setConfirmIntent(intent);
458
- setConfirmQuestion(
459
- intent === "delete"
460
- ? `Delete ${formatDurationCopy(elapsedRef.current)}?`
461
- : "Start a new recording?",
462
- );
463
- });
464
- // Pause at the instant of the click — the deliberation must not end up
465
- // in the clip. A recording already paused by hand stays exactly as the
466
- // user left it, and exiting the confirm restores that state instead of
467
- // resuming behind their back.
468
- if (!wasPaused) applyPauseIntent("pause");
469
- revealedRef.current = false;
470
- transitionSegs([
471
- ["extras", false, 0],
472
- ["mid", false, 0],
473
- ["q", true, 0],
474
- ["del", true, 20],
475
- ["res", true, 40],
476
- ]);
477
- setAnnouncement("Paused");
478
- }
479
-
480
- function exitConfirm(resume: boolean) {
481
- if (modeRef.current !== "confirm") return;
482
- setMode("recording");
483
- if (resume && pausedRef.current) applyPauseIntent("resume");
484
- else if (!resume && !confirmFromPausedRef.current) {
485
- applyPauseIntent("resume");
486
- }
487
- transitionSegs([
488
- ["res", false, 0],
489
- ["del", false, 20],
490
- ["q", false, 40],
491
- ["mid", true, 40],
492
- ]);
493
- setAnnouncement(pausedRef.current ? "Paused" : "Recording");
494
- }
495
-
496
283
  function applyPauseIntent(transition: "pause" | "resume") {
497
284
  clearPauseTransition();
498
285
  pauseTransitionRef.current = transition;
@@ -529,7 +316,12 @@ export function RecordingPill() {
529
316
  function stop() {
530
317
  // Guarded through the ref: the tray-stop listener holds a first-render
531
318
  // closure of this function, where the `enabled` state is still false.
532
- if (!enabledRef.current || modeRef.current === "done") return;
319
+ if (
320
+ !enabledRef.current ||
321
+ modeRef.current === "done" ||
322
+ playheadConfirmOpenRef.current
323
+ )
324
+ return;
533
325
  setDoneDurationMs(elapsedRef.current);
534
326
  // Every stop — hosted or local-only — starts as "finishing" and is only
535
327
  // called done by the completion event the stop actually produces. A
@@ -571,22 +363,18 @@ export function RecordingPill() {
571
363
  }, 3_000);
572
364
  }
573
365
 
574
- function confirmDestructive() {
366
+ function confirmDestructive(intent: RecordingPlayheadIntent) {
575
367
  if (pendingAction) return;
576
- // The confirm strip is a question about the session that is ending here.
577
- // Leave it now, before either answer is dispatched: the restart path
578
- // reuses this same window for the replacement take, and a pill still in
579
- // `confirm` would come back with the old question up and Stop/Pause
580
- // disabled. `pendingAction` (cleared by the next `toolbar-enabled`) keeps
581
- // the restart/delete glyphs disabled meanwhile.
368
+ playheadConfirmOpenRef.current = false;
582
369
  resetToRest();
583
- if (confirmIntent === "restart") {
370
+ if (intent === "restart") {
584
371
  setPendingAction("restart");
585
372
  setElapsed(0);
586
- // Hide immediately — the restart teardown and fresh countdown follow,
587
- // and recording controls must not sit on screen while no capture is
588
- // live. The replacement session's `clips:toolbar-enabled` re-shows the
589
- // pill at 0:00, reusing this window thanks to the finishing hold.
373
+ // Hide immediately — the restart teardown follows. The replacement
374
+ // session's `clips:toolbar-preparing` re-shows the disabled pill for its
375
+ // countdown, reusing this window when the finishing hold keeps it alive.
376
+ toolbarDismissedRef.current = true;
377
+ setToolbarVisible(false);
590
378
  setEnabled(false);
591
379
  void safeInvoke("set_toolbar_finishing", { hold: true }).then(() => {
592
380
  void safeEmit("clips:recorder-restart");
@@ -606,6 +394,8 @@ export function RecordingPill() {
606
394
  setPendingAction("cancel");
607
395
  // Vanish now — feedback must not wait on the recorder's teardown. The
608
396
  // window close (or its 3s fallback) follows behind.
397
+ toolbarDismissedRef.current = true;
398
+ setToolbarVisible(false);
609
399
  setEnabled(false);
610
400
  void safeEmit("clips:recorder-cancel").then(() =>
611
401
  scheduleCloseFallback("cancel"),
@@ -618,9 +408,23 @@ export function RecordingPill() {
618
408
  getCurrentWindow()
619
409
  .close()
620
410
  .catch(() => {});
411
+ else resetToRest();
621
412
  });
622
413
  }
623
414
 
415
+ async function openRecording(url: string) {
416
+ try {
417
+ if (hasTauri) {
418
+ await openExternal(url);
419
+ } else if (!window.open(url, "_blank")) {
420
+ return;
421
+ }
422
+ dismissCard();
423
+ } catch (err) {
424
+ console.warn("[record-pill] opening recording failed:", err);
425
+ }
426
+ }
427
+
624
428
  function handleUploadFinished(payload: NativeUploadFinished) {
625
429
  // A completion only means something to a card that is on screen. While
626
430
  // the pill is recording there is no card, and anything applied here would
@@ -676,10 +480,40 @@ export function RecordingPill() {
676
480
  },
677
481
  ),
678
482
  );
483
+ track(
484
+ safeListen("clips:toolbar-preparing", () => {
485
+ if (modeRef.current === "done") {
486
+ if (stallTimerRef.current) {
487
+ clearTimeout(stallTimerRef.current);
488
+ stallTimerRef.current = null;
489
+ }
490
+ setViewUrl(null);
491
+ setCopied(false);
492
+ setSavedLocally(false);
493
+ setDoneStage("finishing");
494
+ sessionRef.current = {};
495
+ }
496
+ setElapsed(0);
497
+ elapsedAnchorRef.current = null;
498
+ setPendingAction(null);
499
+ resetToRest();
500
+ toolbarDismissedRef.current = false;
501
+ setToolbarVisible(true);
502
+ }),
503
+ );
504
+ track(
505
+ safeListen("clips:toolbar-hidden", () => {
506
+ toolbarDismissedRef.current = true;
507
+ setToolbarVisible(false);
508
+ }),
509
+ );
679
510
  track(
680
511
  safeListen<boolean>("clips:toolbar-enabled", (payload) => {
681
512
  setEnabled(!!payload);
682
513
  setPendingAction(null);
514
+ if (payload && !toolbarDismissedRef.current) {
515
+ setToolbarVisible(true);
516
+ }
683
517
  if (fallbackTimerRef.current) {
684
518
  clearTimeout(fallbackTimerRef.current);
685
519
  fallbackTimerRef.current = null;
@@ -786,9 +620,7 @@ export function RecordingPill() {
786
620
  }
787
621
  });
788
622
  for (const t of [
789
- hoverTimerRef,
790
623
  fallbackTimerRef,
791
- shrinkTimerRef,
792
624
  stallTimerRef,
793
625
  pauseTransitionTimerRef,
794
626
  ]) {
@@ -797,29 +629,6 @@ export function RecordingPill() {
797
629
  };
798
630
  }, []);
799
631
 
800
- function handleSegTransitionEnd(e: React.TransitionEvent) {
801
- if (e.propertyName !== "width") return;
802
- const el = e.target as HTMLElement;
803
- const entry = (Object.keys(segRefs.current) as Seg[]).find(
804
- (k) => segRefs.current[k] === el,
805
- );
806
- if (!entry) return;
807
- pendingSegsRef.current.delete(entry);
808
- if (pendingSegsRef.current.size === 0) finishSettleRef.current?.();
809
- }
810
-
811
- // Escape resumes during confirm — window-level, per the spec.
812
- useEffect(() => {
813
- const onKey = (e: KeyboardEvent) => {
814
- if (e.key === "Escape" && modeRef.current === "confirm") {
815
- e.preventDefault();
816
- exitConfirm(false);
817
- }
818
- };
819
- window.addEventListener("keydown", onKey);
820
- return () => window.removeEventListener("keydown", onKey);
821
- }, []);
822
-
823
632
  // Fit the native window to the measured pill once fonts have settled.
824
633
  useEffect(() => {
825
634
  let cancelled = false;
@@ -870,23 +679,60 @@ export function RecordingPill() {
870
679
  if (!hasTauri) return;
871
680
  let timer: ReturnType<typeof setTimeout> | null = null;
872
681
  let unlisten: (() => void) | null = null;
682
+ let lastDraggedPosition: { x: number; y: number } | null = null;
683
+
684
+ function saveDraggedPosition() {
685
+ if (!userDragActiveRef.current) return;
686
+ if (revealedRef.current || playheadConfirmOpenRef.current) {
687
+ userDragActiveRef.current = false;
688
+ lastDraggedPosition = null;
689
+ return;
690
+ }
691
+ const saveGeneration = userDragGenerationRef.current;
692
+ const saveChange = userDragChangeRef.current;
693
+ const remainingGuardMs = animatingUntilRef.current - Date.now();
694
+ if (remainingGuardMs > 0) {
695
+ timer = setTimeout(saveDraggedPosition, remainingGuardMs + 1);
696
+ return;
697
+ }
698
+ const position = lastDraggedPosition;
699
+ if (!position) return;
700
+ void safeInvoke("toolbar_save_position", position).finally(() => {
701
+ if (
702
+ userDragGenerationRef.current === saveGeneration &&
703
+ userDragChangeRef.current === saveChange
704
+ ) {
705
+ userDragActiveRef.current = false;
706
+ }
707
+ });
708
+ }
709
+
873
710
  void getCurrentWindow()
874
- .onMoved(() => {
875
- if (timer) clearTimeout(timer);
876
- timer = setTimeout(() => {
877
- if (
878
- modeRef.current !== "recording" ||
879
- revealedRef.current ||
880
- Date.now() < animatingUntilRef.current
881
- ) {
882
- return;
711
+ .onMoved(({ payload }) => {
712
+ if (revealedRef.current || playheadConfirmOpenRef.current) {
713
+ userDragArmedRef.current = false;
714
+ userDragActiveRef.current = false;
715
+ lastDraggedPosition = null;
716
+ if (timer) {
717
+ clearTimeout(timer);
718
+ timer = null;
719
+ }
720
+ return;
721
+ }
722
+ if (!userDragArmedRef.current && !userDragActiveRef.current) return;
723
+ if (userDragArmedRef.current) {
724
+ userDragArmedRef.current = false;
725
+ userDragActiveRef.current = true;
726
+ if (userDragMarkerTimerRef.current) {
727
+ clearTimeout(userDragMarkerTimerRef.current);
728
+ userDragMarkerTimerRef.current = null;
883
729
  }
884
- void getCurrentWindow()
885
- .outerPosition()
886
- .then((pos) =>
887
- safeInvoke("toolbar_save_position", { x: pos.x, y: pos.y }),
888
- );
889
- }, 600);
730
+ }
731
+ if (!userDragActiveRef.current) return;
732
+ lastDraggedPosition = payload;
733
+ userDragChangeRef.current += 1;
734
+ if (timer) clearTimeout(timer);
735
+ timer = setTimeout(saveDraggedPosition, 600);
890
736
  })
891
737
  .then((u) => {
892
738
  unlisten = u;
@@ -894,6 +740,10 @@ export function RecordingPill() {
894
740
  .catch(() => {});
895
741
  return () => {
896
742
  if (timer) clearTimeout(timer);
743
+ if (userDragMarkerTimerRef.current) {
744
+ clearTimeout(userDragMarkerTimerRef.current);
745
+ userDragMarkerTimerRef.current = null;
746
+ }
897
747
  unlisten?.();
898
748
  };
899
749
  }, []);
@@ -929,7 +779,7 @@ export function RecordingPill() {
929
779
  if (timer) clearTimeout(timer);
930
780
  timer = setTimeout(() => syncWindowToContent(), 120);
931
781
  });
932
- const el = mode === "done" ? cardRef.current : pillRef.current;
782
+ const el = mode === "done" ? cardRef.current : null;
933
783
  if (el) observer.observe(el);
934
784
  return () => {
935
785
  if (timer) clearTimeout(timer);
@@ -937,20 +787,20 @@ export function RecordingPill() {
937
787
  };
938
788
  }, [mode]);
939
789
 
940
- // The pill owns its window's visibility: hidden through pre-record and the
941
- // countdown, shown the moment capture is live, and kept up while the
942
- // completion card is open. Rust never shows this window itself.
790
+ // The pill owns its window's visibility: shown in its disabled state while
791
+ // preparing/counting down, enabled once capture is live, and kept up while
792
+ // the completion card is open. Rust never shows this window itself.
943
793
  const visibleRef = useRef(false);
944
794
  useEffect(() => {
945
795
  if (!hasTauri) return;
946
- const visible = enabled || mode === "done";
796
+ const visible = toolbarVisible;
947
797
  if (visibleRef.current === visible) return;
948
798
  visibleRef.current = visible;
949
799
  if (visible) syncWindowToContent();
950
800
  queueWindowOp(async () => {
951
801
  await invoke("toolbar_set_visible", { visible });
952
802
  });
953
- }, [enabled, mode]);
803
+ }, [toolbarVisible]);
954
804
 
955
805
  // The pill is also the single writer of the menu bar's recording mode:
956
806
  // stop square + ticking timer exactly while capture is live, the app logo
@@ -986,40 +836,38 @@ export function RecordingPill() {
986
836
 
987
837
  // ---- interactions ----
988
838
 
989
- function handleMouseEnter() {
990
- if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);
991
- hoverTimerRef.current = setTimeout(() => reveal(true), HOVER_INTENT_MS);
992
- }
993
- function handleMouseLeave() {
994
- if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);
995
- reveal(false);
996
- }
997
- function handleFocusCapture() {
998
- reveal(true);
999
- }
1000
- function handleBlurCapture(e: FocusEvent<HTMLDivElement>) {
1001
- if (e.currentTarget.contains(e.relatedTarget as Node | null)) return;
1002
- reveal(false);
1003
- }
1004
-
1005
839
  function handlePillMouseDown(e: React.MouseEvent) {
1006
840
  if (e.button !== 0) return;
1007
841
  const target = e.target as HTMLElement;
1008
842
  if (target.closest("button")) return;
1009
- // During confirm only Delete, Resume, or Esc answer the question — a
1010
- // stray tap must never resume the recording.
1011
843
  if (hasTauri) {
844
+ const generation = userDragGenerationRef.current + 1;
845
+ userDragGenerationRef.current = generation;
846
+ userDragArmedRef.current = true;
847
+ userDragActiveRef.current = false;
848
+ if (userDragMarkerTimerRef.current) {
849
+ clearTimeout(userDragMarkerTimerRef.current);
850
+ }
851
+ userDragMarkerTimerRef.current = setTimeout(() => {
852
+ if (userDragGenerationRef.current !== generation) return;
853
+ userDragArmedRef.current = false;
854
+ userDragActiveRef.current = false;
855
+ userDragMarkerTimerRef.current = null;
856
+ }, USER_DRAG_ARM_TIMEOUT_MS);
1012
857
  getCurrentWindow()
1013
858
  .startDragging()
1014
- .catch(() => {});
859
+ .catch(() => {
860
+ if (userDragGenerationRef.current !== generation) return;
861
+ userDragArmedRef.current = false;
862
+ userDragActiveRef.current = false;
863
+ if (userDragMarkerTimerRef.current) {
864
+ clearTimeout(userDragMarkerTimerRef.current);
865
+ userDragMarkerTimerRef.current = null;
866
+ }
867
+ });
1015
868
  }
1016
869
  }
1017
870
 
1018
- const inConfirm = mode === "confirm";
1019
- const showPaused = paused;
1020
- const meterFlat = showPaused || !enabled;
1021
- const timerText = formatTimer(elapsed);
1022
-
1023
871
  const card = completionCardState(doneStage, {
1024
872
  hasLink: Boolean(viewUrl),
1025
873
  savedLocally,
@@ -1115,10 +963,7 @@ export function RecordingPill() {
1115
963
  <>
1116
964
  <button
1117
965
  type="button"
1118
- onClick={() => {
1119
- if (hasTauri) void openExternal(viewUrl).catch(() => {});
1120
- else window.open(viewUrl, "_blank");
1121
- }}
966
+ onClick={() => void openRecording(viewUrl)}
1122
967
  className="h-[34px] flex-1 rounded-lg bg-[var(--pill-card-ink)] text-[13px] font-semibold text-[var(--pill-on-chrome)]"
1123
968
  >
1124
969
  Open
@@ -1135,145 +980,61 @@ export function RecordingPill() {
1135
980
  </div>
1136
981
  </div>
1137
982
  ) : (
1138
- <div
1139
- ref={pillRef}
1140
- onMouseDown={handlePillMouseDown}
1141
- onTransitionEnd={handleSegTransitionEnd}
1142
- onMouseEnter={handleMouseEnter}
1143
- onMouseLeave={handleMouseLeave}
1144
- onFocusCapture={handleFocusCapture}
1145
- onBlurCapture={handleBlurCapture}
1146
- className={`flex h-[42px] flex-none items-center rounded-full bg-[var(--pill-chrome)] p-1.5 text-[var(--pill-on-chrome)] ${enabled ? "" : "opacity-80"}`}
1147
- >
1148
- <button
1149
- type="button"
1150
- onClick={stop}
1151
- disabled={!enabled || inConfirm}
1152
- aria-label="Stop and save"
1153
- className="flex size-[30px] flex-none items-center justify-center rounded-full transition-colors duration-150 disabled:cursor-default"
1154
- style={{
1155
- color: showPaused ? "var(--pill-ghost-ink)" : "var(--pill-rec)",
1156
- }}
1157
- >
1158
- <span
1159
- aria-hidden
1160
- className="size-[13px] rounded-[3px] bg-current"
983
+ <RecordingPlayhead
984
+ elapsedMs={elapsed}
985
+ paused={paused}
986
+ enabled={enabled}
987
+ pendingAction={pendingAction}
988
+ meter={
989
+ <LiveWaveform
990
+ sources="mic"
991
+ dimmed={paused || !enabled}
992
+ level={demoMode ? demoLevel : null}
1161
993
  />
1162
- </button>
1163
- <span
1164
- aria-live="off"
1165
- className="record-pill-mono ml-1.5 flex-none text-sm font-medium transition-colors duration-150"
1166
- style={{
1167
- color: showPaused ? "var(--pill-on-chrome)" : "var(--pill-rec)",
1168
- }}
1169
- >
1170
- {timerText}
1171
- </span>
1172
- <span
1173
- ref={(el) => {
1174
- segRefs.current.mid = el;
1175
- }}
1176
- className="record-pill-seg"
1177
- style={{ width: "auto", opacity: 1 }}
1178
- >
1179
- <span className="inline-flex flex-none items-center">
1180
- <LiveWaveform
1181
- className="ml-3.5 h-3.5 w-[18px] flex-none"
1182
- sources="mic"
1183
- dimmed={meterFlat}
1184
- level={demoMode ? demoLevel : null}
1185
- />
1186
- <button
1187
- type="button"
1188
- onClick={togglePause}
1189
- disabled={!enabled || inConfirm}
1190
- aria-label={showPaused ? "Resume" : "Pause"}
1191
- className="ml-1.5 flex size-[30px] flex-none items-center justify-center rounded-full text-[var(--pill-ghost-ink)] transition-colors duration-150 hover:text-[var(--pill-on-chrome)] disabled:cursor-default disabled:opacity-50"
1192
- >
1193
- {showPaused ? (
1194
- <IconPlayerPlayFilled size={14} aria-hidden />
1195
- ) : (
1196
- <IconPlayerPauseFilled size={14} aria-hidden />
1197
- )}
1198
- </button>
1199
- </span>
1200
- </span>
1201
- <span
1202
- ref={(el) => {
1203
- segRefs.current.q = el;
1204
- }}
1205
- className="record-pill-seg"
1206
- >
1207
- <span className="inline-flex flex-none items-center">
1208
- <span className="pl-2.5 text-xs whitespace-nowrap text-[var(--pill-q-ink)]">
1209
- {confirmQuestion}
1210
- </span>
1211
- </span>
1212
- </span>
1213
- <span
1214
- ref={(el) => {
1215
- segRefs.current.del = el;
1216
- }}
1217
- className="record-pill-seg"
1218
- >
1219
- <span className="inline-flex flex-none items-center">
1220
- <button
1221
- type="button"
1222
- onClick={confirmDestructive}
1223
- className={`ml-2.5 flex h-7 flex-none items-center rounded-full px-3.5 text-xs font-semibold ${confirmIntent === "delete" ? "bg-[var(--pill-rec)] text-[var(--pill-on-chrome)]" : "bg-[var(--pill-on-chrome)] text-[var(--pill-chrome)]"}`}
1224
- >
1225
- {confirmIntent === "delete" ? "Delete" : "Restart"}
1226
- </button>
1227
- </span>
1228
- </span>
1229
- <span
1230
- ref={(el) => {
1231
- segRefs.current.res = el;
1232
- }}
1233
- className="record-pill-seg"
1234
- >
1235
- <span className="inline-flex flex-none items-center">
1236
- <button
1237
- type="button"
1238
- onClick={() => exitConfirm(true)}
1239
- className="ml-2 flex h-7 flex-none items-center rounded-full bg-[var(--pill-soft)] px-3.5 text-xs font-semibold text-[var(--pill-on-chrome)]"
1240
- >
1241
- Resume
1242
- </button>
1243
- </span>
1244
- </span>
1245
- <span
1246
- ref={(el) => {
1247
- segRefs.current.extras = el;
1248
- }}
1249
- className="record-pill-seg"
1250
- >
1251
- <span className="inline-flex flex-none items-center">
1252
- <span
1253
- aria-hidden
1254
- className="ml-1.5 h-[18px] w-px flex-none bg-[var(--pill-soft)]"
1255
- />
1256
- <button
1257
- type="button"
1258
- onClick={() => enterConfirm("restart")}
1259
- disabled={!enabled || !!pendingAction}
1260
- aria-label="Restart recording"
1261
- className="ml-1.5 flex size-[30px] flex-none items-center justify-center rounded-full text-[var(--pill-ghost-ink)] hover:text-[var(--pill-on-chrome)]"
1262
- >
1263
- <IconRefresh size={14} stroke={2} aria-hidden />
1264
- </button>
1265
- <button
1266
- type="button"
1267
- onClick={() => enterConfirm("delete")}
1268
- disabled={!enabled || !!pendingAction}
1269
- aria-label="Delete recording"
1270
- className="ml-0 flex size-[30px] flex-none items-center justify-center rounded-full text-[var(--pill-ghost-ink)] hover:text-[var(--pill-on-chrome)]"
1271
- >
1272
- <IconTrash size={14} stroke={2} aria-hidden />
1273
- </button>
1274
- </span>
1275
- </span>
1276
- </div>
994
+ }
995
+ labels={{
996
+ controls: "Recording controls",
997
+ stop: "Stop and save",
998
+ pause: "Pause",
999
+ resume: "Resume",
1000
+ pauseShortcut: "Pause (⌥⇧P)",
1001
+ resumeShortcut: "Resume (⌥⇧P)",
1002
+ restart: "Restart recording",
1003
+ restartShortcut: "Restart (⌥⇧R)",
1004
+ delete: "Delete recording",
1005
+ deleteShortcut: "Delete (⌥⇧C)",
1006
+ restartQuestion: "Start a new recording?",
1007
+ deleteQuestion: (durationMs) =>
1008
+ `Delete ${formatDurationCopy(durationMs)}?`,
1009
+ restartConfirm: "Restart",
1010
+ deleteConfirm: "Delete",
1011
+ resumeConfirm: "Resume",
1012
+ }}
1013
+ onStop={stop}
1014
+ onTogglePause={togglePause}
1015
+ onConfirmAction={confirmDestructive}
1016
+ onConfirmChange={(change: RecordingPlayheadConfirmChange) => {
1017
+ if (change.type === "open") {
1018
+ playheadConfirmOpenRef.current = true;
1019
+ if (!change.enteredPaused) applyPauseIntent("pause");
1020
+ setAnnouncement("Paused");
1021
+ return;
1022
+ }
1023
+ playheadConfirmOpenRef.current = false;
1024
+ if (change.resume || !change.enteredPaused) {
1025
+ applyPauseIntent("resume");
1026
+ }
1027
+ setAnnouncement(change.resume ? "Recording" : "Paused");
1028
+ }}
1029
+ onExpandedChange={(expanded) => {
1030
+ revealedRef.current = expanded;
1031
+ }}
1032
+ onLayoutChange={(layout) =>
1033
+ resizeWindowTo(layout.width, layout.height)
1034
+ }
1035
+ onMouseDown={handlePillMouseDown}
1036
+ className={enabled ? undefined : "opacity-80"}
1037
+ />
1277
1038
  )}
1278
1039
  </div>
1279
1040
  );