@agent-native/core 0.98.16 → 0.99.0

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 (546) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +21 -0
  3. package/corpus/core/docs/content/actions.mdx +1 -1
  4. package/corpus/core/docs/content/authentication.mdx +1 -1
  5. package/corpus/core/docs/content/dispatch.mdx +3 -3
  6. package/corpus/core/docs/content/external-agents.mdx +30 -19
  7. package/corpus/core/docs/content/locales/ar-SA/actions.mdx +1 -1
  8. package/corpus/core/docs/content/locales/ar-SA/authentication.mdx +1 -1
  9. package/corpus/core/docs/content/locales/ar-SA/dispatch.mdx +3 -3
  10. package/corpus/core/docs/content/locales/ar-SA/external-agents.mdx +23 -19
  11. package/corpus/core/docs/content/locales/ar-SA/mcp-clients.mdx +31 -3
  12. package/corpus/core/docs/content/locales/ar-SA/mcp-protocol.mdx +29 -15
  13. package/corpus/core/docs/content/locales/ar-SA/plan-plugin.mdx +3 -3
  14. package/corpus/core/docs/content/locales/ar-SA/server.mdx +2 -2
  15. package/corpus/core/docs/content/locales/ar-SA/skills-guide.mdx +1 -1
  16. package/corpus/core/docs/content/locales/ar-SA/template-assets.mdx +1 -1
  17. package/corpus/core/docs/content/locales/ar-SA/template-dispatch.mdx +2 -2
  18. package/corpus/core/docs/content/locales/ar-SA/template-plan.mdx +3 -3
  19. package/corpus/core/docs/content/locales/de-DE/actions.mdx +1 -1
  20. package/corpus/core/docs/content/locales/de-DE/authentication.mdx +1 -1
  21. package/corpus/core/docs/content/locales/de-DE/dispatch.mdx +3 -3
  22. package/corpus/core/docs/content/locales/de-DE/external-agents.mdx +23 -19
  23. package/corpus/core/docs/content/locales/de-DE/mcp-clients.mdx +37 -3
  24. package/corpus/core/docs/content/locales/de-DE/mcp-protocol.mdx +29 -15
  25. package/corpus/core/docs/content/locales/de-DE/plan-plugin.mdx +3 -3
  26. package/corpus/core/docs/content/locales/de-DE/server.mdx +2 -2
  27. package/corpus/core/docs/content/locales/de-DE/skills-guide.mdx +1 -1
  28. package/corpus/core/docs/content/locales/de-DE/template-assets.mdx +1 -1
  29. package/corpus/core/docs/content/locales/de-DE/template-dispatch.mdx +2 -2
  30. package/corpus/core/docs/content/locales/de-DE/template-plan.mdx +3 -3
  31. package/corpus/core/docs/content/locales/es-ES/actions.mdx +1 -1
  32. package/corpus/core/docs/content/locales/es-ES/authentication.mdx +1 -1
  33. package/corpus/core/docs/content/locales/es-ES/dispatch.mdx +3 -3
  34. package/corpus/core/docs/content/locales/es-ES/external-agents.mdx +32 -19
  35. package/corpus/core/docs/content/locales/es-ES/mcp-clients.mdx +17 -3
  36. package/corpus/core/docs/content/locales/es-ES/mcp-protocol.mdx +38 -15
  37. package/corpus/core/docs/content/locales/es-ES/plan-plugin.mdx +3 -3
  38. package/corpus/core/docs/content/locales/es-ES/server.mdx +2 -2
  39. package/corpus/core/docs/content/locales/es-ES/skills-guide.mdx +1 -1
  40. package/corpus/core/docs/content/locales/es-ES/template-assets.mdx +1 -1
  41. package/corpus/core/docs/content/locales/es-ES/template-dispatch.mdx +2 -2
  42. package/corpus/core/docs/content/locales/es-ES/template-plan.mdx +3 -3
  43. package/corpus/core/docs/content/locales/fr-FR/actions.mdx +1 -1
  44. package/corpus/core/docs/content/locales/fr-FR/authentication.mdx +1 -1
  45. package/corpus/core/docs/content/locales/fr-FR/dispatch.mdx +3 -3
  46. package/corpus/core/docs/content/locales/fr-FR/external-agents.mdx +23 -19
  47. package/corpus/core/docs/content/locales/fr-FR/mcp-clients.mdx +17 -3
  48. package/corpus/core/docs/content/locales/fr-FR/mcp-protocol.mdx +29 -15
  49. package/corpus/core/docs/content/locales/fr-FR/plan-plugin.mdx +3 -3
  50. package/corpus/core/docs/content/locales/fr-FR/server.mdx +2 -2
  51. package/corpus/core/docs/content/locales/fr-FR/skills-guide.mdx +1 -1
  52. package/corpus/core/docs/content/locales/fr-FR/template-assets.mdx +1 -1
  53. package/corpus/core/docs/content/locales/fr-FR/template-dispatch.mdx +2 -2
  54. package/corpus/core/docs/content/locales/fr-FR/template-plan.mdx +3 -3
  55. package/corpus/core/docs/content/locales/hi-IN/actions.mdx +1 -1
  56. package/corpus/core/docs/content/locales/hi-IN/authentication.mdx +1 -1
  57. package/corpus/core/docs/content/locales/hi-IN/dispatch.mdx +3 -3
  58. package/corpus/core/docs/content/locales/hi-IN/external-agents.mdx +31 -19
  59. package/corpus/core/docs/content/locales/hi-IN/mcp-clients.mdx +17 -3
  60. package/corpus/core/docs/content/locales/hi-IN/mcp-protocol.mdx +36 -15
  61. package/corpus/core/docs/content/locales/hi-IN/plan-plugin.mdx +3 -3
  62. package/corpus/core/docs/content/locales/hi-IN/server.mdx +2 -2
  63. package/corpus/core/docs/content/locales/hi-IN/skills-guide.mdx +1 -1
  64. package/corpus/core/docs/content/locales/hi-IN/template-assets.mdx +1 -1
  65. package/corpus/core/docs/content/locales/hi-IN/template-dispatch.mdx +2 -2
  66. package/corpus/core/docs/content/locales/hi-IN/template-plan.mdx +3 -3
  67. package/corpus/core/docs/content/locales/ja-JP/actions.mdx +1 -1
  68. package/corpus/core/docs/content/locales/ja-JP/authentication.mdx +1 -1
  69. package/corpus/core/docs/content/locales/ja-JP/dispatch.mdx +3 -3
  70. package/corpus/core/docs/content/locales/ja-JP/external-agents.mdx +23 -19
  71. package/corpus/core/docs/content/locales/ja-JP/mcp-clients.mdx +34 -3
  72. package/corpus/core/docs/content/locales/ja-JP/mcp-protocol.mdx +29 -15
  73. package/corpus/core/docs/content/locales/ja-JP/plan-plugin.mdx +3 -3
  74. package/corpus/core/docs/content/locales/ja-JP/server.mdx +2 -2
  75. package/corpus/core/docs/content/locales/ja-JP/skills-guide.mdx +1 -1
  76. package/corpus/core/docs/content/locales/ja-JP/template-assets.mdx +1 -1
  77. package/corpus/core/docs/content/locales/ja-JP/template-dispatch.mdx +2 -2
  78. package/corpus/core/docs/content/locales/ja-JP/template-plan.mdx +3 -3
  79. package/corpus/core/docs/content/locales/ko-KR/actions.mdx +1 -1
  80. package/corpus/core/docs/content/locales/ko-KR/authentication.mdx +1 -1
  81. package/corpus/core/docs/content/locales/ko-KR/dispatch.mdx +3 -3
  82. package/corpus/core/docs/content/locales/ko-KR/external-agents.mdx +30 -19
  83. package/corpus/core/docs/content/locales/ko-KR/mcp-clients.mdx +33 -3
  84. package/corpus/core/docs/content/locales/ko-KR/mcp-protocol.mdx +36 -15
  85. package/corpus/core/docs/content/locales/ko-KR/plan-plugin.mdx +3 -3
  86. package/corpus/core/docs/content/locales/ko-KR/server.mdx +2 -2
  87. package/corpus/core/docs/content/locales/ko-KR/skills-guide.mdx +1 -1
  88. package/corpus/core/docs/content/locales/ko-KR/template-assets.mdx +1 -1
  89. package/corpus/core/docs/content/locales/ko-KR/template-dispatch.mdx +2 -2
  90. package/corpus/core/docs/content/locales/ko-KR/template-plan.mdx +3 -3
  91. package/corpus/core/docs/content/locales/pt-BR/actions.mdx +1 -1
  92. package/corpus/core/docs/content/locales/pt-BR/authentication.mdx +1 -1
  93. package/corpus/core/docs/content/locales/pt-BR/dispatch.mdx +3 -3
  94. package/corpus/core/docs/content/locales/pt-BR/external-agents.mdx +32 -19
  95. package/corpus/core/docs/content/locales/pt-BR/mcp-clients.mdx +34 -3
  96. package/corpus/core/docs/content/locales/pt-BR/mcp-protocol.mdx +32 -15
  97. package/corpus/core/docs/content/locales/pt-BR/plan-plugin.mdx +3 -3
  98. package/corpus/core/docs/content/locales/pt-BR/server.mdx +2 -2
  99. package/corpus/core/docs/content/locales/pt-BR/skills-guide.mdx +1 -1
  100. package/corpus/core/docs/content/locales/pt-BR/template-assets.mdx +1 -1
  101. package/corpus/core/docs/content/locales/pt-BR/template-dispatch.mdx +2 -2
  102. package/corpus/core/docs/content/locales/pt-BR/template-plan.mdx +3 -3
  103. package/corpus/core/docs/content/locales/zh-CN/actions.mdx +1 -1
  104. package/corpus/core/docs/content/locales/zh-CN/authentication.mdx +1 -1
  105. package/corpus/core/docs/content/locales/zh-CN/dispatch.mdx +3 -3
  106. package/corpus/core/docs/content/locales/zh-CN/external-agents.mdx +23 -19
  107. package/corpus/core/docs/content/locales/zh-CN/mcp-clients.mdx +28 -3
  108. package/corpus/core/docs/content/locales/zh-CN/mcp-protocol.mdx +29 -15
  109. package/corpus/core/docs/content/locales/zh-CN/plan-plugin.mdx +3 -3
  110. package/corpus/core/docs/content/locales/zh-CN/server.mdx +2 -2
  111. package/corpus/core/docs/content/locales/zh-CN/skills-guide.mdx +1 -1
  112. package/corpus/core/docs/content/locales/zh-CN/template-assets.mdx +1 -1
  113. package/corpus/core/docs/content/locales/zh-CN/template-dispatch.mdx +2 -2
  114. package/corpus/core/docs/content/locales/zh-CN/template-plan.mdx +3 -3
  115. package/corpus/core/docs/content/locales/zh-TW/actions.mdx +1 -1
  116. package/corpus/core/docs/content/locales/zh-TW/authentication.mdx +1 -1
  117. package/corpus/core/docs/content/locales/zh-TW/dispatch.mdx +3 -3
  118. package/corpus/core/docs/content/locales/zh-TW/external-agents.mdx +23 -19
  119. package/corpus/core/docs/content/locales/zh-TW/mcp-clients.mdx +28 -3
  120. package/corpus/core/docs/content/locales/zh-TW/mcp-protocol.mdx +30 -15
  121. package/corpus/core/docs/content/locales/zh-TW/plan-plugin.mdx +3 -3
  122. package/corpus/core/docs/content/locales/zh-TW/server.mdx +2 -2
  123. package/corpus/core/docs/content/locales/zh-TW/skills-guide.mdx +1 -1
  124. package/corpus/core/docs/content/locales/zh-TW/template-assets.mdx +1 -1
  125. package/corpus/core/docs/content/locales/zh-TW/template-dispatch.mdx +2 -2
  126. package/corpus/core/docs/content/locales/zh-TW/template-plan.mdx +3 -3
  127. package/corpus/core/docs/content/mcp-clients.mdx +31 -4
  128. package/corpus/core/docs/content/mcp-protocol.mdx +35 -15
  129. package/corpus/core/docs/content/plan-plugin.mdx +3 -3
  130. package/corpus/core/docs/content/server.mdx +2 -2
  131. package/corpus/core/docs/content/skills-guide.mdx +1 -1
  132. package/corpus/core/docs/content/template-assets.mdx +1 -1
  133. package/corpus/core/docs/content/template-dispatch.mdx +2 -2
  134. package/corpus/core/docs/content/template-plan.mdx +3 -3
  135. package/corpus/core/package.json +1 -1
  136. package/corpus/core/src/a2a/client.ts +3 -0
  137. package/corpus/core/src/a2a/handlers.ts +95 -7
  138. package/corpus/core/src/cli/connect.ts +50 -24
  139. package/corpus/core/src/cli/mcp-config-writers.ts +10 -0
  140. package/corpus/core/src/cli/mcp.ts +5 -5
  141. package/corpus/core/src/cli/skills-content/assets-skill.ts +1 -1
  142. package/corpus/core/src/cli/skills-content/design-exploration-skill.ts +1 -1
  143. package/corpus/core/src/cli/skills-content/help.ts +1 -1
  144. package/corpus/core/src/cli/skills-content/plan-setup-auth.ts +1 -1
  145. package/corpus/core/src/cli/skills-content/visual-plan-skill.ts +1 -1
  146. package/corpus/core/src/cli/skills-content/visual-recap-skill.ts +2 -2
  147. package/corpus/core/src/cli/skills.ts +23 -12
  148. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +5 -0
  149. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +17 -0
  150. package/corpus/core/src/embedding/agent.ts +8 -6
  151. package/corpus/core/src/localization/default-messages.ts +7 -0
  152. package/corpus/core/src/mcp/ask-app-inline-tasks.ts +125 -0
  153. package/corpus/core/src/mcp/build-server.ts +65 -3
  154. package/corpus/core/src/mcp/builtin-tools.ts +186 -22
  155. package/corpus/core/src/mcp/connect-route.ts +17 -14
  156. package/corpus/core/src/mcp/oauth-route.ts +38 -13
  157. package/corpus/core/src/mcp/route-paths.ts +34 -0
  158. package/corpus/core/src/mcp/server.ts +21 -10
  159. package/corpus/core/src/mcp/stdio.ts +34 -16
  160. package/corpus/core/src/mcp/workspace-resolve.ts +2 -1
  161. package/corpus/core/src/mcp-client/manager.ts +5 -3
  162. package/corpus/core/src/mcp-client/remote-store.ts +10 -10
  163. package/corpus/core/src/server/agent-chat-plugin.ts +59 -8
  164. package/corpus/core/src/server/auth.ts +22 -6
  165. package/corpus/core/src/server/core-routes-plugin.ts +30 -24
  166. package/corpus/core/src/server/csrf.ts +17 -0
  167. package/corpus/core/src/server/framework-request-handler.ts +8 -2
  168. package/corpus/core/src/server/google-oauth.ts +6 -0
  169. package/corpus/core/src/server/http-response-telemetry.ts +6 -1
  170. package/corpus/core/src/server/recap-image-route.ts +3 -3
  171. package/corpus/core/src/server/security-headers.ts +7 -1
  172. package/corpus/core/src/server/ssr-handler.ts +2 -0
  173. package/corpus/core/src/shared/cache-control.ts +6 -4
  174. package/corpus/core/src/templates/default/.agents/skills/security/SKILL.md +10 -0
  175. package/corpus/core/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +15 -6
  176. package/corpus/core/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +16 -10
  177. package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +20 -1
  178. package/corpus/core/src/templates/workspace-core/.agents/skills/security/SKILL.md +10 -0
  179. package/corpus/templates/analytics/.agents/skills/security/SKILL.md +10 -0
  180. package/corpus/templates/analytics/app/global.css +63 -4
  181. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +8 -5
  182. package/corpus/templates/analytics/changelog/2026-07-13-daily-dashboard-emails-recover-more-reliably-from-serverless.md +6 -0
  183. package/corpus/templates/analytics/changelog/2026-07-13-session-replays-keep-a-visible-mac-style-cursor-over-the-vis.md +6 -0
  184. package/corpus/templates/analytics/server/jobs/dashboard-report.ts +21 -2
  185. package/corpus/templates/analytics/server/lib/dashboard-report-subscriptions.ts +57 -1
  186. package/corpus/templates/analytics/server/lib/dashboard-report.ts +266 -28
  187. package/corpus/templates/analytics/server/routes/[...page].get.ts +0 -2
  188. package/corpus/templates/assets/.agents/skills/security/SKILL.md +10 -0
  189. package/corpus/templates/assets/agent-native.app-skill.json +1 -1
  190. package/corpus/templates/brain/.agents/skills/security/SKILL.md +10 -0
  191. package/corpus/templates/calendar/.agents/skills/security/SKILL.md +10 -0
  192. package/corpus/templates/calendar/AGENTS.md +2 -1
  193. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +0 -19
  194. package/corpus/templates/calendar/app/lib/attendee-local-time.ts +14 -5
  195. package/corpus/templates/calendar/changelog/2026-07-13-your-local-time-now-follows-your-browser-timezone-and-event-.md +6 -0
  196. package/corpus/templates/chat/.agents/skills/security/SKILL.md +10 -0
  197. package/corpus/templates/clips/.agents/skills/recording/SKILL.md +7 -2
  198. package/corpus/templates/clips/.agents/skills/security/SKILL.md +10 -0
  199. package/corpus/templates/clips/AGENTS.md +7 -0
  200. package/corpus/templates/clips/actions/list-meetings.ts +19 -4
  201. package/corpus/templates/clips/actions/start-meeting-recording.ts +7 -1
  202. package/corpus/templates/clips/app/components/meetings/transcript-bubbles.tsx +75 -78
  203. package/corpus/templates/clips/app/components/recorder/confetti-canvas.tsx +18 -1
  204. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +6 -12
  205. package/corpus/templates/clips/app/components/recorder/recording-toolbar.tsx +19 -2
  206. package/corpus/templates/clips/app/lib/camera-composite.ts +70 -10
  207. package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +1 -1
  208. package/corpus/templates/clips/app/routes/record.tsx +5 -25
  209. package/corpus/templates/clips/changelog/2026-07-13-clips-desktop-now-requires-macos-13-for-native-capture.md +6 -0
  210. package/corpus/templates/clips/changelog/2026-07-13-clips-hide-solo-meeting-reminders.md +6 -0
  211. package/corpus/templates/clips/changelog/2026-07-13-clips-now-removes-duplicate-mic-and-system-transcript-turns-.md +6 -0
  212. package/corpus/templates/clips/changelog/2026-07-13-desktop-recordings-run-cooler-and-quieter-live-transcription.md +6 -0
  213. package/corpus/templates/clips/changelog/2026-07-13-meeting-recordings-now-stop-after-a-calendar-meeting-ends-an.md +6 -0
  214. package/corpus/templates/clips/changelog/2026-07-13-meeting-transcripts-now-use-a-clean-agent-chat-style-reading.md +6 -0
  215. package/corpus/templates/clips/changelog/2026-07-13-screen-recordings-use-less-processing-power-during-longer-ca.md +6 -0
  216. package/corpus/templates/clips/chrome-extension/src/background.ts +5 -3
  217. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +17 -14
  218. package/corpus/templates/clips/chrome-extension/src/overlay.ts +8 -2
  219. package/corpus/templates/clips/desktop/README.md +3 -0
  220. package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +9 -0
  221. package/corpus/templates/clips/desktop/src/lib/recorder.ts +8 -2
  222. package/corpus/templates/clips/desktop/src/lib/silence-events.ts +1 -0
  223. package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +5 -0
  224. package/corpus/templates/clips/desktop/src/lib/transcription-engine.ts +134 -5
  225. package/corpus/templates/clips/desktop/src/lib/upload-video-stream.ts +28 -0
  226. package/corpus/templates/clips/desktop/src/overlays/flow-bar.tsx +10 -3
  227. package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +42 -9
  228. package/corpus/templates/clips/desktop/src/overlays/recording-pill.tsx +10 -2
  229. package/corpus/templates/clips/desktop/src-tauri/Cargo.toml +6 -1
  230. package/corpus/templates/clips/desktop/src-tauri/src/notifications.rs +77 -1
  231. package/corpus/templates/clips/desktop/src-tauri/src/silence_detector.rs +104 -25
  232. package/corpus/templates/clips/desktop/src-tauri/src/system_audio.rs +4 -0
  233. package/corpus/templates/clips/desktop/src-tauri/src/whisper_speech.rs +287 -32
  234. package/corpus/templates/clips/desktop/src-tauri/tauri.conf.json +1 -1
  235. package/corpus/templates/clips/server/lib/calendar-event-classification.ts +28 -0
  236. package/corpus/templates/clips/server/routes/[...page].get.ts +1 -59
  237. package/corpus/templates/clips/shared/recording-capture.ts +37 -0
  238. package/corpus/templates/content/.agents/skills/security/SKILL.md +10 -0
  239. package/corpus/templates/content/agent-native.app-skill.json +1 -1
  240. package/corpus/templates/content/server/routes/[...page].get.ts +1 -15
  241. package/corpus/templates/design/.agents/skills/security/SKILL.md +10 -0
  242. package/corpus/templates/design/actions/connect-assets-mcp.ts +1 -1
  243. package/corpus/templates/design/agent-native.app-skill.json +1 -1
  244. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +88 -12
  245. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +1 -0
  246. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +4 -1
  247. package/corpus/templates/design/changelog/2026-07-13-adding-shapes-preserves-canvas-background.md +6 -0
  248. package/corpus/templates/design/changelog/2026-07-13-clicking-quickly-between-overlapping-elements-no-longer-bounc.md +6 -0
  249. package/corpus/templates/design/server/plugins/assets-mcp.ts +1 -1
  250. package/corpus/templates/design/server/routes/[...page].get.ts +0 -2
  251. package/corpus/templates/dispatch/.agents/skills/security/SKILL.md +10 -0
  252. package/corpus/templates/forms/.agents/skills/security/SKILL.md +10 -0
  253. package/corpus/templates/macros/.agents/skills/security/SKILL.md +10 -0
  254. package/corpus/templates/mail/.agents/skills/security/SKILL.md +10 -0
  255. package/corpus/templates/plan/.agents/skills/security/SKILL.md +10 -0
  256. package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +1 -1
  257. package/corpus/templates/plan/.agents/skills/visual-recap/SKILL.md +2 -2
  258. package/corpus/templates/plan/agent-native.app-skill.json +1 -1
  259. package/corpus/templates/plan/app/lib/plan-local-bridge.ts +6 -1
  260. package/corpus/templates/plan/app/pages/PlansPage.tsx +15 -6
  261. package/corpus/templates/plan/changelog/2026-07-13-fixed-local-plan-previews-continuously-flickering-while-revi.md +6 -0
  262. package/corpus/templates/plan/server/routes/[...page].get.ts +0 -2
  263. package/corpus/templates/slides/.agents/skills/security/SKILL.md +10 -0
  264. package/dist/a2a/client.d.ts +2 -0
  265. package/dist/a2a/client.d.ts.map +1 -1
  266. package/dist/a2a/client.js +2 -0
  267. package/dist/a2a/client.js.map +1 -1
  268. package/dist/a2a/handlers.d.ts.map +1 -1
  269. package/dist/a2a/handlers.js +84 -7
  270. package/dist/a2a/handlers.js.map +1 -1
  271. package/dist/cli/connect.d.ts +2 -2
  272. package/dist/cli/connect.d.ts.map +1 -1
  273. package/dist/cli/connect.js +45 -23
  274. package/dist/cli/connect.js.map +1 -1
  275. package/dist/cli/mcp-config-writers.d.ts.map +1 -1
  276. package/dist/cli/mcp-config-writers.js +7 -0
  277. package/dist/cli/mcp-config-writers.js.map +1 -1
  278. package/dist/cli/mcp.js +5 -3
  279. package/dist/cli/mcp.js.map +1 -1
  280. package/dist/cli/skills-content/assets-skill.d.ts +1 -1
  281. package/dist/cli/skills-content/assets-skill.d.ts.map +1 -1
  282. package/dist/cli/skills-content/assets-skill.js +1 -1
  283. package/dist/cli/skills-content/assets-skill.js.map +1 -1
  284. package/dist/cli/skills-content/design-exploration-skill.d.ts +1 -1
  285. package/dist/cli/skills-content/design-exploration-skill.d.ts.map +1 -1
  286. package/dist/cli/skills-content/design-exploration-skill.js +1 -1
  287. package/dist/cli/skills-content/design-exploration-skill.js.map +1 -1
  288. package/dist/cli/skills-content/help.d.ts +1 -1
  289. package/dist/cli/skills-content/help.d.ts.map +1 -1
  290. package/dist/cli/skills-content/help.js +1 -1
  291. package/dist/cli/skills-content/help.js.map +1 -1
  292. package/dist/cli/skills-content/plan-setup-auth.d.ts +1 -1
  293. package/dist/cli/skills-content/plan-setup-auth.d.ts.map +1 -1
  294. package/dist/cli/skills-content/plan-setup-auth.js +1 -1
  295. package/dist/cli/skills-content/plan-setup-auth.js.map +1 -1
  296. package/dist/cli/skills-content/visual-plan-skill.d.ts +1 -1
  297. package/dist/cli/skills-content/visual-plan-skill.d.ts.map +1 -1
  298. package/dist/cli/skills-content/visual-plan-skill.js +1 -1
  299. package/dist/cli/skills-content/visual-plan-skill.js.map +1 -1
  300. package/dist/cli/skills-content/visual-recap-skill.d.ts +1 -1
  301. package/dist/cli/skills-content/visual-recap-skill.d.ts.map +1 -1
  302. package/dist/cli/skills-content/visual-recap-skill.js +2 -2
  303. package/dist/cli/skills-content/visual-recap-skill.js.map +1 -1
  304. package/dist/cli/skills.d.ts.map +1 -1
  305. package/dist/cli/skills.js +16 -12
  306. package/dist/cli/skills.js.map +1 -1
  307. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  308. package/dist/client/resources/McpIntegrationDialog.js +1 -1
  309. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  310. package/dist/client/resources/mcp-integration-catalog.d.ts +1 -0
  311. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  312. package/dist/client/resources/mcp-integration-catalog.js +14 -0
  313. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  314. package/dist/collab/awareness.d.ts +2 -2
  315. package/dist/collab/awareness.d.ts.map +1 -1
  316. package/dist/collab/struct-routes.d.ts +1 -1
  317. package/dist/embedding/agent.d.ts.map +1 -1
  318. package/dist/embedding/agent.js +6 -7
  319. package/dist/embedding/agent.js.map +1 -1
  320. package/dist/localization/default-messages.d.ts +5 -0
  321. package/dist/localization/default-messages.d.ts.map +1 -1
  322. package/dist/localization/default-messages.js +5 -0
  323. package/dist/localization/default-messages.js.map +1 -1
  324. package/dist/mcp/ask-app-inline-tasks.d.ts +47 -0
  325. package/dist/mcp/ask-app-inline-tasks.d.ts.map +1 -0
  326. package/dist/mcp/ask-app-inline-tasks.js +87 -0
  327. package/dist/mcp/ask-app-inline-tasks.js.map +1 -0
  328. package/dist/mcp/build-server.d.ts.map +1 -1
  329. package/dist/mcp/build-server.js +56 -3
  330. package/dist/mcp/build-server.js.map +1 -1
  331. package/dist/mcp/builtin-tools.d.ts.map +1 -1
  332. package/dist/mcp/builtin-tools.js +141 -21
  333. package/dist/mcp/builtin-tools.js.map +1 -1
  334. package/dist/mcp/connect-route.d.ts +12 -10
  335. package/dist/mcp/connect-route.d.ts.map +1 -1
  336. package/dist/mcp/connect-route.js +17 -14
  337. package/dist/mcp/connect-route.js.map +1 -1
  338. package/dist/mcp/oauth-route.d.ts +1 -1
  339. package/dist/mcp/oauth-route.d.ts.map +1 -1
  340. package/dist/mcp/oauth-route.js +30 -13
  341. package/dist/mcp/oauth-route.js.map +1 -1
  342. package/dist/mcp/route-paths.d.ts +13 -0
  343. package/dist/mcp/route-paths.d.ts.map +1 -0
  344. package/dist/mcp/route-paths.js +27 -0
  345. package/dist/mcp/route-paths.js.map +1 -0
  346. package/dist/mcp/server.d.ts +2 -1
  347. package/dist/mcp/server.d.ts.map +1 -1
  348. package/dist/mcp/server.js +14 -6
  349. package/dist/mcp/server.js.map +1 -1
  350. package/dist/mcp/stdio.d.ts +7 -6
  351. package/dist/mcp/stdio.d.ts.map +1 -1
  352. package/dist/mcp/stdio.js +27 -15
  353. package/dist/mcp/stdio.js.map +1 -1
  354. package/dist/mcp/workspace-resolve.d.ts +2 -1
  355. package/dist/mcp/workspace-resolve.d.ts.map +1 -1
  356. package/dist/mcp/workspace-resolve.js +2 -1
  357. package/dist/mcp/workspace-resolve.js.map +1 -1
  358. package/dist/mcp-client/manager.js +6 -3
  359. package/dist/mcp-client/manager.js.map +1 -1
  360. package/dist/mcp-client/remote-store.js +5 -7
  361. package/dist/mcp-client/remote-store.js.map +1 -1
  362. package/dist/notifications/routes.d.ts +2 -2
  363. package/dist/observability/routes.d.ts +3 -3
  364. package/dist/progress/routes.d.ts +1 -1
  365. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  366. package/dist/resources/handlers.d.ts +3 -3
  367. package/dist/secrets/routes.d.ts +6 -6
  368. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  369. package/dist/server/agent-chat-plugin.js +60 -9
  370. package/dist/server/agent-chat-plugin.js.map +1 -1
  371. package/dist/server/auth.d.ts.map +1 -1
  372. package/dist/server/auth.js +16 -6
  373. package/dist/server/auth.js.map +1 -1
  374. package/dist/server/core-routes-plugin.d.ts +4 -3
  375. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  376. package/dist/server/core-routes-plugin.js +20 -15
  377. package/dist/server/core-routes-plugin.js.map +1 -1
  378. package/dist/server/csrf.d.ts.map +1 -1
  379. package/dist/server/csrf.js +11 -0
  380. package/dist/server/csrf.js.map +1 -1
  381. package/dist/server/framework-request-handler.d.ts.map +1 -1
  382. package/dist/server/framework-request-handler.js +8 -2
  383. package/dist/server/framework-request-handler.js.map +1 -1
  384. package/dist/server/google-oauth.d.ts +2 -0
  385. package/dist/server/google-oauth.d.ts.map +1 -1
  386. package/dist/server/google-oauth.js +5 -0
  387. package/dist/server/google-oauth.js.map +1 -1
  388. package/dist/server/http-response-telemetry.d.ts.map +1 -1
  389. package/dist/server/http-response-telemetry.js +4 -1
  390. package/dist/server/http-response-telemetry.js.map +1 -1
  391. package/dist/server/recap-image-route.js +3 -3
  392. package/dist/server/recap-image-route.js.map +1 -1
  393. package/dist/server/security-headers.d.ts.map +1 -1
  394. package/dist/server/security-headers.js +4 -1
  395. package/dist/server/security-headers.js.map +1 -1
  396. package/dist/server/ssr-handler.d.ts.map +1 -1
  397. package/dist/server/ssr-handler.js +3 -1
  398. package/dist/server/ssr-handler.js.map +1 -1
  399. package/dist/server/transcribe-voice.d.ts +1 -1
  400. package/dist/shared/cache-control.d.ts +7 -6
  401. package/dist/shared/cache-control.d.ts.map +1 -1
  402. package/dist/shared/cache-control.js +4 -3
  403. package/dist/shared/cache-control.js.map +1 -1
  404. package/dist/templates/default/.agents/skills/security/SKILL.md +10 -0
  405. package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +15 -6
  406. package/dist/templates/workspace-core/.agents/skills/external-agents/SKILL.md +16 -10
  407. package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +20 -1
  408. package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +10 -0
  409. package/docs/content/actions.mdx +1 -1
  410. package/docs/content/authentication.mdx +1 -1
  411. package/docs/content/dispatch.mdx +3 -3
  412. package/docs/content/external-agents.mdx +30 -19
  413. package/docs/content/locales/ar-SA/actions.mdx +1 -1
  414. package/docs/content/locales/ar-SA/authentication.mdx +1 -1
  415. package/docs/content/locales/ar-SA/dispatch.mdx +3 -3
  416. package/docs/content/locales/ar-SA/external-agents.mdx +23 -19
  417. package/docs/content/locales/ar-SA/mcp-clients.mdx +31 -3
  418. package/docs/content/locales/ar-SA/mcp-protocol.mdx +29 -15
  419. package/docs/content/locales/ar-SA/plan-plugin.mdx +3 -3
  420. package/docs/content/locales/ar-SA/server.mdx +2 -2
  421. package/docs/content/locales/ar-SA/skills-guide.mdx +1 -1
  422. package/docs/content/locales/ar-SA/template-assets.mdx +1 -1
  423. package/docs/content/locales/ar-SA/template-dispatch.mdx +2 -2
  424. package/docs/content/locales/ar-SA/template-plan.mdx +3 -3
  425. package/docs/content/locales/de-DE/actions.mdx +1 -1
  426. package/docs/content/locales/de-DE/authentication.mdx +1 -1
  427. package/docs/content/locales/de-DE/dispatch.mdx +3 -3
  428. package/docs/content/locales/de-DE/external-agents.mdx +23 -19
  429. package/docs/content/locales/de-DE/mcp-clients.mdx +37 -3
  430. package/docs/content/locales/de-DE/mcp-protocol.mdx +29 -15
  431. package/docs/content/locales/de-DE/plan-plugin.mdx +3 -3
  432. package/docs/content/locales/de-DE/server.mdx +2 -2
  433. package/docs/content/locales/de-DE/skills-guide.mdx +1 -1
  434. package/docs/content/locales/de-DE/template-assets.mdx +1 -1
  435. package/docs/content/locales/de-DE/template-dispatch.mdx +2 -2
  436. package/docs/content/locales/de-DE/template-plan.mdx +3 -3
  437. package/docs/content/locales/es-ES/actions.mdx +1 -1
  438. package/docs/content/locales/es-ES/authentication.mdx +1 -1
  439. package/docs/content/locales/es-ES/dispatch.mdx +3 -3
  440. package/docs/content/locales/es-ES/external-agents.mdx +32 -19
  441. package/docs/content/locales/es-ES/mcp-clients.mdx +17 -3
  442. package/docs/content/locales/es-ES/mcp-protocol.mdx +38 -15
  443. package/docs/content/locales/es-ES/plan-plugin.mdx +3 -3
  444. package/docs/content/locales/es-ES/server.mdx +2 -2
  445. package/docs/content/locales/es-ES/skills-guide.mdx +1 -1
  446. package/docs/content/locales/es-ES/template-assets.mdx +1 -1
  447. package/docs/content/locales/es-ES/template-dispatch.mdx +2 -2
  448. package/docs/content/locales/es-ES/template-plan.mdx +3 -3
  449. package/docs/content/locales/fr-FR/actions.mdx +1 -1
  450. package/docs/content/locales/fr-FR/authentication.mdx +1 -1
  451. package/docs/content/locales/fr-FR/dispatch.mdx +3 -3
  452. package/docs/content/locales/fr-FR/external-agents.mdx +23 -19
  453. package/docs/content/locales/fr-FR/mcp-clients.mdx +17 -3
  454. package/docs/content/locales/fr-FR/mcp-protocol.mdx +29 -15
  455. package/docs/content/locales/fr-FR/plan-plugin.mdx +3 -3
  456. package/docs/content/locales/fr-FR/server.mdx +2 -2
  457. package/docs/content/locales/fr-FR/skills-guide.mdx +1 -1
  458. package/docs/content/locales/fr-FR/template-assets.mdx +1 -1
  459. package/docs/content/locales/fr-FR/template-dispatch.mdx +2 -2
  460. package/docs/content/locales/fr-FR/template-plan.mdx +3 -3
  461. package/docs/content/locales/hi-IN/actions.mdx +1 -1
  462. package/docs/content/locales/hi-IN/authentication.mdx +1 -1
  463. package/docs/content/locales/hi-IN/dispatch.mdx +3 -3
  464. package/docs/content/locales/hi-IN/external-agents.mdx +31 -19
  465. package/docs/content/locales/hi-IN/mcp-clients.mdx +17 -3
  466. package/docs/content/locales/hi-IN/mcp-protocol.mdx +36 -15
  467. package/docs/content/locales/hi-IN/plan-plugin.mdx +3 -3
  468. package/docs/content/locales/hi-IN/server.mdx +2 -2
  469. package/docs/content/locales/hi-IN/skills-guide.mdx +1 -1
  470. package/docs/content/locales/hi-IN/template-assets.mdx +1 -1
  471. package/docs/content/locales/hi-IN/template-dispatch.mdx +2 -2
  472. package/docs/content/locales/hi-IN/template-plan.mdx +3 -3
  473. package/docs/content/locales/ja-JP/actions.mdx +1 -1
  474. package/docs/content/locales/ja-JP/authentication.mdx +1 -1
  475. package/docs/content/locales/ja-JP/dispatch.mdx +3 -3
  476. package/docs/content/locales/ja-JP/external-agents.mdx +23 -19
  477. package/docs/content/locales/ja-JP/mcp-clients.mdx +34 -3
  478. package/docs/content/locales/ja-JP/mcp-protocol.mdx +29 -15
  479. package/docs/content/locales/ja-JP/plan-plugin.mdx +3 -3
  480. package/docs/content/locales/ja-JP/server.mdx +2 -2
  481. package/docs/content/locales/ja-JP/skills-guide.mdx +1 -1
  482. package/docs/content/locales/ja-JP/template-assets.mdx +1 -1
  483. package/docs/content/locales/ja-JP/template-dispatch.mdx +2 -2
  484. package/docs/content/locales/ja-JP/template-plan.mdx +3 -3
  485. package/docs/content/locales/ko-KR/actions.mdx +1 -1
  486. package/docs/content/locales/ko-KR/authentication.mdx +1 -1
  487. package/docs/content/locales/ko-KR/dispatch.mdx +3 -3
  488. package/docs/content/locales/ko-KR/external-agents.mdx +30 -19
  489. package/docs/content/locales/ko-KR/mcp-clients.mdx +33 -3
  490. package/docs/content/locales/ko-KR/mcp-protocol.mdx +36 -15
  491. package/docs/content/locales/ko-KR/plan-plugin.mdx +3 -3
  492. package/docs/content/locales/ko-KR/server.mdx +2 -2
  493. package/docs/content/locales/ko-KR/skills-guide.mdx +1 -1
  494. package/docs/content/locales/ko-KR/template-assets.mdx +1 -1
  495. package/docs/content/locales/ko-KR/template-dispatch.mdx +2 -2
  496. package/docs/content/locales/ko-KR/template-plan.mdx +3 -3
  497. package/docs/content/locales/pt-BR/actions.mdx +1 -1
  498. package/docs/content/locales/pt-BR/authentication.mdx +1 -1
  499. package/docs/content/locales/pt-BR/dispatch.mdx +3 -3
  500. package/docs/content/locales/pt-BR/external-agents.mdx +32 -19
  501. package/docs/content/locales/pt-BR/mcp-clients.mdx +34 -3
  502. package/docs/content/locales/pt-BR/mcp-protocol.mdx +32 -15
  503. package/docs/content/locales/pt-BR/plan-plugin.mdx +3 -3
  504. package/docs/content/locales/pt-BR/server.mdx +2 -2
  505. package/docs/content/locales/pt-BR/skills-guide.mdx +1 -1
  506. package/docs/content/locales/pt-BR/template-assets.mdx +1 -1
  507. package/docs/content/locales/pt-BR/template-dispatch.mdx +2 -2
  508. package/docs/content/locales/pt-BR/template-plan.mdx +3 -3
  509. package/docs/content/locales/zh-CN/actions.mdx +1 -1
  510. package/docs/content/locales/zh-CN/authentication.mdx +1 -1
  511. package/docs/content/locales/zh-CN/dispatch.mdx +3 -3
  512. package/docs/content/locales/zh-CN/external-agents.mdx +23 -19
  513. package/docs/content/locales/zh-CN/mcp-clients.mdx +28 -3
  514. package/docs/content/locales/zh-CN/mcp-protocol.mdx +29 -15
  515. package/docs/content/locales/zh-CN/plan-plugin.mdx +3 -3
  516. package/docs/content/locales/zh-CN/server.mdx +2 -2
  517. package/docs/content/locales/zh-CN/skills-guide.mdx +1 -1
  518. package/docs/content/locales/zh-CN/template-assets.mdx +1 -1
  519. package/docs/content/locales/zh-CN/template-dispatch.mdx +2 -2
  520. package/docs/content/locales/zh-CN/template-plan.mdx +3 -3
  521. package/docs/content/locales/zh-TW/actions.mdx +1 -1
  522. package/docs/content/locales/zh-TW/authentication.mdx +1 -1
  523. package/docs/content/locales/zh-TW/dispatch.mdx +3 -3
  524. package/docs/content/locales/zh-TW/external-agents.mdx +23 -19
  525. package/docs/content/locales/zh-TW/mcp-clients.mdx +28 -3
  526. package/docs/content/locales/zh-TW/mcp-protocol.mdx +30 -15
  527. package/docs/content/locales/zh-TW/plan-plugin.mdx +3 -3
  528. package/docs/content/locales/zh-TW/server.mdx +2 -2
  529. package/docs/content/locales/zh-TW/skills-guide.mdx +1 -1
  530. package/docs/content/locales/zh-TW/template-assets.mdx +1 -1
  531. package/docs/content/locales/zh-TW/template-dispatch.mdx +2 -2
  532. package/docs/content/locales/zh-TW/template-plan.mdx +3 -3
  533. package/docs/content/mcp-clients.mdx +31 -4
  534. package/docs/content/mcp-protocol.mdx +35 -15
  535. package/docs/content/plan-plugin.mdx +3 -3
  536. package/docs/content/server.mdx +2 -2
  537. package/docs/content/skills-guide.mdx +1 -1
  538. package/docs/content/template-assets.mdx +1 -1
  539. package/docs/content/template-dispatch.mdx +2 -2
  540. package/docs/content/template-plan.mdx +3 -3
  541. package/package.json +1 -1
  542. package/src/templates/default/.agents/skills/security/SKILL.md +10 -0
  543. package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +15 -6
  544. package/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +16 -10
  545. package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +20 -1
  546. package/src/templates/workspace-core/.agents/skills/security/SKILL.md +10 -0
