@agent-native/core 0.108.0 → 0.109.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (368) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +25 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/a2a/client.ts +162 -17
  5. package/corpus/core/src/a2a/correlation.ts +50 -0
  6. package/corpus/core/src/a2a/handlers.ts +200 -14
  7. package/corpus/core/src/a2a/index.ts +7 -1
  8. package/corpus/core/src/a2a/invoke.ts +77 -1
  9. package/corpus/core/src/a2a/server.ts +13 -1
  10. package/corpus/core/src/a2a/task-store.ts +146 -6
  11. package/corpus/core/src/a2a/types.ts +32 -0
  12. package/corpus/core/src/action.ts +5 -2
  13. package/corpus/core/src/agent/production-agent.ts +33 -4
  14. package/corpus/core/src/client/AssistantChat.tsx +648 -603
  15. package/corpus/core/src/client/MultiTabAssistantChat.tsx +31 -4
  16. package/corpus/core/src/client/agent-chat-adapter.ts +23 -37
  17. package/corpus/core/src/client/agent-sidebar-state.ts +4 -0
  18. package/corpus/core/src/client/analytics.ts +84 -0
  19. package/corpus/core/src/client/chat/message-components.tsx +94 -22
  20. package/corpus/core/src/client/chat/tool-call-display.tsx +170 -47
  21. package/corpus/core/src/client/chat/use-agent-chat-lifecycle-tracking.ts +74 -0
  22. package/corpus/core/src/client/chat-thread-url.ts +11 -0
  23. package/corpus/core/src/client/error-capture.ts +12 -0
  24. package/corpus/core/src/client/extensions/ExtensionSlot.tsx +37 -1
  25. package/corpus/core/src/client/index.ts +2 -0
  26. package/corpus/core/src/client/route-chunk-recovery.ts +20 -8
  27. package/corpus/core/src/client/session-replay.ts +31 -0
  28. package/corpus/core/src/client/use-run-stuck-detection.ts +27 -1
  29. package/corpus/core/src/db/client.ts +55 -0
  30. package/corpus/core/src/extensions/actions.ts +2 -14
  31. package/corpus/core/src/extensions/store.ts +1 -1
  32. package/corpus/core/src/localization/default-messages.ts +3 -0
  33. package/corpus/core/src/mcp/build-server.ts +2 -2
  34. package/corpus/core/src/observability/traces.ts +172 -19
  35. package/corpus/core/src/progress/actions.ts +4 -2
  36. package/corpus/core/src/provider-api/index.ts +205 -105
  37. package/corpus/core/src/scripts/call-agent.ts +190 -19
  38. package/corpus/core/src/server/agent-chat/action-filters-a2a.ts +112 -25
  39. package/corpus/core/src/server/agent-chat-plugin.ts +136 -4
  40. package/corpus/core/src/styles/agent-conversation.css +7 -0
  41. package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +20 -0
  42. package/corpus/core/src/templates/default/app/i18n/de-DE.ts +20 -0
  43. package/corpus/core/src/templates/default/app/i18n/en-US.ts +20 -0
  44. package/corpus/core/src/templates/default/app/i18n/es-ES.ts +20 -0
  45. package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +21 -0
  46. package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +19 -0
  47. package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +20 -0
  48. package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +19 -0
  49. package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +20 -0
  50. package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +19 -0
  51. package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +19 -0
  52. package/corpus/core/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +49 -0
  53. package/corpus/core/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
  54. package/corpus/core/src/templates/workspace-core/.agents/skills/observability/SKILL.md +7 -1
  55. package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
  56. package/corpus/core/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -1
  57. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +29 -10
  58. package/corpus/templates/analytics/.agents/skills/gong/SKILL.md +54 -23
  59. package/corpus/templates/analytics/.builder/skills/apollo/SKILL.md +19 -41
  60. package/corpus/templates/analytics/.builder/skills/commonroom/SKILL.md +20 -35
  61. package/corpus/templates/analytics/.builder/skills/github/SKILL.md +23 -67
  62. package/corpus/templates/analytics/.builder/skills/pylon/SKILL.md +25 -43
  63. package/corpus/templates/analytics/AGENTS.md +22 -13
  64. package/corpus/templates/analytics/actions/account-deep-dive.ts +1 -0
  65. package/corpus/templates/analytics/actions/configure-gong-native-insights.ts +29 -0
  66. package/corpus/templates/analytics/actions/content-calendar-schema.ts +8 -4
  67. package/corpus/templates/analytics/actions/content-calendar.ts +12 -4
  68. package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +2 -1
  69. package/corpus/templates/analytics/actions/gong-calls.ts +113 -22
  70. package/corpus/templates/analytics/actions/gong-native-insights.ts +166 -0
  71. package/corpus/templates/analytics/actions/hubspot-deals.ts +190 -46
  72. package/corpus/templates/analytics/actions/pylon-issues.ts +123 -0
  73. package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +1 -1
  74. package/corpus/templates/analytics/actions/slack-messages.ts +179 -27
  75. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +48 -152
  76. package/corpus/templates/analytics/app/components/ui/chart.tsx +1 -1
  77. package/corpus/templates/analytics/app/hooks/use-chart-tooltip-flip.ts +21 -6
  78. package/corpus/templates/analytics/app/i18n/zh-TW.ts +13 -0
  79. package/corpus/templates/analytics/app/i18n-data.ts +134 -0
  80. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +181 -30
  81. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +6 -0
  82. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +4 -3
  83. package/corpus/templates/analytics/changelog/2026-07-17-analytics-now-includes-a-default-alert-for-spikes-in-stuck-agent-chats.md +6 -0
  84. package/corpus/templates/analytics/changelog/2026-07-17-dashboard-editors-can-add-shared-extensions-or-opt-into-per-.md +6 -0
  85. package/corpus/templates/analytics/changelog/2026-07-17-dashboard-extensions-show-a-loading-skeleton.md +6 -0
  86. package/corpus/templates/analytics/changelog/2026-07-17-errors-now-group-repeat-failures-consistently-and-keep-priva.md +6 -0
  87. package/corpus/templates/analytics/changelog/2026-07-17-gong-transcript-reviews-now-batch-bounded-call-windows-for-f.md +6 -0
  88. package/corpus/templates/analytics/changelog/2026-07-17-hubspot-deal-filters-now-run-in-hubspot-before-paging-result.md +6 -0
  89. package/corpus/templates/analytics/changelog/2026-07-17-notion-content-calendars-now-discover-the-matching-database-.md +6 -0
  90. package/corpus/templates/analytics/changelog/2026-07-17-pylon-dashboard-reads-now-use-the-paginated-issue-search-api.md +6 -0
  91. package/corpus/templates/analytics/changelog/2026-07-17-slack-reads-no-longer-join-channels-and-report-pagination-coverage.md +6 -0
  92. package/corpus/templates/analytics/docs/schemas/first-party-analytics.md +23 -14
  93. package/corpus/templates/analytics/docs/schemas/tracked-events.md +5 -1
  94. package/corpus/templates/analytics/server/handlers/notion.ts +14 -3
  95. package/corpus/templates/analytics/server/handlers/slack.ts +182 -29
  96. package/corpus/templates/analytics/server/jobs/analytics-alerts.ts +3 -3
  97. package/corpus/templates/analytics/server/lib/agent-chat-plan-mode.ts +2 -6
  98. package/corpus/templates/analytics/server/lib/analytics-alerts.ts +209 -87
  99. package/corpus/templates/analytics/server/lib/analytics-connector-catalog.ts +6 -2
  100. package/corpus/templates/analytics/server/lib/error-capture.ts +75 -8
  101. package/corpus/templates/analytics/server/lib/gong-native-policy.ts +72 -0
  102. package/corpus/templates/analytics/server/lib/gong.ts +54 -66
  103. package/corpus/templates/analytics/server/lib/hubspot.ts +40 -3
  104. package/corpus/templates/analytics/server/lib/notion.ts +83 -8
  105. package/corpus/templates/analytics/server/lib/real-data-actions.ts +4 -0
  106. package/corpus/templates/analytics/server/lib/slack.ts +242 -90
  107. package/corpus/templates/analytics/server/plugins/agent-chat.ts +3 -3
  108. package/corpus/templates/analytics/server/routes/api/pylon/accounts.get.ts +42 -1
  109. package/corpus/templates/analytics/server/routes/api/pylon/issues.get.ts +71 -1
  110. package/corpus/templates/analytics/server/routes/api/test-connection.post.ts +44 -4
  111. package/corpus/templates/clips/actions/finalize-recording.ts +541 -62
  112. package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +19 -1
  113. package/corpus/templates/clips/app/components/library/create-folder-dialog.tsx +123 -0
  114. package/corpus/templates/clips/app/components/library/library-grid.tsx +42 -4
  115. package/corpus/templates/clips/app/components/library/recording-card.tsx +30 -0
  116. package/corpus/templates/clips/app/components/player/playback-comment-overlay.tsx +17 -2
  117. package/corpus/templates/clips/app/components/player/video-player.tsx +14 -2
  118. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +2 -2
  119. package/corpus/templates/clips/app/entry.client.tsx +6 -1
  120. package/corpus/templates/clips/app/i18n/ar-SA.ts +12 -1
  121. package/corpus/templates/clips/app/i18n/de-DE.ts +12 -1
  122. package/corpus/templates/clips/app/i18n/en-US.ts +12 -1
  123. package/corpus/templates/clips/app/i18n/es-ES.ts +11 -1
  124. package/corpus/templates/clips/app/i18n/fr-FR.ts +11 -1
  125. package/corpus/templates/clips/app/i18n/hi-IN.ts +10 -1
  126. package/corpus/templates/clips/app/i18n/ja-JP.ts +12 -1
  127. package/corpus/templates/clips/app/i18n/ko-KR.ts +11 -1
  128. package/corpus/templates/clips/app/i18n/pt-BR.ts +11 -1
  129. package/corpus/templates/clips/app/i18n/zh-CN.ts +11 -1
  130. package/corpus/templates/clips/app/i18n/zh-TW.ts +11 -1
  131. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +72 -1
  132. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +1 -1
  133. package/corpus/templates/clips/app/routes/record.tsx +3 -3
  134. package/corpus/templates/clips/app/routes/share.$shareId.tsx +6 -3
  135. package/corpus/templates/clips/changelog/2026-07-17-choose-which-workspace-receives-new-clips-recordings-and-des.md +6 -0
  136. package/corpus/templates/clips/changelog/2026-07-17-clips-now-retries-storage-verification-in-the-background-ins.md +6 -0
  137. package/corpus/templates/clips/changelog/2026-07-17-create-folders-directly-from-the-move-menu.md +6 -0
  138. package/corpus/templates/clips/changelog/2026-07-17-failed-desktop-uploads-now-offer-a-direct-way-to-reopen-clip.md +6 -0
  139. package/corpus/templates/clips/changelog/2026-07-17-fixed-broken-thumbnail-icons-appearing-over-playable-clip-em.md +6 -0
  140. package/corpus/templates/clips/changelog/2026-07-17-playback-comments-stay-readable-at-faster-playback-speeds.md +6 -0
  141. package/corpus/templates/clips/chrome-extension/src/finalize-recovery.ts +3 -0
  142. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +3 -3
  143. package/corpus/templates/clips/desktop/src/app.tsx +19 -7
  144. package/corpus/templates/clips/desktop/src/lib/recorder.ts +111 -13
  145. package/corpus/templates/clips/desktop/src/lib/upload-verification.ts +16 -7
  146. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +2 -4
  147. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/live_upload.rs +32 -15
  148. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +45 -18
  149. package/corpus/templates/clips/server/jobs/media-verification.ts +130 -0
  150. package/corpus/templates/clips/server/lib/builder-media-compression.ts +15 -0
  151. package/corpus/templates/clips/server/lib/media-verification-state.ts +38 -0
  152. package/corpus/templates/clips/server/lib/player-thumbnail-url.ts +31 -0
  153. package/corpus/templates/clips/server/lib/post-finalize-dispatch.ts +10 -3
  154. package/corpus/templates/clips/server/plugins/auth.ts +5 -5
  155. package/corpus/templates/clips/server/plugins/calendar-jobs.ts +2 -0
  156. package/corpus/templates/clips/server/routes/api/_agent-native-background/post-finalize-worker.post.ts +12 -2
  157. package/corpus/templates/clips/server/routes/api/public-recording.get.ts +6 -1
  158. package/corpus/templates/clips/server/routes/api/thumbnail/[recordingId].get.ts +340 -0
  159. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/abort.post.ts +24 -7
  160. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +91 -7
  161. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/status.get.ts +14 -0
  162. package/corpus/templates/clips/shared/finalize-recovery.ts +61 -2
  163. package/corpus/templates/clips/shared/share-meta.ts +1 -1
  164. package/corpus/templates/content/app/entry.client.tsx +6 -1
  165. package/corpus/templates/dispatch/AGENTS.md +5 -0
  166. package/corpus/templates/dispatch/changelog/2026-07-17-apps-page-links-to-other-available-apps.md +6 -0
  167. package/corpus/templates/dispatch/changelog/2026-07-17-curated-template-remixes.md +6 -0
  168. package/corpus/templates/mail/app/entry.client.tsx +6 -1
  169. package/corpus/templates/slides/.agents/skills/slide-images/SKILL.md +11 -7
  170. package/corpus/templates/slides/.env.example +0 -1
  171. package/corpus/templates/slides/AGENTS.md +4 -0
  172. package/corpus/templates/slides/DEVELOPING.md +2 -2
  173. package/corpus/templates/slides/actions/index-design-system-with-builder.ts +1 -1
  174. package/corpus/templates/slides/actions/logo-config.ts +6 -7
  175. package/corpus/templates/slides/actions/search-images.ts +11 -39
  176. package/corpus/templates/slides/actions/search-logos.ts +5 -52
  177. package/corpus/templates/slides/app/components/editor/ImageSearchPanel.tsx +1 -1
  178. package/corpus/templates/slides/app/components/editor/LogoSearchPanel.tsx +16 -26
  179. package/corpus/templates/slides/app/entry.client.tsx +6 -1
  180. package/corpus/templates/slides/server/lib/media-search-providers.ts +216 -0
  181. package/corpus/templates/slides/server/register-secrets.ts +30 -0
  182. package/dist/a2a/client.d.ts +47 -1
  183. package/dist/a2a/client.d.ts.map +1 -1
  184. package/dist/a2a/client.js +94 -12
  185. package/dist/a2a/client.js.map +1 -1
  186. package/dist/a2a/correlation.d.ts +10 -0
  187. package/dist/a2a/correlation.d.ts.map +1 -0
  188. package/dist/a2a/correlation.js +40 -0
  189. package/dist/a2a/correlation.js.map +1 -0
  190. package/dist/a2a/handlers.d.ts.map +1 -1
  191. package/dist/a2a/handlers.js +147 -15
  192. package/dist/a2a/handlers.js.map +1 -1
  193. package/dist/a2a/index.d.ts +4 -4
  194. package/dist/a2a/index.d.ts.map +1 -1
  195. package/dist/a2a/index.js +2 -2
  196. package/dist/a2a/index.js.map +1 -1
  197. package/dist/a2a/invoke.d.ts +29 -2
  198. package/dist/a2a/invoke.d.ts.map +1 -1
  199. package/dist/a2a/invoke.js +33 -1
  200. package/dist/a2a/invoke.js.map +1 -1
  201. package/dist/a2a/server.d.ts.map +1 -1
  202. package/dist/a2a/server.js +14 -1
  203. package/dist/a2a/server.js.map +1 -1
  204. package/dist/a2a/task-store.d.ts +12 -1
  205. package/dist/a2a/task-store.d.ts.map +1 -1
  206. package/dist/a2a/task-store.js +96 -6
  207. package/dist/a2a/task-store.js.map +1 -1
  208. package/dist/a2a/types.d.ts +27 -0
  209. package/dist/a2a/types.d.ts.map +1 -1
  210. package/dist/a2a/types.js.map +1 -1
  211. package/dist/action.d.ts +5 -2
  212. package/dist/action.d.ts.map +1 -1
  213. package/dist/action.js.map +1 -1
  214. package/dist/agent/production-agent.d.ts +14 -0
  215. package/dist/agent/production-agent.d.ts.map +1 -1
  216. package/dist/agent/production-agent.js +19 -3
  217. package/dist/agent/production-agent.js.map +1 -1
  218. package/dist/client/AssistantChat.d.ts +14 -1
  219. package/dist/client/AssistantChat.d.ts.map +1 -1
  220. package/dist/client/AssistantChat.js +158 -136
  221. package/dist/client/AssistantChat.js.map +1 -1
  222. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  223. package/dist/client/MultiTabAssistantChat.js +27 -4
  224. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  225. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  226. package/dist/client/agent-chat-adapter.js +21 -39
  227. package/dist/client/agent-chat-adapter.js.map +1 -1
  228. package/dist/client/agent-sidebar-state.d.ts +1 -0
  229. package/dist/client/agent-sidebar-state.d.ts.map +1 -1
  230. package/dist/client/agent-sidebar-state.js +4 -0
  231. package/dist/client/agent-sidebar-state.js.map +1 -1
  232. package/dist/client/analytics.d.ts +14 -0
  233. package/dist/client/analytics.d.ts.map +1 -1
  234. package/dist/client/analytics.js +67 -0
  235. package/dist/client/analytics.js.map +1 -1
  236. package/dist/client/chat/message-components.d.ts +8 -0
  237. package/dist/client/chat/message-components.d.ts.map +1 -1
  238. package/dist/client/chat/message-components.js +62 -19
  239. package/dist/client/chat/message-components.js.map +1 -1
  240. package/dist/client/chat/tool-call-display.d.ts +6 -0
  241. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  242. package/dist/client/chat/tool-call-display.js +83 -14
  243. package/dist/client/chat/tool-call-display.js.map +1 -1
  244. package/dist/client/chat/use-agent-chat-lifecycle-tracking.d.ts +8 -0
  245. package/dist/client/chat/use-agent-chat-lifecycle-tracking.d.ts.map +1 -0
  246. package/dist/client/chat/use-agent-chat-lifecycle-tracking.js +51 -0
  247. package/dist/client/chat/use-agent-chat-lifecycle-tracking.js.map +1 -0
  248. package/dist/client/chat-thread-url.d.ts +2 -0
  249. package/dist/client/chat-thread-url.d.ts.map +1 -0
  250. package/dist/client/chat-thread-url.js +12 -0
  251. package/dist/client/chat-thread-url.js.map +1 -0
  252. package/dist/client/error-capture.d.ts.map +1 -1
  253. package/dist/client/error-capture.js +7 -0
  254. package/dist/client/error-capture.js.map +1 -1
  255. package/dist/client/extensions/ExtensionSlot.d.ts +3 -1
  256. package/dist/client/extensions/ExtensionSlot.d.ts.map +1 -1
  257. package/dist/client/extensions/ExtensionSlot.js +28 -3
  258. package/dist/client/extensions/ExtensionSlot.js.map +1 -1
  259. package/dist/client/index.d.ts +1 -1
  260. package/dist/client/index.d.ts.map +1 -1
  261. package/dist/client/index.js +1 -1
  262. package/dist/client/index.js.map +1 -1
  263. package/dist/client/route-chunk-recovery.d.ts.map +1 -1
  264. package/dist/client/route-chunk-recovery.js +14 -9
  265. package/dist/client/route-chunk-recovery.js.map +1 -1
  266. package/dist/client/session-replay.d.ts +15 -0
  267. package/dist/client/session-replay.d.ts.map +1 -1
  268. package/dist/client/session-replay.js +20 -0
  269. package/dist/client/session-replay.js.map +1 -1
  270. package/dist/client/use-run-stuck-detection.d.ts.map +1 -1
  271. package/dist/client/use-run-stuck-detection.js +25 -1
  272. package/dist/client/use-run-stuck-detection.js.map +1 -1
  273. package/dist/db/client.d.ts +7 -0
  274. package/dist/db/client.d.ts.map +1 -1
  275. package/dist/db/client.js +33 -0
  276. package/dist/db/client.js.map +1 -1
  277. package/dist/extensions/actions.d.ts.map +1 -1
  278. package/dist/extensions/actions.js +2 -10
  279. package/dist/extensions/actions.js.map +1 -1
  280. package/dist/extensions/store.js +1 -1
  281. package/dist/extensions/store.js.map +1 -1
  282. package/dist/localization/default-messages.d.ts +3 -0
  283. package/dist/localization/default-messages.d.ts.map +1 -1
  284. package/dist/localization/default-messages.js +3 -0
  285. package/dist/localization/default-messages.js.map +1 -1
  286. package/dist/mcp/build-server.d.ts +2 -0
  287. package/dist/mcp/build-server.d.ts.map +1 -1
  288. package/dist/mcp/build-server.js +2 -2
  289. package/dist/mcp/build-server.js.map +1 -1
  290. package/dist/notifications/routes.d.ts +2 -2
  291. package/dist/observability/routes.d.ts +5 -5
  292. package/dist/observability/traces.d.ts +9 -0
  293. package/dist/observability/traces.d.ts.map +1 -1
  294. package/dist/observability/traces.js +137 -19
  295. package/dist/observability/traces.js.map +1 -1
  296. package/dist/progress/actions.d.ts.map +1 -1
  297. package/dist/progress/actions.js +3 -2
  298. package/dist/progress/actions.js.map +1 -1
  299. package/dist/progress/routes.d.ts +1 -1
  300. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  301. package/dist/provider-api/index.d.ts.map +1 -1
  302. package/dist/provider-api/index.js +91 -8
  303. package/dist/provider-api/index.js.map +1 -1
  304. package/dist/scripts/call-agent.d.ts.map +1 -1
  305. package/dist/scripts/call-agent.js +140 -17
  306. package/dist/scripts/call-agent.js.map +1 -1
  307. package/dist/secrets/routes.d.ts +9 -9
  308. package/dist/server/agent-chat/action-filters-a2a.d.ts +24 -2
  309. package/dist/server/agent-chat/action-filters-a2a.d.ts.map +1 -1
  310. package/dist/server/agent-chat/action-filters-a2a.js +62 -7
  311. package/dist/server/agent-chat/action-filters-a2a.js.map +1 -1
  312. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  313. package/dist/server/agent-chat-plugin.js +118 -5
  314. package/dist/server/agent-chat-plugin.js.map +1 -1
  315. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  316. package/dist/server/transcribe-voice.d.ts +1 -1
  317. package/dist/styles/agent-conversation.css +7 -0
  318. package/dist/templates/default/app/i18n/ar-SA.ts +20 -0
  319. package/dist/templates/default/app/i18n/de-DE.ts +20 -0
  320. package/dist/templates/default/app/i18n/en-US.ts +20 -0
  321. package/dist/templates/default/app/i18n/es-ES.ts +20 -0
  322. package/dist/templates/default/app/i18n/fr-FR.ts +21 -0
  323. package/dist/templates/default/app/i18n/hi-IN.ts +19 -0
  324. package/dist/templates/default/app/i18n/ja-JP.ts +20 -0
  325. package/dist/templates/default/app/i18n/ko-KR.ts +19 -0
  326. package/dist/templates/default/app/i18n/pt-BR.ts +20 -0
  327. package/dist/templates/default/app/i18n/zh-CN.ts +19 -0
  328. package/dist/templates/default/app/i18n/zh-TW.ts +19 -0
  329. package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +49 -0
  330. package/dist/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
  331. package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +7 -1
  332. package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
  333. package/dist/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -1
  334. package/package.json +1 -1
  335. package/src/templates/default/app/i18n/ar-SA.ts +20 -0
  336. package/src/templates/default/app/i18n/de-DE.ts +20 -0
  337. package/src/templates/default/app/i18n/en-US.ts +20 -0
  338. package/src/templates/default/app/i18n/es-ES.ts +20 -0
  339. package/src/templates/default/app/i18n/fr-FR.ts +21 -0
  340. package/src/templates/default/app/i18n/hi-IN.ts +19 -0
  341. package/src/templates/default/app/i18n/ja-JP.ts +20 -0
  342. package/src/templates/default/app/i18n/ko-KR.ts +19 -0
  343. package/src/templates/default/app/i18n/pt-BR.ts +20 -0
  344. package/src/templates/default/app/i18n/zh-CN.ts +19 -0
  345. package/src/templates/default/app/i18n/zh-TW.ts +19 -0
  346. package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +49 -0
  347. package/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
  348. package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +7 -1
  349. package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
  350. package/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -1
  351. package/corpus/templates/analytics/server/handlers/github.ts +0 -200
  352. package/corpus/templates/analytics/server/handlers/pylon.ts +0 -43
  353. package/corpus/templates/analytics/server/lib/apollo.ts +0 -167
  354. package/corpus/templates/analytics/server/lib/commonroom.ts +0 -149
  355. package/corpus/templates/analytics/server/lib/github.ts +0 -660
  356. package/corpus/templates/analytics/server/lib/mixpanel.ts +0 -156
  357. package/corpus/templates/analytics/server/lib/posthog.ts +0 -194
  358. package/corpus/templates/analytics/server/lib/pylon.ts +0 -109
  359. package/corpus/templates/analytics/server/routes/api/github/graphql.post.ts +0 -1
  360. package/corpus/templates/analytics/server/routes/api/github/issue.get.ts +0 -1
  361. package/corpus/templates/analytics/server/routes/api/github/org-prs.get.ts +0 -1
  362. package/corpus/templates/analytics/server/routes/api/github/pr.get.ts +0 -1
  363. package/corpus/templates/analytics/server/routes/api/github/prs.get.ts +0 -1
  364. package/corpus/templates/analytics/server/routes/api/github/search.get.ts +0 -1
  365. package/corpus/templates/slides/actions/fetch-logos.ts +0 -90
  366. package/corpus/templates/slides/actions/image-search.ts +0 -64
  367. package/corpus/templates/slides/actions/import-github.ts +0 -182
  368. package/corpus/templates/slides/actions/logo-lookup.ts +0 -113
