@agent-native/core 0.121.2 → 0.122.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (588) hide show
  1. package/README.md +4 -12
  2. package/corpus/README.md +2 -2
  3. package/corpus/core/CHANGELOG.md +148 -0
  4. package/corpus/core/docs/content/actions.mdx +2 -2
  5. package/corpus/core/docs/content/agent-surfaces.mdx +1 -1
  6. package/corpus/core/docs/content/authentication.mdx +2 -0
  7. package/corpus/core/docs/content/deployment.mdx +36 -0
  8. package/corpus/core/docs/content/http-api.mdx +266 -0
  9. package/corpus/core/docs/content/syncing-template-changes.mdx +159 -0
  10. package/corpus/core/package.json +2 -1
  11. package/corpus/core/src/a2a/activity.ts +38 -27
  12. package/corpus/core/src/a2a/client.ts +57 -4
  13. package/corpus/core/src/agent/engine/builder-engine.ts +35 -4
  14. package/corpus/core/src/agent/run-manager.ts +20 -1
  15. package/corpus/core/src/agent/run-store.ts +4 -1
  16. package/corpus/core/src/agent/types.ts +28 -8
  17. package/corpus/core/src/chat-threads/store.ts +45 -0
  18. package/corpus/core/src/checkpoints/index.ts +2 -0
  19. package/corpus/core/src/checkpoints/route-match.ts +13 -0
  20. package/corpus/core/src/cli/create.ts +105 -17
  21. package/corpus/core/src/cli/index.ts +20 -0
  22. package/corpus/core/src/cli/template-baseline.ts +410 -0
  23. package/corpus/core/src/cli/template-sync.ts +1004 -0
  24. package/corpus/core/src/cli/templates-meta.ts +1 -0
  25. package/corpus/core/src/client/AssistantChat.tsx +38 -12
  26. package/corpus/core/src/client/NewWorkspaceAppFlow.tsx +75 -10
  27. package/corpus/core/src/client/chat/message-components.tsx +127 -66
  28. package/corpus/core/src/client/chat/tool-call-display.tsx +29 -5
  29. package/corpus/core/src/client/error-format.ts +18 -0
  30. package/corpus/core/src/client/org/OrgSwitcher.tsx +30 -8
  31. package/corpus/core/src/client/org/TeamPage.tsx +7 -6
  32. package/corpus/core/src/client/settings/SettingsPanel.tsx +9 -9
  33. package/corpus/core/src/client/settings/SettingsTabsPage.tsx +12 -2
  34. package/corpus/core/src/client/sse-event-processor.ts +3 -0
  35. package/corpus/core/src/data-widgets/index.ts +41 -0
  36. package/corpus/core/src/deploy/build.ts +11 -9
  37. package/corpus/core/src/extensions/url-safety.ts +67 -4
  38. package/corpus/core/src/integrations/webhook-handler.ts +63 -9
  39. package/corpus/core/src/org/auto-join-domain.ts +4 -3
  40. package/corpus/core/src/org/context.ts +108 -39
  41. package/corpus/core/src/org/index.ts +5 -0
  42. package/corpus/core/src/org/service-identity.ts +60 -0
  43. package/corpus/core/src/provider-api/index.ts +22 -1
  44. package/corpus/core/src/scripts/docs/search.ts +12 -1
  45. package/corpus/core/src/server/agent-chat/context-tools.ts +9 -4
  46. package/corpus/core/src/server/agent-chat/framework-prompts.ts +38 -66
  47. package/corpus/core/src/server/agent-chat-plugin.ts +17 -10
  48. package/corpus/core/src/server/agents-bundle.ts +84 -5
  49. package/corpus/core/src/server/auth.ts +4 -3
  50. package/corpus/core/src/server/builder-browser.ts +47 -19
  51. package/corpus/core/src/server/core-routes-plugin.ts +2 -2
  52. package/corpus/core/src/server/credential-provider.ts +209 -68
  53. package/corpus/core/src/server/index.ts +3 -0
  54. package/corpus/core/src/server/prompts/framework-core-compact.ts +6 -13
  55. package/corpus/core/src/server/prompts/framework-core.ts +9 -21
  56. package/corpus/core/src/server/prompts/index.ts +0 -1
  57. package/corpus/core/src/server/prompts/shared-rules.ts +19 -11
  58. package/corpus/core/src/server/ssr-handler.ts +13 -2
  59. package/corpus/core/src/settings/user-settings.ts +13 -1
  60. package/corpus/core/src/shared/cache-control.ts +141 -0
  61. package/corpus/core/src/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  62. package/corpus/core/src/templates/chat/_gitignore +1 -0
  63. package/corpus/core/src/templates/chat/app/components/layout/Sidebar.tsx +0 -7
  64. package/corpus/core/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  65. package/corpus/core/src/templates/default/app/root.tsx +1 -1
  66. package/corpus/core/src/templates/default/public/manifest.json +2 -2
  67. package/corpus/core/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  68. package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +19 -0
  69. package/corpus/core/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  70. package/corpus/core/src/templates/workspace-core/.agents/skills/visual-answer/SKILL.md +1 -0
  71. package/corpus/core/src/vite/agents-bundle-plugin.ts +7 -6
  72. package/corpus/core/src/vite/client.ts +69 -3
  73. package/corpus/templates/analytics/.agents/skills/adhoc-analysis/SKILL.md +4 -5
  74. package/corpus/templates/analytics/.agents/skills/admin-surfaces/SKILL.md +55 -0
  75. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +10 -0
  76. package/corpus/templates/analytics/.agents/skills/dashboard-management/references/template-catalog-and-demo.md +62 -0
  77. package/corpus/templates/analytics/.agents/skills/dashboard-ops/SKILL.md +85 -0
  78. package/corpus/templates/analytics/.agents/skills/data-querying/SKILL.md +27 -2
  79. package/corpus/templates/analytics/.agents/skills/data-querying/references/inline-chart-embeds.md +139 -0
  80. package/corpus/templates/analytics/.agents/skills/monitoring/SKILL.md +77 -0
  81. package/corpus/templates/analytics/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  82. package/corpus/templates/analytics/AGENTS.md +91 -563
  83. package/corpus/templates/analytics/_gitignore +1 -0
  84. package/corpus/templates/analytics/actions/bigquery.ts +12 -4
  85. package/corpus/templates/analytics/actions/generate-chart.ts +5 -5
  86. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +30 -1
  87. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +1 -23
  88. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +3 -0
  89. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +1 -1
  90. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +1 -0
  91. package/corpus/templates/analytics/app/routes/_index.tsx +1 -1
  92. package/corpus/templates/analytics/changelog/2026-07-24-analytics-finds-saved-dashboards-and-queries-far-more-reliab.md +6 -0
  93. package/corpus/templates/analytics/changelog/2026-07-24-notion-access-errors-now-explain-that-a-page-needs-sharing-w.md +6 -0
  94. package/corpus/templates/analytics/changelog/2026-07-25-app-branding-now-uses-the-product-name-without-the-agent-nat.md +6 -0
  95. package/corpus/templates/analytics/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
  96. package/corpus/templates/analytics/package.json +1 -1
  97. package/corpus/templates/analytics/public/manifest.json +1 -1
  98. package/corpus/templates/analytics/server/lib/agent-chat-plan-mode.ts +7 -0
  99. package/corpus/templates/analytics/server/lib/analytics-query-catalog.ts +191 -30
  100. package/corpus/templates/analytics/server/lib/bigquery.ts +11 -1
  101. package/corpus/templates/analytics/server/lib/notion.ts +15 -4
  102. package/corpus/templates/analytics/server/plugins/agent-chat.ts +10 -0
  103. package/corpus/templates/analytics/server/plugins/auth.ts +1 -1
  104. package/corpus/templates/assets/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  105. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +0 -2
  106. package/corpus/templates/assets/app/routes/_index.tsx +1 -1
  107. package/corpus/templates/assets/changelog/2026-07-25-app-branding-now-uses-the-product-name-without-the-agent-nat.md +6 -0
  108. package/corpus/templates/assets/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
  109. package/corpus/templates/assets/server/plugins/auth.ts +1 -1
  110. package/corpus/templates/brain/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  111. package/corpus/templates/brain/_gitignore +1 -0
  112. package/corpus/templates/brain/app/lib/brain.ts +0 -7
  113. package/corpus/templates/brain/app/routes/_index.tsx +1 -2
  114. package/corpus/templates/brain/changelog/2026-07-25-app-branding-now-uses-the-product-name-without-the-agent-nat.md +6 -0
  115. package/corpus/templates/brain/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
  116. package/corpus/templates/brain/package.json +1 -1
  117. package/corpus/templates/brain/public/manifest.json +1 -1
  118. package/corpus/templates/brain/server/plugins/auth.ts +1 -1
  119. package/corpus/templates/calendar/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  120. package/corpus/templates/calendar/_gitignore +1 -0
  121. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +0 -6
  122. package/corpus/templates/calendar/app/routes/_app._index.tsx +1 -1
  123. package/corpus/templates/calendar/changelog/2026-07-25-app-branding-now-uses-the-product-name-without-the-agent-nat.md +6 -0
  124. package/corpus/templates/calendar/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
  125. package/corpus/templates/calendar/package.json +1 -1
  126. package/corpus/templates/calendar/public/manifest.json +1 -1
  127. package/corpus/templates/calendar/server/plugins/auth.ts +1 -1
  128. package/corpus/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  129. package/corpus/templates/chat/_gitignore +1 -0
  130. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +0 -7
  131. package/corpus/templates/chat/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
  132. package/corpus/templates/clips/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  133. package/corpus/templates/clips/.agents/skills/video-sharing/SKILL.md +34 -0
  134. package/corpus/templates/clips/AGENTS.md +5 -4
  135. package/corpus/templates/clips/_gitignore +1 -0
  136. package/corpus/templates/clips/actions/cleanup-transcript.ts +5 -0
  137. package/corpus/templates/clips/actions/get-recording-insights.ts +44 -8
  138. package/corpus/templates/clips/actions/get-recording-player-data.ts +39 -70
  139. package/corpus/templates/clips/actions/import-loom-recording.ts +53 -98
  140. package/corpus/templates/clips/actions/lib/loom-import-job.ts +260 -0
  141. package/corpus/templates/clips/actions/list-clip-views.ts +2 -4
  142. package/corpus/templates/clips/actions/list-recordings.ts +69 -19
  143. package/corpus/templates/clips/actions/list-viewers.ts +5 -2
  144. package/corpus/templates/clips/actions/regenerate-summary.ts +5 -1
  145. package/corpus/templates/clips/actions/request-transcript.ts +28 -1
  146. package/corpus/templates/clips/app/components/editor/stitch-manager.tsx +21 -1
  147. package/corpus/templates/clips/app/components/library/library-layout.tsx +0 -7
  148. package/corpus/templates/clips/app/components/meetings/quick-ask-sidebar.tsx +14 -1
  149. package/corpus/templates/clips/app/components/player/insights-panel.tsx +8 -20
  150. package/corpus/templates/clips/app/components/player/recording-views-badge.tsx +335 -0
  151. package/corpus/templates/clips/app/components/player/video-player.tsx +13 -8
  152. package/corpus/templates/clips/app/components/sharing/share-ui.tsx +2 -1
  153. package/corpus/templates/clips/app/i18n/en-US.ts +13 -2
  154. package/corpus/templates/clips/app/lib/capture-permissions.ts +110 -0
  155. package/corpus/templates/clips/app/lib/recording-link.ts +32 -0
  156. package/corpus/templates/clips/app/routes/_app.library._index.tsx +1 -1
  157. package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +27 -0
  158. package/corpus/templates/clips/app/routes/_index.tsx +1 -1
  159. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +52 -15
  160. package/corpus/templates/clips/app/routes/record.tsx +82 -31
  161. package/corpus/templates/clips/app/routes/share.$shareId.tsx +42 -31
  162. package/corpus/templates/clips/changelog/2026-07-24-clip-pages-now-show-a-view-count-with-viewer-avatars-next-to.md +6 -0
  163. package/corpus/templates/clips/changelog/2026-07-24-clip-summaries-read-like-a-description-you-d-write-yourself-.md +6 -0
  164. package/corpus/templates/clips/changelog/2026-07-24-clip-view-counts-now-separate-human-views-from-agent-views-s.md +6 -0
  165. package/corpus/templates/clips/changelog/2026-07-24-clips-actions-can-now-be-called-by-org-service-tokens-so-ext.md +6 -0
  166. package/corpus/templates/clips/changelog/2026-07-24-clips-no-longer-briefly-shows-a-dock-icon-while-launching.md +6 -0
  167. package/corpus/templates/clips/changelog/2026-07-24-fixed-owner-and-editor-share-links-redirecting-to-the-record.md +6 -0
  168. package/corpus/templates/clips/changelog/2026-07-24-meeting-and-note-recordings-now-start-as-a-compact-pill-on-t.md +6 -0
  169. package/corpus/templates/clips/changelog/2026-07-24-new-clips-now-copy-a-shareable-link-instead-of-the-owner-onl.md +6 -0
  170. package/corpus/templates/clips/changelog/2026-07-24-opening-a-share-link-as-the-clip-s-owner-now-goes-straight-t.md +6 -0
  171. package/corpus/templates/clips/changelog/2026-07-24-permissions-and-rewind-controls-now-use-compact-consistent-h.md +6 -0
  172. package/corpus/templates/clips/changelog/2026-07-24-quitting-the-desktop-app-no-longer-shows-a-false-macos-crash.md +6 -0
  173. package/corpus/templates/clips/changelog/2026-07-24-screen-recording-permission-errors-now-name-the-exact-app-to.md +6 -0
  174. package/corpus/templates/clips/changelog/2026-07-24-the-desktop-app-now-copies-a-new-clip-s-share-link-to-your-c.md +6 -0
  175. package/corpus/templates/clips/changelog/2026-07-24-the-recording-toolbar-now-stays-above-other-apps-including-o.md +6 -0
  176. package/corpus/templates/clips/changelog/2026-07-24-transcript-captions-now-use-real-speech-timings-instead-of-a.md +6 -0
  177. package/corpus/templates/clips/changelog/2026-07-24-video-playback-no-longer-stutters-and-replays-the-last-momen.md +6 -0
  178. package/corpus/templates/clips/changelog/2026-07-25-app-branding-now-uses-the-product-name-without-the-agent-nat.md +6 -0
  179. package/corpus/templates/clips/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
  180. package/corpus/templates/clips/chrome-extension/src/background.ts +17 -1
  181. package/corpus/templates/clips/desktop/package.json +2 -0
  182. package/corpus/templates/clips/desktop/src/app.tsx +89 -0
  183. package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +9 -3
  184. package/corpus/templates/clips/desktop/src/lib/audio-meter.ts +51 -0
  185. package/corpus/templates/clips/desktop/src/lib/native-notification.ts +44 -0
  186. package/corpus/templates/clips/desktop/src/lib/recording-link.ts +67 -0
  187. package/corpus/templates/clips/desktop/src/overlays/live-audio-bars.tsx +35 -35
  188. package/corpus/templates/clips/desktop/src/overlays/live-transcript.tsx +3 -2
  189. package/corpus/templates/clips/desktop/src/overlays/recording-pill.tsx +47 -46
  190. package/corpus/templates/clips/desktop/src/styles.css +127 -78
  191. package/corpus/templates/clips/desktop/src-tauri/Cargo.toml +7 -0
  192. package/corpus/templates/clips/desktop/src-tauri/Info.plist +6 -0
  193. package/corpus/templates/clips/desktop/src-tauri/capabilities/default.json +1 -0
  194. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +7 -3
  195. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +4 -1
  196. package/corpus/templates/clips/desktop/src-tauri/src/main.rs +8 -0
  197. package/corpus/templates/clips/desktop/src-tauri/src/recording_indicator.rs +21 -10
  198. package/corpus/templates/clips/desktop/src-tauri/src/util.rs +40 -0
  199. package/corpus/templates/clips/server/db/schema.ts +27 -0
  200. package/corpus/templates/clips/server/lib/agent-views.ts +145 -0
  201. package/corpus/templates/clips/server/lib/post-finalize-dispatch.ts +2 -1
  202. package/corpus/templates/clips/server/lib/public-agent-context.ts +7 -0
  203. package/corpus/templates/clips/server/lib/recording-share-grant.ts +79 -0
  204. package/corpus/templates/clips/server/lib/recordings.ts +51 -3
  205. package/corpus/templates/clips/server/plugins/auth.ts +1 -1
  206. package/corpus/templates/clips/server/plugins/db.ts +31 -0
  207. package/corpus/templates/clips/server/routes/api/_agent-native-background/post-finalize-worker.post.ts +56 -3
  208. package/corpus/templates/clips/server/routes/api/public-recording.get.ts +49 -17
  209. package/corpus/templates/clips/shared/recording-link.ts +43 -0
  210. package/corpus/templates/clips/shared/share-attribution.ts +4 -0
  211. package/corpus/templates/clips/shared/share-dashboard-redirect.ts +42 -0
  212. package/corpus/templates/clips/shared/view-analytics.ts +26 -0
  213. package/corpus/templates/content/.agents/skills/content/SKILL.md +5 -0
  214. package/corpus/templates/content/.agents/skills/content/references/local-file-mode.md +135 -0
  215. package/corpus/templates/content/.agents/skills/document-editing/SKILL.md +12 -0
  216. package/corpus/templates/content/.agents/skills/document-editing/references/databases.md +238 -0
  217. package/corpus/templates/content/.agents/skills/document-editing/references/document-behavior.md +91 -0
  218. package/corpus/templates/content/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  219. package/corpus/templates/content/AGENTS.md +62 -583
  220. package/corpus/templates/content/_gitignore +1 -0
  221. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +1 -39
  222. package/corpus/templates/content/app/routes/_app._index.tsx +1 -2
  223. package/corpus/templates/content/changelog/2026-07-25-app-branding-now-uses-the-product-name-without-the-agent-nat.md +6 -0
  224. package/corpus/templates/content/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
  225. package/corpus/templates/content/package.json +1 -1
  226. package/corpus/templates/content/public/manifest.json +1 -1
  227. package/corpus/templates/content/server/plugins/auth.ts +1 -1
  228. package/corpus/templates/design/.agents/skills/creative-context/SKILL.md +11 -0
  229. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +50 -8
  230. package/corpus/templates/design/.agents/skills/design-generation/references/code-layers.md +81 -0
  231. package/corpus/templates/design/.agents/skills/design-generation/references/code-workspace.md +42 -0
  232. package/corpus/templates/design/.agents/skills/design-generation/references/editor-extensions.md +34 -0
  233. package/corpus/templates/design/.agents/skills/responsive-breakpoints/SKILL.md +4 -1
  234. package/corpus/templates/design/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  235. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +17 -0
  236. package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +8196 -0
  237. package/corpus/templates/design/.generated/bridge/embedded-wheel.generated.ts +265 -0
  238. package/corpus/templates/design/.generated/bridge/hit-test.generated.ts +642 -0
  239. package/corpus/templates/design/.generated/bridge/motion-preview.generated.ts +571 -0
  240. package/corpus/templates/design/.generated/bridge/nav.generated.ts +91 -0
  241. package/corpus/templates/design/.generated/bridge/sample.generated.ts +23 -0
  242. package/corpus/templates/design/.generated/bridge/shader-fill-preview.generated.ts +263 -0
  243. package/corpus/templates/design/.generated/bridge/shader-runtime.generated.ts +518 -0
  244. package/corpus/templates/design/.generated/bridge/tweak.generated.ts +20 -0
  245. package/corpus/templates/design/.generated/bridge/zoom.generated.ts +32 -0
  246. package/corpus/templates/design/AGENTS.md +88 -503
  247. package/corpus/templates/design/_gitignore +1 -0
  248. package/corpus/templates/design/app/components/layout/Sidebar.tsx +0 -2
  249. package/corpus/templates/design/app/routes/_index.tsx +1 -1
  250. package/corpus/templates/design/changelog/2026-07-25-app-branding-now-uses-the-product-name-without-the-agent-nat.md +6 -0
  251. package/corpus/templates/design/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
  252. package/corpus/templates/design/server/plugins/auth.ts +1 -1
  253. package/corpus/templates/dispatch/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  254. package/corpus/templates/dispatch/_gitignore +1 -0
  255. package/corpus/templates/dispatch/app/dispatch-extensions.tsx +1 -10
  256. package/corpus/templates/dispatch/app/routes/overview.tsx +1 -1
  257. package/corpus/templates/dispatch/changelog/2026-07-24-signing-in-now-puts-you-in-your-companys-workspace.md +6 -0
  258. package/corpus/templates/dispatch/changelog/2026-07-25-app-branding-now-uses-the-product-name-without-the-agent-nat.md +6 -0
  259. package/corpus/templates/dispatch/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
  260. package/corpus/templates/dispatch/package.json +1 -1
  261. package/corpus/templates/dispatch/public/manifest.json +1 -1
  262. package/corpus/templates/forms/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  263. package/corpus/templates/forms/_gitignore +1 -0
  264. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +0 -35
  265. package/corpus/templates/forms/changelog/2026-07-25-app-branding-now-uses-the-product-name-without-the-agent-nat.md +6 -0
  266. package/corpus/templates/forms/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
  267. package/corpus/templates/forms/package.json +1 -1
  268. package/corpus/templates/forms/public/manifest.json +1 -1
  269. package/corpus/templates/forms/server/lib/public-form-ssr.ts +2 -2
  270. package/corpus/templates/forms/server/plugins/auth.ts +1 -1
  271. package/corpus/templates/macros/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  272. package/corpus/templates/macros/_gitignore +1 -0
  273. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +0 -2
  274. package/corpus/templates/macros/changelog/2026-07-25-app-branding-now-uses-the-product-name-without-the-agent-nat.md +6 -0
  275. package/corpus/templates/macros/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
  276. package/corpus/templates/macros/package.json +1 -1
  277. package/corpus/templates/macros/server/plugins/auth.ts +2 -2
  278. package/corpus/templates/mail/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  279. package/corpus/templates/mail/_gitignore +1 -0
  280. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +0 -39
  281. package/corpus/templates/mail/app/routes/$view.$threadId.tsx +1 -1
  282. package/corpus/templates/mail/app/routes/$view.tsx +1 -1
  283. package/corpus/templates/mail/app/routes/_index.tsx +1 -1
  284. package/corpus/templates/mail/changelog/2026-07-25-app-branding-now-uses-the-product-name-without-the-agent-nat.md +6 -0
  285. package/corpus/templates/mail/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
  286. package/corpus/templates/mail/package.json +1 -1
  287. package/corpus/templates/mail/public/manifest.json +1 -1
  288. package/corpus/templates/mail/server/plugins/auth.ts +1 -1
  289. package/corpus/templates/plan/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  290. package/corpus/templates/plan/_gitignore +1 -0
  291. package/corpus/templates/plan/agent-native.app-skill.json +1 -1
  292. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +4 -9
  293. package/corpus/templates/plan/app/lib/app-config.ts +1 -1
  294. package/corpus/templates/plan/changelog/2026-07-25-app-branding-now-uses-the-product-name-without-the-agent-nat.md +6 -0
  295. package/corpus/templates/plan/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
  296. package/corpus/templates/plan/package.json +1 -1
  297. package/corpus/templates/plan/public/manifest.json +1 -1
  298. package/corpus/templates/plan/server/plugins/auth.ts +1 -1
  299. package/corpus/templates/slides/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  300. package/corpus/templates/slides/_gitignore +1 -0
  301. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +0 -2
  302. package/corpus/templates/slides/app/routes/_index.tsx +1 -1
  303. package/corpus/templates/slides/changelog/2026-07-25-app-branding-now-uses-the-product-name-without-the-agent-nat.md +6 -0
  304. package/corpus/templates/slides/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
  305. package/corpus/templates/slides/package.json +1 -1
  306. package/corpus/templates/slides/public/manifest.json +1 -1
  307. package/corpus/templates/slides/server/plugins/auth.ts +1 -1
  308. package/corpus/templates/slides/server/plugins/db.ts +4 -0
  309. package/corpus/templates/tasks/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  310. package/corpus/templates/tasks/AGENTS.md +1 -1
  311. package/corpus/templates/tasks/_gitignore +1 -0
  312. package/dist/a2a/activity.d.ts +4 -1
  313. package/dist/a2a/activity.d.ts.map +1 -1
  314. package/dist/a2a/activity.js +27 -16
  315. package/dist/a2a/activity.js.map +1 -1
  316. package/dist/a2a/client.d.ts.map +1 -1
  317. package/dist/a2a/client.js +58 -4
  318. package/dist/a2a/client.js.map +1 -1
  319. package/dist/agent/engine/builder-engine.d.ts +1 -0
  320. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  321. package/dist/agent/engine/builder-engine.js +31 -4
  322. package/dist/agent/engine/builder-engine.js.map +1 -1
  323. package/dist/agent/run-manager.d.ts.map +1 -1
  324. package/dist/agent/run-manager.js +18 -1
  325. package/dist/agent/run-manager.js.map +1 -1
  326. package/dist/agent/run-store.d.ts +1 -0
  327. package/dist/agent/run-store.d.ts.map +1 -1
  328. package/dist/agent/run-store.js +2 -1
  329. package/dist/agent/run-store.js.map +1 -1
  330. package/dist/agent/types.d.ts +12 -1
  331. package/dist/agent/types.d.ts.map +1 -1
  332. package/dist/agent/types.js +21 -1
  333. package/dist/agent/types.js.map +1 -1
  334. package/dist/chat-threads/store.d.ts +10 -0
  335. package/dist/chat-threads/store.d.ts.map +1 -1
  336. package/dist/chat-threads/store.js +41 -0
  337. package/dist/chat-threads/store.js.map +1 -1
  338. package/dist/checkpoints/index.d.ts +1 -0
  339. package/dist/checkpoints/index.d.ts.map +1 -1
  340. package/dist/checkpoints/index.js +1 -0
  341. package/dist/checkpoints/index.js.map +1 -1
  342. package/dist/checkpoints/route-match.d.ts +8 -0
  343. package/dist/checkpoints/route-match.d.ts.map +1 -0
  344. package/dist/checkpoints/route-match.js +13 -0
  345. package/dist/checkpoints/route-match.js.map +1 -0
  346. package/dist/cli/create.d.ts +35 -4
  347. package/dist/cli/create.d.ts.map +1 -1
  348. package/dist/cli/create.js +69 -19
  349. package/dist/cli/create.js.map +1 -1
  350. package/dist/cli/index.js +19 -0
  351. package/dist/cli/index.js.map +1 -1
  352. package/dist/cli/template-baseline.d.ts +54 -0
  353. package/dist/cli/template-baseline.d.ts.map +1 -0
  354. package/dist/cli/template-baseline.js +334 -0
  355. package/dist/cli/template-baseline.js.map +1 -0
  356. package/dist/cli/template-sync.d.ts +57 -0
  357. package/dist/cli/template-sync.d.ts.map +1 -0
  358. package/dist/cli/template-sync.js +787 -0
  359. package/dist/cli/template-sync.js.map +1 -0
  360. package/dist/cli/templates-meta.d.ts.map +1 -1
  361. package/dist/cli/templates-meta.js +1 -0
  362. package/dist/cli/templates-meta.js.map +1 -1
  363. package/dist/client/AssistantChat.d.ts +2 -1
  364. package/dist/client/AssistantChat.d.ts.map +1 -1
  365. package/dist/client/AssistantChat.js +38 -10
  366. package/dist/client/AssistantChat.js.map +1 -1
  367. package/dist/client/NewWorkspaceAppFlow.d.ts.map +1 -1
  368. package/dist/client/NewWorkspaceAppFlow.js +32 -2
  369. package/dist/client/NewWorkspaceAppFlow.js.map +1 -1
  370. package/dist/client/chat/message-components.d.ts +20 -0
  371. package/dist/client/chat/message-components.d.ts.map +1 -1
  372. package/dist/client/chat/message-components.js +81 -46
  373. package/dist/client/chat/message-components.js.map +1 -1
  374. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  375. package/dist/client/chat/tool-call-display.js +14 -6
  376. package/dist/client/chat/tool-call-display.js.map +1 -1
  377. package/dist/client/error-format.d.ts.map +1 -1
  378. package/dist/client/error-format.js +13 -0
  379. package/dist/client/error-format.js.map +1 -1
  380. package/dist/client/org/OrgSwitcher.d.ts +8 -1
  381. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  382. package/dist/client/org/OrgSwitcher.js +3 -2
  383. package/dist/client/org/OrgSwitcher.js.map +1 -1
  384. package/dist/client/org/TeamPage.d.ts.map +1 -1
  385. package/dist/client/org/TeamPage.js +1 -1
  386. package/dist/client/org/TeamPage.js.map +1 -1
  387. package/dist/client/settings/SettingsPanel.js +9 -9
  388. package/dist/client/settings/SettingsPanel.js.map +1 -1
  389. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  390. package/dist/client/settings/SettingsTabsPage.js +7 -4
  391. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  392. package/dist/client/sse-event-processor.d.ts.map +1 -1
  393. package/dist/client/sse-event-processor.js +3 -0
  394. package/dist/client/sse-event-processor.js.map +1 -1
  395. package/dist/collab/awareness.d.ts +2 -2
  396. package/dist/collab/awareness.d.ts.map +1 -1
  397. package/dist/collab/struct-routes.d.ts +1 -1
  398. package/dist/data-widgets/index.d.ts +3 -0
  399. package/dist/data-widgets/index.d.ts.map +1 -1
  400. package/dist/data-widgets/index.js +33 -0
  401. package/dist/data-widgets/index.js.map +1 -1
  402. package/dist/deploy/build.d.ts.map +1 -1
  403. package/dist/deploy/build.js +11 -7
  404. package/dist/deploy/build.js.map +1 -1
  405. package/dist/eject/provider-api-definitions.d.ts +1 -0
  406. package/dist/eject/provider-api-definitions.d.ts.map +1 -1
  407. package/dist/extensions/url-safety.d.ts +9 -16
  408. package/dist/extensions/url-safety.d.ts.map +1 -1
  409. package/dist/extensions/url-safety.js +48 -4
  410. package/dist/extensions/url-safety.js.map +1 -1
  411. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  412. package/dist/integrations/webhook-handler.d.ts.map +1 -1
  413. package/dist/integrations/webhook-handler.js +46 -9
  414. package/dist/integrations/webhook-handler.js.map +1 -1
  415. package/dist/notifications/routes.d.ts +2 -2
  416. package/dist/observability/routes.d.ts +3 -3
  417. package/dist/org/auto-join-domain.d.ts +3 -2
  418. package/dist/org/auto-join-domain.d.ts.map +1 -1
  419. package/dist/org/auto-join-domain.js +1 -1
  420. package/dist/org/auto-join-domain.js.map +1 -1
  421. package/dist/org/context.d.ts.map +1 -1
  422. package/dist/org/context.js +84 -28
  423. package/dist/org/context.js.map +1 -1
  424. package/dist/org/index.d.ts +1 -0
  425. package/dist/org/index.d.ts.map +1 -1
  426. package/dist/org/index.js +1 -0
  427. package/dist/org/index.js.map +1 -1
  428. package/dist/org/service-identity.d.ts +43 -0
  429. package/dist/org/service-identity.d.ts.map +1 -0
  430. package/dist/org/service-identity.js +34 -0
  431. package/dist/org/service-identity.js.map +1 -0
  432. package/dist/provider-api/actions/custom-provider-registration.d.ts +14 -14
  433. package/dist/provider-api/actions/provider-api.d.ts +13 -11
  434. package/dist/provider-api/actions/provider-api.d.ts.map +1 -1
  435. package/dist/provider-api/index.d.ts +4 -0
  436. package/dist/provider-api/index.d.ts.map +1 -1
  437. package/dist/provider-api/index.js +17 -1
  438. package/dist/provider-api/index.js.map +1 -1
  439. package/dist/scripts/docs/search.d.ts.map +1 -1
  440. package/dist/scripts/docs/search.js +12 -1
  441. package/dist/scripts/docs/search.js.map +1 -1
  442. package/dist/server/agent-chat/context-tools.d.ts.map +1 -1
  443. package/dist/server/agent-chat/context-tools.js +3 -3
  444. package/dist/server/agent-chat/context-tools.js.map +1 -1
  445. package/dist/server/agent-chat/framework-prompts.d.ts +8 -3
  446. package/dist/server/agent-chat/framework-prompts.d.ts.map +1 -1
  447. package/dist/server/agent-chat/framework-prompts.js +33 -62
  448. package/dist/server/agent-chat/framework-prompts.js.map +1 -1
  449. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  450. package/dist/server/agent-chat-plugin.js +16 -10
  451. package/dist/server/agent-chat-plugin.js.map +1 -1
  452. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  453. package/dist/server/agents-bundle.d.ts +18 -0
  454. package/dist/server/agents-bundle.d.ts.map +1 -1
  455. package/dist/server/agents-bundle.js +70 -4
  456. package/dist/server/agents-bundle.js.map +1 -1
  457. package/dist/server/auth.d.ts.map +1 -1
  458. package/dist/server/auth.js +4 -3
  459. package/dist/server/auth.js.map +1 -1
  460. package/dist/server/builder-browser.d.ts.map +1 -1
  461. package/dist/server/builder-browser.js +43 -19
  462. package/dist/server/builder-browser.js.map +1 -1
  463. package/dist/server/core-routes-plugin.js +2 -2
  464. package/dist/server/core-routes-plugin.js.map +1 -1
  465. package/dist/server/credential-provider.d.ts +38 -2
  466. package/dist/server/credential-provider.d.ts.map +1 -1
  467. package/dist/server/credential-provider.js +142 -64
  468. package/dist/server/credential-provider.js.map +1 -1
  469. package/dist/server/index.d.ts +1 -1
  470. package/dist/server/index.d.ts.map +1 -1
  471. package/dist/server/index.js +1 -1
  472. package/dist/server/index.js.map +1 -1
  473. package/dist/server/prompts/framework-core-compact.d.ts +1 -1
  474. package/dist/server/prompts/framework-core-compact.d.ts.map +1 -1
  475. package/dist/server/prompts/framework-core-compact.js +7 -13
  476. package/dist/server/prompts/framework-core-compact.js.map +1 -1
  477. package/dist/server/prompts/framework-core.d.ts +1 -1
  478. package/dist/server/prompts/framework-core.d.ts.map +1 -1
  479. package/dist/server/prompts/framework-core.js +10 -21
  480. package/dist/server/prompts/framework-core.js.map +1 -1
  481. package/dist/server/prompts/index.d.ts +1 -1
  482. package/dist/server/prompts/index.d.ts.map +1 -1
  483. package/dist/server/prompts/index.js +1 -1
  484. package/dist/server/prompts/index.js.map +1 -1
  485. package/dist/server/prompts/shared-rules.d.ts +16 -10
  486. package/dist/server/prompts/shared-rules.d.ts.map +1 -1
  487. package/dist/server/prompts/shared-rules.js +19 -10
  488. package/dist/server/prompts/shared-rules.js.map +1 -1
  489. package/dist/server/ssr-handler.d.ts +1 -1
  490. package/dist/server/ssr-handler.d.ts.map +1 -1
  491. package/dist/server/ssr-handler.js +10 -3
  492. package/dist/server/ssr-handler.js.map +1 -1
  493. package/dist/server/transcribe-voice.d.ts +1 -1
  494. package/dist/settings/user-settings.d.ts.map +1 -1
  495. package/dist/settings/user-settings.js +13 -1
  496. package/dist/settings/user-settings.js.map +1 -1
  497. package/dist/shared/cache-control.d.ts +52 -0
  498. package/dist/shared/cache-control.d.ts.map +1 -1
  499. package/dist/shared/cache-control.js +107 -0
  500. package/dist/shared/cache-control.js.map +1 -1
  501. package/dist/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  502. package/dist/templates/chat/_gitignore +1 -0
  503. package/dist/templates/chat/app/components/layout/Sidebar.tsx +0 -7
  504. package/dist/templates/chat/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
  505. package/dist/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  506. package/dist/templates/default/app/root.tsx +1 -1
  507. package/dist/templates/default/public/manifest.json +2 -2
  508. package/dist/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  509. package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +19 -0
  510. package/dist/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  511. package/dist/templates/workspace-core/.agents/skills/visual-answer/SKILL.md +1 -0
  512. package/dist/vite/agents-bundle-plugin.d.ts.map +1 -1
  513. package/dist/vite/agents-bundle-plugin.js +8 -7
  514. package/dist/vite/agents-bundle-plugin.js.map +1 -1
  515. package/dist/vite/client.d.ts.map +1 -1
  516. package/dist/vite/client.js +66 -1
  517. package/dist/vite/client.js.map +1 -1
  518. package/docs/content/actions.mdx +2 -2
  519. package/docs/content/agent-surfaces.mdx +1 -1
  520. package/docs/content/authentication.mdx +2 -0
  521. package/docs/content/deployment.mdx +36 -0
  522. package/docs/content/http-api.mdx +266 -0
  523. package/docs/content/syncing-template-changes.mdx +159 -0
  524. package/package.json +4 -3
  525. package/src/a2a/activity.ts +38 -27
  526. package/src/a2a/client.ts +57 -4
  527. package/src/agent/engine/builder-engine.ts +35 -4
  528. package/src/agent/run-manager.ts +20 -1
  529. package/src/agent/run-store.ts +4 -1
  530. package/src/agent/types.ts +28 -8
  531. package/src/chat-threads/store.ts +45 -0
  532. package/src/checkpoints/index.ts +2 -0
  533. package/src/checkpoints/route-match.ts +13 -0
  534. package/src/cli/create.ts +105 -17
  535. package/src/cli/index.ts +20 -0
  536. package/src/cli/template-baseline.ts +410 -0
  537. package/src/cli/template-sync.ts +1004 -0
  538. package/src/cli/templates-meta.ts +1 -0
  539. package/src/client/AssistantChat.tsx +38 -12
  540. package/src/client/NewWorkspaceAppFlow.tsx +75 -10
  541. package/src/client/chat/message-components.tsx +127 -66
  542. package/src/client/chat/tool-call-display.tsx +29 -5
  543. package/src/client/error-format.ts +18 -0
  544. package/src/client/org/OrgSwitcher.tsx +30 -8
  545. package/src/client/org/TeamPage.tsx +7 -6
  546. package/src/client/settings/SettingsPanel.tsx +9 -9
  547. package/src/client/settings/SettingsTabsPage.tsx +12 -2
  548. package/src/client/sse-event-processor.ts +3 -0
  549. package/src/data-widgets/index.ts +41 -0
  550. package/src/deploy/build.ts +11 -9
  551. package/src/extensions/url-safety.ts +67 -4
  552. package/src/integrations/webhook-handler.ts +63 -9
  553. package/src/org/auto-join-domain.ts +4 -3
  554. package/src/org/context.ts +108 -39
  555. package/src/org/index.ts +5 -0
  556. package/src/org/service-identity.ts +60 -0
  557. package/src/provider-api/index.ts +22 -1
  558. package/src/scripts/docs/search.ts +12 -1
  559. package/src/server/__snapshots__/agent-chat-plugin.surface.spec.ts.snap +25 -36
  560. package/src/server/agent-chat/context-tools.ts +9 -4
  561. package/src/server/agent-chat/framework-prompts.ts +38 -66
  562. package/src/server/agent-chat-plugin.ts +17 -10
  563. package/src/server/agents-bundle.ts +84 -5
  564. package/src/server/auth.ts +4 -3
  565. package/src/server/builder-browser.ts +47 -19
  566. package/src/server/core-routes-plugin.ts +2 -2
  567. package/src/server/credential-provider.ts +209 -68
  568. package/src/server/index.ts +3 -0
  569. package/src/server/prompts/framework-core-compact.ts +6 -13
  570. package/src/server/prompts/framework-core.ts +9 -21
  571. package/src/server/prompts/index.ts +0 -1
  572. package/src/server/prompts/shared-rules.ts +19 -11
  573. package/src/server/ssr-handler.ts +13 -2
  574. package/src/settings/user-settings.ts +13 -1
  575. package/src/shared/cache-control.ts +141 -0
  576. package/src/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  577. package/src/templates/chat/_gitignore +1 -0
  578. package/src/templates/chat/app/components/layout/Sidebar.tsx +0 -7
  579. package/src/templates/chat/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
  580. package/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  581. package/src/templates/default/app/root.tsx +1 -1
  582. package/src/templates/default/public/manifest.json +2 -2
  583. package/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  584. package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +19 -0
  585. package/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  586. package/src/templates/workspace-core/.agents/skills/visual-answer/SKILL.md +1 -0
  587. package/src/vite/agents-bundle-plugin.ts +7 -6
  588. package/src/vite/client.ts +69 -3
