@agent-native/core 0.92.11 → 0.93.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 (777) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +45 -0
  3. package/corpus/core/docs/content/automation-connectors.mdx +80 -0
  4. package/corpus/core/docs/content/extensions.mdx +8 -0
  5. package/corpus/core/docs/content/locales/ar-SA/extensions.mdx +8 -0
  6. package/corpus/core/docs/content/locales/ar-SA/messaging.mdx +84 -15
  7. package/corpus/core/docs/content/locales/ar-SA/template-clips.mdx +1 -0
  8. package/corpus/core/docs/content/locales/ar-SA/template-design.mdx +1 -0
  9. package/corpus/core/docs/content/locales/de-DE/extensions.mdx +10 -0
  10. package/corpus/core/docs/content/locales/de-DE/messaging.mdx +92 -15
  11. package/corpus/core/docs/content/locales/de-DE/template-clips.mdx +1 -0
  12. package/corpus/core/docs/content/locales/de-DE/template-design.mdx +1 -0
  13. package/corpus/core/docs/content/locales/es-ES/extensions.mdx +10 -0
  14. package/corpus/core/docs/content/locales/es-ES/messaging.mdx +91 -15
  15. package/corpus/core/docs/content/locales/es-ES/template-clips.mdx +1 -0
  16. package/corpus/core/docs/content/locales/es-ES/template-design.mdx +1 -0
  17. package/corpus/core/docs/content/locales/fr-FR/extensions.mdx +10 -0
  18. package/corpus/core/docs/content/locales/fr-FR/messaging.mdx +91 -15
  19. package/corpus/core/docs/content/locales/fr-FR/template-clips.mdx +1 -0
  20. package/corpus/core/docs/content/locales/fr-FR/template-design.mdx +1 -0
  21. package/corpus/core/docs/content/locales/hi-IN/extensions.mdx +8 -0
  22. package/corpus/core/docs/content/locales/hi-IN/messaging.mdx +81 -15
  23. package/corpus/core/docs/content/locales/hi-IN/template-clips.mdx +1 -0
  24. package/corpus/core/docs/content/locales/hi-IN/template-design.mdx +1 -0
  25. package/corpus/core/docs/content/locales/ja-JP/extensions.mdx +9 -0
  26. package/corpus/core/docs/content/locales/ja-JP/messaging.mdx +81 -15
  27. package/corpus/core/docs/content/locales/ja-JP/template-clips.mdx +1 -0
  28. package/corpus/core/docs/content/locales/ja-JP/template-design.mdx +1 -0
  29. package/corpus/core/docs/content/locales/ko-KR/extensions.mdx +8 -0
  30. package/corpus/core/docs/content/locales/ko-KR/messaging.mdx +80 -15
  31. package/corpus/core/docs/content/locales/ko-KR/template-clips.mdx +1 -0
  32. package/corpus/core/docs/content/locales/ko-KR/template-design.mdx +1 -0
  33. package/corpus/core/docs/content/locales/pt-BR/extensions.mdx +9 -0
  34. package/corpus/core/docs/content/locales/pt-BR/messaging.mdx +88 -15
  35. package/corpus/core/docs/content/locales/pt-BR/template-clips.mdx +1 -0
  36. package/corpus/core/docs/content/locales/pt-BR/template-design.mdx +1 -0
  37. package/corpus/core/docs/content/locales/zh-CN/extensions.mdx +6 -0
  38. package/corpus/core/docs/content/locales/zh-CN/messaging.mdx +78 -15
  39. package/corpus/core/docs/content/locales/zh-CN/template-clips.mdx +1 -0
  40. package/corpus/core/docs/content/locales/zh-CN/template-design.mdx +1 -0
  41. package/corpus/core/docs/content/locales/zh-TW/extensions.mdx +6 -0
  42. package/corpus/core/docs/content/locales/zh-TW/messaging.mdx +78 -15
  43. package/corpus/core/docs/content/locales/zh-TW/template-clips.mdx +1 -0
  44. package/corpus/core/docs/content/locales/zh-TW/template-design.mdx +1 -0
  45. package/corpus/core/docs/content/messaging.mdx +227 -45
  46. package/corpus/core/docs/content/template-clips.mdx +3 -0
  47. package/corpus/core/docs/content/template-design.mdx +4 -0
  48. package/corpus/core/package.json +5 -1
  49. package/corpus/core/src/a2a/artifact-response.ts +131 -2
  50. package/corpus/core/src/a2a/client.ts +10 -0
  51. package/corpus/core/src/a2a/handlers.ts +40 -76
  52. package/corpus/core/src/a2a/types.ts +2 -0
  53. package/corpus/core/src/agent/durable-background.ts +24 -0
  54. package/corpus/core/src/agent/production-agent.ts +48 -5
  55. package/corpus/core/src/agent/run-manager.ts +171 -20
  56. package/corpus/core/src/agent/run-store.ts +297 -42
  57. package/corpus/core/src/agent/types.ts +23 -0
  58. package/corpus/core/src/audit/record.ts +31 -0
  59. package/corpus/core/src/audit/store.ts +69 -3
  60. package/corpus/core/src/audit/types.ts +13 -0
  61. package/corpus/core/src/automation/index.ts +802 -0
  62. package/corpus/core/src/cli/create.ts +12 -5
  63. package/corpus/core/src/cli/design-connect.ts +596 -36
  64. package/corpus/core/src/client/AgentPanel.tsx +51 -6
  65. package/corpus/core/src/client/AssistantChat.tsx +274 -147
  66. package/corpus/core/src/client/MultiTabAssistantChat.tsx +3 -0
  67. package/corpus/core/src/client/RunStuckBanner.tsx +69 -20
  68. package/corpus/core/src/client/agent-chat-adapter.ts +110 -17
  69. package/corpus/core/src/client/automation.ts +22 -0
  70. package/corpus/core/src/client/chat/run-recovery.tsx +67 -50
  71. package/corpus/core/src/client/composer/TiptapComposer.tsx +8 -0
  72. package/corpus/core/src/client/index.ts +30 -0
  73. package/corpus/core/src/client/integrations/api.ts +295 -0
  74. package/corpus/core/src/client/integrations/index.ts +26 -0
  75. package/corpus/core/src/client/transcription/use-live-transcription.ts +68 -5
  76. package/corpus/core/src/client/use-run-stuck-detection.ts +41 -3
  77. package/corpus/core/src/deploy/build.ts +59 -3
  78. package/corpus/core/src/deploy/workspace-deploy.ts +37 -2
  79. package/corpus/core/src/file-upload/types.ts +2 -0
  80. package/corpus/core/src/index.ts +37 -0
  81. package/corpus/core/src/integrations/a2a-continuations-store.ts +6 -4
  82. package/corpus/core/src/integrations/adapters/discord.ts +362 -0
  83. package/corpus/core/src/integrations/adapters/index.ts +29 -0
  84. package/corpus/core/src/integrations/adapters/microsoft-teams.ts +411 -0
  85. package/corpus/core/src/integrations/adapters/slack.ts +861 -27
  86. package/corpus/core/src/integrations/adapters/telegram.ts +54 -15
  87. package/corpus/core/src/integrations/adapters/whatsapp.ts +41 -17
  88. package/corpus/core/src/integrations/catalog.ts +571 -0
  89. package/corpus/core/src/integrations/controls-store.ts +187 -0
  90. package/corpus/core/src/integrations/index.ts +100 -0
  91. package/corpus/core/src/integrations/installations-store.ts +677 -0
  92. package/corpus/core/src/integrations/integration-memory.ts +187 -0
  93. package/corpus/core/src/integrations/pending-tasks-retry-job.ts +6 -6
  94. package/corpus/core/src/integrations/pending-tasks-store.ts +83 -5
  95. package/corpus/core/src/integrations/plugin.ts +685 -47
  96. package/corpus/core/src/integrations/scope-store.ts +498 -0
  97. package/corpus/core/src/integrations/slack-manifest.ts +78 -0
  98. package/corpus/core/src/integrations/slack-oauth.ts +343 -0
  99. package/corpus/core/src/integrations/types.ts +179 -0
  100. package/corpus/core/src/integrations/usage-budget-store.ts +906 -0
  101. package/corpus/core/src/integrations/webhook-handler.ts +562 -51
  102. package/corpus/core/src/jobs/scheduler.ts +100 -2
  103. package/corpus/core/src/jobs/tools.ts +45 -9
  104. package/corpus/core/src/provider-api/index.ts +72 -1
  105. package/corpus/core/src/resources/handlers.ts +88 -14
  106. package/corpus/core/src/resources/script-helpers.ts +36 -7
  107. package/corpus/core/src/resources/store.ts +59 -52
  108. package/corpus/core/src/scripts/call-agent.ts +107 -1
  109. package/corpus/core/src/server/agent-chat-plugin.ts +294 -119
  110. package/corpus/core/src/server/auth.ts +10 -14
  111. package/corpus/core/src/server/builder-design-systems.ts +16 -1
  112. package/corpus/core/src/server/edge.ts +18 -0
  113. package/corpus/core/src/server/index.ts +26 -0
  114. package/corpus/core/src/server/request-context.ts +18 -0
  115. package/corpus/core/src/server/social-og-image.ts +3 -2
  116. package/corpus/core/src/styles/agent-native.css +62 -44
  117. package/corpus/core/src/templates/default/.agents/skills/capture-learnings/SKILL.md +22 -9
  118. package/corpus/core/src/templates/default/AGENTS.md +7 -3
  119. package/corpus/core/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +1 -1
  120. package/corpus/core/src/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +22 -9
  121. package/corpus/core/src/templates/workspace-core/.agents/skills/extension-points/SKILL.md +6 -3
  122. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +25 -0
  123. package/corpus/core/src/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +15 -0
  124. package/corpus/core/src/templates/workspace-core/AGENTS.md +3 -2
  125. package/corpus/core/src/usage/store.ts +37 -2
  126. package/corpus/templates/analytics/.agents/skills/capture-learnings/SKILL.md +22 -9
  127. package/corpus/templates/analytics/.agents/skills/provider-api/SKILL.md +23 -0
  128. package/corpus/templates/analytics/.builder/skills/provider-api/SKILL.md +15 -0
  129. package/corpus/templates/analytics/actions/save-monitor.ts +25 -2
  130. package/corpus/templates/analytics/app/lib/data-sources.ts +28 -0
  131. package/corpus/templates/analytics/changelog/2026-07-10-agent-created-uptime-monitors-now-return-a-direct-link-to-th.md +6 -0
  132. package/corpus/templates/analytics/changelog/2026-07-10-dashboard-email-reports-still-arrive-when-screenshot-capture-temporarily-fails.md +6 -0
  133. package/corpus/templates/analytics/server/jobs/dashboard-report.ts +3 -7
  134. package/corpus/templates/analytics/server/lib/credential-keys.ts +12 -0
  135. package/corpus/templates/analytics/server/lib/dashboard-report.ts +5 -1
  136. package/corpus/templates/analytics/server/lib/provider-credentials.ts +2 -0
  137. package/corpus/templates/analytics/server/routes/api/test-connection.post.ts +16 -0
  138. package/corpus/templates/assets/.agents/skills/capture-learnings/SKILL.md +22 -9
  139. package/corpus/templates/brain/.agents/skills/capture-learnings/SKILL.md +22 -9
  140. package/corpus/templates/calendar/.agents/skills/capture-learnings/SKILL.md +22 -9
  141. package/corpus/templates/calendar/app/components/calendar/CommandPalette.tsx +98 -108
  142. package/corpus/templates/calendar/app/components/calendar/EventAttendeesSection.tsx +97 -90
  143. package/corpus/templates/calendar/changelog/2026-07-10-event-guest-details-and-option-menus-now-use-valid-accessibl.md +6 -0
  144. package/corpus/templates/calendar/changelog/2026-07-10-natural-language-event-phrases-stay-available-as-quick-creat.md +6 -0
  145. package/corpus/templates/chat/.agents/skills/capture-learnings/SKILL.md +22 -9
  146. package/corpus/templates/chat/changelog/2026-07-10-chat-now-makes-ai-connection-setup-clear-without-shifting-th.md +6 -0
  147. package/corpus/templates/clips/.agents/skills/capture-learnings/SKILL.md +22 -9
  148. package/corpus/templates/clips/.agents/skills/recording/SKILL.md +17 -1
  149. package/corpus/templates/clips/.agents/skills/video-sharing/SKILL.md +8 -0
  150. package/corpus/templates/clips/AGENTS.md +8 -3
  151. package/corpus/templates/clips/actions/finalize-recording.ts +63 -23
  152. package/corpus/templates/clips/actions/get-recording-player-data.ts +6 -2
  153. package/corpus/templates/clips/actions/lib/ensure-seekable-video.ts +72 -9
  154. package/corpus/templates/clips/actions/list-recordings.ts +19 -3
  155. package/corpus/templates/clips/actions/navigate.ts +2 -0
  156. package/corpus/templates/clips/actions/reprocess-recording.ts +20 -6
  157. package/corpus/templates/clips/actions/request-transcript.ts +16 -31
  158. package/corpus/templates/clips/actions/view-screen.ts +57 -5
  159. package/corpus/templates/clips/app/components/layout/Header.tsx +1 -0
  160. package/corpus/templates/clips/app/components/library/empty-state.tsx +2 -0
  161. package/corpus/templates/clips/app/components/library/library-grid.tsx +69 -42
  162. package/corpus/templates/clips/app/components/library/library-layout.tsx +15 -1
  163. package/corpus/templates/clips/app/components/library/recording-card.tsx +81 -68
  164. package/corpus/templates/clips/app/components/library/search-bar.tsx +4 -3
  165. package/corpus/templates/clips/app/components/player/delete-recording-menu.tsx +9 -3
  166. package/corpus/templates/clips/app/components/player/share-dialog.tsx +1 -1
  167. package/corpus/templates/clips/app/components/player/transcript-panel.tsx +27 -5
  168. package/corpus/templates/clips/app/hooks/use-library.ts +1 -1
  169. package/corpus/templates/clips/app/hooks/use-navigation-state.ts +10 -2
  170. package/corpus/templates/clips/app/hooks/use-player-shortcuts.ts +1 -0
  171. package/corpus/templates/clips/app/i18n/ar-SA.ts +7 -1
  172. package/corpus/templates/clips/app/i18n/de-DE.ts +7 -1
  173. package/corpus/templates/clips/app/i18n/en-US.ts +7 -1
  174. package/corpus/templates/clips/app/i18n/es-ES.ts +7 -1
  175. package/corpus/templates/clips/app/i18n/fr-FR.ts +7 -1
  176. package/corpus/templates/clips/app/i18n/hi-IN.ts +7 -1
  177. package/corpus/templates/clips/app/i18n/ja-JP.ts +7 -1
  178. package/corpus/templates/clips/app/i18n/ko-KR.ts +7 -1
  179. package/corpus/templates/clips/app/i18n/pt-BR.ts +7 -1
  180. package/corpus/templates/clips/app/i18n/zh-CN.ts +8 -1
  181. package/corpus/templates/clips/app/i18n/zh-TW.ts +8 -1
  182. package/corpus/templates/clips/app/lib/recording-visibility.ts +70 -0
  183. package/corpus/templates/clips/app/routes/_app.shared.tsx +20 -0
  184. package/corpus/templates/clips/app/routes/download.tsx +24 -8
  185. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +115 -2
  186. package/corpus/templates/clips/app/routes/record.tsx +62 -0
  187. package/corpus/templates/clips/app/routes/share.$shareId.tsx +25 -16
  188. package/corpus/templates/clips/changelog/2026-07-10-clips-desktop-is-now-available-for-linux-with-appimage-debia.md +6 -0
  189. package/corpus/templates/clips/changelog/2026-07-10-clips-downloads-updates-sooner-in-the-background-and-offers-.md +6 -0
  190. package/corpus/templates/clips/changelog/2026-07-10-clips-shared-with-you-now-appear-in-a-searchable-shared-with.md +6 -0
  191. package/corpus/templates/clips/changelog/2026-07-10-clips-with-missing-mobile-video-frames-can-be-repaired-witho.md +6 -0
  192. package/corpus/templates/clips/changelog/2026-07-10-fixed-copying-agent-responses-and-transcript-text-from-recor.md +6 -0
  193. package/corpus/templates/clips/changelog/2026-07-10-mobile-camera-recordings-pause-while-backgrounded.md +6 -0
  194. package/corpus/templates/clips/changelog/2026-07-10-mp4-downloads-now-show-progress-immediately-after-the-option.md +6 -0
  195. package/corpus/templates/clips/changelog/2026-07-10-recording-pages-now-open-as-soon-as-you-stop-with-a-share-li.md +6 -0
  196. package/corpus/templates/clips/changelog/2026-07-10-recordings-now-seek-smoothly-downloads-use-the-correct-file-.md +6 -0
  197. package/corpus/templates/clips/changelog/2026-07-10-s3-compatible-storage-now-saves-hosted-recordings-without-re.md +6 -0
  198. package/corpus/templates/clips/desktop/README.md +22 -6
  199. package/corpus/templates/clips/desktop/package.json +1 -1
  200. package/corpus/templates/clips/desktop/src/app.tsx +32 -19
  201. package/corpus/templates/clips/desktop/src/components/ReadinessPanel.tsx +15 -9
  202. package/corpus/templates/clips/desktop/src/lib/finalization-guard.ts +22 -0
  203. package/corpus/templates/clips/desktop/src/lib/permissions.ts +3 -1
  204. package/corpus/templates/clips/desktop/src/lib/recorder.ts +97 -120
  205. package/corpus/templates/clips/desktop/src/lib/updater.ts +26 -4
  206. package/corpus/templates/clips/desktop/src/overlays/finalizing.tsx +4 -8
  207. package/corpus/templates/clips/desktop/src-tauri/Cargo.toml +1 -1
  208. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +2 -2
  209. package/corpus/templates/clips/desktop/src-tauri/src/permission_status.rs +11 -7
  210. package/corpus/templates/clips/desktop/src-tauri/tauri.linux.conf.json +11 -0
  211. package/corpus/templates/clips/netlify.toml +3 -0
  212. package/corpus/templates/clips/server/lib/post-finalize-dispatch.ts +106 -0
  213. package/corpus/templates/clips/server/lib/public-agent-context.ts +9 -1
  214. package/corpus/templates/clips/server/lib/resumable-upload-provider.ts +52 -0
  215. package/corpus/templates/clips/server/lib/s3-upload-provider.ts +433 -85
  216. package/corpus/templates/clips/server/lib/video-remux.ts +114 -0
  217. package/corpus/templates/clips/server/routes/api/_agent-native-background/post-finalize-worker.post.ts +109 -0
  218. package/corpus/templates/clips/server/routes/api/clips-updater.json.get.ts +22 -11
  219. package/corpus/templates/clips/server/routes/api/public-recording.get.ts +4 -2
  220. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/abort.post.ts +47 -5
  221. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +10 -2
  222. package/corpus/templates/clips/shared/share-loader-response.ts +12 -0
  223. package/corpus/templates/clips/shared/transcript-status.ts +40 -0
  224. package/corpus/templates/content/.agents/skills/capture-learnings/SKILL.md +22 -9
  225. package/corpus/templates/content/.agents/skills/content/SKILL.md +57 -5
  226. package/corpus/templates/content/AGENTS.md +65 -55
  227. package/corpus/templates/content/actions/_builder-cms-read-client.ts +92 -23
  228. package/corpus/templates/content/actions/_database-source-utils.ts +207 -41
  229. package/corpus/templates/content/actions/_property-utils.ts +30 -2
  230. package/corpus/templates/content/actions/add-content-database-source-field-property.ts +316 -121
  231. package/corpus/templates/content/actions/attach-content-database-source.ts +41 -17
  232. package/corpus/templates/content/actions/change-content-database-source-role.ts +46 -8
  233. package/corpus/templates/content/actions/submit-content-database-form.ts +497 -0
  234. package/corpus/templates/content/actions/suggest-source-join-key.ts +8 -1
  235. package/corpus/templates/content/actions/update-content-database-view.ts +8 -1
  236. package/corpus/templates/content/actions/view-screen.ts +4 -1
  237. package/corpus/templates/content/agent-native.app-skill.json +1 -1
  238. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +250 -64
  239. package/corpus/templates/content/app/components/editor/database/FormView.tsx +460 -0
  240. package/corpus/templates/content/app/components/editor/database/navigation-state.ts +3 -0
  241. package/corpus/templates/content/app/components/editor/database/settings.tsx +30 -37
  242. package/corpus/templates/content/app/components/editor/database/shared.tsx +2 -0
  243. package/corpus/templates/content/app/components/editor/database/view-config.ts +29 -1
  244. package/corpus/templates/content/app/components/ui/textarea.tsx +1 -0
  245. package/corpus/templates/content/app/hooks/use-content-database.ts +22 -0
  246. package/corpus/templates/content/app/i18n/zh-TW.ts +21 -0
  247. package/corpus/templates/content/app/i18n-data.ts +225 -0
  248. package/corpus/templates/content/changelog/2026-07-09-builder-source-refreshes-now-keep-mapped-fields-such-as-topi.md +6 -0
  249. package/corpus/templates/content/changelog/2026-07-10-builder-backed-properties-now-load-current-source-values-as-.md +6 -0
  250. package/corpus/templates/content/changelog/2026-07-10-builder-database-refreshes-now-stay-explicit-and-accurate.md +6 -0
  251. package/corpus/templates/content/changelog/2026-07-10-database-form-views-now-collect-ordered-required-answers-and.md +6 -0
  252. package/corpus/templates/content/changelog/2026-07-10-database-tables-now-use-a-quieter-more-compact-layout-with-c.md +6 -0
  253. package/corpus/templates/content/changelog/2026-07-10-slack-intake-routes-to-content-database-forms.md +6 -0
  254. package/corpus/templates/content/parity/matrix.md +1 -0
  255. package/corpus/templates/content/parity/matrix.ts +18 -0
  256. package/corpus/templates/content/shared/api.ts +28 -1
  257. package/corpus/templates/content/shared/database-form.ts +53 -0
  258. package/corpus/templates/design/.agents/skills/capture-learnings/SKILL.md +22 -9
  259. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +26 -0
  260. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +85 -12
  261. package/corpus/templates/design/AGENTS.md +72 -18
  262. package/corpus/templates/design/DESIGN.md +1 -1
  263. package/corpus/templates/design/DEVELOPING.md +1 -1
  264. package/corpus/templates/design/FIGMA_INTEROPERABILITY.md +116 -0
  265. package/corpus/templates/design/actions/create-design-from-template.ts +220 -0
  266. package/corpus/templates/design/actions/create-design-system.ts +92 -16
  267. package/corpus/templates/design/actions/delete-design-template.ts +28 -0
  268. package/corpus/templates/design/actions/delete-file.ts +7 -0
  269. package/corpus/templates/design/actions/edit-design.ts +3 -0
  270. package/corpus/templates/design/actions/export-design-as-figma-svg.ts +137 -5
  271. package/corpus/templates/design/actions/export-pdf.ts +1 -1
  272. package/corpus/templates/design/actions/generate-design.ts +3 -0
  273. package/corpus/templates/design/actions/get-design-snapshot.ts +9 -0
  274. package/corpus/templates/design/actions/get-figma-connection-status.ts +26 -0
  275. package/corpus/templates/design/actions/get-figma-design-context.ts +138 -0
  276. package/corpus/templates/design/actions/get-figma-styles.ts +2 -2
  277. package/corpus/templates/design/actions/import-figma-clipboard.ts +112 -16
  278. package/corpus/templates/design/actions/import-figma-frame.ts +15 -4
  279. package/corpus/templates/design/actions/index-design-system-with-builder.ts +4 -0
  280. package/corpus/templates/design/actions/list-design-templates.ts +118 -0
  281. package/corpus/templates/design/actions/navigate.ts +16 -2
  282. package/corpus/templates/design/actions/provider-api-request.ts +11 -1
  283. package/corpus/templates/design/actions/save-design-as-template.ts +156 -0
  284. package/corpus/templates/design/actions/set-active-breakpoint.ts +13 -4
  285. package/corpus/templates/design/actions/take-design-screenshot.ts +73 -3
  286. package/corpus/templates/design/actions/update-file.ts +39 -22
  287. package/corpus/templates/design/actions/view-screen.ts +36 -1
  288. package/corpus/templates/design/actions/write-local-file.ts +50 -38
  289. package/corpus/templates/design/app/components/design/AutoLayoutSuggestionDialog.tsx +151 -0
  290. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +20 -0
  291. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +251 -22
  292. package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +3 -3
  293. package/corpus/templates/design/app/components/design/DesignImportPanel.tsx +384 -9
  294. package/corpus/templates/design/app/components/design/EditPanel.tsx +105 -32
  295. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +58 -28
  296. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +6 -0
  297. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +539 -53
  298. package/corpus/templates/design/app/components/design/bridge/embedded-wheel.bridge.ts +40 -0
  299. package/corpus/templates/design/app/components/design/code-workbench/CodeWorkbench.tsx +1 -0
  300. package/corpus/templates/design/app/components/design/code-workbench/explorer/ExplorerView.tsx +1 -0
  301. package/corpus/templates/design/app/components/design/code-workbench/explorer/FileTree.tsx +5 -1
  302. package/corpus/templates/design/app/components/design/code-workbench/workspace/create-providers.ts +2 -0
  303. package/corpus/templates/design/app/components/design/code-workbench/workspace/localhost-provider.ts +3 -1
  304. package/corpus/templates/design/app/components/design/code-workbench/workspace/types.ts +2 -0
  305. package/corpus/templates/design/app/components/design/edit-panel/element-identity.ts +19 -0
  306. package/corpus/templates/design/app/components/design/edit-panel/frame-presets-panel.tsx +1 -0
  307. package/corpus/templates/design/app/components/design/edit-panel/interaction-state-helpers.ts +27 -0
  308. package/corpus/templates/design/app/components/design/inspector/InteractionStatePanel.tsx +137 -81
  309. package/corpus/templates/design/app/components/design/inspector/frame-size-presets.ts +25 -5
  310. package/corpus/templates/design/app/components/design/multi-screen/chrome-transitions.ts +1 -1
  311. package/corpus/templates/design/app/components/design/multi-screen/frame-geometry.ts +220 -3
  312. package/corpus/templates/design/app/components/design/multi-screen/overview-layout.ts +13 -0
  313. package/corpus/templates/design/app/components/design/multi-screen/types.ts +22 -1
  314. package/corpus/templates/design/app/components/design/types.ts +4 -0
  315. package/corpus/templates/design/app/components/design-system/ProductionDesignSystemShowcase.tsx +208 -0
  316. package/corpus/templates/design/app/components/editor/FigmaLinkComposerBubble.tsx +321 -0
  317. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +24 -4
  318. package/corpus/templates/design/app/components/layout/Layout.tsx +16 -2
  319. package/corpus/templates/design/app/components/layout/Sidebar.tsx +2 -0
  320. package/corpus/templates/design/app/components/templates/TemplatePreview.tsx +72 -0
  321. package/corpus/templates/design/app/global.css +2 -35
  322. package/corpus/templates/design/app/hooks/use-navigation-state.ts +10 -0
  323. package/corpus/templates/design/app/i18n/zh-TW.ts +127 -5
  324. package/corpus/templates/design/app/i18n-breakpoints.ts +209 -0
  325. package/corpus/templates/design/app/i18n-data.ts +1317 -59
  326. package/corpus/templates/design/app/i18n-template-feature.ts +458 -0
  327. package/corpus/templates/design/app/lib/design-clipboard.ts +202 -0
  328. package/corpus/templates/design/app/lib/design-file-upload.ts +87 -0
  329. package/corpus/templates/design/app/lib/design-import.ts +168 -11
  330. package/corpus/templates/design/app/lib/desktop-design-preview.ts +423 -0
  331. package/corpus/templates/design/app/lib/figma-clipboard.ts +74 -8
  332. package/corpus/templates/design/app/lib/figma-connection.ts +161 -0
  333. package/corpus/templates/design/app/lib/figma-svg-copy.ts +814 -22
  334. package/corpus/templates/design/app/lib/figma-url.ts +77 -0
  335. package/corpus/templates/design/app/lib/pending-generation.ts +35 -0
  336. package/corpus/templates/design/app/pages/DesignSystems.tsx +236 -177
  337. package/corpus/templates/design/app/pages/Index.tsx +38 -0
  338. package/corpus/templates/design/app/pages/Templates.tsx +498 -0
  339. package/corpus/templates/design/app/pages/design-editor/auto-layout-suggestion.ts +328 -0
  340. package/corpus/templates/design/app/pages/design-editor/clone-idrefs.ts +113 -0
  341. package/corpus/templates/design/app/pages/design-editor/created-screen-navigation.ts +55 -0
  342. package/corpus/templates/design/app/pages/design-editor/editor-session.ts +32 -0
  343. package/corpus/templates/design/app/pages/design-editor/editor-state.ts +49 -2
  344. package/corpus/templates/design/app/pages/design-editor/export-capture.ts +296 -0
  345. package/corpus/templates/design/app/pages/design-editor/history.ts +101 -2
  346. package/corpus/templates/design/app/pages/design-editor/layout-operations.ts +28 -1
  347. package/corpus/templates/design/app/pages/design-editor/overview-camera.ts +34 -0
  348. package/corpus/templates/design/app/pages/design-editor/pending-edits.ts +202 -6
  349. package/corpus/templates/design/app/pages/design-editor/pending-structure-verification.ts +92 -0
  350. package/corpus/templates/design/app/pages/design-editor/save-failure.ts +58 -0
  351. package/corpus/templates/design/app/routes/templates.tsx +4 -6
  352. package/corpus/templates/design/changelog/2026-07-10-app-workspaces-now-use-clean-borderless-main-surfaces-throug.md +6 -0
  353. package/corpus/templates/design/changelog/2026-07-10-ask-chat-what-s-in-a-figma-file-or-frame-structure-screensho.md +6 -0
  354. package/corpus/templates/design/changelog/2026-07-10-canvas-edits-now-reject-malformed-html-before-it-can-corrupt.md +6 -0
  355. package/corpus/templates/design/changelog/2026-07-10-complex-designs-now-export-as-valid-secure-svgs-and-crisp-ra.md +6 -0
  356. package/corpus/templates/design/changelog/2026-07-10-complex-figma-masks-arcs-rich-text-transformed-images-and-ad.md +6 -0
  357. package/corpus/templates/design/changelog/2026-07-10-copied-layers-paste-across-designs-and-browser-tabs.md +6 -0
  358. package/corpus/templates/design/changelog/2026-07-10-copy-and-download-editable-figma-svg.md +6 -0
  359. package/corpus/templates/design/changelog/2026-07-10-copying-design-text-now-pastes-readable-text-into-other-apps.md +6 -0
  360. package/corpus/templates/design/changelog/2026-07-10-deleted-screens-can-be-restored-with-undo-and-removed-again-.md +6 -0
  361. package/corpus/templates/design/changelog/2026-07-10-design-changes-now-save-before-switching-apps-and-retry-when.md +6 -0
  362. package/corpus/templates/design/changelog/2026-07-10-design-stays-usable-on-phones-by-keeping-editor-panels-and-f.md +6 -0
  363. package/corpus/templates/design/changelog/2026-07-10-download-all-screens-as-one-multi-page-pdf-from-the-overview.md +6 -0
  364. package/corpus/templates/design/changelog/2026-07-10-duplicated-layers-now-keep-labels-aria-relationships-fragmen.md +6 -0
  365. package/corpus/templates/design/changelog/2026-07-10-fig-import-results-stay-compact.md +6 -0
  366. package/corpus/templates/design/changelog/2026-07-10-figma-imports-now-load-real-fonts-fix-rotated-gradient-dashe.md +6 -0
  367. package/corpus/templates/design/changelog/2026-07-10-figma-links-in-chat-and-the-import-tab-now-offer-secure-one-.md +6 -0
  368. package/corpus/templates/design/changelog/2026-07-10-fixed-cmd-z-not-restoring-content-after-an-agent-driven-desi.md +6 -0
  369. package/corpus/templates/design/changelog/2026-07-10-fixed-download-pdf-being-unreachable-from-the-export-panel-e.md +6 -0
  370. package/corpus/templates/design/changelog/2026-07-10-fixed-dragging-a-layer-out-of-an-auto-layout-row-column-no-l.md +6 -0
  371. package/corpus/templates/design/changelog/2026-07-10-fixed-figma-svg-export-text-wrapping-sizing-and-inner-layer.md +6 -0
  372. package/corpus/templates/design/changelog/2026-07-10-fixed-hiding-or-locking-one-layer-no-longer-hides-or-blocks-.md +6 -0
  373. package/corpus/templates/design/changelog/2026-07-10-fixed-png-screenshots-of-tall-screens-being-cropped-to-one-v.md +6 -0
  374. package/corpus/templates/design/changelog/2026-07-10-fixed-png-svg-exports-capturing-broken-layout-when-webfonts-.md +6 -0
  375. package/corpus/templates/design/changelog/2026-07-10-frame-tool-now-offers-standard-ad-unit-size-presets-medium-r.md +6 -0
  376. package/corpus/templates/design/changelog/2026-07-10-full-view-controls-stay-within-their-frame-instead-of-coveri.md +6 -0
  377. package/corpus/templates/design/changelog/2026-07-10-hover-focus-focus-visible-pressed-and-disabled-states-now-pr.md +6 -0
  378. package/corpus/templates/design/changelog/2026-07-10-layer-drops-now-land-in-the-intended-grid-row-stay-visually-.md +6 -0
  379. package/corpus/templates/design/changelog/2026-07-10-local-code-workspaces-now-keep-unsaved-edits-across-panel-sw.md +6 -0
  380. package/corpus/templates/design/changelog/2026-07-10-local-visual-editing-now-keeps-authenticated-sessions-shared.md +6 -0
  381. package/corpus/templates/design/changelog/2026-07-10-long-running-agent-work-no-longer-shows-a-premature-stuck-wa.md +6 -0
  382. package/corpus/templates/design/changelog/2026-07-10-managed-figma-connections-are-recognized-automatically.md +6 -0
  383. package/corpus/templates/design/changelog/2026-07-10-new-designs-can-open-directly-in-the-editor-without-a-pr.md +6 -0
  384. package/corpus/templates/design/changelog/2026-07-10-new-screens-are-selected-and-revealed-immediately.md +6 -0
  385. package/corpus/templates/design/changelog/2026-07-10-new-text-layers-undo-as-one-safe-creation.md +6 -0
  386. package/corpus/templates/design/changelog/2026-07-10-preview-and-apply-inferred-auto-layout-without-changing-yo.md +5 -0
  387. package/corpus/templates/design/changelog/2026-07-10-print-pdf-exports-and-paper-size-presets-letter-a4-now-match.md +6 -0
  388. package/corpus/templates/design/changelog/2026-07-10-responsive-frame-editing.md +6 -0
  389. package/corpus/templates/design/changelog/2026-07-10-reusable-design-templates.md +6 -0
  390. package/corpus/templates/design/changelog/2026-07-10-screen-overview-frames-now-use-a-clearer-interact-action-wit.md +6 -0
  391. package/corpus/templates/design/changelog/2026-07-10-start-designs-from-source-linked-material-3-carbon-or-primer.md +6 -0
  392. package/corpus/templates/design/changelog/2026-07-10-tweaks-guidance.md +6 -0
  393. package/corpus/templates/design/changelog/2026-07-10-uploaded-fig-files-can-now-become-editable-design-screens-wi.md +6 -0
  394. package/corpus/templates/design/e2e/helpers.ts +3 -3
  395. package/corpus/templates/design/package.json +2 -0
  396. package/corpus/templates/design/scripts/qa-figma-stress-import.ts +96 -0
  397. package/corpus/templates/design/server/db/index.ts +10 -0
  398. package/corpus/templates/design/server/db/schema.ts +44 -0
  399. package/corpus/templates/design/server/handlers/import-design-file.ts +114 -80
  400. package/corpus/templates/design/server/handlers/index-design-system-with-builder.ts +19 -6
  401. package/corpus/templates/design/server/lib/design-export.ts +240 -3
  402. package/corpus/templates/design/server/lib/design-template-data.ts +89 -0
  403. package/corpus/templates/design/server/lib/design-to-figma-svg.ts +250 -26
  404. package/corpus/templates/design/server/lib/fig-file-decoder.ts +839 -0
  405. package/corpus/templates/design/server/lib/fig-file-import.ts +287 -0
  406. package/corpus/templates/design/server/lib/fig-file-limits.ts +3 -0
  407. package/corpus/templates/design/server/lib/fig-file-to-html.ts +2568 -0
  408. package/corpus/templates/design/server/lib/figma-design-context.ts +359 -0
  409. package/corpus/templates/design/server/lib/figma-node-import.ts +478 -22
  410. package/corpus/templates/design/server/lib/figma-node-to-html.ts +554 -29
  411. package/corpus/templates/design/server/lib/local-figma-qa-upload.ts +112 -0
  412. package/corpus/templates/design/server/lib/verify-write-grant.ts +16 -2
  413. package/corpus/templates/design/server/lib/visible-clipboard-html.ts +13 -3
  414. package/corpus/templates/design/server/plugins/agent-chat.ts +7 -0
  415. package/corpus/templates/design/server/plugins/db.ts +42 -0
  416. package/corpus/templates/design/server/plugins/local-figma-qa-upload.ts +7 -0
  417. package/corpus/templates/design/server/register-secrets.ts +8 -8
  418. package/corpus/templates/design/server/routes/api/qa-figma-import-assets/[assetId].get.ts +46 -0
  419. package/corpus/templates/design/server/source-workspace.ts +104 -12
  420. package/corpus/templates/design/shared/code-layer.ts +105 -28
  421. package/corpus/templates/design/shared/design-system-templates.ts +301 -0
  422. package/corpus/templates/design/shared/design-template-presets.ts +195 -0
  423. package/corpus/templates/design/shared/figma-url.ts +8 -0
  424. package/corpus/templates/design/shared/html-integrity.ts +306 -0
  425. package/corpus/templates/design/shared/interaction-states.ts +318 -23
  426. package/corpus/templates/design/shared/locked-layers.ts +151 -0
  427. package/corpus/templates/dispatch/.agents/skills/capture-learnings/SKILL.md +22 -9
  428. package/corpus/templates/dispatch/app/i18n/zh-TW.ts +48 -0
  429. package/corpus/templates/dispatch/app/i18n-data.ts +536 -1
  430. package/corpus/templates/dispatch/changelog/2026-07-10-connect-slack-workspaces-with-oauth-and-manage-channel-ident.md +6 -0
  431. package/corpus/templates/dispatch/changelog/2026-07-10-microsoft-teams-bots-and-discord-slash-commands-can-now-conn.md +6 -0
  432. package/corpus/templates/dispatch/changelog/2026-07-10-slack-and-telegram-now-route-uptime-monitor-requests-to-anal.md +6 -0
  433. package/corpus/templates/forms/.agents/skills/capture-learnings/SKILL.md +22 -9
  434. package/corpus/templates/forms/.agents/skills/form-publishing/SKILL.md +7 -0
  435. package/corpus/templates/forms/AGENTS.md +4 -0
  436. package/corpus/templates/forms/actions/create-form.ts +44 -7
  437. package/corpus/templates/forms/actions/lib/assert-publishable-form.ts +38 -0
  438. package/corpus/templates/forms/actions/patch-form-fields.ts +4 -0
  439. package/corpus/templates/forms/actions/update-form.ts +2 -36
  440. package/corpus/templates/forms/app/i18n/ar-SA.ts +3 -0
  441. package/corpus/templates/forms/app/i18n/de-DE.ts +3 -0
  442. package/corpus/templates/forms/app/i18n/en-US.ts +3 -0
  443. package/corpus/templates/forms/app/i18n/es-ES.ts +3 -0
  444. package/corpus/templates/forms/app/i18n/fr-FR.ts +3 -0
  445. package/corpus/templates/forms/app/i18n/hi-IN.ts +3 -0
  446. package/corpus/templates/forms/app/i18n/ja-JP.ts +3 -0
  447. package/corpus/templates/forms/app/i18n/ko-KR.ts +3 -0
  448. package/corpus/templates/forms/app/i18n/pt-BR.ts +3 -0
  449. package/corpus/templates/forms/app/i18n/zh-CN.ts +2 -0
  450. package/corpus/templates/forms/app/i18n/zh-TW.ts +3 -0
  451. package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +17 -0
  452. package/corpus/templates/forms/changelog/2026-07-10-agent-created-published-forms-now-return-the-anonymous-publi.md +6 -0
  453. package/corpus/templates/forms/changelog/2026-07-10-published-forms-can-no-longer-be-edited-into-an-unusable-emp.md +6 -0
  454. package/corpus/templates/forms/server/handlers/submissions.ts +4 -3
  455. package/corpus/templates/forms/server/plugins/agent-chat.ts +1 -0
  456. package/corpus/templates/forms/shared/types.ts +5 -0
  457. package/corpus/templates/mail/.agents/skills/capture-learnings/SKILL.md +22 -9
  458. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +2 -2
  459. package/corpus/templates/mail/changelog/2026-07-10-mail-navigation-now-uses-a-clean-borderless-drawer.md +6 -0
  460. package/corpus/templates/plan/.agents/skills/capture-learnings/SKILL.md +22 -9
  461. package/corpus/templates/plan/app/lib/plan-local-bridge.ts +4 -1
  462. package/corpus/templates/plan/changelog/2026-07-10-local-plans-now-keep-valid-content-visible-when-one-generate.md +6 -0
  463. package/corpus/templates/plan/server/lib/local-plan-files.ts +4 -1
  464. package/corpus/templates/slides/.agents/skills/capture-learnings/SKILL.md +22 -9
  465. package/dist/a2a/artifact-response.d.ts.map +1 -1
  466. package/dist/a2a/artifact-response.js +88 -2
  467. package/dist/a2a/artifact-response.js.map +1 -1
  468. package/dist/a2a/client.d.ts +9 -0
  469. package/dist/a2a/client.d.ts.map +1 -1
  470. package/dist/a2a/client.js +1 -0
  471. package/dist/a2a/client.js.map +1 -1
  472. package/dist/a2a/handlers.d.ts.map +1 -1
  473. package/dist/a2a/handlers.js +24 -69
  474. package/dist/a2a/handlers.js.map +1 -1
  475. package/dist/a2a/types.d.ts +2 -0
  476. package/dist/a2a/types.d.ts.map +1 -1
  477. package/dist/a2a/types.js.map +1 -1
  478. package/dist/agent/durable-background.d.ts +11 -0
  479. package/dist/agent/durable-background.d.ts.map +1 -1
  480. package/dist/agent/durable-background.js +17 -0
  481. package/dist/agent/durable-background.js.map +1 -1
  482. package/dist/agent/production-agent.d.ts +5 -3
  483. package/dist/agent/production-agent.d.ts.map +1 -1
  484. package/dist/agent/production-agent.js +34 -8
  485. package/dist/agent/production-agent.js.map +1 -1
  486. package/dist/agent/run-manager.d.ts +44 -2
  487. package/dist/agent/run-manager.d.ts.map +1 -1
  488. package/dist/agent/run-manager.js +124 -18
  489. package/dist/agent/run-manager.js.map +1 -1
  490. package/dist/agent/run-store.d.ts +109 -0
  491. package/dist/agent/run-store.d.ts.map +1 -1
  492. package/dist/agent/run-store.js +274 -37
  493. package/dist/agent/run-store.js.map +1 -1
  494. package/dist/agent/types.d.ts +22 -0
  495. package/dist/agent/types.d.ts.map +1 -1
  496. package/dist/agent/types.js.map +1 -1
  497. package/dist/audit/record.d.ts.map +1 -1
  498. package/dist/audit/record.js +29 -0
  499. package/dist/audit/record.js.map +1 -1
  500. package/dist/audit/store.d.ts.map +1 -1
  501. package/dist/audit/store.js +62 -3
  502. package/dist/audit/store.js.map +1 -1
  503. package/dist/audit/types.d.ts +13 -0
  504. package/dist/audit/types.d.ts.map +1 -1
  505. package/dist/audit/types.js.map +1 -1
  506. package/dist/automation/index.d.ts +193 -0
  507. package/dist/automation/index.d.ts.map +1 -0
  508. package/dist/automation/index.js +464 -0
  509. package/dist/automation/index.js.map +1 -0
  510. package/dist/cli/create.d.ts.map +1 -1
  511. package/dist/cli/create.js +10 -3
  512. package/dist/cli/create.js.map +1 -1
  513. package/dist/cli/design-connect.d.ts.map +1 -1
  514. package/dist/cli/design-connect.js +492 -35
  515. package/dist/cli/design-connect.js.map +1 -1
  516. package/dist/client/AgentPanel.d.ts +7 -1
  517. package/dist/client/AgentPanel.d.ts.map +1 -1
  518. package/dist/client/AgentPanel.js +32 -8
  519. package/dist/client/AgentPanel.js.map +1 -1
  520. package/dist/client/AssistantChat.d.ts +15 -0
  521. package/dist/client/AssistantChat.d.ts.map +1 -1
  522. package/dist/client/AssistantChat.js +115 -47
  523. package/dist/client/AssistantChat.js.map +1 -1
  524. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  525. package/dist/client/MultiTabAssistantChat.js +1 -1
  526. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  527. package/dist/client/RunStuckBanner.d.ts +14 -1
  528. package/dist/client/RunStuckBanner.d.ts.map +1 -1
  529. package/dist/client/RunStuckBanner.js +35 -7
  530. package/dist/client/RunStuckBanner.js.map +1 -1
  531. package/dist/client/agent-chat-adapter.d.ts +4 -1
  532. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  533. package/dist/client/agent-chat-adapter.js +97 -16
  534. package/dist/client/agent-chat-adapter.js.map +1 -1
  535. package/dist/client/automation.d.ts +14 -0
  536. package/dist/client/automation.d.ts.map +1 -0
  537. package/dist/client/automation.js +9 -0
  538. package/dist/client/automation.js.map +1 -0
  539. package/dist/client/chat/run-recovery.d.ts +4 -0
  540. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  541. package/dist/client/chat/run-recovery.js +12 -10
  542. package/dist/client/chat/run-recovery.js.map +1 -1
  543. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  544. package/dist/client/composer/TiptapComposer.js +8 -0
  545. package/dist/client/composer/TiptapComposer.js.map +1 -1
  546. package/dist/client/index.d.ts +2 -0
  547. package/dist/client/index.d.ts.map +1 -1
  548. package/dist/client/index.js +2 -0
  549. package/dist/client/index.js.map +1 -1
  550. package/dist/client/integrations/api.d.ts +115 -0
  551. package/dist/client/integrations/api.d.ts.map +1 -0
  552. package/dist/client/integrations/api.js +123 -0
  553. package/dist/client/integrations/api.js.map +1 -0
  554. package/dist/client/integrations/index.d.ts +1 -0
  555. package/dist/client/integrations/index.d.ts.map +1 -1
  556. package/dist/client/integrations/index.js +1 -0
  557. package/dist/client/integrations/index.js.map +1 -1
  558. package/dist/client/transcription/use-live-transcription.d.ts.map +1 -1
  559. package/dist/client/transcription/use-live-transcription.js +59 -5
  560. package/dist/client/transcription/use-live-transcription.js.map +1 -1
  561. package/dist/client/use-run-stuck-detection.d.ts +16 -1
  562. package/dist/client/use-run-stuck-detection.d.ts.map +1 -1
  563. package/dist/client/use-run-stuck-detection.js +23 -4
  564. package/dist/client/use-run-stuck-detection.js.map +1 -1
  565. package/dist/collab/awareness.d.ts +2 -2
  566. package/dist/collab/awareness.d.ts.map +1 -1
  567. package/dist/deploy/build.d.ts.map +1 -1
  568. package/dist/deploy/build.js +49 -4
  569. package/dist/deploy/build.js.map +1 -1
  570. package/dist/deploy/workspace-deploy.d.ts.map +1 -1
  571. package/dist/deploy/workspace-deploy.js +31 -2
  572. package/dist/deploy/workspace-deploy.js.map +1 -1
  573. package/dist/file-upload/types.d.ts +2 -0
  574. package/dist/file-upload/types.d.ts.map +1 -1
  575. package/dist/file-upload/types.js.map +1 -1
  576. package/dist/index.d.ts +2 -0
  577. package/dist/index.d.ts.map +1 -1
  578. package/dist/index.js +2 -0
  579. package/dist/index.js.map +1 -1
  580. package/dist/integrations/a2a-continuations-store.d.ts.map +1 -1
  581. package/dist/integrations/a2a-continuations-store.js +6 -4
  582. package/dist/integrations/a2a-continuations-store.js.map +1 -1
  583. package/dist/integrations/adapters/discord.d.ts +3 -0
  584. package/dist/integrations/adapters/discord.d.ts.map +1 -0
  585. package/dist/integrations/adapters/discord.js +261 -0
  586. package/dist/integrations/adapters/discord.js.map +1 -0
  587. package/dist/integrations/adapters/index.d.ts +4 -0
  588. package/dist/integrations/adapters/index.d.ts.map +1 -0
  589. package/dist/integrations/adapters/index.js +26 -0
  590. package/dist/integrations/adapters/index.js.map +1 -0
  591. package/dist/integrations/adapters/microsoft-teams.d.ts +5 -0
  592. package/dist/integrations/adapters/microsoft-teams.d.ts.map +1 -0
  593. package/dist/integrations/adapters/microsoft-teams.js +295 -0
  594. package/dist/integrations/adapters/microsoft-teams.js.map +1 -0
  595. package/dist/integrations/adapters/slack.d.ts +8 -2
  596. package/dist/integrations/adapters/slack.d.ts.map +1 -1
  597. package/dist/integrations/adapters/slack.js +736 -27
  598. package/dist/integrations/adapters/slack.js.map +1 -1
  599. package/dist/integrations/adapters/telegram.d.ts +0 -2
  600. package/dist/integrations/adapters/telegram.d.ts.map +1 -1
  601. package/dist/integrations/adapters/telegram.js +49 -15
  602. package/dist/integrations/adapters/telegram.js.map +1 -1
  603. package/dist/integrations/adapters/whatsapp.d.ts +0 -2
  604. package/dist/integrations/adapters/whatsapp.d.ts.map +1 -1
  605. package/dist/integrations/adapters/whatsapp.js +40 -17
  606. package/dist/integrations/adapters/whatsapp.js.map +1 -1
  607. package/dist/integrations/catalog.d.ts +75 -0
  608. package/dist/integrations/catalog.d.ts.map +1 -0
  609. package/dist/integrations/catalog.js +451 -0
  610. package/dist/integrations/catalog.js.map +1 -0
  611. package/dist/integrations/controls-store.d.ts +44 -0
  612. package/dist/integrations/controls-store.d.ts.map +1 -0
  613. package/dist/integrations/controls-store.js +129 -0
  614. package/dist/integrations/controls-store.js.map +1 -0
  615. package/dist/integrations/index.d.ts +13 -1
  616. package/dist/integrations/index.d.ts.map +1 -1
  617. package/dist/integrations/index.js +9 -0
  618. package/dist/integrations/index.js.map +1 -1
  619. package/dist/integrations/installations-store.d.ts +112 -0
  620. package/dist/integrations/installations-store.d.ts.map +1 -0
  621. package/dist/integrations/installations-store.js +493 -0
  622. package/dist/integrations/installations-store.js.map +1 -0
  623. package/dist/integrations/integration-memory.d.ts +24 -0
  624. package/dist/integrations/integration-memory.d.ts.map +1 -0
  625. package/dist/integrations/integration-memory.js +136 -0
  626. package/dist/integrations/integration-memory.js.map +1 -0
  627. package/dist/integrations/pending-tasks-retry-job.d.ts.map +1 -1
  628. package/dist/integrations/pending-tasks-retry-job.js +6 -5
  629. package/dist/integrations/pending-tasks-retry-job.js.map +1 -1
  630. package/dist/integrations/pending-tasks-store.d.ts +17 -0
  631. package/dist/integrations/pending-tasks-store.d.ts.map +1 -1
  632. package/dist/integrations/pending-tasks-store.js +71 -5
  633. package/dist/integrations/pending-tasks-store.js.map +1 -1
  634. package/dist/integrations/plugin.d.ts.map +1 -1
  635. package/dist/integrations/plugin.js +520 -35
  636. package/dist/integrations/plugin.js.map +1 -1
  637. package/dist/integrations/scope-store.d.ts +65 -0
  638. package/dist/integrations/scope-store.d.ts.map +1 -0
  639. package/dist/integrations/scope-store.js +361 -0
  640. package/dist/integrations/scope-store.js.map +1 -0
  641. package/dist/integrations/slack-manifest.d.ts +66 -0
  642. package/dist/integrations/slack-manifest.d.ts.map +1 -0
  643. package/dist/integrations/slack-manifest.js +70 -0
  644. package/dist/integrations/slack-manifest.js.map +1 -0
  645. package/dist/integrations/slack-oauth.d.ts +99 -0
  646. package/dist/integrations/slack-oauth.d.ts.map +1 -0
  647. package/dist/integrations/slack-oauth.js +226 -0
  648. package/dist/integrations/slack-oauth.js.map +1 -0
  649. package/dist/integrations/types.d.ts +144 -0
  650. package/dist/integrations/types.d.ts.map +1 -1
  651. package/dist/integrations/types.js +16 -1
  652. package/dist/integrations/types.js.map +1 -1
  653. package/dist/integrations/usage-budget-store.d.ts +84 -0
  654. package/dist/integrations/usage-budget-store.d.ts.map +1 -0
  655. package/dist/integrations/usage-budget-store.js +650 -0
  656. package/dist/integrations/usage-budget-store.js.map +1 -0
  657. package/dist/integrations/webhook-handler.d.ts +4 -0
  658. package/dist/integrations/webhook-handler.d.ts.map +1 -1
  659. package/dist/integrations/webhook-handler.js +415 -47
  660. package/dist/integrations/webhook-handler.js.map +1 -1
  661. package/dist/jobs/scheduler.d.ts +6 -0
  662. package/dist/jobs/scheduler.d.ts.map +1 -1
  663. package/dist/jobs/scheduler.js +83 -4
  664. package/dist/jobs/scheduler.js.map +1 -1
  665. package/dist/jobs/tools.d.ts.map +1 -1
  666. package/dist/jobs/tools.js +43 -11
  667. package/dist/jobs/tools.js.map +1 -1
  668. package/dist/provider-api/index.d.ts +4 -4
  669. package/dist/provider-api/index.d.ts.map +1 -1
  670. package/dist/provider-api/index.js +72 -1
  671. package/dist/provider-api/index.js.map +1 -1
  672. package/dist/resources/handlers.d.ts.map +1 -1
  673. package/dist/resources/handlers.js +57 -15
  674. package/dist/resources/handlers.js.map +1 -1
  675. package/dist/resources/script-helpers.d.ts.map +1 -1
  676. package/dist/resources/script-helpers.js +34 -8
  677. package/dist/resources/script-helpers.js.map +1 -1
  678. package/dist/resources/store.d.ts +10 -0
  679. package/dist/resources/store.d.ts.map +1 -1
  680. package/dist/resources/store.js +54 -47
  681. package/dist/resources/store.js.map +1 -1
  682. package/dist/scripts/call-agent.d.ts.map +1 -1
  683. package/dist/scripts/call-agent.js +106 -1
  684. package/dist/scripts/call-agent.js.map +1 -1
  685. package/dist/server/agent-chat-plugin.d.ts +15 -4
  686. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  687. package/dist/server/agent-chat-plugin.js +248 -113
  688. package/dist/server/agent-chat-plugin.js.map +1 -1
  689. package/dist/server/auth.d.ts.map +1 -1
  690. package/dist/server/auth.js +10 -14
  691. package/dist/server/auth.js.map +1 -1
  692. package/dist/server/builder-design-systems.d.ts +3 -1
  693. package/dist/server/builder-design-systems.d.ts.map +1 -1
  694. package/dist/server/builder-design-systems.js +9 -2
  695. package/dist/server/builder-design-systems.js.map +1 -1
  696. package/dist/server/edge.d.ts +1 -1
  697. package/dist/server/edge.d.ts.map +1 -1
  698. package/dist/server/edge.js +1 -1
  699. package/dist/server/edge.js.map +1 -1
  700. package/dist/server/index.d.ts +2 -1
  701. package/dist/server/index.d.ts.map +1 -1
  702. package/dist/server/index.js +2 -1
  703. package/dist/server/index.js.map +1 -1
  704. package/dist/server/request-context.d.ts +18 -0
  705. package/dist/server/request-context.d.ts.map +1 -1
  706. package/dist/server/request-context.js.map +1 -1
  707. package/dist/server/social-og-image.d.ts.map +1 -1
  708. package/dist/server/social-og-image.js +3 -2
  709. package/dist/server/social-og-image.js.map +1 -1
  710. package/dist/server/transcribe-voice.d.ts +1 -1
  711. package/dist/styles/agent-native.css +62 -44
  712. package/dist/templates/default/.agents/skills/capture-learnings/SKILL.md +22 -9
  713. package/dist/templates/default/AGENTS.md +7 -3
  714. package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +1 -1
  715. package/dist/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +22 -9
  716. package/dist/templates/workspace-core/.agents/skills/extension-points/SKILL.md +6 -3
  717. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +25 -0
  718. package/dist/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +15 -0
  719. package/dist/templates/workspace-core/AGENTS.md +3 -2
  720. package/dist/usage/store.d.ts +7 -0
  721. package/dist/usage/store.d.ts.map +1 -1
  722. package/dist/usage/store.js +24 -3
  723. package/dist/usage/store.js.map +1 -1
  724. package/docs/content/automation-connectors.mdx +80 -0
  725. package/docs/content/extensions.mdx +8 -0
  726. package/docs/content/locales/ar-SA/extensions.mdx +8 -0
  727. package/docs/content/locales/ar-SA/messaging.mdx +84 -15
  728. package/docs/content/locales/ar-SA/template-clips.mdx +1 -0
  729. package/docs/content/locales/ar-SA/template-design.mdx +1 -0
  730. package/docs/content/locales/de-DE/extensions.mdx +10 -0
  731. package/docs/content/locales/de-DE/messaging.mdx +92 -15
  732. package/docs/content/locales/de-DE/template-clips.mdx +1 -0
  733. package/docs/content/locales/de-DE/template-design.mdx +1 -0
  734. package/docs/content/locales/es-ES/extensions.mdx +10 -0
  735. package/docs/content/locales/es-ES/messaging.mdx +91 -15
  736. package/docs/content/locales/es-ES/template-clips.mdx +1 -0
  737. package/docs/content/locales/es-ES/template-design.mdx +1 -0
  738. package/docs/content/locales/fr-FR/extensions.mdx +10 -0
  739. package/docs/content/locales/fr-FR/messaging.mdx +91 -15
  740. package/docs/content/locales/fr-FR/template-clips.mdx +1 -0
  741. package/docs/content/locales/fr-FR/template-design.mdx +1 -0
  742. package/docs/content/locales/hi-IN/extensions.mdx +8 -0
  743. package/docs/content/locales/hi-IN/messaging.mdx +81 -15
  744. package/docs/content/locales/hi-IN/template-clips.mdx +1 -0
  745. package/docs/content/locales/hi-IN/template-design.mdx +1 -0
  746. package/docs/content/locales/ja-JP/extensions.mdx +9 -0
  747. package/docs/content/locales/ja-JP/messaging.mdx +81 -15
  748. package/docs/content/locales/ja-JP/template-clips.mdx +1 -0
  749. package/docs/content/locales/ja-JP/template-design.mdx +1 -0
  750. package/docs/content/locales/ko-KR/extensions.mdx +8 -0
  751. package/docs/content/locales/ko-KR/messaging.mdx +80 -15
  752. package/docs/content/locales/ko-KR/template-clips.mdx +1 -0
  753. package/docs/content/locales/ko-KR/template-design.mdx +1 -0
  754. package/docs/content/locales/pt-BR/extensions.mdx +9 -0
  755. package/docs/content/locales/pt-BR/messaging.mdx +88 -15
  756. package/docs/content/locales/pt-BR/template-clips.mdx +1 -0
  757. package/docs/content/locales/pt-BR/template-design.mdx +1 -0
  758. package/docs/content/locales/zh-CN/extensions.mdx +6 -0
  759. package/docs/content/locales/zh-CN/messaging.mdx +78 -15
  760. package/docs/content/locales/zh-CN/template-clips.mdx +1 -0
  761. package/docs/content/locales/zh-CN/template-design.mdx +1 -0
  762. package/docs/content/locales/zh-TW/extensions.mdx +6 -0
  763. package/docs/content/locales/zh-TW/messaging.mdx +78 -15
  764. package/docs/content/locales/zh-TW/template-clips.mdx +1 -0
  765. package/docs/content/locales/zh-TW/template-design.mdx +1 -0
  766. package/docs/content/messaging.mdx +227 -45
  767. package/docs/content/template-clips.mdx +3 -0
  768. package/docs/content/template-design.mdx +4 -0
  769. package/package.json +5 -1
  770. package/src/templates/default/.agents/skills/capture-learnings/SKILL.md +22 -9
  771. package/src/templates/default/AGENTS.md +7 -3
  772. package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +1 -1
  773. package/src/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +22 -9
  774. package/src/templates/workspace-core/.agents/skills/extension-points/SKILL.md +6 -3
  775. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +25 -0
  776. package/src/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +15 -0
  777. package/src/templates/workspace-core/AGENTS.md +3 -2
