@agent-native/core 0.102.1 → 0.103.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 (295) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +15 -0
  3. package/corpus/core/docs/content/local-file-mode.mdx +99 -489
  4. package/corpus/core/docs/content/locales/ar-SA/local-file-mode.mdx +35 -490
  5. package/corpus/core/docs/content/locales/ar-SA/template-content.mdx +10 -24
  6. package/corpus/core/docs/content/locales/de-DE/local-file-mode.mdx +37 -491
  7. package/corpus/core/docs/content/locales/de-DE/template-content.mdx +10 -24
  8. package/corpus/core/docs/content/locales/es-ES/local-file-mode.mdx +35 -493
  9. package/corpus/core/docs/content/locales/es-ES/template-content.mdx +10 -24
  10. package/corpus/core/docs/content/locales/fr-FR/local-file-mode.mdx +38 -491
  11. package/corpus/core/docs/content/locales/fr-FR/template-content.mdx +10 -24
  12. package/corpus/core/docs/content/locales/hi-IN/local-file-mode.mdx +33 -492
  13. package/corpus/core/docs/content/locales/hi-IN/template-content.mdx +10 -24
  14. package/corpus/core/docs/content/locales/ja-JP/local-file-mode.mdx +36 -492
  15. package/corpus/core/docs/content/locales/ja-JP/template-content.mdx +10 -24
  16. package/corpus/core/docs/content/locales/ko-KR/local-file-mode.mdx +35 -490
  17. package/corpus/core/docs/content/locales/ko-KR/template-content.mdx +10 -24
  18. package/corpus/core/docs/content/locales/pt-BR/local-file-mode.mdx +35 -493
  19. package/corpus/core/docs/content/locales/pt-BR/template-content.mdx +10 -24
  20. package/corpus/core/docs/content/locales/zh-CN/local-file-mode.mdx +31 -489
  21. package/corpus/core/docs/content/locales/zh-CN/template-content.mdx +9 -24
  22. package/corpus/core/docs/content/locales/zh-TW/local-file-mode.mdx +31 -489
  23. package/corpus/core/docs/content/locales/zh-TW/template-content.mdx +9 -24
  24. package/corpus/core/docs/content/template-content.mdx +26 -42
  25. package/corpus/core/package.json +1 -1
  26. package/corpus/core/src/cli/content-local.ts +86 -18
  27. package/corpus/core/src/cli/index.ts +2 -2
  28. package/corpus/core/src/cli/skills-content/content-skill.ts +36 -25
  29. package/corpus/core/src/cli/skills.ts +47 -13
  30. package/corpus/core/src/client/AgentPanel.tsx +7 -0
  31. package/corpus/core/src/client/AssistantChat.tsx +7 -0
  32. package/corpus/core/src/client/agent-chat-adapter.ts +7 -1
  33. package/corpus/core/src/client/chat/message-components.tsx +17 -3
  34. package/corpus/core/src/client/composer/ComposerPlusMenu.tsx +96 -6
  35. package/corpus/core/src/client/composer/asset-picker-url.ts +80 -0
  36. package/corpus/core/src/client/error-format.ts +24 -0
  37. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +8 -1
  38. package/corpus/core/src/local-artifacts/index.ts +65 -0
  39. package/corpus/templates/assets/app/components/library/GenerationPresetsPanel.tsx +325 -0
  40. package/corpus/templates/assets/app/hooks/use-navigation-state.ts +12 -0
  41. package/corpus/templates/assets/app/i18n/zh-TW.ts +21 -0
  42. package/corpus/templates/assets/app/i18n-data.ts +215 -0
  43. package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +19 -479
  44. package/corpus/templates/assets/app/routes/brand-kits.$id_.presets.$presetId.tsx +1 -1
  45. package/corpus/templates/assets/app/routes/brand-kits.$id_.settings.tsx +446 -0
  46. package/corpus/templates/assets/app/routes/library.tsx +69 -0
  47. package/corpus/templates/assets/changelog/2026-07-15-fixed-top-level-image-picker-selections-returning-to-the-com.md +6 -0
  48. package/corpus/templates/clips/actions/disconnect-calendar.ts +57 -9
  49. package/corpus/templates/clips/actions/generate-workflow.ts +102 -59
  50. package/corpus/templates/clips/actions/get-recording-player-data.ts +64 -1
  51. package/corpus/templates/clips/actions/regenerate-summary.ts +7 -0
  52. package/corpus/templates/clips/actions/regenerate-title.ts +29 -11
  53. package/corpus/templates/clips/app/components/editor/editor-layout.tsx +34 -13
  54. package/corpus/templates/clips/app/components/editor/thumbnail-picker.tsx +87 -9
  55. package/corpus/templates/clips/app/components/editor/trim-handles.tsx +15 -0
  56. package/corpus/templates/clips/app/components/editor/waveform.tsx +21 -8
  57. package/corpus/templates/clips/app/components/library/folder-tree.tsx +52 -0
  58. package/corpus/templates/clips/app/components/player/settings-panel.tsx +116 -58
  59. package/corpus/templates/clips/app/components/player/share-dialog.tsx +43 -37
  60. package/corpus/templates/clips/app/components/player/video-player.tsx +50 -2
  61. package/corpus/templates/clips/app/components/recorder/microphone-visualizer.tsx +22 -3
  62. package/corpus/templates/clips/app/i18n/ar-SA.ts +5 -2
  63. package/corpus/templates/clips/app/i18n/de-DE.ts +6 -2
  64. package/corpus/templates/clips/app/i18n/en-US.ts +5 -2
  65. package/corpus/templates/clips/app/i18n/es-ES.ts +6 -2
  66. package/corpus/templates/clips/app/i18n/fr-FR.ts +5 -2
  67. package/corpus/templates/clips/app/i18n/hi-IN.ts +5 -2
  68. package/corpus/templates/clips/app/i18n/ja-JP.ts +6 -1
  69. package/corpus/templates/clips/app/i18n/ko-KR.ts +5 -2
  70. package/corpus/templates/clips/app/i18n/pt-BR.ts +6 -2
  71. package/corpus/templates/clips/app/i18n/zh-CN.ts +5 -2
  72. package/corpus/templates/clips/app/i18n/zh-TW.ts +5 -2
  73. package/corpus/templates/clips/app/lib/timestamp-mapping.ts +14 -0
  74. package/corpus/templates/clips/app/routes/_app.library._index.tsx +1 -2
  75. package/corpus/templates/clips/app/routes/_index.tsx +1 -2
  76. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +98 -32
  77. package/corpus/templates/clips/app/routes/share.$shareId.tsx +4 -1
  78. package/corpus/templates/clips/changelog/2026-07-15-ai-workflow-generation-now-stays-visible-avoids-duplicate-re.md +6 -0
  79. package/corpus/templates/clips/changelog/2026-07-15-clip-playback-and-cta-controls-remain-interactive-through-ed.md +6 -0
  80. package/corpus/templates/clips/changelog/2026-07-15-clip-titles-no-longer-describe-the-product-as-a-loom-alterna.md +6 -0
  81. package/corpus/templates/clips/changelog/2026-07-15-description-regeneration-now-opens-the-agent-chat-so-progres.md +6 -0
  82. package/corpus/templates/clips/changelog/2026-07-15-direct-recording-urls-now-respect-share-link-and-password-ac.md +6 -0
  83. package/corpus/templates/clips/changelog/2026-07-15-disconnecting-a-calendar-now-clears-unrecorded-synced-meetin.md +6 -0
  84. package/corpus/templates/clips/changelog/2026-07-15-folders-now-expose-rename-and-delete-actions-directly-in-the.md +6 -0
  85. package/corpus/templates/clips/changelog/2026-07-15-recording-pages-now-explain-sign-in-access-and-avoid-showing.md +6 -0
  86. package/corpus/templates/clips/changelog/2026-07-15-the-clips-extension-quick-actions-toolbar-can-be-moved-out-o.md +6 -0
  87. package/corpus/templates/clips/changelog/2026-07-15-the-editor-now-skips-cut-sections-during-preview-and-keeps-t.md +6 -0
  88. package/corpus/templates/clips/changelog/2026-07-15-thumbnail-capture-now-updates-previews-while-scrubbing-and-l.md +6 -0
  89. package/corpus/templates/clips/changelog/2026-07-15-windows-permission-links-open-the-matching-settings-page.md +6 -0
  90. package/corpus/templates/clips/chrome-extension/src/content-script.ts +117 -2
  91. package/corpus/templates/clips/chrome-extension/src/overlay.ts +27 -0
  92. package/corpus/templates/clips/desktop/src-tauri/tauri.conf.json +1 -1
  93. package/corpus/templates/clips/server/lib/calendar-event-meetings.ts +139 -101
  94. package/corpus/templates/clips/server/lib/recording-page-access.ts +35 -0
  95. package/corpus/templates/clips/server/lib/share-password.ts +6 -3
  96. package/corpus/templates/content/.agents/skills/content/SKILL.md +26 -39
  97. package/corpus/templates/content/AGENTS.md +25 -30
  98. package/corpus/templates/content/actions/_builder-docs-client.ts +23 -0
  99. package/corpus/templates/content/actions/_content-database-source-adapters.ts +21 -3
  100. package/corpus/templates/content/actions/_content-files.ts +338 -0
  101. package/corpus/templates/content/actions/_content-space-access.ts +135 -0
  102. package/corpus/templates/content/actions/_content-spaces.ts +640 -0
  103. package/corpus/templates/content/actions/_database-source-utils.ts +90 -7
  104. package/corpus/templates/content/actions/_database-utils.ts +7 -1
  105. package/corpus/templates/content/actions/_local-file-documents.ts +0 -9
  106. package/corpus/templates/content/actions/_local-folder-source.ts +53 -0
  107. package/corpus/templates/content/actions/_property-utils.ts +9 -4
  108. package/corpus/templates/content/actions/add-database-item.ts +108 -65
  109. package/corpus/templates/content/actions/backfill-content-files.ts +22 -0
  110. package/corpus/templates/content/actions/connect-local-folder-source.ts +221 -0
  111. package/corpus/templates/content/actions/create-content-database.ts +129 -3
  112. package/corpus/templates/content/actions/create-document.ts +65 -55
  113. package/corpus/templates/content/actions/create-inline-content-database.ts +6 -1
  114. package/corpus/templates/content/actions/delete-content-database.ts +3 -0
  115. package/corpus/templates/content/actions/delete-document.ts +7 -11
  116. package/corpus/templates/content/actions/disconnect-local-folder-source.ts +175 -0
  117. package/corpus/templates/content/actions/duplicate-database-item.ts +10 -0
  118. package/corpus/templates/content/actions/duplicate-database-items.ts +13 -0
  119. package/corpus/templates/content/actions/edit-document.ts +2 -28
  120. package/corpus/templates/content/actions/ensure-content-spaces.ts +26 -0
  121. package/corpus/templates/content/actions/export-content-source.ts +47 -9
  122. package/corpus/templates/content/actions/get-document.ts +0 -14
  123. package/corpus/templates/content/actions/import-content-source.ts +43 -3
  124. package/corpus/templates/content/actions/list-content-spaces.ts +103 -0
  125. package/corpus/templates/content/actions/list-documents.ts +12 -9
  126. package/corpus/templates/content/actions/move-document.ts +3 -14
  127. package/corpus/templates/content/actions/pull-document.ts +0 -23
  128. package/corpus/templates/content/actions/remove-local-file-source.ts +50 -29
  129. package/corpus/templates/content/actions/resolve-local-folder-conflict.ts +442 -0
  130. package/corpus/templates/content/actions/reveal-local-source-file.ts +6 -17
  131. package/corpus/templates/content/actions/search-documents.ts +0 -34
  132. package/corpus/templates/content/actions/share-local-file-document.ts +25 -1
  133. package/corpus/templates/content/actions/submit-content-database-form.ts +12 -0
  134. package/corpus/templates/content/actions/sync-local-folder-source.ts +731 -0
  135. package/corpus/templates/content/actions/sync-manifest-local-folder-source.ts +123 -0
  136. package/corpus/templates/content/actions/update-content-database-view.ts +10 -1
  137. package/corpus/templates/content/actions/update-document.ts +0 -15
  138. package/corpus/templates/content/actions/view-screen.ts +2 -50
  139. package/corpus/templates/content/app/components/editor/SlashCommandMenu.tsx +76 -62
  140. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +70 -22
  141. package/corpus/templates/content/app/components/editor/database/grouping.ts +2 -1
  142. package/corpus/templates/content/app/components/editor/database/settings.tsx +23 -20
  143. package/corpus/templates/content/app/components/editor/database/shared.tsx +2 -0
  144. package/corpus/templates/content/app/components/editor/database/sidebar.tsx +330 -0
  145. package/corpus/templates/content/app/components/editor/database/types.ts +1 -0
  146. package/corpus/templates/content/app/components/editor/database/view-config.ts +3 -1
  147. package/corpus/templates/content/app/components/layout/Layout.tsx +25 -1
  148. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +209 -113
  149. package/corpus/templates/content/app/components/sidebar/select-content-space.ts +31 -0
  150. package/corpus/templates/content/app/hooks/use-content-database.ts +16 -0
  151. package/corpus/templates/content/app/hooks/use-content-spaces.ts +39 -0
  152. package/corpus/templates/content/app/i18n/zh-TW.ts +11 -0
  153. package/corpus/templates/content/app/i18n-data.ts +75 -0
  154. package/corpus/templates/content/app/routes/_app.local-files.tsx +174 -65
  155. package/corpus/templates/content/changelog/2026-07-16-content-callouts-can-now-be-reviewed-and-published-to-builder.md +6 -0
  156. package/corpus/templates/content/changelog/2026-07-16-heading-5-and-heading-6-are-available-from-the-editor-slash-.md +6 -0
  157. package/corpus/templates/content/changelog/2026-07-16-organize-every-workspace-through-a-customizable-files-databa.md +6 -0
  158. package/corpus/templates/content/parity/matrix.md +2 -1
  159. package/corpus/templates/content/parity/matrix.ts +37 -1
  160. package/corpus/templates/content/scripts/dev-database.mjs +7 -5
  161. package/corpus/templates/content/server/db/schema.ts +113 -40
  162. package/corpus/templates/content/server/lib/document-context.ts +15 -1
  163. package/corpus/templates/content/server/lib/notion-sync.ts +6 -0
  164. package/corpus/templates/content/server/plugins/db.ts +153 -0
  165. package/corpus/templates/content/shared/api.ts +17 -3
  166. package/corpus/templates/content/shared/builder-mdx.ts +163 -16
  167. package/corpus/templates/design/.agents/skills/design-templates/SKILL.md +59 -0
  168. package/corpus/templates/design/AGENTS.md +6 -1
  169. package/corpus/templates/design/actions/create-design-from-template.ts +19 -7
  170. package/corpus/templates/design/actions/list-design-templates.ts +69 -21
  171. package/corpus/templates/design/actions/navigate.ts +2 -2
  172. package/corpus/templates/design/actions/view-screen.ts +15 -2
  173. package/corpus/templates/design/agent-native.app-skill.json +5 -0
  174. package/corpus/templates/design/app/components/design/design-canvas/external-preview.ts +7 -3
  175. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +281 -56
  176. package/corpus/templates/design/app/components/templates/TemplatePreview.tsx +14 -2
  177. package/corpus/templates/design/app/hooks/use-navigation-state.ts +3 -2
  178. package/corpus/templates/design/app/i18n/zh-TW.ts +3 -3
  179. package/corpus/templates/design/app/i18n-data.ts +21 -2
  180. package/corpus/templates/design/app/i18n-template-feature.ts +218 -10
  181. package/corpus/templates/design/app/pages/Index.tsx +195 -24
  182. package/corpus/templates/design/app/pages/Templates.tsx +144 -55
  183. package/corpus/templates/design/app/pages/design-editor/generation-prompt-directives.ts +12 -1
  184. package/corpus/templates/design/changelog/2026-07-14-templates-now-appear-in-the-new-design-picker-with-previews-.md +6 -0
  185. package/corpus/templates/design/changelog/2026-07-15-prototype-print-and-download-buttons-now-work-in-preview.md +6 -0
  186. package/corpus/templates/design/changelog/2026-07-15-templates-now-open-immediately-after-copying-even-while-the-.md +6 -0
  187. package/corpus/templates/design/server/plugins/agent-chat.ts +1 -1
  188. package/corpus/templates/mail/AGENTS.md +23 -18
  189. package/corpus/templates/mail/actions/bulk-archive.ts +32 -28
  190. package/corpus/templates/mail/actions/mark-read.ts +131 -20
  191. package/corpus/templates/mail/actions/mark-thread-read.ts +1 -1
  192. package/corpus/templates/mail/actions/move-email.ts +30 -24
  193. package/corpus/templates/mail/actions/send-email.ts +73 -68
  194. package/corpus/templates/mail/changelog/2026-07-15-unread-inbox-cleanup-now-completes-reliably.md +6 -0
  195. package/corpus/templates/mail/server/handlers/emails.ts +218 -209
  196. package/corpus/templates/mail/server/lib/bulk-mark-read.ts +30 -0
  197. package/corpus/templates/mail/server/lib/email-state.ts +198 -113
  198. package/corpus/templates/mail/server/lib/google-auth.ts +218 -25
  199. package/corpus/templates/mail/server/lib/jobs.ts +69 -74
  200. package/corpus/templates/mail/server/lib/local-email-store.ts +265 -0
  201. package/corpus/templates/mail/server/plugins/agent-chat.ts +6 -0
  202. package/corpus/templates/slides/actions/extract-pdf.ts +1 -1
  203. package/corpus/templates/slides/actions/import-file.ts +4 -1
  204. package/corpus/templates/slides/app/components/editor/ImageGenPanel.tsx +1 -1
  205. package/corpus/templates/slides/app/components/editor/ImageSearchPanel.tsx +9 -12
  206. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +29 -21
  207. package/corpus/templates/slides/app/i18n/ar-SA.ts +1 -0
  208. package/corpus/templates/slides/app/i18n/de-DE.ts +1 -0
  209. package/corpus/templates/slides/app/i18n/en-US.ts +1 -0
  210. package/corpus/templates/slides/app/i18n/es-ES.ts +1 -0
  211. package/corpus/templates/slides/app/i18n/fr-FR.ts +1 -0
  212. package/corpus/templates/slides/app/i18n/hi-IN.ts +1 -0
  213. package/corpus/templates/slides/app/i18n/ja-JP.ts +1 -0
  214. package/corpus/templates/slides/app/i18n/ko-KR.ts +1 -0
  215. package/corpus/templates/slides/app/i18n/pt-BR.ts +1 -0
  216. package/corpus/templates/slides/app/i18n/zh-CN.ts +1 -0
  217. package/corpus/templates/slides/app/i18n/zh-TW.ts +1 -0
  218. package/corpus/templates/slides/changelog/2026-07-15-image-search-and-generation-controls-now-use-the-registered-.md +6 -0
  219. package/corpus/templates/slides/changelog/2026-07-15-pdf-deck-references-can-be-imported-for-slide-inspiration-ag.md +6 -0
  220. package/corpus/templates/slides/changelog/2026-07-15-stable-style-inspector-dock.md +6 -0
  221. package/dist/cli/content-local.d.ts +1 -0
  222. package/dist/cli/content-local.d.ts.map +1 -1
  223. package/dist/cli/content-local.js +75 -17
  224. package/dist/cli/content-local.js.map +1 -1
  225. package/dist/cli/index.js +2 -2
  226. package/dist/cli/index.js.map +1 -1
  227. package/dist/cli/skills-content/content-skill.d.ts +1 -1
  228. package/dist/cli/skills-content/content-skill.d.ts.map +1 -1
  229. package/dist/cli/skills-content/content-skill.js +36 -25
  230. package/dist/cli/skills-content/content-skill.js.map +1 -1
  231. package/dist/cli/skills.d.ts.map +1 -1
  232. package/dist/cli/skills.js +47 -14
  233. package/dist/cli/skills.js.map +1 -1
  234. package/dist/client/AgentPanel.d.ts.map +1 -1
  235. package/dist/client/AgentPanel.js +5 -0
  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 +7 -0
  239. package/dist/client/AssistantChat.js.map +1 -1
  240. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  241. package/dist/client/agent-chat-adapter.js +8 -1
  242. package/dist/client/agent-chat-adapter.js.map +1 -1
  243. package/dist/client/chat/message-components.d.ts +4 -0
  244. package/dist/client/chat/message-components.d.ts.map +1 -1
  245. package/dist/client/chat/message-components.js +10 -3
  246. package/dist/client/chat/message-components.js.map +1 -1
  247. package/dist/client/composer/ComposerPlusMenu.d.ts.map +1 -1
  248. package/dist/client/composer/ComposerPlusMenu.js +58 -6
  249. package/dist/client/composer/ComposerPlusMenu.js.map +1 -1
  250. package/dist/client/composer/asset-picker-url.d.ts +16 -0
  251. package/dist/client/composer/asset-picker-url.d.ts.map +1 -0
  252. package/dist/client/composer/asset-picker-url.js +64 -0
  253. package/dist/client/composer/asset-picker-url.js.map +1 -0
  254. package/dist/client/error-format.d.ts.map +1 -1
  255. package/dist/client/error-format.js +17 -0
  256. package/dist/client/error-format.js.map +1 -1
  257. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  258. package/dist/client/resources/McpIntegrationDialog.js +6 -1
  259. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  260. package/dist/collab/awareness.d.ts +2 -2
  261. package/dist/collab/awareness.d.ts.map +1 -1
  262. package/dist/collab/struct-routes.d.ts +1 -1
  263. package/dist/local-artifacts/index.d.ts +10 -0
  264. package/dist/local-artifacts/index.d.ts.map +1 -1
  265. package/dist/local-artifacts/index.js +39 -0
  266. package/dist/local-artifacts/index.js.map +1 -1
  267. package/dist/notifications/routes.d.ts +1 -1
  268. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  269. package/dist/resources/handlers.d.ts +3 -3
  270. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  271. package/dist/server/transcribe-voice.d.ts +1 -1
  272. package/docs/content/local-file-mode.mdx +99 -489
  273. package/docs/content/locales/ar-SA/local-file-mode.mdx +35 -490
  274. package/docs/content/locales/ar-SA/template-content.mdx +10 -24
  275. package/docs/content/locales/de-DE/local-file-mode.mdx +37 -491
  276. package/docs/content/locales/de-DE/template-content.mdx +10 -24
  277. package/docs/content/locales/es-ES/local-file-mode.mdx +35 -493
  278. package/docs/content/locales/es-ES/template-content.mdx +10 -24
  279. package/docs/content/locales/fr-FR/local-file-mode.mdx +38 -491
  280. package/docs/content/locales/fr-FR/template-content.mdx +10 -24
  281. package/docs/content/locales/hi-IN/local-file-mode.mdx +33 -492
  282. package/docs/content/locales/hi-IN/template-content.mdx +10 -24
  283. package/docs/content/locales/ja-JP/local-file-mode.mdx +36 -492
  284. package/docs/content/locales/ja-JP/template-content.mdx +10 -24
  285. package/docs/content/locales/ko-KR/local-file-mode.mdx +35 -490
  286. package/docs/content/locales/ko-KR/template-content.mdx +10 -24
  287. package/docs/content/locales/pt-BR/local-file-mode.mdx +35 -493
  288. package/docs/content/locales/pt-BR/template-content.mdx +10 -24
  289. package/docs/content/locales/zh-CN/local-file-mode.mdx +31 -489
  290. package/docs/content/locales/zh-CN/template-content.mdx +9 -24
  291. package/docs/content/locales/zh-TW/local-file-mode.mdx +31 -489
  292. package/docs/content/locales/zh-TW/template-content.mdx +9 -24
  293. package/docs/content/template-content.mdx +26 -42
  294. package/package.json +1 -1
  295. package/corpus/templates/assets/app/components/library/EditLibraryDialog.tsx +0 -126