@@ -352,9 +352,18 @@ export function RecordingPill() {
352
352
  );
353
353
 
354
354
  const startMs = Date.now();
355
+ let lastDrawMs = 0;
356
+ // A bar meter reads the same to the eye well below display refresh rate
357
+ // (60-120Hz); cap the actual draw work to ~20fps while still scheduling
358
+ // via rAF every frame so the loop still pauses when the pill is hidden.
359
+ const FRAME_INTERVAL_MS = 1000 / 20;
355
360
  const tick = () => {
361
+ rafRef.current = requestAnimationFrame(tick);
362
+ const nowMs = Date.now();
363
+ if (nowMs - lastDrawMs < FRAME_INTERVAL_MS) return;
364
+ lastDrawMs = nowMs;
356
365
  // Modulo prevents float precision loss on long recordings.
357
- const t = (Date.now() - startMs) % 1_000_000;
366
+ const t = (nowMs - startMs) % 1_000_000;
358
367
  for (const s of setups) {
359
368
  const target = Math.min(1, s.levelRef.current * s.gain);
360
369
 
@@ -385,7 +394,6 @@ export function RecordingPill() {
385
394
  }
386
395
  s.ctx2d.shadowBlur = 0;
387
396
  }
388
- rafRef.current = requestAnimationFrame(tick);
389
397
  };
