@agent-native/core 0.90.2 → 0.90.3

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 (429) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +12 -0
  3. package/corpus/core/docs/content/agent-native-toolkit.mdx +87 -80
  4. package/corpus/core/docs/content/locales/ar-SA/agent-native-toolkit.mdx +89 -80
  5. package/corpus/core/docs/content/locales/de-DE/agent-native-toolkit.mdx +89 -80
  6. package/corpus/core/docs/content/locales/es-ES/agent-native-toolkit.mdx +89 -80
  7. package/corpus/core/docs/content/locales/fr-FR/agent-native-toolkit.mdx +89 -80
  8. package/corpus/core/docs/content/locales/hi-IN/agent-native-toolkit.mdx +89 -80
  9. package/corpus/core/docs/content/locales/ja-JP/agent-native-toolkit.mdx +89 -80
  10. package/corpus/core/docs/content/locales/ko-KR/agent-native-toolkit.mdx +89 -80
  11. package/corpus/core/docs/content/locales/pt-BR/agent-native-toolkit.mdx +89 -80
  12. package/corpus/core/docs/content/locales/zh-CN/agent-native-toolkit.mdx +89 -80
  13. package/corpus/core/docs/content/locales/zh-TW/agent-native-toolkit.mdx +89 -80
  14. package/corpus/core/docs/content/toolkit-agent-ux.mdx +43 -0
  15. package/corpus/core/docs/content/toolkit-app-adapters.mdx +9 -0
  16. package/corpus/core/docs/content/toolkit-collaboration-ui.mdx +12 -0
  17. package/corpus/core/docs/content/toolkit-collaboration.mdx +74 -0
  18. package/corpus/core/docs/content/toolkit-command-navigation.mdx +106 -0
  19. package/corpus/core/docs/content/toolkit-comments-review.mdx +98 -0
  20. package/corpus/core/docs/content/toolkit-history.mdx +95 -0
  21. package/corpus/core/docs/content/toolkit-observability.mdx +41 -0
  22. package/corpus/core/docs/content/toolkit-org-team.mdx +80 -0
  23. package/corpus/core/docs/content/toolkit-resources.mdx +57 -0
  24. package/corpus/core/docs/content/toolkit-settings.mdx +65 -0
  25. package/corpus/core/docs/content/toolkit-setup-connections.mdx +109 -0
  26. package/corpus/core/docs/content/toolkit-sharing-ui.mdx +18 -6
  27. package/corpus/core/docs/content/toolkit-sharing.mdx +81 -0
  28. package/corpus/core/docs/content/toolkit-shell-hooks.mdx +9 -0
  29. package/corpus/core/docs/content/toolkit-ui.mdx +9 -0
  30. package/corpus/core/package.json +35 -1
  31. package/corpus/core/src/agent/engine/ai-sdk-engine.ts +19 -1
  32. package/corpus/core/src/agent/engine/anthropic-engine.ts +25 -1
  33. package/corpus/core/src/agent/engine/registry.ts +23 -16
  34. package/corpus/core/src/agent/production-agent.ts +37 -6
  35. package/corpus/core/src/client/command-navigation/index.ts +15 -0
  36. package/corpus/core/src/client/comments-review/index.ts +1 -0
  37. package/corpus/core/src/client/history/VersionHistoryPanel.tsx +145 -0
  38. package/corpus/core/src/client/history/index.ts +18 -0
  39. package/corpus/core/src/client/history/use-history.ts +86 -0
  40. package/corpus/core/src/client/index.ts +76 -9
  41. package/corpus/core/src/client/org/OrgSwitcher.tsx +6 -6
  42. package/corpus/core/src/client/org/RequireActiveOrg.tsx +2 -2
  43. package/corpus/core/src/client/org/TeamPage.tsx +3 -3
  44. package/corpus/core/src/client/org/hooks.ts +32 -0
  45. package/corpus/core/src/client/org/index.ts +30 -1
  46. package/corpus/core/src/client/org-team/index.ts +1 -0
  47. package/corpus/core/src/client/review/ReviewStatusBadge.tsx +39 -0
  48. package/corpus/core/src/client/review/ReviewThreadPanel.tsx +278 -0
  49. package/corpus/core/src/client/review/index.ts +25 -0
  50. package/corpus/core/src/client/review/use-review.ts +114 -0
  51. package/corpus/core/src/client/settings/index.ts +11 -1
  52. package/corpus/core/src/client/setup-connections/BuilderConnectCard.tsx +94 -0
  53. package/corpus/core/src/client/setup-connections/ProviderReadinessBadge.tsx +73 -0
  54. package/corpus/core/src/client/setup-connections/SetupConnectionsPage.tsx +94 -0
  55. package/corpus/core/src/client/setup-connections/index.ts +46 -0
  56. package/corpus/core/src/client/sharing/ShareButton.tsx +20 -14
  57. package/corpus/core/src/client/sharing/ShareDialog.tsx +3 -3
  58. package/corpus/core/src/command-navigation/actions.ts +100 -0
  59. package/corpus/core/src/command-navigation/index.ts +12 -0
  60. package/corpus/core/src/comments-review/index.ts +1 -0
  61. package/corpus/core/src/file-upload/builder.ts +24 -3
  62. package/corpus/core/src/file-upload/types.ts +3 -1
  63. package/corpus/core/src/history/actions/create-resource-version.ts +89 -0
  64. package/corpus/core/src/history/actions/get-resource-version.ts +60 -0
  65. package/corpus/core/src/history/actions/list-resource-history.ts +53 -0
  66. package/corpus/core/src/history/actions/list-resource-versions.ts +43 -0
  67. package/corpus/core/src/history/actions/restore-resource-version.ts +96 -0
  68. package/corpus/core/src/history/index.ts +27 -0
  69. package/corpus/core/src/history/registry.ts +99 -0
  70. package/corpus/core/src/history/store.ts +348 -0
  71. package/corpus/core/src/history/types.ts +69 -0
  72. package/corpus/core/src/index.ts +10 -0
  73. package/corpus/core/src/navigation/index.ts +170 -0
  74. package/corpus/core/src/org/index.ts +8 -0
  75. package/corpus/core/src/org/permissions.ts +30 -0
  76. package/corpus/core/src/org-team/index.ts +1 -0
  77. package/corpus/core/src/private-blob/registry.ts +1 -0
  78. package/corpus/core/src/review/actions/consume-review-feedback.ts +38 -0
  79. package/corpus/core/src/review/actions/create-review-comment.ts +107 -0
  80. package/corpus/core/src/review/actions/delete-review-comment.ts +55 -0
  81. package/corpus/core/src/review/actions/get-review-feedback.ts +54 -0
  82. package/corpus/core/src/review/actions/list-review-comments.ts +53 -0
  83. package/corpus/core/src/review/actions/reply-review-comment.ts +107 -0
  84. package/corpus/core/src/review/actions/resolve-review-thread.ts +60 -0
  85. package/corpus/core/src/review/actions/set-review-status.ts +58 -0
  86. package/corpus/core/src/review/index.ts +36 -0
  87. package/corpus/core/src/review/mentions.ts +44 -0
  88. package/corpus/core/src/review/registry.ts +99 -0
  89. package/corpus/core/src/review/store.ts +687 -0
  90. package/corpus/core/src/review/types.ts +97 -0
  91. package/corpus/core/src/server/action-discovery.ts +54 -0
  92. package/corpus/core/src/server/agent-engine-api-key-route.ts +5 -0
  93. package/corpus/core/src/server/credential-provider.ts +108 -0
  94. package/corpus/core/src/setup-connections/index.ts +89 -0
  95. package/corpus/core/src/setup-connections/onboarding.ts +47 -0
  96. package/corpus/core/src/transcription/builder-transcription.ts +9 -2
  97. package/corpus/core/src/vite/action-types-plugin.ts +52 -0
  98. package/corpus/templates/analytics/app/components/layout/Layout.tsx +2 -1
  99. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +2 -2
  100. package/corpus/templates/analytics/app/global.css +22 -10
  101. package/corpus/templates/analytics/app/i18n/zh-TW.ts +6 -1
  102. package/corpus/templates/analytics/app/i18n-data.ts +81 -13
  103. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +2 -2
  104. package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +2 -2
  105. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +528 -108
  106. package/corpus/templates/analytics/app/pages/sessions/SessionDevToolsPanel.tsx +466 -183
  107. package/corpus/templates/analytics/changelog/2026-07-07-session-replays-load-sooner-show-clearer-activity-timelines-.md +6 -0
  108. package/corpus/templates/brain/app/routes/settings.tsx +2 -2
  109. package/corpus/templates/calendar/app/components/calendar/AttendeeAutocomplete.tsx +32 -6
  110. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +120 -40
  111. package/corpus/templates/calendar/app/hooks/use-people.ts +55 -0
  112. package/corpus/templates/calendar/changelog/2026-07-07-guest-suggestions-now-find-coworkers-from-your-google-worksp.md +6 -0
  113. package/corpus/templates/calendar/changelog/2026-07-07-zoom-stays-selected-after-connecting-it-from-a-draft-event.md +6 -0
  114. package/corpus/templates/clips/actions/create-recording.ts +5 -1
  115. package/corpus/templates/clips/actions/finalize-recording.ts +140 -1
  116. package/corpus/templates/clips/actions/import-loom-recording.ts +1 -0
  117. package/corpus/templates/clips/actions/lib/ensure-seekable-video.ts +1 -0
  118. package/corpus/templates/clips/actions/request-transcript.ts +31 -0
  119. package/corpus/templates/clips/actions/set-thumbnail.ts +2 -0
  120. package/corpus/templates/clips/app/components/library/organization-switcher.tsx +2 -2
  121. package/corpus/templates/clips/app/components/player/scrubber-position.ts +9 -0
  122. package/corpus/templates/clips/app/components/player/scrubber.tsx +5 -2
  123. package/corpus/templates/clips/app/components/player/share-dialog.tsx +69 -41
  124. package/corpus/templates/clips/app/components/player/video-player.tsx +38 -1
  125. package/corpus/templates/clips/app/components/sharing/share-ui.tsx +3 -3
  126. package/corpus/templates/clips/app/components/sharing/slack-share-hint.tsx +9 -19
  127. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +9 -3
  128. package/corpus/templates/clips/app/routes/record.tsx +21 -12
  129. package/corpus/templates/clips/changelog/2026-07-02-recordings-now-wait-for-storage-media-to-serve-before-finishing.md +6 -0
  130. package/corpus/templates/clips/changelog/2026-07-07-a-pending-app-update-no-longer-blocks-screen-recording-updat.md +6 -0
  131. package/corpus/templates/clips/changelog/2026-07-07-chrome-extension-recordings-keep-audio-after-refreshing-tab.md +6 -0
  132. package/corpus/templates/clips/changelog/2026-07-07-clip-playback-progress-now-starts-and-finishes-at-the-right-times.md +6 -0
  133. package/corpus/templates/clips/changelog/2026-07-07-sharing-public-clips-now-stays-focused-on-the-normal-link-wi.md +6 -0
  134. package/corpus/templates/clips/chrome-extension/src/background.ts +18 -0
  135. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +23 -8
  136. package/corpus/templates/clips/desktop/src/app.tsx +40 -3
  137. package/corpus/templates/clips/desktop/src/hooks/useMediaDevices.ts +19 -7
  138. package/corpus/templates/clips/desktop/src/lib/permissions.ts +2 -0
  139. package/corpus/templates/clips/desktop/src/lib/updater.ts +25 -2
  140. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +7 -0
  141. package/corpus/templates/clips/server/routes/api/recordings/[recordingId]/thumbnail.post.ts +1 -0
  142. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/abort.post.ts +22 -5
  143. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +8 -0
  144. package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +13 -6
  145. package/corpus/templates/clips/shared/finalize-recovery.ts +12 -0
  146. package/corpus/templates/content/actions/delete-document.ts +337 -52
  147. package/corpus/templates/content/changelog/2026-07-07-permanently-deleting-trashed-databases-now-finishes-reliably.md +6 -0
  148. package/corpus/templates/slides/app/pages/DeckEditor.tsx +2 -2
  149. package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
  150. package/dist/agent/engine/ai-sdk-engine.js +15 -1
  151. package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
  152. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  153. package/dist/agent/engine/anthropic-engine.js +20 -1
  154. package/dist/agent/engine/anthropic-engine.js.map +1 -1
  155. package/dist/agent/engine/registry.d.ts.map +1 -1
  156. package/dist/agent/engine/registry.js +22 -14
  157. package/dist/agent/engine/registry.js.map +1 -1
  158. package/dist/agent/production-agent.d.ts.map +1 -1
  159. package/dist/agent/production-agent.js +27 -7
  160. package/dist/agent/production-agent.js.map +1 -1
  161. package/dist/client/command-navigation/index.d.ts +4 -0
  162. package/dist/client/command-navigation/index.d.ts.map +1 -0
  163. package/dist/client/command-navigation/index.js +4 -0
  164. package/dist/client/command-navigation/index.js.map +1 -0
  165. package/dist/client/comments-review/index.d.ts +2 -0
  166. package/dist/client/comments-review/index.d.ts.map +1 -0
  167. package/dist/client/comments-review/index.js +2 -0
  168. package/dist/client/comments-review/index.js.map +1 -0
  169. package/dist/client/history/VersionHistoryPanel.d.ts +18 -0
  170. package/dist/client/history/VersionHistoryPanel.d.ts.map +1 -0
  171. package/dist/client/history/VersionHistoryPanel.js +24 -0
  172. package/dist/client/history/VersionHistoryPanel.js.map +1 -0
  173. package/dist/client/history/index.d.ts +3 -0
  174. package/dist/client/history/index.d.ts.map +1 -0
  175. package/dist/client/history/index.js +3 -0
  176. package/dist/client/history/index.js.map +1 -0
  177. package/dist/client/history/use-history.d.ts +46 -0
  178. package/dist/client/history/use-history.d.ts.map +1 -0
  179. package/dist/client/history/use-history.js +18 -0
  180. package/dist/client/history/use-history.js.map +1 -0
  181. package/dist/client/index.d.ts +6 -4
  182. package/dist/client/index.d.ts.map +1 -1
  183. package/dist/client/index.js +6 -4
  184. package/dist/client/index.js.map +1 -1
  185. package/dist/client/org/OrgSwitcher.js +5 -5
  186. package/dist/client/org/OrgSwitcher.js.map +1 -1
  187. package/dist/client/org/RequireActiveOrg.js +2 -2
  188. package/dist/client/org/RequireActiveOrg.js.map +1 -1
  189. package/dist/client/org/TeamPage.js +3 -3
  190. package/dist/client/org/TeamPage.js.map +1 -1
  191. package/dist/client/org/hooks.d.ts +12 -1
  192. package/dist/client/org/hooks.d.ts.map +1 -1
  193. package/dist/client/org/hooks.js +15 -0
  194. package/dist/client/org/hooks.js.map +1 -1
  195. package/dist/client/org/index.d.ts +4 -2
  196. package/dist/client/org/index.d.ts.map +1 -1
  197. package/dist/client/org/index.js +3 -1
  198. package/dist/client/org/index.js.map +1 -1
  199. package/dist/client/org-team/index.d.ts +2 -0
  200. package/dist/client/org-team/index.d.ts.map +1 -0
  201. package/dist/client/org-team/index.js +2 -0
  202. package/dist/client/org-team/index.js.map +1 -0
  203. package/dist/client/review/ReviewStatusBadge.d.ts +7 -0
  204. package/dist/client/review/ReviewStatusBadge.d.ts.map +1 -0
  205. package/dist/client/review/ReviewStatusBadge.js +19 -0
  206. package/dist/client/review/ReviewStatusBadge.js.map +1 -0
  207. package/dist/client/review/ReviewThreadPanel.d.ts +20 -0
  208. package/dist/client/review/ReviewThreadPanel.d.ts.map +1 -0
  209. package/dist/client/review/ReviewThreadPanel.js +84 -0
  210. package/dist/client/review/ReviewThreadPanel.js.map +1 -0
  211. package/dist/client/review/index.d.ts +4 -0
  212. package/dist/client/review/index.d.ts.map +1 -0
  213. package/dist/client/review/index.js +4 -0
  214. package/dist/client/review/index.js.map +1 -0
  215. package/dist/client/review/use-review.d.ts +68 -0
  216. package/dist/client/review/use-review.d.ts.map +1 -0
  217. package/dist/client/review/use-review.js +22 -0
  218. package/dist/client/review/use-review.js.map +1 -0
  219. package/dist/client/settings/index.d.ts +1 -1
  220. package/dist/client/settings/index.d.ts.map +1 -1
  221. package/dist/client/settings/index.js +1 -1
  222. package/dist/client/settings/index.js.map +1 -1
  223. package/dist/client/setup-connections/BuilderConnectCard.d.ts +9 -0
  224. package/dist/client/setup-connections/BuilderConnectCard.d.ts.map +1 -0
  225. package/dist/client/setup-connections/BuilderConnectCard.js +25 -0
  226. package/dist/client/setup-connections/BuilderConnectCard.js.map +1 -0
  227. package/dist/client/setup-connections/ProviderReadinessBadge.d.ts +8 -0
  228. package/dist/client/setup-connections/ProviderReadinessBadge.d.ts.map +1 -0
  229. package/dist/client/setup-connections/ProviderReadinessBadge.js +32 -0
  230. package/dist/client/setup-connections/ProviderReadinessBadge.js.map +1 -0
  231. package/dist/client/setup-connections/SetupConnectionsPage.d.ts +17 -0
  232. package/dist/client/setup-connections/SetupConnectionsPage.d.ts.map +1 -0
  233. package/dist/client/setup-connections/SetupConnectionsPage.js +10 -0
  234. package/dist/client/setup-connections/SetupConnectionsPage.js.map +1 -0
  235. package/dist/client/setup-connections/index.d.ts +7 -0
  236. package/dist/client/setup-connections/index.d.ts.map +1 -0
  237. package/dist/client/setup-connections/index.js +7 -0
  238. package/dist/client/setup-connections/index.js.map +1 -0
  239. package/dist/client/sharing/ShareButton.d.ts +4 -4
  240. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  241. package/dist/client/sharing/ShareButton.js +13 -7
  242. package/dist/client/sharing/ShareButton.js.map +1 -1
  243. package/dist/client/sharing/ShareDialog.js +3 -3
  244. package/dist/client/sharing/ShareDialog.js.map +1 -1
  245. package/dist/collab/struct-routes.d.ts +1 -1
  246. package/dist/command-navigation/actions.d.ts +25 -0
  247. package/dist/command-navigation/actions.d.ts.map +1 -0
  248. package/dist/command-navigation/actions.js +64 -0
  249. package/dist/command-navigation/actions.js.map +1 -0
  250. package/dist/command-navigation/index.d.ts +4 -0
  251. package/dist/command-navigation/index.d.ts.map +1 -0
  252. package/dist/command-navigation/index.js +4 -0
  253. package/dist/command-navigation/index.js.map +1 -0
  254. package/dist/comments-review/index.d.ts +2 -0
  255. package/dist/comments-review/index.d.ts.map +1 -0
  256. package/dist/comments-review/index.js +2 -0
  257. package/dist/comments-review/index.js.map +1 -0
  258. package/dist/file-upload/builder.d.ts.map +1 -1
  259. package/dist/file-upload/builder.js +18 -2
  260. package/dist/file-upload/builder.js.map +1 -1
  261. package/dist/file-upload/types.d.ts +3 -0
  262. package/dist/file-upload/types.d.ts.map +1 -1
  263. package/dist/file-upload/types.js.map +1 -1
  264. package/dist/history/actions/create-resource-version.d.ts +10 -0
  265. package/dist/history/actions/create-resource-version.d.ts.map +1 -0
  266. package/dist/history/actions/create-resource-version.js +65 -0
  267. package/dist/history/actions/create-resource-version.js.map +1 -0
  268. package/dist/history/actions/get-resource-version.d.ts +10 -0
  269. package/dist/history/actions/get-resource-version.d.ts.map +1 -0
  270. package/dist/history/actions/get-resource-version.js +38 -0
  271. package/dist/history/actions/get-resource-version.js.map +1 -0
  272. package/dist/history/actions/list-resource-history.d.ts +10 -0
  273. package/dist/history/actions/list-resource-history.d.ts.map +1 -0
  274. package/dist/history/actions/list-resource-history.js +45 -0
  275. package/dist/history/actions/list-resource-history.js.map +1 -0
  276. package/dist/history/actions/list-resource-versions.d.ts +10 -0
  277. package/dist/history/actions/list-resource-versions.d.ts.map +1 -0
  278. package/dist/history/actions/list-resource-versions.js +35 -0
  279. package/dist/history/actions/list-resource-versions.js.map +1 -0
  280. package/dist/history/actions/restore-resource-version.d.ts +11 -0
  281. package/dist/history/actions/restore-resource-version.d.ts.map +1 -0
  282. package/dist/history/actions/restore-resource-version.js +59 -0
  283. package/dist/history/actions/restore-resource-version.js.map +1 -0
  284. package/dist/history/index.d.ts +4 -0
  285. package/dist/history/index.d.ts.map +1 -0
  286. package/dist/history/index.js +3 -0
  287. package/dist/history/index.js.map +1 -0
  288. package/dist/history/registry.d.ts +10 -0
  289. package/dist/history/registry.d.ts.map +1 -0
  290. package/dist/history/registry.js +61 -0
  291. package/dist/history/registry.js.map +1 -0
  292. package/dist/history/store.d.ts +34 -0
  293. package/dist/history/store.d.ts.map +1 -0
  294. package/dist/history/store.js +265 -0
  295. package/dist/history/store.js.map +1 -0
  296. package/dist/history/types.d.ts +55 -0
  297. package/dist/history/types.d.ts.map +1 -0
  298. package/dist/history/types.js +2 -0
  299. package/dist/history/types.js.map +1 -0
  300. package/dist/index.d.ts +6 -0
  301. package/dist/index.d.ts.map +1 -1
  302. package/dist/index.js +6 -0
  303. package/dist/index.js.map +1 -1
  304. package/dist/navigation/index.d.ts +53 -0
  305. package/dist/navigation/index.d.ts.map +1 -0
  306. package/dist/navigation/index.js +105 -0
  307. package/dist/navigation/index.js.map +1 -0
  308. package/dist/org/index.d.ts +1 -0
  309. package/dist/org/index.d.ts.map +1 -1
  310. package/dist/org/index.js +1 -0
  311. package/dist/org/index.js.map +1 -1
  312. package/dist/org/permissions.d.ts +7 -0
  313. package/dist/org/permissions.d.ts.map +1 -0
  314. package/dist/org/permissions.js +21 -0
  315. package/dist/org/permissions.js.map +1 -0
  316. package/dist/org-team/index.d.ts +2 -0
  317. package/dist/org-team/index.d.ts.map +1 -0
  318. package/dist/org-team/index.js +2 -0
  319. package/dist/org-team/index.js.map +1 -0
  320. package/dist/private-blob/registry.d.ts.map +1 -1
  321. package/dist/private-blob/registry.js +1 -0
  322. package/dist/private-blob/registry.js.map +1 -1
  323. package/dist/resources/handlers.d.ts +2 -2
  324. package/dist/review/actions/consume-review-feedback.d.ts +9 -0
  325. package/dist/review/actions/consume-review-feedback.d.ts.map +1 -0
  326. package/dist/review/actions/consume-review-feedback.js +29 -0
  327. package/dist/review/actions/consume-review-feedback.js.map +1 -0
  328. package/dist/review/actions/create-review-comment.d.ts +18 -0
  329. package/dist/review/actions/create-review-comment.d.ts.map +1 -0
  330. package/dist/review/actions/create-review-comment.js +81 -0
  331. package/dist/review/actions/create-review-comment.js.map +1 -0
  332. package/dist/review/actions/delete-review-comment.d.ts +10 -0
  333. package/dist/review/actions/delete-review-comment.d.ts.map +1 -0
  334. package/dist/review/actions/delete-review-comment.js +45 -0
  335. package/dist/review/actions/delete-review-comment.js.map +1 -0
  336. package/dist/review/actions/get-review-feedback.d.ts +10 -0
  337. package/dist/review/actions/get-review-feedback.d.ts.map +1 -0
  338. package/dist/review/actions/get-review-feedback.js +45 -0
  339. package/dist/review/actions/get-review-feedback.js.map +1 -0
  340. package/dist/review/actions/list-review-comments.d.ts +13 -0
  341. package/dist/review/actions/list-review-comments.d.ts.map +1 -0
  342. package/dist/review/actions/list-review-comments.js +44 -0
  343. package/dist/review/actions/list-review-comments.js.map +1 -0
  344. package/dist/review/actions/reply-review-comment.d.ts +16 -0
  345. package/dist/review/actions/reply-review-comment.d.ts.map +1 -0
  346. package/dist/review/actions/reply-review-comment.js +84 -0
  347. package/dist/review/actions/reply-review-comment.js.map +1 -0
  348. package/dist/review/actions/resolve-review-thread.d.ts +11 -0
  349. package/dist/review/actions/resolve-review-thread.d.ts.map +1 -0
  350. package/dist/review/actions/resolve-review-thread.js +46 -0
  351. package/dist/review/actions/resolve-review-thread.js.map +1 -0
  352. package/dist/review/actions/set-review-status.d.ts +9 -0
  353. package/dist/review/actions/set-review-status.d.ts.map +1 -0
  354. package/dist/review/actions/set-review-status.js +43 -0
  355. package/dist/review/actions/set-review-status.js.map +1 -0
  356. package/dist/review/index.d.ts +5 -0
  357. package/dist/review/index.d.ts.map +1 -0
  358. package/dist/review/index.js +4 -0
  359. package/dist/review/index.js.map +1 -0
  360. package/dist/review/mentions.d.ts +4 -0
  361. package/dist/review/mentions.d.ts.map +1 -0
  362. package/dist/review/mentions.js +39 -0
  363. package/dist/review/mentions.js.map +1 -0
  364. package/dist/review/registry.d.ts +10 -0
  365. package/dist/review/registry.d.ts.map +1 -0
  366. package/dist/review/registry.js +61 -0
  367. package/dist/review/registry.js.map +1 -0
  368. package/dist/review/store.d.ts +63 -0
  369. package/dist/review/store.d.ts.map +1 -0
  370. package/dist/review/store.js +558 -0
  371. package/dist/review/store.js.map +1 -0
  372. package/dist/review/types.d.ts +77 -0
  373. package/dist/review/types.d.ts.map +1 -0
  374. package/dist/review/types.js +2 -0
  375. package/dist/review/types.js.map +1 -0
  376. package/dist/server/action-discovery.d.ts.map +1 -1
  377. package/dist/server/action-discovery.js +54 -0
  378. package/dist/server/action-discovery.js.map +1 -1
  379. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  380. package/dist/server/agent-engine-api-key-route.d.ts.map +1 -1
  381. package/dist/server/agent-engine-api-key-route.js +5 -0
  382. package/dist/server/agent-engine-api-key-route.js.map +1 -1
  383. package/dist/server/credential-provider.d.ts +26 -0
  384. package/dist/server/credential-provider.d.ts.map +1 -1
  385. package/dist/server/credential-provider.js +82 -0
  386. package/dist/server/credential-provider.js.map +1 -1
  387. package/dist/setup-connections/index.d.ts +6 -0
  388. package/dist/setup-connections/index.d.ts.map +1 -0
  389. package/dist/setup-connections/index.js +6 -0
  390. package/dist/setup-connections/index.js.map +1 -0
  391. package/dist/setup-connections/onboarding.d.ts +14 -0
  392. package/dist/setup-connections/onboarding.d.ts.map +1 -0
  393. package/dist/setup-connections/onboarding.js +23 -0
  394. package/dist/setup-connections/onboarding.js.map +1 -0
  395. package/dist/transcription/builder-transcription.d.ts +1 -0
  396. package/dist/transcription/builder-transcription.d.ts.map +1 -1
  397. package/dist/transcription/builder-transcription.js +5 -2
  398. package/dist/transcription/builder-transcription.js.map +1 -1
  399. package/dist/vite/action-types-plugin.d.ts.map +1 -1
  400. package/dist/vite/action-types-plugin.js +52 -0
  401. package/dist/vite/action-types-plugin.js.map +1 -1
  402. package/docs/content/agent-native-toolkit.mdx +87 -80
  403. package/docs/content/locales/ar-SA/agent-native-toolkit.mdx +89 -80
  404. package/docs/content/locales/de-DE/agent-native-toolkit.mdx +89 -80
  405. package/docs/content/locales/es-ES/agent-native-toolkit.mdx +89 -80
  406. package/docs/content/locales/fr-FR/agent-native-toolkit.mdx +89 -80
  407. package/docs/content/locales/hi-IN/agent-native-toolkit.mdx +89 -80
  408. package/docs/content/locales/ja-JP/agent-native-toolkit.mdx +89 -80
  409. package/docs/content/locales/ko-KR/agent-native-toolkit.mdx +89 -80
  410. package/docs/content/locales/pt-BR/agent-native-toolkit.mdx +89 -80
  411. package/docs/content/locales/zh-CN/agent-native-toolkit.mdx +89 -80
  412. package/docs/content/locales/zh-TW/agent-native-toolkit.mdx +89 -80
  413. package/docs/content/toolkit-agent-ux.mdx +43 -0
  414. package/docs/content/toolkit-app-adapters.mdx +9 -0
  415. package/docs/content/toolkit-collaboration-ui.mdx +12 -0
  416. package/docs/content/toolkit-collaboration.mdx +74 -0
  417. package/docs/content/toolkit-command-navigation.mdx +106 -0
  418. package/docs/content/toolkit-comments-review.mdx +98 -0
  419. package/docs/content/toolkit-history.mdx +95 -0
  420. package/docs/content/toolkit-observability.mdx +41 -0
  421. package/docs/content/toolkit-org-team.mdx +80 -0
  422. package/docs/content/toolkit-resources.mdx +57 -0
  423. package/docs/content/toolkit-settings.mdx +65 -0
  424. package/docs/content/toolkit-setup-connections.mdx +109 -0
  425. package/docs/content/toolkit-sharing-ui.mdx +18 -6
  426. package/docs/content/toolkit-sharing.mdx +81 -0
  427. package/docs/content/toolkit-shell-hooks.mdx +9 -0
  428. package/docs/content/toolkit-ui.mdx +9 -0
  429. package/package.json +36 -2