@@ -451,6 +451,8 @@ const messages = {
451
451
  retryAgentLink: "Retry",
452
452
  gifPreview: "GIF preview",
453
453
  openPlayer: "Open player",
454
+ chooseFile: "Choose file",
455
+ remove: "Remove",
454
456
  downloadMp4: "Download MP4",
455
457
  embedsNeedPublic: "Embeds need a public clip",
456
458
  embedPublicDescription:
@@ -1219,9 +1221,10 @@ All notable user-facing changes to Clips are documented here. Open it any time f
1219
1221
  visibilityOrg: "Organization",
1220
1222
  visibilityPublic: "Public",
1221
1223
  passwordProtection: "Password protection",
1222
- passwordSetPlaceholder:
1223
- "Password is set — type to replace, leave empty + Save to clear",
1224
+ passwordSetPlaceholder: "Password is set — type to replace",
1224
1225
  noPasswordPlaceholder: "No password",
1226
+ passwordWhitespaceOnly: "Spaces alone aren't a valid password.",
1227
+ removePassword: "Remove",
1225
1228
  expiry: "Expiry",
1226
1229
  viewerOptions: "Viewer options",
1227
1230
  comments: "Comments",
@@ -465,6 +465,8 @@ const messages = {
465
465
  retryAgentLink: "Reintentar",
466
466
  gifPreview: "vista previa de GIF",
467
467
  openPlayer: "jugador abierto",
468
+ chooseFile: "Elige el archivo",
469
+ remove: "Eliminar",
468
470
  downloadMp4: "Descargar MP4",
469
471
  embedsNeedPublic: "Los elementos insertados necesitan un clip público",
470
472
  embedPublicDescription:
@@ -1244,9 +1246,11 @@ Todos los cambios visibles para los usuarios de Clips se documentan aquí. Puede
1244
1246
  visibilityOrg: "Organization (Localizado)",
1245
1247
  visibilityPublic: "Public (Localizado)",
1246
1248
  passwordProtection: "Password protection (Localizado)",
1247
- passwordSetPlaceholder:
1248
- "Password is set — type to replace, leave empty + Save to clear (Localizado)",
1249
+ passwordSetPlaceholder: "Password is set — type to replace (Localizado)",
1249
1250
  noPasswordPlaceholder: "No password (Localizado)",
1251
+ passwordWhitespaceOnly:
1252
+ "Spaces alone aren't a valid password. (Localizado)",
1253
+ removePassword: "Remove (Localizado)",
1250
1254
  expiry: "Expiry (Localizado)",
1251
1255
  viewerOptions: "Viewer options (Localizado)",
1252
1256
  comments: "Comments (Localizado)",
@@ -465,6 +465,8 @@ const messages = {
465
465
  retryAgentLink: "Réessayer",
466
466
  gifPreview: "aperçu de GIF",
467
467
  openPlayer: "Joueur ouvert",
468
+ chooseFile: "Choisir un fichier",
469
+ remove: "Retirer",
468
470
  downloadMp4: "Télécharger MP4",
469
471
  embedsNeedPublic: "Les intégrations nécessitent un clip public",
470
472
  embedPublicDescription:
@@ -1246,9 +1248,10 @@ Tous les changements visibles par les utilisateurs de Clips sont documentés ici
1246
1248
  visibilityOrg: "Organization (Localisé)",
1247
1249
  visibilityPublic: "Public (Localisé)",
1248
1250
  passwordProtection: "Password protection (Localisé)",
1249
- passwordSetPlaceholder:
1250
- "Password is set — type to replace, leave empty + Save to clear (Localisé)",
1251
+ passwordSetPlaceholder: "Password is set — type to replace (Localisé)",
1251
1252
  noPasswordPlaceholder: "No password (Localisé)",
1253
+ passwordWhitespaceOnly: "Spaces alone aren't a valid password. (Localisé)",
1254
+ removePassword: "Remove (Localisé)",
1252
1255
  expiry: "Expiry (Localisé)",
1253
1256
  viewerOptions: "Viewer options (Localisé)",
1254
1257
  comments: "Comments (Localisé)",
@@ -448,6 +448,8 @@ const messages = {
448
448
  retryAgentLink: "फिर से प्रयास करें",
449
449
  gifPreview: "GIF पूर्वावलोकन",
450
450
  openPlayer: "खुला खिलाड़ी",
451
+ chooseFile: "फ़ाइल चुनें",
452
+ remove: "हटाएं",
451
453
  downloadMp4: "MP4 डाउनलोड करें",
452
454
  embedsNeedPublic: "एंबेड को एक सार्वजनिक क्लिप की आवश्यकता है",
453
455
  embedPublicDescription:
@@ -1212,9 +1214,10 @@ Clips में उपयोगकर्ताओं को दिखने व
1212
1214
  visibilityOrg: "Organization (स्थानीयकृत)",
1213
1215
  visibilityPublic: "Public (स्थानीयकृत)",
1214
1216
  passwordProtection: "Password protection (स्थानीयकृत)",
1215
- passwordSetPlaceholder:
1216
- "Password is set — type to replace, leave empty + Save to clear (स्थानीयकृत)",
1217
+ passwordSetPlaceholder: "Password is set — type to replace (स्थानीयकृत)",
1217
1218
  noPasswordPlaceholder: "No password (स्थानीयकृत)",
1219
+ passwordWhitespaceOnly: "Spaces alone aren't a valid password. (स्थानीयकृत)",
1220
+ removePassword: "Remove (स्थानीयकृत)",
1218
1221
  expiry: "Expiry (स्थानीयकृत)",
1219
1222
  viewerOptions: "Viewer options (स्थानीयकृत)",
1220
1223
  comments: "Comments (स्थानीयकृत)",
@@ -460,6 +460,8 @@ const messages = {
460
460
  retryAgentLink: "再試行",
461
461
  gifPreview: "GIF プレビュー",
462
462
  openPlayer: "プレーヤーを開く",
463
+ chooseFile: "ファイルを選択してください",
464
+ remove: "取り除く",
463
465
  downloadMp4: "ダウンロード",
464
466
  embedsNeedPublic: "埋め込みにはパブリッククリップが必要です",
465
467
  embedPublicDescription:
@@ -1235,8 +1237,11 @@ Clips のユーザー向けの主な変更はここに記録されます。コ
1235
1237
  visibilityPublic: "Public (ローカライズ済み)",
1236
1238
  passwordProtection: "Password protection (ローカライズ済み)",
1237
1239
  passwordSetPlaceholder:
1238
- "Password is set — type to replace, leave empty + Save to clear (ローカライズ済み)",
1240
+ "Password is set — type to replace (ローカライズ済み)",
1239
1241
  noPasswordPlaceholder: "No password (ローカライズ済み)",
1242
+ passwordWhitespaceOnly:
1243
+ "Spaces alone aren't a valid password. (ローカライズ済み)",
1244
+ removePassword: "Remove (ローカライズ済み)",
1240
1245
  expiry: "Expiry (ローカライズ済み)",
1241
1246
  viewerOptions: "Viewer options (ローカライズ済み)",
1242
1247
  comments: "Comments (ローカライズ済み)",
@@ -453,6 +453,8 @@ const messages = {
453
453
  retryAgentLink: "다시 시도",
454
454
  gifPreview: "GIF 미리보기",
455
455
  openPlayer: "플레이어 열기",
456
+ chooseFile: "파일 선택",
457
+ remove: "제거",
456
458
  downloadMp4: "MP4 다운로드",
457
459
  embedsNeedPublic: "퍼가기에는 공개 클립이 필요합니다",
458
460
  embedPublicDescription:
@@ -1222,9 +1224,10 @@ Clips의 모든 사용자 대상 변경 사항은 여기에 기록됩니다. 명
1222
1224
  visibilityOrg: "Organization (현지화됨)",
1223
1225
  visibilityPublic: "Public (현지화됨)",
1224
1226
  passwordProtection: "Password protection (현지화됨)",
1225
- passwordSetPlaceholder:
1226
- "Password is set — type to replace, leave empty + Save to clear (현지화됨)",
1227
+ passwordSetPlaceholder: "Password is set — type to replace (현지화됨)",
1227
1228
  noPasswordPlaceholder: "No password (현지화됨)",
1229
+ passwordWhitespaceOnly: "Spaces alone aren't a valid password. (현지화됨)",
1230
+ removePassword: "Remove (현지화됨)",
1228
1231
  expiry: "Expiry (현지화됨)",
1229
1232
  viewerOptions: "Viewer options (현지화됨)",
1230
1233
  comments: "Comments (현지화됨)",
@@ -462,6 +462,8 @@ const messages = {
462
462
  retryAgentLink: "Tentar novamente",
463
463
  gifPreview: "visualização de GIF",
464
464
  openPlayer: "Jogador aberto",
465
+ chooseFile: "Escolher arquivo",
466
+ remove: "Remover",
465
467
  downloadMp4: "Baixar MP4",
466
468
  embedsNeedPublic: "As incorporações precisam de um clipe público",
467
469
  embedPublicDescription:
@@ -1240,9 +1242,11 @@ Todas as mudanças visíveis para usuários do Clips são documentadas aqui. Voc
1240
1242
  visibilityOrg: "Organization (Localizado)",
1241
1243
  visibilityPublic: "Public (Localizado)",
1242
1244
  passwordProtection: "Password protection (Localizado)",
1243
- passwordSetPlaceholder:
1244
- "Password is set — type to replace, leave empty + Save to clear (Localizado)",
1245
+ passwordSetPlaceholder: "Password is set — type to replace (Localizado)",
1245
1246
  noPasswordPlaceholder: "No password (Localizado)",
1247
+ passwordWhitespaceOnly:
1248
+ "Spaces alone aren't a valid password. (Localizado)",
1249
+ removePassword: "Remove (Localizado)",
1246
1250
  expiry: "Expiry (Localizado)",
1247
1251
  viewerOptions: "Viewer options (Localizado)",
1248
1252
  comments: "Comments (Localizado)",
@@ -435,6 +435,8 @@ const messages = {
435
435
  retryAgentLink: "重试",
436
436
  gifPreview: "GIF 预览",
437
437
  openPlayer: "开放玩家",
438
+ chooseFile: "选择文件",
439
+ remove: "消除",
438
440
  downloadMp4: "下载MP4",
439
441
  embedsNeedPublic: "嵌入需要公共剪辑",
440
442
  embedPublicDescription:
@@ -1184,9 +1186,10 @@ Clips 中所有面向用户的重要更改都会记录在这里。你可以随
1184
1186
  visibilityOrg: "Organization (已本地化)",
1185
1187
  visibilityPublic: "Public (已本地化)",
1186
1188
  passwordProtection: "Password protection (已本地化)",
1187
- passwordSetPlaceholder:
1188
- "Password is set — type to replace, leave empty + Save to clear (已本地化)",
1189
+ passwordSetPlaceholder: "Password is set — type to replace (已本地化)",
1189
1190
  noPasswordPlaceholder: "No password (已本地化)",
1191
+ passwordWhitespaceOnly: "Spaces alone aren't a valid password. (已本地化)",
1192
+ removePassword: "Remove (已本地化)",
1190
1193
  expiry: "Expiry (已本地化)",
1191
1194
  viewerOptions: "Viewer options (已本地化)",
1192
1195
  comments: "Comments (已本地化)",
@@ -435,6 +435,8 @@ const messages = {
435
435
  retryAgentLink: "重試",
436
436
  gifPreview: "GIF 預覽",
437
437
  openPlayer: "開啟播放器",
438
+ chooseFile: "選取檔案",
439
+ remove: "消除",
438
440
  downloadMp4: "下載 MP4",
439
441
  embedsNeedPublic: "嵌入需要公開剪輯",
440
442
  embedPublicDescription:
@@ -1169,9 +1171,10 @@ const messages = {
1169
1171
  visibilityOrg: "組織",
1170
1172
  visibilityPublic: "公開",
1171
1173
  passwordProtection: "密碼保護",
1172
- passwordSetPlaceholder:
1173
- "已設定密碼。輸入新密碼即可取代;留空並儲存即可清除。",
1174
+ passwordSetPlaceholder: "已設定密碼。輸入新密碼即可取代。",
1174
1175
  noPasswordPlaceholder: "無密碼",
1176
+ passwordWhitespaceOnly: "只有空格不是有效的密碼。",
1177
+ removePassword: "移除",
1175
1178
  expiry: "到期時間",
1176
1179
  viewerOptions: "觀看者選項",
1177
1180
  comments: "留言",
@@ -198,6 +198,20 @@ export function getKeptRanges(
198
198
  return out;
199
199
  }
200
200
 
201
+ /** Move a source timestamp to the first visible timestamp after a cut. */
202
+ export function skipExcludedRange(
203
+ ms: number,
204
+ excludedRanges: Pick<TrimRange, "startMs" | "endMs">[],
205
+ durationMs: number,
206
+ ): number {
207
+ const range = excludedRanges.find(
208
+ (candidate) => ms >= candidate.startMs && ms < candidate.endMs,
209
+ );
210
+ if (!range) return ms;
211
+ const next = Math.max(ms, range.endMs);
212
+ return durationMs > 0 ? Math.min(next, durationMs) : next;
213
+ }
214
+
201
215
  /**
202
216
  * Merge a new excluded range into the edits, collapsing adjacent/overlapping
203
217
  * entries. Preserves existing non-excluded (split) markers as-is.
@@ -6,8 +6,7 @@ import { NavLink } from "react-router";
6
6
  import { LibraryGrid } from "@/components/library/library-grid";
7
7
  import { usePageHeaderLayout } from "@/components/library/page-header";
8
8
 
9
- const SEO_TITLE =
10
- "Agent-Native Clips - Open Source, agent-friendly Loom alternative";
9
+ const SEO_TITLE = "Agent-Native Clips - Open Source screen recorder";
11
10
  const SEO_DESCRIPTION =
12
11
  "Open Source screen recorder and meeting-notes app with AI transcripts, summaries, search, dictation, and agent-readable share links.";
13
12
 
@@ -1,8 +1,7 @@
1
1
  import { DefaultSpinner } from "@agent-native/core/client";
2
2
  import { redirect, type LoaderFunctionArgs } from "react-router";
3
3
 
4
- const SEO_TITLE =
5
- "Agent-Native Clips - Open Source, agent-friendly Loom alternative";
4
+ const SEO_TITLE = "Agent-Native Clips - Open Source screen recorder";
6
5
  const SEO_DESCRIPTION =
7
6
  "Open Source screen recorder and meeting-notes app with AI transcripts, summaries, search, dictation, and agent-readable share links.";
8
7
 
@@ -20,6 +20,7 @@ import {
20
20
  isLoomEmbedBackedRecording,
21
21
  isLoomRecordingSource,
22
22
  } from "@shared/loom";
23
+ import { CLIP_SHARE_REF, REF_PARAM } from "@shared/share-attribution";
23
24
  import {
24
25
  IconShare3,
25
26
  IconArrowLeft,
@@ -205,6 +206,10 @@ function parseTimeParam(raw: string | null): number {
205
206
  return (hours * 3600 + minutes * 60 + seconds) * 1000;
206
207
  }
207
208
 
209
+ function buildSignInHref(returnTo: string): string {
210
+ return `${agentNativePath("/_agent-native/sign-in")}?return=${encodeURIComponent(returnTo)}`;
211
+ }
212
+
208
213
  export default function RecordingPage() {
209
214
  const t = useT();
210
215
  useAutoTitleBridge();
@@ -256,6 +261,7 @@ export default function RecordingPage() {
256
261
  );
257
262
  const lastPlayerStateWriteRef = useRef(0);
258
263
  const readyMediaPollRef = useRef<{ key: string; until: number } | null>(null);
264
+ const [metadataRefreshUntil, setMetadataRefreshUntil] = useState(0);
259
265
 
260
266
  useEffect(() => {
261
267
  if (
@@ -325,11 +331,37 @@ export default function RecordingPage() {
325
331
  // `update-recording` and we want the skeleton to swap in promptly.
326
332
  if (shouldShowGeneratedTitleSkeleton(rec, data?.transcript?.status))
327
333
  return 3000;
334
+ if (Date.now() < metadataRefreshUntil) return 2000;
328
335
  return false;
329
336
  },
330
337
  },
331
338
  );
332
339
 
340
+ const playerDataAccessStatus = playerDataQ.isError
341
+ ? (playerDataQ.error as { status?: number } | undefined)?.status
342
+ : undefined;
343
+ // Signed-out requests never even reach `resolveAccess` — the action route's
344
+ // default auth gate rejects them with 401 first. Authenticated viewers with
345
+ // no share grant (or a deleted/mismatched id) get 403 from `resolveAccess`
346
+ // inside `get-recording-player-data`. Both mean "can't open the direct
347
+ // owner/editor route here".
348
+ const playerDataForbidden =
349
+ playerDataAccessStatus === 401 || playerDataAccessStatus === 403;
350
+
351
+ // A direct `/r/:id` visit without edit/view access (signed out, no share
352
+ // grant, wrong org) can't do anything useful here — send the visitor to the
353
+ // public share flow instead, which knows how to prompt for sign-in or a
354
+ // password.
355
+ useEffect(() => {
356
+ if (!recordingId || !playerDataForbidden) return;
357
+ navigate(
358
+ `/share/${encodeURIComponent(recordingId)}?${REF_PARAM}=${CLIP_SHARE_REF}`,
359
+ {
360
+ replace: true,
361
+ },
362
+ );
363
+ }, [recordingId, playerDataForbidden, navigate]);
364
+
333
365
  const recording = playerDataQ.data?.recording;
334
366
  const role = playerDataQ.data?.role as
335
367
  | "owner"
@@ -542,6 +574,8 @@ export default function RecordingPage() {
542
574
  });
543
575
  const regenerateTitle = useActionMutation("regenerate-title" as any, {
544
576
  onSuccess: (result: any) => {
577
+ setMetadataRefreshUntil(Date.now() + 60_000);
578
+ void playerDataQ.refetch();
545
579
  if (result?.updated) {
546
580
  toast.success(t("recordingPage.titleUpdated"));
547
581
  } else if (result?.reason === "builder_credits_paused") {
@@ -559,7 +593,11 @@ export default function RecordingPage() {
559
593
  onError: handleAiError,
560
594
  });
561
595
  const regenerateSummary = useActionMutation("regenerate-summary" as any, {
562
- onSuccess: () => toast.success(t("recordingPage.descriptionQueued")),
596
+ onSuccess: () => {
597
+ setMetadataRefreshUntil(Date.now() + 60_000);
598
+ void playerDataQ.refetch();
599
+ toast.success(t("recordingPage.descriptionQueued"));
600
+ },
563
601
  onError: handleAiError,
564
602
  });
565
603
  const regenerateChapters = useActionMutation("regenerate-chapters" as any, {
@@ -614,17 +652,22 @@ export default function RecordingPage() {
614
652
  }
615
653
  function handleGenerateWorkflow(kind: WorkflowKind) {
616
654
  if (!recording) return;
655
+ if (generatedWorkflow?.status === "generating") return;
617
656
  setEditing(false);
618
657
  setPanel("agent");
619
658
  window.dispatchEvent(
620
659
  new CustomEvent("agent-panel:set-mode", { detail: { mode: "chat" } }),
621
660
  );
661
+ window.dispatchEvent(new Event("agent-panel:open"));
622
662
  generateWorkflow.mutate({
623
663
  recordingId: recording.id,
624
664
  kind,
625
665
  } as any);
626
666
  }
627
667
 
668
+ const workflowBusy =
669
+ generateWorkflow.isPending || generatedWorkflow?.status === "generating";
670
+
628
671
  useEffect(() => {
629
672
  if (recording && panel === "settings" && !canEdit) setPanel("agent");
630
673
  }, [canEdit, panel, recording]);
@@ -700,7 +743,7 @@ export default function RecordingPage() {
700
743
 
701
744
  if (!recordingId) return null;
702
745
 
703
- if (playerDataQ.isLoading) {
746
+ if (playerDataQ.isLoading || playerDataForbidden) {
704
747
  return (
705
748
  <div className="flex items-center justify-center h-screen w-full bg-background">
706
749
  <Spinner className="h-8 w-8" />
@@ -709,18 +752,36 @@ export default function RecordingPage() {
709
752
  }
710
753
 
711
754
  if (playerDataQ.isError || !recording) {
755
+ const needsSignIn = !session;
756
+ const returnTo =
757
+ typeof window === "undefined"
758
+ ? `/r/${recordingId}`
759
+ : window.location.pathname + window.location.search;
712
760
  return (
713
761
  <div className="flex flex-col items-center justify-center h-screen w-full bg-background px-6">
714
762
  <h1 className="text-xl font-semibold mb-2">
715
- {t("recordingPage.recordingNotFound")}
763
+ {needsSignIn
764
+ ? t("sharePage.clipUnavailable")
765
+ : t("recordingPage.recordingNotFound")}
716
766
  </h1>
717
767
  <p className="text-sm text-muted-foreground mb-4">
718
- {(playerDataQ.error as Error | undefined)?.message ??
719
- t("recordingPage.noAccess")}
768
+ {needsSignIn
769
+ ? t("sharePage.clipUnavailableMessage")
770
+ : ((playerDataQ.error as Error | undefined)?.message ??
771
+ t("recordingPage.noAccess"))}
720
772
  </p>
721
- <Button asChild variant="outline">
722
- <Link to="/">{t("recordingPage.backToLibrary")}</Link>
723
- </Button>
773
+ <div className="flex flex-wrap items-center justify-center gap-2">
774
+ {needsSignIn ? (
775
+ <Button asChild>
776
+ <a href={buildSignInHref(returnTo)}>{t("sharePage.signIn")}</a>
777
+ </Button>
778
+ ) : null}
779
+ <Button asChild variant="outline">
780
+ <Link to="/library" replace>
781
+ {t("recordingPage.backToLibrary")}
782
+ </Link>
783
+ </Button>
784
+ </div>
724
785
  </div>
725
786
  );
726
787
  }
@@ -784,7 +845,7 @@ export default function RecordingPage() {
784
845
  className="shrink-0"
785
846
  aria-label={t("recordingPage.back")}
786
847
  >
787
- <Link to="/">
848
+ <Link to="/library" replace>
788
849
  <IconArrowLeft className="h-4 w-4 rtl:-scale-x-100" />
789
850
  </Link>
790
851
  </Button>
@@ -956,7 +1017,9 @@ export default function RecordingPage() {
956
1017
  : t("recordingPage.checkAgain")}
957
1018
  </Button>
958
1019
  <Button asChild variant="ghost" size="sm">
959
- <Link to="/">{t("recordingPage.backToLibrary")}</Link>
1020
+ <Link to="/library" replace>
1021
+ {t("recordingPage.backToLibrary")}
1022
+ </Link>
960
1023
  </Button>
961
1024
  </div>
962
1025
  </div>
@@ -1136,7 +1199,7 @@ export default function RecordingPage() {
1136
1199
  className="shrink-0"
1137
1200
  aria-label={t("recordingPage.back")}
1138
1201
  >
1139
- <Link to="/">
1202
+ <Link to="/library" replace>
1140
1203
  <IconArrowLeft className="h-4 w-4 rtl:-scale-x-100" />
1141
1204
  </Link>
1142
1205
  </Button>
@@ -1174,7 +1237,7 @@ export default function RecordingPage() {
1174
1237
  </Button>
1175
1238
  ) : null}
1176
1239
 
1177
- {canEdit ? (
1240
+ {canEdit && !editing ? (
1178
1241
  <DropdownMenu>
1179
1242
  <DropdownMenuTrigger asChild>
1180
1243
  <Button
@@ -1221,6 +1284,7 @@ export default function RecordingPage() {
1221
1284
  onSelect={() =>
1222
1285
  regenerateSummary.mutate({
1223
1286
  recordingId: recording.id,
1287
+ openInChat: true,
1224
1288
  } as any)
1225
1289
  }
1226
1290
  >
@@ -1264,7 +1328,7 @@ export default function RecordingPage() {
1264
1328
  const menuItem = (
1265
1329
  <DropdownMenuItem
1266
1330
  key={item.kind}
1267
- disabled={generateWorkflow.isPending}
1331
+ disabled={workflowBusy}
1268
1332
  onSelect={() => handleGenerateWorkflow(item.kind)}
1269
1333
  className={
1270
1334
  item.tooltipKey ? "justify-between gap-3" : undefined
@@ -1319,24 +1383,26 @@ export default function RecordingPage() {
1319
1383
  </DropdownMenu>
1320
1384
  ) : null}
1321
1385
 
1322
- <ShareRecordingPopover
1323
- recordingId={recording.id}
1324
- recordingTitle={recording.title}
1325
- initialVisibility={recording.visibility}
1326
- initialRole={role}
1327
- videoUrl={recording.videoUrl}
1328
- animatedThumbnailUrl={recording.animatedThumbnailUrl}
1329
- isLoomRecording={isLoomEmbedBacked}
1330
- hasPassword={Boolean(recording.hasPassword)}
1331
- >
1332
- <Button
1333
- className="shrink-0 gap-1.5 bg-primary text-primary-foreground hover:bg-primary/90"
1334
- size="sm"
1386
+ {!editing ? (
1387
+ <ShareRecordingPopover
1388
+ recordingId={recording.id}
1389
+ recordingTitle={recording.title}
1390
+ initialVisibility={recording.visibility}
1391
+ initialRole={role}
1392
+ videoUrl={recording.videoUrl}
1393
+ animatedThumbnailUrl={recording.animatedThumbnailUrl}
1394
+ isLoomRecording={isLoomEmbedBacked}
1395
+ hasPassword={Boolean(recording.hasPassword)}
1335
1396
  >
1336
- <IconShare3 className="h-4 w-4" />
1337
- {t("recordingPage.share")}
1338
- </Button>
1339
- </ShareRecordingPopover>
1397
+ <Button
1398
+ className="shrink-0 gap-1.5 bg-primary text-primary-foreground hover:bg-primary/90"
1399
+ size="sm"
1400
+ >
1401
+ <IconShare3 className="h-4 w-4" />
1402
+ {t("recordingPage.share")}
1403
+ </Button>
1404
+ </ShareRecordingPopover>
1405
+ ) : null}
1340
1406
 
1341
1407
  {canDelete || canDownloadRecording ? (
1342
1408
  <RecordingOptionsMenu
@@ -1486,7 +1552,7 @@ export default function RecordingPage() {
1486
1552
  ) : null}
1487
1553
  </div>
1488
1554
  {recording.description ? (
1489
- <p className="mt-3 line-clamp-2 text-sm text-muted-foreground">
1555
+ <p className="mt-3 whitespace-pre-wrap break-words text-sm text-muted-foreground">
1490
1556
  {recording.description}
1491
1557
  </p>
1492
1558
  ) : null}
@@ -1528,7 +1594,7 @@ function GeneratedWorkflowNotice({
1528
1594
  const status = workflow.status ?? (workflow.content ? "ready" : "generating");
1529
1595
  const content =
1530
1596
  typeof workflow.content === "string" ? workflow.content.trim() : "";
1531
- const isReady = status === "ready" && content.length > 0;
1597
+ const isReady = status !== "failed" && content.length > 0;
1532
1598
  const isFailed = status === "failed";
1533
1599
  const title = workflowTitle(workflow.kind);
1534
1600
 
@@ -855,6 +855,8 @@ export default function ShareRoute() {
855
855
  <Button variant="ghost" size="sm" asChild>
856
856
  <a
857
857
  href={appPath("/")}
858
+ target="_blank"
859
+ rel="noopener noreferrer"
858
860
  className="gap-1.5"
859
861
  onClick={() => fireShareCtaClick("try_clips")}
860
862
  >
@@ -965,7 +967,7 @@ export default function ShareRoute() {
965
967
  </h2>
966
968
  )}
967
969
  {recording.description ? (
968
- <p className="text-sm text-muted-foreground line-clamp-2">
970
+ <p className="whitespace-pre-wrap break-words text-sm text-muted-foreground">
969
971
  {recording.description}
970
972
  </p>
971
973
  ) : null}
@@ -1063,6 +1065,7 @@ export default function ShareRoute() {
1063
1065
  t("recordingPage.draftQuestions"),
1064
1066
  ]}
1065
1067
  browserTabId={getBrowserTabId()}
1068
+ showHeader={false}
1066
1069
  />
1067
1070
  ) : (
1068
1071
  <PublicAgentEmptyState
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-15
4
+ ---
5
+
6
+ AI workflow generation now stays visible, avoids duplicate requests, and reports completion correctly.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-15
4
+ ---
5
+
6
+ Clip playback and CTA controls remain interactive through editing and replay.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-15
4
+ ---
5
+
6
+ Clip titles no longer describe the product as a Loom alternative.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-15
4
+ ---
5
+
6
+ Description regeneration now opens the agent chat so progress is easy to follow.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: security
3
+ date: 2026-07-15
4
+ ---
5
+
6
+ Direct recording URLs now respect share-link and password access controls
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-15
4
+ ---
5
+
6
+ Disconnecting a calendar now clears unrecorded synced meeting placeholders.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-15
4
+ ---
5
+
6
+ Folders now expose rename and delete actions directly in the library sidebar
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-15
4
+ ---
5
+
6
+ Recording pages now explain sign-in access and avoid showing the same public link twice.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-15
4
+ ---
5
+
6
+ The Clips extension quick-actions toolbar can be moved out of the way.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-15
4
+ ---
5
+
6
+ The editor now skips cut sections during preview and keeps the full clip selection visible.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-15
4
+ ---
5
+
6
+ Thumbnail capture now updates previews while scrubbing and lets uploaded files be removed.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-15
4
+ ---
5
+
6
+ Windows permission links now open the matching system settings page.