@@ -1,5 +1,6 @@
1
1
  import { AgentPanel } from "@agent-native/core/client/agent-chat";
2
2
  import { appPath, agentNativePath } from "@agent-native/core/client/api-path";
3
+ import { writeClipboardText } from "@agent-native/core/client/clipboard";
3
4
  import {
4
5
  useActionMutation,
5
6
  useActionQuery,
@@ -19,7 +20,12 @@ import {
19
20
  isLoomEmbedBackedRecording,
20
21
  isLoomRecordingSource,
21
22
  } from "@shared/loom";
22
- import { CLIP_SHARE_REF, REF_PARAM } from "@shared/share-attribution";
23
+ import {
24
+ CLIP_SHARE_REF,
25
+ DASHBOARD_REDIRECT_PARAM,
26
+ DASHBOARD_REDIRECT_VALUE,
27
+ REF_PARAM,
28
+ } from "@shared/share-attribution";
23
29
  import {
24
30
  IconShare3,
25
31
  IconArrowLeft,
@@ -50,6 +56,7 @@ import { CommentsPanel } from "@/components/player/comments-panel";
50
56
  import { RecordingOptionsMenu } from "@/components/player/delete-recording-menu";
51
57
  import { InsightsPanel } from "@/components/player/insights-panel";
52
58
  import { ReactionsTray } from "@/components/player/reactions-tray";
59
+ import { RecordingViewsBadge } from "@/components/player/recording-views-badge";
53
60
  import { SettingsPanel } from "@/components/player/settings-panel";
54
61
  import { ShareRecordingPopover } from "@/components/player/share-dialog";
55
62
  import {
@@ -85,6 +92,7 @@ import { usePlayerShortcuts } from "@/hooks/use-player-shortcuts";
85
92
  import { useViewTracking } from "@/hooks/use-view-tracking";
86
93
  import enMessages from "@/i18n/en-US";
87
94
  import { parsePlaybackSpeed } from "@/lib/playback-speed";
95
+ import { recordingShareUrl } from "@/lib/recording-link";
88
96
  import { isStorageSetupFailureReason } from "@/lib/storage-failures";
89
97
  import { cn } from "@/lib/utils";
90
98
 
@@ -253,6 +261,18 @@ export default function RecordingPage() {
253
261
  }
254
262
  return currentMs;
255
263
  }, [currentMs]);
264
+ // The compact layout stacks the panel below the video, so switching tabs
265
+ // alone leaves the user looking at the player. Desktop always renders the
266
+ // side aside, so nothing to scroll there.
267
+ const openInsightsPanel = useCallback(() => {
268
+ setPanel("insights");
269
+ if (!isCompactLayout) return;
270
+ requestAnimationFrame(() => {
271
+ document
272
+ .getElementById("clip-activity-panel")
273
+ ?.scrollIntoView({ block: "start" });
274
+ });
275
+ }, [isCompactLayout]);
256
276
  const transcriptKickedRef = useRef<string | null>(null);
257
277
  // When the recording lands in the processing state but never flips to
258
278
  // 'ready', stop spinning forever and surface an error banner so the user
@@ -366,8 +386,11 @@ export default function RecordingPage() {
366
386
  // password.
367
387
  useEffect(() => {
368
388
  if (!recordingId || !playerDataForbidden) return;
389
+ const shareParams = new URLSearchParams();
390
+ shareParams.set(REF_PARAM, CLIP_SHARE_REF);
391
+ shareParams.set(DASHBOARD_REDIRECT_PARAM, DASHBOARD_REDIRECT_VALUE);
369
392
  navigate(
370
- `/share/${encodeURIComponent(recordingId)}?${REF_PARAM}=${CLIP_SHARE_REF}`,
393
+ `/share/${encodeURIComponent(recordingId)}?${shareParams.toString()}`,
371
394
  {
372
395
  replace: true,
373
396
  },
@@ -408,23 +431,21 @@ export default function RecordingPage() {
408
431
  const visibleTitle = recording
409
432
  ? displayRecordingTitle(recording.title)
410
433
  : "Untitled Clip";
434
+ // Attribution `via` must never point at someone who isn't the owner, so it
435
+ // is only tagged when the viewer is the owner (same rule as the share dialog).
436
+ const shareViaId =
437
+ role === "owner" ? (session?.userId ?? undefined) : undefined;
411
438
  const pendingShareUrl = useMemo(() => {
412
439
  if (!recordingId || typeof window === "undefined") return "";
413
- return new URL(
414
- appPath(`/share/${encodeURIComponent(recordingId)}`),
415
- window.location.origin,
416
- ).toString();
417
- }, [recordingId]);
440
+ return recordingShareUrl(recordingId, shareViaId);
441
+ }, [recordingId, shareViaId]);
418
442
  const copyPendingShareLink = useCallback(async () => {
419
443
  if (!pendingShareUrl) return;
420
- try {
421
- await navigator.clipboard.writeText(pendingShareUrl);
422
- setPendingLinkCopied(true);
423
- window.setTimeout(() => setPendingLinkCopied(false), 1400);
424
- } catch {
425
- // The full Share popover remains available when clipboard permission is
426
- // unavailable, so a denied clipboard write does not block the page.
427
- }
444
+ // The full Share popover remains available when clipboard permission is
445
+ // unavailable, so a denied clipboard write does not block the page.
446
+ if (!(await writeClipboardText(pendingShareUrl))) return;
447
+ setPendingLinkCopied(true);
448
+ window.setTimeout(() => setPendingLinkCopied(false), 1400);
428
449
  }, [pendingShareUrl]);
429
450
  useEffect(() => {
430
451
  if (!recording?.id) return;
@@ -575,6 +596,12 @@ export default function RecordingPage() {
575
596
  });
576
597
  return;
577
598
  }
599
+ if (retryingLoomImport && result?.status === "processing") {
600
+ // Download + reupload now run as a background job; this request only
601
+ // confirms the retry was accepted, not that the clip is ready yet.
602
+ toast.info(t("recordingPage.importingLoom"));
603
+ return;
604
+ }
578
605
  toast.success(
579
606
  retryingLoomImport
580
607
  ? t("recordingPage.loomImportResumed")
@@ -1336,6 +1363,16 @@ export default function RecordingPage() {
1336
1363
  ) : null}
1337
1364
  </div>
1338
1365
 
1366
+ {!editing ? (
1367
+ <RecordingViewsBadge
1368
+ recordingId={recording.id}
1369
+ viewCount={playerDataQ.data?.viewCount ?? 0}
1370
+ canViewDetails={canEdit}
1371
+ onOpenInsights={openInsightsPanel}
1372
+ className="shrink-0"
1373
+ />
1374
+ ) : null}
1375
+
1339
1376
  {canUseNativeEditor ? (
1340
1377
  <Button
1341
1378
  variant={editing ? "secondary" : "outline"}
@@ -46,6 +46,10 @@ import {
46
46
  createBrowserDiagnosticsCapture,
47
47
  type BrowserDiagnosticsCapture,
48
48
  } from "@/lib/browser-diagnostics-capture";
49
+ import {
50
+ getCaptureHostApp,
51
+ macPermissionGuidanceFor,
52
+ } from "@/lib/capture-permissions";
49
53
  import {
50
54
  COMPRESS_THRESHOLD_BYTES,
51
55
  COMPRESSION_ENABLED,
@@ -61,6 +65,7 @@ import {
61
65
  loadRecorderPreferences,
62
66
  saveRecorderPreferences,
63
67
  } from "@/lib/recorder-preferences";
68
+ import { copyRecordingShareLink } from "@/lib/recording-link";
64
69
  import {
65
70
  buildCaptureTitle,
66
71
  defaultRecordingTitle,
@@ -87,19 +92,6 @@ async function writeAppState(key: string, value: unknown): Promise<void> {
87
92
  );
88
93
  }
89
94
 
90
- function recordingLink(recordingId: string): string {
91
- const path = `${appBasePath()}/r/${encodeURIComponent(recordingId)}`;
92
- if (typeof window === "undefined") return path;
93
- return new URL(path, window.location.origin).toString();
94
- }
95
-
96
- async function copyRecordingLink(recordingId: string): Promise<void> {
97
- if (typeof navigator === "undefined") return;
98
- if (!navigator.clipboard?.writeText) return;
99
- await navigator.clipboard
100
- .writeText(recordingLink(recordingId))
101
- .catch(() => undefined);
102
- }
103
95
  import {
104
96
  bugReportTitle,
105
97
  parseBugReportContext,
@@ -368,27 +360,30 @@ function permissionGuidance(
368
360
  return "Browser site permissions are not the blocker here. Open Clips directly in a browser tab, or use an app frame that delegates the selected capture sources.";
369
361
  }
370
362
  if (isScreenPermissionError(message)) {
371
- if (isEmbeddedWindow()) {
363
+ // The desktop shell hosts the recorder in its own webview, so "open it in a
364
+ // real tab" is not advice a desktop user can act on.
365
+ if (isEmbeddedWindow() && getCaptureHostApp().kind !== "desktop") {
372
366
  return "The web client is running Clips inside a frame. Open the recorder in its own tab, then start recording; Chrome can block screen sharing in embedded pages even when macOS access is enabled.";
373
367
  }
374
368
  if (isMacPlatform()) {
375
- return "Chrome can have Camera and Microphone allowed while macOS still blocks screen capture. Enable your browser in System Settings > Privacy & Security > Screen & System Audio Recording, then quit and reopen it.";
369
+ return `Camera and Microphone can be allowed while macOS still blocks screen capture. ${macPermissionGuidanceFor("screen")}`;
376
370
  }
377
371
  return "Choose a source in the browser screen picker. If it still fails, check this site's browser permissions and reload Clips.";
378
372
  }
379
373
  if (isCameraPermissionError(message)) {
380
374
  if (isMacPlatform()) {
381
- return "Allow Camera in this site's browser settings and in macOS System Settings > Privacy & Security > Camera, then reload Clips.";
375
+ return `Allow Camera for this site first. ${macPermissionGuidanceFor("camera")}`;
382
376
  }
383
377
  return "Open this site's browser settings, allow Camera, then reload Clips.";
384
378
  }
385
379
  if (isMicrophonePermissionError(message)) {
386
380
  if (isMacPlatform()) {
387
- return "Allow Microphone in this site's browser settings and in macOS System Settings > Privacy & Security > Microphone, then reload Clips.";
381
+ return `Allow Microphone for this site first. ${macPermissionGuidanceFor("microphone")}`;
388
382
  }
389
383
  return "Open this site's browser settings, allow Microphone, then reload Clips.";
390
384
  }
391
385
  if (isMacPlatform()) {
386
+ const host = getCaptureHostApp();
392
387
  const labels = getModePermissionLabels(opts?.mode, opts?.micDeviceId);
393
388
  if (labels.length > 0) {
394
389
  const readable = labels
@@ -400,9 +395,9 @@ function permissionGuidance(
400
395
  : "Microphone",
401
396
  )
402
397
  .join(", ");
403
- return `Check this site's browser permissions first. If it still fails, enable ${readable} for your browser in macOS System Settings > Privacy & Security, then quit and reopen it.`;
398
+ return `Check this site's permissions first. If it still fails, turn on ${host.name} under ${readable} in macOS System Settings > Privacy & Security, then quit and reopen it. Clips is never listed there — macOS grants access to ${host.name}.`;
404
399
  }
405
- return "Check this site's browser permissions first. If it still fails, open macOS System Settings > Privacy & Security for your browser, then quit and reopen it.";
400
+ return `Check this site's permissions first. If it still fails, turn on ${host.name} in macOS System Settings > Privacy & Security, then quit and reopen it.`;
406
401
  }
407
402
  return "Open this site's browser settings and allow the selected capture sources, then reload this page.";
408
403
  }
@@ -511,7 +506,7 @@ function friendlyRecordingErrorMessage(error: string): string {
511
506
  }
512
507
  if (isScreenPermissionError(error)) {
513
508
  if (isMacPlatform()) {
514
- return "Clips could not start screen capture. Enable screen recording for your browser, then try again.";
509
+ return `Clips could not start screen capture. macOS is blocking screen recording for ${getCaptureHostApp().name}.`;
515
510
  }
516
511
  return "Clips could not start screen capture. Allow screen sharing for this site, then try again.";
517
512
  }
@@ -629,7 +624,10 @@ function RecordingErrorCard({
629
624
  const permissionError = !uploadFailure && isPermissionError(error);
630
625
  const policyError = !uploadFailure && isPolicyPermissionError(error);
631
626
  const embeddedScreenError =
632
- !uploadFailure && isEmbeddedWindow() && isScreenPermissionError(error);
627
+ !uploadFailure &&
628
+ isEmbeddedWindow() &&
629
+ getCaptureHostApp().kind !== "desktop" &&
630
+ isScreenPermissionError(error);
633
631
  const settings = permissionError
634
632
  ? getModePermissionLabels(mode, micDeviceId)
635
633
  : [];
@@ -766,6 +764,27 @@ export default function RecordRoute() {
766
764
  const t = useT();
767
765
  const navigate = useNavigate();
768
766
  const location = useLocation();
767
+ // A clipboard write can be refused (insecure origin, unfocused document, no
768
+ // transient activation). Never let the success toast imply the link was
769
+ // copied when it wasn't — offer a click instead, which restores the user
770
+ // gesture the browser is asking for.
771
+ const showSavedToast = useCallback(
772
+ (message: string, copied: boolean, recordingId: string) => {
773
+ if (copied) {
774
+ toast.success(message, { description: t("recordRoute.linkCopied") });
775
+ return;
776
+ }
777
+ toast.success(message, {
778
+ action: {
779
+ label: t("recordRoute.copyLinkAction"),
780
+ onClick: () => {
781
+ void copyRecordingShareLink(recordingId);
782
+ },
783
+ },
784
+ });
785
+ },
786
+ [t],
787
+ );
769
788
  const [uiState, setUiState] = useState<UiState>("idle");
770
789
  const [error, setError] = useState<string | null>(null);
771
790
  const [isPaused, setIsPaused] = useState(false);
@@ -1723,8 +1742,13 @@ export default function RecordRoute() {
1723
1742
  description: t("recordRoute.connectStorageToFinish"),
1724
1743
  duration: 12_000,
1725
1744
  });
1745
+ } else if (createdId && !reportContext) {
1746
+ showSavedToast(
1747
+ t("recordRoute.videoUploaded"),
1748
+ await copyRecordingShareLink(createdId),
1749
+ createdId,
1750
+ );
1726
1751
  } else {
1727
- if (createdId && !reportContext) await copyRecordingLink(createdId);
1728
1752
  toast.success(t("recordRoute.videoUploaded"));
1729
1753
  }
1730
1754
  if (reportContext && createdId) {
@@ -1789,7 +1813,7 @@ export default function RecordRoute() {
1789
1813
  setUploadProgress(null);
1790
1814
  }
1791
1815
  },
1792
- [markStorageConfigured, navigate, probeVideoMetadata],
1816
+ [markStorageConfigured, navigate, probeVideoMetadata, showSavedToast],
1793
1817
  );
1794
1818
 
1795
1819
  const importLoom = useCallback(
@@ -1826,9 +1850,17 @@ export default function RecordRoute() {
1826
1850
  description: t("recordRoute.connectStorageToRetryLoom"),
1827
1851
  duration: 12_000,
1828
1852
  });
1853
+ } else if (result?.status === "processing") {
1854
+ // The video download + reupload run as a background job (see
1855
+ // import-loom-recording.ts) so this request stays fast regardless of
1856
+ // Loom video length; the recording page polls until it is ready.
1857
+ toast.info(t("recordingPage.importingLoom"));
1829
1858
  } else {
1830
- await copyRecordingLink(recordingId);
1831
- toast.success(t("recordRoute.loomImported"));
1859
+ showSavedToast(
1860
+ t("recordRoute.loomImported"),
1861
+ await copyRecordingShareLink(recordingId),
1862
+ recordingId,
1863
+ );
1832
1864
  }
1833
1865
  await writeAppState("navigate", {
1834
1866
  view: "recording",
@@ -1845,7 +1877,7 @@ export default function RecordRoute() {
1845
1877
  setLoomImporting(false);
1846
1878
  }
1847
1879
  },
1848
- [folderIdFromUrl, navigate, spaceIdFromUrl],
1880
+ [folderIdFromUrl, navigate, spaceIdFromUrl, showSavedToast],
1849
1881
  );
1850
1882
 
1851
1883
  const saveBrowserDiagnostics = useCallback(
@@ -1944,7 +1976,14 @@ export default function RecordRoute() {
1944
1976
  // Stop / upload / navigate.
1945
1977
  // -------------------------------------------------------------------------
1946
1978
  const finishSavedRecording = useCallback(
1947
- async (recordingId: string, result: RecorderFinalizeResult) => {
1979
+ async (
1980
+ recordingId: string,
1981
+ result: RecorderFinalizeResult,
1982
+ // Started by the caller the moment the recording became durable, so the
1983
+ // clipboard write happens closer to the user's stop gesture than to the
1984
+ // end of the post-save bookkeeping.
1985
+ pendingCopy?: Promise<boolean>,
1986
+ ) => {
1948
1987
  // Recording is fully saved — clear refs so that if anything below throws
1949
1988
  // and the user clicks "Try again", doCancel() won't trash a good recording.
1950
1989
  pendingRef.current = null;
@@ -1960,9 +1999,14 @@ export default function RecordRoute() {
1960
1999
  description: t("recordRoute.connectStorageToFinish"),
1961
2000
  duration: 12_000,
1962
2001
  });
1963
- } else {
1964
- if (!reportContext) await copyRecordingLink(recordingId);
2002
+ } else if (reportContext) {
1965
2003
  toast.success(t("recordRoute.recordingSaved"));
2004
+ } else {
2005
+ showSavedToast(
2006
+ t("recordRoute.recordingSaved"),
2007
+ await (pendingCopy ?? copyRecordingShareLink(recordingId)),
2008
+ recordingId,
2009
+ );
1966
2010
  }
1967
2011
 
1968
2012
  if (reportContext) {
@@ -1986,7 +2030,7 @@ export default function RecordRoute() {
1986
2030
  navigate(`/r/${recordingId}`);
1987
2031
  }, 50);
1988
2032
  },
1989
- [navigate],
2033
+ [navigate, showSavedToast],
1990
2034
  );
1991
2035
 
1992
2036
  const doStop = useCallback(async () => {
@@ -2056,8 +2100,15 @@ export default function RecordRoute() {
2056
2100
  }
2057
2101
 
2058
2102
  const stopResult = await engine.stop();
2103
+ // The recording is durable here; saveBrowserDiagnostics is one more
2104
+ // round trip. Start the clipboard write first so it isn't pushed even
2105
+ // further from the stop gesture that authorized it.
2106
+ const pendingCopy =
2107
+ stopResult.waitingForStorage || bugReportContextRef.current
2108
+ ? undefined
2109
+ : copyRecordingShareLink(pending.id).catch(() => false);
2059
2110
  await saveBrowserDiagnostics(pending.id);
2060
- await finishSavedRecording(pending.id, stopResult);
2111
+ await finishSavedRecording(pending.id, stopResult, pendingCopy);
2061
2112
  } catch (err) {
2062
2113
  const message =
2063
2114
  err instanceof Error ? err.message : t("recordRoute.uploadFailed");
@@ -32,7 +32,13 @@ import {
32
32
  type LoaderFunctionArgs,
33
33
  type MetaFunction,
34
34
  } from "react-router";
35
- import { Link, useLoaderData, useNavigate, useParams } from "react-router";
35
+ import {
36
+ Link,
37
+ useLoaderData,
38
+ useNavigate,
39
+ useParams,
40
+ useSearchParams,
41
+ } from "react-router";
36
42
  import { toast } from "sonner";
37
43
 
38
44
  import { CaptureInstallButton } from "@/components/capture-install-options";
@@ -41,6 +47,7 @@ import { CommentsPanel } from "@/components/player/comments-panel";
41
47
  import { RecordingOptionsMenu } from "@/components/player/delete-recording-menu";
42
48
  import { InsightsPanel } from "@/components/player/insights-panel";
43
49
  import { ReactionsTray } from "@/components/player/reactions-tray";
50
+ import { RecordingViewsBadge } from "@/components/player/recording-views-badge";
44
51
  import { ShareRecordingPopover } from "@/components/player/share-dialog";
45
52
  import { SignInPromptDialog } from "@/components/player/sign-in-prompt-dialog";
46
53
  import { TranscriptPanel } from "@/components/player/transcript-panel";
@@ -82,6 +89,7 @@ import {
82
89
  buildSignupAttributionQuery,
83
90
  readShareAttribution,
84
91
  } from "../../shared/share-attribution";
92
+ import { resolveDashboardRedirect } from "../../shared/share-dashboard-redirect";
85
93
  import { privateShareLoaderData } from "../../shared/share-loader-response";
86
94
  import {
87
95
  buildClipsShareMeta,
@@ -344,6 +352,7 @@ export default function ShareRoute() {
344
352
  const loaderData = useLoaderData<typeof loader>() as SharePageLoaderData;
345
353
  const { shareId } = useParams<{ shareId: string }>();
346
354
  const navigate = useNavigate();
355
+ const [searchParams] = useSearchParams();
347
356
 
348
357
  // Viral attribution: read the `ref`/`via` the visitor arrived on (the tagged
349
358
  // share link) so we can fire funnel events and forward attribution into the
@@ -415,6 +424,7 @@ export default function ShareRoute() {
415
424
  null,
416
425
  );
417
426
  const [processingTimeout, setProcessingTimeout] = useState(false);
427
+ const [panel, setPanel] = useState("comments");
418
428
  const requireSignIn = useCallback(
419
429
  (intent: "comment" | "react") => setSignInIntent(intent),
420
430
  [],
@@ -499,6 +509,10 @@ export default function ShareRoute() {
499
509
  viewerRole === "admin" ||
500
510
  viewerRole === "editor";
501
511
  const viewerIsOwner = Boolean(dataQ.data?.data?.viewer?.isOwner);
512
+ const viewerCanOpenDashboard = Boolean(
513
+ dataQ.data?.data?.viewer?.canOpenDashboard,
514
+ );
515
+ const viewCount = Number(dataQ.data?.data?.viewCount ?? 0);
502
516
  const showTitleSkeleton = recording
503
517
  ? shouldShowGeneratedTitleSkeleton(recording, transcriptStatus)
504
518
  : false;
@@ -522,6 +536,21 @@ export default function ShareRoute() {
522
536
  document.title = clipsSharePageTitle(recording.title);
523
537
  }, [recording?.title]);
524
538
 
539
+ // /share/:id and /r/:id render the same clip, so anyone who can open the
540
+ // authenticated page goes straight there rather than through a redundant
541
+ // "open dashboard" button. `canOpenDashboard` is the server's own
542
+ // `canOpenDirectRecordingPage` verdict; deriving it from the display role
543
+ // instead would bounce viewers between the two routes forever, since /r
544
+ // sends anyone it rejects back here.
545
+ useEffect(() => {
546
+ const target = resolveDashboardRedirect({
547
+ recordingId: recording?.id,
548
+ canOpenDashboard: viewerCanOpenDashboard,
549
+ search: searchParams.toString(),
550
+ });
551
+ if (target) navigate(target, { replace: true });
552
+ }, [viewerCanOpenDashboard, recording?.id, searchParams, navigate]);
553
+
525
554
  // The /share/* shell skips DbSyncSetup (and thus useNavigationState), so the
526
555
  // agent mounted in the side panel has no navigation context. Write it
527
556
  // explicitly for signed-in viewers so view-screen grounds the chat to this
@@ -809,12 +838,6 @@ export default function ShareRoute() {
809
838
  {t("sharePage.signInIfYours")}
810
839
  </a>
811
840
  </Button>
812
- ) : canManageStorage && isFailure ? (
813
- <Button asChild size="sm">
814
- <a href={appPath(`/r/${recording.id}`)}>
815
- {t("sharePage.openDashboard")}
816
- </a>
817
- </Button>
818
841
  ) : null}
819
842
  <Button
820
843
  onClick={() => {
@@ -866,19 +889,13 @@ export default function ShareRoute() {
866
889
  </div>
867
890
 
868
891
  <div className="flex w-full min-w-0 flex-wrap items-center justify-between gap-2 sm:w-auto sm:justify-end">
869
- {viewerCanEdit ? (
870
- <Button variant="outline" size="sm" asChild>
871
- <a
872
- href={appPath(`/r/${recording.id}`)}
873
- className="min-w-0 gap-1.5"
874
- >
875
- <span className="truncate">
876
- {t("sharePage.openDashboard")}
877
- </span>
878
- <IconExternalLink className="h-3.5 w-3.5 shrink-0" />
879
- </a>
880
- </Button>
881
- ) : session ? null : (
892
+ <RecordingViewsBadge
893
+ recordingId={recording.id}
894
+ viewCount={viewCount}
895
+ canViewDetails={viewerCanEdit}
896
+ onOpenInsights={() => setPanel("insights")}
897
+ />
898
+ {session ? null : (
882
899
  <Button variant="ghost" size="sm" asChild>
883
900
  <a
884
901
  href={appPath("/")}
@@ -984,16 +1001,6 @@ export default function ShareRoute() {
984
1001
 
985
1002
  <div className="flex shrink-0 flex-col gap-3 px-4 pb-4 sm:flex-row sm:items-start sm:px-0 sm:pb-0">
986
1003
  <div className="min-w-0 flex-1">
987
- {showTitleSkeleton ? (
988
- <Skeleton
989
- aria-label={t("sharePage.generatingTitle")}
990
- className="h-5 w-72 max-w-full"
991
- />
992
- ) : (
993
- <h2 className="break-words text-base font-semibold leading-tight">
994
- {visibleTitle}
995
- </h2>
996
- )}
997
1004
  {recording.description ? (
998
1005
  <p className="whitespace-pre-wrap break-words text-sm text-muted-foreground">
999
1006
  {recording.description}
@@ -1058,7 +1065,11 @@ export default function ShareRoute() {
1058
1065
  </div>
1059
1066
 
1060
1067
  <aside className="flex min-h-[420px] w-full min-w-0 shrink-0 flex-col border-t border-border bg-background lg:min-h-0 lg:w-[380px] lg:border-s lg:border-t-0">
1061
- <Tabs defaultValue="comments" className="flex h-full flex-col">
1068
+ <Tabs
1069
+ value={panel}
1070
+ onValueChange={setPanel}
1071
+ className="flex h-full flex-col"
1072
+ >
1062
1073
  <TabsList className="mx-3 mt-3 grid w-auto grid-cols-4">
1063
1074
  <TabsTrigger value="comments" className="text-xs gap-1">
1064
1075
  {t("recordingPage.activity")}
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: added
3
+ date: 2026-07-24
4
+ ---
5
+
6
+ Clip pages now show a view count with viewer avatars next to the title, and owners can click through to see who watched and how far they got.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-24
4
+ ---
5
+
6
+ Clip summaries read like a description you'd write yourself instead of narrating "the speaker", and the share page no longer repeats the title under the player
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: added
3
+ date: 2026-07-24
4
+ ---
5
+
6
+ Clip view counts now separate human views from agent views, showing which AI agents (Claude, ChatGPT, Perplexity) read a clip through its agent APIs
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: added
3
+ date: 2026-07-24
4
+ ---
5
+
6
+ Clips actions can now be called by org service tokens, so external systems like a support desk can import recordings automatically.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-24
4
+ ---
5
+
6
+ Clips no longer briefly shows a Dock icon while launching
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-24
4
+ ---
5
+
6
+ Fixed owner and editor share links redirecting to the recording dashboard
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-24
4
+ ---
5
+
6
+ Meeting and note recordings now start as a compact pill on the right edge with a live waveform that moves with the room, and the transcript view is grayscale with an Ask anything bar built in.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-24
4
+ ---
5
+
6
+ New clips now copy a shareable link instead of the owner-only link, so the link auto-copied by the web recorder, desktop app, and Chrome extension works for everyone you paste it to
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-24
4
+ ---
5
+
6
+ Opening a share link as the clip's owner now goes straight to the full clip page instead of showing a near-identical page with an "Open dashboard" button.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-24
4
+ ---
5
+
6
+ Permissions and Rewind controls now use compact, consistent hover states
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-24
4
+ ---
5
+
6
+ Quitting the desktop app no longer shows a false macOS crash report
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-24
4
+ ---
5
+
6
+ Screen recording permission errors now name the exact app to allow in macOS System Settings, instead of pointing at an entry Clips never appears under
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: added
3
+ date: 2026-07-24
4
+ ---
5
+
6
+ The desktop app now copies a new clip's public share link to your clipboard the moment a recording finishes and shows a notification confirming it, so it's ready to paste straight into Slack
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-24
4
+ ---
5
+
6
+ The recording toolbar now stays above other apps, including on fullscreen and other Spaces
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-24
4
+ ---
5
+
6
+ Transcript captions now use real speech timings instead of an estimated even spread
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-24
4
+ ---
5
+
6
+ Video playback no longer stutters and replays the last moment during a clip
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-25
4
+ ---
5
+
6
+ App branding now uses the product name without the Agent-Native prefix.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-25
4
+ ---
5
+
6
+ Settings navigation now keeps Manage agent as a dedicated linked destination at the bottom.