390
398
  tick();
391
399
  return () => {
@@ -124,7 +124,12 @@ screencapturekit = { version = "2.0.0", features = ["macos_15_0"] }
124
124
  # AudioBufferList type so we can hand SCK's CMSampleBuffer audio bytes to
125
125
  # AVAudioPCMBuffer for the speech recognizer.
126
126
  objc2-core-audio-types = "0.3"
127
- whisper-rs = { version = "0.16.0" }
127
+ # `metal` builds whisper.cpp's ggml-metal backend and links it in (the sys
128
+ # crate's build script embeds the compiled metallib, so no app-bundle/runtime
129
+ # asset changes are needed). Without it, whisper.cpp decode runs CPU-only.
130
+ # `use_gpu` is still set explicitly per-arch in whisper_speech.rs so Intel
131
+ # Macs don't exercise Metal even though the feature is compiled in.
132
+ whisper-rs = { version = "0.16.0", features = ["metal"] }
128
133
  # NOTE: We hand-roll the few EventKit selectors we need via raw `objc2`
129
134
  # msg_send! in `eventkit.rs` rather than depending on the `objc2-event-kit`
130
135
  # crate. Its API surface drifts between minor 0.3.x releases (and not
@@ -6,8 +6,13 @@
6
6
 
7
7
  use serde::{Deserialize, Serialize};
8
8
  use serde_json::Value;
9
+ use std::sync::atomic::{AtomicBool, Ordering};
9
10
  use std::sync::Mutex;
10
- use tauri::{AppHandle, Emitter, Manager, PhysicalPosition, PhysicalSize, WebviewWindowBuilder};
11
+ use std::time::Duration;
12
+ use tauri::{
13
+ AppHandle, Emitter, Manager, PhysicalPosition, PhysicalSize, WebviewWindow,
14
+ WebviewWindowBuilder,
15
+ };
11
16
 
12
17
  use crate::dlog;
13
18
  use crate::util::{
@@ -54,6 +59,75 @@ fn notification_rect(app: &AppHandle) -> (u32, u32, i32, i32) {
54
59
  (w, h, x, top.max(0))
55
60
  }
56
61
 
62
+ static MEETING_NOTIF_HOVER_TRACKING: AtomicBool = AtomicBool::new(false);
63
+
64
+ /// True when the global cursor sits inside the notification window's frame.
65
+ /// Mirrors `cursor_inside_pill_frame` in `recording_indicator.rs`: cursor and
66
+ /// frame both come from Tauri (physical px, desktop top-left origin), so the
67
+ /// test is a plain point-in-rect with no AppKit hop.
68
+ fn cursor_inside_notification_frame(window: &WebviewWindow) -> bool {
69
+ let (Ok(c), Ok(p), Ok(s)) = (
70
+ window.cursor_position(),
71
+ window.outer_position(),
72
+ window.outer_size(),
73
+ ) else {
74
+ return false;
75
+ };
76
+ c.x >= p.x as f64
77
+ && c.x <= (p.x + s.width as i32) as f64
78
+ && c.y >= p.y as f64
79
+ && c.y <= (p.y + s.height as i32) as f64
80
+ }
81
+
82
+ /// Poll the cursor against the notification frame and emit
83
+ /// `meetings:notification-hover` on transitions. The window never becomes key
84
+ /// (`show_without_activation` uses `orderFrontRegardless`, not
85
+ /// `makeKeyAndOrderFront:`), so CSS `:hover`/`onMouseEnter` only fires once
86
+ /// the user's first click makes it key — this poll is the fallback that
87
+ /// reveals the close button on real hover before that click, same pattern as
88
+ /// `start_pill_hover_tracking`. Idempotent — a second call is a no-op while a
89
+ /// loop is already running.
90
+ fn start_meeting_notification_hover_tracking(app: &AppHandle) {
91
+ if MEETING_NOTIF_HOVER_TRACKING.swap(true, Ordering::SeqCst) {
92
+ return;
93
+ }
94
+ let app = app.clone();
95
+ tauri::async_runtime::spawn(async move {
96
+ let mut prev = false;
97
+ while MEETING_NOTIF_HOVER_TRACKING.load(Ordering::Relaxed) {
98
+ let Some(win) = app.get_webview_window(MEETING_NOTIFICATION_LABEL) else {
99
+ break;
100
+ };
101
+ // The window is reused across notifications (hidden/shown from
102
+ // the frontend, never destroyed), so this loop runs for the rest
103
+ // of the app session. Skip the cursor/frame queries entirely
104
+ // while hidden — no notification is on screen to hover — and
105
+ // back off to a slower idle tick until it's shown again.
106
+ if !win.is_visible().unwrap_or(false) {
107
+ if prev {
108
+ prev = false;
109
+ let _ = win.emit(
110
+ "meetings:notification-hover",
111
+ serde_json::json!({ "hovered": false }),
112
+ );
113
+ }
114
+ tokio::time::sleep(Duration::from_millis(250)).await;
115
+ continue;
116
+ }
117
+ let inside = cursor_inside_notification_frame(&win);
118
+ if inside != prev {
119
+ prev = inside;
120
+ let _ = win.emit(
121
+ "meetings:notification-hover",
122
+ serde_json::json!({ "hovered": inside }),
123
+ );
124
+ }
125
+ tokio::time::sleep(Duration::from_millis(80)).await;
126
+ }
127
+ MEETING_NOTIF_HOVER_TRACKING.store(false, Ordering::SeqCst);
128
+ });
129
+ }
130
+
57
131
  pub fn show_meeting_notification_window(app: &AppHandle) -> Result<(), String> {
58
132
  let (w, h, x, y) = notification_rect(app);
59
133
  if let Some(existing) = app.get_webview_window(MEETING_NOTIFICATION_LABEL) {
@@ -61,6 +135,7 @@ pub fn show_meeting_notification_window(app: &AppHandle) -> Result<(), String> {
61
135
  let _ = existing.set_position(PhysicalPosition::new(x, y));
62
136
  configure_overlay_behavior(&existing);
63
137
  show_without_activation(&existing);
138
+ start_meeting_notification_hover_tracking(&app);
64
139
  return Ok(());
65
140
  }
66
141
 
@@ -97,6 +172,7 @@ pub fn show_meeting_notification_window(app: &AppHandle) -> Result<(), String> {
97
172
  // own recording chrome is still excluded elsewhere so it won't leak.)
98
173
  configure_overlay_behavior(&win);
99
174
  show_without_activation(&win);
175
+ start_meeting_notification_hover_tracking(&app);
100
176
  Ok(())
101
177
  }
102
178
 
@@ -14,6 +14,9 @@
14
14
  //! * **Call-end heuristic** — best-effort: if a known video-conferencing
15
15
  //! bundle id (Zoom, Google Meet wrapper, MS Teams) goes from frontmost
16
16
  //! to background for >2 minutes, emit `meetings:call-ended`.
17
+ //! * **Calendar end** — when the scheduled meeting end has passed and both
18
+ //! audio sources have been quiet for the call-end window, emit the same
19
+ //! event even if the conferencing app remains frontmost.
17
20
  //!
18
21
  //! Renderer-side responsibility: subscribe via `silence-events.ts`, dispatch
19
22
  //! the `stop-meeting-recording` action when any of the events fire.
@@ -40,7 +43,7 @@
40
43
  //! trick is equivalent and uses constant memory.
41
44
 
42
45
  use std::sync::{Arc, Mutex, OnceLock};
43
- use std::time::{Duration, Instant};
46
+ use std::time::{Duration, Instant, SystemTime, UNIX_EPOCH};
44
47
 
45
48
  use serde::Deserialize;
46
49
  use tauri::{AppHandle, Emitter, Listener, Manager};
@@ -66,6 +69,10 @@ pub struct SilenceConfig {
66
69
  /// Whether to enable the call-ended heuristic.
67
70
  #[serde(default = "default_true")]
68
71
  pub watch_call_ended: bool,
72
+ /// Unix epoch milliseconds for the calendar event's scheduled end.
73
+ /// Calendar-end stopping still requires quiet audio as confirmation.
74
+ #[serde(default)]
75
+ pub scheduled_end_ms: Option<u64>,
69
76
  }
70
77
 
71
78
  fn default_threshold() -> f32 {
@@ -108,6 +115,8 @@ struct DetectorInner {
108
115
  system: Option<SourceState>,
109
116
  /// Already fired the silence-stop event in this session?
110
117
  silence_fired: bool,
118
+ /// Calendar event end for the active session, if one is known.
119
+ scheduled_end_ms: Option<u64>,
111
120
  }
112
121
 
113
122
  pub struct DetectorState {
@@ -142,6 +151,7 @@ pub fn silence_detector_start(app: AppHandle, config: Option<SilenceConfig>) ->
142
151
  call_ended_ms: default_call_ended_ms(),
143
152
  watch_sleep: true,
144
153
  watch_call_ended: true,
154
+ scheduled_end_ms: None,
145
155
  });
146
156
 
147
157
  // Install the audio-level listener exactly once for the process.
@@ -185,6 +195,7 @@ pub fn silence_detector_start(app: AppHandle, config: Option<SilenceConfig>) ->
185
195
  g.active = true;
186
196
  g.silence_fired = false;
187
197
  g.config = Some(cfg.clone());
198
+ g.scheduled_end_ms = cfg.scheduled_end_ms;
188
199
  // Seed both buckets with `now()` so we don't insta-fire on start
189
200
  // before any audio has streamed in yet.
190
201
  g.mic = Some(SourceState::fresh());
@@ -198,9 +209,10 @@ pub fn silence_detector_start(app: AppHandle, config: Option<SilenceConfig>) ->
198
209
  let inner_for_supervisor = state.inner.clone();
199
210
  let app_for_supervisor = app.clone();
200
211
  let silence_window = Duration::from_millis(cfg.silence_ms);
212
+ let calendar_end_quiet_window = Duration::from_millis(cfg.call_ended_ms);
201
213
  std::thread::spawn(move || loop {
202
214
  std::thread::sleep(Duration::from_secs(5));
203
- let should_fire = {
215
+ let stop_reason = {
204
216
  let g = match inner_for_supervisor.lock() {
205
217
  Ok(g) => g,
206
218
  Err(_) => return,
@@ -209,7 +221,7 @@ pub fn silence_detector_start(app: AppHandle, config: Option<SilenceConfig>) ->
209
221
  return; // session ended or replaced — exit
210
222
  }
211
223
  if g.silence_fired {
212
- false
224
+ None
213
225
  } else {
214
226
  let now = Instant::now();
215
227
  let mic_silent = g
@@ -222,14 +234,39 @@ pub fn silence_detector_start(app: AppHandle, config: Option<SilenceConfig>) ->
222
234
  .as_ref()
223
235
  .map(|s| now.duration_since(s.last_loud_at) >= silence_window)
224
236
  .unwrap_or(false);
225
- mic_silent && system_silent
237
+ let mic_quiet_for_calendar_end = g
238
+ .mic
239
+ .as_ref()
240
+ .map(|s| now.duration_since(s.last_loud_at) >= calendar_end_quiet_window)
241
+ .unwrap_or(false);
242
+ let system_quiet_for_calendar_end = g
243
+ .system
244
+ .as_ref()
245
+ .map(|s| now.duration_since(s.last_loud_at) >= calendar_end_quiet_window)
246
+ .unwrap_or(false);
247
+ if calendar_end_stop_ready(
248
+ g.scheduled_end_ms,
249
+ unix_now_ms(),
250
+ mic_quiet_for_calendar_end && system_quiet_for_calendar_end,
251
+ ) {
252
+ Some("calendar")
253
+ } else if mic_silent && system_silent {
254
+ Some("silence")
255
+ } else {
256
+ None
257
+ }
226
258
  }
227
259
  };
228
- if should_fire {
260
+ if let Some(reason) = stop_reason {
229
261
  if let Ok(mut g) = inner_for_supervisor.lock() {
230
262
  g.silence_fired = true;
231
263
  }
232
- let _ = app_for_supervisor.emit("meetings:silence-stop", ());
264
+ let event = if reason == "calendar" {
265
+ "meetings:call-ended"
266
+ } else {
267
+ "meetings:silence-stop"
268
+ };
269
+ let _ = app_for_supervisor.emit(event, ());
233
270
  }
234
271
  });
235
272
 
@@ -255,6 +292,7 @@ pub fn silence_detector_stop(app: AppHandle) -> Result<(), String> {
255
292
  g.silence_fired = false;
256
293
  g.mic = None;
257
294
  g.system = None;
295
+ g.scheduled_end_ms = None;
258
296
  Ok(())
259
297
  }
260
298
 
@@ -331,6 +369,7 @@ fn install_call_ended_watcher(app: &AppHandle, threshold_ms: u64) {
331
369
  let mut ever_seen_front = false;
332
370
  let mut last_front_at: Option<Instant> = None;
333
371
  let mut fired = false;
372
+ let mut last_front_was_generic_browser = false;
334
373
  loop {
335
374
  std::thread::sleep(Duration::from_secs(10));
336
375
  let state = app.state::<DetectorState>();
@@ -339,6 +378,7 @@ fn install_call_ended_watcher(app: &AppHandle, threshold_ms: u64) {
339
378
  ever_seen_front = false;
340
379
  last_front_at = None;
341
380
  fired = false;
381
+ last_front_was_generic_browser = false;
342
382
  continue;
343
383
  }
344
384
  let front = crate::util::frontmost_bundle_id();
@@ -353,26 +393,28 @@ fn install_call_ended_watcher(app: &AppHandle, threshold_ms: u64) {
353
393
  if is_strong_vc || is_generic_browser {
354
394
  ever_seen_front = true;
355
395
  last_front_at = Some(Instant::now());
396
+ last_front_was_generic_browser = is_generic_browser;
356
397
  }
357
- if ever_seen_front && !fired {
358
- if let Some(t) = last_front_at {
359
- let backgrounded_ms = Instant::now().duration_since(t).as_millis() as u64;
360
- if backgrounded_ms >= threshold_ms {
361
- // Require audio corroboration before auto-stopping
362
- // for a generic browser: the frontmost-app signal
363
- // alone is too weak (backgrounding Chrome to check
364
- // email doesn't mean the Meet tab's call ended).
365
- // Native VC clients keep the fast, uncorroborated
366
- // path since a dedicated conferencing app losing
367
- // focus for minutes is a much stronger signal.
368
- let audio_corroborates =
369
- !is_generic_browser || audio_recently_silent(&state, threshold_ms);
370
- if audio_corroborates {
371
- let _ = app.emit("meetings:call-ended", ());
372
- fired = true;
373
- }
374
- }
375
- }
398
+ if fired {
399
+ continue;
400
+ }
401
+
402
+ let frontmost_call_ended = ever_seen_front
403
+ && last_front_at
404
+ .map(|t| {
405
+ Instant::now().duration_since(t).as_millis() as u64 >= threshold_ms
406
+ })
407
+ .unwrap_or(false)
408
+ // Require audio corroboration for browser-hosted calls:
409
+ // backgrounding Chrome/Arc alone does not prove that the
410
+ // Meet tab ended. Use the last known conference app, not
411
+ // the unrelated app now in front.
412
+ && (!last_front_was_generic_browser
413
+ || audio_recently_silent(&state, threshold_ms));
414
+
415
+ if frontmost_call_ended {
416
+ let _ = app.emit("meetings:call-ended", ());
417
+ fired = true;
376
418
  }
377
419
  }
378
420
  });
@@ -382,6 +424,23 @@ fn install_call_ended_watcher(app: &AppHandle, threshold_ms: u64) {
382
424
  #[cfg(not(target_os = "macos"))]
383
425
  fn install_call_ended_watcher(_app: &AppHandle, _threshold_ms: u64) {}
384
426
 
427
+ fn scheduled_end_reached(scheduled_end_ms: Option<u64>, now_ms: u64) -> bool {
428
+ scheduled_end_ms
429
+ .map(|end_ms| now_ms >= end_ms)
430
+ .unwrap_or(false)
431
+ }
432
+
433
+ fn calendar_end_stop_ready(scheduled_end_ms: Option<u64>, now_ms: u64, audio_quiet: bool) -> bool {
434
+ scheduled_end_reached(scheduled_end_ms, now_ms) && audio_quiet
435
+ }
436
+
437
+ fn unix_now_ms() -> u64 {
438
+ SystemTime::now()
439
+ .duration_since(UNIX_EPOCH)
440
+ .unwrap_or_default()
441
+ .as_millis() as u64
442
+ }
443
+
385
444
  /// Corroboration check for the generic-browser call-ended signal: true only
386
445
  /// if BOTH mic and system audio have been quiet for at least `threshold_ms`.
387
446
  /// Reuses the same per-source `last_loud_at` tracking the silence-stop
@@ -408,3 +467,23 @@ fn audio_recently_silent(state: &tauri::State<'_, DetectorState>, threshold_ms:
408
467
  .unwrap_or(false);
409
468
  mic_silent && system_silent
410
469
  }
470
+
471
+ #[cfg(test)]
472
+ mod tests {
473
+ use super::{calendar_end_stop_ready, scheduled_end_reached};
474
+
475
+ #[test]
476
+ fn calendar_end_requires_a_known_end_and_allows_the_exact_boundary() {
477
+ assert!(!scheduled_end_reached(None, 10_000));
478
+ assert!(!scheduled_end_reached(Some(10_001), 10_000));
479
+ assert!(scheduled_end_reached(Some(10_000), 10_000));
480
+ assert!(scheduled_end_reached(Some(9_999), 10_000));
481
+ }
482
+
483
+ #[test]
484
+ fn calendar_end_stop_also_requires_quiet_audio() {
485
+ assert!(!calendar_end_stop_ready(Some(9_999), 10_000, false));
486
+ assert!(calendar_end_stop_ready(Some(9_999), 10_000, true));
487
+ assert!(!calendar_end_stop_ready(Some(10_001), 10_000, true));
488
+ }
489
+ }
@@ -115,6 +115,7 @@ pub async fn audio_transcription_start(
115
115
  mic_device_label: Option<String>,
116
116
  capture_system: Option<bool>,
117
117
  voice_processing: Option<bool>,
118
+ emit_partials: Option<bool>,
118
119
  owner: Option<String>,
119
120
  ) -> Result<(), String> {
120
121
  let _ = meeting_id;
@@ -128,6 +129,9 @@ pub async fn audio_transcription_start(
128
129
  // create a second VoiceProcessingIO stack beside a live call app.
129
130
  // Short dictation sessions opt in explicitly from the renderer.
130
131
  voice_processing.unwrap_or(false),
132
+ // Existing meeting callers depend on live partials. Recording capture
133
+ // explicitly opts out because it only persists final segments.
134
+ emit_partials.unwrap_or(true),
131
135
  owner,
132
136
  )
133
137
  .await