@agent-native/core 0.90.2 → 0.90.4

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 (530) hide show
  1. package/bin/agent-native.js +25 -3
  2. package/corpus/README.md +2 -2
  3. package/corpus/core/CHANGELOG.md +21 -0
  4. package/corpus/core/bin/agent-native.js +25 -3
  5. package/corpus/core/docs/content/agent-native-toolkit.mdx +87 -80
  6. package/corpus/core/docs/content/locales/ar-SA/agent-native-toolkit.mdx +89 -80
  7. package/corpus/core/docs/content/locales/de-DE/agent-native-toolkit.mdx +89 -80
  8. package/corpus/core/docs/content/locales/es-ES/agent-native-toolkit.mdx +89 -80
  9. package/corpus/core/docs/content/locales/fr-FR/agent-native-toolkit.mdx +89 -80
  10. package/corpus/core/docs/content/locales/hi-IN/agent-native-toolkit.mdx +89 -80
  11. package/corpus/core/docs/content/locales/ja-JP/agent-native-toolkit.mdx +89 -80
  12. package/corpus/core/docs/content/locales/ko-KR/agent-native-toolkit.mdx +89 -80
  13. package/corpus/core/docs/content/locales/pt-BR/agent-native-toolkit.mdx +89 -80
  14. package/corpus/core/docs/content/locales/zh-CN/agent-native-toolkit.mdx +89 -80
  15. package/corpus/core/docs/content/locales/zh-TW/agent-native-toolkit.mdx +89 -80
  16. package/corpus/core/docs/content/toolkit-agent-ux.mdx +43 -0
  17. package/corpus/core/docs/content/toolkit-app-adapters.mdx +9 -0
  18. package/corpus/core/docs/content/toolkit-collaboration-ui.mdx +12 -0
  19. package/corpus/core/docs/content/toolkit-collaboration.mdx +74 -0
  20. package/corpus/core/docs/content/toolkit-command-navigation.mdx +106 -0
  21. package/corpus/core/docs/content/toolkit-comments-review.mdx +98 -0
  22. package/corpus/core/docs/content/toolkit-history.mdx +95 -0
  23. package/corpus/core/docs/content/toolkit-observability.mdx +41 -0
  24. package/corpus/core/docs/content/toolkit-org-team.mdx +80 -0
  25. package/corpus/core/docs/content/toolkit-resources.mdx +57 -0
  26. package/corpus/core/docs/content/toolkit-settings.mdx +65 -0
  27. package/corpus/core/docs/content/toolkit-setup-connections.mdx +109 -0
  28. package/corpus/core/docs/content/toolkit-sharing-ui.mdx +18 -6
  29. package/corpus/core/docs/content/toolkit-sharing.mdx +81 -0
  30. package/corpus/core/docs/content/toolkit-shell-hooks.mdx +9 -0
  31. package/corpus/core/docs/content/toolkit-ui.mdx +9 -0
  32. package/corpus/core/package.json +35 -1
  33. package/corpus/core/src/agent/engine/ai-sdk-engine.ts +19 -1
  34. package/corpus/core/src/agent/engine/anthropic-engine.ts +25 -1
  35. package/corpus/core/src/agent/engine/index.ts +1 -0
  36. package/corpus/core/src/agent/engine/registry.ts +86 -18
  37. package/corpus/core/src/agent/production-agent.ts +37 -6
  38. package/corpus/core/src/cli/create.ts +35 -0
  39. package/corpus/core/src/cli/design-connect.ts +248 -0
  40. package/corpus/core/src/cli/index.ts +84 -7
  41. package/corpus/core/src/cli/workspacify.ts +34 -0
  42. package/corpus/core/src/client/command-navigation/index.ts +15 -0
  43. package/corpus/core/src/client/comments-review/index.ts +1 -0
  44. package/corpus/core/src/client/history/VersionHistoryPanel.tsx +175 -0
  45. package/corpus/core/src/client/history/index.ts +21 -0
  46. package/corpus/core/src/client/history/use-history.ts +114 -0
  47. package/corpus/core/src/client/index.ts +84 -9
  48. package/corpus/core/src/client/org/OrgSwitcher.tsx +6 -6
  49. package/corpus/core/src/client/org/RequireActiveOrg.tsx +2 -2
  50. package/corpus/core/src/client/org/TeamPage.tsx +3 -3
  51. package/corpus/core/src/client/org/hooks.ts +32 -0
  52. package/corpus/core/src/client/org/index.ts +30 -1
  53. package/corpus/core/src/client/org-team/index.ts +1 -0
  54. package/corpus/core/src/client/review/ReviewStatusBadge.tsx +39 -0
  55. package/corpus/core/src/client/review/ReviewThreadPanel.tsx +278 -0
  56. package/corpus/core/src/client/review/index.ts +30 -0
  57. package/corpus/core/src/client/review/use-review.ts +152 -0
  58. package/corpus/core/src/client/settings/index.ts +11 -1
  59. package/corpus/core/src/client/setup-connections/BuilderConnectCard.tsx +94 -0
  60. package/corpus/core/src/client/setup-connections/ProviderReadinessBadge.tsx +73 -0
  61. package/corpus/core/src/client/setup-connections/SetupConnectionsPage.tsx +94 -0
  62. package/corpus/core/src/client/setup-connections/index.ts +46 -0
  63. package/corpus/core/src/client/sharing/ShareButton.tsx +20 -14
  64. package/corpus/core/src/client/sharing/ShareDialog.tsx +3 -3
  65. package/corpus/core/src/command-navigation/actions.ts +100 -0
  66. package/corpus/core/src/command-navigation/index.ts +12 -0
  67. package/corpus/core/src/comments-review/index.ts +1 -0
  68. package/corpus/core/src/file-upload/builder.ts +24 -3
  69. package/corpus/core/src/file-upload/types.ts +3 -1
  70. package/corpus/core/src/history/actions/create-resource-version.ts +92 -0
  71. package/corpus/core/src/history/actions/get-resource-version.ts +60 -0
  72. package/corpus/core/src/history/actions/list-resource-history.ts +53 -0
  73. package/corpus/core/src/history/actions/list-resource-versions.ts +43 -0
  74. package/corpus/core/src/history/actions/restore-resource-version.ts +96 -0
  75. package/corpus/core/src/history/index.ts +26 -0
  76. package/corpus/core/src/history/registry.ts +111 -0
  77. package/corpus/core/src/history/store.ts +379 -0
  78. package/corpus/core/src/history/types.ts +69 -0
  79. package/corpus/core/src/index.ts +10 -0
  80. package/corpus/core/src/navigation/index.ts +170 -0
  81. package/corpus/core/src/org/index.ts +8 -0
  82. package/corpus/core/src/org/permissions.ts +30 -0
  83. package/corpus/core/src/org-team/index.ts +1 -0
  84. package/corpus/core/src/private-blob/registry.ts +1 -0
  85. package/corpus/core/src/review/actions/consume-review-feedback.ts +48 -0
  86. package/corpus/core/src/review/actions/create-review-comment.ts +107 -0
  87. package/corpus/core/src/review/actions/delete-review-comment.ts +67 -0
  88. package/corpus/core/src/review/actions/get-review-feedback.ts +54 -0
  89. package/corpus/core/src/review/actions/list-review-comments.ts +53 -0
  90. package/corpus/core/src/review/actions/reply-review-comment.ts +107 -0
  91. package/corpus/core/src/review/actions/resolve-review-thread.ts +67 -0
  92. package/corpus/core/src/review/actions/set-review-status.ts +58 -0
  93. package/corpus/core/src/review/index.ts +31 -0
  94. package/corpus/core/src/review/mentions.ts +44 -0
  95. package/corpus/core/src/review/registry.ts +111 -0
  96. package/corpus/core/src/review/store.ts +690 -0
  97. package/corpus/core/src/review/types.ts +97 -0
  98. package/corpus/core/src/server/action-discovery.ts +54 -0
  99. package/corpus/core/src/server/agent-chat-plugin.ts +6 -0
  100. package/corpus/core/src/server/agent-engine-api-key-route.ts +5 -0
  101. package/corpus/core/src/server/credential-provider.ts +118 -0
  102. package/corpus/core/src/setup-connections/index.ts +89 -0
  103. package/corpus/core/src/setup-connections/onboarding.ts +47 -0
  104. package/corpus/core/src/transcription/builder-transcription.ts +9 -2
  105. package/corpus/core/src/vite/action-types-plugin.ts +52 -0
  106. package/corpus/templates/analytics/app/components/layout/Layout.tsx +2 -1
  107. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +2 -2
  108. package/corpus/templates/analytics/app/global.css +22 -10
  109. package/corpus/templates/analytics/app/i18n/zh-TW.ts +6 -1
  110. package/corpus/templates/analytics/app/i18n-data.ts +81 -13
  111. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +2 -2
  112. package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +2 -2
  113. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +528 -108
  114. package/corpus/templates/analytics/app/pages/sessions/SessionDevToolsPanel.tsx +466 -183
  115. package/corpus/templates/analytics/changelog/2026-07-07-session-replays-load-sooner-show-clearer-activity-timelines-.md +6 -0
  116. package/corpus/templates/assets/actions/_preset-skeleton-validation.ts +11 -11
  117. package/corpus/templates/assets/actions/generate-image.ts +64 -28
  118. package/corpus/templates/assets/app/components/generation/GenerationResults.tsx +1 -1
  119. package/corpus/templates/assets/app/routes/brand-kits.$id_.presets.$presetId.tsx +91 -74
  120. package/corpus/templates/assets/server/lib/generation.ts +29 -4
  121. package/corpus/templates/assets/server/lib/image-processing.ts +131 -0
  122. package/corpus/templates/brain/app/routes/settings.tsx +2 -2
  123. package/corpus/templates/calendar/.agents/skills/event-management/SKILL.md +24 -2
  124. package/corpus/templates/calendar/AGENTS.md +3 -0
  125. package/corpus/templates/calendar/actions/create-event.ts +8 -34
  126. package/corpus/templates/calendar/actions/event-action-helpers.ts +52 -0
  127. package/corpus/templates/calendar/actions/manage-event-draft.ts +7 -34
  128. package/corpus/templates/calendar/actions/update-event.ts +10 -23
  129. package/corpus/templates/calendar/app/components/calendar/AttendeeAutocomplete.tsx +79 -6
  130. package/corpus/templates/calendar/app/components/calendar/CreateEventDialog.tsx +23 -0
  131. package/corpus/templates/calendar/app/components/calendar/EventAttendeesSection.tsx +59 -2
  132. package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +40 -1
  133. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +154 -41
  134. package/corpus/templates/calendar/app/hooks/use-events.ts +6 -0
  135. package/corpus/templates/calendar/app/hooks/use-people.ts +55 -0
  136. package/corpus/templates/calendar/app/i18n/zh-TW.ts +4 -0
  137. package/corpus/templates/calendar/app/i18n-data.ts +40 -0
  138. package/corpus/templates/calendar/changelog/2026-07-07-guest-suggestions-now-find-coworkers-from-your-google-worksp.md +6 -0
  139. package/corpus/templates/calendar/changelog/2026-07-07-you-can-mark-event-guests-as-optional-while-inviting-them-or.md +6 -0
  140. package/corpus/templates/calendar/changelog/2026-07-07-zoom-stays-selected-after-connecting-it-from-a-draft-event.md +6 -0
  141. package/corpus/templates/calendar/server/handlers/events.ts +1 -0
  142. package/corpus/templates/calendar/server/lib/google-calendar.ts +4 -0
  143. package/corpus/templates/calendar/server/plugins/agent-chat.ts +1 -1
  144. package/corpus/templates/calendar/shared/api.ts +2 -0
  145. package/corpus/templates/clips/.agents/skills/ai-video-tools/SKILL.md +29 -3
  146. package/corpus/templates/clips/actions/create-recording.ts +5 -1
  147. package/corpus/templates/clips/actions/finalize-recording.ts +140 -1
  148. package/corpus/templates/clips/actions/generate-workflow.ts +19 -8
  149. package/corpus/templates/clips/actions/get-clips-ai-prefs.ts +36 -0
  150. package/corpus/templates/clips/actions/import-loom-recording.ts +1 -0
  151. package/corpus/templates/clips/actions/lib/clips-ai-prefs.ts +28 -0
  152. package/corpus/templates/clips/actions/lib/ensure-seekable-video.ts +1 -0
  153. package/corpus/templates/clips/actions/regenerate-chapters.ts +21 -7
  154. package/corpus/templates/clips/actions/regenerate-summary.ts +26 -8
  155. package/corpus/templates/clips/actions/regenerate-title.ts +44 -7
  156. package/corpus/templates/clips/actions/request-transcript.ts +31 -0
  157. package/corpus/templates/clips/actions/set-thumbnail.ts +2 -0
  158. package/corpus/templates/clips/actions/update-clips-ai-prefs.ts +50 -0
  159. package/corpus/templates/clips/app/components/library/organization-switcher.tsx +2 -2
  160. package/corpus/templates/clips/app/components/meetings/meeting-card.tsx +7 -2
  161. package/corpus/templates/clips/app/components/player/scrubber-position.ts +9 -0
  162. package/corpus/templates/clips/app/components/player/scrubber.tsx +5 -2
  163. package/corpus/templates/clips/app/components/player/share-dialog.tsx +69 -41
  164. package/corpus/templates/clips/app/components/player/video-player.tsx +38 -1
  165. package/corpus/templates/clips/app/components/sharing/share-ui.tsx +3 -3
  166. package/corpus/templates/clips/app/components/sharing/slack-share-hint.tsx +9 -19
  167. package/corpus/templates/clips/app/hooks/use-auto-title.ts +25 -10
  168. package/corpus/templates/clips/app/i18n/ar-SA.ts +28 -6
  169. package/corpus/templates/clips/app/i18n/de-DE.ts +28 -6
  170. package/corpus/templates/clips/app/i18n/en-US.ts +29 -6
  171. package/corpus/templates/clips/app/i18n/es-ES.ts +29 -6
  172. package/corpus/templates/clips/app/i18n/fr-FR.ts +30 -6
  173. package/corpus/templates/clips/app/i18n/hi-IN.ts +26 -6
  174. package/corpus/templates/clips/app/i18n/ja-JP.ts +27 -6
  175. package/corpus/templates/clips/app/i18n/ko-KR.ts +28 -6
  176. package/corpus/templates/clips/app/i18n/pt-BR.ts +28 -6
  177. package/corpus/templates/clips/app/i18n/zh-CN.ts +26 -6
  178. package/corpus/templates/clips/app/i18n/zh-TW.ts +25 -6
  179. package/corpus/templates/clips/app/routes/_app.meetings._index.tsx +73 -0
  180. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +1 -0
  181. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +79 -5
  182. package/corpus/templates/clips/app/routes/record.tsx +21 -12
  183. package/corpus/templates/clips/changelog/2026-07-02-recordings-now-wait-for-storage-media-to-serve-before-finishing.md +6 -0
  184. package/corpus/templates/clips/changelog/2026-07-07-a-pending-app-update-no-longer-blocks-screen-recording-updat.md +6 -0
  185. package/corpus/templates/clips/changelog/2026-07-07-ai-tools-can-include-the-full-video-not-just-the-transcript-.md +6 -0
  186. package/corpus/templates/clips/changelog/2026-07-07-chrome-extension-recordings-keep-audio-after-refreshing-tab.md +6 -0
  187. package/corpus/templates/clips/changelog/2026-07-07-clip-playback-progress-now-starts-and-finishes-at-the-right-times.md +6 -0
  188. package/corpus/templates/clips/changelog/2026-07-07-clips-desktop-now-surfaces-meetings-and-dictate-directly-in-.md +6 -0
  189. package/corpus/templates/clips/changelog/2026-07-07-meeting-notes-now-explain-exactly-how-to-start-granola-style.md +6 -0
  190. package/corpus/templates/clips/changelog/2026-07-07-meeting-start-alerts-now-include-separate-start-notes-and-jo.md +6 -0
  191. package/corpus/templates/clips/changelog/2026-07-07-recordings-start-more-predictably-and-newly-saved-clips-refr.md +6 -0
  192. package/corpus/templates/clips/changelog/2026-07-07-sharing-public-clips-now-stays-focused-on-the-normal-link-wi.md +6 -0
  193. package/corpus/templates/clips/chrome-extension/public/manifest.json +1 -1
  194. package/corpus/templates/clips/chrome-extension/src/background.ts +18 -0
  195. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +23 -8
  196. package/corpus/templates/clips/desktop/src/app.tsx +475 -108
  197. package/corpus/templates/clips/desktop/src/hooks/useMediaDevices.ts +19 -7
  198. package/corpus/templates/clips/desktop/src/lib/permissions.ts +2 -0
  199. package/corpus/templates/clips/desktop/src/lib/recorder.ts +27 -21
  200. package/corpus/templates/clips/desktop/src/lib/updater.ts +25 -2
  201. package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +23 -22
  202. package/corpus/templates/clips/desktop/src/styles.css +167 -2
  203. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +8 -1
  204. package/corpus/templates/clips/desktop/src-tauri/src/notifications.rs +3 -7
  205. package/corpus/templates/clips/desktop/src-tauri/src/tray_meetings.rs +5 -4
  206. package/corpus/templates/clips/server/routes/_agent-native/clips/user-prefs.put.ts +16 -8
  207. package/corpus/templates/clips/server/routes/api/recordings/[recordingId]/thumbnail.post.ts +1 -0
  208. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/abort.post.ts +22 -5
  209. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +8 -0
  210. package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +13 -6
  211. package/corpus/templates/clips/shared/clips-ai-prefs.ts +81 -0
  212. package/corpus/templates/clips/shared/finalize-recovery.ts +12 -0
  213. package/corpus/templates/content/actions/delete-document.ts +337 -52
  214. package/corpus/templates/content/changelog/2026-07-07-permanently-deleting-trashed-databases-now-finishes-reliably.md +6 -0
  215. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +16 -1
  216. package/corpus/templates/design/actions/add-localhost-screens.ts +1 -0
  217. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +345 -11
  218. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +89 -14
  219. package/corpus/templates/design/app/components/design/bridge-security.ts +7 -1
  220. package/corpus/templates/design/app/components/design/multi-screen/types.ts +1 -1
  221. package/corpus/templates/design/app/i18n/zh-TW.ts +3 -0
  222. package/corpus/templates/design/app/i18n-data.ts +41 -0
  223. package/corpus/templates/design/changelog/2026-07-07-local-visual-edit-uses-live-app-iframes-for-click-to-edit-pr.md +6 -0
  224. package/corpus/templates/slides/app/pages/DeckEditor.tsx +2 -2
  225. package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
  226. package/dist/agent/engine/ai-sdk-engine.js +15 -1
  227. package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
  228. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  229. package/dist/agent/engine/anthropic-engine.js +20 -1
  230. package/dist/agent/engine/anthropic-engine.js.map +1 -1
  231. package/dist/agent/engine/index.d.ts +1 -1
  232. package/dist/agent/engine/index.d.ts.map +1 -1
  233. package/dist/agent/engine/index.js +1 -1
  234. package/dist/agent/engine/index.js.map +1 -1
  235. package/dist/agent/engine/registry.d.ts +14 -0
  236. package/dist/agent/engine/registry.d.ts.map +1 -1
  237. package/dist/agent/engine/registry.js +78 -16
  238. package/dist/agent/engine/registry.js.map +1 -1
  239. package/dist/agent/production-agent.d.ts.map +1 -1
  240. package/dist/agent/production-agent.js +27 -7
  241. package/dist/agent/production-agent.js.map +1 -1
  242. package/dist/cli/create.d.ts.map +1 -1
  243. package/dist/cli/create.js +31 -0
  244. package/dist/cli/create.js.map +1 -1
  245. package/dist/cli/design-connect.d.ts.map +1 -1
  246. package/dist/cli/design-connect.js +186 -0
  247. package/dist/cli/design-connect.js.map +1 -1
  248. package/dist/cli/index.js +76 -9
  249. package/dist/cli/index.js.map +1 -1
  250. package/dist/cli/workspacify.d.ts.map +1 -1
  251. package/dist/cli/workspacify.js +30 -0
  252. package/dist/cli/workspacify.js.map +1 -1
  253. package/dist/client/command-navigation/index.d.ts +4 -0
  254. package/dist/client/command-navigation/index.d.ts.map +1 -0
  255. package/dist/client/command-navigation/index.js +4 -0
  256. package/dist/client/command-navigation/index.js.map +1 -0
  257. package/dist/client/comments-review/index.d.ts +2 -0
  258. package/dist/client/comments-review/index.d.ts.map +1 -0
  259. package/dist/client/comments-review/index.js +2 -0
  260. package/dist/client/comments-review/index.js.map +1 -0
  261. package/dist/client/history/VersionHistoryPanel.d.ts +18 -0
  262. package/dist/client/history/VersionHistoryPanel.d.ts.map +1 -0
  263. package/dist/client/history/VersionHistoryPanel.js +31 -0
  264. package/dist/client/history/VersionHistoryPanel.js.map +1 -0
  265. package/dist/client/history/index.d.ts +3 -0
  266. package/dist/client/history/index.d.ts.map +1 -0
  267. package/dist/client/history/index.js +3 -0
  268. package/dist/client/history/index.js.map +1 -0
  269. package/dist/client/history/use-history.d.ts +58 -0
  270. package/dist/client/history/use-history.d.ts.map +1 -0
  271. package/dist/client/history/use-history.js +24 -0
  272. package/dist/client/history/use-history.js.map +1 -0
  273. package/dist/client/index.d.ts +6 -4
  274. package/dist/client/index.d.ts.map +1 -1
  275. package/dist/client/index.js +6 -4
  276. package/dist/client/index.js.map +1 -1
  277. package/dist/client/org/OrgSwitcher.js +5 -5
  278. package/dist/client/org/OrgSwitcher.js.map +1 -1
  279. package/dist/client/org/RequireActiveOrg.js +2 -2
  280. package/dist/client/org/RequireActiveOrg.js.map +1 -1
  281. package/dist/client/org/TeamPage.js +3 -3
  282. package/dist/client/org/TeamPage.js.map +1 -1
  283. package/dist/client/org/hooks.d.ts +12 -1
  284. package/dist/client/org/hooks.d.ts.map +1 -1
  285. package/dist/client/org/hooks.js +15 -0
  286. package/dist/client/org/hooks.js.map +1 -1
  287. package/dist/client/org/index.d.ts +4 -2
  288. package/dist/client/org/index.d.ts.map +1 -1
  289. package/dist/client/org/index.js +3 -1
  290. package/dist/client/org/index.js.map +1 -1
  291. package/dist/client/org-team/index.d.ts +2 -0
  292. package/dist/client/org-team/index.d.ts.map +1 -0
  293. package/dist/client/org-team/index.js +2 -0
  294. package/dist/client/org-team/index.js.map +1 -0
  295. package/dist/client/review/ReviewStatusBadge.d.ts +7 -0
  296. package/dist/client/review/ReviewStatusBadge.d.ts.map +1 -0
  297. package/dist/client/review/ReviewStatusBadge.js +19 -0
  298. package/dist/client/review/ReviewStatusBadge.js.map +1 -0
  299. package/dist/client/review/ReviewThreadPanel.d.ts +20 -0
  300. package/dist/client/review/ReviewThreadPanel.d.ts.map +1 -0
  301. package/dist/client/review/ReviewThreadPanel.js +84 -0
  302. package/dist/client/review/ReviewThreadPanel.js.map +1 -0
  303. package/dist/client/review/index.d.ts +4 -0
  304. package/dist/client/review/index.d.ts.map +1 -0
  305. package/dist/client/review/index.js +4 -0
  306. package/dist/client/review/index.js.map +1 -0
  307. package/dist/client/review/use-review.d.ts +91 -0
  308. package/dist/client/review/use-review.d.ts.map +1 -0
  309. package/dist/client/review/use-review.js +30 -0
  310. package/dist/client/review/use-review.js.map +1 -0
  311. package/dist/client/settings/index.d.ts +1 -1
  312. package/dist/client/settings/index.d.ts.map +1 -1
  313. package/dist/client/settings/index.js +1 -1
  314. package/dist/client/settings/index.js.map +1 -1
  315. package/dist/client/setup-connections/BuilderConnectCard.d.ts +9 -0
  316. package/dist/client/setup-connections/BuilderConnectCard.d.ts.map +1 -0
  317. package/dist/client/setup-connections/BuilderConnectCard.js +25 -0
  318. package/dist/client/setup-connections/BuilderConnectCard.js.map +1 -0
  319. package/dist/client/setup-connections/ProviderReadinessBadge.d.ts +8 -0
  320. package/dist/client/setup-connections/ProviderReadinessBadge.d.ts.map +1 -0
  321. package/dist/client/setup-connections/ProviderReadinessBadge.js +32 -0
  322. package/dist/client/setup-connections/ProviderReadinessBadge.js.map +1 -0
  323. package/dist/client/setup-connections/SetupConnectionsPage.d.ts +17 -0
  324. package/dist/client/setup-connections/SetupConnectionsPage.d.ts.map +1 -0
  325. package/dist/client/setup-connections/SetupConnectionsPage.js +10 -0
  326. package/dist/client/setup-connections/SetupConnectionsPage.js.map +1 -0
  327. package/dist/client/setup-connections/index.d.ts +7 -0
  328. package/dist/client/setup-connections/index.d.ts.map +1 -0
  329. package/dist/client/setup-connections/index.js +7 -0
  330. package/dist/client/setup-connections/index.js.map +1 -0
  331. package/dist/client/sharing/ShareButton.d.ts +4 -4
  332. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  333. package/dist/client/sharing/ShareButton.js +13 -7
  334. package/dist/client/sharing/ShareButton.js.map +1 -1
  335. package/dist/client/sharing/ShareDialog.js +3 -3
  336. package/dist/client/sharing/ShareDialog.js.map +1 -1
  337. package/dist/collab/awareness.d.ts +2 -2
  338. package/dist/collab/awareness.d.ts.map +1 -1
  339. package/dist/collab/routes.d.ts +1 -1
  340. package/dist/collab/struct-routes.d.ts +1 -1
  341. package/dist/command-navigation/actions.d.ts +25 -0
  342. package/dist/command-navigation/actions.d.ts.map +1 -0
  343. package/dist/command-navigation/actions.js +64 -0
  344. package/dist/command-navigation/actions.js.map +1 -0
  345. package/dist/command-navigation/index.d.ts +4 -0
  346. package/dist/command-navigation/index.d.ts.map +1 -0
  347. package/dist/command-navigation/index.js +4 -0
  348. package/dist/command-navigation/index.js.map +1 -0
  349. package/dist/comments-review/index.d.ts +2 -0
  350. package/dist/comments-review/index.d.ts.map +1 -0
  351. package/dist/comments-review/index.js +2 -0
  352. package/dist/comments-review/index.js.map +1 -0
  353. package/dist/file-upload/builder.d.ts.map +1 -1
  354. package/dist/file-upload/builder.js +18 -2
  355. package/dist/file-upload/builder.js.map +1 -1
  356. package/dist/file-upload/types.d.ts +3 -0
  357. package/dist/file-upload/types.d.ts.map +1 -1
  358. package/dist/file-upload/types.js.map +1 -1
  359. package/dist/history/actions/create-resource-version.d.ts +10 -0
  360. package/dist/history/actions/create-resource-version.d.ts.map +1 -0
  361. package/dist/history/actions/create-resource-version.js +68 -0
  362. package/dist/history/actions/create-resource-version.js.map +1 -0
  363. package/dist/history/actions/get-resource-version.d.ts +10 -0
  364. package/dist/history/actions/get-resource-version.d.ts.map +1 -0
  365. package/dist/history/actions/get-resource-version.js +38 -0
  366. package/dist/history/actions/get-resource-version.js.map +1 -0
  367. package/dist/history/actions/list-resource-history.d.ts +10 -0
  368. package/dist/history/actions/list-resource-history.d.ts.map +1 -0
  369. package/dist/history/actions/list-resource-history.js +45 -0
  370. package/dist/history/actions/list-resource-history.js.map +1 -0
  371. package/dist/history/actions/list-resource-versions.d.ts +10 -0
  372. package/dist/history/actions/list-resource-versions.d.ts.map +1 -0
  373. package/dist/history/actions/list-resource-versions.js +35 -0
  374. package/dist/history/actions/list-resource-versions.js.map +1 -0
  375. package/dist/history/actions/restore-resource-version.d.ts +11 -0
  376. package/dist/history/actions/restore-resource-version.d.ts.map +1 -0
  377. package/dist/history/actions/restore-resource-version.js +59 -0
  378. package/dist/history/actions/restore-resource-version.js.map +1 -0
  379. package/dist/history/index.d.ts +4 -0
  380. package/dist/history/index.d.ts.map +1 -0
  381. package/dist/history/index.js +3 -0
  382. package/dist/history/index.js.map +1 -0
  383. package/dist/history/registry.d.ts +10 -0
  384. package/dist/history/registry.d.ts.map +1 -0
  385. package/dist/history/registry.js +63 -0
  386. package/dist/history/registry.js.map +1 -0
  387. package/dist/history/store.d.ts +34 -0
  388. package/dist/history/store.d.ts.map +1 -0
  389. package/dist/history/store.js +290 -0
  390. package/dist/history/store.js.map +1 -0
  391. package/dist/history/types.d.ts +55 -0
  392. package/dist/history/types.d.ts.map +1 -0
  393. package/dist/history/types.js +2 -0
  394. package/dist/history/types.js.map +1 -0
  395. package/dist/index.d.ts +6 -0
  396. package/dist/index.d.ts.map +1 -1
  397. package/dist/index.js +6 -0
  398. package/dist/index.js.map +1 -1
  399. package/dist/navigation/index.d.ts +53 -0
  400. package/dist/navigation/index.d.ts.map +1 -0
  401. package/dist/navigation/index.js +105 -0
  402. package/dist/navigation/index.js.map +1 -0
  403. package/dist/observability/routes.d.ts +3 -3
  404. package/dist/org/index.d.ts +1 -0
  405. package/dist/org/index.d.ts.map +1 -1
  406. package/dist/org/index.js +1 -0
  407. package/dist/org/index.js.map +1 -1
  408. package/dist/org/permissions.d.ts +7 -0
  409. package/dist/org/permissions.d.ts.map +1 -0
  410. package/dist/org/permissions.js +21 -0
  411. package/dist/org/permissions.js.map +1 -0
  412. package/dist/org-team/index.d.ts +2 -0
  413. package/dist/org-team/index.d.ts.map +1 -0
  414. package/dist/org-team/index.js +2 -0
  415. package/dist/org-team/index.js.map +1 -0
  416. package/dist/private-blob/registry.d.ts.map +1 -1
  417. package/dist/private-blob/registry.js +1 -0
  418. package/dist/private-blob/registry.js.map +1 -1
  419. package/dist/progress/routes.d.ts +1 -1
  420. package/dist/resources/handlers.d.ts +2 -2
  421. package/dist/review/actions/consume-review-feedback.d.ts +10 -0
  422. package/dist/review/actions/consume-review-feedback.d.ts.map +1 -0
  423. package/dist/review/actions/consume-review-feedback.js +35 -0
  424. package/dist/review/actions/consume-review-feedback.js.map +1 -0
  425. package/dist/review/actions/create-review-comment.d.ts +18 -0
  426. package/dist/review/actions/create-review-comment.d.ts.map +1 -0
  427. package/dist/review/actions/create-review-comment.js +81 -0
  428. package/dist/review/actions/create-review-comment.js.map +1 -0
  429. package/dist/review/actions/delete-review-comment.d.ts +11 -0
  430. package/dist/review/actions/delete-review-comment.d.ts.map +1 -0
  431. package/dist/review/actions/delete-review-comment.js +53 -0
  432. package/dist/review/actions/delete-review-comment.js.map +1 -0
  433. package/dist/review/actions/get-review-feedback.d.ts +10 -0
  434. package/dist/review/actions/get-review-feedback.d.ts.map +1 -0
  435. package/dist/review/actions/get-review-feedback.js +45 -0
  436. package/dist/review/actions/get-review-feedback.js.map +1 -0
  437. package/dist/review/actions/list-review-comments.d.ts +13 -0
  438. package/dist/review/actions/list-review-comments.d.ts.map +1 -0
  439. package/dist/review/actions/list-review-comments.js +44 -0
  440. package/dist/review/actions/list-review-comments.js.map +1 -0
  441. package/dist/review/actions/reply-review-comment.d.ts +16 -0
  442. package/dist/review/actions/reply-review-comment.d.ts.map +1 -0
  443. package/dist/review/actions/reply-review-comment.js +84 -0
  444. package/dist/review/actions/reply-review-comment.js.map +1 -0
  445. package/dist/review/actions/resolve-review-thread.d.ts +12 -0
  446. package/dist/review/actions/resolve-review-thread.d.ts.map +1 -0
  447. package/dist/review/actions/resolve-review-thread.js +49 -0
  448. package/dist/review/actions/resolve-review-thread.js.map +1 -0
  449. package/dist/review/actions/set-review-status.d.ts +9 -0
  450. package/dist/review/actions/set-review-status.d.ts.map +1 -0
  451. package/dist/review/actions/set-review-status.js +43 -0
  452. package/dist/review/actions/set-review-status.js.map +1 -0
  453. package/dist/review/index.d.ts +5 -0
  454. package/dist/review/index.d.ts.map +1 -0
  455. package/dist/review/index.js +4 -0
  456. package/dist/review/index.js.map +1 -0
  457. package/dist/review/mentions.d.ts +4 -0
  458. package/dist/review/mentions.d.ts.map +1 -0
  459. package/dist/review/mentions.js +39 -0
  460. package/dist/review/mentions.js.map +1 -0
  461. package/dist/review/registry.d.ts +10 -0
  462. package/dist/review/registry.d.ts.map +1 -0
  463. package/dist/review/registry.js +63 -0
  464. package/dist/review/registry.js.map +1 -0
  465. package/dist/review/store.d.ts +63 -0
  466. package/dist/review/store.d.ts.map +1 -0
  467. package/dist/review/store.js +561 -0
  468. package/dist/review/store.js.map +1 -0
  469. package/dist/review/types.d.ts +77 -0
  470. package/dist/review/types.d.ts.map +1 -0
  471. package/dist/review/types.js +2 -0
  472. package/dist/review/types.js.map +1 -0
  473. package/dist/secrets/routes.d.ts +9 -9
  474. package/dist/server/action-discovery.d.ts.map +1 -1
  475. package/dist/server/action-discovery.js +54 -0
  476. package/dist/server/action-discovery.js.map +1 -1
  477. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  478. package/dist/server/agent-chat-plugin.js +5 -0
  479. package/dist/server/agent-chat-plugin.js.map +1 -1
  480. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  481. package/dist/server/agent-engine-api-key-route.d.ts.map +1 -1
  482. package/dist/server/agent-engine-api-key-route.js +5 -0
  483. package/dist/server/agent-engine-api-key-route.js.map +1 -1
  484. package/dist/server/credential-provider.d.ts +28 -0
  485. package/dist/server/credential-provider.d.ts.map +1 -1
  486. package/dist/server/credential-provider.js +92 -0
  487. package/dist/server/credential-provider.js.map +1 -1
  488. package/dist/setup-connections/index.d.ts +6 -0
  489. package/dist/setup-connections/index.d.ts.map +1 -0
  490. package/dist/setup-connections/index.js +6 -0
  491. package/dist/setup-connections/index.js.map +1 -0
  492. package/dist/setup-connections/onboarding.d.ts +14 -0
  493. package/dist/setup-connections/onboarding.d.ts.map +1 -0
  494. package/dist/setup-connections/onboarding.js +23 -0
  495. package/dist/setup-connections/onboarding.js.map +1 -0
  496. package/dist/transcription/builder-transcription.d.ts +1 -0
  497. package/dist/transcription/builder-transcription.d.ts.map +1 -1
  498. package/dist/transcription/builder-transcription.js +5 -2
  499. package/dist/transcription/builder-transcription.js.map +1 -1
  500. package/dist/vite/action-types-plugin.d.ts.map +1 -1
  501. package/dist/vite/action-types-plugin.js +52 -0
  502. package/dist/vite/action-types-plugin.js.map +1 -1
  503. package/docs/content/agent-native-toolkit.mdx +87 -80
  504. package/docs/content/locales/ar-SA/agent-native-toolkit.mdx +89 -80
  505. package/docs/content/locales/de-DE/agent-native-toolkit.mdx +89 -80
  506. package/docs/content/locales/es-ES/agent-native-toolkit.mdx +89 -80
  507. package/docs/content/locales/fr-FR/agent-native-toolkit.mdx +89 -80
  508. package/docs/content/locales/hi-IN/agent-native-toolkit.mdx +89 -80
  509. package/docs/content/locales/ja-JP/agent-native-toolkit.mdx +89 -80
  510. package/docs/content/locales/ko-KR/agent-native-toolkit.mdx +89 -80
  511. package/docs/content/locales/pt-BR/agent-native-toolkit.mdx +89 -80
  512. package/docs/content/locales/zh-CN/agent-native-toolkit.mdx +89 -80
  513. package/docs/content/locales/zh-TW/agent-native-toolkit.mdx +89 -80
  514. package/docs/content/toolkit-agent-ux.mdx +43 -0
  515. package/docs/content/toolkit-app-adapters.mdx +9 -0
  516. package/docs/content/toolkit-collaboration-ui.mdx +12 -0
  517. package/docs/content/toolkit-collaboration.mdx +74 -0
  518. package/docs/content/toolkit-command-navigation.mdx +106 -0
  519. package/docs/content/toolkit-comments-review.mdx +98 -0
  520. package/docs/content/toolkit-history.mdx +95 -0
  521. package/docs/content/toolkit-observability.mdx +41 -0
  522. package/docs/content/toolkit-org-team.mdx +80 -0
  523. package/docs/content/toolkit-resources.mdx +57 -0
  524. package/docs/content/toolkit-settings.mdx +65 -0
  525. package/docs/content/toolkit-setup-connections.mdx +109 -0
  526. package/docs/content/toolkit-sharing-ui.mdx +18 -6
  527. package/docs/content/toolkit-sharing.mdx +81 -0
  528. package/docs/content/toolkit-shell-hooks.mdx +9 -0
  529. package/docs/content/toolkit-ui.mdx +9 -0
  530. package/package.json +36 -2
