@agent-native/core 0.92.12 → 0.93.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 (772) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +39 -0
  3. package/corpus/core/docs/content/automation-connectors.mdx +80 -0
  4. package/corpus/core/docs/content/extensions.mdx +8 -0
  5. package/corpus/core/docs/content/locales/ar-SA/extensions.mdx +8 -0
  6. package/corpus/core/docs/content/locales/ar-SA/messaging.mdx +84 -15
  7. package/corpus/core/docs/content/locales/ar-SA/template-clips.mdx +1 -0
  8. package/corpus/core/docs/content/locales/ar-SA/template-design.mdx +1 -0
  9. package/corpus/core/docs/content/locales/de-DE/extensions.mdx +10 -0
  10. package/corpus/core/docs/content/locales/de-DE/messaging.mdx +92 -15
  11. package/corpus/core/docs/content/locales/de-DE/template-clips.mdx +1 -0
  12. package/corpus/core/docs/content/locales/de-DE/template-design.mdx +1 -0
  13. package/corpus/core/docs/content/locales/es-ES/extensions.mdx +10 -0
  14. package/corpus/core/docs/content/locales/es-ES/messaging.mdx +91 -15
  15. package/corpus/core/docs/content/locales/es-ES/template-clips.mdx +1 -0
  16. package/corpus/core/docs/content/locales/es-ES/template-design.mdx +1 -0
  17. package/corpus/core/docs/content/locales/fr-FR/extensions.mdx +10 -0
  18. package/corpus/core/docs/content/locales/fr-FR/messaging.mdx +91 -15
  19. package/corpus/core/docs/content/locales/fr-FR/template-clips.mdx +1 -0
  20. package/corpus/core/docs/content/locales/fr-FR/template-design.mdx +1 -0
  21. package/corpus/core/docs/content/locales/hi-IN/extensions.mdx +8 -0
  22. package/corpus/core/docs/content/locales/hi-IN/messaging.mdx +81 -15
  23. package/corpus/core/docs/content/locales/hi-IN/template-clips.mdx +1 -0
  24. package/corpus/core/docs/content/locales/hi-IN/template-design.mdx +1 -0
  25. package/corpus/core/docs/content/locales/ja-JP/extensions.mdx +9 -0
  26. package/corpus/core/docs/content/locales/ja-JP/messaging.mdx +81 -15
  27. package/corpus/core/docs/content/locales/ja-JP/template-clips.mdx +1 -0
  28. package/corpus/core/docs/content/locales/ja-JP/template-design.mdx +1 -0
  29. package/corpus/core/docs/content/locales/ko-KR/extensions.mdx +8 -0
  30. package/corpus/core/docs/content/locales/ko-KR/messaging.mdx +80 -15
  31. package/corpus/core/docs/content/locales/ko-KR/template-clips.mdx +1 -0
  32. package/corpus/core/docs/content/locales/ko-KR/template-design.mdx +1 -0
  33. package/corpus/core/docs/content/locales/pt-BR/extensions.mdx +9 -0
  34. package/corpus/core/docs/content/locales/pt-BR/messaging.mdx +88 -15
  35. package/corpus/core/docs/content/locales/pt-BR/template-clips.mdx +1 -0
  36. package/corpus/core/docs/content/locales/pt-BR/template-design.mdx +1 -0
  37. package/corpus/core/docs/content/locales/zh-CN/extensions.mdx +6 -0
  38. package/corpus/core/docs/content/locales/zh-CN/messaging.mdx +78 -15
  39. package/corpus/core/docs/content/locales/zh-CN/template-clips.mdx +1 -0
  40. package/corpus/core/docs/content/locales/zh-CN/template-design.mdx +1 -0
  41. package/corpus/core/docs/content/locales/zh-TW/extensions.mdx +6 -0
  42. package/corpus/core/docs/content/locales/zh-TW/messaging.mdx +78 -15
  43. package/corpus/core/docs/content/locales/zh-TW/template-clips.mdx +1 -0
  44. package/corpus/core/docs/content/locales/zh-TW/template-design.mdx +1 -0
  45. package/corpus/core/docs/content/messaging.mdx +227 -45
  46. package/corpus/core/docs/content/template-clips.mdx +3 -0
  47. package/corpus/core/docs/content/template-design.mdx +4 -0
  48. package/corpus/core/package.json +5 -1
  49. package/corpus/core/src/a2a/artifact-response.ts +131 -2
  50. package/corpus/core/src/a2a/client.ts +10 -0
  51. package/corpus/core/src/a2a/handlers.ts +40 -76
  52. package/corpus/core/src/a2a/types.ts +2 -0
  53. package/corpus/core/src/agent/durable-background.ts +24 -0
  54. package/corpus/core/src/agent/production-agent.ts +15 -3
  55. package/corpus/core/src/agent/run-manager.ts +130 -10
  56. package/corpus/core/src/agent/run-store.ts +225 -15
  57. package/corpus/core/src/agent/types.ts +23 -0
  58. package/corpus/core/src/audit/record.ts +31 -0
  59. package/corpus/core/src/audit/store.ts +69 -3
  60. package/corpus/core/src/audit/types.ts +13 -0
  61. package/corpus/core/src/automation/index.ts +802 -0
  62. package/corpus/core/src/cli/create.ts +12 -5
  63. package/corpus/core/src/cli/design-connect.ts +596 -36
  64. package/corpus/core/src/client/AgentPanel.tsx +51 -6
  65. package/corpus/core/src/client/AssistantChat.tsx +274 -147
  66. package/corpus/core/src/client/MultiTabAssistantChat.tsx +3 -0
  67. package/corpus/core/src/client/RunStuckBanner.tsx +69 -20
  68. package/corpus/core/src/client/agent-chat-adapter.ts +54 -5
  69. package/corpus/core/src/client/automation.ts +22 -0
  70. package/corpus/core/src/client/chat/run-recovery.tsx +67 -50
  71. package/corpus/core/src/client/composer/TiptapComposer.tsx +8 -0
  72. package/corpus/core/src/client/index.ts +30 -0
  73. package/corpus/core/src/client/integrations/api.ts +295 -0
  74. package/corpus/core/src/client/integrations/index.ts +26 -0
  75. package/corpus/core/src/client/transcription/use-live-transcription.ts +68 -5
  76. package/corpus/core/src/client/use-run-stuck-detection.ts +41 -3
  77. package/corpus/core/src/deploy/build.ts +59 -3
  78. package/corpus/core/src/deploy/workspace-deploy.ts +37 -2
  79. package/corpus/core/src/file-upload/types.ts +2 -0
  80. package/corpus/core/src/index.ts +37 -0
  81. package/corpus/core/src/integrations/a2a-continuations-store.ts +6 -4
  82. package/corpus/core/src/integrations/adapters/discord.ts +362 -0
  83. package/corpus/core/src/integrations/adapters/index.ts +29 -0
  84. package/corpus/core/src/integrations/adapters/microsoft-teams.ts +411 -0
  85. package/corpus/core/src/integrations/adapters/slack.ts +861 -27
  86. package/corpus/core/src/integrations/adapters/telegram.ts +54 -15
  87. package/corpus/core/src/integrations/adapters/whatsapp.ts +41 -17
  88. package/corpus/core/src/integrations/catalog.ts +571 -0
  89. package/corpus/core/src/integrations/controls-store.ts +187 -0
  90. package/corpus/core/src/integrations/index.ts +100 -0
  91. package/corpus/core/src/integrations/installations-store.ts +677 -0
  92. package/corpus/core/src/integrations/integration-memory.ts +187 -0
  93. package/corpus/core/src/integrations/pending-tasks-retry-job.ts +6 -6
  94. package/corpus/core/src/integrations/pending-tasks-store.ts +83 -5
  95. package/corpus/core/src/integrations/plugin.ts +685 -47
  96. package/corpus/core/src/integrations/scope-store.ts +498 -0
  97. package/corpus/core/src/integrations/slack-manifest.ts +78 -0
  98. package/corpus/core/src/integrations/slack-oauth.ts +343 -0
  99. package/corpus/core/src/integrations/types.ts +179 -0
  100. package/corpus/core/src/integrations/usage-budget-store.ts +906 -0
  101. package/corpus/core/src/integrations/webhook-handler.ts +562 -51
  102. package/corpus/core/src/jobs/scheduler.ts +100 -2
  103. package/corpus/core/src/jobs/tools.ts +45 -9
  104. package/corpus/core/src/provider-api/index.ts +72 -1
  105. package/corpus/core/src/resources/handlers.ts +88 -14
  106. package/corpus/core/src/resources/script-helpers.ts +36 -7
  107. package/corpus/core/src/resources/store.ts +59 -52
  108. package/corpus/core/src/scripts/call-agent.ts +107 -1
  109. package/corpus/core/src/server/agent-chat-plugin.ts +294 -119
  110. package/corpus/core/src/server/auth.ts +10 -14
  111. package/corpus/core/src/server/builder-design-systems.ts +16 -1
  112. package/corpus/core/src/server/edge.ts +18 -0
  113. package/corpus/core/src/server/index.ts +26 -0
  114. package/corpus/core/src/server/request-context.ts +18 -0
  115. package/corpus/core/src/server/social-og-image.ts +3 -2
  116. package/corpus/core/src/styles/agent-native.css +62 -44
  117. package/corpus/core/src/templates/default/.agents/skills/capture-learnings/SKILL.md +22 -9
  118. package/corpus/core/src/templates/default/AGENTS.md +7 -3
  119. package/corpus/core/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +1 -1
  120. package/corpus/core/src/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +22 -9
  121. package/corpus/core/src/templates/workspace-core/.agents/skills/extension-points/SKILL.md +6 -3
  122. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +25 -0
  123. package/corpus/core/src/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +15 -0
  124. package/corpus/core/src/templates/workspace-core/AGENTS.md +3 -2
  125. package/corpus/core/src/usage/store.ts +37 -2
  126. package/corpus/templates/analytics/.agents/skills/capture-learnings/SKILL.md +22 -9
  127. package/corpus/templates/analytics/.agents/skills/provider-api/SKILL.md +23 -0
  128. package/corpus/templates/analytics/.builder/skills/provider-api/SKILL.md +15 -0
  129. package/corpus/templates/analytics/actions/save-monitor.ts +25 -2
  130. package/corpus/templates/analytics/app/lib/data-sources.ts +28 -0
  131. package/corpus/templates/analytics/changelog/2026-07-10-agent-created-uptime-monitors-now-return-a-direct-link-to-th.md +6 -0
  132. package/corpus/templates/analytics/changelog/2026-07-10-dashboard-email-reports-still-arrive-when-screenshot-capture-temporarily-fails.md +6 -0
  133. package/corpus/templates/analytics/server/jobs/dashboard-report.ts +3 -7
  134. package/corpus/templates/analytics/server/lib/credential-keys.ts +12 -0
  135. package/corpus/templates/analytics/server/lib/dashboard-report.ts +5 -1
  136. package/corpus/templates/analytics/server/lib/provider-credentials.ts +2 -0
  137. package/corpus/templates/analytics/server/routes/api/test-connection.post.ts +16 -0
  138. package/corpus/templates/assets/.agents/skills/capture-learnings/SKILL.md +22 -9
  139. package/corpus/templates/brain/.agents/skills/capture-learnings/SKILL.md +22 -9
  140. package/corpus/templates/calendar/.agents/skills/capture-learnings/SKILL.md +22 -9
  141. package/corpus/templates/calendar/app/components/calendar/CommandPalette.tsx +98 -108
  142. package/corpus/templates/calendar/app/components/calendar/EventAttendeesSection.tsx +97 -90
  143. package/corpus/templates/calendar/changelog/2026-07-10-event-guest-details-and-option-menus-now-use-valid-accessibl.md +6 -0
  144. package/corpus/templates/calendar/changelog/2026-07-10-natural-language-event-phrases-stay-available-as-quick-creat.md +6 -0
  145. package/corpus/templates/chat/.agents/skills/capture-learnings/SKILL.md +22 -9
  146. package/corpus/templates/chat/changelog/2026-07-10-chat-now-makes-ai-connection-setup-clear-without-shifting-th.md +6 -0
  147. package/corpus/templates/clips/.agents/skills/capture-learnings/SKILL.md +22 -9
  148. package/corpus/templates/clips/.agents/skills/recording/SKILL.md +17 -1
  149. package/corpus/templates/clips/.agents/skills/video-sharing/SKILL.md +8 -0
  150. package/corpus/templates/clips/AGENTS.md +8 -3
  151. package/corpus/templates/clips/actions/finalize-recording.ts +63 -23
  152. package/corpus/templates/clips/actions/get-recording-player-data.ts +6 -2
  153. package/corpus/templates/clips/actions/lib/ensure-seekable-video.ts +72 -9
  154. package/corpus/templates/clips/actions/list-recordings.ts +19 -3
  155. package/corpus/templates/clips/actions/navigate.ts +2 -0
  156. package/corpus/templates/clips/actions/reprocess-recording.ts +20 -6
  157. package/corpus/templates/clips/actions/request-transcript.ts +16 -31
  158. package/corpus/templates/clips/actions/view-screen.ts +57 -5
  159. package/corpus/templates/clips/app/components/layout/Header.tsx +1 -0
  160. package/corpus/templates/clips/app/components/library/empty-state.tsx +2 -0
  161. package/corpus/templates/clips/app/components/library/library-grid.tsx +69 -42
  162. package/corpus/templates/clips/app/components/library/library-layout.tsx +15 -1
  163. package/corpus/templates/clips/app/components/library/recording-card.tsx +81 -68
  164. package/corpus/templates/clips/app/components/library/search-bar.tsx +4 -3
  165. package/corpus/templates/clips/app/components/player/delete-recording-menu.tsx +9 -3
  166. package/corpus/templates/clips/app/components/player/share-dialog.tsx +1 -1
  167. package/corpus/templates/clips/app/hooks/use-library.ts +1 -1
  168. package/corpus/templates/clips/app/hooks/use-navigation-state.ts +10 -2
  169. package/corpus/templates/clips/app/i18n/ar-SA.ts +7 -1
  170. package/corpus/templates/clips/app/i18n/de-DE.ts +7 -1
  171. package/corpus/templates/clips/app/i18n/en-US.ts +7 -1
  172. package/corpus/templates/clips/app/i18n/es-ES.ts +7 -1
  173. package/corpus/templates/clips/app/i18n/fr-FR.ts +7 -1
  174. package/corpus/templates/clips/app/i18n/hi-IN.ts +7 -1
  175. package/corpus/templates/clips/app/i18n/ja-JP.ts +7 -1
  176. package/corpus/templates/clips/app/i18n/ko-KR.ts +7 -1
  177. package/corpus/templates/clips/app/i18n/pt-BR.ts +7 -1
  178. package/corpus/templates/clips/app/i18n/zh-CN.ts +8 -1
  179. package/corpus/templates/clips/app/i18n/zh-TW.ts +8 -1
  180. package/corpus/templates/clips/app/lib/recording-visibility.ts +70 -0
  181. package/corpus/templates/clips/app/routes/_app.shared.tsx +20 -0
  182. package/corpus/templates/clips/app/routes/download.tsx +24 -8
  183. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +115 -2
  184. package/corpus/templates/clips/app/routes/record.tsx +62 -0
  185. package/corpus/templates/clips/app/routes/share.$shareId.tsx +25 -16
  186. package/corpus/templates/clips/changelog/2026-07-10-clips-desktop-is-now-available-for-linux-with-appimage-debia.md +6 -0
  187. package/corpus/templates/clips/changelog/2026-07-10-clips-downloads-updates-sooner-in-the-background-and-offers-.md +6 -0
  188. package/corpus/templates/clips/changelog/2026-07-10-clips-shared-with-you-now-appear-in-a-searchable-shared-with.md +6 -0
  189. package/corpus/templates/clips/changelog/2026-07-10-clips-with-missing-mobile-video-frames-can-be-repaired-witho.md +6 -0
  190. package/corpus/templates/clips/changelog/2026-07-10-mobile-camera-recordings-pause-while-backgrounded.md +6 -0
  191. package/corpus/templates/clips/changelog/2026-07-10-mp4-downloads-now-show-progress-immediately-after-the-option.md +6 -0
  192. package/corpus/templates/clips/changelog/2026-07-10-recording-pages-now-open-as-soon-as-you-stop-with-a-share-li.md +6 -0
  193. package/corpus/templates/clips/changelog/2026-07-10-recordings-now-seek-smoothly-downloads-use-the-correct-file-.md +6 -0
  194. package/corpus/templates/clips/changelog/2026-07-10-s3-compatible-storage-now-saves-hosted-recordings-without-re.md +6 -0
  195. package/corpus/templates/clips/desktop/README.md +22 -6
  196. package/corpus/templates/clips/desktop/package.json +1 -1
  197. package/corpus/templates/clips/desktop/src/app.tsx +32 -19
  198. package/corpus/templates/clips/desktop/src/components/ReadinessPanel.tsx +15 -9
  199. package/corpus/templates/clips/desktop/src/lib/finalization-guard.ts +22 -0
  200. package/corpus/templates/clips/desktop/src/lib/permissions.ts +3 -1
  201. package/corpus/templates/clips/desktop/src/lib/recorder.ts +97 -120
  202. package/corpus/templates/clips/desktop/src/lib/updater.ts +26 -4
  203. package/corpus/templates/clips/desktop/src/overlays/finalizing.tsx +4 -8
  204. package/corpus/templates/clips/desktop/src-tauri/Cargo.toml +1 -1
  205. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +2 -2
  206. package/corpus/templates/clips/desktop/src-tauri/src/permission_status.rs +11 -7
  207. package/corpus/templates/clips/desktop/src-tauri/tauri.linux.conf.json +11 -0
  208. package/corpus/templates/clips/netlify.toml +3 -0
  209. package/corpus/templates/clips/server/lib/post-finalize-dispatch.ts +106 -0
  210. package/corpus/templates/clips/server/lib/public-agent-context.ts +9 -1
  211. package/corpus/templates/clips/server/lib/resumable-upload-provider.ts +52 -0
  212. package/corpus/templates/clips/server/lib/s3-upload-provider.ts +433 -85
  213. package/corpus/templates/clips/server/lib/video-remux.ts +114 -0
  214. package/corpus/templates/clips/server/routes/api/_agent-native-background/post-finalize-worker.post.ts +109 -0
  215. package/corpus/templates/clips/server/routes/api/clips-updater.json.get.ts +22 -11
  216. package/corpus/templates/clips/server/routes/api/public-recording.get.ts +4 -2
  217. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/abort.post.ts +47 -5
  218. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +10 -2
  219. package/corpus/templates/clips/shared/share-loader-response.ts +12 -0
  220. package/corpus/templates/clips/shared/transcript-status.ts +40 -0
  221. package/corpus/templates/content/.agents/skills/capture-learnings/SKILL.md +22 -9
  222. package/corpus/templates/content/.agents/skills/content/SKILL.md +57 -5
  223. package/corpus/templates/content/AGENTS.md +65 -55
  224. package/corpus/templates/content/actions/_builder-cms-read-client.ts +10 -16
  225. package/corpus/templates/content/actions/_database-source-utils.ts +58 -11
  226. package/corpus/templates/content/actions/_property-utils.ts +30 -2
  227. package/corpus/templates/content/actions/add-content-database-source-field-property.ts +312 -114
  228. package/corpus/templates/content/actions/submit-content-database-form.ts +497 -0
  229. package/corpus/templates/content/actions/update-content-database-view.ts +8 -1
  230. package/corpus/templates/content/actions/view-screen.ts +4 -1
  231. package/corpus/templates/content/agent-native.app-skill.json +1 -1
  232. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +250 -64
  233. package/corpus/templates/content/app/components/editor/database/FormView.tsx +460 -0
  234. package/corpus/templates/content/app/components/editor/database/navigation-state.ts +3 -0
  235. package/corpus/templates/content/app/components/editor/database/settings.tsx +30 -37
  236. package/corpus/templates/content/app/components/editor/database/shared.tsx +2 -0
  237. package/corpus/templates/content/app/components/editor/database/view-config.ts +29 -1
  238. package/corpus/templates/content/app/components/ui/textarea.tsx +1 -0
  239. package/corpus/templates/content/app/hooks/use-content-database.ts +22 -0
  240. package/corpus/templates/content/app/i18n/zh-TW.ts +21 -0
  241. package/corpus/templates/content/app/i18n-data.ts +225 -0
  242. package/corpus/templates/content/changelog/2026-07-10-builder-backed-properties-now-load-current-source-values-as-.md +6 -0
  243. package/corpus/templates/content/changelog/2026-07-10-builder-database-refreshes-now-stay-explicit-and-accurate.md +6 -0
  244. package/corpus/templates/content/changelog/2026-07-10-database-form-views-now-collect-ordered-required-answers-and.md +6 -0
  245. package/corpus/templates/content/changelog/2026-07-10-database-tables-now-use-a-quieter-more-compact-layout-with-c.md +6 -0
  246. package/corpus/templates/content/changelog/2026-07-10-slack-intake-routes-to-content-database-forms.md +6 -0
  247. package/corpus/templates/content/parity/matrix.md +1 -0
  248. package/corpus/templates/content/parity/matrix.ts +18 -0
  249. package/corpus/templates/content/shared/api.ts +27 -1
  250. package/corpus/templates/content/shared/database-form.ts +53 -0
  251. package/corpus/templates/design/.agents/skills/capture-learnings/SKILL.md +22 -9
  252. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +26 -0
  253. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +85 -12
  254. package/corpus/templates/design/AGENTS.md +72 -18
  255. package/corpus/templates/design/DESIGN.md +1 -1
  256. package/corpus/templates/design/DEVELOPING.md +1 -1
  257. package/corpus/templates/design/FIGMA_INTEROPERABILITY.md +116 -0
  258. package/corpus/templates/design/actions/create-design-from-template.ts +220 -0
  259. package/corpus/templates/design/actions/create-design-system.ts +92 -16
  260. package/corpus/templates/design/actions/delete-design-template.ts +28 -0
  261. package/corpus/templates/design/actions/delete-file.ts +7 -0
  262. package/corpus/templates/design/actions/edit-design.ts +3 -0
  263. package/corpus/templates/design/actions/export-design-as-figma-svg.ts +137 -5
  264. package/corpus/templates/design/actions/export-pdf.ts +1 -1
  265. package/corpus/templates/design/actions/generate-design.ts +3 -0
  266. package/corpus/templates/design/actions/get-design-snapshot.ts +9 -0
  267. package/corpus/templates/design/actions/get-figma-connection-status.ts +26 -0
  268. package/corpus/templates/design/actions/get-figma-design-context.ts +138 -0
  269. package/corpus/templates/design/actions/get-figma-styles.ts +2 -2
  270. package/corpus/templates/design/actions/import-figma-clipboard.ts +112 -16
  271. package/corpus/templates/design/actions/import-figma-frame.ts +15 -4
  272. package/corpus/templates/design/actions/index-design-system-with-builder.ts +4 -0
  273. package/corpus/templates/design/actions/list-design-templates.ts +118 -0
  274. package/corpus/templates/design/actions/navigate.ts +16 -2
  275. package/corpus/templates/design/actions/provider-api-request.ts +11 -1
  276. package/corpus/templates/design/actions/save-design-as-template.ts +156 -0
  277. package/corpus/templates/design/actions/set-active-breakpoint.ts +13 -4
  278. package/corpus/templates/design/actions/take-design-screenshot.ts +73 -3
  279. package/corpus/templates/design/actions/update-file.ts +39 -22
  280. package/corpus/templates/design/actions/view-screen.ts +36 -1
  281. package/corpus/templates/design/actions/write-local-file.ts +50 -38
  282. package/corpus/templates/design/app/components/design/AutoLayoutSuggestionDialog.tsx +151 -0
  283. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +20 -0
  284. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +251 -22
  285. package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +3 -3
  286. package/corpus/templates/design/app/components/design/DesignImportPanel.tsx +384 -9
  287. package/corpus/templates/design/app/components/design/EditPanel.tsx +105 -32
  288. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +58 -28
  289. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +6 -0
  290. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +539 -53
  291. package/corpus/templates/design/app/components/design/bridge/embedded-wheel.bridge.ts +40 -0
  292. package/corpus/templates/design/app/components/design/code-workbench/CodeWorkbench.tsx +1 -0
  293. package/corpus/templates/design/app/components/design/code-workbench/explorer/ExplorerView.tsx +1 -0
  294. package/corpus/templates/design/app/components/design/code-workbench/explorer/FileTree.tsx +5 -1
  295. package/corpus/templates/design/app/components/design/code-workbench/workspace/create-providers.ts +2 -0
  296. package/corpus/templates/design/app/components/design/code-workbench/workspace/localhost-provider.ts +3 -1
  297. package/corpus/templates/design/app/components/design/code-workbench/workspace/types.ts +2 -0
  298. package/corpus/templates/design/app/components/design/edit-panel/element-identity.ts +19 -0
  299. package/corpus/templates/design/app/components/design/edit-panel/frame-presets-panel.tsx +1 -0
  300. package/corpus/templates/design/app/components/design/edit-panel/interaction-state-helpers.ts +27 -0
  301. package/corpus/templates/design/app/components/design/inspector/InteractionStatePanel.tsx +137 -81
  302. package/corpus/templates/design/app/components/design/inspector/frame-size-presets.ts +25 -5
  303. package/corpus/templates/design/app/components/design/multi-screen/chrome-transitions.ts +1 -1
  304. package/corpus/templates/design/app/components/design/multi-screen/frame-geometry.ts +220 -3
  305. package/corpus/templates/design/app/components/design/multi-screen/overview-layout.ts +13 -0
  306. package/corpus/templates/design/app/components/design/multi-screen/types.ts +22 -1
  307. package/corpus/templates/design/app/components/design/types.ts +4 -0
  308. package/corpus/templates/design/app/components/design-system/ProductionDesignSystemShowcase.tsx +208 -0
  309. package/corpus/templates/design/app/components/editor/FigmaLinkComposerBubble.tsx +321 -0
  310. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +24 -4
  311. package/corpus/templates/design/app/components/layout/Layout.tsx +16 -2
  312. package/corpus/templates/design/app/components/layout/Sidebar.tsx +2 -0
  313. package/corpus/templates/design/app/components/templates/TemplatePreview.tsx +72 -0
  314. package/corpus/templates/design/app/global.css +2 -35
  315. package/corpus/templates/design/app/hooks/use-navigation-state.ts +10 -0
  316. package/corpus/templates/design/app/i18n/zh-TW.ts +127 -5
  317. package/corpus/templates/design/app/i18n-breakpoints.ts +209 -0
  318. package/corpus/templates/design/app/i18n-data.ts +1317 -59
  319. package/corpus/templates/design/app/i18n-template-feature.ts +458 -0
  320. package/corpus/templates/design/app/lib/design-clipboard.ts +202 -0
  321. package/corpus/templates/design/app/lib/design-file-upload.ts +87 -0
  322. package/corpus/templates/design/app/lib/design-import.ts +168 -11
  323. package/corpus/templates/design/app/lib/desktop-design-preview.ts +423 -0
  324. package/corpus/templates/design/app/lib/figma-clipboard.ts +74 -8
  325. package/corpus/templates/design/app/lib/figma-connection.ts +161 -0
  326. package/corpus/templates/design/app/lib/figma-svg-copy.ts +814 -22
  327. package/corpus/templates/design/app/lib/figma-url.ts +77 -0
  328. package/corpus/templates/design/app/lib/pending-generation.ts +35 -0
  329. package/corpus/templates/design/app/pages/DesignSystems.tsx +236 -177
  330. package/corpus/templates/design/app/pages/Index.tsx +38 -0
  331. package/corpus/templates/design/app/pages/Templates.tsx +498 -0
  332. package/corpus/templates/design/app/pages/design-editor/auto-layout-suggestion.ts +328 -0
  333. package/corpus/templates/design/app/pages/design-editor/clone-idrefs.ts +113 -0
  334. package/corpus/templates/design/app/pages/design-editor/created-screen-navigation.ts +55 -0
  335. package/corpus/templates/design/app/pages/design-editor/editor-session.ts +32 -0
  336. package/corpus/templates/design/app/pages/design-editor/editor-state.ts +49 -2
  337. package/corpus/templates/design/app/pages/design-editor/export-capture.ts +296 -0
  338. package/corpus/templates/design/app/pages/design-editor/history.ts +101 -2
  339. package/corpus/templates/design/app/pages/design-editor/layout-operations.ts +28 -1
  340. package/corpus/templates/design/app/pages/design-editor/overview-camera.ts +34 -0
  341. package/corpus/templates/design/app/pages/design-editor/pending-edits.ts +202 -6
  342. package/corpus/templates/design/app/pages/design-editor/pending-structure-verification.ts +92 -0
  343. package/corpus/templates/design/app/pages/design-editor/save-failure.ts +58 -0
  344. package/corpus/templates/design/app/routes/templates.tsx +4 -6
  345. package/corpus/templates/design/changelog/2026-07-10-app-workspaces-now-use-clean-borderless-main-surfaces-throug.md +6 -0
  346. package/corpus/templates/design/changelog/2026-07-10-ask-chat-what-s-in-a-figma-file-or-frame-structure-screensho.md +6 -0
  347. package/corpus/templates/design/changelog/2026-07-10-canvas-edits-now-reject-malformed-html-before-it-can-corrupt.md +6 -0
  348. package/corpus/templates/design/changelog/2026-07-10-complex-designs-now-export-as-valid-secure-svgs-and-crisp-ra.md +6 -0
  349. package/corpus/templates/design/changelog/2026-07-10-complex-figma-masks-arcs-rich-text-transformed-images-and-ad.md +6 -0
  350. package/corpus/templates/design/changelog/2026-07-10-copied-layers-paste-across-designs-and-browser-tabs.md +6 -0
  351. package/corpus/templates/design/changelog/2026-07-10-copy-and-download-editable-figma-svg.md +6 -0
  352. package/corpus/templates/design/changelog/2026-07-10-copying-design-text-now-pastes-readable-text-into-other-apps.md +6 -0
  353. package/corpus/templates/design/changelog/2026-07-10-deleted-screens-can-be-restored-with-undo-and-removed-again-.md +6 -0
  354. package/corpus/templates/design/changelog/2026-07-10-design-changes-now-save-before-switching-apps-and-retry-when.md +6 -0
  355. package/corpus/templates/design/changelog/2026-07-10-design-stays-usable-on-phones-by-keeping-editor-panels-and-f.md +6 -0
  356. package/corpus/templates/design/changelog/2026-07-10-download-all-screens-as-one-multi-page-pdf-from-the-overview.md +6 -0
  357. package/corpus/templates/design/changelog/2026-07-10-duplicated-layers-now-keep-labels-aria-relationships-fragmen.md +6 -0
  358. package/corpus/templates/design/changelog/2026-07-10-fig-import-results-stay-compact.md +6 -0
  359. package/corpus/templates/design/changelog/2026-07-10-figma-imports-now-load-real-fonts-fix-rotated-gradient-dashe.md +6 -0
  360. package/corpus/templates/design/changelog/2026-07-10-figma-links-in-chat-and-the-import-tab-now-offer-secure-one-.md +6 -0
  361. package/corpus/templates/design/changelog/2026-07-10-fixed-cmd-z-not-restoring-content-after-an-agent-driven-desi.md +6 -0
  362. package/corpus/templates/design/changelog/2026-07-10-fixed-download-pdf-being-unreachable-from-the-export-panel-e.md +6 -0
  363. package/corpus/templates/design/changelog/2026-07-10-fixed-dragging-a-layer-out-of-an-auto-layout-row-column-no-l.md +6 -0
  364. package/corpus/templates/design/changelog/2026-07-10-fixed-figma-svg-export-text-wrapping-sizing-and-inner-layer.md +6 -0
  365. package/corpus/templates/design/changelog/2026-07-10-fixed-hiding-or-locking-one-layer-no-longer-hides-or-blocks-.md +6 -0
  366. package/corpus/templates/design/changelog/2026-07-10-fixed-png-screenshots-of-tall-screens-being-cropped-to-one-v.md +6 -0
  367. package/corpus/templates/design/changelog/2026-07-10-fixed-png-svg-exports-capturing-broken-layout-when-webfonts-.md +6 -0
  368. package/corpus/templates/design/changelog/2026-07-10-frame-tool-now-offers-standard-ad-unit-size-presets-medium-r.md +6 -0
  369. package/corpus/templates/design/changelog/2026-07-10-full-view-controls-stay-within-their-frame-instead-of-coveri.md +6 -0
  370. package/corpus/templates/design/changelog/2026-07-10-hover-focus-focus-visible-pressed-and-disabled-states-now-pr.md +6 -0
  371. package/corpus/templates/design/changelog/2026-07-10-layer-drops-now-land-in-the-intended-grid-row-stay-visually-.md +6 -0
  372. package/corpus/templates/design/changelog/2026-07-10-local-code-workspaces-now-keep-unsaved-edits-across-panel-sw.md +6 -0
  373. package/corpus/templates/design/changelog/2026-07-10-local-visual-editing-now-keeps-authenticated-sessions-shared.md +6 -0
  374. package/corpus/templates/design/changelog/2026-07-10-long-running-agent-work-no-longer-shows-a-premature-stuck-wa.md +6 -0
  375. package/corpus/templates/design/changelog/2026-07-10-managed-figma-connections-are-recognized-automatically.md +6 -0
  376. package/corpus/templates/design/changelog/2026-07-10-new-designs-can-open-directly-in-the-editor-without-a-pr.md +6 -0
  377. package/corpus/templates/design/changelog/2026-07-10-new-screens-are-selected-and-revealed-immediately.md +6 -0
  378. package/corpus/templates/design/changelog/2026-07-10-new-text-layers-undo-as-one-safe-creation.md +6 -0
  379. package/corpus/templates/design/changelog/2026-07-10-preview-and-apply-inferred-auto-layout-without-changing-yo.md +5 -0
  380. package/corpus/templates/design/changelog/2026-07-10-print-pdf-exports-and-paper-size-presets-letter-a4-now-match.md +6 -0
  381. package/corpus/templates/design/changelog/2026-07-10-responsive-frame-editing.md +6 -0
  382. package/corpus/templates/design/changelog/2026-07-10-reusable-design-templates.md +6 -0
  383. package/corpus/templates/design/changelog/2026-07-10-screen-overview-frames-now-use-a-clearer-interact-action-wit.md +6 -0
  384. package/corpus/templates/design/changelog/2026-07-10-start-designs-from-source-linked-material-3-carbon-or-primer.md +6 -0
  385. package/corpus/templates/design/changelog/2026-07-10-tweaks-guidance.md +6 -0
  386. package/corpus/templates/design/changelog/2026-07-10-uploaded-fig-files-can-now-become-editable-design-screens-wi.md +6 -0
  387. package/corpus/templates/design/e2e/helpers.ts +3 -3
  388. package/corpus/templates/design/package.json +2 -0
  389. package/corpus/templates/design/scripts/qa-figma-stress-import.ts +96 -0
  390. package/corpus/templates/design/server/db/index.ts +10 -0
  391. package/corpus/templates/design/server/db/schema.ts +44 -0
  392. package/corpus/templates/design/server/handlers/import-design-file.ts +114 -80
  393. package/corpus/templates/design/server/handlers/index-design-system-with-builder.ts +19 -6
  394. package/corpus/templates/design/server/lib/design-export.ts +240 -3
  395. package/corpus/templates/design/server/lib/design-template-data.ts +89 -0
  396. package/corpus/templates/design/server/lib/design-to-figma-svg.ts +250 -26
  397. package/corpus/templates/design/server/lib/fig-file-decoder.ts +839 -0
  398. package/corpus/templates/design/server/lib/fig-file-import.ts +287 -0
  399. package/corpus/templates/design/server/lib/fig-file-limits.ts +3 -0
  400. package/corpus/templates/design/server/lib/fig-file-to-html.ts +2568 -0
  401. package/corpus/templates/design/server/lib/figma-design-context.ts +359 -0
  402. package/corpus/templates/design/server/lib/figma-node-import.ts +478 -22
  403. package/corpus/templates/design/server/lib/figma-node-to-html.ts +554 -29
  404. package/corpus/templates/design/server/lib/local-figma-qa-upload.ts +112 -0
  405. package/corpus/templates/design/server/lib/verify-write-grant.ts +16 -2
  406. package/corpus/templates/design/server/lib/visible-clipboard-html.ts +13 -3
  407. package/corpus/templates/design/server/plugins/agent-chat.ts +7 -0
  408. package/corpus/templates/design/server/plugins/db.ts +42 -0
  409. package/corpus/templates/design/server/plugins/local-figma-qa-upload.ts +7 -0
  410. package/corpus/templates/design/server/register-secrets.ts +8 -8
  411. package/corpus/templates/design/server/routes/api/qa-figma-import-assets/[assetId].get.ts +46 -0
  412. package/corpus/templates/design/server/source-workspace.ts +104 -12
  413. package/corpus/templates/design/shared/code-layer.ts +105 -28
  414. package/corpus/templates/design/shared/design-system-templates.ts +301 -0
  415. package/corpus/templates/design/shared/design-template-presets.ts +195 -0
  416. package/corpus/templates/design/shared/figma-url.ts +8 -0
  417. package/corpus/templates/design/shared/html-integrity.ts +306 -0
  418. package/corpus/templates/design/shared/interaction-states.ts +318 -23
  419. package/corpus/templates/design/shared/locked-layers.ts +151 -0
  420. package/corpus/templates/dispatch/.agents/skills/capture-learnings/SKILL.md +22 -9
  421. package/corpus/templates/dispatch/app/i18n/zh-TW.ts +48 -0
  422. package/corpus/templates/dispatch/app/i18n-data.ts +536 -1
  423. package/corpus/templates/dispatch/changelog/2026-07-10-connect-slack-workspaces-with-oauth-and-manage-channel-ident.md +6 -0
  424. package/corpus/templates/dispatch/changelog/2026-07-10-microsoft-teams-bots-and-discord-slash-commands-can-now-conn.md +6 -0
  425. package/corpus/templates/dispatch/changelog/2026-07-10-slack-and-telegram-now-route-uptime-monitor-requests-to-anal.md +6 -0
  426. package/corpus/templates/forms/.agents/skills/capture-learnings/SKILL.md +22 -9
  427. package/corpus/templates/forms/.agents/skills/form-publishing/SKILL.md +7 -0
  428. package/corpus/templates/forms/AGENTS.md +4 -0
  429. package/corpus/templates/forms/actions/create-form.ts +44 -7
  430. package/corpus/templates/forms/actions/lib/assert-publishable-form.ts +38 -0
  431. package/corpus/templates/forms/actions/patch-form-fields.ts +4 -0
  432. package/corpus/templates/forms/actions/update-form.ts +2 -36
  433. package/corpus/templates/forms/app/i18n/ar-SA.ts +3 -0
  434. package/corpus/templates/forms/app/i18n/de-DE.ts +3 -0
  435. package/corpus/templates/forms/app/i18n/en-US.ts +3 -0
  436. package/corpus/templates/forms/app/i18n/es-ES.ts +3 -0
  437. package/corpus/templates/forms/app/i18n/fr-FR.ts +3 -0
  438. package/corpus/templates/forms/app/i18n/hi-IN.ts +3 -0
  439. package/corpus/templates/forms/app/i18n/ja-JP.ts +3 -0
  440. package/corpus/templates/forms/app/i18n/ko-KR.ts +3 -0
  441. package/corpus/templates/forms/app/i18n/pt-BR.ts +3 -0
  442. package/corpus/templates/forms/app/i18n/zh-CN.ts +2 -0
  443. package/corpus/templates/forms/app/i18n/zh-TW.ts +3 -0
  444. package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +17 -0
  445. package/corpus/templates/forms/changelog/2026-07-10-agent-created-published-forms-now-return-the-anonymous-publi.md +6 -0
  446. package/corpus/templates/forms/changelog/2026-07-10-published-forms-can-no-longer-be-edited-into-an-unusable-emp.md +6 -0
  447. package/corpus/templates/forms/server/handlers/submissions.ts +4 -3
  448. package/corpus/templates/forms/server/plugins/agent-chat.ts +1 -0
  449. package/corpus/templates/forms/shared/types.ts +5 -0
  450. package/corpus/templates/mail/.agents/skills/capture-learnings/SKILL.md +22 -9
  451. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +2 -2
  452. package/corpus/templates/mail/changelog/2026-07-10-mail-navigation-now-uses-a-clean-borderless-drawer.md +6 -0
  453. package/corpus/templates/plan/.agents/skills/capture-learnings/SKILL.md +22 -9
  454. package/corpus/templates/plan/app/lib/plan-local-bridge.ts +4 -1
  455. package/corpus/templates/plan/changelog/2026-07-10-local-plans-now-keep-valid-content-visible-when-one-generate.md +6 -0
  456. package/corpus/templates/plan/server/lib/local-plan-files.ts +4 -1
  457. package/corpus/templates/slides/.agents/skills/capture-learnings/SKILL.md +22 -9
  458. package/dist/a2a/artifact-response.d.ts.map +1 -1
  459. package/dist/a2a/artifact-response.js +88 -2
  460. package/dist/a2a/artifact-response.js.map +1 -1
  461. package/dist/a2a/client.d.ts +9 -0
  462. package/dist/a2a/client.d.ts.map +1 -1
  463. package/dist/a2a/client.js +1 -0
  464. package/dist/a2a/client.js.map +1 -1
  465. package/dist/a2a/handlers.d.ts.map +1 -1
  466. package/dist/a2a/handlers.js +24 -69
  467. package/dist/a2a/handlers.js.map +1 -1
  468. package/dist/a2a/types.d.ts +2 -0
  469. package/dist/a2a/types.d.ts.map +1 -1
  470. package/dist/a2a/types.js.map +1 -1
  471. package/dist/agent/durable-background.d.ts +11 -0
  472. package/dist/agent/durable-background.d.ts.map +1 -1
  473. package/dist/agent/durable-background.js +17 -0
  474. package/dist/agent/durable-background.js.map +1 -1
  475. package/dist/agent/production-agent.d.ts +2 -2
  476. package/dist/agent/production-agent.d.ts.map +1 -1
  477. package/dist/agent/production-agent.js +15 -5
  478. package/dist/agent/production-agent.js.map +1 -1
  479. package/dist/agent/run-manager.d.ts +44 -2
  480. package/dist/agent/run-manager.d.ts.map +1 -1
  481. package/dist/agent/run-manager.js +90 -9
  482. package/dist/agent/run-manager.js.map +1 -1
  483. package/dist/agent/run-store.d.ts +109 -0
  484. package/dist/agent/run-store.d.ts.map +1 -1
  485. package/dist/agent/run-store.js +206 -15
  486. package/dist/agent/run-store.js.map +1 -1
  487. package/dist/agent/types.d.ts +22 -0
  488. package/dist/agent/types.d.ts.map +1 -1
  489. package/dist/agent/types.js.map +1 -1
  490. package/dist/audit/record.d.ts.map +1 -1
  491. package/dist/audit/record.js +29 -0
  492. package/dist/audit/record.js.map +1 -1
  493. package/dist/audit/store.d.ts.map +1 -1
  494. package/dist/audit/store.js +62 -3
  495. package/dist/audit/store.js.map +1 -1
  496. package/dist/audit/types.d.ts +13 -0
  497. package/dist/audit/types.d.ts.map +1 -1
  498. package/dist/audit/types.js.map +1 -1
  499. package/dist/automation/index.d.ts +193 -0
  500. package/dist/automation/index.d.ts.map +1 -0
  501. package/dist/automation/index.js +464 -0
  502. package/dist/automation/index.js.map +1 -0
  503. package/dist/cli/create.d.ts.map +1 -1
  504. package/dist/cli/create.js +10 -3
  505. package/dist/cli/create.js.map +1 -1
  506. package/dist/cli/design-connect.d.ts.map +1 -1
  507. package/dist/cli/design-connect.js +492 -35
  508. package/dist/cli/design-connect.js.map +1 -1
  509. package/dist/client/AgentPanel.d.ts +7 -1
  510. package/dist/client/AgentPanel.d.ts.map +1 -1
  511. package/dist/client/AgentPanel.js +32 -8
  512. package/dist/client/AgentPanel.js.map +1 -1
  513. package/dist/client/AssistantChat.d.ts +15 -0
  514. package/dist/client/AssistantChat.d.ts.map +1 -1
  515. package/dist/client/AssistantChat.js +115 -47
  516. package/dist/client/AssistantChat.js.map +1 -1
  517. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  518. package/dist/client/MultiTabAssistantChat.js +1 -1
  519. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  520. package/dist/client/RunStuckBanner.d.ts +14 -1
  521. package/dist/client/RunStuckBanner.d.ts.map +1 -1
  522. package/dist/client/RunStuckBanner.js +35 -7
  523. package/dist/client/RunStuckBanner.js.map +1 -1
  524. package/dist/client/agent-chat-adapter.d.ts +4 -1
  525. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  526. package/dist/client/agent-chat-adapter.js +49 -4
  527. package/dist/client/agent-chat-adapter.js.map +1 -1
  528. package/dist/client/automation.d.ts +14 -0
  529. package/dist/client/automation.d.ts.map +1 -0
  530. package/dist/client/automation.js +9 -0
  531. package/dist/client/automation.js.map +1 -0
  532. package/dist/client/chat/run-recovery.d.ts +4 -0
  533. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  534. package/dist/client/chat/run-recovery.js +12 -10
  535. package/dist/client/chat/run-recovery.js.map +1 -1
  536. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  537. package/dist/client/composer/TiptapComposer.js +8 -0
  538. package/dist/client/composer/TiptapComposer.js.map +1 -1
  539. package/dist/client/index.d.ts +2 -0
  540. package/dist/client/index.d.ts.map +1 -1
  541. package/dist/client/index.js +2 -0
  542. package/dist/client/index.js.map +1 -1
  543. package/dist/client/integrations/api.d.ts +115 -0
  544. package/dist/client/integrations/api.d.ts.map +1 -0
  545. package/dist/client/integrations/api.js +123 -0
  546. package/dist/client/integrations/api.js.map +1 -0
  547. package/dist/client/integrations/index.d.ts +1 -0
  548. package/dist/client/integrations/index.d.ts.map +1 -1
  549. package/dist/client/integrations/index.js +1 -0
  550. package/dist/client/integrations/index.js.map +1 -1
  551. package/dist/client/transcription/use-live-transcription.d.ts.map +1 -1
  552. package/dist/client/transcription/use-live-transcription.js +59 -5
  553. package/dist/client/transcription/use-live-transcription.js.map +1 -1
  554. package/dist/client/use-run-stuck-detection.d.ts +16 -1
  555. package/dist/client/use-run-stuck-detection.d.ts.map +1 -1
  556. package/dist/client/use-run-stuck-detection.js +23 -4
  557. package/dist/client/use-run-stuck-detection.js.map +1 -1
  558. package/dist/collab/struct-routes.d.ts +1 -1
  559. package/dist/deploy/build.d.ts.map +1 -1
  560. package/dist/deploy/build.js +49 -4
  561. package/dist/deploy/build.js.map +1 -1
  562. package/dist/deploy/workspace-deploy.d.ts.map +1 -1
  563. package/dist/deploy/workspace-deploy.js +31 -2
  564. package/dist/deploy/workspace-deploy.js.map +1 -1
  565. package/dist/file-upload/types.d.ts +2 -0
  566. package/dist/file-upload/types.d.ts.map +1 -1
  567. package/dist/file-upload/types.js.map +1 -1
  568. package/dist/index.d.ts +2 -0
  569. package/dist/index.d.ts.map +1 -1
  570. package/dist/index.js +2 -0
  571. package/dist/index.js.map +1 -1
  572. package/dist/integrations/a2a-continuations-store.d.ts.map +1 -1
  573. package/dist/integrations/a2a-continuations-store.js +6 -4
  574. package/dist/integrations/a2a-continuations-store.js.map +1 -1
  575. package/dist/integrations/adapters/discord.d.ts +3 -0
  576. package/dist/integrations/adapters/discord.d.ts.map +1 -0
  577. package/dist/integrations/adapters/discord.js +261 -0
  578. package/dist/integrations/adapters/discord.js.map +1 -0
  579. package/dist/integrations/adapters/index.d.ts +4 -0
  580. package/dist/integrations/adapters/index.d.ts.map +1 -0
  581. package/dist/integrations/adapters/index.js +26 -0
  582. package/dist/integrations/adapters/index.js.map +1 -0
  583. package/dist/integrations/adapters/microsoft-teams.d.ts +5 -0
  584. package/dist/integrations/adapters/microsoft-teams.d.ts.map +1 -0
  585. package/dist/integrations/adapters/microsoft-teams.js +295 -0
  586. package/dist/integrations/adapters/microsoft-teams.js.map +1 -0
  587. package/dist/integrations/adapters/slack.d.ts +8 -2
  588. package/dist/integrations/adapters/slack.d.ts.map +1 -1
  589. package/dist/integrations/adapters/slack.js +736 -27
  590. package/dist/integrations/adapters/slack.js.map +1 -1
  591. package/dist/integrations/adapters/telegram.d.ts +0 -2
  592. package/dist/integrations/adapters/telegram.d.ts.map +1 -1
  593. package/dist/integrations/adapters/telegram.js +49 -15
  594. package/dist/integrations/adapters/telegram.js.map +1 -1
  595. package/dist/integrations/adapters/whatsapp.d.ts +0 -2
  596. package/dist/integrations/adapters/whatsapp.d.ts.map +1 -1
  597. package/dist/integrations/adapters/whatsapp.js +40 -17
  598. package/dist/integrations/adapters/whatsapp.js.map +1 -1
  599. package/dist/integrations/catalog.d.ts +75 -0
  600. package/dist/integrations/catalog.d.ts.map +1 -0
  601. package/dist/integrations/catalog.js +451 -0
  602. package/dist/integrations/catalog.js.map +1 -0
  603. package/dist/integrations/controls-store.d.ts +44 -0
  604. package/dist/integrations/controls-store.d.ts.map +1 -0
  605. package/dist/integrations/controls-store.js +129 -0
  606. package/dist/integrations/controls-store.js.map +1 -0
  607. package/dist/integrations/index.d.ts +13 -1
  608. package/dist/integrations/index.d.ts.map +1 -1
  609. package/dist/integrations/index.js +9 -0
  610. package/dist/integrations/index.js.map +1 -1
  611. package/dist/integrations/installations-store.d.ts +112 -0
  612. package/dist/integrations/installations-store.d.ts.map +1 -0
  613. package/dist/integrations/installations-store.js +493 -0
  614. package/dist/integrations/installations-store.js.map +1 -0
  615. package/dist/integrations/integration-memory.d.ts +24 -0
  616. package/dist/integrations/integration-memory.d.ts.map +1 -0
  617. package/dist/integrations/integration-memory.js +136 -0
  618. package/dist/integrations/integration-memory.js.map +1 -0
  619. package/dist/integrations/pending-tasks-retry-job.d.ts.map +1 -1
  620. package/dist/integrations/pending-tasks-retry-job.js +6 -5
  621. package/dist/integrations/pending-tasks-retry-job.js.map +1 -1
  622. package/dist/integrations/pending-tasks-store.d.ts +17 -0
  623. package/dist/integrations/pending-tasks-store.d.ts.map +1 -1
  624. package/dist/integrations/pending-tasks-store.js +71 -5
  625. package/dist/integrations/pending-tasks-store.js.map +1 -1
  626. package/dist/integrations/plugin.d.ts.map +1 -1
  627. package/dist/integrations/plugin.js +520 -35
  628. package/dist/integrations/plugin.js.map +1 -1
  629. package/dist/integrations/scope-store.d.ts +65 -0
  630. package/dist/integrations/scope-store.d.ts.map +1 -0
  631. package/dist/integrations/scope-store.js +361 -0
  632. package/dist/integrations/scope-store.js.map +1 -0
  633. package/dist/integrations/slack-manifest.d.ts +66 -0
  634. package/dist/integrations/slack-manifest.d.ts.map +1 -0
  635. package/dist/integrations/slack-manifest.js +70 -0
  636. package/dist/integrations/slack-manifest.js.map +1 -0
  637. package/dist/integrations/slack-oauth.d.ts +99 -0
  638. package/dist/integrations/slack-oauth.d.ts.map +1 -0
  639. package/dist/integrations/slack-oauth.js +226 -0
  640. package/dist/integrations/slack-oauth.js.map +1 -0
  641. package/dist/integrations/types.d.ts +144 -0
  642. package/dist/integrations/types.d.ts.map +1 -1
  643. package/dist/integrations/types.js +16 -1
  644. package/dist/integrations/types.js.map +1 -1
  645. package/dist/integrations/usage-budget-store.d.ts +84 -0
  646. package/dist/integrations/usage-budget-store.d.ts.map +1 -0
  647. package/dist/integrations/usage-budget-store.js +650 -0
  648. package/dist/integrations/usage-budget-store.js.map +1 -0
  649. package/dist/integrations/webhook-handler.d.ts +4 -0
  650. package/dist/integrations/webhook-handler.d.ts.map +1 -1
  651. package/dist/integrations/webhook-handler.js +415 -47
  652. package/dist/integrations/webhook-handler.js.map +1 -1
  653. package/dist/jobs/scheduler.d.ts +6 -0
  654. package/dist/jobs/scheduler.d.ts.map +1 -1
  655. package/dist/jobs/scheduler.js +83 -4
  656. package/dist/jobs/scheduler.js.map +1 -1
  657. package/dist/jobs/tools.d.ts.map +1 -1
  658. package/dist/jobs/tools.js +43 -11
  659. package/dist/jobs/tools.js.map +1 -1
  660. package/dist/observability/routes.d.ts +5 -5
  661. package/dist/progress/routes.d.ts +1 -1
  662. package/dist/provider-api/index.d.ts +4 -4
  663. package/dist/provider-api/index.d.ts.map +1 -1
  664. package/dist/provider-api/index.js +72 -1
  665. package/dist/provider-api/index.js.map +1 -1
  666. package/dist/resources/handlers.d.ts +3 -3
  667. package/dist/resources/handlers.d.ts.map +1 -1
  668. package/dist/resources/handlers.js +57 -15
  669. package/dist/resources/handlers.js.map +1 -1
  670. package/dist/resources/script-helpers.d.ts.map +1 -1
  671. package/dist/resources/script-helpers.js +34 -8
  672. package/dist/resources/script-helpers.js.map +1 -1
  673. package/dist/resources/store.d.ts +10 -0
  674. package/dist/resources/store.d.ts.map +1 -1
  675. package/dist/resources/store.js +54 -47
  676. package/dist/resources/store.js.map +1 -1
  677. package/dist/scripts/call-agent.d.ts.map +1 -1
  678. package/dist/scripts/call-agent.js +106 -1
  679. package/dist/scripts/call-agent.js.map +1 -1
  680. package/dist/server/agent-chat-plugin.d.ts +15 -4
  681. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  682. package/dist/server/agent-chat-plugin.js +248 -113
  683. package/dist/server/agent-chat-plugin.js.map +1 -1
  684. package/dist/server/auth.d.ts.map +1 -1
  685. package/dist/server/auth.js +10 -14
  686. package/dist/server/auth.js.map +1 -1
  687. package/dist/server/builder-design-systems.d.ts +3 -1
  688. package/dist/server/builder-design-systems.d.ts.map +1 -1
  689. package/dist/server/builder-design-systems.js +9 -2
  690. package/dist/server/builder-design-systems.js.map +1 -1
  691. package/dist/server/edge.d.ts +1 -1
  692. package/dist/server/edge.d.ts.map +1 -1
  693. package/dist/server/edge.js +1 -1
  694. package/dist/server/edge.js.map +1 -1
  695. package/dist/server/index.d.ts +2 -1
  696. package/dist/server/index.d.ts.map +1 -1
  697. package/dist/server/index.js +2 -1
  698. package/dist/server/index.js.map +1 -1
  699. package/dist/server/request-context.d.ts +18 -0
  700. package/dist/server/request-context.d.ts.map +1 -1
  701. package/dist/server/request-context.js.map +1 -1
  702. package/dist/server/social-og-image.d.ts.map +1 -1
  703. package/dist/server/social-og-image.js +3 -2
  704. package/dist/server/social-og-image.js.map +1 -1
  705. package/dist/server/transcribe-voice.d.ts +1 -1
  706. package/dist/styles/agent-native.css +62 -44
  707. package/dist/templates/default/.agents/skills/capture-learnings/SKILL.md +22 -9
  708. package/dist/templates/default/AGENTS.md +7 -3
  709. package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +1 -1
  710. package/dist/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +22 -9
  711. package/dist/templates/workspace-core/.agents/skills/extension-points/SKILL.md +6 -3
  712. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +25 -0
  713. package/dist/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +15 -0
  714. package/dist/templates/workspace-core/AGENTS.md +3 -2
  715. package/dist/usage/store.d.ts +7 -0
  716. package/dist/usage/store.d.ts.map +1 -1
  717. package/dist/usage/store.js +24 -3
  718. package/dist/usage/store.js.map +1 -1
  719. package/docs/content/automation-connectors.mdx +80 -0
  720. package/docs/content/extensions.mdx +8 -0
  721. package/docs/content/locales/ar-SA/extensions.mdx +8 -0
  722. package/docs/content/locales/ar-SA/messaging.mdx +84 -15
  723. package/docs/content/locales/ar-SA/template-clips.mdx +1 -0
  724. package/docs/content/locales/ar-SA/template-design.mdx +1 -0
  725. package/docs/content/locales/de-DE/extensions.mdx +10 -0
  726. package/docs/content/locales/de-DE/messaging.mdx +92 -15
  727. package/docs/content/locales/de-DE/template-clips.mdx +1 -0
  728. package/docs/content/locales/de-DE/template-design.mdx +1 -0
  729. package/docs/content/locales/es-ES/extensions.mdx +10 -0
  730. package/docs/content/locales/es-ES/messaging.mdx +91 -15
  731. package/docs/content/locales/es-ES/template-clips.mdx +1 -0
  732. package/docs/content/locales/es-ES/template-design.mdx +1 -0
  733. package/docs/content/locales/fr-FR/extensions.mdx +10 -0
  734. package/docs/content/locales/fr-FR/messaging.mdx +91 -15
  735. package/docs/content/locales/fr-FR/template-clips.mdx +1 -0
  736. package/docs/content/locales/fr-FR/template-design.mdx +1 -0
  737. package/docs/content/locales/hi-IN/extensions.mdx +8 -0
  738. package/docs/content/locales/hi-IN/messaging.mdx +81 -15
  739. package/docs/content/locales/hi-IN/template-clips.mdx +1 -0
  740. package/docs/content/locales/hi-IN/template-design.mdx +1 -0
  741. package/docs/content/locales/ja-JP/extensions.mdx +9 -0
  742. package/docs/content/locales/ja-JP/messaging.mdx +81 -15
  743. package/docs/content/locales/ja-JP/template-clips.mdx +1 -0
  744. package/docs/content/locales/ja-JP/template-design.mdx +1 -0
  745. package/docs/content/locales/ko-KR/extensions.mdx +8 -0
  746. package/docs/content/locales/ko-KR/messaging.mdx +80 -15
  747. package/docs/content/locales/ko-KR/template-clips.mdx +1 -0
  748. package/docs/content/locales/ko-KR/template-design.mdx +1 -0
  749. package/docs/content/locales/pt-BR/extensions.mdx +9 -0
  750. package/docs/content/locales/pt-BR/messaging.mdx +88 -15
  751. package/docs/content/locales/pt-BR/template-clips.mdx +1 -0
  752. package/docs/content/locales/pt-BR/template-design.mdx +1 -0
  753. package/docs/content/locales/zh-CN/extensions.mdx +6 -0
  754. package/docs/content/locales/zh-CN/messaging.mdx +78 -15
  755. package/docs/content/locales/zh-CN/template-clips.mdx +1 -0
  756. package/docs/content/locales/zh-CN/template-design.mdx +1 -0
  757. package/docs/content/locales/zh-TW/extensions.mdx +6 -0
  758. package/docs/content/locales/zh-TW/messaging.mdx +78 -15
  759. package/docs/content/locales/zh-TW/template-clips.mdx +1 -0
  760. package/docs/content/locales/zh-TW/template-design.mdx +1 -0
  761. package/docs/content/messaging.mdx +227 -45
  762. package/docs/content/template-clips.mdx +3 -0
  763. package/docs/content/template-design.mdx +4 -0
  764. package/package.json +5 -1
  765. package/src/templates/default/.agents/skills/capture-learnings/SKILL.md +22 -9
  766. package/src/templates/default/AGENTS.md +7 -3
  767. package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +1 -1
  768. package/src/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +22 -9
  769. package/src/templates/workspace-core/.agents/skills/extension-points/SKILL.md +6 -3
  770. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +25 -0
  771. package/src/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +15 -0
  772. package/src/templates/workspace-core/AGENTS.md +3 -2
