@agent-native/core 0.91.2 → 0.92.1

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 (538) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +31 -0
  3. package/corpus/core/docs/content/faq.mdx +17 -0
  4. package/corpus/core/docs/content/notifications.mdx +12 -6
  5. package/corpus/core/package.json +1 -1
  6. package/corpus/core/src/agent/production-agent.ts +140 -46
  7. package/corpus/core/src/agent/tool-search.ts +71 -4
  8. package/corpus/core/src/application-state/store.ts +12 -1
  9. package/corpus/core/src/cli/index.ts +20 -0
  10. package/corpus/core/src/cli/upgrade.ts +798 -0
  11. package/corpus/core/src/client/AssistantChat.tsx +28 -15
  12. package/corpus/core/src/client/HighlightedCodeBlock.tsx +20 -3
  13. package/corpus/core/src/client/PoweredByBadge.tsx +1 -8
  14. package/corpus/core/src/client/agent-chat-adapter.ts +68 -16
  15. package/corpus/core/src/client/chat/message-components.tsx +85 -8
  16. package/corpus/core/src/client/chat/tool-call-display.tsx +355 -144
  17. package/corpus/core/src/client/chat/widgets/DataTableWidget.tsx +52 -1
  18. package/corpus/core/src/client/code-agent-chat-adapter.ts +2 -9
  19. package/corpus/core/src/client/db-admin/TableEditor.tsx +49 -0
  20. package/corpus/core/src/client/db-admin/export-utils.ts +13 -4
  21. package/corpus/core/src/client/db-admin/useAgentSync.ts +72 -0
  22. package/corpus/core/src/client/error-capture.ts +69 -7
  23. package/corpus/core/src/client/extensions/EmbeddedExtension.tsx +5 -1
  24. package/corpus/core/src/client/extensions/ExtensionViewer.tsx +53 -8
  25. package/corpus/core/src/client/extensions/InlineExtensionFrame.tsx +5 -1
  26. package/corpus/core/src/client/extensions/portable-extension.ts +1 -0
  27. package/corpus/core/src/client/org/OrgSwitcher.tsx +12 -9
  28. package/corpus/core/src/client/org/TeamPage.tsx +77 -71
  29. package/corpus/core/src/client/session-replay.ts +3 -97
  30. package/corpus/core/src/client/settings/SettingsPanel.tsx +738 -441
  31. package/corpus/core/src/client/settings/SettingsSection.tsx +161 -17
  32. package/corpus/core/src/client/settings/SettingsTabsPage.tsx +25 -9
  33. package/corpus/core/src/client/sse-event-processor.ts +29 -2
  34. package/corpus/core/src/db-admin/agent-tools.ts +8 -2
  35. package/corpus/core/src/db-admin/operations.ts +116 -4
  36. package/corpus/core/src/db-admin/routes.ts +1 -0
  37. package/corpus/core/src/db-admin/types.ts +4 -0
  38. package/corpus/core/src/extensions/actions.ts +113 -5
  39. package/corpus/core/src/extensions/html-shell.ts +5 -4
  40. package/corpus/core/src/extensions/routes.ts +10 -0
  41. package/corpus/core/src/navigation/index.ts +1 -1
  42. package/corpus/core/src/notifications/channels.ts +88 -25
  43. package/corpus/core/src/notifications/registry.ts +17 -3
  44. package/corpus/core/src/notifications/types.ts +4 -1
  45. package/corpus/core/src/resources/handlers.ts +10 -8
  46. package/corpus/core/src/server/agent-chat-plugin.ts +7 -3
  47. package/corpus/core/src/server/poll.ts +293 -8
  48. package/corpus/core/src/server/request-context.ts +7 -0
  49. package/corpus/core/src/styles/agent-conversation.css +1 -1
  50. package/corpus/core/src/styles/agent-native.css +27 -0
  51. package/corpus/core/src/templates/default/.agents/skills/actions/SKILL.md +5 -0
  52. package/corpus/core/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  53. package/corpus/core/src/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
  54. package/corpus/core/src/templates/default/.agents/skills/security/SKILL.md +7 -0
  55. package/corpus/core/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
  56. package/corpus/core/src/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
  57. package/corpus/core/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  58. package/corpus/core/src/templates/default/AGENTS.md +14 -5
  59. package/corpus/core/src/templates/default/package.json +2 -1
  60. package/corpus/core/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  61. package/corpus/core/src/templates/headless/AGENTS.md +13 -3
  62. package/corpus/core/src/templates/headless/package.json +1 -0
  63. package/corpus/core/src/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
  64. package/corpus/core/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  65. package/corpus/core/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
  66. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
  67. package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
  68. package/corpus/core/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
  69. package/corpus/core/src/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
  70. package/corpus/core/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
  71. package/corpus/core/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
  72. package/corpus/core/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  73. package/corpus/core/src/templates/workspace-core/AGENTS.md +7 -1
  74. package/corpus/core/src/templates/workspace-root/AGENTS.md +17 -5
  75. package/corpus/core/src/templates/workspace-root/package.json +1 -0
  76. package/corpus/templates/analytics/.agents/skills/actions/SKILL.md +5 -0
  77. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +10 -0
  78. package/corpus/templates/analytics/.agents/skills/real-time-sync/SKILL.md +1 -1
  79. package/corpus/templates/analytics/.agents/skills/security/SKILL.md +7 -0
  80. package/corpus/templates/analytics/.agents/skills/self-modifying-code/SKILL.md +20 -2
  81. package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +5 -6
  82. package/corpus/templates/analytics/.agents/skills/storing-data/SKILL.md +5 -1
  83. package/corpus/templates/analytics/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  84. package/corpus/templates/analytics/AGENTS.md +39 -18
  85. package/corpus/templates/analytics/actions/capture-test-error.ts +4 -0
  86. package/corpus/templates/analytics/actions/get-analytics-alert-rule-defaults.ts +23 -0
  87. package/corpus/templates/analytics/actions/get-error-issue.ts +1 -1
  88. package/corpus/templates/analytics/actions/list-analysis-revisions.ts +40 -0
  89. package/corpus/templates/analytics/actions/list-dashboard-revisions.ts +40 -0
  90. package/corpus/templates/analytics/actions/list-dashboard-usage-stats.ts +299 -0
  91. package/corpus/templates/analytics/actions/navigate.ts +4 -2
  92. package/corpus/templates/analytics/actions/restore-analysis-revision.ts +43 -0
  93. package/corpus/templates/analytics/actions/restore-dashboard-revision.ts +68 -0
  94. package/corpus/templates/analytics/actions/save-analytics-alert-rule.ts +14 -0
  95. package/corpus/templates/analytics/actions/save-monitor.ts +15 -1
  96. package/corpus/templates/analytics/actions/view-screen.ts +24 -0
  97. package/corpus/templates/analytics/app/components/analysis/AnalysisHistoryPanel.tsx +181 -0
  98. package/corpus/templates/analytics/app/components/dashboard/DashboardHistoryPanel.tsx +184 -0
  99. package/corpus/templates/analytics/app/components/dashboard/DataTable.tsx +41 -6
  100. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +122 -11
  101. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +22 -16
  102. package/corpus/templates/analytics/app/components/layout/Header.tsx +1 -1
  103. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +27 -21
  104. package/corpus/templates/analytics/app/hooks/use-analysis-revisions.ts +43 -0
  105. package/corpus/templates/analytics/app/hooks/use-dashboard-chat-context.ts +110 -0
  106. package/corpus/templates/analytics/app/hooks/use-dashboard-revisions.ts +43 -0
  107. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +8 -3
  108. package/corpus/templates/analytics/app/i18n/zh-TW.ts +64 -2
  109. package/corpus/templates/analytics/app/i18n-data.ts +783 -3
  110. package/corpus/templates/analytics/app/pages/Agents.tsx +359 -19
  111. package/corpus/templates/analytics/app/pages/Settings.tsx +3 -2
  112. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +34 -1
  113. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +28 -0
  114. package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +18 -1
  115. package/corpus/templates/analytics/app/pages/monitoring/ErrorsPanel.tsx +7 -10
  116. package/corpus/templates/analytics/app/pages/monitoring/MonitoringPage.tsx +8 -2
  117. package/corpus/templates/analytics/app/pages/monitoring/errors/IssueDetail.tsx +479 -23
  118. package/corpus/templates/analytics/app/pages/monitoring/errors/IssueList.tsx +0 -9
  119. package/corpus/templates/analytics/app/pages/monitoring/errors/i18n.ts +11 -0
  120. package/corpus/templates/analytics/app/pages/monitoring/errors/types.ts +9 -1
  121. package/corpus/templates/analytics/app/pages/monitoring/uptime/MonitorFormPage.tsx +157 -35
  122. package/corpus/templates/analytics/app/pages/monitoring/uptime/i18n.ts +17 -2
  123. package/corpus/templates/analytics/app/pages/monitoring/uptime/types.ts +4 -0
  124. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +80 -220
  125. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +9 -99
  126. package/corpus/templates/analytics/app/pages/settings/AlertRulesSettingsCard.tsx +262 -104
  127. package/corpus/templates/analytics/app/routes/team.tsx +1 -1
  128. package/corpus/templates/analytics/changelog/2026-07-08-admins-can-audit-dashboard-usage-ownership-and-cleanup-signa.md +6 -0
  129. package/corpus/templates/analytics/changelog/2026-07-08-agent-monitoring-stays-available-to-non-admins.md +6 -0
  130. package/corpus/templates/analytics/changelog/2026-07-08-alert-rules-are-easier-to-scan-expand-and-edit-from-settings.md +6 -0
  131. package/corpus/templates/analytics/changelog/2026-07-08-analytics-alert-forms-remember-last-email-recipients.md +6 -0
  132. package/corpus/templates/analytics/changelog/2026-07-08-analytics-alert-rules-can-now-use-per-rule-slack-and-webhook.md +6 -0
  133. package/corpus/templates/analytics/changelog/2026-07-08-dashboard-history-and-chat-context.md +5 -0
  134. package/corpus/templates/analytics/changelog/2026-07-08-dashboard-tables-keep-their-size-while-loading.md +6 -0
  135. package/corpus/templates/analytics/changelog/2026-07-08-dashboard-usage-now-counts-explorer-dashboard-traffic.md +6 -0
  136. package/corpus/templates/analytics/changelog/2026-07-08-demo-mode-session-emails-are-filtered-and-anonymized.md +6 -0
  137. package/corpus/templates/analytics/changelog/2026-07-08-error-issue-detail-adds-stack-traces-and-frequency-bars.md +6 -0
  138. package/corpus/templates/analytics/changelog/2026-07-08-error-issue-detail-now-shows-the-latest-occurrence-message-a.md +6 -0
  139. package/corpus/templates/analytics/changelog/2026-07-08-monitoring-errors-only-show-test-action-when-empty.md +6 -0
  140. package/corpus/templates/analytics/changelog/2026-07-08-monitoring-uptime-and-errors-tabs-now-clearly-show-which-view-is-active.md +6 -0
  141. package/corpus/templates/analytics/changelog/2026-07-08-production-session-replay-now-requires-private-blob-storage-.md +6 -0
  142. package/corpus/templates/analytics/changelog/2026-07-08-session-replay-uses-stock-rrweb-sizing-again-so-recorded.md +6 -0
  143. package/corpus/templates/analytics/changelog/2026-07-08-shared-extension-links-now-show-a-clear-message-when-you-do-.md +6 -0
  144. package/corpus/templates/analytics/changelog/2026-07-08-sidebar-dashboard-menus-now-open-above-the-dashboard-canvas.md +6 -0
  145. package/corpus/templates/analytics/changelog/2026-07-08-team-settings-show-access-controls-next-to-member-lists.md +6 -0
  146. package/corpus/templates/analytics/changelog/2026-07-08-uptime-alerting-clarifies-in-app-inbox-vs-email-and-lets-you-paste-slack-or-webhook-urls-per-monitor.md +6 -0
  147. package/corpus/templates/analytics/changelog/2026-07-08-uptime-monitors-now-use-a-10-second-request-timeout-by-defau.md +6 -0
  148. package/corpus/templates/analytics/docs/uptime-monitoring.md +13 -11
  149. package/corpus/templates/analytics/server/db/schema-monitoring.ts +5 -1
  150. package/corpus/templates/analytics/server/db/schema.ts +56 -0
  151. package/corpus/templates/analytics/server/lib/analytics-alerts.ts +92 -0
  152. package/corpus/templates/analytics/server/lib/dashboards-store.ts +334 -5
  153. package/corpus/templates/analytics/server/lib/error-capture.ts +231 -36
  154. package/corpus/templates/analytics/server/lib/session-replay.ts +114 -8
  155. package/corpus/templates/analytics/server/lib/uptime-monitors.ts +65 -16
  156. package/corpus/templates/analytics/server/plugins/db.ts +122 -2
  157. package/corpus/templates/analytics/server/routes/api/dashboard-agent-context.json.get.ts +1 -0
  158. package/corpus/templates/assets/.agents/skills/actions/SKILL.md +5 -0
  159. package/corpus/templates/assets/.agents/skills/real-time-sync/SKILL.md +1 -1
  160. package/corpus/templates/assets/.agents/skills/security/SKILL.md +7 -0
  161. package/corpus/templates/assets/.agents/skills/self-modifying-code/SKILL.md +20 -2
  162. package/corpus/templates/assets/.agents/skills/storing-data/SKILL.md +5 -1
  163. package/corpus/templates/assets/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  164. package/corpus/templates/assets/AGENTS.md +4 -0
  165. package/corpus/templates/assets/app/routes/settings.tsx +1 -1
  166. package/corpus/templates/assets/app/routes/team.tsx +1 -1
  167. package/corpus/templates/brain/.agents/skills/actions/SKILL.md +5 -0
  168. package/corpus/templates/brain/.agents/skills/adding-a-feature/SKILL.md +5 -0
  169. package/corpus/templates/brain/.agents/skills/real-time-sync/SKILL.md +1 -1
  170. package/corpus/templates/brain/.agents/skills/security/SKILL.md +7 -0
  171. package/corpus/templates/brain/.agents/skills/self-modifying-code/SKILL.md +20 -2
  172. package/corpus/templates/brain/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  173. package/corpus/templates/brain/AGENTS.md +4 -0
  174. package/corpus/templates/brain/app/routes/team.tsx +1 -1
  175. package/corpus/templates/calendar/.agents/skills/actions/SKILL.md +5 -0
  176. package/corpus/templates/calendar/.agents/skills/real-time-sync/SKILL.md +1 -1
  177. package/corpus/templates/calendar/.agents/skills/security/SKILL.md +7 -0
  178. package/corpus/templates/calendar/.agents/skills/self-modifying-code/SKILL.md +20 -2
  179. package/corpus/templates/calendar/.agents/skills/storing-data/SKILL.md +5 -1
  180. package/corpus/templates/calendar/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  181. package/corpus/templates/calendar/AGENTS.md +4 -0
  182. package/corpus/templates/calendar/app/components/calendar/DayView.tsx +11 -2
  183. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +21 -8
  184. package/corpus/templates/calendar/app/components/calendar/MonthView.tsx +7 -1
  185. package/corpus/templates/calendar/app/components/calendar/WeekView.tsx +11 -2
  186. package/corpus/templates/calendar/app/lib/popover-click-guard.ts +48 -4
  187. package/corpus/templates/calendar/app/pages/Settings.tsx +1 -1
  188. package/corpus/templates/calendar/app/routes/_app.team.tsx +1 -1
  189. package/corpus/templates/calendar/changelog/2026-07-08-clicking-empty-calendar-space-closes-an-open-event-popover-b.md +6 -0
  190. package/corpus/templates/chat/.agents/skills/actions/SKILL.md +5 -0
  191. package/corpus/templates/chat/.agents/skills/adding-a-feature/SKILL.md +5 -0
  192. package/corpus/templates/chat/.agents/skills/real-time-sync/SKILL.md +1 -1
  193. package/corpus/templates/chat/.agents/skills/security/SKILL.md +7 -0
  194. package/corpus/templates/chat/.agents/skills/self-modifying-code/SKILL.md +20 -2
  195. package/corpus/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  196. package/corpus/templates/chat/AGENTS.md +4 -0
  197. package/corpus/templates/chat/app/hooks/use-navigation-state.ts +1 -1
  198. package/corpus/templates/chat/app/routes/settings.tsx +2 -2
  199. package/corpus/templates/chat/app/routes/team.tsx +1 -1
  200. package/corpus/templates/clips/.agents/skills/actions/SKILL.md +5 -0
  201. package/corpus/templates/clips/.agents/skills/security/SKILL.md +7 -0
  202. package/corpus/templates/clips/.agents/skills/self-modifying-code/SKILL.md +20 -2
  203. package/corpus/templates/clips/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  204. package/corpus/templates/clips/AGENTS.md +4 -0
  205. package/corpus/templates/clips/actions/finalize-recording.ts +9 -3
  206. package/corpus/templates/clips/actions/set-thumbnail.ts +11 -2
  207. package/corpus/templates/clips/app/components/meetings/canvas-editor.tsx +1 -7
  208. package/corpus/templates/clips/app/components/player/player-controls.tsx +21 -13
  209. package/corpus/templates/clips/app/components/player/video-player.tsx +30 -75
  210. package/corpus/templates/clips/app/i18n/ar-SA.ts +6 -5
  211. package/corpus/templates/clips/app/i18n/de-DE.ts +6 -6
  212. package/corpus/templates/clips/app/i18n/en-US.ts +6 -5
  213. package/corpus/templates/clips/app/i18n/es-ES.ts +6 -5
  214. package/corpus/templates/clips/app/i18n/fr-FR.ts +6 -6
  215. package/corpus/templates/clips/app/i18n/hi-IN.ts +6 -5
  216. package/corpus/templates/clips/app/i18n/ja-JP.ts +6 -5
  217. package/corpus/templates/clips/app/i18n/ko-KR.ts +6 -5
  218. package/corpus/templates/clips/app/i18n/pt-BR.ts +6 -5
  219. package/corpus/templates/clips/app/i18n/zh-CN.ts +6 -5
  220. package/corpus/templates/clips/app/i18n/zh-TW.ts +6 -5
  221. package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +51 -118
  222. package/corpus/templates/clips/changelog/2026-07-08-desktop-meeting-notes-stay-active-from-tray-and-shortcut-controls.md +6 -0
  223. package/corpus/templates/clips/changelog/2026-07-08-desktop-meeting-popovers-can-start-notes-and-join-the-meetin.md +6 -0
  224. package/corpus/templates/clips/changelog/2026-07-08-hosted-clip-uploads-now-clear-failed-buffered-chunks.md +6 -0
  225. package/corpus/templates/clips/changelog/2026-07-08-hosted-recording-uploads-now-avoid-sql-chunk-storage.md +6 -0
  226. package/corpus/templates/clips/changelog/2026-07-08-meeting-notes-keep-their-recording-state-when-the-desktop.md +6 -0
  227. package/corpus/templates/clips/changelog/2026-07-08-meeting-recaps-now-keep-summaries-action-items-and-transcrip.md +6 -0
  228. package/corpus/templates/clips/changelog/2026-07-08-meeting-reminder-dropdowns-now-expand-fully-instead-of-being.md +6 -0
  229. package/corpus/templates/clips/changelog/2026-07-08-video-playback-controls-now-match-loom-style-5-second-skips-.md +6 -0
  230. package/corpus/templates/clips/desktop/src/app.tsx +123 -3
  231. package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +15 -1
  232. package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +23 -0
  233. package/corpus/templates/clips/desktop/src/styles.css +23 -1
  234. package/corpus/templates/clips/desktop/src-tauri/src/adhoc_meetings_watcher.rs +1 -3
  235. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +40 -6
  236. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +4 -2
  237. package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +3 -5
  238. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +23 -19
  239. package/corpus/templates/clips/desktop/src-tauri/src/shortcuts.rs +3 -3
  240. package/corpus/templates/clips/desktop/src-tauri/src/silence_detector.rs +0 -1
  241. package/corpus/templates/clips/desktop/src-tauri/src/state.rs +5 -0
  242. package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +18 -6
  243. package/corpus/templates/clips/server/lib/recording-upload-state.ts +63 -0
  244. package/corpus/templates/clips/server/lib/video-storage.ts +4 -0
  245. package/corpus/templates/clips/server/routes/api/recordings/[recordingId]/thumbnail.post.ts +19 -13
  246. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +40 -1
  247. package/corpus/templates/content/.agents/skills/actions/SKILL.md +5 -0
  248. package/corpus/templates/content/.agents/skills/real-time-sync/SKILL.md +1 -1
  249. package/corpus/templates/content/.agents/skills/security/SKILL.md +7 -0
  250. package/corpus/templates/content/.agents/skills/self-modifying-code/SKILL.md +20 -2
  251. package/corpus/templates/content/.agents/skills/storing-data/SKILL.md +5 -1
  252. package/corpus/templates/content/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  253. package/corpus/templates/content/AGENTS.md +4 -0
  254. package/corpus/templates/content/actions/_batch-utils.ts +8 -0
  255. package/corpus/templates/content/actions/_builder-cms-read-client.ts +7 -5
  256. package/corpus/templates/content/actions/_database-source-utils.ts +776 -319
  257. package/corpus/templates/content/actions/_database-utils.ts +6 -1
  258. package/corpus/templates/content/actions/_property-utils.ts +168 -0
  259. package/corpus/templates/content/actions/add-content-database-source-field-property.ts +19 -12
  260. package/corpus/templates/content/actions/bind-content-database-source-field.ts +19 -12
  261. package/corpus/templates/content/actions/delete-document.ts +9 -13
  262. package/corpus/templates/content/actions/refresh-content-database-source.ts +5 -5
  263. package/corpus/templates/content/app/components/editor/body-hydration.ts +35 -11
  264. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +47 -5
  265. package/corpus/templates/content/app/hooks/use-documents.ts +8 -2
  266. package/corpus/templates/content/app/routes/_app.settings.tsx +2 -2
  267. package/corpus/templates/content/app/routes/_app.team.tsx +1 -1
  268. package/corpus/templates/content/changelog/2026-07-08-builder-source-sync-now-completes-reliably-on-hosted-databases.md +6 -0
  269. package/corpus/templates/content/changelog/2026-07-08-fixed-builder-database-sync-so-large-sources-continue-past-t.md +6 -0
  270. package/corpus/templates/content/server/plugins/db.ts +19 -0
  271. package/corpus/templates/design/.agents/skills/actions/SKILL.md +5 -0
  272. package/corpus/templates/design/.agents/skills/security/SKILL.md +7 -0
  273. package/corpus/templates/design/.agents/skills/self-modifying-code/SKILL.md +20 -2
  274. package/corpus/templates/design/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  275. package/corpus/templates/design/AGENTS.md +4 -0
  276. package/corpus/templates/design/actions/take-design-screenshot.ts +12 -9
  277. package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +57 -13
  278. package/corpus/templates/design/app/routes/team.tsx +1 -1
  279. package/corpus/templates/design/changelog/2026-07-08-local-images-added-to-designs-now-upload-to-file-storage-ins.md +6 -0
  280. package/corpus/templates/dispatch/.agents/skills/actions/SKILL.md +5 -0
  281. package/corpus/templates/dispatch/.agents/skills/security/SKILL.md +7 -0
  282. package/corpus/templates/dispatch/.agents/skills/self-modifying-code/SKILL.md +20 -2
  283. package/corpus/templates/dispatch/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  284. package/corpus/templates/dispatch/AGENTS.md +4 -0
  285. package/corpus/templates/dispatch/app/hooks/use-navigation-state.ts +1 -1
  286. package/corpus/templates/dispatch/app/routes/settings.tsx +2 -2
  287. package/corpus/templates/dispatch/app/routes/team.tsx +1 -1
  288. package/corpus/templates/forms/.agents/skills/actions/SKILL.md +5 -0
  289. package/corpus/templates/forms/.agents/skills/real-time-sync/SKILL.md +1 -1
  290. package/corpus/templates/forms/.agents/skills/security/SKILL.md +7 -0
  291. package/corpus/templates/forms/.agents/skills/self-modifying-code/SKILL.md +20 -2
  292. package/corpus/templates/forms/.agents/skills/storing-data/SKILL.md +5 -1
  293. package/corpus/templates/forms/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  294. package/corpus/templates/forms/AGENTS.md +4 -0
  295. package/corpus/templates/forms/app/routes/_app.settings.tsx +2 -2
  296. package/corpus/templates/forms/app/routes/_app.team.tsx +1 -1
  297. package/corpus/templates/forms/shared/navigation.ts +1 -1
  298. package/corpus/templates/macros/.agents/skills/security/SKILL.md +7 -0
  299. package/corpus/templates/macros/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  300. package/corpus/templates/macros/AGENTS.md +4 -0
  301. package/corpus/templates/macros/app/routes/settings.tsx +2 -2
  302. package/corpus/templates/macros/app/routes/team.tsx +1 -1
  303. package/corpus/templates/mail/.agents/skills/actions/SKILL.md +5 -0
  304. package/corpus/templates/mail/.agents/skills/email-drafts/SKILL.md +1 -1
  305. package/corpus/templates/mail/.agents/skills/real-time-sync/SKILL.md +1 -1
  306. package/corpus/templates/mail/.agents/skills/security/SKILL.md +7 -0
  307. package/corpus/templates/mail/.agents/skills/self-modifying-code/SKILL.md +20 -2
  308. package/corpus/templates/mail/.agents/skills/storing-data/SKILL.md +5 -1
  309. package/corpus/templates/mail/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  310. package/corpus/templates/mail/AGENTS.md +4 -0
  311. package/corpus/templates/mail/changelog/2026-07-08-mail-attachments-in-hosted-environments-now-require-file-sto.md +6 -0
  312. package/corpus/templates/mail/server/handlers/media.ts +26 -1
  313. package/corpus/templates/mail/server/lib/outgoing-email.ts +24 -1
  314. package/corpus/templates/mail/server/lib/upload-store.ts +2 -1
  315. package/corpus/templates/plan/.agents/skills/actions/SKILL.md +5 -0
  316. package/corpus/templates/plan/.agents/skills/adding-a-feature/SKILL.md +5 -0
  317. package/corpus/templates/plan/.agents/skills/real-time-sync/SKILL.md +1 -1
  318. package/corpus/templates/plan/.agents/skills/security/SKILL.md +7 -0
  319. package/corpus/templates/plan/.agents/skills/self-modifying-code/SKILL.md +20 -2
  320. package/corpus/templates/plan/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  321. package/corpus/templates/plan/AGENTS.md +4 -0
  322. package/corpus/templates/plan/app/hooks/use-navigation-state.ts +1 -1
  323. package/corpus/templates/plan/app/routes/settings.tsx +2 -2
  324. package/corpus/templates/plan/app/routes/team.tsx +1 -1
  325. package/corpus/templates/plan/changelog/2026-07-08-hosted-plan-images-now-require-connected-storage.md +6 -0
  326. package/corpus/templates/plan/server/lib/plan-assets.ts +33 -4
  327. package/corpus/templates/slides/.agents/skills/actions/SKILL.md +5 -0
  328. package/corpus/templates/slides/.agents/skills/security/SKILL.md +7 -0
  329. package/corpus/templates/slides/.agents/skills/self-modifying-code/SKILL.md +20 -2
  330. package/corpus/templates/slides/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  331. package/corpus/templates/slides/AGENTS.md +4 -0
  332. package/corpus/templates/slides/actions/generate-image-api.ts +15 -3
  333. package/corpus/templates/slides/app/routes/settings.tsx +2 -2
  334. package/corpus/templates/slides/app/routes/team.tsx +1 -1
  335. package/corpus/templates/slides/changelog/2026-07-08-generated-slide-images-now-return-hosted-file-storage-urls-i.md +6 -0
  336. package/corpus/templates/slides/shared/api.ts +1 -1
  337. package/corpus/templates/videos/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  338. package/corpus/templates/voice/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  339. package/dist/agent/production-agent.d.ts +5 -1
  340. package/dist/agent/production-agent.d.ts.map +1 -1
  341. package/dist/agent/production-agent.js +112 -42
  342. package/dist/agent/production-agent.js.map +1 -1
  343. package/dist/agent/tool-search.d.ts +2 -0
  344. package/dist/agent/tool-search.d.ts.map +1 -1
  345. package/dist/agent/tool-search.js +60 -4
  346. package/dist/agent/tool-search.js.map +1 -1
  347. package/dist/application-state/store.d.ts.map +1 -1
  348. package/dist/application-state/store.js +8 -2
  349. package/dist/application-state/store.js.map +1 -1
  350. package/dist/cli/index.js +19 -0
  351. package/dist/cli/index.js.map +1 -1
  352. package/dist/cli/upgrade.d.ts +100 -0
  353. package/dist/cli/upgrade.d.ts.map +1 -0
  354. package/dist/cli/upgrade.js +678 -0
  355. package/dist/cli/upgrade.js.map +1 -0
  356. package/dist/client/AssistantChat.d.ts.map +1 -1
  357. package/dist/client/AssistantChat.js +25 -14
  358. package/dist/client/AssistantChat.js.map +1 -1
  359. package/dist/client/HighlightedCodeBlock.d.ts +2 -0
  360. package/dist/client/HighlightedCodeBlock.d.ts.map +1 -1
  361. package/dist/client/HighlightedCodeBlock.js +10 -1
  362. package/dist/client/HighlightedCodeBlock.js.map +1 -1
  363. package/dist/client/PoweredByBadge.d.ts +1 -1
  364. package/dist/client/PoweredByBadge.d.ts.map +1 -1
  365. package/dist/client/PoweredByBadge.js +3 -9
  366. package/dist/client/PoweredByBadge.js.map +1 -1
  367. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  368. package/dist/client/agent-chat-adapter.js +60 -13
  369. package/dist/client/agent-chat-adapter.js.map +1 -1
  370. package/dist/client/chat/message-components.d.ts.map +1 -1
  371. package/dist/client/chat/message-components.js +61 -8
  372. package/dist/client/chat/message-components.js.map +1 -1
  373. package/dist/client/chat/tool-call-display.d.ts +12 -0
  374. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  375. package/dist/client/chat/tool-call-display.js +136 -42
  376. package/dist/client/chat/tool-call-display.js.map +1 -1
  377. package/dist/client/chat/widgets/DataTableWidget.d.ts.map +1 -1
  378. package/dist/client/chat/widgets/DataTableWidget.js +19 -2
  379. package/dist/client/chat/widgets/DataTableWidget.js.map +1 -1
  380. package/dist/client/code-agent-chat-adapter.js +2 -9
  381. package/dist/client/code-agent-chat-adapter.js.map +1 -1
  382. package/dist/client/db-admin/TableEditor.d.ts.map +1 -1
  383. package/dist/client/db-admin/TableEditor.js +19 -2
  384. package/dist/client/db-admin/TableEditor.js.map +1 -1
  385. package/dist/client/db-admin/export-utils.d.ts +2 -0
  386. package/dist/client/db-admin/export-utils.d.ts.map +1 -1
  387. package/dist/client/db-admin/export-utils.js +11 -3
  388. package/dist/client/db-admin/export-utils.js.map +1 -1
  389. package/dist/client/db-admin/useAgentSync.d.ts.map +1 -1
  390. package/dist/client/db-admin/useAgentSync.js +63 -0
  391. package/dist/client/db-admin/useAgentSync.js.map +1 -1
  392. package/dist/client/error-capture.d.ts.map +1 -1
  393. package/dist/client/error-capture.js +41 -7
  394. package/dist/client/error-capture.js.map +1 -1
  395. package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -1
  396. package/dist/client/extensions/EmbeddedExtension.js +3 -1
  397. package/dist/client/extensions/EmbeddedExtension.js.map +1 -1
  398. package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
  399. package/dist/client/extensions/ExtensionViewer.js +32 -5
  400. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  401. package/dist/client/extensions/InlineExtensionFrame.d.ts.map +1 -1
  402. package/dist/client/extensions/InlineExtensionFrame.js +3 -1
  403. package/dist/client/extensions/InlineExtensionFrame.js.map +1 -1
  404. package/dist/client/extensions/portable-extension.d.ts.map +1 -1
  405. package/dist/client/extensions/portable-extension.js +1 -0
  406. package/dist/client/extensions/portable-extension.js.map +1 -1
  407. package/dist/client/org/OrgSwitcher.d.ts +1 -1
  408. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  409. package/dist/client/org/OrgSwitcher.js +11 -6
  410. package/dist/client/org/OrgSwitcher.js.map +1 -1
  411. package/dist/client/org/TeamPage.d.ts.map +1 -1
  412. package/dist/client/org/TeamPage.js +5 -5
  413. package/dist/client/org/TeamPage.js.map +1 -1
  414. package/dist/client/session-replay.d.ts +0 -8
  415. package/dist/client/session-replay.d.ts.map +1 -1
  416. package/dist/client/session-replay.js +3 -80
  417. package/dist/client/session-replay.js.map +1 -1
  418. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  419. package/dist/client/settings/SettingsPanel.js +89 -33
  420. package/dist/client/settings/SettingsPanel.js.map +1 -1
  421. package/dist/client/settings/SettingsSection.d.ts +19 -4
  422. package/dist/client/settings/SettingsSection.d.ts.map +1 -1
  423. package/dist/client/settings/SettingsSection.js +33 -4
  424. package/dist/client/settings/SettingsSection.js.map +1 -1
  425. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  426. package/dist/client/settings/SettingsTabsPage.js +21 -10
  427. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  428. package/dist/client/sse-event-processor.d.ts +9 -0
  429. package/dist/client/sse-event-processor.d.ts.map +1 -1
  430. package/dist/client/sse-event-processor.js +20 -2
  431. package/dist/client/sse-event-processor.js.map +1 -1
  432. package/dist/db-admin/agent-tools.d.ts.map +1 -1
  433. package/dist/db-admin/agent-tools.js +7 -2
  434. package/dist/db-admin/agent-tools.js.map +1 -1
  435. package/dist/db-admin/operations.d.ts.map +1 -1
  436. package/dist/db-admin/operations.js +90 -4
  437. package/dist/db-admin/operations.js.map +1 -1
  438. package/dist/db-admin/routes.d.ts.map +1 -1
  439. package/dist/db-admin/routes.js +1 -0
  440. package/dist/db-admin/routes.js.map +1 -1
  441. package/dist/db-admin/types.d.ts +4 -0
  442. package/dist/db-admin/types.d.ts.map +1 -1
  443. package/dist/db-admin/types.js.map +1 -1
  444. package/dist/extensions/actions.d.ts.map +1 -1
  445. package/dist/extensions/actions.js +85 -5
  446. package/dist/extensions/actions.js.map +1 -1
  447. package/dist/extensions/html-shell.d.ts +5 -4
  448. package/dist/extensions/html-shell.d.ts.map +1 -1
  449. package/dist/extensions/html-shell.js.map +1 -1
  450. package/dist/extensions/routes.d.ts.map +1 -1
  451. package/dist/extensions/routes.js +8 -0
  452. package/dist/extensions/routes.js.map +1 -1
  453. package/dist/navigation/index.d.ts +1 -1
  454. package/dist/navigation/index.d.ts.map +1 -1
  455. package/dist/navigation/index.js +1 -1
  456. package/dist/navigation/index.js.map +1 -1
  457. package/dist/notifications/channels.d.ts +8 -3
  458. package/dist/notifications/channels.d.ts.map +1 -1
  459. package/dist/notifications/channels.js +61 -22
  460. package/dist/notifications/channels.js.map +1 -1
  461. package/dist/notifications/registry.d.ts.map +1 -1
  462. package/dist/notifications/registry.js +14 -3
  463. package/dist/notifications/registry.js.map +1 -1
  464. package/dist/notifications/types.d.ts +4 -1
  465. package/dist/notifications/types.d.ts.map +1 -1
  466. package/dist/notifications/types.js.map +1 -1
  467. package/dist/resources/handlers.d.ts +5 -0
  468. package/dist/resources/handlers.d.ts.map +1 -1
  469. package/dist/resources/handlers.js +9 -8
  470. package/dist/resources/handlers.js.map +1 -1
  471. package/dist/server/agent-chat-plugin.d.ts +5 -1
  472. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  473. package/dist/server/agent-chat-plugin.js +2 -2
  474. package/dist/server/agent-chat-plugin.js.map +1 -1
  475. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  476. package/dist/server/poll.d.ts +12 -4
  477. package/dist/server/poll.d.ts.map +1 -1
  478. package/dist/server/poll.js +236 -9
  479. package/dist/server/poll.js.map +1 -1
  480. package/dist/server/request-context.d.ts +7 -0
  481. package/dist/server/request-context.d.ts.map +1 -1
  482. package/dist/server/request-context.js.map +1 -1
  483. package/dist/styles/agent-conversation.css +1 -1
  484. package/dist/styles/agent-native.css +27 -0
  485. package/dist/templates/default/.agents/skills/actions/SKILL.md +5 -0
  486. package/dist/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  487. package/dist/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
  488. package/dist/templates/default/.agents/skills/security/SKILL.md +7 -0
  489. package/dist/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
  490. package/dist/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
  491. package/dist/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  492. package/dist/templates/default/AGENTS.md +14 -5
  493. package/dist/templates/default/package.json +2 -1
  494. package/dist/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  495. package/dist/templates/headless/AGENTS.md +13 -3
  496. package/dist/templates/headless/package.json +1 -0
  497. package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
  498. package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  499. package/dist/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
  500. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
  501. package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
  502. package/dist/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
  503. package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
  504. package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
  505. package/dist/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
  506. package/dist/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  507. package/dist/templates/workspace-core/AGENTS.md +7 -1
  508. package/dist/templates/workspace-root/AGENTS.md +17 -5
  509. package/dist/templates/workspace-root/package.json +1 -0
  510. package/docs/content/faq.mdx +17 -0
  511. package/docs/content/notifications.mdx +12 -6
  512. package/package.json +2 -2
  513. package/src/templates/default/.agents/skills/actions/SKILL.md +5 -0
  514. package/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  515. package/src/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
  516. package/src/templates/default/.agents/skills/security/SKILL.md +7 -0
  517. package/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
  518. package/src/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
  519. package/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  520. package/src/templates/default/AGENTS.md +14 -5
  521. package/src/templates/default/package.json +2 -1
  522. package/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  523. package/src/templates/headless/AGENTS.md +13 -3
  524. package/src/templates/headless/package.json +1 -0
  525. package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
  526. package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  527. package/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
  528. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
  529. package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
  530. package/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
  531. package/src/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
  532. package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
  533. package/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
  534. package/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  535. package/src/templates/workspace-core/AGENTS.md +7 -1
  536. package/src/templates/workspace-root/AGENTS.md +17 -5
  537. package/src/templates/workspace-root/package.json +1 -0
  538. package/corpus/templates/analytics/changelog/2026-07-08-session-replay-clamps-ultra-wide-viewports-while-keeping-the.md +0 -6
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-08
4
+ ---
5
+
6
+ Hosted recording uploads now avoid storing video chunks in SQL and ask users to restart when a resumable storage session is missing.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-08
4
+ ---
5
+
6
+ Meeting notes keep their recording state when the desktop popover is closed and reopened.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-08
4
+ ---
5
+
6
+ Meeting recaps now keep summaries, action items, and transcript controls cleaner on one page.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-08
4
+ ---
5
+
6
+ Meeting reminder dropdowns now expand fully instead of being cut off.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-08
4
+ ---
5
+
6
+ Video playback controls now match Loom-style 5-second skips and pause from the video surface.
@@ -713,6 +713,7 @@ export function App() {
713
713
  const [meetingStartMessage, setMeetingStartMessage] = useState<string | null>(
714
714
  null,
715
715
  );
716
+ const [activeMeetingId, setActiveMeetingId] = useState<string | null>(null);
716
717
  const [readinessOpen, setReadinessOpen] = useState<boolean>(
717
718
  () => !loadBool(READINESS_REVIEWED_KEY, false),
718
719
  );
@@ -1140,6 +1141,7 @@ export function App() {
1140
1141
  }, [authStatus, callClipsAction]);
