@agent-native/core 0.90.11 → 0.91.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (315) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +22 -0
  3. package/corpus/core/docs/content/toolkit-settings.mdx +56 -3
  4. package/corpus/core/package.json +2 -1
  5. package/corpus/core/src/agent/run-ownership.ts +29 -1
  6. package/corpus/core/src/changelog/parse.ts +78 -0
  7. package/corpus/core/src/chat-threads/schema.ts +43 -0
  8. package/corpus/core/src/chat-threads/store.ts +144 -12
  9. package/corpus/core/src/cli/workspace-dev.ts +25 -5
  10. package/corpus/core/src/client/AgentPanel.tsx +79 -14
  11. package/corpus/core/src/client/AssistantChat.tsx +359 -425
  12. package/corpus/core/src/client/analytics-session.ts +70 -0
  13. package/corpus/core/src/client/analytics.ts +175 -49
  14. package/corpus/core/src/client/chat/message-components.tsx +22 -2
  15. package/corpus/core/src/client/components/ui/message-scroller.tsx +131 -0
  16. package/corpus/core/src/client/conversation/AgentConversation.tsx +63 -41
  17. package/corpus/core/src/client/error-capture.ts +616 -0
  18. package/corpus/core/src/client/index.ts +12 -0
  19. package/corpus/core/src/client/session-replay.ts +57 -7
  20. package/corpus/core/src/client/settings/SettingsPanel.tsx +123 -1
  21. package/corpus/core/src/client/settings/SettingsTabsPage.tsx +292 -45
  22. package/corpus/core/src/client/settings/index.ts +1 -0
  23. package/corpus/core/src/client/sharing/ShareButton.tsx +14 -11
  24. package/corpus/core/src/client/sharing/ShareDialog.tsx +13 -10
  25. package/corpus/core/src/mcp/builtin-tools.ts +29 -2
  26. package/corpus/core/src/server/agent-chat-plugin.ts +174 -79
  27. package/corpus/core/src/server/onboarding-html.ts +28 -16
  28. package/corpus/core/src/sharing/actions/list-resource-shares.ts +45 -1
  29. package/corpus/core/src/sharing/actions/share-resource.ts +9 -0
  30. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +4 -2
  31. package/corpus/core/src/templates/workspace-core/.agents/skills/changelog/SKILL.md +9 -6
  32. package/corpus/core/src/vite/client.ts +217 -35
  33. package/corpus/templates/analytics/.agents/skills/adhoc-analysis/SKILL.md +8 -7
  34. package/corpus/templates/analytics/.agents/skills/analysis-workspace/SKILL.md +14 -10
  35. package/corpus/templates/analytics/.agents/skills/bigquery/SKILL.md +15 -15
  36. package/corpus/templates/analytics/.agents/skills/cross-source-analysis/SKILL.md +1 -0
  37. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +38 -22
  38. package/corpus/templates/analytics/.agents/skills/data-programs/SKILL.md +114 -61
  39. package/corpus/templates/analytics/.agents/skills/data-querying/SKILL.md +1 -0
  40. package/corpus/templates/analytics/.agents/skills/gong/SKILL.md +7 -7
  41. package/corpus/templates/analytics/.agents/skills/hubspot/SKILL.md +1 -0
  42. package/corpus/templates/analytics/.agents/skills/prometheus/SKILL.md +1 -1
  43. package/corpus/templates/analytics/.builder/skills/bigquery/SKILL.md +17 -17
  44. package/corpus/templates/analytics/.builder/skills/gcloud/SKILL.md +5 -5
  45. package/corpus/templates/analytics/.builder/skills/github/SKILL.md +7 -7
  46. package/corpus/templates/analytics/.builder/skills/gong/SKILL.md +12 -12
  47. package/corpus/templates/analytics/.builder/skills/grafana/SKILL.md +7 -7
  48. package/corpus/templates/analytics/.builder/skills/sentry/SKILL.md +7 -7
  49. package/corpus/templates/analytics/.builder/skills/slack/SKILL.md +6 -6
  50. package/corpus/templates/analytics/.builder/skills/stripe/SKILL.md +7 -7
  51. package/corpus/templates/analytics/AGENTS.md +47 -2
  52. package/corpus/templates/analytics/actions/add-status-page-monitor.ts +36 -0
  53. package/corpus/templates/analytics/actions/capture-test-error.ts +33 -0
  54. package/corpus/templates/analytics/actions/delete-monitor.ts +24 -0
  55. package/corpus/templates/analytics/actions/delete-status-page.ts +23 -0
  56. package/corpus/templates/analytics/actions/get-error-issue.ts +36 -0
  57. package/corpus/templates/analytics/actions/get-monitor-stats.ts +55 -0
  58. package/corpus/templates/analytics/actions/get-monitor.ts +27 -0
  59. package/corpus/templates/analytics/actions/get-public-status-page.ts +41 -0
  60. package/corpus/templates/analytics/actions/get-status-page.ts +29 -0
  61. package/corpus/templates/analytics/actions/list-error-issues.ts +40 -0
  62. package/corpus/templates/analytics/actions/list-monitors.ts +21 -0
  63. package/corpus/templates/analytics/actions/list-status-pages.ts +21 -0
  64. package/corpus/templates/analytics/actions/match-error-issues.ts +51 -0
  65. package/corpus/templates/analytics/actions/navigate.ts +58 -4
  66. package/corpus/templates/analytics/actions/remove-status-page-monitor.ts +22 -0
  67. package/corpus/templates/analytics/actions/reorder-status-page-monitors.ts +25 -0
  68. package/corpus/templates/analytics/actions/resolve-error-issue.ts +38 -0
  69. package/corpus/templates/analytics/actions/run-monitor-check.ts +23 -0
  70. package/corpus/templates/analytics/actions/save-analysis.ts +1 -0
  71. package/corpus/templates/analytics/actions/save-monitor.ts +145 -0
  72. package/corpus/templates/analytics/actions/save-status-page.ts +47 -0
  73. package/corpus/templates/analytics/actions/view-screen.ts +212 -0
  74. package/corpus/templates/analytics/app/components/layout/Header.tsx +1 -0
  75. package/corpus/templates/analytics/app/components/layout/Layout.tsx +10 -1
  76. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +134 -39
  77. package/corpus/templates/analytics/app/components/monitoring/PublicStatusView.tsx +351 -0
  78. package/corpus/templates/analytics/app/components/monitoring/ResponseTimeChart.tsx +174 -0
  79. package/corpus/templates/analytics/app/components/monitoring/UptimeStatCards.tsx +85 -0
  80. package/corpus/templates/analytics/app/components/monitoring/UptimeTimelineBars.tsx +106 -0
  81. package/corpus/templates/analytics/app/components/monitoring/chart-utils.ts +101 -0
  82. package/corpus/templates/analytics/app/components/monitoring/index.ts +28 -0
  83. package/corpus/templates/analytics/app/components/monitoring/types.ts +42 -0
  84. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +34 -0
  85. package/corpus/templates/analytics/app/i18n/zh-TW.ts +6 -0
  86. package/corpus/templates/analytics/app/i18n-data.ts +33 -0
  87. package/corpus/templates/analytics/app/pages/DataSources.tsx +28 -0
  88. package/corpus/templates/analytics/app/pages/Settings.tsx +77 -9
  89. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +3 -3
  90. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/dashboard-layout.ts +7 -0
  91. package/corpus/templates/analytics/app/pages/monitoring/ErrorsPanel.tsx +205 -0
  92. package/corpus/templates/analytics/app/pages/monitoring/MonitoringPage.tsx +100 -0
  93. package/corpus/templates/analytics/app/pages/monitoring/UptimePanel.tsx +475 -0
  94. package/corpus/templates/analytics/app/pages/monitoring/errors/IssueDetail.tsx +372 -0
  95. package/corpus/templates/analytics/app/pages/monitoring/errors/IssueList.tsx +360 -0
  96. package/corpus/templates/analytics/app/pages/monitoring/errors/Sparkline.tsx +55 -0
  97. package/corpus/templates/analytics/app/pages/monitoring/errors/i18n.ts +106 -0
  98. package/corpus/templates/analytics/app/pages/monitoring/errors/types.ts +75 -0
  99. package/corpus/templates/analytics/app/pages/monitoring/errors/utils.ts +132 -0
  100. package/corpus/templates/analytics/app/pages/monitoring/uptime/MonitorDetail.tsx +535 -0
  101. package/corpus/templates/analytics/app/pages/monitoring/uptime/MonitorFormPage.tsx +1026 -0
  102. package/corpus/templates/analytics/app/pages/monitoring/uptime/MonitorList.tsx +311 -0
  103. package/corpus/templates/analytics/app/pages/monitoring/uptime/i18n.ts +235 -0
  104. package/corpus/templates/analytics/app/pages/monitoring/uptime/status-pages/StatusPageEditor.tsx +661 -0
  105. package/corpus/templates/analytics/app/pages/monitoring/uptime/status-pages/StatusPagesView.tsx +355 -0
  106. package/corpus/templates/analytics/app/pages/monitoring/uptime/status-pages/i18n.ts +106 -0
  107. package/corpus/templates/analytics/app/pages/monitoring/uptime/status-pages/slug.ts +24 -0
  108. package/corpus/templates/analytics/app/pages/monitoring/uptime/status-pages/types.ts +20 -0
  109. package/corpus/templates/analytics/app/pages/monitoring/uptime/status-summary.ts +87 -0
  110. package/corpus/templates/analytics/app/pages/monitoring/uptime/types.ts +161 -0
  111. package/corpus/templates/analytics/app/pages/monitoring/uptime/utils.ts +210 -0
  112. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +76 -1
  113. package/corpus/templates/analytics/app/pages/sessions/SessionDevToolsPanel.tsx +74 -9
  114. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +197 -20
  115. package/corpus/templates/analytics/app/root.tsx +33 -1
  116. package/corpus/templates/analytics/app/routes/monitoring._index.tsx +10 -0
  117. package/corpus/templates/analytics/app/routes/status.$slug.tsx +118 -0
  118. package/corpus/templates/analytics/changelog/2026-07-08-add-uptime-monitors-that-ping-your-urls-and-alert-you-when-t.md +6 -0
  119. package/corpus/templates/analytics/changelog/2026-07-08-analytics-chats-keep-large-data-dictionaries-compact-so-prov.md +6 -0
  120. package/corpus/templates/analytics/changelog/2026-07-08-create-public-status-pages-that-share-the-live-health-of-cho.md +6 -0
  121. package/corpus/templates/analytics/changelog/2026-07-08-dashboard-extension-panels-use-clearer-open-copy.md +6 -0
  122. package/corpus/templates/analytics/changelog/2026-07-08-error-capture.md +6 -0
  123. package/corpus/templates/analytics/changelog/2026-07-08-fixed-single-panel-dashboard-drags-so-they-no-longer-rewrite.md +6 -0
  124. package/corpus/templates/analytics/changelog/2026-07-08-jump-straight-from-an-error-in-a-session-recording-to-its-fu.md +6 -0
  125. package/corpus/templates/analytics/changelog/2026-07-08-monitor-detail-and-list-now-show-colorful-uptime-timelines-r.md +6 -0
  126. package/corpus/templates/analytics/changelog/2026-07-08-pinned-ask-chats-now-show-a-pin-icon-in-the-sidebar.md +6 -0
  127. package/corpus/templates/analytics/changelog/2026-07-08-publish-a-public-uptime-status-page-with-colorful-uptime-tim.md +6 -0
  128. package/corpus/templates/analytics/changelog/2026-07-08-sessions-now-hide-visitor-emails-in-demo-mode-and-show-clean.md +6 -0
  129. package/corpus/templates/analytics/changelog/2026-07-08-settings-are-cleaner-searchable-and-alerts-have-their-own-tab.md +5 -0
  130. package/corpus/templates/analytics/changelog/2026-07-08-sidebar-sections-stay-collapsed-until-opened.md +5 -0
  131. package/corpus/templates/analytics/changelog/2026-07-08-the-uptime-monitor-list-now-has-a-current-status-overview-wi.md +6 -0
  132. package/corpus/templates/analytics/docs/error-capture.md +172 -0
  133. package/corpus/templates/analytics/docs/uptime-monitoring.md +150 -0
  134. package/corpus/templates/analytics/server/db/schema-errors.ts +150 -0
  135. package/corpus/templates/analytics/server/db/schema-monitoring.ts +177 -0
  136. package/corpus/templates/analytics/server/db/schema.ts +6 -0
  137. package/corpus/templates/analytics/server/jobs/uptime-monitors.ts +123 -0
  138. package/corpus/templates/analytics/server/lib/agent-chat-plan-mode.ts +41 -0
  139. package/corpus/templates/analytics/server/lib/data-dictionary-context.ts +55 -12
  140. package/corpus/templates/analytics/server/lib/error-capture.ts +1331 -0
  141. package/corpus/templates/analytics/server/lib/first-party-analytics.ts +47 -1
  142. package/corpus/templates/analytics/server/lib/monitor-stats.ts +494 -0
  143. package/corpus/templates/analytics/server/lib/status-pages.ts +798 -0
  144. package/corpus/templates/analytics/server/lib/uptime-monitors.ts +1665 -0
  145. package/corpus/templates/analytics/server/plugins/agent-chat.ts +7 -37
  146. package/corpus/templates/analytics/server/plugins/auth.ts +11 -1
  147. package/corpus/templates/analytics/server/plugins/db.ts +408 -0
  148. package/corpus/templates/analytics/server/plugins/uptime-monitor-jobs.ts +63 -0
  149. package/corpus/templates/assets/app/routes/_index.tsx +1 -1
  150. package/corpus/templates/assets/app/routes/settings.tsx +22 -1
  151. package/corpus/templates/assets/changelog/2026-07-08-recent-drafts-keep-comfortable-side-padding.md +6 -0
  152. package/corpus/templates/assets/changelog/2026-07-08-settings-are-cleaner-and-searchable.md +5 -0
  153. package/corpus/templates/brain/app/routes/settings.tsx +43 -5
  154. package/corpus/templates/brain/changelog/2026-07-08-settings-are-cleaner-and-searchable.md +5 -0
  155. package/corpus/templates/calendar/app/pages/Settings.tsx +44 -6
  156. package/corpus/templates/calendar/changelog/2026-07-08-settings-are-cleaner-and-searchable.md +5 -0
  157. package/corpus/templates/chat/app/routes/settings.tsx +16 -1
  158. package/corpus/templates/chat/changelog/2026-07-08-settings-are-cleaner-and-searchable.md +5 -0
  159. package/corpus/templates/clips/actions/lib/audio-only-transcription.ts +79 -37
  160. package/corpus/templates/clips/app/components/player/player-controls.tsx +35 -0
  161. package/corpus/templates/clips/app/components/player/video-player.tsx +162 -18
  162. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +63 -6
  163. package/corpus/templates/clips/app/routes/record.tsx +18 -1
  164. package/corpus/templates/clips/changelog/2026-07-07-shared-clips-start-playback-reliably-from-the-first-play-click.md +6 -0
  165. package/corpus/templates/clips/changelog/2026-07-08-chrome-extension-camera-and-microphone-menus-now-show-which-.md +6 -0
  166. package/corpus/templates/clips/changelog/2026-07-08-chrome-extension-copies-new-clip-links-after-saving.md +6 -0
  167. package/corpus/templates/clips/changelog/2026-07-08-chrome-extension-recordings-now-continue-after-granting-came.md +6 -0
  168. package/corpus/templates/clips/changelog/2026-07-08-mobile-shared-clips-now-have-loom-style-tap-and-skip-controls.md +6 -0
  169. package/corpus/templates/clips/changelog/2026-07-08-recordings-and-uploads-copy-links-after-saving.md +6 -0
  170. package/corpus/templates/clips/changelog/2026-07-08-settings-are-cleaner-searchable-and-collapse-s3-with-builder.md +5 -0
  171. package/corpus/templates/clips/changelog/2026-07-08-transcripts-are-more-reliable-for-longer-desktop-recordings-.md +6 -0
  172. package/corpus/templates/clips/chrome-extension/public/manifest.json +1 -0
  173. package/corpus/templates/clips/chrome-extension/src/background.ts +162 -13
  174. package/corpus/templates/clips/chrome-extension/src/content-script.ts +14 -0
  175. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +36 -0
  176. package/corpus/templates/clips/chrome-extension/src/overlay.ts +99 -25
  177. package/corpus/templates/clips/chrome-extension/src/permission.ts +63 -14
  178. package/corpus/templates/clips/chrome-extension/src/popup.ts +123 -23
  179. package/corpus/templates/content/actions/_builder-cms-read-client.ts +47 -0
  180. package/corpus/templates/content/actions/_database-source-utils.ts +33 -4
  181. package/corpus/templates/content/actions/add-content-database-source-field-property.ts +214 -29
  182. package/corpus/templates/content/actions/attach-content-database-source.ts +3 -0
  183. package/corpus/templates/content/actions/change-content-database-source-role.ts +1 -0
  184. package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +42 -32
  185. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +352 -81
  186. package/corpus/templates/content/app/components/editor/database/settings.tsx +49 -24
  187. package/corpus/templates/content/app/routes/_app.settings.tsx +19 -1
  188. package/corpus/templates/content/changelog/2026-07-07-builder-source-tag-fields-now-import-as-multi-select.md +6 -0
  189. package/corpus/templates/content/changelog/2026-07-08-settings-are-cleaner-and-searchable.md +5 -0
  190. package/corpus/templates/content/shared/api.ts +3 -0
  191. package/corpus/templates/content/shared/properties.ts +42 -0
  192. package/corpus/templates/design/actions/generate-design.ts +3 -0
  193. package/corpus/templates/design/actions/get-design-system.ts +147 -1
  194. package/corpus/templates/design/app/routes/settings.tsx +16 -1
  195. package/corpus/templates/design/changelog/2026-07-08-design-generation-now-follows-hydrated-builder-design-system.md +6 -0
  196. package/corpus/templates/design/changelog/2026-07-08-settings-are-cleaner-and-searchable.md +5 -0
  197. package/corpus/templates/dispatch/app/routes/settings.tsx +23 -2
  198. package/corpus/templates/dispatch/changelog/2026-07-08-settings-are-cleaner-and-searchable.md +5 -0
  199. package/corpus/templates/forms/app/routes/_app.settings.tsx +16 -1
  200. package/corpus/templates/forms/changelog/2026-07-08-settings-are-cleaner-and-searchable.md +5 -0
  201. package/corpus/templates/macros/app/routes/settings.tsx +16 -1
  202. package/corpus/templates/macros/changelog/2026-07-08-settings-are-cleaner-and-searchable.md +5 -0
  203. package/corpus/templates/mail/app/components/settings/GmailFiltersSection.tsx +1 -1
  204. package/corpus/templates/mail/app/components/settings/SnippetsSection.tsx +1 -1
  205. package/corpus/templates/mail/app/pages/SettingsPage.tsx +123 -105
  206. package/corpus/templates/mail/changelog/2026-07-08-settings-redesigned-with-a-consistent-searchable-layout.md +5 -0
  207. package/corpus/templates/plan/app/routes/settings.tsx +23 -2
  208. package/corpus/templates/plan/changelog/2026-07-08-settings-are-cleaner-and-searchable.md +5 -0
  209. package/corpus/templates/slides/actions/add-slide.ts +1 -0
  210. package/corpus/templates/slides/actions/get-design-system.ts +147 -1
  211. package/corpus/templates/slides/app/pages/Index.tsx +46 -1
  212. package/corpus/templates/slides/app/routes/settings.tsx +16 -1
  213. package/corpus/templates/slides/changelog/2026-07-08-deck-generation-now-follows-hydrated-builder-design-system-g.md +6 -0
  214. package/corpus/templates/slides/changelog/2026-07-08-settings-are-cleaner-and-searchable.md +5 -0
  215. package/dist/agent/run-ownership.d.ts +6 -0
  216. package/dist/agent/run-ownership.d.ts.map +1 -1
  217. package/dist/agent/run-ownership.js +11 -1
  218. package/dist/agent/run-ownership.js.map +1 -1
  219. package/dist/changelog/parse.d.ts +7 -0
  220. package/dist/changelog/parse.d.ts.map +1 -1
  221. package/dist/changelog/parse.js +64 -0
  222. package/dist/changelog/parse.js.map +1 -1
  223. package/dist/chat-threads/schema.d.ts +445 -0
  224. package/dist/chat-threads/schema.d.ts.map +1 -0
  225. package/dist/chat-threads/schema.js +39 -0
  226. package/dist/chat-threads/schema.js.map +1 -0
  227. package/dist/chat-threads/store.d.ts +12 -0
  228. package/dist/chat-threads/store.d.ts.map +1 -1
  229. package/dist/chat-threads/store.js +99 -10
  230. package/dist/chat-threads/store.js.map +1 -1
  231. package/dist/cli/workspace-dev.d.ts.map +1 -1
  232. package/dist/cli/workspace-dev.js +20 -5
  233. package/dist/cli/workspace-dev.js.map +1 -1
  234. package/dist/client/AgentPanel.d.ts.map +1 -1
  235. package/dist/client/AgentPanel.js +35 -7
  236. package/dist/client/AgentPanel.js.map +1 -1
  237. package/dist/client/AssistantChat.d.ts.map +1 -1
  238. package/dist/client/AssistantChat.js +105 -183
  239. package/dist/client/AssistantChat.js.map +1 -1
  240. package/dist/client/analytics-session.d.ts +3 -0
  241. package/dist/client/analytics-session.d.ts.map +1 -0
  242. package/dist/client/analytics-session.js +66 -0
  243. package/dist/client/analytics-session.js.map +1 -0
  244. package/dist/client/analytics.d.ts +32 -0
  245. package/dist/client/analytics.d.ts.map +1 -1
  246. package/dist/client/analytics.js +116 -46
  247. package/dist/client/analytics.js.map +1 -1
  248. package/dist/client/chat/message-components.d.ts +2 -1
  249. package/dist/client/chat/message-components.d.ts.map +1 -1
  250. package/dist/client/chat/message-components.js +16 -6
  251. package/dist/client/chat/message-components.js.map +1 -1
  252. package/dist/client/components/ui/message-scroller.d.ts +16 -0
  253. package/dist/client/components/ui/message-scroller.d.ts.map +1 -0
  254. package/dist/client/components/ui/message-scroller.js +25 -0
  255. package/dist/client/components/ui/message-scroller.js.map +1 -0
  256. package/dist/client/conversation/AgentConversation.d.ts +1 -1
  257. package/dist/client/conversation/AgentConversation.d.ts.map +1 -1
  258. package/dist/client/conversation/AgentConversation.js +3 -8
  259. package/dist/client/conversation/AgentConversation.js.map +1 -1
  260. package/dist/client/error-capture.d.ts +99 -0
  261. package/dist/client/error-capture.d.ts.map +1 -0
  262. package/dist/client/error-capture.js +437 -0
  263. package/dist/client/error-capture.js.map +1 -0
  264. package/dist/client/index.d.ts +2 -2
  265. package/dist/client/index.d.ts.map +1 -1
  266. package/dist/client/index.js +3 -1
  267. package/dist/client/index.js.map +1 -1
  268. package/dist/client/session-replay.d.ts +22 -0
  269. package/dist/client/session-replay.d.ts.map +1 -1
  270. package/dist/client/session-replay.js +45 -4
  271. package/dist/client/session-replay.js.map +1 -1
  272. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  273. package/dist/client/settings/SettingsPanel.js +100 -5
  274. package/dist/client/settings/SettingsPanel.js.map +1 -1
  275. package/dist/client/settings/SettingsTabsPage.d.ts +49 -1
  276. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  277. package/dist/client/settings/SettingsTabsPage.js +131 -19
  278. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  279. package/dist/client/settings/index.d.ts +1 -1
  280. package/dist/client/settings/index.d.ts.map +1 -1
  281. package/dist/client/settings/index.js.map +1 -1
  282. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  283. package/dist/client/sharing/ShareButton.js +13 -8
  284. package/dist/client/sharing/ShareButton.js.map +1 -1
  285. package/dist/client/sharing/ShareDialog.d.ts.map +1 -1
  286. package/dist/client/sharing/ShareDialog.js +12 -7
  287. package/dist/client/sharing/ShareDialog.js.map +1 -1
  288. package/dist/collab/struct-routes.d.ts +1 -1
  289. package/dist/mcp/builtin-tools.d.ts.map +1 -1
  290. package/dist/mcp/builtin-tools.js +21 -2
  291. package/dist/mcp/builtin-tools.js.map +1 -1
  292. package/dist/notifications/routes.d.ts +1 -1
  293. package/dist/org/schema.d.ts +15 -15
  294. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  295. package/dist/resources/handlers.d.ts +3 -3
  296. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  297. package/dist/server/agent-chat-plugin.js +109 -73
  298. package/dist/server/agent-chat-plugin.js.map +1 -1
  299. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  300. package/dist/server/onboarding-html.d.ts.map +1 -1
  301. package/dist/server/onboarding-html.js +28 -16
  302. package/dist/server/onboarding-html.js.map +1 -1
  303. package/dist/sharing/actions/list-resource-shares.js +30 -1
  304. package/dist/sharing/actions/list-resource-shares.js.map +1 -1
  305. package/dist/sharing/actions/share-resource.js +6 -0
  306. package/dist/sharing/actions/share-resource.js.map +1 -1
  307. package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +4 -2
  308. package/dist/templates/workspace-core/.agents/skills/changelog/SKILL.md +9 -6
  309. package/dist/vite/client.d.ts.map +1 -1
  310. package/dist/vite/client.js +192 -30
  311. package/dist/vite/client.js.map +1 -1
  312. package/docs/content/toolkit-settings.mdx +56 -3
  313. package/package.json +2 -1
  314. package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +4 -2
  315. package/src/templates/workspace-core/.agents/skills/changelog/SKILL.md +9 -6