@@ -55,6 +55,7 @@ import {
55
55
  isMediaConstraintFailure,
56
56
  } from "./lib/media-capture-constraints";
57
57
  import {
58
+ DESKTOP_CAPTURE_PERMISSION_MESSAGE,
58
59
  isHardCapturePermissionError,
59
60
  MACOS_CAPTURE_PERMISSION_MESSAGE,
60
61
  MACOS_SCREEN_PERMISSION_MESSAGE,
@@ -1667,7 +1668,11 @@ export function App() {
1667
1668
  msg.includes("sandbox") ||
1668
1669
  err?.name === "NotAllowedError"
1669
1670
  ) {
1670
- setCameraError(MACOS_CAPTURE_PERMISSION_MESSAGE);
1671
+ setCameraError(
1672
+ isMacPlatform()
1673
+ ? MACOS_CAPTURE_PERMISSION_MESSAGE
1674
+ : DESKTOP_CAPTURE_PERMISSION_MESSAGE,
1675
+ );
1671
1676
  } else if (isMediaConstraintFailure(err)) {
1672
1677
  // Even the default-camera retry inside getCameraStreamWithFallback
1673
1678
  // failed, so no camera is usable right now. Say that plainly
@@ -2237,7 +2242,9 @@ export function App() {
2237
2242
  setRecError(
2238
2243
  isUpdatePendingRestart()
2239
2244
  ? MACOS_UPDATE_RESTART_MESSAGE
2240
- : MACOS_CAPTURE_PERMISSION_MESSAGE,
2245
+ : isMacPlatform()
2246
+ ? MACOS_CAPTURE_PERMISSION_MESSAGE
2247
+ : DESKTOP_CAPTURE_PERMISSION_MESSAGE,
2241
2248
  );
2242
2249
  return;
2243
2250
  }
@@ -2354,10 +2361,11 @@ export function App() {
2354
2361
  };
2355
2362
  track(
2356
2363
  listen("clips:recorder-stop", async () => {
2357
- // Detach the React Start/bubble gate immediately. Native stop already
2358
- // released the camera and cleared Rust `is_recording_active` mid-
2359
- // finalize; keeping `recorder` set through the whole upload made
2360
- // reopen show a blank preview and made Start a silent no-op.
2364
+ // Detach the React Start/bubble gate immediately. The recorder keeps
2365
+ // Rust `is_recording_active` and the finalizing overlay guarded until
2366
+ // its durable backup/finalize boundary; keeping this React handle set
2367
+ // through the whole upload made reopen show a blank preview and made
2368
+ // Start a silent no-op.
2361
2369
  const handle = recorder;
2362
2370
  recordingStopFinalizingRef.current = true;
2363
2371
  bubbleStreamTransferredToRecorder.current = false;
@@ -2723,7 +2731,8 @@ export function App() {
2723
2731
  recError === MACOS_UPDATE_RESTART_MESSAGE ? (
2724
2732
  <UpdateRestartBanner message={recError} />
2725
2733
  ) : recError === MACOS_CAPTURE_PERMISSION_MESSAGE ||
2726
- recError === MACOS_SCREEN_PERMISSION_MESSAGE ? (
2734
+ recError === MACOS_SCREEN_PERMISSION_MESSAGE ||
2735
+ recError === DESKTOP_CAPTURE_PERMISSION_MESSAGE ? (
2727
2736
  <PermissionRecoveryBanner
2728
2737
  kind="recording"
2729
2738
  message={recError}
@@ -2748,7 +2757,8 @@ export function App() {
2748
2757
  )
2749
2758
  ) : null}
2750
2759
  {cameraError && !recError ? (
2751
- cameraError === MACOS_CAPTURE_PERMISSION_MESSAGE ? (
2760
+ cameraError === MACOS_CAPTURE_PERMISSION_MESSAGE ||
2761
+ cameraError === DESKTOP_CAPTURE_PERMISSION_MESSAGE ? (
2752
2762
  <PermissionRecoveryBanner
2753
2763
  kind="camera"
2754
2764
  message={cameraError}
@@ -2839,6 +2849,7 @@ function PermissionRecoveryBanner({
2839
2849
  ? "Camera setup blocked"
2840
2850
  : "Recording setup blocked";
2841
2851
  const uniquePanes = Array.from(new Set(panes));
2852
+ const canOpenPrivacySettings = isMacPlatform() || isWindowsPlatform();
2842
2853
 
2843
2854
  return (
2844
2855
  <div className="error-banner permission-banner">
@@ -2846,16 +2857,18 @@ function PermissionRecoveryBanner({
2846
2857
  <div className="permission-title">{title}</div>
2847
2858
  <div>{message}</div>
2848
2859
  </div>
2849
- <div className="permission-actions" aria-label="Open privacy settings">
2850
- {uniquePanes.map((pane) => (
2851
- <button
2852
- type="button"
2853
- key={pane}
2854
- onClick={() => openPrivacySettings(pane)}
2855
- >
2856
- {permissionPaneLabel(pane)}
2857
- </button>
2858
- ))}
2860
+ <div className="permission-actions" aria-label="Permission recovery">
2861
+ {canOpenPrivacySettings
2862
+ ? uniquePanes.map((pane) => (
2863
+ <button
2864
+ type="button"
2865
+ key={pane}
2866
+ onClick={() => openPrivacySettings(pane)}
2867
+ >
2868
+ {permissionPaneLabel(pane)}
2869
+ </button>
2870
+ ))
2871
+ : null}
2859
2872
  <button type="button" className="permission-retry" onClick={onRetry}>
2860
2873
  Try again
2861
2874
  </button>
@@ -3718,7 +3731,7 @@ function formatStorageBytes(bytes: number): string {
3718
3731
  function desktopUpdateStatusText(status: UpdateStatus): string {
3719
3732
  switch (status.state) {
3720
3733
  case "idle":
3721
- return "Clips checks automatically after launch and every 4 hours.";
3734
+ return "Clips checks automatically after launch, every hour, and when you return.";
3722
3735
  case "checking":
3723
3736
  return "Checking for updates...";
3724
3737
  case "not-available":
@@ -8,7 +8,7 @@ import {
8
8
  import { invoke } from "@tauri-apps/api/core";
9
9
  import { useState, useCallback, useEffect } from "react";
10
10
 
11
- import { isMacPlatform } from "../lib/platform";
11
+ import { isMacPlatform, isWindowsPlatform } from "../lib/platform";
12
12
 
13
13
  type CaptureMode = "screen" | "screen-camera" | "camera";
14
14
  type MacosPrivacyPane =
@@ -56,7 +56,6 @@ function readinessItems({
56
56
  detail: "Needed for screen or window capture.",
57
57
  pane: "screen",
58
58
  active: mode !== "camera",
59
- macosOnly: true,
60
59
  },
61
60
  {
62
61
  label: "Microphone",
@@ -132,6 +131,7 @@ export function ReadinessPanel({
132
131
  onOpenPermission: (pane: MacosPrivacyPane) => void;
133
132
  }) {
134
133
  const mac = isMacPlatform();
134
+ const canOpenPrivacySettings = mac || isWindowsPlatform();
135
135
  const items = readinessItems({
136
136
  mode,
137
137
  cameraOn,
@@ -215,13 +215,19 @@ export function ReadinessPanel({
215
215
  )}
216
216
  </span>
217
217
  ) : null}
218
- <button
219
- type="button"
220
- className="readiness-open-button"
221
- onClick={() => onOpenPermission(item.pane)}
222
- >
223
- Open
224
- </button>
218
+ {canOpenPrivacySettings ? (
219
+ <button
220
+ type="button"
221
+ className="readiness-open-button"
222
+ onClick={() => onOpenPermission(item.pane)}
223
+ >
224
+ Open
225
+ </button>
226
+ ) : (
227
+ <span className="readiness-item-detail">
228
+ System prompt
229
+ </span>
230
+ )}
225
231
  </div>
226
232
  </div>
227
233
  );
@@ -0,0 +1,22 @@
1
+ interface FinalizationGuardOptions<T> {
2
+ ensureBackupDurable: () => Promise<void>;
3
+ attemptFinalize: () => Promise<T>;
4
+ releaseGuard: () => Promise<void> | void;
5
+ }
6
+
7
+ /**
8
+ * Keep the desktop's post-stop guard visible until recovery metadata is
9
+ * durable and the finalize request has settled at least once.
10
+ */
11
+ export async function finalizeAfterDurableBackup<T>({
12
+ ensureBackupDurable,
13
+ attemptFinalize,
14
+ releaseGuard,
15
+ }: FinalizationGuardOptions<T>): Promise<T> {
16
+ try {
17
+ await ensureBackupDurable();
18
+ return await attemptFinalize();
19
+ } finally {
20
+ await releaseGuard();
21
+ }
22
+ }
@@ -1,4 +1,4 @@
1
- // macOS capture/permission messaging shared between the device pickers and the
1
+ // Capture/permission messaging shared between the device pickers and the
2
2
  // recording flow. Centralized so the "is this a hard system block?" heuristic
3
3
  // and the user-facing copy stay in sync wherever a getUserMedia call can fail.
4
4
 
@@ -6,6 +6,8 @@ export const MACOS_CAPTURE_PERMISSION_MESSAGE =
6
6
  "Grant the required macOS permissions below, then try again. If you just changed access, restart Clips before retrying.";
7
7
  export const MACOS_SCREEN_PERMISSION_MESSAGE =
8
8
  "Grant Screen Recording permission in macOS Settings, then restart Clips and try again.";
9
+ export const DESKTOP_CAPTURE_PERMISSION_MESSAGE =
10
+ "Allow the requested screen, camera, or microphone access in your desktop permission prompt, then try again.";
9
11
  export const MACOS_SPEECH_PERMISSION_MESSAGE =
10
12
  "Grant Speech Recognition and Microphone access, then try again. If you just changed access, restart Clips before retrying.";
11
13
  export const MACOS_UPDATE_RESTART_MESSAGE =
@@ -55,6 +55,7 @@ import { waitForReadyRecordingAfterFinalizeError } from "../../../shared/finaliz
55
55
  import type { LocalRecordingMode } from "../shared/config";
56
56
  import { createAudioCue, type AudioCue } from "./audio-cue";
57
57
  import { createCameraCompositeStream } from "./camera-composite";
58
+ import { finalizeAfterDurableBackup } from "./finalization-guard";
58
59
  import {
59
60
  createLocalRecordingFolderName,
60
61
  exportBlobChunksToLocalRecordingFile,
@@ -1661,6 +1662,15 @@ function showFinalizingFeedback() {
1661
1662
  );
1662
1663
  }
1663
1664
 
1665
+ async function releaseFinalizingFeedback() {
1666
+ await invoke("set_recording_state", { active: false }).catch((err) =>
1667
+ console.error("[clips-recorder] clear recording state failed:", err),
1668
+ );
1669
+ await invoke("hide_finalizing").catch((err) =>
1670
+ console.error("[clips-recorder] hide_finalizing failed:", err),
1671
+ );
1672
+ }
1673
+
1664
1674
  async function claimNativeUploadOpen(recordingId: string): Promise<boolean> {
1665
1675
  return invoke<boolean>("native_fullscreen_claim_upload_open", {
1666
1676
  recordingId,
@@ -2203,15 +2213,19 @@ async function startNativeFullscreenRecording(
2203
2213
  },
2204
2214
  );
2205
2215
  uploadPromise.catch(() => {});
2216
+ // The recording row already exists, so open its page as soon as the
2217
+ // native stop command has started. Upload/finalize continues in this
2218
+ // webview while the page polls from `uploading` to `ready`.
2219
+ await openNativeUploadUrl(
2220
+ id,
2221
+ `${params.serverUrl.replace(/\/+$/, "")}${viewUrl}`,
2222
+ );
2206
2223
  try {
2207
2224
  await Promise.race([
2208
2225
  recorderFinalized,
2209
2226
  new Promise<void>((resolve) => window.setTimeout(resolve, 15000)),
2210
2227
  ]);
2211
2228
  unlistenFinalized();
2212
- await invoke("set_recording_state", { active: false }).catch(
2213
- () => {},
2214
- );
2215
2229
 
2216
2230
  const capturedTranscript = await transcriptionCapture
2217
2231
  ?.stop()
@@ -2263,10 +2277,6 @@ async function startNativeFullscreenRecording(
2263
2277
  authToken: params.authToken,
2264
2278
  })
2265
2279
  ) {
2266
- await openNativeUploadUrl(
2267
- id,
2268
- `${params.serverUrl.replace(/\/+$/, "")}${viewUrl}`,
2269
- );
2270
2280
  return { recordingId: id, viewUrl };
2271
2281
  }
2272
2282
  await abortRecordingUpload(
@@ -2274,36 +2284,16 @@ async function startNativeFullscreenRecording(
2274
2284
  id,
2275
2285
  err instanceof Error ? err.message : String(err),
2276
2286
  );
2277
- // Still take the user to the clip status page. If the server
2278
- // marked the upload failed, that page shows the failure state; if
2279
- // the abort request could not land, it keeps polling instead of
2280
- // leaving the user on an empty desktop.
2281
- try {
2282
- await openExternal(
2283
- `${params.serverUrl.replace(
2284
- /\/+$/,
2285
- "",
2286
- )}${viewUrl}?saveFailed=1`,
2287
- );
2288
- } catch (openErr) {
2289
- console.error("[clips-recorder] openExternal failed:", openErr);
2290
- }
2291
2287
  throw err;
2292
2288
  }
2293
2289
 
2294
- await openNativeUploadUrl(
2295
- uploadResult.recordingId,
2296
- `${params.serverUrl.replace(/\/+$/, "")}${viewUrl}`,
2297
- );
2298
2290
  return {
2299
2291
  recordingId: uploadResult.recordingId,
2300
2292
  viewUrl,
2301
2293
  };
2302
2294
  } finally {
2303
2295
  streamCleanups.forEach((cleanup) => cleanup());
2304
- invoke("hide_finalizing").catch((err) =>
2305
- console.error("[clips-recorder] hide_finalizing failed:", err),
2306
- );
2296
+ await releaseFinalizingFeedback();
2307
2297
  }
2308
2298
  })();
2309
2299
  return stopPromise;
@@ -3223,15 +3213,6 @@ async function startRecordingInner(
3223
3213
  }).catch(() => {});
3224
3214
  }
3225
3215
 
3226
- async function openFailedRecordingPage() {
3227
- const viewUrl = `/r/${id}?saveFailed=1`;
3228
- try {
3229
- await openExternal(`${params.serverUrl.replace(/\/+$/, "")}${viewUrl}`);
3230
- } catch (err) {
3231
- console.error("[clips-recorder] openExternal failed:", err);
3232
- }
3233
- }
3234
-
3235
3216
  // 5. Wire toolbar events.
3236
3217
  const toolbarUnlistens = await Promise.all([
3237
3218
  listen("clips:recorder-pause", () => {
@@ -3346,6 +3327,7 @@ async function startRecordingInner(
3346
3327
  // chunk — but NOT the transcript-finalize + thumbnail + upload awaits that
3347
3328
  // follow, which add ~seconds and would overstate the saved duration.
3348
3329
  let stoppedAt = 0;
3330
+ const viewUrl = `/r/${id}`;
3349
3331
  console.log("[clips-recorder] stop requested");
3350
3332
  showFinalizingFeedback();
3351
3333
  if (tickHandle) clearInterval(tickHandle);
@@ -3354,12 +3336,20 @@ async function startRecordingInner(
3354
3336
 
3355
3337
  // Flush the in-flight recorder buffer, then wait for it to fully stop
3356
3338
  // so we get the trailing dataavailable event.
3357
- await new Promise<void>((resolve) => {
3339
+ const recorderStopped = new Promise<void>((resolve) => {
3358
3340
  if (recorder.state === "inactive") {
3341
+ stoppedAt = Date.now();
3359
3342
  resolve();
3360
3343
  return;
3361
3344
  }
3362
- recorder.addEventListener("stop", () => resolve(), { once: true });
3345
+ recorder.addEventListener(
3346
+ "stop",
3347
+ () => {
3348
+ stoppedAt = Date.now();
3349
+ resolve();
3350
+ },
3351
+ { once: true },
3352
+ );
3363
3353
  try {
3364
3354
  if (recorder.state === "paused") {
3365
3355
  recorder.resume();
@@ -3380,10 +3370,18 @@ async function startRecordingInner(
3380
3370
  // ignore
3381
3371
  }
3382
3372
  });
3373
+ // `recorder.stop()` has already been requested, so recorded duration is
3374
+ // fixed even if launching the browser takes a moment. Open the existing
3375
+ // recording row now and let its page poll while upload/finalize continues.
3376
+ try {
3377
+ await openExternal(`${params.serverUrl.replace(/\/+$/, "")}${viewUrl}`);
3378
+ } catch (err) {
3379
+ console.error("[clips-recorder] openExternal failed:", err);
3380
+ }
3381
+ await recorderStopped;
3383
3382
  // Recorder has fully stopped and flushed its trailing chunk — this is the
3384
3383
  // true end of recorded content. Everything after (transcript, thumbnail,
3385
3384
  // upload) is post-processing and must not count toward duration.
3386
- stoppedAt = Date.now();
3387
3385
 
3388
3386
  const thumbnailUploadPromise = captureAndUploadRecordingThumbnail({
3389
3387
  serverUrl: params.serverUrl,
@@ -3497,7 +3495,6 @@ async function startRecordingInner(
3497
3495
  await invoke("hide_recording_chrome").catch((err) =>
3498
3496
  console.error(`[clips-recorder] hide_recording_chrome failed:`, err),
3499
3497
  );
3500
- await invoke("set_recording_state", { active: false }).catch(() => {});
3501
3498
 
3502
3499
  // Wait for any in-flight chunk uploads to settle before sending the
3503
3500
  // final chunk. Otherwise the server could finalize before the last
@@ -3511,19 +3508,19 @@ async function startRecordingInner(
3511
3508
  await Promise.allSettled(pending);
3512
3509
  }
3513
3510
  inflight.clear();
3514
- // Ensure the local backup is fully written before we either delete it
3515
- // (on success) or leave it in place for recovery (on failure).
3516
- await Promise.allSettled([...backupWrites]);
3517
3511
  if (failed) {
3518
- console.error("[clips-recorder] chunk upload failed:", failed);
3519
- await markBrowserRecordingBackupError(id, failed.message).catch(
3520
- () => {},
3521
- );
3522
- await abortRecordingUpload(params.serverUrl, id, failed.message);
3523
- invoke("hide_finalizing").catch((err) =>
3524
- console.error("[clips-recorder] hide_finalizing failed:", err),
3525
- );
3526
- await openFailedRecordingPage();
3512
+ try {
3513
+ // Keep the guard until the final metadata and every trailing chunk
3514
+ // backup are durable, even though this upload cannot be finalized.
3515
+ await Promise.allSettled([...backupWrites]);
3516
+ console.error("[clips-recorder] chunk upload failed:", failed);
3517
+ await markBrowserRecordingBackupError(id, failed.message).catch(
3518
+ () => {},
3519
+ );
3520
+ await abortRecordingUpload(params.serverUrl, id, failed.message);
3521
+ } finally {
3522
+ await releaseFinalizingFeedback();
3523
+ }
3527
3524
  throw failed;
3528
3525
  }
3529
3526
 
@@ -3553,78 +3550,58 @@ async function startRecordingInner(
3553
3550
  uploadMode,
3554
3551
  anyFailed: !!failed,
3555
3552
  });
3556
- try {
3557
- const finalRes = await fetch(finalizeUrl, {
3558
- method: "POST",
3559
- headers: { "Content-Type": "application/octet-stream" },
3560
- credentials: "include",
3561
- body: finalBody,
3562
- signal: AbortSignal.timeout(FINALIZE_UPLOAD_TIMEOUT_MS),
3563
- });
3564
- const bodyText = await finalRes.text().catch(() => "");
3565
- console.log(
3566
- "[clips-recorder] finalize response:",
3567
- finalRes.status,
3568
- bodyText.slice(0, 500),
3569
- );
3570
- if (!finalRes.ok) {
3571
- throw new Error(
3572
- `Finalize failed (${finalRes.status}): ${bodyText.slice(0, 200)}`,
3573
- );
3574
- }
3575
- } catch (err) {
3576
- console.error("[clips-recorder] finalize fetch failed:", err);
3577
- const error = err instanceof Error ? err : new Error(String(err));
3578
- if (
3579
- await recoverReadyRecordingAfterFinalizeError({
3580
- serverUrl: params.serverUrl,
3581
- recordingId: id,
3582
- authToken: params.authToken,
3583
- })
3584
- ) {
3585
- const viewUrl = `/r/${id}`;
3553
+ return finalizeAfterDurableBackup({
3554
+ // Opening the browser must not make the desktop look idle until every
3555
+ // trailing backup write and the final metadata are durable.
3556
+ ensureBackupDurable: async () => {
3557
+ await Promise.allSettled([...backupWrites]);
3558
+ },
3559
+ attemptFinalize: async () => {
3586
3560
  try {
3587
- await openExternal(
3588
- `${params.serverUrl.replace(/\/+$/, "")}${viewUrl}`,
3561
+ const finalRes = await fetch(finalizeUrl, {
3562
+ method: "POST",
3563
+ headers: { "Content-Type": "application/octet-stream" },
3564
+ credentials: "include",
3565
+ body: finalBody,
3566
+ signal: AbortSignal.timeout(FINALIZE_UPLOAD_TIMEOUT_MS),
3567
+ });
3568
+ const bodyText = await finalRes.text().catch(() => "");
3569
+ console.log(
3570
+ "[clips-recorder] finalize response:",
3571
+ finalRes.status,
3572
+ bodyText.slice(0, 500),
3573
+ );
3574
+ if (!finalRes.ok) {
3575
+ throw new Error(
3576
+ `Finalize failed (${finalRes.status}): ${bodyText.slice(0, 200)}`,
3577
+ );
3578
+ }
3579
+ } catch (err) {
3580
+ console.error("[clips-recorder] finalize fetch failed:", err);
3581
+ const error = err instanceof Error ? err : new Error(String(err));
3582
+ if (
3583
+ await recoverReadyRecordingAfterFinalizeError({
3584
+ serverUrl: params.serverUrl,
3585
+ recordingId: id,
3586
+ authToken: params.authToken,
3587
+ })
3588
+ ) {
3589
+ return { recordingId: id, viewUrl };
3590
+ }
3591
+ await markBrowserRecordingBackupError(id, error.message).catch(
3592
+ () => {},
3589
3593
  );
3590
- } catch (openErr) {
3591
- console.error("[clips-recorder] openExternal failed:", openErr);
3594
+ await abortRecordingUpload(params.serverUrl, id, error.message);
3595
+ throw error;
3592
3596
  }
3593
- invoke("hide_finalizing").catch((hideErr) =>
3594
- console.error("[clips-recorder] hide_finalizing failed:", hideErr),
3595
- );
3597
+ await deleteBrowserRecordingBackup(id).catch((err) => {
3598
+ console.warn("[clips-recorder] local backup cleanup failed:", err);
3599
+ });
3600
+
3596
3601
  return { recordingId: id, viewUrl };
3597
- }
3598
- await markBrowserRecordingBackupError(id, error.message).catch(
3599
- () => {},
3600
- );
3601
- await abortRecordingUpload(params.serverUrl, id, error.message);
3602
- invoke("hide_finalizing").catch((hideErr) =>
3603
- console.error("[clips-recorder] hide_finalizing failed:", hideErr),
3604
- );
3605
- await openFailedRecordingPage();
3606
- throw error;
3607
- }
3608
- await deleteBrowserRecordingBackup(id).catch((err) => {
3609
- console.warn("[clips-recorder] local backup cleanup failed:", err);
3602
+ },
3603
+ releaseGuard: releaseFinalizingFeedback,
3610
3604
  });
3611
-
3612
- // Finalize done (or tried and failed — the player page shows a clear
3613
- // error state in either case). Open the browser to the playback URL
3614
- // and THEN close the finalizing spinner. Closing before the browser
3615
- // opens would leave the user staring at an empty desktop for the
3616
- // brief moment while the OS launches / focuses the default browser.
3617
- const viewUrl = `/r/${id}`;
3618
- try {
3619
- await openExternal(`${params.serverUrl.replace(/\/+$/, "")}${viewUrl}`);
3620
- } catch (err) {
3621
- console.error("[clips-recorder] openExternal failed:", err);
3622
- }
3623
- invoke("hide_finalizing").catch((err) =>
3624
- console.error("[clips-recorder] hide_finalizing failed:", err),
3625
- );
3626
-
3627
- return { recordingId: id, viewUrl };
3628
3605
  },
3629
3606
 
3630
3607
  async cancel() {
@@ -27,6 +27,10 @@ let pendingUpdate: Update | null = null;
27
27
  const listeners = new Set<StatusListener>();
28
28
  let started = false;
29
29
  let checkInFlight: Promise<void> | null = null;
30
+ let lastCheckStartedAt = 0;
31
+
32
+ const UPDATE_CHECK_INTERVAL_MS = 60 * 60 * 1000;
33
+ const UPDATE_FOCUS_CHECK_MIN_INTERVAL_MS = 15 * 60 * 1000;
30
34
 
31
35
  function canRunUpdateChecks() {
32
36
  // Dev and local release builds are for testing the current checkout. Do not
@@ -40,8 +44,10 @@ function setStatus(next: UpdateStatus) {
40
44
  }
41
45
 
42
46
  async function runCheck() {
47
+ if (cachedStatus.state === "downloaded") return;
43
48
  if (checkInFlight) return checkInFlight;
44
49
 
50
+ lastCheckStartedAt = Date.now();
45
51
  checkInFlight = (async () => {
46
52
  try {
47
53
  setStatus({ state: "checking" });
@@ -90,14 +96,30 @@ async function runCheck() {
90
96
  return checkInFlight;
91
97
  }
92
98
 
99
+ function maybeCheckForUpdate() {
100
+ if (!canRunUpdateChecks()) return;
101
+ if (cachedStatus.state === "downloaded") return;
102
+ if (
103
+ checkInFlight ||
104
+ Date.now() - lastCheckStartedAt < UPDATE_FOCUS_CHECK_MIN_INTERVAL_MS
105
+ ) {
106
+ return;
107
+ }
108
+ void runCheck();
109
+ }
110
+
93
111
  function startUpdateLoop() {
94
112
  if (started) return;
95
113
  started = true;
96
114
  if (!canRunUpdateChecks()) return;
97
- // Check 3s after launch (let the popover finish first paint), then every
98
- // 4 hours. Matches the cadence used by the Electron app.
99
- setTimeout(runCheck, 3000);
100
- setInterval(runCheck, 4 * 60 * 60 * 1000);
115
+ // Check 3s after launch (let the popover finish first paint), hourly while
116
+ // Clips stays open, and when the user returns after at least 15 minutes.
117
+ setTimeout(() => void runCheck(), 3000);
118
+ setInterval(() => void runCheck(), UPDATE_CHECK_INTERVAL_MS);
119
+ window.addEventListener("focus", maybeCheckForUpdate);
120
+ document.addEventListener("visibilitychange", () => {
121
+ if (document.visibilityState === "visible") maybeCheckForUpdate();
122
+ });
101
123
  }
102
124
 
103
125
  export function useUpdateStatus(): UpdateStatus {
@@ -25,17 +25,13 @@ type NativeUploadFinished = {
25
25
 
26
26
  /**
27
27
  * Full-screen transparent feedback overlay. Rendered the moment the user
28
- * clicks Stop on the recording toolbar and kept visible until the browser
29
- * opens at `/r/:id`. This fills the gap between `hide_recording_chrome`
30
- * tearing down the toolbar + bubble and `openExternal` actually opening
31
- * the browser — a gap that can stretch for several seconds while
32
- * MediaRecorder flushes trailing chunks and the server finalize POST
33
- * completes.
28
+ * clicks Stop on the recording toolbar and kept visible while the desktop
29
+ * finishes its durable backup and first upload/finalize attempt. The browser
30
+ * can open `/r/:id` earlier so the page shows live progress.
34
31
  *
35
32
  * The window ignores cursor events on the Rust side, so the compact
36
33
  * bottom-left card does not block the user's screen while compression or
37
- * upload continues. The recorder.ts stop path invokes `hide_finalizing`
38
- * right after `openExternal` to close this window.
34
+ * upload runs.
39
35
  */
40
36
  export function Finalizing() {
41
37
  const [progress, setProgress] = useState<ProcessingProgress>({
@@ -1,7 +1,7 @@
1
1
  [package]
2
2
  name = "clips-tray"
3
3
  version = "0.1.1"
4
- description = "Clips — menu-bar tray app (Tauri 2)"
4
+ description = "Clips — cross-platform tray app (Tauri 2)"
5
5
  authors = ["Clips"]
6
6
  license = "MIT"
7
7
  edition = "2021"
@@ -498,8 +498,8 @@ pub async fn show_finalizing(app: AppHandle) -> Result<(), String> {
498
498
  Ok(())
499
499
  }
500
500
 
501
- /// Close the finalizing spinner overlay. Called from the recorder stop path
502
- /// right after `openExternal` opens the browser to the recording URL.
501
+ /// Close the finalizing spinner overlay after the recorder's durable
502
+ /// backup/upload boundary settles.
503
503
  #[tauri::command]
504
504
  pub async fn hide_finalizing(app: AppHandle) -> Result<(), String> {
505
505
  if let Some(w) = app.get_webview_window(FINALIZING_LABEL) {
@@ -19,14 +19,18 @@ pub fn check_permission_statuses() -> PermissionStatuses {
19
19
  }
20
20
  #[cfg(not(target_os = "macos"))]
21
21
  {
22
- // TODO: implement
22
+ // Windows and Linux permissions are granted through the WebView and,
23
+ // on Linux, the XDG desktop portal. There is no reliable synchronous
24
+ // preflight equivalent to macOS TCC here, so report unavailable rather
25
+ // than claiming permissions were granted. The non-macOS UI relies on
26
+ // the actual media prompt and does not render these values.
23
27
  PermissionStatuses {
24
- screen: true,
25
- camera: true,
26
- microphone: true,
27
- speech: true,
28
- accessibility: true,
29
- input_monitoring: true,
28
+ screen: false,
29
+ camera: false,
30
+ microphone: false,
31
+ speech: false,
32
+ accessibility: false,
33
+ input_monitoring: false,
30
34
  }
31
35
  }
32
36
  }