1141
1142
 
1142
1143
  const startMeetingNotes = useCallback((meeting: PopoverMeeting) => {
1144
+ setActiveMeetingId(meeting.id);
1143
1145
  setMeetingStartMessage(`Starting notes for ${meeting.title}…`);
1144
1146
  emit("meetings:start-transcription", {
1145
1147
  meetingId: meeting.id,
@@ -1147,10 +1149,98 @@ export function App() {
1147
1149
  reason: "user",
1148
1150
  }).catch((err) => {
1149
1151
  console.error("[clips-popover] start meeting notes failed:", err);
1152
+ setActiveMeetingId(null);
1150
1153
  setMeetingStartMessage("Could not start notes. Try again from Meetings.");
1151
1154
  });
1152
1155
  }, []);
1153
1156
 
1157
+ const startMeetingNotesAndJoin = useCallback(
1158
+ (meeting: PopoverMeeting) => {
1159
+ if (meeting.joinUrl) {
1160
+ openExternal(meeting.joinUrl).catch((err) => {
1161
+ console.error("[clips-popover] open meeting join url failed:", err);
1162
+ });
1163
+ }
1164
+ startMeetingNotes(meeting);
1165
+ },
1166
+ [startMeetingNotes],
1167
+ );
1168
+
1169
+ const showActiveMeetingPill = useCallback((meetingId: string) => {
1170
+ invoke("recording_pill_show", { meetingId, mode: "meeting" }).catch(
1171
+ (err) => {
1172
+ console.error("[clips-popover] show meeting pill failed:", err);
1173
+ },
1174
+ );
1175
+ emit("clips:pill-context", { meetingId, mode: "meeting" }).catch(() => {});
1176
+ }, []);
1177
+
1178
+ useEffect(() => {
1179
+ invoke<string | null>("get_active_meeting_id")
1180
+ .then((meetingId) => {
1181
+ if (meetingId) setActiveMeetingId(meetingId);
1182
+ })
1183
+ .catch(() => {});
1184
+
1185
+ let stopped = false;
1186
+ const unlistens: Array<() => void> = [];
1187
+ const track = (promise: Promise<() => void>) => {
1188
+ promise
1189
+ .then((unlisten) => {
1190
+ if (stopped) {
1191
+ unlisten();
1192
+ return;
1193
+ }
1194
+ unlistens.push(unlisten);
1195
+ })
1196
+ .catch(() => {});
1197
+ };
1198
+ track(
1199
+ listen<{ meetingId?: string | null }>(
1200
+ "meetings:transcription-started",
1201
+ (event) => {
1202
+ if (event.payload?.meetingId) {
1203
+ setActiveMeetingId(event.payload.meetingId);
1204
+ }
1205
+ },
1206
+ ),
1207
+ );
1208
+ track(
1209
+ listen<{ meetingId?: string | null }>(
1210
+ "meetings:transcription-stopped",
1211
+ (event) => {
1212
+ setActiveMeetingId((current) =>
1213
+ !event.payload?.meetingId || event.payload.meetingId === current
1214
+ ? null
1215
+ : current,
1216
+ );
1217
+ },
1218
+ ),
1219
+ );
1220
+ track(
1221
+ listen<{ meetingId?: string | null }>(
1222
+ "meetings:transcription-error",
1223
+ (event) => {
1224
+ setActiveMeetingId((current) =>
1225
+ !event.payload?.meetingId || event.payload.meetingId === current
1226
+ ? null
1227
+ : current,
1228
+ );
1229
+ },
1230
+ ),
1231
+ );
1232
+ return () => {
1233
+ stopped = true;
1234
+ unlistens.forEach((unlisten) => unlisten());
1235
+ unlistens.length = 0;
1236
+ };
1237
+ }, []);
1238
+
1239
+ useEffect(() => {
1240
+ if (!popoverVisible || !activeMeetingId) return;
1241
+ showActiveMeetingPill(activeMeetingId);
1242
+ }, [activeMeetingId, popoverVisible, showActiveMeetingPill]);
1243
+
1154
1244
  useMeetingTranscription({
1155
1245
  callClipsAction,
1156
1246
  serverUrl,
@@ -2419,6 +2509,7 @@ export function App() {
2419
2509
  loading={meetingsLoading}
2420
2510
  error={meetingsError}
2421
2511
  startMessage={meetingStartMessage}
2512
+ activeMeetingId={activeMeetingId}
2422
2513
  meetingsEnabled={featureConfig?.meetingsEnabled !== false}
2423
2514
  onBack={() => setPopoverView("recorder")}
2424
2515
  onRefresh={fetchUpcomingMeetings}
@@ -2428,6 +2519,8 @@ export function App() {
2428
2519
  }
2429
2520
  onOpenSettings={() => setPopoverView("settings")}
2430
2521
  onStartNotes={startMeetingNotes}
2522
+ onStartNotesAndJoin={startMeetingNotesAndJoin}
2523
+ onShowActiveMeeting={showActiveMeetingPill}
2431
2524
  />
2432
2525
  </div>
2433
2526
  );
@@ -3326,6 +3419,7 @@ function MeetingsPopoverView({
3326
3419
  loading,
3327
3420
  error,
3328
3421
  startMessage,
3422
+ activeMeetingId,
3329
3423
  meetingsEnabled,
3330
3424
  onBack,
3331
3425
  onRefresh,
@@ -3333,11 +3427,14 @@ function MeetingsPopoverView({
3333
3427
  onOpenMeeting,
3334
3428
  onOpenSettings,
3335
3429
  onStartNotes,
3430
+ onStartNotesAndJoin,
3431
+ onShowActiveMeeting,
3336
3432
  }: {
3337
3433
  meetings: PopoverMeeting[];
3338
3434
  loading: boolean;
3339
3435
  error: string | null;
3340
3436
  startMessage: string | null;
3437
+ activeMeetingId: string | null;
3341
3438
  meetingsEnabled: boolean;
3342
3439
  onBack: () => void;
3343
3440
  onRefresh: () => void;
@@ -3345,6 +3442,8 @@ function MeetingsPopoverView({
3345
3442
  onOpenMeeting: (meetingId: string) => void;
3346
3443
  onOpenSettings: () => void;
3347
3444
  onStartNotes: (meeting: PopoverMeeting) => void;
3445
+ onStartNotesAndJoin: (meeting: PopoverMeeting) => void;
3446
+ onShowActiveMeeting: (meetingId: string) => void;
3348
3447
  }) {
3349
3448
  return (
3350
3449
  <div className="setup popover-view">
@@ -3402,6 +3501,8 @@ function MeetingsPopoverView({
3402
3501
  <div className="popover-list">
3403
3502
  {meetings.map((meeting) => {
3404
3503
  const canStart = meetingCanStartNotes(meeting);
3504
+ const hasJoin = Boolean(meeting.joinUrl);
3505
+ const isActive = activeMeetingId === meeting.id;
3405
3506
  return (
3406
3507
  <div className="popover-list-item" key={meeting.id}>
3407
3508
  <div className="popover-list-icon">
@@ -3414,13 +3515,32 @@ function MeetingsPopoverView({
3414
3515
  {meeting.platform ? ` · ${meeting.platform}` : ""}
3415
3516
  </div>
3416
3517
  </div>
3417
- {canStart ? (
3518
+ {isActive ? (
3519
+ <button
3520
+ type="button"
3521
+ className="popover-list-action popover-list-action-active"
3522
+ onClick={() => onShowActiveMeeting(meeting.id)}
3523
+ title="Meeting notes are recording"
3524
+ >
3525
+ <span className="popover-list-action-dot" aria-hidden />
3526
+ Recording
3527
+ </button>
3528
+ ) : canStart ? (
3418
3529
  <button
3419
3530
  type="button"
3420
3531
  className="popover-list-action popover-list-action-primary"
3421
- onClick={() => onStartNotes(meeting)}
3532
+ onClick={() =>
3533
+ hasJoin
3534
+ ? onStartNotesAndJoin(meeting)
3535
+ : onStartNotes(meeting)
3536
+ }
3537
+ title={
3538
+ hasJoin
3539
+ ? "Start notes and join the meeting"
3540
+ : "Start meeting notes"
3541
+ }
3422
3542
  >
3423
- Start notes
3543
+ {hasJoin ? "Start + join" : "Start notes"}
3424
3544
  </button>
3425
3545
  ) : (
3426
3546
  <button
@@ -245,6 +245,14 @@ export function useMeetingTranscription({
245
245
  const existing = sessionRef.current;
246
246
  if (existing) {
247
247
  if (!existing.stopping && existing.meetingId === meetingId) {
248
+ await invoke("recording_pill_show", {
249
+ meetingId: existing.meetingId,
250
+ mode: "meeting",
251
+ }).catch(() => {});
252
+ emit("clips:pill-context", {
253
+ meetingId: existing.meetingId,
254
+ mode: "meeting",
255
+ }).catch(() => {});
248
256
  emit("meetings:hide-notification", { meetingId }).catch(() => {});
249
257
  return;
250
258
  }
@@ -282,7 +290,13 @@ export function useMeetingTranscription({
282
290
  };
283
291
  sessionRef.current = session;
284
292
  await invoke("set_recording_state", { active: true }).catch(() => {});
285
- await invoke("set_meeting_active", { active: true }).catch(() => {});
293
+ await invoke("set_meeting_active", {
294
+ active: true,
295
+ meetingId: resolvedMeetingId,
296
+ }).catch(() => {});
297
+ emit("meetings:transcription-started", {
298
+ meetingId: resolvedMeetingId,
299
+ }).catch(() => {});
286
300
 
287
301
  const scheduleFlush = () => {
288
302
  if (session.flushTimer) window.clearTimeout(session.flushTimer);
@@ -6,6 +6,7 @@ import {
6
6
  IconX,
7
7
  } from "@tabler/icons-react";
8
8
  import { invoke } from "@tauri-apps/api/core";
9
+ import { LogicalSize } from "@tauri-apps/api/dpi";
9
10
  import { emit, listen } from "@tauri-apps/api/event";
10
11
  import { getCurrentWindow } from "@tauri-apps/api/window";
11
12
  import { open as openExternal } from "@tauri-apps/plugin-shell";
@@ -37,6 +38,9 @@ interface TranscriptionStatusPayload {
37
38
 
38
39
  const SNOOZE_MS = 5 * 60_000;
39
40
  const FALLBACK_AUTO_HIDE_MS = 6 * 60_000;
41
+ const NOTIFICATION_WINDOW_WIDTH = 440;
42
+ const NOTIFICATION_COLLAPSED_HEIGHT = 120;
43
+ const NOTIFICATION_MENU_HEIGHT = 224;
40
44
 
41
45
  /**
42
46
  * Open a meeting join URL via the Tauri shell plugin.
@@ -50,6 +54,17 @@ async function openJoinUrl(url: string | null | undefined): Promise<void> {
50
54
  }
51
55
  }
52
56
 
57
+ function resizeNotificationWindow(expanded: boolean) {
58
+ const height = expanded
59
+ ? NOTIFICATION_MENU_HEIGHT
60
+ : NOTIFICATION_COLLAPSED_HEIGHT;
61
+ getCurrentWindow()
62
+ .setSize(new LogicalSize(NOTIFICATION_WINDOW_WIDTH, height))
63
+ .catch((err) => {
64
+ console.warn("[clips-meeting-notif] resize failed", err);
65
+ });
66
+ }
67
+
53
68
  function ProviderGlyph({ provider }: { provider: MeetingJoinProvider }) {
54
69
  // Lightweight glyphs — keep the overlay free of extra assets. Zoom blue
55
70
  // camera / Meet green / Teams purple, otherwise a generic video icon.
@@ -115,6 +130,14 @@ export function MeetingNotification() {
115
130
  dataRef.current = data;
116
131
  }, [data]);
117
132
 
133
+ useEffect(() => {
134
+ resizeNotificationWindow(Boolean(data && menuOpen));
135
+ }, [data, menuOpen]);
136
+
137
+ useEffect(() => {
138
+ return () => resizeNotificationWindow(false);
139
+ }, []);
140
+
118
141
  useEffect(() => {
119
142
  const win = getCurrentWindow();
120
143
  if (data) {
@@ -1195,6 +1195,7 @@ body[data-clips-route="recording-pill"] #root {
1195
1195
  display: flex;
1196
1196
  flex-direction: column;
1197
1197
  gap: 6px;
1198
+ margin-bottom: 4px;
1198
1199
  }
1199
1200
 
1200
1201
  .popover-list-item {
@@ -1264,6 +1265,27 @@ body[data-clips-route="recording-pill"] #root {
1264
1265
  background: var(--brand-hover);
1265
1266
  }
1266
1267
 
1268
+ .popover-list-action-active {
1269
+ display: inline-flex;
1270
+ align-items: center;
1271
+ gap: 5px;
1272
+ border-color: rgba(34, 197, 94, 0.36);
1273
+ background: rgba(34, 197, 94, 0.12);
1274
+ color: #4ade80;
1275
+ }
1276
+
1277
+ .popover-list-action-active:hover {
1278
+ background: rgba(34, 197, 94, 0.18);
1279
+ }
1280
+
1281
+ .popover-list-action-dot {
1282
+ width: 6px;
1283
+ height: 6px;
1284
+ border-radius: 999px;
1285
+ background: currentColor;
1286
+ box-shadow: 0 0 0 3px rgba(34, 197, 94, 0.12);
1287
+ }
1288
+
1267
1289
  .popover-kv {
1268
1290
  display: flex;
1269
1291
  align-items: center;
@@ -1425,7 +1447,7 @@ body[data-clips-route="recording-pill"] #root {
1425
1447
  content isn't flush with the panel edge. Must follow `.setup` so it wins
1426
1448
  over the shorthand padding above. */
1427
1449
  .setup.popover-view {
1428
- padding-bottom: 20px;
1450
+ padding-bottom: 26px;
1429
1451
  }
1430
1452
 
1431
1453
  .setup h2 {
@@ -123,9 +123,7 @@ async fn tick_macos(
123
123
  config: &crate::config::FeatureConfig,
124
124
  ) -> Result<(), String> {
125
125
  let front = crate::util::frontmost_bundle_id();
126
- let matched = front
127
- .as_deref()
128
- .and_then(match_vc_bundle);
126
+ let matched = front.as_deref().and_then(match_vc_bundle);
129
127
 
130
128
  let Some((platform, title)) = matched else {
131
129
  // VC app left front — clear session dedupe so a later re-focus can
@@ -15,8 +15,8 @@ use tauri::{
15
15
 
16
16
  use crate::dlog;
17
17
  use crate::state::{
18
- DictationActive, LastTranscript, MeetingActive, RecordingActive, TrayAnchor, VoiceTargetBundle,
19
- VoiceWakePopover,
18
+ ActiveMeetingId, DictationActive, LastTranscript, MeetingActive, RecordingActive, TrayAnchor,
19
+ VoiceTargetBundle, VoiceWakePopover,
20
20
  };
21
21
  use crate::util::{
22
22
  build_overlay_url, configure_overlay_behavior, hide_voice_wake_popover, is_recording_active,
@@ -969,8 +969,11 @@ pub async fn hide_overlays(app: AppHandle) -> Result<(), String> {
969
969
  let _ = w.close();
970
970
  }
971
971
  }
972
- // A recording pill may be owned by meeting or voice flows; tear it down too.
973
- let _ = crate::recording_indicator::recording_pill_hide(app).await;
972
+ // The meeting pill belongs to the live notes session, not the popover's
973
+ // camera/bubble lifecycle. Keep it visible when the popover closes.
974
+ if !crate::util::is_meeting_active(&app) {
975
+ let _ = crate::recording_indicator::recording_pill_hide(app).await;
976
+ }
974
977
  Ok(())
975
978
  }
976
979
 
@@ -1887,16 +1890,37 @@ pub async fn set_recording_state(app: AppHandle, active: bool) -> Result<(), Str
1887
1890
  /// teardown in `lib.rs`: quit stays instant when no meeting is active, and
1888
1891
  /// only waits for a graceful stop when one is.
1889
1892
  #[tauri::command]
1890
- pub async fn set_meeting_active(app: AppHandle, active: bool) -> Result<(), String> {
1891
- dlog!("[clips-tray] set_meeting_active active={}", active);
1893
+ pub async fn set_meeting_active(
1894
+ app: AppHandle,
1895
+ active: bool,
1896
+ meeting_id: Option<String>,
1897
+ ) -> Result<(), String> {
1898
+ dlog!(
1899
+ "[clips-tray] set_meeting_active active={} meeting_id={:?}",
1900
+ active,
1901
+ meeting_id
1902
+ );
1892
1903
  if let Some(state) = app.try_state::<MeetingActive>() {
1893
1904
  if let Ok(mut g) = state.0.lock() {
1894
1905
  *g = active;
1895
1906
  }
1896
1907
  }
1908
+ if let Some(state) = app.try_state::<ActiveMeetingId>() {
1909
+ if let Ok(mut g) = state.0.lock() {
1910
+ *g = if active { meeting_id } else { None };
1911
+ }
1912
+ }
1913
+ crate::tray::rebuild_tray_menu(&app);
1897
1914
  Ok(())
1898
1915
  }
1899
1916
 
1917
+ #[tauri::command]
1918
+ pub async fn get_active_meeting_id(app: AppHandle) -> Result<Option<String>, String> {
1919
+ Ok(app
1920
+ .try_state::<ActiveMeetingId>()
1921
+ .and_then(|s| s.0.lock().ok().and_then(|g| g.clone())))
1922
+ }
1923
+
1900
1924
  /// Guards the quit-teardown handshake in `lib.rs`'s `ExitRequested` handler:
1901
1925
  /// 0 = not requested, 1 = requested (waiting on JS), 2 = done (safe to let
1902
1926
  /// the process exit — including the watchdog's own forced exit, which must
@@ -1937,6 +1961,16 @@ pub async fn reset_state(app: AppHandle) -> Result<(), String> {
1937
1961
  *g = false;
1938
1962
  }
1939
1963
  }
1964
+ if let Some(state) = app.try_state::<MeetingActive>() {
1965
+ if let Ok(mut g) = state.0.lock() {
1966
+ *g = false;
1967
+ }
1968
+ }
1969
+ if let Some(state) = app.try_state::<ActiveMeetingId>() {
1970
+ if let Ok(mut g) = state.0.lock() {
1971
+ *g = None;
1972
+ }
1973
+ }
1940
1974
  if let Some(w) = app.get_webview_window(REGION_GUIDES_LABEL) {
1941
1975
  let _ = w.close();
1942
1976
  }
@@ -33,8 +33,8 @@ use tauri::{Emitter, Manager};
33
33
 
34
34
  use clips::{position_popover, toggle_popover};
35
35
  use state::{
36
- DictationActive, DictationEnabled, LastTranscript, MeetingActive, PopoverShownAt,
37
- RecordingActive, TrayAnchor, TrayMeetings, VoiceTargetBundle, VoiceWakePopover,
36
+ ActiveMeetingId, DictationActive, DictationEnabled, LastTranscript, MeetingActive,
37
+ PopoverShownAt, RecordingActive, TrayAnchor, TrayMeetings, VoiceTargetBundle, VoiceWakePopover,
38
38
  };
39
39
  use util::{
40
40
  configure_overlay_behavior, is_recording_active, present_interactive_window,
@@ -95,6 +95,7 @@ pub fn run() {
95
95
  clips::paste_last_dictation,
96
96
  clips::set_recording_state,
97
97
  clips::set_meeting_active,
98
+ clips::get_active_meeting_id,
98
99
  clips::quit_teardown_done,
99
100
  clips::reset_state,
100
101
  clips::save_bubble_position,
@@ -204,6 +205,7 @@ pub fn run() {
204
205
  .manage(PopoverShownAt::default())
205
206
  .manage(RecordingActive::default())
206
207
  .manage(MeetingActive::default())
208
+ .manage(ActiveMeetingId::default())
207
209
  .manage(DictationEnabled::default())
208
210
  .manage(DictationActive::default())
209
211
  .manage(VoiceWakePopover::default())
@@ -289,9 +289,7 @@ async fn tick_once(app: &AppHandle, client: &reqwest::Client) -> Result<(), Stri
289
289
  let limit = MEETING_POLL_LIMIT.to_string();
290
290
  // Include meetings that started within the hold window so a late-open
291
291
  // desktop still surfaces the reminder until 5 minutes after start.
292
- let within_min = ((NOTIFY_LEAD_SECS + NOTIFY_HOLD_AFTER_START_SECS) / 60
293
- + 1)
294
- .to_string();
292
+ let within_min = ((NOTIFY_LEAD_SECS + NOTIFY_HOLD_AFTER_START_SECS) / 60 + 1).to_string();
295
293
  let mut req = client.get(&url).query(&[
296
294
  ("view", "upcoming"),
297
295
  ("limit", limit.as_str()),
@@ -368,8 +366,8 @@ async fn tick_once(app: &AppHandle, client: &reqwest::Client) -> Result<(), Stri
368
366
 
369
367
  // Eligible from 1 min before start through 5 min after start.
370
368
  // secs_until > 0 => still upcoming; negative => already started.
371
- let in_window = secs_until <= NOTIFY_LEAD_SECS
372
- && secs_until >= -NOTIFY_HOLD_AFTER_START_SECS;
369
+ let in_window =
370
+ secs_until <= NOTIFY_LEAD_SECS && secs_until >= -NOTIFY_HOLD_AFTER_START_SECS;
373
371
 
374
372
  let eligible = match g.snoozed_until.get(&m.id).copied() {
375
373
  Some(until) if now_ts < until => false, // still snoozed
@@ -65,22 +65,22 @@ const AUDIO_DENOISE_FILTER: &str = "afftdn=nr=10:nf=-50:tn=1";
65
65
  // explicit output rate the AAC track ends up at 192 kHz and plays back slow.
66
66
  const AUDIO_OUTPUT_SAMPLE_RATE: u32 = 48000;
67
67
 
68
- // Pre-gain for mic-only native captures. ScreenCaptureKit records without
69
- // WebRTC AGC (unlike Loom / the browser path), so speech often lands well
70
- // below -16 LUFS. 12 dB before loudnorm matches Loom-ish perceptual loudness
71
- // for MacBook mics; loudnorm still clamps true peaks at TP=-1.5.
68
+ // Pre-gain for mic-only native captures. ScreenCaptureKit records without
69
+ // WebRTC AGC (unlike Loom / the browser path), so speech often lands well
70
+ // below -16 LUFS. 12 dB before loudnorm matches Loom-ish perceptual loudness
71
+ // for MacBook mics; loudnorm still clamps true peaks at TP=-1.5.
72
72
  const AUDIO_MIC_PREGAIN_FILTER: &str = "volume=12dB";
73
73
  // After the mic+system centered downmix (0.5*L+0.5*R) each source is ~
74
- // 6 dB quieter. Restore energy before loudnorm so dual-capture clips are not
75
- // systematically quieter than mic-only. Dual still mixes two sources so peaks
76
- // may compress more under loudnorm than mic-only — by design when both sides
77
- // compete for the same LUFS budget.
74
+ // 6 dB quieter. Restore energy before loudnorm so dual-capture clips are not
75
+ // systematically quieter than mic-only. Dual still mixes two sources so peaks
76
+ // may compress more under loudnorm than mic-only — by design when both sides
77
+ // compete for the same LUFS budget.
78
78
  const AUDIO_DOWNMIX_MAKEUP_FILTER: &str = "volume=6dB";
79
79
 
80
- // Loudness normalization, optionally preceded by the centered-stereo downmix
81
- // that repairs the mic+system L/R split and denoise for native mic captures.
82
- // Pair with `-ar AUDIO_OUTPUT_SAMPLE_RATE` so loudnorm's 192 kHz output is
83
- // resampled back.
80
+ // Loudness normalization, optionally preceded by the centered-stereo downmix
81
+ // that repairs the mic+system L/R split and denoise for native mic captures.
82
+ // Pair with `-ar AUDIO_OUTPUT_SAMPLE_RATE` so loudnorm's 192 kHz output is
83
+ // resampled back.
84
84
  fn audio_filter_chain(downmix: bool, denoise: bool, mic_pregain: bool) -> String {
85
85
  let mut filters = Vec::new();
86
86
  if downmix {
@@ -4479,7 +4479,11 @@ fn normalize_audio_with_ffmpeg(
4479
4479
  .arg("-b:a")
4480
4480
  .arg(audio_bitrate)
4481
4481
  .arg("-af")
4482
- .arg(audio_filter_chain(downmix_audio, denoise_audio, mic_pregain))
4482
+ .arg(audio_filter_chain(
4483
+ downmix_audio,
4484
+ denoise_audio,
4485
+ mic_pregain,
4486
+ ))
4483
4487
  .arg("-ac")
4484
4488
  .arg("2")
4485
4489
  .arg("-ar")
@@ -4568,9 +4572,11 @@ fn transcode_with_ffmpeg(
4568
4572
  }
4569
4573
 
4570
4574
  if normalize_audio {
4571
- command
4572
- .arg("-af")
4573
- .arg(audio_filter_chain(downmix_audio, denoise_audio, mic_pregain));
4575
+ command.arg("-af").arg(audio_filter_chain(
4576
+ downmix_audio,
4577
+ denoise_audio,
4578
+ mic_pregain,
4579
+ ));
4574
4580
  }
4575
4581
 
4576
4582
  let duration_rate_limit =
@@ -5055,9 +5061,7 @@ mod audio_track_probe_tests {
5055
5061
  );
5056
5062
  assert_eq!(
5057
5063
  audio_filter_chain(false, true, true),
5058
- format!(
5059
- "{AUDIO_DENOISE_FILTER},{AUDIO_MIC_PREGAIN_FILTER},{AUDIO_LOUDNESS_FILTER}"
5060
- )
5064
+ format!("{AUDIO_DENOISE_FILTER},{AUDIO_MIC_PREGAIN_FILTER},{AUDIO_LOUDNESS_FILTER}")
5061
5065
  );
5062
5066
  assert_eq!(
5063
5067
  audio_filter_chain(true, true, false),
@@ -10,8 +10,8 @@ use crate::clips::{remember_voice_target, toggle_popover};
10
10
  use crate::dlog;
11
11
  use crate::state::{DictationActive, VoiceWakePopover};
12
12
  use crate::util::{
13
- hide_voice_wake_popover, is_dictation_active, is_recording_active, set_dictation_active,
14
- show_without_activation,
13
+ hide_voice_wake_popover, is_dictation_active, is_meeting_active, is_recording_active,
14
+ set_dictation_active, show_without_activation,
15
15
  };
16
16
 
17
17
  fn escape_shortcut() -> Shortcut {
@@ -513,7 +513,7 @@ pub fn build_shortcut_plugin() -> tauri_plugin_global_shortcut::Builder<tauri::W
513
513
  // global shortcut stops it rather than re-opening the
514
514
  // popover. Keeps parity with the tray-icon click
515
515
  // behaviour in `on_tray_icon_event`.
516
- if is_recording_active(app) {
516
+ if is_recording_active(app) && !is_meeting_active(app) {
517
517
  let _ = app.emit("clips:recorder-stop", ());
518
518
  } else {
519
519
  toggle_popover(app);
@@ -408,4 +408,3 @@ fn audio_recently_silent(state: &tauri::State<'_, DetectorState>, threshold_ms:
408
408
  .unwrap_or(false);
409
409
  mic_silent && system_silent
410
410
  }
411
-
@@ -34,6 +34,11 @@ pub struct RecordingActive(pub Mutex<bool>);
34
34
  #[derive(Default)]
35
35
  pub struct MeetingActive(pub Mutex<bool>);
36
36
 
37
+ /// Active meeting id, when meeting notes are currently running. Kept separate
38
+ /// from `MeetingActive` so older boolean-only state checks stay simple.
39
+ #[derive(Default)]
40
+ pub struct ActiveMeetingId(pub Mutex<Option<String>>);
41
+
37
42
  #[allow(dead_code)]
38
43
  /// Whether dictation is toggled on.
39
44
  #[derive(Default)]