@@ -8,7 +8,7 @@ import {
8
8
  IconChevronDown,
9
9
  IconCheck,
10
10
  IconPlus,
11
- IconBuilding,
11
+ IconUsersGroup,
12
12
  } from "@tabler/icons-react";
13
13
  import { useState } from "react";
14
14
  import { toast } from "sonner";
@@ -86,7 +86,7 @@ export function OrganizationSwitcher({ className }: OrganizationSwitcherProps) {
86
86
  </DropdownMenuLabel>
87
87
  {orgs.length === 0 && (
88
88
  <DropdownMenuItem disabled>
89
- <IconBuilding className="h-3.5 w-3.5 me-2" />
89
+ <IconUsersGroup className="h-3.5 w-3.5 me-2" />
90
90
  <span className="text-xs">
91
91
  {t("organizationSwitcher.noOrganizations")}
92
92
  </span>
@@ -12,3 +12,12 @@ export function scrubberPositionFromClientX(
12
12
  const ratio = rect.width > 0 ? x / rect.width : 0;
13
13
  return { ms: Math.floor(ratio * durationMs), x };
14
14
  }
15
+
16
+ export function scrubberFillPercent(
17
+ currentMs: number,
18
+ durationMs: number,
19
+ ): number {
20
+ if (!Number.isFinite(currentMs) || !Number.isFinite(durationMs)) return 0;
21
+ if (durationMs <= 0) return 0;
22
+ return Math.max(0, Math.min(100, (currentMs / durationMs) * 100));
23
+ }
@@ -2,7 +2,10 @@ import { useMemo, useRef, useState } from "react";
2
2
 
3
3
  import { cn } from "@/lib/utils";
4
4
 
5
- import { scrubberPositionFromClientX } from "./scrubber-position";
5
+ import {
6
+ scrubberFillPercent,
7
+ scrubberPositionFromClientX,
8
+ } from "./scrubber-position";
6
9
 
7
10
  export interface ScrubberProps {
8
11
  currentMs: number;
@@ -35,7 +38,7 @@ export function Scrubber(props: ScrubberProps) {
35
38
  | null
36
39
  >(null);
37
40
 
38
- const pct = durationMs > 0 ? (currentMs / durationMs) * 100 : 0;
41
+ const pct = scrubberFillPercent(currentMs, durationMs);
39
42
 
40
43
  const recentReactions = useMemo(
41
44
  () => (reactions ? reactions.slice(-50) : []),
@@ -7,6 +7,7 @@ import {
7
7
  } from "@agent-native/core/client";
8
8
  import {
9
9
  IconCode,
10
+ IconChevronDown,
10
11
  IconExternalLink,
11
12
  IconLink,
12
13
  IconMail,
@@ -34,6 +35,11 @@ import {
34
35
  } from "@/components/sharing/share-ui";
35
36
  import { SlackShareHint } from "@/components/sharing/slack-share-hint";
36
37
  import { Button } from "@/components/ui/button";
38
+ import {
39
+ Collapsible,
40
+ CollapsibleContent,
41
+ CollapsibleTrigger,
42
+ } from "@/components/ui/collapsible";
37
43
  import { Dialog, DialogContent, DialogTitle } from "@/components/ui/dialog";
38
44
  import { Input } from "@/components/ui/input";
39
45
  import { Label } from "@/components/ui/label";
@@ -87,7 +93,6 @@ export function ShareRecordingPopover({
87
93
  videoUrl,
88
94
  animatedThumbnailUrl,
89
95
  isLoomRecording = false,
90
- hasPassword = false,
91
96
  children,
92
97
  open,
93
98
  onOpenChange,
@@ -106,7 +111,6 @@ export function ShareRecordingPopover({
106
111
  videoUrl={videoUrl}
107
112
  animatedThumbnailUrl={animatedThumbnailUrl}
108
113
  isLoomRecording={isLoomRecording}
109
- hasPassword={hasPassword}
110
114
  />
111
115
  </PopoverContent>
112
116
  </Popover>
@@ -124,7 +128,6 @@ export function ShareRecordingDialog({
124
128
  videoUrl,
125
129
  animatedThumbnailUrl,
126
130
  isLoomRecording = false,
127
- hasPassword = false,
128
131
  open,
129
132
  onOpenChange,
130
133
  }: ShareRecordingDialogProps) {
@@ -143,7 +146,6 @@ export function ShareRecordingDialog({
143
146
  videoUrl={videoUrl}
144
147
  animatedThumbnailUrl={animatedThumbnailUrl}
145
148
  isLoomRecording={isLoomRecording}
146
- hasPassword={hasPassword}
147
149
  reserveCloseButton
148
150
  />
149
151
  </DialogContent>
@@ -157,7 +159,6 @@ function ShareRecordingContent({
157
159
  videoUrl,
158
160
  animatedThumbnailUrl,
159
161
  isLoomRecording = false,
160
- hasPassword = false,
161
162
  reserveCloseButton = false,
162
163
  }: {
163
164
  recordingId: string;
@@ -165,7 +166,6 @@ function ShareRecordingContent({
165
166
  videoUrl?: string | null;
166
167
  animatedThumbnailUrl?: string | null;
167
168
  isLoomRecording?: boolean;
168
- hasPassword?: boolean;
169
169
  reserveCloseButton?: boolean;
170
170
  }) {
171
171
  const t = useT();
@@ -230,7 +230,6 @@ function ShareRecordingContent({
230
230
  videoUrl={videoUrl}
231
231
  animatedThumbnailUrl={animatedThumbnailUrl}
232
232
  isLoomRecording={isLoomRecording}
233
- hasPassword={hasPassword}
234
233
  />
235
234
  </TabsContent>
236
235
 
@@ -269,7 +268,6 @@ function LinkTab({
269
268
  videoUrl,
270
269
  animatedThumbnailUrl,
271
270
  isLoomRecording: isLoomRecordingProp,
272
- hasPassword,
273
271
  }: {
274
272
  recordingId: string;
275
273
  shareUrl: string;
@@ -278,7 +276,6 @@ function LinkTab({
278
276
  videoUrl?: string | null;
279
277
  animatedThumbnailUrl?: string | null;
280
278
  isLoomRecording?: boolean;
281
- hasPassword: boolean;
282
279
  }) {
283
280
  const t = useT();
284
281
  const { setResourceVisibility, isPending } = useResourceVisibilityMutation(
@@ -299,6 +296,7 @@ function LinkTab({
299
296
  const agentLinkRequestIdRef = useRef(0);
300
297
  const [agentContextUrl, setAgentContextUrl] = useState("");
301
298
  const [agentLinkError, setAgentLinkError] = useState(false);
299
+ const [agentShareOpen, setAgentShareOpen] = useState(false);
302
300
 
303
301
  useEffect(() => {
304
302
  createAgentLinkAsyncRef.current = createAgentLink.mutateAsync;
@@ -333,12 +331,21 @@ function LinkTab({
333
331
  setAgentLinkError(false);
334
332
  if (!sharesLoaded) return;
335
333
 
336
- void loadAgentContextUrl();
334
+ if (!isPublic && agentShareOpen) {
335
+ void loadAgentContextUrl();
336
+ }
337
337
 
338
338
  return () => {
339
339
  agentLinkRequestIdRef.current += 1;
340
340
  };
341
- }, [recordingId, visibility, sharesLoaded, loadAgentContextUrl]);
341
+ }, [
342
+ agentShareOpen,
343
+ isPublic,
344
+ loadAgentContextUrl,
345
+ recordingId,
346
+ sharesLoaded,
347
+ visibility,
348
+ ]);
342
349
 
343
350
  const agentShareDisabled =
344
351
  isPending || createAgentLink.isPending || !agentContextUrl;
@@ -366,41 +373,62 @@ function LinkTab({
366
373
  (and a connect link) instead of leaving it buried in Settings. */}
367
374
  {isPublic ? <SlackShareHint canManage={canManage} /> : null}
368
375
 
369
- <div className="space-y-2">
370
- <CopyField
371
- label={t("shareDialog.shareWithAgents")}
372
- value={agentContextUrl}
373
- disabled={agentShareDisabled}
374
- />
375
- {agentLinkError ? (
376
- <div className="flex items-center justify-between gap-2 rounded-md border border-border bg-muted/40 px-3 py-2">
377
- <p className="text-xs text-muted-foreground">
378
- {t("shareDialog.agentLinkUnavailable")}
379
- </p>
376
+ {!isPublic ? (
377
+ <Collapsible open={agentShareOpen} onOpenChange={setAgentShareOpen}>
378
+ <CollapsibleTrigger asChild>
380
379
  <Button
381
380
  type="button"
382
381
  variant="ghost"
383
- size="sm"
384
- className="h-7"
385
- onClick={() => void loadAgentContextUrl()}
386
- disabled={createAgentLink.isPending}
382
+ className="h-auto w-full justify-between px-0 py-1 text-left hover:bg-transparent"
387
383
  >
388
- {t("shareDialog.retryAgentLink")}
384
+ <span className="min-w-0">
385
+ <span className="block text-xs font-medium text-foreground">
386
+ {t("shareDialog.shareWithAgents")}
387
+ </span>
388
+ <span className="mt-0.5 block text-xs font-normal text-muted-foreground">
389
+ {t("shareDialog.agentTokenDescription")}
390
+ </span>
391
+ </span>
392
+ <IconChevronDown
393
+ className={`h-4 w-4 shrink-0 text-muted-foreground transition-transform ${
394
+ agentShareOpen ? "rotate-180" : ""
395
+ }`}
396
+ aria-hidden
397
+ />
389
398
  </Button>
390
- </div>
391
- ) : null}
392
- </div>
393
-
394
- <CopyField
395
- label={t("shareDialog.copyAgentPrompt")}
396
- value={agentPrompt}
397
- disabled={agentShareDisabled}
398
- />
399
-
400
- {agentContextUrl || hasPassword || !isPublic ? (
401
- <p className="text-xs text-muted-foreground">
402
- {t("shareDialog.agentTokenDescription")}
403
- </p>
399
+ </CollapsibleTrigger>
400
+ <CollapsibleContent className="pt-2">
401
+ <div className="space-y-3 rounded-md border border-border bg-muted/30 p-3">
402
+ <CopyField
403
+ label={t("shareDialog.shareWithAgents")}
404
+ value={agentContextUrl}
405
+ disabled={agentShareDisabled}
406
+ />
407
+ {agentLinkError ? (
408
+ <div className="flex items-center justify-between gap-2 rounded-md border border-border bg-background px-3 py-2">
409
+ <p className="text-xs text-muted-foreground">
410
+ {t("shareDialog.agentLinkUnavailable")}
411
+ </p>
412
+ <Button
413
+ type="button"
414
+ variant="ghost"
415
+ size="sm"
416
+ className="h-7"
417
+ onClick={() => void loadAgentContextUrl()}
418
+ disabled={createAgentLink.isPending}
419
+ >
420
+ {t("shareDialog.retryAgentLink")}
421
+ </Button>
422
+ </div>
423
+ ) : null}
424
+ <CopyField
425
+ label={t("shareDialog.copyAgentPrompt")}
426
+ value={agentPrompt}
427
+ disabled={agentShareDisabled}
428
+ />
429
+ </div>
430
+ </CollapsibleContent>
431
+ </Collapsible>
404
432
  ) : null}
405
433
 
406
434
  {!isPublic && canManage ? (
@@ -464,6 +464,21 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
464
464
  bumpControls();
465
465
  setPlayError(null);
466
466
 
467
+ if (
468
+ initialVisibleFrameSeekedRef.current &&
469
+ !hasPlaybackStarted &&
470
+ (!startMs || startMs <= 0) &&
471
+ v.currentTime > 0.05
472
+ ) {
473
+ try {
474
+ v.currentTime = 0;
475
+ setCurrentMs(0);
476
+ } catch {
477
+ // If the browser refuses the rewind, continue with the normal play
478
+ // attempt; playback is still better than blocking on a cosmetic seek.
479
+ }
480
+ }
481
+
467
482
  // A <video> element left in an error state (network/decode/unsupported
468
483
  // format) will just re-reject on `.play()` forever — it needs `.load()`
469
484
  // to reset `readyState`/`error` and re-fetch the source before playback
@@ -497,7 +512,9 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
497
512
  attachPlayPromise,
498
513
  bumpControls,
499
514
  currentMs,
515
+ hasPlaybackStarted,
500
516
  rejectPlayAttempt,
517
+ startMs,
501
518
  ]);
502
519
 
503
520
  const retryPendingPlay = useCallback(
@@ -858,7 +875,6 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
858
875
  initialVisibleFrameSeekedRef.current = true;
859
876
  try {
860
877
  v.currentTime = visibleMs / 1000;
861
- setCurrentMs(visibleMs);
862
878
  return true;
863
879
  } catch {
864
880
  return false;
@@ -1142,6 +1158,17 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
1142
1158
  const ct =
1143
1159
  Number.isFinite(raw) && raw >= 0 && raw < 1e7 ? raw : 0;
1144
1160
  const ms = Math.floor(ct * 1000);
1161
+ if (
1162
+ initialVisibleFrameSeekedRef.current &&
1163
+ !hasPlaybackStarted &&
1164
+ !playAttemptPendingRef.current &&
1165
+ v.paused &&
1166
+ (!startMs || startMs <= 0)
1167
+ ) {
1168
+ setCurrentMs(0);
1169
+ onTimeUpdate?.(0, resolvedDurationMs);
1170
+ return;
1171
+ }
1145
1172
  const visibleMs = clampSeek(
1146
1173
  skipExcludedRange(ms, excludedRanges, resolvedDurationMs),
1147
1174
  v,
@@ -1169,10 +1196,20 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
1169
1196
  onTimeUpdate?.(ms, resolvedDurationMs);
1170
1197
  }}
1171
1198
  onEnded={() => {
1199
+ const endedMs =
1200
+ resolvedDurationMs > 0
1201
+ ? resolvedDurationMs
1202
+ : videoRef.current &&
1203
+ Number.isFinite(videoRef.current.duration) &&
1204
+ videoRef.current.duration > 0
1205
+ ? Math.round(videoRef.current.duration * 1000)
1206
+ : currentMs;
1207
+ setCurrentMs(endedMs);
1172
1208
  setIsPlaying(false);
1173
1209
  setIsPlayPending(false);
1174
1210
  setIsBuffering(false);
1175
1211
  setIsPreparing(false);
1212
+ onTimeUpdate?.(endedMs, resolvedDurationMs);
1176
1213
  onEnded?.();
1177
1214
  }}
1178
1215
  onError={(e) => {
@@ -4,11 +4,11 @@ import {
4
4
  useT,
5
5
  } from "@agent-native/core/client";
6
6
  import {
7
- IconBuilding,
8
7
  IconCheck,
9
8
  IconCopy,
10
9
  IconLock,
11
10
  IconTrash,
11
+ IconUsersGroup,
12
12
  IconWorld,
13
13
  } from "@tabler/icons-react";
14
14
  import { useQueryClient } from "@tanstack/react-query";
@@ -55,7 +55,7 @@ export const VIS_META: Record<Visibility, { Icon: typeof IconLock }> = {
55
55
  Icon: IconLock,
56
56
  },
57
57
  org: {
58
- Icon: IconBuilding,
58
+ Icon: IconUsersGroup,
59
59
  },
60
60
  public: {
61
61
  Icon: IconWorld,
@@ -308,7 +308,7 @@ export function Avatar({ label, org }: { label: string; org?: boolean }) {
308
308
  className="inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-muted text-[11px] font-semibold text-muted-foreground"
309
309
  >
310
310
  {org ? (
311
- <IconBuilding size={14} strokeWidth={1.75} />
311
+ <IconUsersGroup size={14} strokeWidth={1.75} />
312
312
  ) : (
313
313
  (label.split("@")[0]?.[0] ?? label[0] ?? "?").toUpperCase()
314
314
  )}
@@ -35,16 +35,11 @@ export function SlackShareHint({ canManage }: { canManage: boolean }) {
35
35
 
36
36
  if (connected) {
37
37
  return (
38
- <div className="flex items-center gap-2.5 rounded-md border border-border bg-muted/40 px-3 py-2">
38
+ <div className="flex items-center gap-2 rounded-md bg-muted/35 px-2.5 py-1.5 text-xs text-muted-foreground">
39
39
  <IconBrandSlack className="h-4 w-4 shrink-0 text-muted-foreground" />
40
- <div className="min-w-0">
41
- <div className="text-xs font-medium">
42
- {t("slackShareHint.playsInline")}
43
- </div>
44
- <p className="text-[11px] text-muted-foreground">
45
- {t("slackShareHint.connectedDescription")}
46
- </p>
47
- </div>
40
+ <span className="min-w-0 truncate">
41
+ {t("slackShareHint.playsInline")}
42
+ </span>
48
43
  </div>
49
44
  );
50
45
  }
@@ -59,18 +54,13 @@ export function SlackShareHint({ canManage }: { canManage: boolean }) {
59
54
  return (
60
55
  <a
61
56
  href={appPath("/settings#slack")}
62
- className="flex items-center gap-2.5 rounded-md border border-border px-3 py-2 transition-colors hover:bg-muted/50"
57
+ className="flex items-center gap-2 rounded-md bg-muted/35 px-2.5 py-1.5 text-xs text-muted-foreground transition-colors hover:bg-muted/55"
63
58
  >
64
59
  <IconBrandSlack className="h-4 w-4 shrink-0 text-muted-foreground" />
65
- <div className="min-w-0 flex-1">
66
- <div className="text-xs font-medium">
67
- {t("slackShareHint.makeInline")}
68
- </div>
69
- <p className="text-[11px] text-muted-foreground">
70
- {t("slackShareHint.connectDescription")}
71
- </p>
72
- </div>
73
- <span className="shrink-0 text-xs font-medium text-primary">
60
+ <span className="min-w-0 flex-1 truncate">
61
+ {t("slackShareHint.makeInline")}
62
+ </span>
63
+ <span className="shrink-0 font-medium text-primary">
74
64
  {t("slackShareHint.connect")}
75
65
  </span>
76
66
  </a>
@@ -14,6 +14,7 @@ import {
14
14
  BUILDER_CREDITS_UPGRADE_URL,
15
15
  type BuilderCreditsStatus,
16
16
  } from "@shared/builder-credits";
17
+ import { isStoredButUnservableFinalizeError } from "@shared/finalize-recovery";
17
18
  import {
18
19
  isLoomEmbedBackedRecording,
19
20
  isLoomRecordingSource,
@@ -635,6 +636,8 @@ export default function RecordingPage() {
635
636
  const rawFailureReason =
636
637
  ((recording as any).failureReason as string | null | undefined) ?? null;
637
638
  const waitingForStorage = isStorageSetupFailureReason(rawFailureReason);
639
+ const storedButUnservableFailure =
640
+ isStoredButUnservableFinalizeError(rawFailureReason);
638
641
  const loomStorageSetupFailure = waitingForStorage && isLoomRecording;
639
642
  const nativeSaveFailed =
640
643
  searchParams.get("saveFailed") === "1" ||
@@ -646,13 +649,16 @@ export default function RecordingPage() {
646
649
  const isFailure =
647
650
  explicitFailure || stuckFailure || waitingForStorage || nativeSaveFailed;
648
651
  const displayReason = explicitFailure
649
- ? (rawFailureReason ?? t("recordingPage.retryLibrary"))
652
+ ? storedButUnservableFailure
653
+ ? t("recordingPage.clipDataPreserved")
654
+ : (rawFailureReason ?? t("recordingPage.retryLibrary"))
650
655
  : nativeSaveFailed
651
656
  ? nativeSaveFailureMessage(rawFailureReason)
652
657
  : stuckFailure
653
658
  ? t("recordingPage.processingStuck", { status: recording.status })
654
659
  : t("recordingPage.uploadingAssembling");
655
660
  const storageSetupFailure = waitingForStorage;
661
+ const canRetryFinalize = storageSetupFailure || storedButUnservableFailure;
656
662
  const label = storageSetupFailure
657
663
  ? loomStorageSetupFailure
658
664
  ? t("recordingPage.connectStorageImportLoom")
@@ -744,7 +750,7 @@ export default function RecordingPage() {
744
750
  <div className="flex items-center gap-2">
745
751
  <Button
746
752
  onClick={() => {
747
- if (storageSetupFailure) {
753
+ if (canRetryFinalize) {
748
754
  void retryFinalizeAfterStorage();
749
755
  return;
750
756
  }
@@ -755,7 +761,7 @@ export default function RecordingPage() {
755
761
  size="sm"
756
762
  disabled={retryingFinalize}
757
763
  >
758
- {storageSetupFailure
764
+ {canRetryFinalize
759
765
  ? loomStorageSetupFailure
760
766
  ? t("recordingPage.retryImport")
761
767
  : t("recordingPage.retryUpload")
@@ -7,7 +7,10 @@ import {
7
7
  } from "@agent-native/core/client";
8
8
  import { useLiveTranscription } from "@agent-native/core/client/transcription/use-live-transcription";
9
9
  import type { BrowserDiagnosticsData } from "@shared/browser-diagnostics";
10
- import { waitForReadyRecordingAfterFinalizeError } from "@shared/finalize-recovery";
10
+ import {
11
+ isStoredButUnservableFinalizeError,
12
+ waitForReadyRecordingAfterFinalizeError,
13
+ } from "@shared/finalize-recovery";
11
14
  import {
12
15
  chunkUploadUrl,
13
16
  pickMimeType,
@@ -1814,7 +1817,9 @@ export default function RecordRoute() {
1814
1817
  : undefined;
1815
1818
  const serverRejectedTooLarge =
1816
1819
  status === 413 || isUploadSizeError(message);
1817
- if (createdId && !serverRejectedTooLarge) {
1820
+ const preserveBufferedChunks =
1821
+ isStoredButUnservableFinalizeError(message);
1822
+ if (createdId && !serverRejectedTooLarge && !preserveBufferedChunks) {
1818
1823
  fetch(`${appBasePath()}/api/uploads/${createdId}/abort`, {
1819
1824
  method: "POST",
1820
1825
  headers: { "Content-Type": "application/json" },
@@ -2127,11 +2132,13 @@ export default function RecordRoute() {
2127
2132
  return;
2128
2133
  }
2129
2134
  await saveBrowserDiagnostics(pending.id);
2130
- fetch(pending.abortUrl, {
2131
- method: "POST",
2132
- headers: { "Content-Type": "application/json" },
2133
- body: JSON.stringify({ reason: message }),
2134
- }).catch(() => {});
2135
+ if (!isStoredButUnservableFinalizeError(message)) {
2136
+ fetch(pending.abortUrl, {
2137
+ method: "POST",
2138
+ headers: { "Content-Type": "application/json" },
2139
+ body: JSON.stringify({ reason: message }),
2140
+ }).catch(() => {});
2141
+ }
2135
2142
  setError(message);
2136
2143
  setUiState("error");
2137
2144
  toast.error(t("recordRoute.uploadFailed"), {
@@ -2162,11 +2169,13 @@ export default function RecordRoute() {
2162
2169
  }
2163
2170
  const message =
2164
2171
  err instanceof Error ? err.message : t("recordRoute.uploadFailed");
2165
- fetch(pending.abortUrl, {
2166
- method: "POST",
2167
- headers: { "Content-Type": "application/json" },
2168
- body: JSON.stringify({ reason: message }),
2169
- }).catch(() => {});
2172
+ if (!isStoredButUnservableFinalizeError(message)) {
2173
+ fetch(pending.abortUrl, {
2174
+ method: "POST",
2175
+ headers: { "Content-Type": "application/json" },
2176
+ body: JSON.stringify({ reason: message }),
2177
+ }).catch(() => {});
2178
+ }
2170
2179
  setCompressionProgress(null);
2171
2180
  setUploadProgress(null);
2172
2181
  setError(message);
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-02
4
+ ---
5
+
6
+ Recordings now wait for uploaded media to play from storage before finishing, and playback falls back when a compressed storage copy is temporarily broken.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-07
4
+ ---
5
+
6
+ A pending app update no longer blocks screen recording — updates now install when you restart, not mid-session
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-07
4
+ ---
5
+
6
+ Chrome extension recordings now survive refreshing the tab being recorded: the camera bubble and recording toolbar reappear, and tab audio and microphone sound keep recording.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-07
4
+ ---
5
+
6
+ Clip playback progress now starts at the beginning and reaches the end reliably.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-07
4
+ ---
5
+
6
+ Sharing public clips now stays focused on the normal link, with agent links tucked away for private clips only.
@@ -2318,6 +2318,24 @@ chrome.tabs.onActivated.addListener((info) => {
2318
2318
  })();
2319
2319
  });
2320
2320
 
2321
+ // The overlay content script is injected on demand (activeTab), so reloading the
2322
+ // launch tab wipes it — the camera bubble and toolbar would vanish for the rest
2323
+ // of the recording even though capture keeps running in the offscreen document.
2324
+ // Re-inject and re-mount once the launch tab finishes reloading while a recording
2325
+ // is active. Scoped to the launch tab (the only tab activeTab lets us touch); a
2326
+ // same-URL reload keeps that grant.
2327
+ chrome.tabs.onUpdated.addListener((tabId, changeInfo) => {
2328
+ if (changeInfo.status !== "complete") return;
2329
+ void (async () => {
2330
+ await ensureRestored();
2331
+ if (overlayPhase === "idle" || !activeNativeRecording) return;
2332
+ if (tabId !== overlayTabId) return;
2333
+ await mountOverlayOnTab(tabId);
2334
+ broadcastOverlayState();
2335
+ if (overlayPhase === "countdown") await handleOverlaySkip();
2336
+ })();
2337
+ });
2338
+
2321
2339
  // While recording, the popup is disabled (setActionPopup("")), so clicking the
2322
2340
  // extension icon lands here: stop & save immediately (or discard if we're still
2323
2341
  // in the pre-roll countdown). When idle, the popup opens and this never fires.
@@ -733,19 +733,34 @@ async function buildCompositor(
733
733
  async function createMixedAudio(
734
734
  streams: MediaStream[],
735
735
  ): Promise<{ audioContext: AudioContext | null; tracks: MediaStreamTrack[] }> {
736
- const streamsWithAudio = streams.filter(
737
- (stream) => stream.getAudioTracks().length,
738
- );
739
- if (!streamsWithAudio.length) return { audioContext: null, tracks: [] };
740
- if (streamsWithAudio.length === 1) {
741
- return { audioContext: null, tracks: streamsWithAudio[0].getAudioTracks() };
736
+ const audioTracks = streams.flatMap((stream) => stream.getAudioTracks());
737
+ if (!audioTracks.length) return { audioContext: null, tracks: [] };
738
+ if (audioTracks.length === 1) {
739
+ return { audioContext: null, tracks: audioTracks };
742
740
  }
743
741
 
744
742
  const audioContext = new AudioContext();
745
743
  await audioContext.resume().catch(() => undefined);
746
744
  const destination = audioContext.createMediaStreamDestination();
747
- for (const stream of streamsWithAudio) {
748
- audioContext.createMediaStreamSource(stream).connect(destination);
745
+ for (const track of audioTracks) {
746
+ // One source per track (not per stream) so each input is isolated in the
747
+ // mix graph and can be detached independently.
748
+ const source = audioContext.createMediaStreamSource(
749
+ new MediaStream([track]),
750
+ );
751
+ source.connect(destination);
752
+ // A mixed input track can end mid-recording — most commonly the shared
753
+ // tab's audio track when the user refreshes the captured tab. Disconnect
754
+ // just that dead source so the mixed output keeps carrying the surviving
755
+ // inputs (the microphone). Without this the whole mixed destination can go
756
+ // silent, dropping both the tab audio and the mic for the rest of the clip.
757
+ track.addEventListener("ended", () => {
758
+ try {
759
+ source.disconnect();
760
+ } catch {
761
+ /* already disconnected */
762
+ }
763
+ });
749
764
  }
750
765
  return { audioContext, tracks: destination.stream.getAudioTracks() };
751
766
  }