@@ -596,7 +596,15 @@ export default defineEventHandler(async (event: H3Event) => {
596
596
  updatedAt: new Date().toISOString(),
597
597
  })
598
598
  .where(eq(schema.recordings.id, recordingId));
599
+ const failedUploadStateRaw = await readAppState(
600
+ `recording-upload-${recordingId}`,
601
+ ).catch(() => null);
602
+ const failedUploadState =
603
+ failedUploadStateRaw && typeof failedUploadStateRaw === "object"
604
+ ? (failedUploadStateRaw as Record<string, unknown>)
605
+ : {};
599
606
  await writeAppState(`recording-upload-${recordingId}`, {
607
+ ...failedUploadState,
600
608
  recordingId,
601
609
  status: "failed",
602
610
  failureReason: err instanceof Error ? err.message : "Finalize failed",
@@ -177,13 +177,13 @@ function rememberCompressedBuilderMediaMiss(compressedSourceUrl: string): void {
177
177
  function shouldFallbackToOriginalMedia(
178
178
  upstream: Response | { error: string; status: number },
179
179
  ): boolean {
180
- return [403, 404, 416].includes(upstream.status);
180
+ return upstream.status >= 500 || [403, 404, 416].includes(upstream.status);
181
181
  }
182
182
 
183
183
  function shouldRememberCompressedBuilderMediaMiss(
184
184
  upstream: Response | { error: string; status: number },
185
185
  ): boolean {
186
- return [403, 404].includes(upstream.status);
186
+ return upstream.status >= 500 || [403, 404].includes(upstream.status);
187
187
  }
188
188
 
189
189
  async function fetchProviderMedia(
@@ -497,10 +497,17 @@ export default defineEventHandler(async (event: H3Event) => {
497
497
  compressedSourceUrl &&
498
498
  !shouldSkipCompressedBuilderMediaProbe(compressedSourceUrl)
499
499
  ) {
500
- upstream = await fetchProviderMedia(
501
- compressedSourceUrl,
502
- rangeHeader,
503
- );
500
+ try {
501
+ upstream = await fetchProviderMedia(
502
+ compressedSourceUrl,
503
+ rangeHeader,
504
+ );
505
+ } catch (err) {
506
+ upstream = {
507
+ status: statusCodeForProviderFetchError(err),
508
+ error: messageForProviderFetchError(err),
509
+ };
510
+ }
504
511
  if (shouldRememberCompressedBuilderMediaMiss(upstream)) {
505
512
  rememberCompressedBuilderMediaMiss(compressedSourceUrl);
506
513
  }
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Clips user preferences that affect AI video tools.
3
+ *
4
+ * Stored under the shared `clips-user-prefs` user-setting key so Settings and
5
+ * the AI tools popover both read/write the same object.
6
+ */
7
+
8
+ export const CLIPS_USER_PREFS_KEY = "clips-user-prefs";
9
+
10
+ /**
11
+ * Preferred chat model when Include full video is on. Full-recording video
12
+ * input only works with Gemini (Builder Gemini or Google/Gemini BYOK) —
13
+ * Claude and OpenAI cannot ingest the MP4/WebM.
14
+ */
15
+ export const CLIPS_FULL_VIDEO_AI_ENGINE = "builder";
16
+ export const CLIPS_FULL_VIDEO_AI_MODEL = "gemini-3-5-flash";
17
+
18
+ export type ClipsAiPrefs = {
19
+ /**
20
+ * When true, Clips AI tools (default title/description, regenerate title/
21
+ * description/chapters, workflows) must watch the full recording — not just
22
+ * the transcript — before writing results. Off by default for cost/latency.
23
+ * Sending the full video requires a Gemini model.
24
+ */
25
+ includeFullVideoInAi?: boolean;
26
+ };
27
+
28
+ export type ClipsUserPrefs = ClipsAiPrefs & {
29
+ defaultPlaybackSpeed?: string;
30
+ emailNotifications?: boolean;
31
+ displayName?: string;
32
+ transcriptCleanupEnabled?: boolean;
33
+ };
34
+
35
+ export function isIncludeFullVideoInAiEnabled(
36
+ prefs: ClipsAiPrefs | Record<string, unknown> | null | undefined,
37
+ ): boolean {
38
+ return prefs?.includeFullVideoInAi === true;
39
+ }
40
+
41
+ /**
42
+ * Extra agent instructions when the user wants AI tools to watch the clip,
43
+ * not just read the audio transcript. Full-video understanding requires Gemini.
44
+ */
45
+ export function buildFullVideoAiInstructions(recordingId: string): string {
46
+ return (
47
+ `The user enabled "Include full video" for Clips AI. Do NOT rely on the ` +
48
+ `transcript alone — audio is often incomplete for accurate titles, ` +
49
+ `descriptions, chapters, and workflow docs. ` +
50
+ `IMPORTANT: sending / understanding the full recording only works with ` +
51
+ `Gemini (Builder Gemini or a Google Gemini key). Use a Gemini model for ` +
52
+ `this turn — Claude and OpenAI cannot ingest the full video file. ` +
53
+ `Prefer attaching or uploading the recording video itself to Gemini when ` +
54
+ `available. Otherwise use \`get-recording-player-data --recordingId=${recordingId}\` ` +
55
+ `(preferred in-app) or \`create-recording-agent-link --recordingId=${recordingId}\` ` +
56
+ `and fetch that context URL, then sample the timeline via recommendedFrames / ` +
57
+ `the frame API. Combine on-screen UI text, product names, and visual context ` +
58
+ `with any transcript. If the transcript is thin or missing, lean harder on ` +
59
+ `the video.`
60
+ );
61
+ }
62
+
63
+ export function withFullVideoAiInstructions(
64
+ message: string,
65
+ recordingId: string,
66
+ includeFullVideo: boolean,
67
+ ): string {
68
+ if (!includeFullVideo) return message;
69
+ return `${message} ${buildFullVideoAiInstructions(recordingId)}`;
70
+ }
71
+
72
+ /** Model selection for sendToAgentChat when Include full video is enabled. */
73
+ export function fullVideoAiModelSelection(): {
74
+ engine: string;
75
+ model: string;
76
+ } {
77
+ return {
78
+ engine: CLIPS_FULL_VIDEO_AI_ENGINE,
79
+ model: CLIPS_FULL_VIDEO_AI_MODEL,
80
+ };
81
+ }
@@ -48,6 +48,18 @@ function sleep(ms: number, signal?: AbortSignal): Promise<void> {
48
48
  });
49
49
  }
50
50
 
51
+ export function isStoredButUnservableFinalizeError(value: unknown): boolean {
52
+ const message =
53
+ typeof value === "string"
54
+ ? value
55
+ : value instanceof Error
56
+ ? value.message
57
+ : value && typeof value === "object" && "message" in value
58
+ ? String((value as { message?: unknown }).message ?? "")
59
+ : "";
60
+ return /\bstored-but-unservable\b/i.test(message);
61
+ }
62
+
51
63
  function absoluteUploadUrl(uploadUrl: string): URL {
52
64
  if (/^[a-z][a-z0-9+.-]*:/i.test(uploadUrl)) return new URL(uploadUrl);
53
65
  const origin =
@@ -1,78 +1,363 @@
1
1
  import { defineAction } from "@agent-native/core";
2
2
  import { writeAppState } from "@agent-native/core/application-state";
3
3
  import { assertAccess } from "@agent-native/core/sharing";
4
- import { and, eq } from "drizzle-orm";
4
+ import { and, eq, inArray } from "drizzle-orm";
5
5
  import { z } from "zod";
6
6
 
7
7
  import { getDb, schema } from "../server/db/index.js";
8
- import { deleteDatabaseDataForDocument } from "./_database-utils.js";
9
8
  import {
10
9
  deleteLocalFileDocument,
11
10
  isLocalDocumentId,
12
11
  isContentLocalFileMode,
13
12
  } from "./_local-file-documents.js";
14
13
 
15
- export async function deleteDocumentRecursive(
14
+ const DELETE_BATCH_SIZE = 90;
15
+
16
+ function chunks<T>(items: T[], size = DELETE_BATCH_SIZE): T[][] {
17
+ const out: T[][] = [];
18
+ for (let index = 0; index < items.length; index += size) {
19
+ out.push(items.slice(index, index + size));
20
+ }
21
+ return out;
22
+ }
23
+
24
+ async function selectDocumentChildren(
16
25
  db: ReturnType<typeof getDb>,
17
- id: string,
26
+ parentIds: string[],
18
27
  ownerEmail: string,
19
- ): Promise<string[]> {
20
- const children = await db
21
- .select({ id: schema.documents.id })
22
- .from(schema.documents)
23
- .where(
24
- and(
25
- eq(schema.documents.parentId, id),
26
- eq(schema.documents.ownerEmail, ownerEmail),
27
- ),
28
+ ) {
29
+ const rows: Array<{ id: string }> = [];
30
+ for (const batch of chunks(parentIds)) {
31
+ rows.push(
32
+ ...(await db
33
+ .select({ id: schema.documents.id })
34
+ .from(schema.documents)
35
+ .where(
36
+ and(
37
+ inArray(schema.documents.parentId, batch),
38
+ eq(schema.documents.ownerEmail, ownerEmail),
39
+ ),
40
+ )),
28
41
  );
42
+ }
43
+ return rows;
44
+ }
29
45
 
30
- const deleted: string[] = [];
31
- for (const child of children) {
32
- deleted.push(...(await deleteDocumentRecursive(db, child.id, ownerEmail)));
46
+ async function selectOwnedDatabaseIds(
47
+ db: ReturnType<typeof getDb>,
48
+ documentIds: string[],
49
+ ownerEmail: string,
50
+ ) {
51
+ const rows: Array<{ id: string }> = [];
52
+ for (const batch of chunks(documentIds)) {
53
+ rows.push(
54
+ ...(await db
55
+ .select({ id: schema.contentDatabases.id })
56
+ .from(schema.contentDatabases)
57
+ .where(
58
+ and(
59
+ inArray(schema.contentDatabases.documentId, batch),
60
+ eq(schema.contentDatabases.ownerEmail, ownerEmail),
61
+ ),
62
+ )),
63
+ );
33
64
  }
65
+ return rows;
66
+ }
34
67
 
35
- // Delete database membership/schema, sync links, versions, shares, then document.
36
- await deleteDatabaseDataForDocument(id, ownerEmail, db);
37
- await db
38
- .delete(schema.documentSyncLinks)
39
- .where(
40
- and(
41
- eq(schema.documentSyncLinks.documentId, id),
42
- eq(schema.documentSyncLinks.ownerEmail, ownerEmail),
43
- ),
68
+ async function selectDatabaseItemDocuments(
69
+ db: ReturnType<typeof getDb>,
70
+ databaseIds: string[],
71
+ ownerEmail: string,
72
+ ) {
73
+ const rows: Array<{ documentId: string }> = [];
74
+ for (const batch of chunks(databaseIds)) {
75
+ rows.push(
76
+ ...(await db
77
+ .select({ documentId: schema.contentDatabaseItems.documentId })
78
+ .from(schema.contentDatabaseItems)
79
+ .where(
80
+ and(
81
+ inArray(schema.contentDatabaseItems.databaseId, batch),
82
+ eq(schema.contentDatabaseItems.ownerEmail, ownerEmail),
83
+ ),
84
+ )),
44
85
  );
45
- await db
46
- .delete(schema.documentVersions)
47
- .where(
48
- and(
49
- eq(schema.documentVersions.documentId, id),
50
- eq(schema.documentVersions.ownerEmail, ownerEmail),
51
- ),
86
+ }
87
+ if (rows.length === 0) return rows;
88
+
89
+ const ownedRows: Array<{ id: string }> = [];
90
+ for (const batch of chunks(rows.map((row) => row.documentId))) {
91
+ ownedRows.push(
92
+ ...(await db
93
+ .select({ id: schema.documents.id })
94
+ .from(schema.documents)
95
+ .where(
96
+ and(
97
+ inArray(schema.documents.id, batch),
98
+ eq(schema.documents.ownerEmail, ownerEmail),
99
+ ),
100
+ )),
52
101
  );
53
- await db
54
- .delete(schema.builderDocSidecars)
55
- .where(
56
- and(
57
- eq(schema.builderDocSidecars.documentId, id),
58
- eq(schema.builderDocSidecars.ownerEmail, ownerEmail),
59
- ),
102
+ }
103
+
104
+ return ownedRows.map((row) => ({ documentId: row.id }));
105
+ }
106
+
107
+ async function collectDocumentSubtreeForDelete(
108
+ db: ReturnType<typeof getDb>,
109
+ rootId: string,
110
+ ownerEmail: string,
111
+ ) {
112
+ const documentIds = new Set([rootId]);
113
+ const ownedDatabaseIds = new Set<string>();
114
+ let frontier = [rootId];
115
+
116
+ while (frontier.length > 0) {
117
+ const next = new Set<string>();
118
+
119
+ for (const child of await selectDocumentChildren(
120
+ db,
121
+ frontier,
122
+ ownerEmail,
123
+ )) {
124
+ if (!documentIds.has(child.id)) {
125
+ documentIds.add(child.id);
126
+ next.add(child.id);
127
+ }
128
+ }
129
+
130
+ const ownedDatabases = await selectOwnedDatabaseIds(
131
+ db,
132
+ frontier,
133
+ ownerEmail,
134
+ );
135
+ const newDatabaseIds = ownedDatabases
136
+ .map((database) => database.id)
137
+ .filter((databaseId) => {
138
+ if (ownedDatabaseIds.has(databaseId)) return false;
139
+ ownedDatabaseIds.add(databaseId);
140
+ return true;
141
+ });
142
+
143
+ if (newDatabaseIds.length > 0) {
144
+ const itemDocuments = await selectDatabaseItemDocuments(
145
+ db,
146
+ newDatabaseIds,
147
+ ownerEmail,
148
+ );
149
+ for (const item of itemDocuments) {
150
+ if (!documentIds.has(item.documentId)) {
151
+ documentIds.add(item.documentId);
152
+ next.add(item.documentId);
153
+ }
154
+ }
155
+ }
156
+
157
+ frontier = [...next];
158
+ }
159
+
160
+ return {
161
+ documentIds: [...documentIds],
162
+ ownedDatabaseIds: [...ownedDatabaseIds],
163
+ };
164
+ }
165
+
166
+ async function deleteWhereIn<T>(
167
+ items: T[],
168
+ run: (batch: T[]) => Promise<unknown>,
169
+ ) {
170
+ for (const batch of chunks(items)) {
171
+ if (batch.length > 0) await run(batch);
172
+ }
173
+ }
174
+
175
+ export async function deleteDocumentRecursive(
176
+ db: ReturnType<typeof getDb>,
177
+ id: string,
178
+ ownerEmail: string,
179
+ ): Promise<string[]> {
180
+ const { documentIds, ownedDatabaseIds } =
181
+ await collectDocumentSubtreeForDelete(db, id, ownerEmail);
182
+
183
+ const propertyDefinitionIds: string[] = [];
184
+ await deleteWhereIn(ownedDatabaseIds, async (databaseIdBatch) => {
185
+ propertyDefinitionIds.push(
186
+ ...(
187
+ await db
188
+ .select({ id: schema.documentPropertyDefinitions.id })
189
+ .from(schema.documentPropertyDefinitions)
190
+ .where(
191
+ inArray(
192
+ schema.documentPropertyDefinitions.databaseId,
193
+ databaseIdBatch,
194
+ ),
195
+ )
196
+ ).map((definition) => definition.id),
60
197
  );
61
- await db
62
- .delete(schema.documentComments)
63
- .where(
64
- and(
65
- eq(schema.documentComments.documentId, id),
66
- eq(schema.documentComments.ownerEmail, ownerEmail),
67
- ),
198
+ });
199
+
200
+ const sourceIds: string[] = [];
201
+ await deleteWhereIn(ownedDatabaseIds, async (databaseIdBatch) => {
202
+ sourceIds.push(
203
+ ...(
204
+ await db
205
+ .select({ id: schema.contentDatabaseSources.id })
206
+ .from(schema.contentDatabaseSources)
207
+ .where(
208
+ inArray(schema.contentDatabaseSources.databaseId, databaseIdBatch),
209
+ )
210
+ ).map((source) => source.id),
68
211
  );
69
- await db
70
- .delete(schema.documentShares)
71
- .where(eq(schema.documentShares.resourceId, id));
72
- await db.delete(schema.documents).where(eq(schema.documents.id, id));
73
- deleted.push(id);
212
+ });
213
+
214
+ // Delete database membership/schema, sync links, versions, shares, then documents.
215
+ await deleteWhereIn(sourceIds, async (sourceIdBatch) => {
216
+ await db
217
+ .delete(schema.contentDatabaseBodyHydrationQueue)
218
+ .where(
219
+ inArray(
220
+ schema.contentDatabaseBodyHydrationQueue.sourceId,
221
+ sourceIdBatch,
222
+ ),
223
+ );
224
+ await db
225
+ .delete(schema.contentDatabaseSourceExecutions)
226
+ .where(
227
+ inArray(schema.contentDatabaseSourceExecutions.sourceId, sourceIdBatch),
228
+ );
229
+ await db
230
+ .delete(schema.contentDatabaseSourceChangeReviews)
231
+ .where(
232
+ inArray(
233
+ schema.contentDatabaseSourceChangeReviews.sourceId,
234
+ sourceIdBatch,
235
+ ),
236
+ );
237
+ await db
238
+ .delete(schema.contentDatabaseSourceChangeSets)
239
+ .where(
240
+ inArray(schema.contentDatabaseSourceChangeSets.sourceId, sourceIdBatch),
241
+ );
242
+ await db
243
+ .delete(schema.contentDatabaseSourceRows)
244
+ .where(inArray(schema.contentDatabaseSourceRows.sourceId, sourceIdBatch));
245
+ await db
246
+ .delete(schema.contentDatabaseSourceFields)
247
+ .where(
248
+ inArray(schema.contentDatabaseSourceFields.sourceId, sourceIdBatch),
249
+ );
250
+ });
251
+
252
+ await deleteWhereIn(propertyDefinitionIds, async (propertyIdBatch) => {
253
+ await db
254
+ .delete(schema.documentPropertyValues)
255
+ .where(
256
+ inArray(schema.documentPropertyValues.propertyId, propertyIdBatch),
257
+ );
258
+ await db
259
+ .delete(schema.documentBlockFieldContents)
260
+ .where(
261
+ inArray(schema.documentBlockFieldContents.propertyId, propertyIdBatch),
262
+ );
263
+ });
264
+
265
+ await deleteWhereIn(documentIds, async (documentIdBatch) => {
266
+ await db
267
+ .delete(schema.contentDatabaseBodyHydrationQueue)
268
+ .where(
269
+ inArray(
270
+ schema.contentDatabaseBodyHydrationQueue.documentId,
271
+ documentIdBatch,
272
+ ),
273
+ );
274
+ await db
275
+ .delete(schema.documentPropertyValues)
276
+ .where(
277
+ and(
278
+ inArray(schema.documentPropertyValues.documentId, documentIdBatch),
279
+ eq(schema.documentPropertyValues.ownerEmail, ownerEmail),
280
+ ),
281
+ );
282
+ await db
283
+ .delete(schema.documentBlockFieldContents)
284
+ .where(
285
+ inArray(schema.documentBlockFieldContents.documentId, documentIdBatch),
286
+ );
287
+ await db
288
+ .delete(schema.contentDatabaseItems)
289
+ .where(inArray(schema.contentDatabaseItems.documentId, documentIdBatch));
290
+ });
291
+
292
+ await deleteWhereIn(ownedDatabaseIds, async (databaseIdBatch) => {
293
+ await db
294
+ .delete(schema.contentDatabaseItems)
295
+ .where(inArray(schema.contentDatabaseItems.databaseId, databaseIdBatch));
296
+ await db
297
+ .delete(schema.contentDatabaseSources)
298
+ .where(
299
+ inArray(schema.contentDatabaseSources.databaseId, databaseIdBatch),
300
+ );
301
+ await db
302
+ .delete(schema.documentPropertyDefinitions)
303
+ .where(
304
+ inArray(schema.documentPropertyDefinitions.databaseId, databaseIdBatch),
305
+ );
306
+ await db
307
+ .delete(schema.contentDatabases)
308
+ .where(inArray(schema.contentDatabases.id, databaseIdBatch));
309
+ });
310
+
311
+ await deleteWhereIn(documentIds, async (documentIdBatch) => {
312
+ await db
313
+ .delete(schema.documentSyncLinks)
314
+ .where(
315
+ and(
316
+ inArray(schema.documentSyncLinks.documentId, documentIdBatch),
317
+ eq(schema.documentSyncLinks.ownerEmail, ownerEmail),
318
+ ),
319
+ );
320
+ await db
321
+ .delete(schema.documentVersions)
322
+ .where(
323
+ and(
324
+ inArray(schema.documentVersions.documentId, documentIdBatch),
325
+ eq(schema.documentVersions.ownerEmail, ownerEmail),
326
+ ),
327
+ );
328
+ await db
329
+ .delete(schema.builderDocSidecars)
330
+ .where(
331
+ and(
332
+ inArray(schema.builderDocSidecars.documentId, documentIdBatch),
333
+ eq(schema.builderDocSidecars.ownerEmail, ownerEmail),
334
+ ),
335
+ );
336
+ await db
337
+ .delete(schema.documentComments)
338
+ .where(
339
+ and(
340
+ inArray(schema.documentComments.documentId, documentIdBatch),
341
+ eq(schema.documentComments.ownerEmail, ownerEmail),
342
+ ),
343
+ );
344
+ await db
345
+ .delete(schema.documentShares)
346
+ .where(inArray(schema.documentShares.resourceId, documentIdBatch));
347
+ });
348
+
349
+ await deleteWhereIn(documentIds, async (documentIdBatch) => {
350
+ await db
351
+ .delete(schema.documents)
352
+ .where(
353
+ and(
354
+ inArray(schema.documents.id, documentIdBatch),
355
+ eq(schema.documents.ownerEmail, ownerEmail),
356
+ ),
357
+ );
358
+ });
74
359
 
75
- return deleted;
360
+ return documentIds;
76
361
  }
77
362
 
78
363
  export default defineAction({
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-07
4
+ ---
5
+
6
+ Permanently deleting trashed databases now finishes reliably instead of timing out.
@@ -21,6 +21,19 @@ iframe-backed screens on the infinite canvas.
21
21
  - Each screen is a URL-backed iframe, not copied HTML.
22
22
  - Each screen keeps its own URL metadata: `connectionId`, `routeId`, `path`,
23
23
  `url`, `bridgeUrl`, title, and viewport size.
24
+ - Localhost Edit mode renders the running app through the local bridge as a live
25
+ iframe with the same editor bridge used by HTML designs. It is not a frozen
26
+ static DOM snapshot.
27
+ - The live editor is same-origin through the local bridge proxy. This boots
28
+ CSR apps and root-relative assets, but it is still a localhost editing proxy:
29
+ app-origin cookies, WebSockets/HMR, SSE, and non-GET app API calls may need a
30
+ future dev-server/plugin integration for perfect parity with the app's own
31
+ origin.
32
+ - Interact mode renders the app's normal URL so app navigation, scrolling,
33
+ links, and form controls behave as they would in the browser.
34
+ - While a localhost screen has pending live visual edits, do not switch back to
35
+ Interact until the user either applies the edits to source or explicitly
36
+ aborts/discards the preview.
24
37
  - Start in Design's screen overview mode. The user can edit/select/drop on any
25
38
  visible screen from the overview canvas.
26
39
  - In overview, screens are static like Figma frames: no iframe scrolling or app
@@ -168,7 +181,9 @@ explicitly asks to freeze a snapshot.
168
181
  Once a connection is registered, the design editor's Code panel (left rail →
169
182
  Code, or `navigate --view editor --designId <id> --leftPanel code`) shows a
170
183
  local-files workspace root for that connection next to the design's own files.
171
- It lists the connected app's text/code files through the bridge
184
+ Treat that root like VS Code opened at the connected project directory: file
185
+ tree, search, open/edit, and save are backed by the real local files. It lists
186
+ the connected app's text/code files through the bridge
172
187
  (`list-local-files` / `read-local-file`); build output, `node_modules`,
173
188
  `.git`, and secret-looking paths (`.env*`, key files) are always excluded.
174
189
 
@@ -468,6 +468,7 @@ export default defineAction({
468
468
  sourceFile: screen.sourceFile,
469
469
  path: screen.path,
470
470
  bridgeUrl: connection.bridgeUrl ?? undefined,
471
+ bridgeToken: connection.bridgeToken ?? undefined,
471
472
  };
472
473
  previousMetadata[screen.id] = metadata;
473
474
  previousLocalhostScreens[screen.id] = metadata;