@@ -63,6 +63,9 @@ Detailed media, meeting, dictation, editing, and sharing rules live in
63
63
  sharing/status boundary.
64
64
  - Use framework sharing actions for recordings. Password and expiry are extra
65
65
  controls on top of visibility/share grants.
66
+ - Use `list-recordings --view=shared` for the current user's "Shared with me"
67
+ collection. It returns recordings admitted by sharing access that are owned
68
+ by someone else; public-link-only clips remain out of this list.
66
69
  - Public recordings expose AI-readable URLs for external agents:
67
70
  `/api/agent-context.json?id=<recordingId>` for metadata, transcript, and frame
68
71
  API discovery; `/api/agent-transcript.json?id=<recordingId>` for transcript
@@ -132,9 +135,11 @@ Detailed media, meeting, dictation, editing, and sharing rules live in
132
135
 
133
136
  ## Application State
134
137
 
135
- - `navigation` exposes library, recording, share, meeting, dictation, settings,
136
- and transcript context. `selection` exposes selected library recording ids
137
- when the user is in selection mode.
138
+ - `navigation` exposes library, shared-with-me, recording, share, meeting,
139
+ dictation, settings, and transcript context. `selection` exposes selected
140
+ library recording ids when the user is in selection mode.
141
+ - `navigate --view=shared` opens the shared-with-me collection, and
142
+ `view-screen` returns its currently visible recordings.
138
143
  - `recording-setup.import` exposes Loom import UI state while the `/record`