@@ -1,5 +1,11 @@
1
1
  import { useT } from "@agent-native/core/client";
2
- import { IconArchive, IconFolder, IconTrash, IconX } from "@tabler/icons-react";
2
+ import {
3
+ IconArchive,
4
+ IconFolder,
5
+ IconFolderPlus,
6
+ IconTrash,
7
+ IconX,
8
+ } from "@tabler/icons-react";
3
9
 
4
10
  import { Button } from "@/components/ui/button";
5
11
  import {
@@ -27,6 +33,7 @@ interface BulkActionToolbarProps {
27
33
  onClear?: () => void;
28
34
  moveTargets?: BulkMoveTarget[];
29
35
  isPending?: boolean;
36
+ onCreateFolder?: () => void;
30
37
  }
31
38
 
32
39
  export function BulkActionToolbar({
@@ -37,6 +44,7 @@ export function BulkActionToolbar({
37
44
  onClear,
38
45
  moveTargets = [],
39
46
  isPending = false,
47
+ onCreateFolder,
40
48
  }: BulkActionToolbarProps) {
41
49
  const t = useT();
42
50
  if (count === 0) return null;
@@ -78,6 +86,16 @@ export function BulkActionToolbar({
78
86
  {t("clipsFinalRaw.moveSelected", { count })}
79
87
  </DropdownMenuLabel>
80
88
  <DropdownMenuSeparator />
89
+ <DropdownMenuItem
90
+ disabled={isPending}
91
+ onSelect={() => {
92
+ setTimeout(() => onCreateFolder?.(), 0);
93
+ }}
94
+ >
95
+ <IconFolderPlus className="h-4 w-4 me-2" />
96
+ {t("navigation.newFolder")}
97
+ </DropdownMenuItem>
98
+ <DropdownMenuSeparator />
81
99
  {moveTargets.map((target, index) => (
82
100
  <DropdownMenuItem
83
101
  key={target.id ?? `root-${index}`}
@@ -0,0 +1,123 @@
1
+ import { useT } from "@agent-native/core/client";
2
+ import { IconLoader2 } from "@tabler/icons-react";
3
+ import { FormEvent, useState } from "react";
4
+ import { toast } from "sonner";
5
+
6
+ import { Button } from "@/components/ui/button";
7
+ import {
8
+ Dialog,
9
+ DialogContent,
10
+ DialogDescription,
11
+ DialogFooter,
12
+ DialogHeader,
13
+ DialogTitle,
14
+ } from "@/components/ui/dialog";
15
+ import { Input } from "@/components/ui/input";
16
+ import { Label } from "@/components/ui/label";
17
+ import { useCreateFolder } from "@/hooks/use-library";
18
+
19
+ interface CreatedFolder {
20
+ id: string;
21
+ }
22
+
23
+ interface CreateFolderDialogProps {
24
+ open: boolean;
25
+ onOpenChange: (open: boolean) => void;
26
+ spaceId?: string | null;
27
+ parentId?: string | null;
28
+ onCreated?: (folder: CreatedFolder) => void;
29
+ }
30
+
31
+ export function CreateFolderDialog({
32
+ open,
33
+ onOpenChange,
34
+ spaceId,
35
+ parentId,
36
+ onCreated,
37
+ }: CreateFolderDialogProps) {
38
+ const t = useT();
39
+ const createFolder = useCreateFolder();
40
+ const [name, setName] = useState("");
41
+
42
+ function reset() {
43
+ setName("");
44
+ }
45
+
46
+ function handleSubmit(event: FormEvent<HTMLFormElement>) {
47
+ event.preventDefault();
48
+ const trimmed = name.trim();
49
+ if (!trimmed || createFolder.isPending) return;
50
+
51
+ createFolder.mutate(
52
+ {
53
+ name: trimmed,
54
+ ...(spaceId ? { spaceId } : {}),
55
+ ...(parentId ? { parentId } : {}),
56
+ },
57
+ {
58
+ onSuccess: (folder) => {
59
+ toast.success(t("navigation.folderCreated"));
60
+ onCreated?.(folder);
61
+ reset();
62
+ onOpenChange(false);
63
+ },
64
+ onError: (err: any) => {
65
+ toast.error(err?.message ?? t("navigation.createFolderError"));
66
+ },
67
+ },
68
+ );
69
+ }
70
+
71
+ return (
72
+ <Dialog
73
+ open={open}
74
+ onOpenChange={(nextOpen) => {
75
+ onOpenChange(nextOpen);
76
+ if (!nextOpen) reset();
77
+ }}
78
+ >
79
+ <DialogContent className="sm:max-w-md">
80
+ <DialogHeader>
81
+ <DialogTitle>{t("navigation.newFolder")}</DialogTitle>
82
+ <DialogDescription className="sr-only">
83
+ {t("navigation.folderNamePlaceholder")}
84
+ </DialogDescription>
85
+ </DialogHeader>
86
+ <form onSubmit={handleSubmit} className="space-y-5">
87
+ <div className="space-y-1.5">
88
+ <Label htmlFor="new-folder-name">
89
+ {t("navigation.folderNamePlaceholder")}
90
+ </Label>
91
+ <Input
92
+ id="new-folder-name"
93
+ autoFocus
94
+ value={name}
95
+ onChange={(event) => setName(event.target.value)}
96
+ placeholder={t("navigation.folderNamePlaceholder")}
97
+ disabled={createFolder.isPending}
98
+ />
99
+ </div>
100
+ <DialogFooter>
101
+ <Button
102
+ type="button"
103
+ variant="outline"
104
+ onClick={() => onOpenChange(false)}
105
+ disabled={createFolder.isPending}
106
+ >
107
+ {t("common.cancel")}
108
+ </Button>
109
+ <Button
110
+ type="submit"
111
+ disabled={!name.trim() || createFolder.isPending}
112
+ >
113
+ {createFolder.isPending && (
114
+ <IconLoader2 className="h-4 w-4 animate-spin" />
115
+ )}
116
+ {t("common.create")}
117
+ </Button>
118
+ </DialogFooter>
119
+ </form>
120
+ </DialogContent>
121
+ </Dialog>
122
+ );
123
+ }
@@ -7,6 +7,7 @@ import { IconAlertTriangle } from "@tabler/icons-react";
7
7
  import { useEffect, useMemo, useState } from "react";
8
8
  import { toast } from "sonner";
9
9
 
10
+ import { CreateFolderDialog } from "@/components/library/create-folder-dialog";
10
11
  import { ShareRecordingDialog } from "@/components/player/share-dialog";
11
12
  import { Button } from "@/components/ui/button";
12
13
  import {
@@ -59,6 +60,10 @@ interface FolderTargetRow {
59
60
  name: string;
60
61
  }
61
62
 
63
+ type CreateFolderTarget =
64
+ | { kind: "single"; recording: RecordingSummary }
65
+ | { kind: "bulk"; recordingIds: string[] };
66
+
62
67
  function buildMoveTargets(
63
68
  folders: FolderTargetRow[],
64
69
  currentFolderId: string | null,
@@ -102,6 +107,8 @@ export function LibraryGrid({
102
107
  const [selected, setSelected] = useState<Set<string>>(new Set());
103
108
  const selectionMode = selected.size > 0;
104
109
  const [sharingRec, setSharingRec] = useState<RecordingSummary | null>(null);
110
+ const [createFolderTarget, setCreateFolderTarget] =
111
+ useState<CreateFolderTarget | null>(null);
105
112
  const [isBulkPending, setIsBulkPending] = useState(false);
106
113
  const selectionStateKey = useMemo(() => `selection:${getBrowserTabId()}`, []);
107
114
 
@@ -195,15 +202,18 @@ export function LibraryGrid({
195
202
  setSelected(new Set());
196
203
  };
197
204
 
198
- const moveSelected = async (targetFolderId: string | null) => {
199
- if (selectedIds.length === 0) return;
205
+ const moveRecordings = async (
206
+ ids: string[],
207
+ targetFolderId: string | null,
208
+ ) => {
209
+ if (ids.length === 0) return;
200
210
  setIsBulkPending(true);
201
211
  try {
202
212
  await moveRecording.mutateAsync({
203
- ids: selectedIds,
213
+ ids,
204
214
  folderId: targetFolderId,
205
215
  });
206
- toast.success(t("libraryGrid.clipsMoved", { count: selectedIds.length }));
216
+ toast.success(t("libraryGrid.clipsMoved", { count: ids.length }));
207
217
  clearSelection();
208
218
  } catch (err: any) {
209
219
  toast.error(err?.message ?? t("libraryGrid.moveFailed"));
@@ -212,6 +222,9 @@ export function LibraryGrid({
212
222
  }
213
223
  };
214
224
 
225
+ const moveSelected = (targetFolderId: string | null) =>
226
+ moveRecordings(selectedIds, targetFolderId);
227
+
215
228
  const moveSingle = async (
216
229
  rec: RecordingSummary,
217
230
  targetFolderId: string | null,
@@ -265,6 +278,22 @@ export function LibraryGrid({
265
278
  }}
266
279
  />
267
280
  )}
281
+ <CreateFolderDialog
282
+ open={Boolean(createFolderTarget)}
283
+ onOpenChange={(open) => {
284
+ if (!open) setCreateFolderTarget(null);
285
+ }}
286
+ spaceId={view === "space" ? spaceId : null}
287
+ parentId={folderId}
288
+ onCreated={(folder) => {
289
+ if (!createFolderTarget) return;
290
+ if (createFolderTarget.kind === "single") {
291
+ void moveSingle(createFolderTarget.recording, folder.id);
292
+ } else {
293
+ void moveRecordings(createFolderTarget.recordingIds, folder.id);
294
+ }
295
+ }}
296
+ />
268
297
 
269
298
  {/* Page header — rendered into the top app bar */}
270
299
  <PageHeader>
@@ -352,6 +381,9 @@ export function LibraryGrid({
352
381
  moveTargets={moveTargets}
353
382
  onMove={canMoveSelection ? moveSingle : undefined}
354
383
  isMovePending={moveRecording.isPending}
384
+ onCreateFolder={() => {
385
+ setCreateFolderTarget({ kind: "single", recording: r });
386
+ }}
355
387
  onTrash={
356
388
  canManageRecordings
357
389
  ? (rec) => {
@@ -470,6 +502,12 @@ export function LibraryGrid({
470
502
  }
471
503
  }}
472
504
  onMove={canMoveSelection ? moveSelected : undefined}
505
+ onCreateFolder={() => {
506
+ setCreateFolderTarget({
507
+ kind: "bulk",
508
+ recordingIds: selectedIds,
509
+ });
510
+ }}
473
511
  onClear={clearSelection}
474
512
  isPending={isBulkPending || moveRecording.isPending}
475
513
  />
@@ -7,10 +7,12 @@ import {
7
7
  IconPlayerPlay,
8
8
  IconShare,
9
9
  IconFolder,
10
+ IconFolderPlus,
10
11
  IconArchive,
11
12
  IconTrash,
12
13
  IconCheck,
13
14
  IconAlertTriangle,
15
+ IconExternalLink,
14
16
  } from "@tabler/icons-react";
15
17
  import { useCallback, useMemo, useState } from "react";
16
18
  import { Link } from "react-router";
@@ -31,6 +33,7 @@ import {
31
33
  import { Skeleton } from "@/components/ui/skeleton";
32
34
  import { isDefaultTitle } from "@/hooks/use-auto-title";
33
35
  import type { RecordingSummary } from "@/hooks/use-library";
36
+ import { attemptOpenDesktopApp } from "@/lib/capture-install-options";
34
37
  import { isStaleRecordingUpload } from "@/lib/recording-status";
35
38
  import { isStorageSetupFailureReason } from "@/lib/storage-failures";
36
39
  import { cn } from "@/lib/utils";
@@ -67,6 +70,7 @@ interface RecordingCardProps {
67
70
  onMove?: (rec: RecordingSummary, folderId: string | null) => void;
68
71
  moveTargets?: BulkMoveTarget[];
69
72
  isMovePending?: boolean;
73
+ onCreateFolder?: () => void;
70
74
  onArchive?: (rec: RecordingSummary) => void;
71
75
  onTrash?: (rec: RecordingSummary) => void;
72
76
  readOnly?: boolean;
@@ -81,6 +85,7 @@ export function RecordingCard({
81
85
  onMove,
82
86
  moveTargets = [],
83
87
  isMovePending = false,
88
+ onCreateFolder,
84
89
  onArchive,
85
90
  onTrash,
86
91
  readOnly = false,
@@ -175,6 +180,11 @@ export function RecordingCard({
175
180
  [onTrash, recording],
176
181
  );
177
182
 
183
+ const handleOpenDesktopApp = useCallback((e: React.MouseEvent) => {
184
+ e.stopPropagation();
185
+ attemptOpenDesktopApp();
186
+ }, []);
187
+
178
188
  return (
179
189
  <div
180
190
  role="article"
@@ -281,6 +291,16 @@ export function RecordingCard({
281
291
  ? t("clipsFinalRaw.retryFromClipsMenu")
282
292
  : failureReason}
283
293
  </div>
294
+ {nativeUploadPaused ? (
295
+ <button
296
+ type="button"
297
+ onClick={handleOpenDesktopApp}
298
+ className="pointer-events-auto mt-1.5 inline-flex items-center gap-1 rounded border border-border px-1.5 py-0.5 text-[10px] font-medium text-foreground hover:bg-accent"
299
+ >
300
+ <IconExternalLink className="h-3 w-3" />
301
+ {t("captureInstall.openDesktopApp")}
302
+ </button>
303
+ ) : null}
284
304
  </div>
285
305
  {!waitingForStorage && onTrash && (
286
306
  <button
@@ -365,6 +385,16 @@ export function RecordingCard({
365
385
  {t("clipsFinalRaw.moveToFolder")}
366
386
  </DropdownMenuSubTrigger>
367
387
  <DropdownMenuSubContent className="w-64">
388
+ <DropdownMenuItem
389
+ disabled={isMovePending}
390
+ onSelect={() => {
391
+ setTimeout(() => onCreateFolder?.(), 0);
392
+ }}
393
+ >
394
+ <IconFolderPlus className="h-4 w-4 me-2" />
395
+ {t("navigation.newFolder")}
396
+ </DropdownMenuItem>
397
+ <DropdownMenuSeparator />
368
398
  {moveTargets.map((target, index) => (
369
399
  <DropdownMenuItem
370
400
  key={target.id ?? `root-${index}`}
@@ -1,5 +1,11 @@
1
1
  export const PLAYBACK_COMMENT_VISIBLE_MS = 4_000;
2
2
 
3
+ export function getPlaybackCommentVisibleMs(playbackRate = 1): number {
4
+ const safePlaybackRate =
5
+ Number.isFinite(playbackRate) && playbackRate > 0 ? playbackRate : 1;
6
+ return PLAYBACK_COMMENT_VISIBLE_MS * safePlaybackRate;
7
+ }
8
+
3
9
  export interface PlaybackComment {
4
10
  id: string;
5
11
  content: string;
@@ -13,11 +19,14 @@ export interface PlaybackComment {
13
19
  export function getActivePlaybackComments(
14
20
  comments: PlaybackComment[] | undefined,
15
21
  currentMs: number,
22
+ playbackRate = 1,
16
23
  ): PlaybackComment[] {
17
24
  if (!comments?.length || !Number.isFinite(currentMs) || currentMs < 0) {
18
25
  return [];
19
26
  }
20
27
 
28
+ const visibleMs = getPlaybackCommentVisibleMs(playbackRate);
29
+
21
30
  return comments
22
31
  .filter((comment) => {
23
32
  const timestamp = comment.videoTimestampMs;
@@ -28,7 +37,7 @@ export function getActivePlaybackComments(
28
37
  Number.isFinite(timestamp) &&
29
38
  timestamp >= 0 &&
30
39
  currentMs >= timestamp &&
31
- currentMs < timestamp + PLAYBACK_COMMENT_VISIBLE_MS
40
+ currentMs < timestamp + visibleMs
32
41
  );
33
42
  })
34
43
  .sort(
@@ -40,11 +49,17 @@ export function getActivePlaybackComments(
40
49
  export function PlaybackCommentOverlay({
41
50
  comments,
42
51
  currentMs,
52
+ playbackRate = 1,
43
53
  }: {
44
54
  comments: PlaybackComment[] | undefined;
45
55
  currentMs: number;
56
+ playbackRate?: number;
46
57
  }) {
47
- const activeComments = getActivePlaybackComments(comments, currentMs);
58
+ const activeComments = getActivePlaybackComments(
59
+ comments,
60
+ currentMs,
61
+ playbackRate,
62
+ );
48
63
  if (activeComments.length === 0) return null;
49
64
 
50
65
  return (
@@ -318,6 +318,7 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
318
318
  // Whether we've already captured-and-uploaded a still-frame thumbnail for
319
319
  // this clip. Owner-only and once per player lifecycle.
320
320
  const thumbnailCapturedRef = useRef(false);
321
+ const [thumbnailLoadFailed, setThumbnailLoadFailed] = useState(false);
321
322
  // "Preparing your clip…" overlay — shown while the browser buffers the
322
323
  // first frame of a freshly-finalized clip so the user doesn't see a blank
323
324
  // black rectangle. Hidden on loadeddata / canplay / currentTime > 0, or
@@ -933,6 +934,10 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
933
934
  setPlayError(null);
934
935
  }, [activeVideoSourceIdentity, recordingId]);
935
936
 
937
+ useEffect(() => {
938
+ setThumbnailLoadFailed(false);
939
+ }, [recordingId, thumbnailUrl]);
940
+
936
941
  useEffect(() => {
937
942
  let cancelled = false;
938
943
  setShouldRefreshAutoThumbnail(false);
@@ -1188,10 +1193,11 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
1188
1193
  // retry on a format that will never play. Show the poster with a
1189
1194
  // clear, non-looping explanation instead.
1190
1195
  <div className="relative flex h-full w-full items-center justify-center bg-black">
1191
- {thumbnailUrl ? (
1196
+ {thumbnailUrl && !thumbnailLoadFailed ? (
1192
1197
  <img
1193
1198
  src={resolveLocalUrl(thumbnailUrl)}
1194
1199
  alt=""
1200
+ onError={() => setThumbnailLoadFailed(true)}
1195
1201
  className={cn(
1196
1202
  "absolute inset-0 h-full w-full",
1197
1203
  cover ? "object-cover" : "object-contain",
@@ -1447,6 +1453,7 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
1447
1453
  )}
1448
1454
 
1449
1455
  {thumbnailUrl &&
1456
+ !thumbnailLoadFailed &&
1450
1457
  !autoPlay &&
1451
1458
  !hasPlaybackStarted &&
1452
1459
  (!startMs || startMs <= 0) ? (
@@ -1454,6 +1461,7 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
1454
1461
  src={resolveLocalUrl(thumbnailUrl)}
1455
1462
  alt=""
1456
1463
  aria-hidden="true"
1464
+ onError={() => setThumbnailLoadFailed(true)}
1457
1465
  className={cn(
1458
1466
  "pointer-events-none absolute inset-0 z-[1] h-full w-full",
1459
1467
  cover ? "object-cover" : "object-contain",
@@ -1495,7 +1503,11 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
1495
1503
 
1496
1504
  {/* Timestamped comments */}
1497
1505
  {!hideChrome && !isLoomEmbed && hasPlaybackStarted ? (
1498
- <PlaybackCommentOverlay comments={comments} currentMs={currentMs} />
1506
+ <PlaybackCommentOverlay
1507
+ comments={comments}
1508
+ currentMs={currentMs}
1509
+ playbackRate={speed}
1510
+ />
1499
1511
  ) : null}
1500
1512
 
1501
1513
  {/* Floating CTA (throughout placement) */}
@@ -11,7 +11,7 @@ import {
11
11
  captureClientException,
12
12
  trackEvent,
13
13
  } from "@agent-native/core/client";
14
- import { waitForReadyRecordingAfterFinalizeError } from "@shared/finalize-recovery";
14
+ import { waitForAcceptedRecordingAfterFinalizeError } from "@shared/finalize-recovery";
15
15
  import {
16
16
  chooseFallbackAudioInput,
17
17
  enumerateAudioInputDevices,
@@ -2231,7 +2231,7 @@ export class RecorderEngine {
2231
2231
  private async recoverReadyAfterFinalUploadError(
2232
2232
  signal?: AbortSignal,
2233
2233
  ): Promise<Record<string, unknown> | null> {
2234
- return waitForReadyRecordingAfterFinalizeError({
2234
+ return waitForAcceptedRecordingAfterFinalizeError({
2235
2235
  uploadUrl: this.opts.uploadUrl,
2236
2236
  recordingId: this.opts.recordingId,
2237
2237
  preferAuthenticated: true,
@@ -1,7 +1,12 @@
1
- import { appBasePath } from "@agent-native/core/client/api-path";
1
+ import {
2
+ appBasePath,
3
+ installRouteChunkRecovery,
4
+ } from "@agent-native/core/client";
2
5
  import { hydrateRoot } from "react-dom/client";
3
6
  import { HydratedRouter } from "react-router/dom";
4
7
 
8
+ installRouteChunkRecovery();
9
+
5
10
  const basePath = appBasePath();
6
11
  const pathname = window.location.pathname;
7
12
  const routerBasePath =
@@ -623,6 +623,16 @@ const messages = {
623
623
  languageDescription:
624
624
  "اختر لغة الواجهة لهذا الحساب. سيتذكرها Clips عبر أجهزتك.",
625
625
  languageLabel: "لغة الواجهة",
626
+ uploadWorkspaceTitle: "مساحة العمل النشطة",
627
+ uploadWorkspaceDescription:
628
+ "اختر مساحة العمل التي يستخدمها Clips للتسجيلات الجديدة، بما في ذلك تحميلات سطح المكتب.",
629
+ uploadWorkspaceLabel: "مساحة العمل الحالية",
630
+ uploadWorkspacePlaceholder: "اختر مساحة عمل",
631
+ uploadWorkspaceHint:
632
+ "يؤدي تغييرها أيضًا إلى تحديث عروض Clips المرتبطة بمساحة العمل.",
633
+ uploadWorkspaceSaving: "جارٍ حفظ مساحة العمل…",
634
+ uploadWorkspaceSaved: "تم تحديث مساحة العمل النشطة",
635
+ uploadWorkspaceSaveFailed: "تعذر تحديث مساحة العمل النشطة",
626
636
  whatsNew: "ما الجديد",
627
637
  changelogEmpty: "لا توجد تحديثات بعد.",
628
638
  viewAllUpdates: "عرض كل التحديثات",
@@ -1368,7 +1378,8 @@ const messages = {
1368
1378
  savedLocally: "حُفظ محليًا",
1369
1379
  uploadFailed: "فشل الرفع",
1370
1380
  connectStorageToFinish: "افتح للاتصال بالتخزين وإنهاء الحفظ.",
1371
- retryFromClipsMenu: "أعد المحاولة من قائمة Clips؛ لا حاجة لإعادة التسجيل.",
1381
+ retryFromClipsMenu:
1382
+ "افتح Clips من شريط القائمة لإعادة محاولة هذا الرفع المحفوظ؛ لا حاجة لإعادة التسجيل.",
1372
1383
  removeFailedClip: "إزالة هذا المقطع الفاشل.",
1373
1384
  remove: "إزالة",
1374
1385
  viewsCount: "{{count}} مشاهدة",
@@ -641,6 +641,17 @@ const messages = {
641
641
  languageDescription:
642
642
  "Wähle die Oberflächensprache für dieses Konto. Clips merkt sie sich geräteübergreifend.",
643
643
  languageLabel: "Oberflächensprache",
644
+ uploadWorkspaceTitle: "Aktiver Arbeitsbereich",
645
+ uploadWorkspaceDescription:
646
+ "Wähle den Arbeitsbereich, den Clips für neue Aufnahmen einschließlich Desktop-Uploads verwendet.",
647
+ uploadWorkspaceLabel: "Aktueller Arbeitsbereich",
648
+ uploadWorkspacePlaceholder: "Arbeitsbereich auswählen",
649
+ uploadWorkspaceHint:
650
+ "Dadurch werden auch die arbeitsbereichsbezogenen Clips-Ansichten aktualisiert.",
651
+ uploadWorkspaceSaving: "Arbeitsbereich wird gespeichert…",
652
+ uploadWorkspaceSaved: "Aktiver Arbeitsbereich aktualisiert",
653
+ uploadWorkspaceSaveFailed:
654
+ "Aktiver Arbeitsbereich konnte nicht aktualisiert werden",
644
655
  whatsNew: "Neuigkeiten",
645
656
  changelogEmpty: "Noch keine Updates.",
646
657
  viewAllUpdates: "Alle Updates anzeigen",
@@ -1397,7 +1408,7 @@ Alle sichtbaren Änderungen für Clips-Nutzer werden hier dokumentiert. Du kanns
1397
1408
  connectStorageToFinish:
1398
1409
  "Öffnen, um Speicher zu verbinden und das Speichern abzuschließen.",
1399
1410
  retryFromClipsMenu:
1400
- "Über das Clips-Menü erneut versuchen; keine neue Aufnahme nötig.",
1411
+ "Öffne Clips über die Menüleiste, um diesen gespeicherten Upload erneut zu versuchen; keine neue Aufnahme nötig.",
1401
1412
  removeFailedClip: "Diesen fehlgeschlagenen Clip entfernen.",
1402
1413
  remove: "Entfernen",
1403
1414
  viewsCount: "{{count}} Aufrufe",
@@ -619,6 +619,16 @@ const messages = {
619
619
  languageDescription:
620
620
  "Choose the interface language for this account. Clips remembers it across devices.",
621
621
  languageLabel: "Interface language",
622
+ uploadWorkspaceTitle: "Active workspace",
623
+ uploadWorkspaceDescription:
624
+ "Choose the workspace Clips uses for new recordings, including desktop uploads.",
625
+ uploadWorkspaceLabel: "Current workspace",
626
+ uploadWorkspacePlaceholder: "Choose a workspace",
627
+ uploadWorkspaceHint:
628
+ "Switching this also updates workspace-scoped Clips views.",
629
+ uploadWorkspaceSaving: "Saving workspace…",
630
+ uploadWorkspaceSaved: "Active workspace updated",
631
+ uploadWorkspaceSaveFailed: "Could not update active workspace",
622
632
  whatsNew: "What's new",
623
633
  changelogEmpty: "No updates yet.",
624
634
  viewAllUpdates: "View all updates",
@@ -1357,7 +1367,8 @@ All notable user-facing changes to Clips are documented here. Open it any time f
1357
1367
  savedLocally: "Saved locally",
1358
1368
  uploadFailed: "Upload failed",
1359
1369
  connectStorageToFinish: "Open to connect storage and finish saving.",
1360
- retryFromClipsMenu: "Retry from the Clips menu; no need to re-record.",
1370
+ retryFromClipsMenu:
1371
+ "Open Clips from the menu bar to retry this saved upload; no need to re-record.",
1361
1372
  removeFailedClip: "Remove this failed clip.",
1362
1373
  remove: "Remove",
1363
1374
  viewsCount: "{{count}} views",
@@ -636,6 +636,16 @@ const messages = {
636
636
  languageDescription:
637
637
  "Elige el idioma de la interfaz para esta cuenta. Clips lo recordará en todos tus dispositivos.",
638
638
  languageLabel: "Idioma de la interfaz",
639
+ uploadWorkspaceTitle: "Espacio activo",
640
+ uploadWorkspaceDescription:
641
+ "Elige el espacio que Clips usará para las nuevas grabaciones, incluidas las cargas desde el escritorio.",
642
+ uploadWorkspaceLabel: "Espacio actual",
643
+ uploadWorkspacePlaceholder: "Elige un espacio",
644
+ uploadWorkspaceHint:
645
+ "Al cambiarlo también se actualizan las vistas de Clips vinculadas al espacio.",
646
+ uploadWorkspaceSaving: "Guardando espacio…",
647
+ uploadWorkspaceSaved: "Espacio activo actualizado",
648
+ uploadWorkspaceSaveFailed: "No se pudo actualizar el espacio activo",
639
649
  whatsNew: "Novedades",
640
650
  changelogEmpty: "Aún no hay actualizaciones.",
641
651
  viewAllUpdates: "Ver todas las actualizaciones",
@@ -1390,7 +1400,7 @@ Todos los cambios visibles para los usuarios de Clips se documentan aquí. Puede
1390
1400
  connectStorageToFinish:
1391
1401
  "Ábrelo para conectar almacenamiento y terminar de guardar.",
1392
1402
  retryFromClipsMenu:
1393
- "Reintenta desde el menú de Clips; no hace falta grabar de nuevo.",
1403
+ "Abre Clips desde la barra de menús para reintentar esta carga guardada; no hace falta grabar de nuevo.",
1394
1404
  removeFailedClip: "Eliminar este clip fallido.",
1395
1405
  remove: "Eliminar",
1396
1406
  viewsCount: "{{count}} visualizaciones",
@@ -636,6 +636,16 @@ const messages = {
636
636
  languageDescription:
637
637
  "Choisissez la langue de l’interface pour ce compte. Clips s’en souviendra sur tous vos appareils.",
638
638
  languageLabel: "Langue de l’interface",
639
+ uploadWorkspaceTitle: "Espace actif",
640
+ uploadWorkspaceDescription:
641
+ "Choisissez l’espace utilisé par Clips pour les nouveaux enregistrements, y compris ceux importés depuis le bureau.",
642
+ uploadWorkspaceLabel: "Espace actuel",
643
+ uploadWorkspacePlaceholder: "Choisir un espace",
644
+ uploadWorkspaceHint:
645
+ "Ce changement met également à jour les vues Clips liées à l’espace.",
646
+ uploadWorkspaceSaving: "Enregistrement de l’espace…",
647
+ uploadWorkspaceSaved: "Espace actif mis à jour",
648
+ uploadWorkspaceSaveFailed: "Impossible de mettre à jour l’espace actif",
639
649
  whatsNew: "Nouveautés",
640
650
  changelogEmpty: "Aucune mise à jour pour le moment.",
641
651
  viewAllUpdates: "Voir toutes les mises à jour",
@@ -1391,7 +1401,7 @@ Tous les changements visibles par les utilisateurs de Clips sont documentés ici
1391
1401
  connectStorageToFinish:
1392
1402
  "Ouvrez pour connecter le stockage et terminer l’enregistrement.",
1393
1403
  retryFromClipsMenu:
1394
- "Réessayez depuis le menu Clips ; inutile de réenregistrer.",
1404
+ "Ouvrez Clips depuis la barre des menus pour réessayer cet envoi enregistré ; inutile de réenregistrer.",
1395
1405
  removeFailedClip: "Supprimer ce clip en échec.",
1396
1406
  remove: "Supprimer",
1397
1407
  viewsCount: "{{count}} vues",
@@ -616,6 +616,15 @@ const messages = {
616
616
  languageDescription:
617
617
  "इस खाते के लिए इंटरफ़ेस भाषा चुनें। Clips इसे आपके डिवाइसों पर याद रखेगा।",
618
618
  languageLabel: "इंटरफ़ेस भाषा",
619
+ uploadWorkspaceTitle: "सक्रिय वर्कस्पेस",
620
+ uploadWorkspaceDescription:
621
+ "वह वर्कस्पेस चुनें जिसका उपयोग Clips डेस्कटॉप अपलोड सहित नई रिकॉर्डिंग के लिए करेगा।",
622
+ uploadWorkspaceLabel: "वर्तमान वर्कस्पेस",
623
+ uploadWorkspacePlaceholder: "वर्कस्पेस चुनें",
624
+ uploadWorkspaceHint: "इसे बदलने पर वर्कस्पेस से जुड़ी Clips दृश्य भी अपडेट होती हैं।",
625
+ uploadWorkspaceSaving: "वर्कस्पेस सहेजा जा रहा है…",
626
+ uploadWorkspaceSaved: "सक्रिय वर्कस्पेस अपडेट किया गया",
627
+ uploadWorkspaceSaveFailed: "सक्रिय वर्कस्पेस अपडेट नहीं किया जा सका",
619
628
  whatsNew: "नया क्या है",
620
629
  changelogEmpty: "अभी कोई अपडेट नहीं है।",
621
630
  viewAllUpdates: "सभी अपडेट देखें",
@@ -1356,7 +1365,7 @@ Clips में उपयोगकर्ताओं को दिखने व
1356
1365
  uploadFailed: "अपलोड विफल",
1357
1366
  connectStorageToFinish: "स्टोरेज कनेक्ट करके सेव पूरा करने के लिए खोलें।",
1358
1367
  retryFromClipsMenu:
1359
- "Clips मेनू से फिर कोशिश करें; दोबारा रिकॉर्ड करने की जरूरत नहीं।",
1368
+ "इस सहेजे गए अपलोड को फिर आज़माने के लिए मेनू बार से Clips खोलें; दोबारा रिकॉर्ड करने की ज़रूरत नहीं।",
1360
1369
  removeFailedClip: "यह विफल क्लिप हटाएं।",
1361
1370
  remove: "हटाएं",
1362
1371
  viewsCount: "{{count}} बार देखा गया",