@@ -8,7 +8,11 @@ import {
8
8
  LOOM_START_MS_QUERY_PARAM,
9
9
  loomEmbedUrlWithTimestamp,
10
10
  } from "@shared/loom";
11
- import { IconBolt, IconPlayerPlay } from "@tabler/icons-react";
11
+ import {
12
+ IconBolt,
13
+ IconPlayerPlay,
14
+ IconPlayerSkipForward,
15
+ } from "@tabler/icons-react";
12
16
  import {
13
17
  forwardRef,
14
18
  useCallback,
@@ -47,7 +51,11 @@ import { cn } from "@/lib/utils";
47
51
 
48
52
  import { CaptionsOverlay } from "./captions-overlay";
49
53
  import { CtaButton } from "./cta-button";
50
- import { PlayerControls, SPEED_OPTIONS } from "./player-controls";
54
+ import {
55
+ PLAYER_SEEK_STEP_MS,
56
+ PlayerControls,
57
+ SPEED_OPTIONS,
58
+ } from "./player-controls";
51
59
 
52
60
  function resolveLocalUrl(url: string | null | undefined): string | undefined {
53
61
  if (!url) return undefined;
@@ -126,6 +134,14 @@ function applyLoomStartToVideoSrc(src: string, ms: number): string {
126
134
  return setUrlSearchParam(src, LOOM_START_MS_QUERY_PARAM, String(ms));
127
135
  }
128
136
 
137
+ function isPlayerUiTarget(target: EventTarget | null): boolean {
138
+ return (
139
+ typeof Element !== "undefined" &&
140
+ target instanceof Element &&
141
+ Boolean(target.closest("[data-player-ui]"))
142
+ );
143
+ }
144
+
129
145
  export interface VideoPlayerHandle {
130
146
  video: HTMLVideoElement | null;
131
147
  play: () => Promise<void> | void;
@@ -242,6 +258,12 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
242
258
  const videoRef = useRef<HTMLVideoElement | null>(null);
243
259
  const containerRef = useRef<HTMLDivElement | null>(null);
244
260
  const idleTimer = useRef<ReturnType<typeof setTimeout> | null>(null);
261
+ const touchTapCandidateRef = useRef<{
262
+ pointerId: number;
263
+ x: number;
264
+ y: number;
265
+ } | null>(null);
266
+ const suppressNextClickRef = useRef(false);
245
267
  const playAttemptPendingRef = useRef(false);
246
268
  const playAttemptIdRef = useRef(0);
247
269
  // Position to restore after `v.load()` resets `currentTime` to 0 while
@@ -465,10 +487,12 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
465
487
  setPlayError(null);
466
488
 
467
489
  if (
468
- initialVisibleFrameSeekedRef.current &&
469
490
  !hasPlaybackStarted &&
470
491
  (!startMs || startMs <= 0) &&
471
- v.currentTime > 0.05
492
+ ((initialVisibleFrameSeekedRef.current && v.currentTime > 0.05) ||
493
+ // The WebM duration probe seeks to 1e10. If Chrome never resolves the
494
+ // durationchange, first play must rewind instead of starting there.
495
+ v.currentTime > 1e7)
472
496
  ) {
473
497
  try {
474
498
  v.currentTime = 0;
@@ -547,6 +571,57 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
547
571
  requestPlay();
548
572
  }, [isPlaying, pauseVideo, requestPlay]);
549
573
 
574
+ const handlePlayerPointerDown = useCallback(
575
+ (e: React.PointerEvent<HTMLDivElement>) => {
576
+ if (
577
+ e.pointerType === "mouse" ||
578
+ e.button !== 0 ||
579
+ isLoomEmbed ||
580
+ isPlayerUiTarget(e.target)
581
+ ) {
582
+ return;
583
+ }
584
+
585
+ touchTapCandidateRef.current = {
586
+ pointerId: e.pointerId,
587
+ x: e.clientX,
588
+ y: e.clientY,
589
+ };
590
+ },
591
+ [isLoomEmbed],
592
+ );
593
+
594
+ const handlePlayerPointerUp = useCallback(
595
+ (e: React.PointerEvent<HTMLDivElement>) => {
596
+ const candidate = touchTapCandidateRef.current;
597
+ if (!candidate || candidate.pointerId !== e.pointerId) return;
598
+ touchTapCandidateRef.current = null;
599
+
600
+ if (isLoomEmbed || isPlayerUiTarget(e.target)) return;
601
+
602
+ const moved = Math.max(
603
+ Math.abs(e.clientX - candidate.x),
604
+ Math.abs(e.clientY - candidate.y),
605
+ );
606
+ if (moved > 12) return;
607
+
608
+ e.preventDefault();
609
+ suppressNextClickRef.current = true;
610
+ togglePlayback();
611
+ bumpControls();
612
+ },
613
+ [bumpControls, isLoomEmbed, togglePlayback],
614
+ );
615
+
616
+ const handlePlayerPointerCancel = useCallback(
617
+ (e: React.PointerEvent<HTMLDivElement>) => {
618
+ if (touchTapCandidateRef.current?.pointerId === e.pointerId) {
619
+ touchTapCandidateRef.current = null;
620
+ }
621
+ },
622
+ [],
623
+ );
624
+
550
625
  const applySpeed = useCallback(
551
626
  (rate: number) => {
552
627
  const nextSpeed = parsePlaybackSpeed(rate) ?? defaultSpeed;
@@ -612,6 +687,21 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
612
687
  ],
613
688
  );
614
689
 
690
+ const seekByMs = useCallback(
691
+ (deltaMs: number) => {
692
+ const v = videoRef.current;
693
+ const liveMs =
694
+ v &&
695
+ Number.isFinite(v.currentTime) &&
696
+ v.currentTime >= 0 &&
697
+ v.currentTime < 1e7
698
+ ? Math.floor(v.currentTime * 1000)
699
+ : currentMs;
700
+ seekToVisibleMs(liveMs + deltaMs);
701
+ },
702
+ [currentMs, seekToVisibleMs],
703
+ );
704
+
615
705
  // Imperative handle for parent
616
706
  useImperativeHandle(
617
707
  ref,
@@ -1011,10 +1101,16 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
1011
1101
  )}
1012
1102
  onMouseMove={bumpControls}
1013
1103
  onMouseLeave={() => !alwaysShowControls && setShowControls(false)}
1104
+ onPointerDown={handlePlayerPointerDown}
1105
+ onPointerUp={handlePlayerPointerUp}
1106
+ onPointerCancel={handlePlayerPointerCancel}
1014
1107
  onClick={(e) => {
1108
+ if (suppressNextClickRef.current) {
1109
+ suppressNextClickRef.current = false;
1110
+ return;
1111
+ }
1015
1112
  // Clicking the video toggles play — but not when clicking controls.
1016
- const target = e.target as HTMLElement;
1017
- if (target.closest("[data-player-ui]")) return;
1113
+ if (isPlayerUiTarget(e.target)) return;
1018
1114
  if (isLoomEmbed) return;
1019
1115
  togglePlayback();
1020
1116
  }}
@@ -1301,6 +1397,7 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
1301
1397
  requestPlay();
1302
1398
  }}