139
144
  surface is open, without storing the pasted URL in ambient screen context.
140
145
  - `navigate` moves the UI to recording/library/meeting/share surfaces.
@@ -15,11 +15,9 @@ import {
15
15
  deleteAppState,
16
16
  } from "@agent-native/core/application-state";
17
17
  import { emit } from "@agent-native/core/event-bus";
18
- import {
19
- getActiveFileUploadProvider,
20
- uploadFile,
21
- } from "@agent-native/core/file-upload";
18
+ import { uploadFile } from "@agent-native/core/file-upload";
22
19
  import { captureRouteError } from "@agent-native/core/server";
20
+ import { isStoredButUnservableFinalizeError } from "@shared/finalize-recovery.js";
23
21
  import { MAX_UPLOAD_BYTES as MAX_RECORDING_UPLOAD_BYTES } from "@shared/upload-limits.js";
24
22
  import { and, eq, isNull, ne } from "drizzle-orm";
25
23
  import { z } from "zod";
@@ -31,6 +29,7 @@ import {
31
29
  applyFaststart,
32
30
  hasPlayableMp4Metadata,
33
31
  } from "../server/lib/faststart.js";
32
+ import { dispatchPostFinalizeJob } from "../server/lib/post-finalize-dispatch.js";
34
33
  import {
35
34
  listRecordingChunkKeys,
36
35
  validateRecordingChunkKeys,
@@ -43,6 +42,7 @@ import {
43
42
  deleteResumableSession,
44
43
  getResumableSession,
45
44
  } from "../server/lib/resumable-session.js";
45
+ import { resolveResumableUploadProvider } from "../server/lib/resumable-upload-provider.js";
46
46
  import { isStreamingUploadDisabled } from "../server/lib/streaming-upload-mode.js";
47
47
  import {
48
48
  probeHasAudioStream,
@@ -52,11 +52,7 @@ import {
52
52
  requiresConfiguredVideoStorage,
53
53
  STORAGE_SETUP_REQUIRED_REASON,
54
54
  } from "../server/lib/video-storage.js";
55
- import {
56
- ensureRecordingSeekable,
57
- markRecordingSeekable,
58
- } from "./lib/ensure-seekable-video.js";
59
- import requestTranscript from "./request-transcript.js";
55
+ import { markRecordingSeekable } from "./lib/ensure-seekable-video.js";
60
56
 
61
57
  // Recordings up to this size get their seekable rewrite applied inline during
62
58
  // finalize (we already hold the assembled bytes). Larger recordings are handed
@@ -392,25 +388,28 @@ async function markRecordingReady(params: {
392
388
  } else {
393
389
  // Streaming/resumable (or oversized) uploads shipped raw MediaRecorder
394
390
  // bytes with no seekable rewrite: an MP4 with a trailing moov or a WebM
395
- // without a Cues index buffers on load and re-buffers on every seek. Fix
396
- // it in the background so playback is smooth without blocking finalize.
397
- void Promise.resolve(
398
- ensureRecordingSeekable({ recordingId: id, ownerEmail }),
399
- ).catch((err: unknown) => {
400
- console.warn("[finalize] background seekable remux failed", {
391
+ // without a Cues index buffers on load and re-buffers on every seek. A
392
+ // fresh self-dispatched request owns the repair so serverless runtimes do
393
+ // not freeze it when this finalize request returns.
394
+ await dispatchPostFinalizeJob({
395
+ recordingId: id,
396
+ kind: "seekable",
397
+ }).catch((err: unknown) => {
398
+ console.warn("[finalize] seekable remux dispatch failed", {
401
399
  id,
402
400
  error: err instanceof Error ? err.message : String(err),
403
401
  });
404
402
  });
405
403
  }
406
404
 
407
- // Kick off transcription in the background fire-and-forget so the chunk
408
- // endpoint gets a quick response. The request context (user email via
409
- // AsyncLocalStorage) carries through to async continuations.
410
- void Promise.resolve(
411
- requestTranscript.run({ recordingId: id, force: true }),
412
- ).catch((err: unknown) => {
413
- console.error("[finalize] background transcript failed", {
405
+ // Transcription can outlive the upload request. Dispatch it into a fresh
406
+ // invocation instead of leaving an unawaited promise in this serverless
407
+ // function, where it can be frozen immediately after the response is sent.
408
+ await dispatchPostFinalizeJob({
409
+ recordingId: id,
410
+ kind: "transcript",
411
+ }).catch((err: unknown) => {
412
+ console.error("[finalize] transcript dispatch failed", {
414
413
  id,
415
414
  error: err instanceof Error ? err.message : String(err),
416
415
  });
@@ -511,6 +510,12 @@ export default defineAction({
511
510
  // chunks are gone by then).
512
511
  if (existing.status === "ready" && existing.videoUrl) {
513
512
  debugLog("[finalize] already finalized, returning existing", { id });
513
+ // A prior attempt may have persisted the ready row and then failed
514
+ // before deleting its resumable-session handle. The provider upload is
515
+ // complete at this point, so retire only the local retry state.
516
+ await deleteResumableSession(id).catch((err) =>
517
+ console.warn("[finalize] failed to delete resumable session:", err),
518
+ );
514
519
  return {
515
520
  id,
516
521
  status: "ready" as const,
@@ -581,8 +586,43 @@ export default defineAction({
581
586
  id,
582
587
  providerId: resumableSession.providerId,
583
588
  });
589
+ if (
590
+ existing.status === "failed" &&
591
+ typeof existing.failureReason === "string" &&
592
+ isStoredButUnservableFinalizeError(existing.failureReason)
593
+ ) {
594
+ // Verification failed after the provider may already have completed
595
+ // the multipart upload. Move only that known-recoverable failure
596
+ // back to processing. A later user abort writes a different failed
597
+ // state, and markRecordingReady's status guard will still win.
598
+ const recoveryStartedAt = new Date().toISOString();
599
+ await db
600
+ .update(schema.recordings)
601
+ .set({
602
+ status: "processing",
603
+ failureReason: null,
604
+ updatedAt: recoveryStartedAt,
605
+ })
606
+ .where(
607
+ and(
608
+ eq(schema.recordings.id, id),
609
+ ownerEmailMatches(schema.recordings.ownerEmail, ownerEmail),
610
+ eq(schema.recordings.status, "failed"),
611
+ eq(schema.recordings.failureReason, existing.failureReason),
612
+ ),
613
+ );
614
+ await writeAppState(`recording-upload-${id}`, {
615
+ ...(uploadState ?? {}),
616
+ recordingId: id,
617
+ status: "processing",
618
+ failureReason: null,
619
+ updatedAt: recoveryStartedAt,
620
+ });
621
+ }
584
622
  try {
585
- const uploadProvider = getActiveFileUploadProvider();
623
+ const uploadProvider = await resolveResumableUploadProvider(
624
+ resumableSession.providerId,
625
+ );
586
626
  if (!uploadProvider?.resumable) {
587
627
  throw new Error("No resumable upload provider configured");
588
628
  }
@@ -36,6 +36,7 @@ import {
36
36
  normalizeTranscriptSegments,
37
37
  parseTranscriptSegments,
38
38
  } from "../shared/transcript-segments.js";
39
+ import { resolveTranscriptPresentation } from "../shared/transcript-status.js";
39
40
 
40
41
  function safeJsonObject(raw: string | null | undefined) {
41
42
  if (!raw) return {};
@@ -215,6 +216,7 @@ export default defineAction({
215
216
  transcript?.status === "ready" &&
216
217
  !transcript.fullText?.trim() &&
217
218
  transcriptSegments.length === 0;
219
+ const transcriptPresentation = resolveTranscriptPresentation(transcript);
218
220
 
219
221
  // Normalize the dev-fallback videoUrl:
220
222
  // 1. Rewrite legacy `/api/uploads/:id/blob` to `/api/video/:id` so old
@@ -283,12 +285,14 @@ export default defineAction({
283
285
  },
284
286
  transcript: transcript
285
287
  ? {
286
- status: transcriptReadyButEmpty ? "failed" : transcript.status,
288
+ status: transcriptReadyButEmpty
289
+ ? "failed"
290
+ : transcriptPresentation.status,
287
291
  language: transcript.language,
288
292
  fullText: transcript.fullText,
289
293
  failureReason: transcriptReadyButEmpty
290
294
  ? "No speech was detected by transcription. Check microphone and speech permissions, then retry transcription."
291
- : transcript.failureReason,
295
+ : transcriptPresentation.failureReason,
292
296
  segments: transcriptSegments,
293
297
  cleanup: cleanupState
294
298
  ? {
@@ -29,9 +29,11 @@ import { and, eq } from "drizzle-orm";
29
29
 
30
30
  import { getDb, schema } from "../../server/db/index.js";
31
31
  import { queueBuilderMediaCompression } from "../../server/lib/builder-media-compression.js";
32
+ import { deleteRecordingMediaObjects } from "../../server/lib/recording-media-cleanup.js";
32
33
  import { ownerEmailMatches } from "../../server/lib/recordings.js";
33
34
  import {
34
35
  makeSeekable,
36
+ normalizeTimelineToMp4,
35
37
  type VideoFormat,
36
38
  } from "../../server/lib/video-remux.js";
37
39
  import { isLoomRecordingSource } from "../../shared/loom.js";
@@ -46,6 +48,7 @@ export type EnsureSeekableStatus =
46
48
  | "skipped-local-media"
47
49
  | "skipped-too-large"
48
50
  | "skipped-fetch-failed"
51
+ | "skipped-normalize-failed"
49
52
  | "skipped-upload-failed"
50
53
  | "not-found";
51
54
 
@@ -137,8 +140,14 @@ export async function ensureRecordingSeekable(params: {
137
140
  recordingId: string;
138
141
  ownerEmail: string;
139
142
  force?: boolean;
143
+ normalizeTimeline?: boolean;
140
144
  }): Promise<EnsureSeekableResult> {
141
- const { recordingId, ownerEmail, force = false } = params;
145
+ const {
146
+ recordingId,
147
+ ownerEmail,
148
+ force = false,
149
+ normalizeTimeline = false,
150
+ } = params;
142
151
  const db = getDb();
143
152
 
144
153
  const [rec] = await db
@@ -181,7 +190,11 @@ export async function ensureRecordingSeekable(params: {
181
190
  };
182
191
  }
183
192
 
184
- if (!force && (await isAlreadyMarked(recordingId, rec.videoUrl))) {
193
+ if (
194
+ !normalizeTimeline &&
195
+ !force &&
196
+ (await isAlreadyMarked(recordingId, rec.videoUrl))
197
+ ) {
185
198
  return {
186
199
  recordingId,
187
200
  status: "already-optimized",
@@ -196,12 +209,27 @@ export async function ensureRecordingSeekable(params: {
196
209
  }
197
210
 
198
211
  const videoFormat: VideoFormat = rec.videoFormat === "mp4" ? "mp4" : "webm";
199
- const seekable = await makeSeekable({
200
- mediaBytes: fetched.bytes,
201
- videoFormat,
202
- });
212
+ const seekable = normalizeTimeline
213
+ ? await normalizeTimelineToMp4({
214
+ mediaBytes: fetched.bytes,
215
+ videoFormat,
216
+ })
217
+ : await makeSeekable({
218
+ mediaBytes: fetched.bytes,
219
+ videoFormat,
220
+ });
203
221
 
204
222
  if (!seekable.changed) {
223
+ if (normalizeTimeline) {
224
+ return {
225
+ recordingId,
226
+ status: "skipped-normalize-failed",
227
+ changed: false,
228
+ videoUrl: rec.videoUrl,
229
+ detail:
230
+ "Timeline normalization could not produce a verified MP4; the original recording was left unchanged.",
231
+ };
232
+ }
205
233
  // Already seekable (or unimprovable) — remember so we don't refetch it.
206
234
  await markRecordingSeekable(recordingId, rec.videoUrl);
207
235
  return {
@@ -212,14 +240,23 @@ export async function ensureRecordingSeekable(params: {
212
240
  };
213
241
  }
214
242
 
215
- const mimeType = videoFormat === "mp4" ? "video/mp4" : "video/webm";
243
+ const outputFormat: VideoFormat = normalizeTimeline ? "mp4" : videoFormat;
244
+ const mimeType = outputFormat === "mp4" ? "video/mp4" : "video/webm";
216
245
  const upload = await uploadFile({
217
246
  data: seekable.bytes,
218
- filename: `${recordingId}.${videoFormat}`,
247
+ filename: normalizeTimeline
248
+ ? `${recordingId}-timeline-normalized-${Date.now()}.mp4`
249
+ : `${recordingId}.${outputFormat}`,
219
250
  mimeType,
220
251
  ownerEmail,
221
252
  stableUrl: true,
222
253
  recordAsset: false,
254
+ }).catch((err) => {
255
+ console.warn("[ensure-seekable-video] repaired media upload failed", {
256
+ recordingId,
257
+ error: err instanceof Error ? err.message : String(err),
258
+ });
259
+ return null;
223
260
  });
224
261
 
225
262
  if (!upload?.url) {
@@ -232,10 +269,11 @@ export async function ensureRecordingSeekable(params: {
232
269
  };
233
270
  }
234
271
 
235
- await db
272
+ const updated = await db
236
273
  .update(schema.recordings)
237
274
  .set({
238
275
  videoUrl: upload.url,
276
+ videoFormat: outputFormat,
239
277
  videoSizeBytes: seekable.bytes.byteLength,
240
278
  updatedAt: new Date().toISOString(),
241
279
  })
@@ -243,8 +281,32 @@ export async function ensureRecordingSeekable(params: {
243
281
  and(
244
282
  eq(schema.recordings.id, recordingId),
245
283
  ownerEmailMatches(schema.recordings.ownerEmail, ownerEmail),
284
+ eq(schema.recordings.videoUrl, rec.videoUrl),
246
285
  ),
286
+ )
287
+ .returning({
288
+ id: schema.recordings.id,
289
+ videoUrl: schema.recordings.videoUrl,
290
+ videoFormat: schema.recordings.videoFormat,
291
+ });
292
+
293
+ if (
294
+ updated.length !== 1 ||
295
+ updated[0]?.videoUrl !== upload.url ||
296
+ updated[0]?.videoFormat !== outputFormat
297
+ ) {
298
+ await deleteRecordingMediaObjects(
299
+ { id: recordingId, videoUrl: upload.url },
300
+ { protectedUrls: [rec.videoUrl] },
247
301
  );
302
+ return {
303
+ recordingId,
304
+ status: "skipped-upload-failed",
305
+ changed: false,
306
+ videoUrl: rec.videoUrl,
307
+ detail: "Recording changed while repaired media was uploading.",
308
+ };
309
+ }
248
310
 
249
311
  await markRecordingSeekable(recordingId, upload.url);
250
312
  await writeAppState("refresh-signal", { ts: Date.now() });
@@ -257,6 +319,7 @@ export async function ensureRecordingSeekable(params: {
257
319
  providerId: upload.provider,
258
320
  assetDbId: upload.id,
259
321
  sourceSizeBytes: seekable.bytes.byteLength,
322
+ locallyTranscoded: normalizeTimeline,
260
323
  }).catch((err) => {
261
324
  console.warn("[ensure-seekable-video] media compression queue failed", {
262
325
  recordingId,
@@ -9,6 +9,7 @@ import {
9
9
  inArray,
10
10
  isNull,
11
11
  isNotNull,
12
+ not,
12
13
  notInArray,
13
14
  sql,
14
15
  } from "drizzle-orm";
@@ -27,10 +28,10 @@ function escapeLike(s: string): string {
27
28
 
28
29
  export default defineAction({
29
30
  description:
30
- "List recordings visible to the current user. Supports filtering by view (library/space/archive/trash/all), folder, space, tag, free-text, and sort.",
31
+ "List recordings visible to the current user. Supports filtering by view (library/shared/space/archive/trash/all), folder, space, tag, free-text, and sort. The shared view returns accessible recordings owned by someone else.",
31
32
  schema: z.object({
32
33
  view: z
33
- .enum(["library", "space", "archive", "trash", "all"])
34
+ .enum(["library", "shared", "space", "archive", "trash", "all"])
34
35
  .default("library")
35
36
  .describe("Which list to show"),
36
37
  folderId: z
@@ -90,8 +91,23 @@ export default defineAction({
90
91
  if (orgId) {
91
92
  whereClauses.push(eq(schema.recordings.organizationId, orgId));
92
93
  }
94
+ }
95
+
96
+ // Shared = recordings admitted by the normal sharing access filter but
97
+ // owned by someone else. This includes direct user/org grants and org-wide
98
+ // visibility, while public-only links remain excluded by accessFilter.
99
+ if (args.view === "shared") {
100
+ const email = getRequestUserEmail();
101
+ whereClauses.push(
102
+ email
103
+ ? not(ownerEmailMatches(schema.recordings.ownerEmail, email))
104
+ : sql`1 = 0`,
105
+ );
106
+ }
107
+
108
+ if (args.view === "library" || args.view === "shared") {
93
109
  // Meeting recordings are transcript-only (no playable media) and live on
94
- // the /meetings surface, so keep them out of the Library list. The link
110
+ // the /meetings surface, so keep them out of clip library views. The link
95
111
  // is meetings.recordingId (no meetingId column on recordings), so exclude
96
112
  // any recording referenced by a meeting. The subquery filters out NULLs
97
113
  // so NOT IN doesn't collapse to an empty result under SQL NULL semantics.
@@ -7,6 +7,7 @@
7
7
  *
8
8
  * Usage:
9
9
  * pnpm action navigate --view=library
10
+ * pnpm action navigate --view=shared
10
11
  * pnpm action navigate --view=recording --recordingId=<id>
11
12
  * pnpm action navigate --view=meeting --meetingId=<id>
12
13
  * pnpm action navigate --view=dictate
@@ -20,6 +21,7 @@ import { z } from "zod";
20
21
 
21
22
  const Views = [
22
23
  "library",
24
+ "shared",
23
25
  "spaces",
24
26
  "space",
25
27
  "archive",
@@ -16,6 +16,7 @@
16
16
  * pnpm action reprocess-recording --ids='["id1","id2"]'
17
17
  * pnpm action reprocess-recording --all --limit=20
18
18
  * pnpm action reprocess-recording --id=<recordingId> --force
19
+ * pnpm action reprocess-recording --id=<recordingId> --normalizeTimeline
19
20
  */
20
21
 
21
22
  import { defineAction } from "@agent-native/core";
@@ -34,6 +35,11 @@ import {
34
35
 
35
36
  const MAX_TARGETS_PER_CALL = 100;
36
37
  const DEFAULT_ALL_LIMIT = 20;
38
+ const cliBoolean = z.preprocess((value) => {
39
+ if (value === "true" || value === "1") return true;
40
+ if (value === "false" || value === "0") return false;
41
+ return value;
42
+ }, z.boolean());
37
43
 
38
44
  function parseIds(value: unknown): string[] {
39
45
  if (Array.isArray(value)) {
@@ -58,7 +64,7 @@ function parseIds(value: unknown): string[] {
58
64
 
59
65
  export default defineAction({
60
66
  description:
61
- "Repair slow-loading or buffering recordings by rewriting their stored video to be start-playable and seekable (MP4 faststart / WebM Cues remux) and re-uploading it. Use for clips that take a long time to load or re-buffer when scrubbing. Pass `id` for one clip, `ids` for several, or `all: true` to sweep the caller's ready clips (bounded by `limit`). Already-seekable clips are skipped unless `force` is true.",
67
+ "Repair playback of existing recordings and re-upload the fixed media without replacing the original unless the repair succeeds. By default this makes MP4/WebM start-playable and seekable. Set `normalizeTimeline: true` when a clip freezes or stops visually despite a longer duration because its video timestamps have large gaps; this transcodes to constant-frame-rate faststart MP4, preserves audio, and holds the last captured frame through missing-video gaps. Pass `id` for one clip, `ids` for several, or `all: true` for a bounded owner-scoped sweep. Already-seekable clips are skipped unless `force` is true; timeline normalization always runs when explicitly requested.",
62
68
  schema: z.object({
63
69
  id: z.string().optional().describe("A single recording id to repair."),
64
70
  ids: z
@@ -67,8 +73,7 @@ export default defineAction({
67
73
  .describe(
68
74
  "Multiple recording ids (array, or JSON/comma string for CLI).",
69
75
  ),
70
- all: z.coerce
71
- .boolean()
76
+ all: cliBoolean
72
77
  .optional()
73
78
  .describe(
74
79
  "Repair the caller's own ready clips, most recent first, up to `limit`.",
@@ -82,10 +87,14 @@ export default defineAction({
82
87
  .describe(
83
88
  `Max clips to process when using \`all\` (default ${DEFAULT_ALL_LIMIT}).`,
84
89
  ),
85
- force: z.coerce
86
- .boolean()
90
+ force: cliBoolean
87
91
  .optional()
88
92
  .describe("Re-run even on clips already marked seekable."),
93
+ normalizeTimeline: cliBoolean
94
+ .optional()
95
+ .describe(
96
+ "Transcode sparse/discontinuous video timestamps to constant-frame-rate faststart MP4 while preserving audio. Use when playback freezes or appears to stop before the declared duration.",
97
+ ),
89
98
  }),
90
99
  run: async (args) => {
91
100
  const db = getDb();
@@ -132,7 +141,12 @@ export default defineAction({
132
141
  for (const recordingId of targetIds) {
133
142
  try {
134
143
  results.push(
135
- await ensureRecordingSeekable({ recordingId, ownerEmail, force }),
144
+ await ensureRecordingSeekable({
145
+ recordingId,
146
+ ownerEmail,
147
+ force,
148
+ normalizeTimeline: args.normalizeTimeline === true,
149
+ }),
136
150
  );
137
151
  } catch (err) {
138
152
  console.warn("[reprocess-recording] failed for", recordingId, err);
@@ -51,6 +51,7 @@ import { and, eq } from "drizzle-orm";
51
51
  import { z } from "zod";
52
52
 
53
53
  import { getDb, schema } from "../server/db/index.js";
54
+ import { dispatchPostFinalizeJob } from "../server/lib/post-finalize-dispatch.js";
54
55
  import {
55
56
  getCurrentOwnerEmail,
56
57
  ownerEmailMatches,
@@ -195,20 +196,9 @@ export function recordingMediaFetchTimeoutMs(
195
196
 
196
197
  // Bounded automatic retry for transient failures (ffmpeg timeout, transient
197
198
  // provider network/5xx errors) — NOT for permanent failures like "no audio
198
- // track" or a missing/rejected API key. Mirrors the fire-and-forget
199
- // background pattern already used for post-finalize transcription and
200
- // seekable remux in finalize-recording.ts, just with a delay before the
201
- // retry instead of running immediately.
202
- //
203
- // Serverless caveat: Clips deploys to Netlify Functions (NITRO_PRESET=netlify),
204
- // where a `setTimeout` scheduled after the handler returns can be frozen along
205
- // with the rest of the sandbox before it fires. This best-effort retry still
206
- // helps on any host that keeps the process warm (local/self-hosted, or a
207
- // Lambda instance reused for a later request), and it is never worse than
208
- // today's behavior — a clip that doesn't get an automatic retry just settles
209
- // into "failed", exactly as it does now, and stays retryable via
210
- // `request-transcript` (UI retry button or agent). Keeping the backoff short
211
- // maximizes the chance it fires before the sandbox freezes.
199
+ // track" or a missing/rejected API key. Each retry is self-dispatched into a
200
+ // fresh request so serverless runtimes cannot freeze a timer left behind by
201
+ // the completed transcription request.
212
202
  const MAX_AUTO_TRANSCRIPT_RETRIES = 2;
213
203
  const AUTO_TRANSCRIPT_RETRY_BACKOFF_MS = [5_000, 20_000];
214
204
 
@@ -237,9 +227,7 @@ function isTransientTranscriptionError(err: unknown): boolean {
237
227
 
238
228
  /**
239
229
  * Schedule a bounded, backed-off automatic retry of `request-transcript` for
240
- * a transient failure. Fire-and-forget in the Nitro process — same mechanism
241
- * `finalize-recording.ts` uses to kick off transcription/remux passes in the
242
- * background, just delayed instead of immediate.
230
+ * a transient failure in a fresh server request.
243
231
  *
244
232
  * `nextRetryCount` must already be persisted to `recording_transcripts` by the
245
233
  * caller BEFORE this is invoked (not inside the timer) so the retry budget
@@ -262,20 +250,17 @@ function scheduleAutoTranscriptRetry({
262
250
  AUTO_TRANSCRIPT_RETRY_BACKOFF_MS[
263
251
  AUTO_TRANSCRIPT_RETRY_BACKOFF_MS.length - 1
264
252
  ];
265
- setTimeout(() => {
266
- void Promise.resolve(
267
- requestTranscriptAction.run({
268
- recordingId,
269
- force: true,
270
- retryAttempt: nextRetryCount,
271
- }),
272
- ).catch((err: unknown) => {
273
- console.warn(
274
- `[clips] auto-retry transcription failed for ${recordingId} (attempt ${nextRetryCount}):`,
275
- (err as Error)?.message ?? String(err),
276
- );
277
- });
278
- }, backoffMs);
253
+ void dispatchPostFinalizeJob({
254
+ recordingId,
255
+ kind: "transcript",
256
+ delayMs: backoffMs,
257
+ retryAttempt: nextRetryCount,
258
+ }).catch((err: unknown) => {
259
+ console.warn(
260
+ `[clips] auto-retry transcription dispatch failed for ${recordingId} (attempt ${nextRetryCount}):`,
261
+ (err as Error)?.message ?? String(err),
262
+ );
263
+ });
279
264
  }
280
265
 
281
266
  function queueBrainExport(recordingId: string): void {
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Reads `navigation` application state and fetches the relevant context
5
5
  * (recording + transcript + comments if viewing a recording, folder contents
6
- * if on library, space list if on spaces, etc.). Returns a single JSON
6
+ * if on library/shared-with-me, space list if on spaces, etc.). Returns a single JSON
7
7
  * snapshot the agent can reason over.
8
8
  *
9
9
  * Usage:
@@ -17,7 +17,18 @@ import {
17
17
  } from "@agent-native/core/application-state";
18
18
  import { getRequestUserEmail } from "@agent-native/core/server/request-context";
19
19
  import { accessFilter, resolveAccess } from "@agent-native/core/sharing";
20
- import { and, asc, desc, eq, gte, isNotNull, isNull, lte } from "drizzle-orm";
20
+ import {
21
+ and,
22
+ asc,
23
+ desc,
24
+ eq,
25
+ gte,
26
+ isNotNull,
27
+ isNull,
28
+ lte,
29
+ not,
30
+ notInArray,
31
+ } from "drizzle-orm";
21
32
  import { z } from "zod";
22
33
 
23
34
  import { getDb, schema } from "../server/db/index.js";
@@ -158,13 +169,40 @@ async function fetchBugReportSummary(recordingId: string) {
158
169
  };
159
170
  }
160
171
 
161
- async function fetchLibrary(folderId?: string) {
172
+ async function fetchLibrary({
173
+ folderId,
174
+ shared = false,
175
+ organizationId,
176
+ }: {
177
+ folderId?: string;
178
+ shared?: boolean;
179
+ organizationId?: string | null;
180
+ }) {
162
181
  const db = getDb();
182
+ const ownerEmail = getRequestUserEmail();
183
+ if (!ownerEmail) return [];
163
184
  const conditions = [
164
185
  accessFilter(schema.recordings, schema.recordingShares),
165
186
  isNull(schema.recordings.archivedAt),
166
187
  isNull(schema.recordings.trashedAt),
167
188
  ];
189
+ if (shared) {
190
+ conditions.push(
191
+ not(ownerEmailMatches(schema.recordings.ownerEmail, ownerEmail)),
192
+ );
193
+ } else {
194
+ conditions.push(
195
+ ownerEmailMatches(schema.recordings.ownerEmail, ownerEmail),
196
+ );
197
+ if (organizationId) {
198
+ conditions.push(eq(schema.recordings.organizationId, organizationId));
199
+ }
200
+ }
201
+ const meetingRecordingIds = db
202
+ .select({ id: schema.meetings.recordingId })
203
+ .from(schema.meetings)
204
+ .where(isNotNull(schema.meetings.recordingId));
205
+ conditions.push(notInArray(schema.recordings.id, meetingRecordingIds));
168
206
  if (folderId) {
169
207
  conditions.push(eq(schema.recordings.folderId, folderId));
170
208
  }
@@ -451,7 +489,7 @@ async function fetchShare(shareId: string) {
451
489
 
452
490
  export default defineAction({
453
491
  description:
454
- "See what the user is currently looking at on screen. Returns the current navigation state plus relevant context (recording + transcript + comments on a recording page, folder contents on library, space list on spaces, etc.). Prefer reading the auto-included <current-screen> block — call this only when you need a refreshed snapshot.",
492
+ "See what the user is currently looking at on screen. Returns the current navigation state plus relevant context (recording + transcript + comments on a recording page, visible clips on library/shared-with-me, space list on spaces, etc.). Prefer reading the auto-included <current-screen> block — call this only when you need a refreshed snapshot.",
455
493
  schema: z.object({}),
456
494
  http: false,
457
495
  run: async () => {
@@ -531,7 +569,10 @@ export default defineAction({
531
569
  }
532
570
  case "library": {
533
571
  const [recordings, folders] = await Promise.all([
534
- fetchLibrary(nav.folderId),
572
+ fetchLibrary({
573
+ folderId: nav.folderId,
574
+ organizationId,
575
+ }),
535
576
  fetchFoldersForSpace(null),
536
577
  ]);
537
578
  screen.library = {
@@ -543,6 +584,17 @@ export default defineAction({
543
584
  };
544
585
  break;
545
586
  }
587
+ case "shared": {
588
+ const recordings = await fetchLibrary({
589
+ shared: true,
590
+ organizationId,
591
+ });
592
+ screen.shared = {
593
+ count: recordings.length,
594
+ recordings,
595
+ };
596
+ break;
597
+ }
546
598
  case "spaces": {
547
599
  screen.spaces = await fetchSpaces(organizationId);
548
600
  break;