@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
@@ -100,6 +100,15 @@ import {
100
100
  type ReminderMode,
101
101
  validateAttachmentDrafts,
102
102
  } from "@/lib/event-form-utils";
103
+ import {
104
+ eventPopoverDivider,
105
+ eventPopoverHeader,
106
+ eventPopoverHeaderButton,
107
+ eventPopoverHeaderTitle,
108
+ eventPopoverPrimaryAction,
109
+ eventPopoverShell,
110
+ eventPopoverWidth,
111
+ } from "@/lib/event-popover-style";
103
112
  import { isOutOfOfficeEvent } from "@/lib/out-of-office";
104
113
  import {
105
114
  createEventDetailPopoverToken,
@@ -581,6 +590,33 @@ export function EventDetailPopover({
581
590
  const connectZoom = useConnectZoom();
582
591
  const locationRef = useRef<HTMLInputElement>(null);
583
592
  const meetingLinkRef = useRef<HTMLInputElement>(null);
593
+ const detailsScrollRef = useRef<HTMLDivElement>(null);
594
+ const actionPendingRef = useRef(false);
595
+ const [actionPending, setActionPending] = useState(false);
596
+
597
+ const beginAction = useCallback(() => {
598
+ if (
599
+ actionPendingRef.current ||
600
+ updateEvent.isPending ||
601
+ connectZoom.isPending
602
+ ) {
603
+ return false;
604
+ }
605
+ actionPendingRef.current = true;
606
+ setActionPending(true);
607
+ return true;
608
+ }, [connectZoom.isPending, updateEvent.isPending]);
609
+
610
+ const endAction = useCallback(() => {
611
+ actionPendingRef.current = false;
612
+ setActionPending(false);
613
+ }, []);
614
+
615
+ const mutationPending =
616
+ actionPending ||
617
+ updateEvent.isPending ||
618
+ connectZoom.isPending ||
619
+ pendingVideoProvider !== null;
584
620
 
585
621
  useEffect(() => {
586
622
  setSelectedAccountEmail(event.accountEmail);
@@ -599,35 +635,52 @@ export function EventDetailPopover({
599
635
  ) {
600
636
  return;
601
637
  }
638
+ if (!beginAction()) return;
602
639
 
603
640
  setSelectedAccountEmail(targetAccountEmail);
604
641
  void (async () => {
605
- const guestNotification = await promptGuestNotification({
606
- event,
607
- action: "update",
608
- });
609
- if (!guestNotification) {
642
+ try {
643
+ const guestNotification = await promptGuestNotification({
644
+ event,
645
+ action: "update",
646
+ });
647
+ if (!guestNotification) {
648
+ setSelectedAccountEmail(event.accountEmail);
649
+ endAction();
650
+ return;
651
+ }
652
+ updateEvent.mutate(
653
+ {
654
+ id: event.id,
655
+ accountEmail: event.accountEmail,
656
+ targetAccountEmail,
657
+ ...guestNotification,
658
+ },
659
+ {
660
+ onSuccess: () => toast.success(t("eventForm.eventUpdated")),
661
+ onError: () => {
662
+ setSelectedAccountEmail(event.accountEmail);
663
+ toast.error(t("eventForm.updateFailed"));
664
+ },
665
+ onSettled: endAction,
666
+ },
667
+ );
668
+ } catch {
610
669
  setSelectedAccountEmail(event.accountEmail);
611
- return;
670
+ endAction();
612
671
  }
613
- updateEvent.mutate(
614
- {
615
- id: event.id,
616
- accountEmail: event.accountEmail,
617
- targetAccountEmail,
618
- ...guestNotification,
619
- },
620
- {
621
- onSuccess: () => toast.success(t("eventForm.eventUpdated")),
622
- onError: () => {
623
- setSelectedAccountEmail(event.accountEmail);
624
- toast.error(t("eventForm.updateFailed"));
625
- },
626
- },
627
- );
628
672
  })();
629
673
  },
630
- [event, isDraft, onDraftUpdate, promptGuestNotification, t, updateEvent],
674
+ [
675
+ beginAction,
676
+ endAction,
677
+ event,
678
+ isDraft,
679
+ onDraftUpdate,
680
+ promptGuestNotification,
681
+ t,
682
+ updateEvent,
683
+ ],
631
684
  );
632
685
 
633
686
  // Sync editing state when the event changes (incl. live agent/other-user
@@ -722,6 +775,17 @@ export function EventDetailPopover({
722
775
  ? event.visibility
723
776
  : "default";
724
777
  const reminderValue = getReminderValue(event);
778
+
779
+ useEffect(() => {
780
+ if (!showMoreOptions) return;
781
+ const container = detailsScrollRef.current;
782
+ if (!container) return;
783
+ const frame = requestAnimationFrame(() => {
784
+ container.scrollTop = container.scrollHeight;
785
+ });
786
+ return () => cancelAnimationFrame(frame);
787
+ }, [showMoreOptions]);
788
+
725
789
  // Save a field update
726
790
  const saveField = useCallback(
727
791
  (updates: EventUpdatePatch) => {
@@ -731,32 +795,50 @@ export function EventDetailPopover({
731
795
  onDraftUpdate?.(event.id, draftUpdates);
732
796
  return true;
733
797
  }
798
+ if (!beginAction()) return false;
734
799
  void (async () => {
735
- const { scope: _scope, addAttendees, ...notificationUpdates } = updates;
736
- const promptUpdates = addAttendees
737
- ? {
738
- ...notificationUpdates,
739
- attendees: mergeAttendeesForPrompt(event.attendees, addAttendees),
740
- }
741
- : notificationUpdates;
742
- const shouldChooseGuestScope =
743
- isRecurringEvent &&
744
- ("attendees" in updates || "addAttendees" in updates);
745
- const guestNotification = await promptGuestNotification({
746
- event,
747
- action: "update",
748
- updates: promptUpdates,
749
- recurrenceScope: shouldChooseGuestScope
750
- ? { enabled: true, defaultScope: "single" }
751
- : undefined,
752
- });
753
- if (!guestNotification) return;
754
- updateEvent.mutate({
755
- id: event.id,
756
- accountEmail: event.accountEmail,
757
- ...updates,
758
- ...guestNotification,
759
- });
800
+ try {
801
+ const {
802
+ scope: _scope,
803
+ addAttendees,
804
+ ...notificationUpdates
805
+ } = updates;
806
+ const promptUpdates = addAttendees
807
+ ? {
808
+ ...notificationUpdates,
809
+ attendees: mergeAttendeesForPrompt(
810
+ event.attendees,
811
+ addAttendees,
812
+ ),
813
+ }
814
+ : notificationUpdates;
815
+ const shouldChooseGuestScope =
816
+ isRecurringEvent &&
817
+ ("attendees" in updates || "addAttendees" in updates);
818
+ const guestNotification = await promptGuestNotification({
819
+ event,
820
+ action: "update",
821
+ updates: promptUpdates,
822
+ recurrenceScope: shouldChooseGuestScope
823
+ ? { enabled: true, defaultScope: "single" }
824
+ : undefined,
825
+ });
826
+ if (!guestNotification) {
827
+ endAction();
828
+ return;
829
+ }
830
+ updateEvent.mutate(
831
+ {
832
+ id: event.id,
833
+ accountEmail: event.accountEmail,
834
+ ...updates,
835
+ ...guestNotification,
836
+ },
837
+ { onSettled: endAction },
838
+ );
839
+ } catch {
840
+ endAction();
841
+ }
760
842
  })();
761
843
  return true;
762
844
  },
@@ -764,6 +846,8 @@ export function EventDetailPopover({
764
846
  event,
765
847
  isDraft,
766
848
  isRecurringEvent,
849
+ beginAction,
850
+ endAction,
767
851
  onDraftUpdate,
768
852
  promptGuestNotification,
769
853
  updateEvent,
@@ -826,33 +910,52 @@ export function EventDetailPopover({
826
910
  onDraftUpdate?.(event.id, { addGoogleMeet: true, addZoom: false });
827
911
  return;
828
912
  }
913
+ if (!beginAction()) return;
829
914
  setPendingVideoProvider("meet");
830
915
  void (async () => {
831
- const updates = { addGoogleMeet: true };
832
- const guestNotification = await promptGuestNotification({
833
- event,
834
- action: "update",
835
- updates,
836
- });
837
- if (!guestNotification) {
916
+ try {
917
+ const updates = { addGoogleMeet: true };
918
+ const guestNotification = await promptGuestNotification({
919
+ event,
920
+ action: "update",
921
+ updates,
922
+ });
923
+ if (!guestNotification) {
924
+ setPendingVideoProvider(null);
925
+ endAction();
926
+ return;
927
+ }
928
+ updateEvent.mutate(
929
+ {
930
+ id: event.id,
931
+ accountEmail: event.accountEmail,
932
+ ...updates,
933
+ ...guestNotification,
934
+ },
935
+ {
936
+ onSuccess: () => toast(t("eventForm.googleMeetAdded")),
937
+ onError: () => toast.error(t("eventForm.googleMeetAddFailed")),
938
+ onSettled: () => {
939
+ setPendingVideoProvider(null);
940
+ endAction();
941
+ },
942
+ },
943
+ );
944
+ } catch {
838
945
  setPendingVideoProvider(null);
839
- return;
946
+ endAction();
840
947
  }
841
- updateEvent.mutate(
842
- {
843
- id: event.id,
844
- accountEmail: event.accountEmail,
845
- ...updates,
846
- ...guestNotification,
847
- },
848
- {
849
- onSuccess: () => toast(t("eventForm.googleMeetAdded")),
850
- onError: () => toast.error(t("eventForm.googleMeetAddFailed")),
851
- onSettled: () => setPendingVideoProvider(null),
852
- },
853
- );
854
948
  })();
855
- }, [event, isDraft, onDraftUpdate, promptGuestNotification, t, updateEvent]);
949
+ }, [
950
+ beginAction,
951
+ endAction,
952
+ event,
953
+ isDraft,
954
+ onDraftUpdate,
955
+ promptGuestNotification,
956
+ t,
957
+ updateEvent,
958
+ ]);
856
959
 
857
960
  const addZoomToConnectedEvent = useCallback(() => {
858
961
  if (!event.id || updateEvent.isPending) return;
@@ -862,38 +965,57 @@ export function EventDetailPopover({
862
965
  return;
863
966
  }
864
967
 
968
+ if (!beginAction()) return;
865
969
  setPendingVideoProvider("zoom");
866
970
  void (async () => {
867
- const updates = { addZoom: true };
868
- const guestNotification = await promptGuestNotification({
869
- event,
870
- action: "update",
871
- updates,
872
- });
873
- if (!guestNotification) {
971
+ try {
972
+ const updates = { addZoom: true };
973
+ const guestNotification = await promptGuestNotification({
974
+ event,
975
+ action: "update",
976
+ updates,
977
+ });
978
+ if (!guestNotification) {
979
+ setPendingVideoProvider(null);
980
+ endAction();
981
+ return;
982
+ }
983
+ updateEvent.mutate(
984
+ {
985
+ id: event.id,
986
+ accountEmail: event.accountEmail,
987
+ ...updates,
988
+ ...guestNotification,
989
+ },
990
+ {
991
+ onSuccess: () => toast(t("eventForm.zoomAdded")),
992
+ onError: (error) =>
993
+ toast.error(
994
+ error instanceof Error
995
+ ? error.message
996
+ : t("eventForm.zoomAddFailed"),
997
+ ),
998
+ onSettled: () => {
999
+ setPendingVideoProvider(null);
1000
+ endAction();
1001
+ },
1002
+ },
1003
+ );
1004
+ } catch {
874
1005
  setPendingVideoProvider(null);
875
- return;
1006
+ endAction();
876
1007
  }
877
- updateEvent.mutate(
878
- {
879
- id: event.id,
880
- accountEmail: event.accountEmail,
881
- ...updates,
882
- ...guestNotification,
883
- },
884
- {
885
- onSuccess: () => toast(t("eventForm.zoomAdded")),
886
- onError: (error) =>
887
- toast.error(
888
- error instanceof Error
889
- ? error.message
890
- : t("eventForm.zoomAddFailed"),
891
- ),
892
- onSettled: () => setPendingVideoProvider(null),
893
- },
894
- );
895
1008
  })();
896
- }, [event, isDraft, onDraftUpdate, promptGuestNotification, t, updateEvent]);
1009
+ }, [
1010
+ beginAction,
1011
+ endAction,
1012
+ event,
1013
+ isDraft,
1014
+ onDraftUpdate,
1015
+ promptGuestNotification,
1016
+ t,
1017
+ updateEvent,
1018
+ ]);
897
1019
 
898
1020
  useEffect(() => {
899
1021
  if (
@@ -928,6 +1050,7 @@ export function EventDetailPopover({
928
1050
  toast.error(t("eventForm.zoomNotConfiguredDeployment"));
929
1051
  return;
930
1052
  }
1053
+ if (!beginAction()) return;
931
1054
 
932
1055
  setZoomAfterConnectEventId(event.id);
933
1056
  setStoredZoomAfterConnectEventId(event.id);
@@ -942,10 +1065,13 @@ export function EventDetailPopover({
942
1065
  : t("eventForm.zoomConnectFailed"),
943
1066
  );
944
1067
  },
1068
+ onSettled: endAction,
945
1069
  });
946
1070
  }, [
947
1071
  addZoomToConnectedEvent,
1072
+ beginAction,
948
1073
  connectZoom,
1074
+ endAction,
949
1075
  event,
950
1076
  t,
951
1077
  updateEvent,
@@ -1016,11 +1142,13 @@ export function EventDetailPopover({
1016
1142
  onDraftUpdate?.(event.id, draftUpdate);
1017
1143
  return;
1018
1144
  }
1145
+ if (!beginAction()) return;
1019
1146
  updateEvent.mutate(update, {
1020
1147
  onError: () => toast.error(t("calendarView.failedUpdateEvent")),
1148
+ onSettled: endAction,
1021
1149
  });
1022
1150
  },
1023
- [event, isDraft, onDraftUpdate, t, updateEvent],
1151
+ [beginAction, endAction, event, isDraft, onDraftUpdate, t, updateEvent],
1024
1152
  );
1025
1153
 
1026
1154
  const saveTimeValues = useCallback(
@@ -1514,6 +1642,17 @@ export function EventDetailPopover({
1514
1642
  return () => setEventDetailPopoverOpen(token, false);
1515
1643
  }, [popoverOpen]);
1516
1644
 
1645
+ const repeatControl = canEditRecurrence ? (
1646
+ <RepeatPicker
1647
+ compact
1648
+ preset={getRecurrencePreset(recurrenceRules)}
1649
+ referenceDate={event.start}
1650
+ recurrence={recurrenceRules}
1651
+ onChange={handleSaveRecurrence}
1652
+ onCustomChange={handleSaveCustomRecurrence}
1653
+ />
1654
+ ) : null;
1655
+
1517
1656
  return (
1518
1657
  <Popover open={popoverOpen} onOpenChange={handleOpenChange}>
1519
1658
  <PopoverTrigger asChild onClick={handleTriggerClick}>
@@ -1524,7 +1663,7 @@ export function EventDetailPopover({
1524
1663
  side={isMobile ? "bottom" : (popoverSide ?? "right")}
1525
1664
  sideOffset={isMobile ? 6 : 8}
1526
1665
  collisionPadding={12}
1527
- className="flex max-h-[var(--radix-popover-content-available-height)] w-[min(18rem,calc(100vw-2rem))] flex-col overflow-hidden p-0"
1666
+ className={`${eventPopoverShell} ${eventPopoverWidth}`}
1528
1667
  onClick={(e) => e.stopPropagation()}
1529
1668
  onOpenAutoFocus={(e) => {
1530
1669
  e.preventDefault();
@@ -1553,8 +1692,8 @@ export function EventDetailPopover({
1553
1692
  >
1554
1693
  <TooltipProvider>
1555
1694
  {/* Header */}
1556
- <div className="flex items-center justify-between border-b border-border/60 px-4 py-3">
1557
- <div className="text-base font-medium text-foreground">
1695
+ <div className={eventPopoverHeader}>
1696
+ <div className={eventPopoverHeaderTitle}>
1558
1697
  <span>
1559
1698
  {isWorkingLocation
1560
1699
  ? t("eventForm.workingLocation")
@@ -1570,9 +1709,10 @@ export function EventDetailPopover({
1570
1709
  <Button
1571
1710
  variant="ghost"
1572
1711
  size="icon"
1573
- className="size-7 text-muted-foreground hover:text-foreground"
1712
+ className={eventPopoverHeaderButton}
1574
1713
  aria-label={t("eventForm.eventOptions")}
1575
1714
  aria-expanded={showMoreOptions}
1715
+ aria-controls={`event-more-options-${event.id}`}
1576
1716
  onClick={() => setShowMoreOptions((current) => !current)}
1577
1717
  >
1578
1718
  <IconDots className="size-4" />
@@ -1589,10 +1729,10 @@ export function EventDetailPopover({
1589
1729
  <Button
1590
1730
  variant="ghost"
1591
1731
  size="icon"
1592
- className="h-6 w-6 text-muted-foreground hover:text-foreground"
1732
+ className={eventPopoverHeaderButton}
1593
1733
  onClick={handlePinToSidebar}
1594
1734
  >
1595
- <IconLayoutSidebarRight className="h-3.5 w-3.5" />
1735
+ <IconLayoutSidebarRight className="size-4" />
1596
1736
  </Button>
1597
1737
  </TooltipTrigger>
1598
1738
  <TooltipContent side="bottom">
@@ -1603,17 +1743,17 @@ export function EventDetailPopover({
1603
1743
  <Button
1604
1744
  variant="ghost"
1605
1745
  size="icon"
1606
- className="h-6 w-6 text-muted-foreground hover:text-foreground"
1746
+ className={eventPopoverHeaderButton}
1607
1747
  onClick={() => handleOpenChange(false)}
1608
1748
  >
1609
- <IconX className="h-3.5 w-3.5" />
1749
+ <IconX className="size-4" />
1610
1750
  </Button>
1611
1751
  </div>
1612
1752
  </div>
1613
1753
 
1614
1754
  {/* Content */}
1615
- <div className="flex-1 overflow-y-auto">
1616
- <div className="px-4 pt-4 pb-1">
1755
+ <div ref={detailsScrollRef} className="flex-1 overflow-y-auto">
1756
+ <div className="px-2 py-2">
1617
1757
  {/* Title — always editable */}
1618
1758
  {isEditingTitle && !isWorkingLocation ? (
1619
1759
  <input
@@ -1657,11 +1797,11 @@ export function EventDetailPopover({
1657
1797
  setIsEditingTitle(false);
1658
1798
  }}
1659
1799
  placeholder={t("eventForm.addTitle")}
1660
- className="w-full text-lg font-semibold text-foreground leading-tight mb-4 bg-transparent border-none outline-none placeholder:text-muted-foreground/50 focus:ring-0"
1800
+ className="w-full rounded-md bg-muted/40 px-2 py-1.5 font-normal text-foreground outline-none placeholder:text-muted-foreground/60 focus:ring-0"
1661
1801
  />
1662
1802
  ) : (
1663
1803
  <h2
1664
- className={`mb-4 -mx-0.5 rounded px-0.5 text-lg font-normal leading-tight text-foreground ${!isOverlay && !isWorkingLocation ? "cursor-text hover:bg-muted/50" : ""}`}
1804
+ className={`rounded-md px-2 py-1.5 font-normal text-foreground ${!isOverlay && !isWorkingLocation ? "cursor-text hover:bg-muted/50" : ""}`}
1665
1805
  onClick={() => {
1666
1806
  if (isOverlay || isWorkingLocation) return;
1667
1807
  setEditingTitle(getEditableEventTitle(event));
@@ -1673,6 +1813,8 @@ export function EventDetailPopover({
1673
1813
  )}
1674
1814
  </div>
1675
1815
 
1816
+ <div className={eventPopoverDivider} />
1817
+
1676
1818
  <div className="px-4 space-y-1">
1677
1819
  {(isDraft || (!isOverlay && event.source === "google")) && (
1678
1820
  <EventCalendarSelect
@@ -1680,13 +1822,13 @@ export function EventDetailPopover({
1680
1822
  isDraft ? event.accountEmail : selectedAccountEmail
1681
1823
  }
1682
1824
  onAccountChange={handleAccountChange}
1683
- disabled={updateEvent.isPending}
1825
+ disabled={mutationPending}
1684
1826
  />
1685
1827
  )}
1686
1828
 
1687
1829
  {/* Time, date, timezone, and repeat stay editable in place. */}
1688
- <div className="flex items-start gap-3 rounded-md py-1.5">
1689
- <IconClock className="mt-1 h-4 w-4 shrink-0 text-muted-foreground" />
1830
+ <div className="flex items-start gap-2 rounded-md py-1.5">
1831
+ <IconClock className="mt-1 size-[18px] shrink-0 text-muted-foreground" />
1690
1832
  <div className="min-w-0 flex-1">
1691
1833
  {isWorkingLocation && (
1692
1834
  <div className="mb-1 flex items-center gap-2">
@@ -1694,7 +1836,7 @@ export function EventDetailPopover({
1694
1836
  id={`working-location-all-day-${event.id}`}
1695
1837
  checked={event.allDay}
1696
1838
  onCheckedChange={handleWorkingLocationAllDayChange}
1697
- disabled={updateEvent.isPending}
1839
+ disabled={mutationPending}
1698
1840
  />
1699
1841
  <Label
1700
1842
  htmlFor={`working-location-all-day-${event.id}`}
@@ -1705,7 +1847,7 @@ export function EventDetailPopover({
1705
1847
  </div>
1706
1848
  )}
1707
1849
  {event.allDay ? (
1708
- <div className="flex flex-wrap items-center gap-1 text-sm">
1850
+ <div className="flex flex-wrap items-center gap-1">
1709
1851
  {!isWorkingLocation && (
1710
1852
  <span className="text-muted-foreground">
1711
1853
  {t("eventForm.allDay")}
@@ -1730,6 +1872,7 @@ export function EventDetailPopover({
1730
1872
  />
1731
1873
  </>
1732
1874
  )}
1875
+ <span className="ml-auto">{repeatControl}</span>
1733
1876
  </div>
1734
1877
  ) : (
1735
1878
  <>
@@ -1767,11 +1910,11 @@ export function EventDetailPopover({
1767
1910
  handleInlineTimeChange("endTime", value)
1768
1911
  }
1769
1912
  />
1770
- <span className="text-xs text-muted-foreground/70">
1913
+ <span className="text-muted-foreground/70">
1771
1914
  {formatDuration(event.start, event.end)}
1772
1915
  </span>
1773
1916
  </div>
1774
- <div className="mt-0.5 flex flex-wrap items-center gap-1 text-sm">
1917
+ <div className="mt-0.5 flex flex-wrap items-center gap-1">
1775
1918
  <DatePickerPopover
1776
1919
  value={editDate}
1777
1920
  label={t("eventForm.startDate")}
@@ -1791,7 +1934,8 @@ export function EventDetailPopover({
1791
1934
  />
1792
1935
  </>
1793
1936
  )}
1794
- <span className="ml-auto">
1937
+ <span className="ml-auto flex items-center gap-1">
1938
+ {repeatControl}
1795
1939
  <TimezonePickerPopover
1796
1940
  compact
1797
1941
  value={editTimezone}
@@ -1805,27 +1949,18 @@ export function EventDetailPopover({
1805
1949
  </div>
1806
1950
  </div>
1807
1951
 
1808
- {canEditRecurrence && (
1809
- <RepeatPicker
1810
- preset={getRecurrencePreset(recurrenceRules)}
1811
- referenceDate={event.start}
1812
- recurrence={recurrenceRules}
1813
- onChange={handleSaveRecurrence}
1814
- onCustomChange={handleSaveCustomRecurrence}
1815
- />
1816
- )}
1817
-
1818
1952
  {!event.allDay && !isOverlay && !isWorkingLocation && (
1819
- <div className="flex items-center gap-3 py-1">
1820
- <div className="h-4 w-4 shrink-0" />
1953
+ <div className="flex items-center gap-2 py-1">
1954
+ <div className="size-[18px] shrink-0" />
1821
1955
  <Button
1822
1956
  type="button"
1823
- variant="ghost"
1957
+ variant="outline"
1824
1958
  size="sm"
1825
- className="h-7 gap-1.5 px-2 text-xs"
1959
+ className="h-[30px] flex-1 justify-center gap-1.5 px-2 font-medium"
1960
+ disabled={mutationPending}
1826
1961
  onClick={() => setFindTimeOpen(true)}
1827
1962
  >
1828
- <IconCalendarTime className="h-3.5 w-3.5" />
1963
+ <IconCalendarTime className="size-4" />
1829
1964
  {t("eventForm.findTime")}
1830
1965
  </Button>
1831
1966
  </div>
@@ -1859,7 +1994,7 @@ export function EventDetailPopover({
1859
1994
  isRecurring={isRecurringEvent}
1860
1995
  isDraft={isDraft}
1861
1996
  readOnly={isOverlay}
1862
- disabled={updateEvent.isPending}
1997
+ disabled={mutationPending}
1863
1998
  onSave={handleSaveWorkingLocation}
1864
1999
  />
1865
2000
  )}
@@ -1868,7 +2003,7 @@ export function EventDetailPopover({
1868
2003
  {!isWorkingLocation && (
1869
2004
  <>
1870
2005
  {/* Separator */}
1871
- <div className="mx-4 my-2 border-t border-border/50" />
2006
+ <div className={eventPopoverDivider} />
1872
2007
 
1873
2008
  {/* Attendees — always shown */}
1874
2009
  {event.attendees && event.attendees.length > 0 ? (
@@ -1882,8 +2017,8 @@ export function EventDetailPopover({
1882
2017
  {/* Add guest input */}
1883
2018
  {!isOverlay && (
1884
2019
  <div className="px-4 py-1">
1885
- <div className="flex items-center gap-3">
1886
- <IconPlus className="h-4 w-4 shrink-0 text-muted-foreground/40" />
2020
+ <div className="flex items-center gap-2">
2021
+ <IconPlus className="size-[18px] shrink-0 text-muted-foreground/40" />
1887
2022
  <AttendeeAutocomplete
1888
2023
  selectedEmails={(event.attendees || []).map(
1889
2024
  (attendee) => attendee.email,
@@ -1902,20 +2037,18 @@ export function EventDetailPopover({
1902
2037
  {/* Research Meeting button */}
1903
2038
  {event.attendees && event.attendees.length > 0 && (
1904
2039
  <>
1905
- <div className="mx-4 my-2 border-t border-border/50" />
2040
+ <div className={eventPopoverDivider} />
1906
2041
  <div className="px-4 py-1">
1907
2042
  <ResearchMeetingButton event={event} />
1908
2043
  </div>
1909
2044
  </>
1910
2045
  )}
1911
2046
 
1912
- <div className="mx-4 my-2 border-t border-border/50" />
1913
- <div className="px-4 py-1">
1914
- <ExtensionSlot
1915
- id="calendar.event-detail.bottom"
1916
- context={buildEventDetailSlotContext(event)}
1917
- />
1918
- </div>
2047
+ <ExtensionSlot
2048
+ id="calendar.event-detail.bottom"
2049
+ context={buildEventDetailSlotContext(event)}
2050
+ className="my-2 border-t border-border/60 px-4 pt-2"
2051
+ />
1919
2052
  </>
1920
2053
  )}
1921
2054
 
@@ -1923,21 +2056,21 @@ export function EventDetailPopover({
1923
2056
  {!isWorkingLocation &&
1924
2057
  (meetingLink ? (
1925
2058
  <>
1926
- <div className="mx-4 my-2 border-t border-border/50" />
2059
+ <div className={eventPopoverDivider} />
1927
2060
  <div className="px-4 py-1.5">
1928
2061
  <a
1929
2062
  href={meetingLink.url}
1930
2063
  target="_blank"
1931
2064
  rel="noopener noreferrer"
1932
- className="flex items-center justify-center w-full rounded-xl bg-[#4965E0] hover:bg-[#5A75F0] text-white font-semibold py-2 px-4 text-[15px] relative"
2065
+ className={`${eventPopoverPrimaryAction} relative bg-conference text-conference-foreground hover:bg-conference/90`}
1933
2066
  >
1934
- <IconVideo className="h-5 w-5 mr-2 opacity-80" />
2067
+ <IconVideo className="mr-2 size-4 opacity-80" />
1935
2068
  <span>{getMeetingLabel(meetingLink.type, t)}</span>
1936
- <span className="absolute right-4 hidden items-center gap-1 opacity-50 sm:flex">
1937
- <kbd className="text-xs font-normal">
2069
+ <span className="absolute right-2 hidden items-center gap-1 opacity-70 sm:flex">
2070
+ <kbd className="inline-flex size-4 items-center justify-center rounded bg-conference-foreground/20 text-[11px] font-medium">
1938
2071
  {shortcutModifierLabel()}
1939
2072
  </kbd>
1940
- <kbd className="inline-flex h-5 w-5 items-center justify-center rounded bg-white/20 text-[11px] font-medium">
2073
+ <kbd className="inline-flex size-4 items-center justify-center rounded bg-conference-foreground/20 text-[11px] font-medium">
1941
2074
  J
1942
2075
  </kbd>
1943
2076
  </span>
@@ -1965,15 +2098,15 @@ export function EventDetailPopover({
1965
2098
  </>
1966
2099
  ) : pendingConferenceProvider ? (
1967
2100
  <>
1968
- <div className="mx-4 my-2 border-t border-border/50" />
2101
+ <div className={eventPopoverDivider} />
1969
2102
  <div className="px-4 py-1.5">
1970
- <div className="flex w-full items-center rounded-xl bg-[#4965E0] py-2 pl-4 pr-2 text-white">
2103
+ <div className="flex h-[30px] w-full items-center rounded-md bg-conference pl-2.5 pr-1 text-conference-foreground">
1971
2104
  {pendingConferenceProvider === "zoom" ? (
1972
- <IconBrandZoom className="mr-2 h-5 w-5 opacity-90" />
2105
+ <IconBrandZoom className="mr-2 size-4 opacity-90" />
1973
2106
  ) : (
1974
- <IconVideo className="mr-2 h-5 w-5 opacity-90" />
2107
+ <IconVideo className="mr-2 size-4 opacity-90" />
1975
2108
  )}
1976
- <span className="text-[15px] font-semibold">
2109
+ <span className="font-medium">
1977
2110
  {pendingConferenceProvider === "zoom"
1978
2111
  ? t("eventForm.zoom")
1979
2112
  : t("eventForm.googleMeet")}
@@ -1986,7 +2119,7 @@ export function EventDetailPopover({
1986
2119
  ? t("eventForm.zoom")
1987
2120
  : t("eventForm.googleMeet")
1988
2121
  }`}
1989
- className="ml-auto rounded-md p-1 text-white/70 transition-colors hover:bg-white/15 hover:text-white"
2122
+ className="ml-auto rounded-md p-1 text-conference-foreground/70 transition-colors hover:bg-conference-foreground/15 hover:text-conference-foreground"
1990
2123
  >
1991
2124
  <IconX className="h-4 w-4" />
1992
2125
  </button>
@@ -2006,7 +2139,7 @@ export function EventDetailPopover({
2006
2139
  ) : editingField === "meetingLink" ? (
2007
2140
  <div className="px-4 py-1.5">
2008
2141
  <div className="flex items-center gap-2">
2009
- <IconVideo className="h-4 w-4 shrink-0 text-muted-foreground" />
2142
+ <IconVideo className="size-[18px] shrink-0 text-muted-foreground" />
2010
2143
  <input
2011
2144
  ref={meetingLinkRef}
2012
2145
  value={editMeetingLink}
@@ -2025,7 +2158,7 @@ export function EventDetailPopover({
2025
2158
  }}
2026
2159
  onBlur={handleSaveMeetingLink}
2027
2160
  placeholder={t("eventForm.pasteMeetingLink")}
2028
- className="flex-1 bg-transparent border-none outline-none text-sm text-foreground placeholder:text-muted-foreground/40 focus:ring-0"
2161
+ className="flex-1 bg-transparent border-none outline-none text-foreground placeholder:text-muted-foreground/40 focus:ring-0"
2029
2162
  />
2030
2163
  </div>
2031
2164
  </div>
@@ -2036,8 +2169,8 @@ export function EventDetailPopover({
2036
2169
  type="button"
2037
2170
  variant="outline"
2038
2171
  size="sm"
2039
- className="h-8 flex-1 justify-center gap-1.5 px-2 text-xs"
2040
- disabled={updateEvent.isPending}
2172
+ className="h-[30px] flex-1 justify-center gap-1.5 px-2 text-xs"
2173
+ disabled={mutationPending}
2041
2174
  onClick={handleAddGoogleMeet}
2042
2175
  >
2043
2176
  <IconVideo className="h-3.5 w-3.5" />
@@ -2047,10 +2180,8 @@ export function EventDetailPopover({
2047
2180
  type="button"
2048
2181
  variant="outline"
2049
2182
  size="sm"
2050
- className="h-8 flex-1 justify-center gap-1.5 px-2 text-xs"
2051
- disabled={
2052
- updateEvent.isPending || connectZoom.isPending
2053
- }
2183
+ className="h-[30px] flex-1 justify-center gap-1.5 px-2 text-xs"
2184
+ disabled={mutationPending}
2054
2185
  onClick={handleAddZoom}
2055
2186
  >
2056
2187
  <IconBrandZoom className="h-3.5 w-3.5" />
@@ -2060,7 +2191,7 @@ export function EventDetailPopover({
2060
2191
  type="button"
2061
2192
  variant="ghost"
2062
2193
  size="sm"
2063
- className="h-8 flex-1 justify-center gap-1.5 px-2 text-xs text-muted-foreground"
2194
+ className="h-[30px] flex-1 justify-center gap-1.5 px-2 text-xs text-muted-foreground"
2064
2195
  onClick={() => setEditingField("meetingLink")}
2065
2196
  >
2066
2197
  <IconPlus className="h-3.5 w-3.5" />
@@ -2072,7 +2203,7 @@ export function EventDetailPopover({
2072
2203
  ) : (
2073
2204
  <button
2074
2205
  type="button"
2075
- className="flex w-full items-center gap-3 rounded-md px-4 py-1.5 text-left text-sm text-muted-foreground/60 transition-colors hover:bg-muted/50 hover:text-foreground"
2206
+ className="flex w-full items-center gap-2 rounded-md px-4 py-1.5 text-left text-muted-foreground/60 transition-colors hover:bg-muted/50 hover:text-foreground"
2076
2207
  onClick={() => setShowConferencingOptions(true)}
2077
2208
  >
2078
2209
  <IconVideo className="h-4 w-4 shrink-0" />
@@ -2089,12 +2220,12 @@ export function EventDetailPopover({
2089
2220
  editingField === "attachments" ||
2090
2221
  (event.attachments?.length ?? 0) > 0) && (
2091
2222
  <>
2092
- <div className="mx-4 my-2 border-t border-border/50" />
2223
+ <div className={eventPopoverDivider} />
2093
2224
  {editingField === "attachments" ? (
2094
2225
  <div className="px-4 py-1.5">
2095
- <div className="mb-2 flex items-center gap-3">
2096
- <IconPaperclip className="h-4 w-4 shrink-0 text-muted-foreground" />
2097
- <span className="text-sm font-medium text-foreground">
2226
+ <div className="mb-2 flex items-center gap-2">
2227
+ <IconPaperclip className="size-[18px] shrink-0 text-muted-foreground" />
2228
+ <span className="font-medium text-foreground">
2098
2229
  {t("eventForm.attachments")}
2099
2230
  </span>
2100
2231
  </div>
@@ -2120,6 +2251,7 @@ export function EventDetailPopover({
2120
2251
  <Button
2121
2252
  size="sm"
2122
2253
  className="h-6 text-xs"
2254
+ disabled={mutationPending}
2123
2255
  onClick={handleSaveAttachments}
2124
2256
  >
2125
2257
  {t("eventForm.save")}
@@ -2134,7 +2266,7 @@ export function EventDetailPopover({
2134
2266
  href={att.fileUrl}
2135
2267
  target="_blank"
2136
2268
  rel="noopener noreferrer"
2137
- className="flex items-center gap-2.5 rounded-lg px-2 py-1.5 text-sm hover:bg-muted/50 group"
2269
+ className="flex items-center gap-2.5 rounded-lg px-2 py-1.5 hover:bg-muted/50 group"
2138
2270
  >
2139
2271
  {att.iconLink ? (
2140
2272
  <img
@@ -2143,7 +2275,7 @@ export function EventDetailPopover({
2143
2275
  className="h-4 w-4 shrink-0"
2144
2276
  />
2145
2277
  ) : (
2146
- <IconFileText className="h-4 w-4 shrink-0 text-muted-foreground" />
2278
+ <IconFileText className="size-[18px] shrink-0 text-muted-foreground" />
2147
2279
  )}
2148
2280
  <span className="truncate text-foreground">
2149
2281
  {att.title}
@@ -2153,7 +2285,7 @@ export function EventDetailPopover({
2153
2285
  ))}
2154
2286
  <button
2155
2287
  type="button"
2156
- className="flex items-center gap-2.5 rounded-lg px-2 py-1.5 text-sm text-muted-foreground hover:bg-muted/50 hover:text-foreground"
2288
+ className="flex items-center gap-2.5 rounded-lg px-2 py-1.5 text-muted-foreground hover:bg-muted/50 hover:text-foreground"
2157
2289
  onClick={() => {
2158
2290
  setEditAttachments(
2159
2291
  attachmentsToDrafts(event.attachments),
@@ -2168,13 +2300,13 @@ export function EventDetailPopover({
2168
2300
  ) : (
2169
2301
  <button
2170
2302
  type="button"
2171
- className="flex w-full items-center gap-3 px-4 py-1.5 text-sm text-muted-foreground/60 hover:bg-muted/50 hover:text-foreground"
2303
+ className="flex w-full items-center gap-2 px-4 py-1.5 text-muted-foreground/60 hover:bg-muted/50 hover:text-foreground"
2172
2304
  onClick={() => {
2173
2305
  setEditAttachments([attachmentsToDrafts(undefined)[0]]);
2174
2306
  setEditingField("attachments");
2175
2307
  }}
2176
2308
  >
2177
- <IconPaperclip className="h-4 w-4 shrink-0 text-muted-foreground/40" />
2309
+ <IconPaperclip className="size-[18px] shrink-0 text-muted-foreground/40" />
2178
2310
  {t("eventForm.addAttachment")}
2179
2311
  </button>
2180
2312
  )}
@@ -2184,10 +2316,10 @@ export function EventDetailPopover({
2184
2316
  {!isWorkingLocation && (
2185
2317
  <>
2186
2318
  {/* Location — always shown, editable */}
2187
- <div className="mx-4 my-2 border-t border-border/50" />
2319
+ <div className={eventPopoverDivider} />
2188
2320
  {editingField === "location" ? (
2189
- <div className="flex items-start gap-3 px-4 py-1.5">
2190
- <IconMapPin className="mt-1.5 h-4 w-4 shrink-0 text-muted-foreground" />
2321
+ <div className="flex items-start gap-2 px-4 py-1.5">
2322
+ <IconMapPin className="mt-1.5 size-[18px] shrink-0 text-muted-foreground" />
2191
2323
  <input
2192
2324
  ref={locationRef}
2193
2325
  value={editLocation}
@@ -2206,18 +2338,18 @@ export function EventDetailPopover({
2206
2338
  }}
2207
2339
  onBlur={handleSaveLocation}
2208
2340
  placeholder={t("eventForm.addLocation")}
2209
- className="flex-1 bg-transparent border-none outline-none text-sm text-foreground placeholder:text-muted-foreground/40 focus:ring-0"
2341
+ className="flex-1 bg-transparent border-none outline-none text-foreground placeholder:text-muted-foreground/40 focus:ring-0"
2210
2342
  />
2211
2343
  </div>
2212
2344
  ) : event.location && !locationIsMeetingLink ? (
2213
2345
  <div
2214
- className={`flex items-start gap-3 px-4 py-1.5 ${!isOverlay ? "cursor-pointer hover:bg-muted/50 rounded-md" : ""}`}
2346
+ className={`flex items-start gap-2 px-4 py-1.5 ${!isOverlay ? "cursor-pointer hover:bg-muted/50 rounded-md" : ""}`}
2215
2347
  onClick={() => {
2216
2348
  if (isOverlay) return;
2217
2349
  setEditingField("location");
2218
2350
  }}
2219
2351
  >
2220
- <IconMapPin className="mt-0.5 h-4 w-4 shrink-0 text-muted-foreground" />
2352
+ <IconMapPin className="mt-0.5 size-[18px] shrink-0 text-muted-foreground" />
2221
2353
  {locationIsUrl ? (
2222
2354
  <Tooltip>
2223
2355
  <TooltipTrigger asChild>
@@ -2225,7 +2357,7 @@ export function EventDetailPopover({
2225
2357
  href={event.location}
2226
2358
  target="_blank"
2227
2359
  rel="noopener noreferrer"
2228
- className="text-sm text-primary hover:underline truncate block max-w-full"
2360
+ className="text-primary hover:underline truncate block max-w-full"
2229
2361
  onClick={(e) => e.stopPropagation()}
2230
2362
  >
2231
2363
  {event.location}
@@ -2234,21 +2366,21 @@ export function EventDetailPopover({
2234
2366
  <TooltipContent>{event.location}</TooltipContent>
2235
2367
  </Tooltip>
2236
2368
  ) : (
2237
- <span className="text-sm text-muted-foreground">
2369
+ <span className="text-muted-foreground">
2238
2370
  {event.location}
2239
2371
  </span>
2240
2372
  )}
2241
2373
  </div>
2242
2374
  ) : locationIsMeetingLink && meetingLink ? (
2243
2375
  <>
2244
- <div className="flex items-start gap-3 px-4 py-1.5 rounded-md">
2245
- <IconVideo className="mt-0.5 h-4 w-4 shrink-0 text-muted-foreground" />
2376
+ <div className="flex items-start gap-2 px-4 py-1.5 rounded-md">
2377
+ <IconVideo className="mt-0.5 size-[18px] shrink-0 text-muted-foreground" />
2246
2378
  <div className="min-w-0">
2247
2379
  <a
2248
2380
  href={meetingLink.url}
2249
2381
  target="_blank"
2250
2382
  rel="noopener noreferrer"
2251
- className="block max-w-full truncate text-sm text-primary hover:underline"
2383
+ className="block max-w-full truncate text-primary hover:underline"
2252
2384
  >
2253
2385
  {getMeetingLabel(meetingLink.type, t)}
2254
2386
  </a>
@@ -2259,14 +2391,14 @@ export function EventDetailPopover({
2259
2391
  </div>
2260
2392
  {!isOverlay && (
2261
2393
  <div
2262
- className="flex items-center gap-3 px-4 py-1.5 cursor-pointer hover:bg-muted/50 rounded-md"
2394
+ className="flex items-center gap-2 px-4 py-1.5 cursor-pointer hover:bg-muted/50 rounded-md"
2263
2395
  onClick={() => {
2264
2396
  setEditLocation(editableLocationValue);
2265
2397
  setEditingField("location");
2266
2398
  }}
2267
2399
  >
2268
- <IconMapPin className="h-4 w-4 shrink-0 text-muted-foreground/40" />
2269
- <span className="text-sm text-muted-foreground/40">
2400
+ <IconMapPin className="size-[18px] shrink-0 text-muted-foreground/40" />
2401
+ <span className="text-muted-foreground/40">
2270
2402
  {t("eventForm.addLocation")}
2271
2403
  </span>
2272
2404
  </div>
@@ -2274,7 +2406,7 @@ export function EventDetailPopover({
2274
2406
  </>
2275
2407
  ) : !isOverlay ? (
2276
2408
  <div
2277
- className="flex items-center gap-3 px-4 py-1.5 cursor-pointer hover:bg-muted/50 rounded-md"
2409
+ className="flex items-center gap-2 px-4 py-1.5 cursor-pointer hover:bg-muted/50 rounded-md"
2278
2410
  onClick={() => {
2279
2411
  setEditLocation(
2280
2412
  locationIsMeetingLink ? "" : editableLocationValue,
@@ -2282,8 +2414,8 @@ export function EventDetailPopover({
2282
2414
  setEditingField("location");
2283
2415
  }}
2284
2416
  >
2285
- <IconMapPin className="h-4 w-4 shrink-0 text-muted-foreground/40" />
2286
- <span className="text-sm text-muted-foreground/40">
2417
+ <IconMapPin className="size-[18px] shrink-0 text-muted-foreground/40" />
2418
+ <span className="text-muted-foreground/40">
2287
2419
  {t("eventForm.addLocation")}
2288
2420
  </span>
2289
2421
  </div>
@@ -2295,8 +2427,8 @@ export function EventDetailPopover({
2295
2427
  {!isWorkingLocation && (!isOverlay || event.description) && (
2296
2428
  <>
2297
2429
  <div className="px-4 py-1.5">
2298
- <div className="flex items-start gap-3">
2299
- <IconAlignLeft className="mt-1.5 h-4 w-4 shrink-0 text-muted-foreground" />
2430
+ <div className="flex items-start gap-2">
2431
+ <IconAlignLeft className="mt-1.5 size-[18px] shrink-0 text-muted-foreground" />
2300
2432
  <div className="min-w-0 flex-1">
2301
2433
  {isOverlay ? (
2302
2434
  event.description ? (
@@ -2325,7 +2457,7 @@ export function EventDetailPopover({
2325
2457
  ) : (
2326
2458
  <button
2327
2459
  type="button"
2328
- className="rounded-md text-left text-sm text-muted-foreground/60 transition-colors hover:text-foreground"
2460
+ className="rounded-md text-left text-muted-foreground/60 transition-colors hover:text-foreground"
2329
2461
  onClick={() => setEditingField("description")}
2330
2462
  >
2331
2463
  {t("eventForm.description")}
@@ -2341,11 +2473,11 @@ export function EventDetailPopover({
2341
2473
  {!isWorkingLocation &&
2342
2474
  (!isOverlay && editingField === "reminders" ? (
2343
2475
  <>
2344
- <div className="mx-4 my-2 border-t border-border/50" />
2476
+ <div className={eventPopoverDivider} />
2345
2477
  <div className="px-4 py-1.5">
2346
- <div className="mb-2 flex items-center gap-3">
2347
- <IconBell className="h-4 w-4 shrink-0 text-muted-foreground" />
2348
- <span className="text-sm font-medium text-foreground">
2478
+ <div className="mb-2 flex items-center gap-2">
2479
+ <IconBell className="size-[18px] shrink-0 text-muted-foreground" />
2480
+ <span className="font-medium text-foreground">
2349
2481
  {t("eventForm.eventAlerts")}
2350
2482
  </span>
2351
2483
  </div>
@@ -2373,6 +2505,7 @@ export function EventDetailPopover({
2373
2505
  <Button
2374
2506
  size="sm"
2375
2507
  className="h-6 text-xs"
2508
+ disabled={mutationPending}
2376
2509
  onClick={handleSaveReminders}
2377
2510
  >
2378
2511
  {t("eventForm.save")}
@@ -2382,12 +2515,12 @@ export function EventDetailPopover({
2382
2515
  </>
2383
2516
  ) : event.reminders && event.reminders.length > 0 ? (
2384
2517
  <>
2385
- <div className="mx-4 my-2 border-t border-border/50" />
2386
- <div className="flex items-start gap-3 px-4 py-1.5">
2387
- <IconBell className="mt-0.5 h-4 w-4 shrink-0 text-muted-foreground" />
2518
+ <div className={eventPopoverDivider} />
2519
+ <div className="flex items-start gap-2 px-4 py-1.5">
2520
+ <IconBell className="mt-0.5 size-[18px] shrink-0 text-muted-foreground" />
2388
2521
  <div className="space-y-0.5">
2389
2522
  {event.reminders.map((r, i) => (
2390
- <div key={i} className="text-sm text-muted-foreground">
2523
+ <div key={i} className="text-muted-foreground">
2391
2524
  {formatReminderText(r.minutes)}
2392
2525
  </div>
2393
2526
  ))}
@@ -2401,11 +2534,14 @@ export function EventDetailPopover({
2401
2534
  (!isOverlay ? (
2402
2535
  showMoreOptions ? (
2403
2536
  <>
2404
- <div className="mx-4 my-2 border-t border-border/50" />
2405
- <div className="px-4 py-1.5">
2537
+ <div className={eventPopoverDivider} />
2538
+ <div
2539
+ id={`event-more-options-${event.id}`}
2540
+ className="px-4 py-1.5"
2541
+ >
2406
2542
  <div className="grid grid-cols-3 gap-2">
2407
2543
  <div className="space-y-1">
2408
- <span className="text-[10px] text-muted-foreground">
2544
+ <span className="text-xs text-muted-foreground">
2409
2545
  {t("eventForm.showAs")}
2410
2546
  </span>
2411
2547
  <Select
@@ -2415,9 +2551,9 @@ export function EventDetailPopover({
2415
2551
  value as AvailabilityValue,
2416
2552
  )
2417
2553
  }
2418
- disabled={updateEvent.isPending}
2554
+ disabled={mutationPending}
2419
2555
  >
2420
- <SelectTrigger className="h-8 text-xs">
2556
+ <SelectTrigger className="h-[30px] text-xs">
2421
2557
  <SelectValue />
2422
2558
  </SelectTrigger>
2423
2559
  <SelectContent>
@@ -2431,7 +2567,7 @@ export function EventDetailPopover({
2431
2567
  </Select>
2432
2568
  </div>
2433
2569
  <div className="space-y-1">
2434
- <span className="text-[10px] text-muted-foreground">
2570
+ <span className="text-xs text-muted-foreground">
2435
2571
  {t("eventForm.visibility")}
2436
2572
  </span>
2437
2573
  <Select
@@ -2439,9 +2575,9 @@ export function EventDetailPopover({
2439
2575
  onValueChange={(value) =>
2440
2576
  handleVisibilityChange(value as VisibilityValue)
2441
2577
  }
2442
- disabled={updateEvent.isPending}
2578
+ disabled={mutationPending}
2443
2579
  >
2444
- <SelectTrigger className="h-8 text-xs">
2580
+ <SelectTrigger className="h-[30px] text-xs">
2445
2581
  <SelectValue />
2446
2582
  </SelectTrigger>
2447
2583
  <SelectContent>
@@ -2458,7 +2594,7 @@ export function EventDetailPopover({
2458
2594
  </Select>
2459
2595
  </div>
2460
2596
  <div className="space-y-1">
2461
- <span className="text-[10px] text-muted-foreground">
2597
+ <span className="text-xs text-muted-foreground">
2462
2598
  {t("eventForm.alerts")}
2463
2599
  </span>
2464
2600
  <Select
@@ -2466,9 +2602,9 @@ export function EventDetailPopover({
2466
2602
  onValueChange={(value) =>
2467
2603
  handleReminderChange(value as ReminderValue)
2468
2604
  }
2469
- disabled={updateEvent.isPending}
2605
+ disabled={mutationPending}
2470
2606
  >
2471
- <SelectTrigger className="h-8 text-xs">
2607
+ <SelectTrigger className="h-[30px] text-xs">
2472
2608
  <SelectValue />
2473
2609
  </SelectTrigger>
2474
2610
  <SelectContent>
@@ -2497,8 +2633,8 @@ export function EventDetailPopover({
2497
2633
  ) : null
2498
2634
  ) : event.status || event.visibility ? (
2499
2635
  <>
2500
- <div className="mx-4 my-2 border-t border-border/50" />
2501
- <div className="flex items-center gap-3 px-4 py-1.5 text-sm text-muted-foreground">
2636
+ <div className={eventPopoverDivider} />
2637
+ <div className="flex items-center gap-2 px-4 py-1.5 text-muted-foreground">
2502
2638
  <div className="h-4 w-4 shrink-0" />
2503
2639
  <span>
2504
2640
  {event.transparency === "transparent"
@@ -2515,14 +2651,14 @@ export function EventDetailPopover({
2515
2651
  {/* Overlay person badge */}
2516
2652
  {event.overlayEmail && (
2517
2653
  <>
2518
- <div className="mx-4 my-2 border-t border-border/50" />
2519
- <div className="flex items-center gap-3 px-4 py-1.5">
2654
+ <div className={eventPopoverDivider} />
2655
+ <div className="flex items-center gap-2 px-4 py-1.5">
2520
2656
  <span
2521
2657
  aria-hidden="true"
2522
2658
  className="ml-1 size-2 shrink-0 rounded-full ring-1 ring-border"
2523
2659
  style={{ backgroundColor: event.ownerColor }}
2524
2660
  />
2525
- <span className="text-sm text-muted-foreground">
2661
+ <span className="text-muted-foreground">
2526
2662
  {t("eventForm.viewingOwnerCalendar", {
2527
2663
  owner: ownerLabel,
2528
2664
  })}
@@ -2541,7 +2677,8 @@ export function EventDetailPopover({
2541
2677
  <Button
2542
2678
  variant="ghost"
2543
2679
  size="sm"
2544
- className="text-destructive hover:text-destructive hover:bg-destructive/10 text-xs"
2680
+ className="h-[26px] text-xs text-destructive hover:bg-destructive/10 hover:text-destructive"
2681
+ disabled={mutationPending}
2545
2682
  onClick={() => {
2546
2683
  if (isDraft) onDraftDiscard?.(event.id);
2547
2684
  else onDelete(event.id);
@@ -2555,7 +2692,7 @@ export function EventDetailPopover({
2555
2692
  asChild
2556
2693
  variant="outline"
2557
2694
  size="sm"
2558
- className="ml-auto gap-1.5 text-xs"
2695
+ className="ml-auto h-[26px] gap-1.5"
2559
2696
  >
2560
2697
  <a
2561
2698
  href={event.htmlLink}
@@ -2570,7 +2707,7 @@ export function EventDetailPopover({
2570
2707
  {isDraft && (
2571
2708
  <Button
2572
2709
  size="sm"
2573
- className="ml-auto text-xs"
2710
+ className="ml-auto h-[26px]"
2574
2711
  disabled={!isWorkingLocationDraftReadyToCreate(event)}
2575
2712
  onClick={handleCreateDraft}
2576
2713
  >