1303
1399
  onSpeedChange={applySpeed}
1400
+ onSeekRelative={seekByMs}
1304
1401
  menuPortalContainer={fullscreenMenuContainer}
1305
1402
  />
1306
1403
  ) : null}
@@ -1373,6 +1470,7 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
1373
1470
  onSeek={(ms) => {
1374
1471
  seekToVisibleMs(ms);
1375
1472
  }}
1473
+ onSeekRelative={seekByMs}
1376
1474
  onVolumeChange={(vol) => {
1377
1475
  const v = videoRef.current;
1378
1476
  if (v) {
@@ -1413,6 +1511,7 @@ function CenterPlaybackOverlay({
1413
1511
  playError,
1414
1512
  onPlay,
1415
1513
  onSpeedChange,
1514
+ onSeekRelative,
1416
1515
  menuPortalContainer,
1417
1516
  }: {
1418
1517
  mode: "loading" | "ready";
@@ -1422,6 +1521,7 @@ function CenterPlaybackOverlay({
1422
1521
  playError: string | null;
1423
1522
  onPlay: () => void;
1424
1523
  onSpeedChange: (rate: number) => void;
1524
+ onSeekRelative: (deltaMs: number) => void;
1425
1525
  menuPortalContainer?: HTMLElement | null;
1426
1526
  }) {
1427
1527
  const t = useT();
@@ -1446,18 +1546,30 @@ function CenterPlaybackOverlay({
1446
1546
  </div>
1447
1547
  ) : (
1448
1548
  <>
1449
- <button
1450
- data-player-ui
1451
- type="button"
1452
- aria-label={t("videoPlayer.playClip")}
1453
- onClick={(e) => {
1454
- e.stopPropagation();
1455
- onPlay();
1456
- }}
1457
- className="pointer-events-auto flex h-[clamp(3rem,13cqw,6rem)] w-[clamp(3rem,13cqw,6rem)] items-center justify-center rounded-full bg-white text-black shadow-2xl ring-1 ring-white/35 transition-transform duration-150 hover:scale-105 hover:bg-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white focus-visible:ring-offset-2 focus-visible:ring-offset-black"
1458
- >
1459
- <IconPlayerPlay className="ml-[6%] h-[clamp(1.5rem,6.5cqw,3rem)] w-[clamp(1.5rem,6.5cqw,3rem)] fill-current" />
1460
- </button>
1549
+ <div className="flex items-center gap-[clamp(0.75rem,4cqw,1.5rem)]">
1550
+ <CenterSeekButton
1551
+ direction="back"
1552
+ ariaLabel="Back 15 seconds"
1553
+ onClick={() => onSeekRelative(-PLAYER_SEEK_STEP_MS)}
1554
+ />
1555
+ <button
1556
+ data-player-ui
1557
+ type="button"
1558
+ aria-label={t("videoPlayer.playClip")}
1559
+ onClick={(e) => {
1560
+ e.stopPropagation();
1561
+ onPlay();
1562
+ }}
1563
+ className="pointer-events-auto flex h-[clamp(3rem,13cqw,6rem)] w-[clamp(3rem,13cqw,6rem)] items-center justify-center rounded-full bg-white text-black shadow-2xl ring-1 ring-white/35 transition-transform duration-150 hover:scale-105 hover:bg-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white focus-visible:ring-offset-2 focus-visible:ring-offset-black"
1564
+ >
1565
+ <IconPlayerPlay className="ml-[6%] h-[clamp(1.5rem,6.5cqw,3rem)] w-[clamp(1.5rem,6.5cqw,3rem)] fill-current" />
1566
+ </button>
1567
+ <CenterSeekButton
1568
+ direction="forward"
1569
+ ariaLabel="Forward 15 seconds"
1570
+ onClick={() => onSeekRelative(PLAYER_SEEK_STEP_MS)}
1571
+ />
1572
+ </div>
1461
1573
 
1462
1574
  <div
1463
1575
  data-player-ui
@@ -1522,6 +1634,38 @@ function CenterPlaybackOverlay({
1522
1634
  );
1523
1635
  }
1524
1636
 
1637
+ function CenterSeekButton({
1638
+ direction,
1639
+ ariaLabel,
1640
+ onClick,
1641
+ }: {
1642
+ direction: "back" | "forward";
1643
+ ariaLabel: string;
1644
+ onClick: () => void;
1645
+ }) {
1646
+ return (
1647
+ <button
1648
+ data-player-ui
1649
+ type="button"
1650
+ aria-label={ariaLabel}
1651
+ onClick={(e) => {
1652
+ e.stopPropagation();
1653
+ onClick();
1654
+ }}
1655
+ className="pointer-events-auto flex h-[clamp(2.5rem,9cqw,4rem)] w-[clamp(2.5rem,9cqw,4rem)] items-center justify-center rounded-full bg-black/70 text-white shadow-xl ring-1 ring-white/20 backdrop-blur-md transition-transform duration-150 hover:scale-105 hover:bg-black/80 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white focus-visible:ring-offset-2 focus-visible:ring-offset-black"
1656
+ >
1657
+ <span className="relative flex h-[clamp(1.25rem,4.5cqw,2rem)] w-[clamp(1.25rem,4.5cqw,2rem)] items-center justify-center">
1658
+ <IconPlayerSkipForward
1659
+ className={cn("h-full w-full", direction === "back" && "rotate-180")}
1660
+ />
1661
+ <span className="absolute text-[clamp(0.45rem,1.8cqw,0.7rem)] font-bold leading-none">
1662
+ 15
1663
+ </span>
1664
+ </span>
1665
+ </button>
1666
+ );
1667
+ }
1668
+
1525
1669
  /**
1526
1670
  * Clamp a millisecond seek target to a value the browser will actually accept.
1527
1671
  *
@@ -10,6 +10,7 @@ import {
10
10
  SettingsTabsPage,
11
11
  useAgentSettingsTabs,
12
12
  useT,
13
+ type SettingsSearchEntry,
13
14
  } from "@agent-native/core/client";
14
15
  import { TeamPage } from "@agent-native/core/client/org";
15
16
  import {
@@ -30,7 +31,7 @@ import {
30
31
  IconTrash,
31
32
  IconUser,
32
33
  } from "@tabler/icons-react";
33
- import { useCallback, useEffect, useState } from "react";
34
+ import { useCallback, useEffect, useMemo, useState } from "react";
34
35
  import { toast } from "sonner";
35
36
 
36
37
  import { PageHeader } from "@/components/library/page-header";
@@ -746,6 +747,61 @@ export default function SettingsIndexRoute() {
746
747
  const builderCreditsUpgradeUrl =
747
748
  builderCreditStatus.data?.upgradeUrl ?? BUILDER_CREDITS_UPGRADE_URL;
748
749
 
750
+ const generalSearchEntries = useMemo<SettingsSearchEntry[]>(
751
+ () => [
752
+ {
753
+ id: "clips-language",
754
+ label: t("settings.languageTitle"),
755
+ keywords: "language locale translation i18n",
756
+ hash: "language",
757
+ },
758
+ {
759
+ id: "clips-video-storage",
760
+ label: t("settings.videoStorage"),
761
+ keywords: "storage s3 builder bucket cloud video",
762
+ hash: "video-storage",
763
+ },
764
+ {
765
+ id: "clips-slack",
766
+ label: t("settings.slackTitle"),
767
+ keywords: "slack integration notifications workspace",
768
+ hash: "slack",
769
+ },
770
+ {
771
+ id: "clips-ai-providers",
772
+ label: t("settings.apiSetup"),
773
+ keywords:
774
+ "ai provider api key anthropic openai gemini groq openrouter builder",
775
+ hash: "ai-providers",
776
+ },
777
+ {
778
+ id: "clips-profile",
779
+ label: t("settings.profile"),
780
+ keywords: "profile email display name",
781
+ hash: "profile",
782
+ },
783
+ {
784
+ id: "clips-playback",
785
+ label: t("settings.playback"),
786
+ keywords: "playback speed video default",
787
+ hash: "playback",
788
+ },
789
+ {
790
+ id: "clips-transcript",
791
+ label: t("settings.transcript"),
792
+ keywords: "transcript cleanup captions",
793
+ hash: "transcript",
794
+ },
795
+ {
796
+ id: "clips-notifications",
797
+ label: t("settings.notifications"),
798
+ keywords: "email notifications alerts",
799
+ hash: "notifications",
800
+ },
801
+ ],
802
+ [t],
803
+ );
804
+
749
805
  return (
750
806
  <>
751
807
  <PageHeader>
@@ -756,6 +812,7 @@ export default function SettingsIndexRoute() {
756
812
  <SettingsTabsPage
757
813
  whatsNewLabel={t("settings.whatsNew")}
758
814
  extraTabs={agentSettingsTabs}
815
+ generalSearchEntries={generalSearchEntries}
759
816
  general={
760
817
  <div className="mx-auto w-full max-w-4xl space-y-6">
761
818
  <div className="min-w-0 space-y-6">
@@ -763,7 +820,7 @@ export default function SettingsIndexRoute() {
763
820
  {t("settings.intro")}
764
821
  </p>
765
822
 
766
- <Card>
823
+ <Card id="language" className="scroll-mt-16">
767
824
  <CardHeader>
768
825
  <CardTitle className="text-base">
769
826
  {t("settings.languageTitle")}
@@ -1353,7 +1410,7 @@ export default function SettingsIndexRoute() {
1353
1410
  </CardContent>
1354
1411
  </Card>
1355
1412
 
1356
- <Card>
1413
+ <Card id="profile" className="scroll-mt-16">
1357
1414
  <CardHeader>
1358
1415
  <CardTitle className="text-base flex items-center gap-2">
1359
1416
  <IconUser className="size-4 text-primary" />
@@ -1380,7 +1437,7 @@ export default function SettingsIndexRoute() {
1380
1437
  </CardContent>
1381
1438
  </Card>
1382
1439
 
1383
- <Card>
1440
+ <Card id="playback" className="scroll-mt-16">
1384
1441
  <CardHeader>
1385
1442
  <CardTitle className="text-base">
1386
1443
  {t("settings.playback")}
@@ -1414,7 +1471,7 @@ export default function SettingsIndexRoute() {
1414
1471
  </CardContent>
1415
1472
  </Card>
1416
1473
 
1417
- <Card>
1474
+ <Card id="transcript" className="scroll-mt-16">
1418
1475
  <CardHeader>
1419
1476
  <CardTitle className="text-base">
1420
1477
  {t("settings.transcript")}
@@ -1443,7 +1500,7 @@ export default function SettingsIndexRoute() {
1443
1500
  </CardContent>
1444
1501
  </Card>
1445
1502
 
1446
- <Card>
1503
+ <Card id="notifications" className="scroll-mt-16">
1447
1504
  <CardHeader>
1448
1505
  <CardTitle className="text-base">
1449
1506
  {t("settings.notifications")}
@@ -85,6 +85,20 @@ async function writeAppState(key: string, value: unknown): Promise<void> {
85
85
  },
86
86
  );
87
87
  }
88
+
89
+ function recordingLink(recordingId: string): string {
90
+ const path = `${appBasePath()}/r/${encodeURIComponent(recordingId)}`;
91
+ if (typeof window === "undefined") return path;
92
+ return new URL(path, window.location.origin).toString();
93
+ }
94
+
95
+ async function copyRecordingLink(recordingId: string): Promise<void> {
96
+ if (typeof navigator === "undefined") return;
97
+ if (!navigator.clipboard?.writeText) return;
98
+ await navigator.clipboard
99
+ .writeText(recordingLink(recordingId))
100
+ .catch(() => undefined);
101
+ }
88
102
  import {
89
103
  bugReportTitle,
90
104
  parseBugReportContext,
@@ -1786,6 +1800,7 @@ export default function RecordRoute() {
1786
1800
  duration: 12_000,
1787
1801
  });
1788
1802
  } else {
1803
+ if (createdId && !reportContext) await copyRecordingLink(createdId);
1789
1804
  toast.success(t("recordRoute.videoUploaded"));
1790
1805
  }
1791
1806
  if (reportContext && createdId) {
@@ -1888,6 +1903,7 @@ export default function RecordRoute() {
1888
1903
  duration: 12_000,
1889
1904
  });
1890
1905
  } else {
1906
+ await copyRecordingLink(recordingId);
1891
1907
  toast.success(t("recordRoute.loomImported"));
1892
1908
  }
1893
1909
  await writeAppState("navigate", {
@@ -2014,16 +2030,17 @@ export default function RecordRoute() {
2014
2030
  setCompressionProgress(null);
2015
2031
  setUploadProgress(null);
2016
2032
  setUiState("complete");
2033
+ const reportContext = bugReportContextRef.current;
2017
2034
  if (result.waitingForStorage) {
2018
2035
  toast.info(t("recordRoute.recordingReadyToUpload"), {
2019
2036
  description: t("recordRoute.connectStorageToFinish"),
2020
2037
  duration: 12_000,
2021
2038
  });
2022
2039
  } else {
2040
+ if (!reportContext) await copyRecordingLink(recordingId);
2023
2041
  toast.success(t("recordRoute.recordingSaved"));
2024
2042
  }
2025
2043
 
2026
- const reportContext = bugReportContextRef.current;
2027
2044
  if (reportContext) {
2028
2045
  const path = bugReportDonePath(recordingId, reportContext);
2029
2046
  await writeAppState("navigate", {
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-07
4
+ ---
5
+
6
+ Shared clips start playback reliably from the first play click.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-08
4
+ ---
5
+
6
+ Chrome extension camera and microphone menus now show which device the system default currently points to.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-08
4
+ ---
5
+
6
+ Chrome extension recordings copy their share link automatically after saving.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-08
4
+ ---
5
+
6
+ Chrome extension recordings now continue after granting camera or microphone access and recover the camera bubble more reliably.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-08
4
+ ---
5
+
6
+ Mobile shared clips now support Loom-style tap-to-pause playback with 15-second skip controls.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-08
4
+ ---
5
+
6
+ New recordings and uploads copy their clip link automatically after saving.
@@ -0,0 +1,5 @@
1
+ ---
2
+ type: improved
3
+ ---
4
+
5
+ Settings are cleaner and searchable, and the S3 fields collapse automatically once Builder storage is connected.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-08
4
+ ---
5
+
6
+ Transcripts are more reliable for longer desktop recordings when audio extraction is slow.
@@ -20,6 +20,7 @@
20
20
  },
21
21
  "permissions": [
22
22
  "activeTab",
23
+ "clipboardWrite",
23
24
  "debugger",
24
25
  "downloads",
25
26
  "offscreen",