@agent-native/core 0.90.1 → 0.90.3

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 (714) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +26 -0
  3. package/corpus/core/docs/content/agent-native-toolkit.mdx +87 -80
  4. package/corpus/core/docs/content/locales/ar-SA/agent-native-toolkit.mdx +89 -80
  5. package/corpus/core/docs/content/locales/de-DE/agent-native-toolkit.mdx +89 -80
  6. package/corpus/core/docs/content/locales/es-ES/agent-native-toolkit.mdx +89 -80
  7. package/corpus/core/docs/content/locales/fr-FR/agent-native-toolkit.mdx +89 -80
  8. package/corpus/core/docs/content/locales/hi-IN/agent-native-toolkit.mdx +89 -80
  9. package/corpus/core/docs/content/locales/ja-JP/agent-native-toolkit.mdx +89 -80
  10. package/corpus/core/docs/content/locales/ko-KR/agent-native-toolkit.mdx +89 -80
  11. package/corpus/core/docs/content/locales/pt-BR/agent-native-toolkit.mdx +89 -80
  12. package/corpus/core/docs/content/locales/zh-CN/agent-native-toolkit.mdx +89 -80
  13. package/corpus/core/docs/content/locales/zh-TW/agent-native-toolkit.mdx +89 -80
  14. package/corpus/core/docs/content/toolkit-agent-ux.mdx +43 -0
  15. package/corpus/core/docs/content/toolkit-app-adapters.mdx +9 -0
  16. package/corpus/core/docs/content/toolkit-collaboration-ui.mdx +12 -0
  17. package/corpus/core/docs/content/toolkit-collaboration.mdx +74 -0
  18. package/corpus/core/docs/content/toolkit-command-navigation.mdx +106 -0
  19. package/corpus/core/docs/content/toolkit-comments-review.mdx +98 -0
  20. package/corpus/core/docs/content/toolkit-history.mdx +95 -0
  21. package/corpus/core/docs/content/toolkit-observability.mdx +41 -0
  22. package/corpus/core/docs/content/toolkit-org-team.mdx +80 -0
  23. package/corpus/core/docs/content/toolkit-resources.mdx +57 -0
  24. package/corpus/core/docs/content/toolkit-settings.mdx +65 -0
  25. package/corpus/core/docs/content/toolkit-setup-connections.mdx +109 -0
  26. package/corpus/core/docs/content/toolkit-sharing-ui.mdx +18 -6
  27. package/corpus/core/docs/content/toolkit-sharing.mdx +81 -0
  28. package/corpus/core/docs/content/toolkit-shell-hooks.mdx +9 -0
  29. package/corpus/core/docs/content/toolkit-ui.mdx +9 -0
  30. package/corpus/core/package.json +35 -1
  31. package/corpus/core/src/agent/engine/ai-sdk-engine.ts +19 -1
  32. package/corpus/core/src/agent/engine/anthropic-engine.ts +25 -1
  33. package/corpus/core/src/agent/engine/registry.ts +23 -16
  34. package/corpus/core/src/agent/production-agent.ts +37 -6
  35. package/corpus/core/src/client/AgentPanel.tsx +1 -1
  36. package/corpus/core/src/client/command-navigation/index.ts +15 -0
  37. package/corpus/core/src/client/comments-review/index.ts +1 -0
  38. package/corpus/core/src/client/history/VersionHistoryPanel.tsx +145 -0
  39. package/corpus/core/src/client/history/index.ts +18 -0
  40. package/corpus/core/src/client/history/use-history.ts +86 -0
  41. package/corpus/core/src/client/index.ts +76 -9
  42. package/corpus/core/src/client/org/OrgSwitcher.tsx +6 -6
  43. package/corpus/core/src/client/org/RequireActiveOrg.tsx +2 -2
  44. package/corpus/core/src/client/org/TeamPage.tsx +3 -3
  45. package/corpus/core/src/client/org/hooks.ts +32 -0
  46. package/corpus/core/src/client/org/index.ts +30 -1
  47. package/corpus/core/src/client/org-team/index.ts +1 -0
  48. package/corpus/core/src/client/review/ReviewStatusBadge.tsx +39 -0
  49. package/corpus/core/src/client/review/ReviewThreadPanel.tsx +278 -0
  50. package/corpus/core/src/client/review/index.ts +25 -0
  51. package/corpus/core/src/client/review/use-review.ts +114 -0
  52. package/corpus/core/src/client/rich-markdown-editor/useCollabReconcile.ts +11 -6
  53. package/corpus/core/src/client/settings/index.ts +11 -1
  54. package/corpus/core/src/client/setup-connections/BuilderConnectCard.tsx +94 -0
  55. package/corpus/core/src/client/setup-connections/ProviderReadinessBadge.tsx +73 -0
  56. package/corpus/core/src/client/setup-connections/SetupConnectionsPage.tsx +94 -0
  57. package/corpus/core/src/client/setup-connections/index.ts +46 -0
  58. package/corpus/core/src/client/sharing/ShareButton.tsx +20 -14
  59. package/corpus/core/src/client/sharing/ShareDialog.tsx +3 -3
  60. package/corpus/core/src/client/use-action.ts +39 -2
  61. package/corpus/core/src/client/use-db-sync.ts +44 -18
  62. package/corpus/core/src/command-navigation/actions.ts +100 -0
  63. package/corpus/core/src/command-navigation/index.ts +12 -0
  64. package/corpus/core/src/comments-review/index.ts +1 -0
  65. package/corpus/core/src/db/create-get-db.ts +32 -2
  66. package/corpus/core/src/file-upload/builder.ts +24 -3
  67. package/corpus/core/src/file-upload/types.ts +3 -1
  68. package/corpus/core/src/history/actions/create-resource-version.ts +89 -0
  69. package/corpus/core/src/history/actions/get-resource-version.ts +60 -0
  70. package/corpus/core/src/history/actions/list-resource-history.ts +53 -0
  71. package/corpus/core/src/history/actions/list-resource-versions.ts +43 -0
  72. package/corpus/core/src/history/actions/restore-resource-version.ts +96 -0
  73. package/corpus/core/src/history/index.ts +27 -0
  74. package/corpus/core/src/history/registry.ts +99 -0
  75. package/corpus/core/src/history/store.ts +348 -0
  76. package/corpus/core/src/history/types.ts +69 -0
  77. package/corpus/core/src/index.ts +10 -0
  78. package/corpus/core/src/navigation/index.ts +170 -0
  79. package/corpus/core/src/org/index.ts +8 -0
  80. package/corpus/core/src/org/permissions.ts +30 -0
  81. package/corpus/core/src/org-team/index.ts +1 -0
  82. package/corpus/core/src/private-blob/registry.ts +1 -0
  83. package/corpus/core/src/review/actions/consume-review-feedback.ts +38 -0
  84. package/corpus/core/src/review/actions/create-review-comment.ts +107 -0
  85. package/corpus/core/src/review/actions/delete-review-comment.ts +55 -0
  86. package/corpus/core/src/review/actions/get-review-feedback.ts +54 -0
  87. package/corpus/core/src/review/actions/list-review-comments.ts +53 -0
  88. package/corpus/core/src/review/actions/reply-review-comment.ts +107 -0
  89. package/corpus/core/src/review/actions/resolve-review-thread.ts +60 -0
  90. package/corpus/core/src/review/actions/set-review-status.ts +58 -0
  91. package/corpus/core/src/review/index.ts +36 -0
  92. package/corpus/core/src/review/mentions.ts +44 -0
  93. package/corpus/core/src/review/registry.ts +99 -0
  94. package/corpus/core/src/review/store.ts +687 -0
  95. package/corpus/core/src/review/types.ts +97 -0
  96. package/corpus/core/src/server/action-discovery.ts +54 -0
  97. package/corpus/core/src/server/agent-engine-api-key-route.ts +5 -0
  98. package/corpus/core/src/server/credential-provider.ts +108 -0
  99. package/corpus/core/src/server/framework-request-handler.ts +52 -4
  100. package/corpus/core/src/setup-connections/index.ts +89 -0
  101. package/corpus/core/src/setup-connections/onboarding.ts +47 -0
  102. package/corpus/core/src/transcription/builder-transcription.ts +9 -2
  103. package/corpus/core/src/vite/action-types-plugin.ts +52 -0
  104. package/corpus/templates/analytics/app/components/layout/Layout.tsx +2 -1
  105. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +2 -2
  106. package/corpus/templates/analytics/app/global.css +22 -10
  107. package/corpus/templates/analytics/app/i18n/zh-TW.ts +6 -1
  108. package/corpus/templates/analytics/app/i18n-data.ts +81 -13
  109. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +2 -2
  110. package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +2 -2
  111. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +528 -108
  112. package/corpus/templates/analytics/app/pages/sessions/SessionDevToolsPanel.tsx +466 -183
  113. package/corpus/templates/analytics/changelog/2026-07-07-session-replays-load-sooner-show-clearer-activity-timelines-.md +6 -0
  114. package/corpus/templates/assets/.agents/skills/asset-generation/SKILL.md +5 -0
  115. package/corpus/templates/assets/.agents/skills/logo-composite/SKILL.md +34 -6
  116. package/corpus/templates/assets/AGENTS.md +23 -4
  117. package/corpus/templates/assets/actions/_generation-preset-settings.ts +48 -0
  118. package/corpus/templates/assets/actions/_helpers.ts +8 -1
  119. package/corpus/templates/assets/actions/_preset-skeleton-validation.ts +64 -0
  120. package/corpus/templates/assets/actions/create-generation-preset.ts +11 -3
  121. package/corpus/templates/assets/actions/generate-image-batch.ts +7 -2
  122. package/corpus/templates/assets/actions/generate-image.ts +342 -25
  123. package/corpus/templates/assets/actions/get-library.ts +4 -3
  124. package/corpus/templates/assets/actions/navigate.ts +2 -1
  125. package/corpus/templates/assets/actions/refresh-generation-run.ts +5 -1
  126. package/corpus/templates/assets/actions/update-asset.ts +1 -0
  127. package/corpus/templates/assets/actions/update-generation-preset.ts +8 -1
  128. package/corpus/templates/assets/actions/view-screen.ts +8 -1
  129. package/corpus/templates/assets/app/components/generation/GenerationResults.tsx +9 -1
  130. package/corpus/templates/assets/app/hooks/use-image-model-menu.ts +1 -0
  131. package/corpus/templates/assets/app/hooks/use-navigation-state.ts +11 -0
  132. package/corpus/templates/assets/app/i18n/zh-TW.ts +64 -0
  133. package/corpus/templates/assets/app/i18n-data.ts +650 -0
  134. package/corpus/templates/assets/app/routes/asset.$id.tsx +2 -1
  135. package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +44 -33
  136. package/corpus/templates/assets/app/routes/brand-kits.$id_.presets.$presetId.tsx +1474 -0
  137. package/corpus/templates/assets/app/routes/library.tsx +43 -1
  138. package/corpus/templates/assets/server/lib/generation.ts +366 -44
  139. package/corpus/templates/assets/server/lib/image-processing.ts +252 -0
  140. package/corpus/templates/assets/server/lib/preset-skeleton.ts +137 -0
  141. package/corpus/templates/assets/shared/api.ts +47 -0
  142. package/corpus/templates/brain/app/routes/settings.tsx +2 -2
  143. package/corpus/templates/calendar/app/components/calendar/AttendeeAutocomplete.tsx +32 -6
  144. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +120 -40
  145. package/corpus/templates/calendar/app/hooks/use-people.ts +55 -0
  146. package/corpus/templates/calendar/changelog/2026-07-07-guest-suggestions-now-find-coworkers-from-your-google-worksp.md +6 -0
  147. package/corpus/templates/calendar/changelog/2026-07-07-zoom-stays-selected-after-connecting-it-from-a-draft-event.md +6 -0
  148. package/corpus/templates/clips/actions/create-recording.ts +5 -1
  149. package/corpus/templates/clips/actions/finalize-recording.ts +140 -1
  150. package/corpus/templates/clips/actions/import-loom-recording.ts +1 -0
  151. package/corpus/templates/clips/actions/lib/ensure-seekable-video.ts +1 -0
  152. package/corpus/templates/clips/actions/request-transcript.ts +31 -0
  153. package/corpus/templates/clips/actions/set-thumbnail.ts +2 -0
  154. package/corpus/templates/clips/app/components/library/library-layout.tsx +7 -2
  155. package/corpus/templates/clips/app/components/library/organization-switcher.tsx +2 -2
  156. package/corpus/templates/clips/app/components/library/sort-menu.tsx +1 -1
  157. package/corpus/templates/clips/app/components/player/scrubber-position.ts +9 -0
  158. package/corpus/templates/clips/app/components/player/scrubber.tsx +5 -2
  159. package/corpus/templates/clips/app/components/player/share-dialog.tsx +69 -41
  160. package/corpus/templates/clips/app/components/player/video-player.tsx +38 -1
  161. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +114 -33
  162. package/corpus/templates/clips/app/components/sharing/share-ui.tsx +3 -3
  163. package/corpus/templates/clips/app/components/sharing/slack-share-hint.tsx +9 -19
  164. package/corpus/templates/clips/app/routes/_app.library._index.tsx +27 -1
  165. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +9 -3
  166. package/corpus/templates/clips/app/routes/record.tsx +178 -80
  167. package/corpus/templates/clips/changelog/2026-07-02-recordings-now-wait-for-storage-media-to-serve-before-finishing.md +6 -0
  168. package/corpus/templates/clips/changelog/2026-07-07-a-pending-app-update-no-longer-blocks-screen-recording-updat.md +6 -0
  169. package/corpus/templates/clips/changelog/2026-07-07-chrome-extension-recordings-keep-audio-after-refreshing-tab.md +6 -0
  170. package/corpus/templates/clips/changelog/2026-07-07-clip-playback-progress-now-starts-and-finishes-at-the-right-times.md +6 -0
  171. package/corpus/templates/clips/changelog/2026-07-07-sharing-public-clips-now-stays-focused-on-the-normal-link-wi.md +6 -0
  172. package/corpus/templates/clips/chrome-extension/src/background.ts +18 -0
  173. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +23 -8
  174. package/corpus/templates/clips/desktop/src/app.tsx +40 -3
  175. package/corpus/templates/clips/desktop/src/hooks/useMediaDevices.ts +19 -7
  176. package/corpus/templates/clips/desktop/src/lib/permissions.ts +2 -0
  177. package/corpus/templates/clips/desktop/src/lib/updater.ts +25 -2
  178. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +7 -0
  179. package/corpus/templates/clips/server/routes/api/recordings/[recordingId]/thumbnail.post.ts +1 -0
  180. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/abort.post.ts +23 -6
  181. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +28 -3
  182. package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +13 -6
  183. package/corpus/templates/clips/shared/finalize-recovery.ts +35 -3
  184. package/corpus/templates/content/AGENTS.md +52 -52
  185. package/corpus/templates/content/actions/_builder-cms-read-client.ts +188 -8
  186. package/corpus/templates/content/actions/_builder-docs-client.ts +41 -3
  187. package/corpus/templates/content/actions/_database-source-utils.ts +998 -160
  188. package/corpus/templates/content/actions/_database-utils.ts +44 -4
  189. package/corpus/templates/content/actions/_notion-action-utils.ts +6 -2
  190. package/corpus/templates/content/actions/add-content-database-source-field-property.ts +23 -1
  191. package/corpus/templates/content/actions/attach-content-database-source.ts +85 -12
  192. package/corpus/templates/content/actions/change-content-database-source-role.ts +9 -1
  193. package/corpus/templates/content/actions/delete-content-database.ts +1 -0
  194. package/corpus/templates/content/actions/delete-document.ts +337 -52
  195. package/corpus/templates/content/actions/get-document.ts +11 -2
  196. package/corpus/templates/content/actions/list-content-databases.ts +57 -9
  197. package/corpus/templates/content/actions/prepare-builder-source-review.ts +23 -6
  198. package/corpus/templates/content/actions/refresh-content-database-source.ts +26 -3
  199. package/corpus/templates/content/actions/restore-content-database.ts +1 -0
  200. package/corpus/templates/content/actions/update-document.ts +43 -0
  201. package/corpus/templates/content/app/components/editor/BuilderBodySyncingNotice.tsx +21 -0
  202. package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +0 -1
  203. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +70 -28
  204. package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +69 -17
  205. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +4 -4
  206. package/corpus/templates/content/app/components/editor/body-hydration.ts +112 -0
  207. package/corpus/templates/content/app/components/editor/builder-body-hydration-pump.ts +52 -0
  208. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +9076 -2876
  209. package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +41 -1
  210. package/corpus/templates/content/app/components/editor/extensions/ImageBlock.tsx +36 -11
  211. package/corpus/templates/content/app/components/editor/previewDocumentSaveController.ts +21 -1
  212. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +11 -1
  213. package/corpus/templates/content/app/components/sidebar/DocumentTreeItem.tsx +11 -8
  214. package/corpus/templates/content/app/global.css +41 -0
  215. package/corpus/templates/content/app/hooks/use-content-database.ts +346 -42
  216. package/corpus/templates/content/app/hooks/use-db-sync.ts +9 -0
  217. package/corpus/templates/content/app/hooks/use-documents.ts +47 -0
  218. package/corpus/templates/content/app/hooks/use-notion.ts +12 -10
  219. package/corpus/templates/content/app/i18n/zh-TW.ts +35 -0
  220. package/corpus/templates/content/app/i18n-data.ts +355 -0
  221. package/corpus/templates/content/app/root.tsx +22 -0
  222. package/corpus/templates/content/changelog/2026-07-01-builder-database-sources-keep-loading-rows-in-the-background.md +6 -0
  223. package/corpus/templates/content/changelog/2026-07-01-builder-source-attach-starts-with-usable-rows.md +6 -0
  224. package/corpus/templates/content/changelog/2026-07-01-builder-source-attachment-now-stays-connected-after-large.md +6 -0
  225. package/corpus/templates/content/changelog/2026-07-01-builder-source-refreshes-now-show-progress-for-large-docs-blog.md +6 -0
  226. package/corpus/templates/content/changelog/2026-07-01-database-pages-now-delete-to-trash-without-route-errors.md +6 -0
  227. package/corpus/templates/content/changelog/2026-07-02-builder-source-refreshes-recover-from-stalled-background-row.md +6 -0
  228. package/corpus/templates/content/changelog/2026-07-02-builder-sourced-rows-open-with-sync-protection.md +6 -0
  229. package/corpus/templates/content/changelog/2026-07-02-database-rows-and-pages-open-faster-from-recently-loaded-dat.md +6 -0
  230. package/corpus/templates/content/changelog/2026-07-02-preview-panels-close-reliably-narrow-sidebar-row-actions-sta.md +6 -0
  231. package/corpus/templates/content/changelog/2026-07-06-builder-sync-progress-no-longer-shows-continue.md +6 -0
  232. package/corpus/templates/content/changelog/2026-07-07-permanently-deleting-trashed-databases-now-finishes-reliably.md +6 -0
  233. package/corpus/templates/content/shared/api.ts +13 -0
  234. package/corpus/templates/content/shared/builder-mdx.ts +16 -3
  235. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +23 -13
  236. package/corpus/templates/design/.agents/skills/responsive-breakpoints/SKILL.md +98 -0
  237. package/corpus/templates/design/.agents/skills/shader-fills/SKILL.md +162 -0
  238. package/corpus/templates/design/AGENTS.md +9 -2
  239. package/corpus/templates/design/actions/add-breakpoint.ts +6 -3
  240. package/corpus/templates/design/actions/apply-a11y-fix.ts +57 -37
  241. package/corpus/templates/design/actions/apply-component-prop-edit.ts +41 -20
  242. package/corpus/templates/design/actions/apply-motion-edit.ts +251 -38
  243. package/corpus/templates/design/actions/apply-shader-fill.ts +90 -66
  244. package/corpus/templates/design/actions/apply-visual-edit.ts +282 -55
  245. package/corpus/templates/design/actions/create-component.ts +29 -60
  246. package/corpus/templates/design/actions/create-file.ts +9 -2
  247. package/corpus/templates/design/actions/duplicate-design.ts +31 -2
  248. package/corpus/templates/design/actions/edit-design.ts +36 -38
  249. package/corpus/templates/design/actions/generate-design-title.ts +87 -0
  250. package/corpus/templates/design/actions/generate-design.ts +53 -18
  251. package/corpus/templates/design/actions/generate-screens.ts +108 -4
  252. package/corpus/templates/design/actions/get-motion-timeline.ts +35 -7
  253. package/corpus/templates/design/actions/insert-asset.ts +34 -29
  254. package/corpus/templates/design/actions/insert-design-native-asset.ts +129 -32
  255. package/corpus/templates/design/actions/insert-figma-library-asset.ts +35 -30
  256. package/corpus/templates/design/actions/present-design-variants.ts +7 -2
  257. package/corpus/templates/design/actions/remove-motion-timeline.ts +31 -36
  258. package/corpus/templates/design/actions/update-file.ts +190 -75
  259. package/corpus/templates/design/app/components/design/BreakpointBar.tsx +403 -0
  260. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +469 -222
  261. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +708 -53
  262. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +83 -3
  263. package/corpus/templates/design/app/components/design/EditPanel.tsx +1091 -6948
  264. package/corpus/templates/design/app/components/design/LayersPanel.tsx +419 -85
  265. package/corpus/templates/design/app/components/design/MotionDock.tsx +1124 -103
  266. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +2610 -1398
  267. package/corpus/templates/design/app/components/design/ReadOnlyDesignBanner.tsx +22 -0
  268. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +2182 -235
  269. package/corpus/templates/design/app/components/design/bridge/motion-preview.bridge.ts +187 -11
  270. package/corpus/templates/design/app/components/design/bridge/shader-fill-preview.bridge.ts +376 -1
  271. package/corpus/templates/design/app/components/design/bridge/shader-runtime.bridge.ts +746 -0
  272. package/corpus/templates/design/app/components/design/canvas-primitive-style.ts +17 -0
  273. package/corpus/templates/design/app/components/design/code-workbench/SideBar.tsx +1 -1
  274. package/corpus/templates/design/app/components/design/code-workbench/explorer/FileTree.tsx +1 -3
  275. package/corpus/templates/design/app/components/design/code-workbench/quickinput/QuickInput.tsx +1 -1
  276. package/corpus/templates/design/app/components/design/edit-panel/appearance-properties.tsx +518 -0
  277. package/corpus/templates/design/app/components/design/edit-panel/code-inspect-helpers.tsx +562 -0
  278. package/corpus/templates/design/app/components/design/edit-panel/component-section.tsx +763 -0
  279. package/corpus/templates/design/app/components/design/edit-panel/document-colors.ts +94 -0
  280. package/corpus/templates/design/app/components/design/edit-panel/effects-properties.tsx +780 -0
  281. package/corpus/templates/design/app/components/design/edit-panel/element-classification.ts +446 -0
  282. package/corpus/templates/design/app/components/design/edit-panel/element-identity.ts +79 -0
  283. package/corpus/templates/design/app/components/design/edit-panel/field-primitives.tsx +315 -0
  284. package/corpus/templates/design/app/components/design/edit-panel/fill-gradient-helpers.ts +344 -0
  285. package/corpus/templates/design/app/components/design/edit-panel/fill-properties.tsx +594 -0
  286. package/corpus/templates/design/app/components/design/edit-panel/frame-presets-panel.tsx +119 -0
  287. package/corpus/templates/design/app/components/design/edit-panel/inspector-controls.tsx +248 -0
  288. package/corpus/templates/design/app/components/design/edit-panel/interaction-state-helpers.ts +45 -0
  289. package/corpus/templates/design/app/components/design/edit-panel/layout-properties.tsx +693 -0
  290. package/corpus/templates/design/app/components/design/edit-panel/panel-primitives.tsx +724 -0
  291. package/corpus/templates/design/app/components/design/edit-panel/position-helpers.ts +207 -0
  292. package/corpus/templates/design/app/components/design/edit-panel/position-layout-properties.tsx +628 -0
  293. package/corpus/templates/design/app/components/design/edit-panel/selection-helpers.ts +91 -0
  294. package/corpus/templates/design/app/components/design/edit-panel/stroke-properties.tsx +649 -0
  295. package/corpus/templates/design/app/components/design/edit-panel/style-change-types.ts +118 -0
  296. package/corpus/templates/design/app/components/design/edit-panel/style-options.ts +88 -0
  297. package/corpus/templates/design/app/components/design/edit-panel/transform-helpers.ts +100 -0
  298. package/corpus/templates/design/app/components/design/edit-panel/typography-helpers.ts +117 -0
  299. package/corpus/templates/design/app/components/design/edit-panel/typography-properties.tsx +501 -0
  300. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +91 -40
  301. package/corpus/templates/design/app/components/design/inspector/BreakpointOverrideIndicator.tsx +82 -0
  302. package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +189 -87
  303. package/corpus/templates/design/app/components/design/inspector/GlslShaderPanel.tsx +1097 -0
  304. package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +44 -0
  305. package/corpus/templates/design/app/components/design/inspector/InteractionStatePanel.tsx +258 -0
  306. package/corpus/templates/design/app/components/design/inspector/MotionKeyframeDiamond.tsx +144 -0
  307. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +99 -9
  308. package/corpus/templates/design/app/components/design/inspector/frame-size-presets.ts +116 -0
  309. package/corpus/templates/design/app/components/design/inspector/index.ts +26 -0
  310. package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +29 -0
  311. package/corpus/templates/design/app/components/design/multi-screen/alt-hover-measurement.ts +171 -0
  312. package/corpus/templates/design/app/components/design/multi-screen/board-surface-html.ts +220 -0
  313. package/corpus/templates/design/app/components/design/multi-screen/chrome-transitions.ts +35 -0
  314. package/corpus/templates/design/app/components/design/multi-screen/cross-screen-drop.ts +134 -0
  315. package/corpus/templates/design/app/components/design/multi-screen/culling.ts +185 -0
  316. package/corpus/templates/design/app/components/design/multi-screen/gradient-overlay-geometry.ts +120 -0
  317. package/corpus/templates/design/app/components/design/multi-screen/types.ts +892 -0
  318. package/corpus/templates/design/app/components/design/multi-screen/vector-edit-geometry.ts +21 -0
  319. package/corpus/templates/design/app/components/design/types.ts +15 -0
  320. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +109 -5
  321. package/corpus/templates/design/app/global.css +8 -8
  322. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +259 -2
  323. package/corpus/templates/design/app/i18n/zh-TW.ts +163 -9
  324. package/corpus/templates/design/app/i18n-breakpoints.ts +205 -0
  325. package/corpus/templates/design/app/i18n-data.ts +1664 -152
  326. package/corpus/templates/design/app/i18n-motion.ts +563 -0
  327. package/corpus/templates/design/app/lib/design-import.ts +73 -0
  328. package/corpus/templates/design/app/pages/Index.tsx +41 -22
  329. package/corpus/templates/design/changelog/2026-06-29-design-inspector-controls-now-match-figmas-softer-dark-chrome.md +1 -1
  330. package/corpus/templates/design/changelog/2026-06-30-design-now-has-a-figma-style-left-rail-for-file-agent-assets.md +1 -1
  331. package/corpus/templates/design/changelog/2026-06-30-design-tools-now-use-a-quieter-figma-style-list-layout.md +1 -1
  332. package/corpus/templates/design/changelog/2026-06-30-multi-select-outlines-now-stay-consistent-across-all-screens.md +1 -1
  333. package/corpus/templates/design/changelog/2026-07-03-canvas-interactions-now-match-figma-rotation-aware-resizing-.md +1 -1
  334. package/corpus/templates/design/changelog/2026-07-03-layers-panel-matches-figma-top-layer-on-top-drag-with-auto-s.md +1 -1
  335. package/corpus/templates/design/changelog/2026-07-05-designs-get-ai-generated-names-from-your-prompt.md +6 -0
  336. package/corpus/templates/design/changelog/2026-07-05-local-code-screens-keep-their-connection-when-duplicated-and.md +6 -0
  337. package/corpus/templates/design/changelog/2026-07-05-press-a-to-draw-screens-on-the-canvas-inside-a-screen-it-dr.md +6 -0
  338. package/corpus/templates/design/changelog/2026-07-06-3d-rotation-and-perspective-controls-on-every-element.md +6 -0
  339. package/corpus/templates/design/changelog/2026-07-06-ai-generated-and-duplicated-screens-now-get-their-editor-sel.md +6 -0
  340. package/corpus/templates/design/changelog/2026-07-06-applying-shaders-and-fills-in-quick-succession-can-no-longer.md +6 -0
  341. package/corpus/templates/design/changelog/2026-07-06-breakpoint-frames-in-the-overview-now-support-click-to-selec.md +6 -0
  342. package/corpus/templates/design/changelog/2026-07-06-breakpoint-segments-in-the-inspector-now-show-a-device-icon-.md +6 -0
  343. package/corpus/templates/design/changelog/2026-07-06-breakpoint-targeting-now-lives-in-one-compact-control-in-the.md +6 -0
  344. package/corpus/templates/design/changelog/2026-07-06-canvas-edits-can-no-longer-be-overwritten-by-stale-collabora.md +6 -0
  345. package/corpus/templates/design/changelog/2026-07-06-canvas-edits-inside-screens-save-reliably-again.md +6 -0
  346. package/corpus/templates/design/changelog/2026-07-06-cleaner-inspector-removed-the-ask-ai-box-from-the-design-tab.md +6 -0
  347. package/corpus/templates/design/changelog/2026-07-06-clicking-empty-canvas-space-now-deselects-an-element-inside-.md +6 -0
  348. package/corpus/templates/design/changelog/2026-07-06-dragging-an-element-onto-a-rectangle-now-nests-it-inside-wit.md +6 -0
  349. package/corpus/templates/design/changelog/2026-07-06-dragging-screens-and-objects-on-the-canvas-is-now-much-smoot.md +6 -0
  350. package/corpus/templates/design/changelog/2026-07-06-drawing-a-shape-or-text-on-the-canvas-no-longer-flashes-away.md +6 -0
  351. package/corpus/templates/design/changelog/2026-07-06-dropping-an-element-between-two-others-inside-a-screen-now-s.md +6 -0
  352. package/corpus/templates/design/changelog/2026-07-06-duplicating-a-screen-now-places-the-copy-exactly-where-you-d.md +6 -0
  353. package/corpus/templates/design/changelog/2026-07-06-edit-gradients-directly-on-elements-inside-screens-scale-str.md +6 -0
  354. package/corpus/templates/design/changelog/2026-07-06-edits-from-collaborators-and-the-agent-now-update-the-canvas.md +6 -0
  355. package/corpus/templates/design/changelog/2026-07-06-fixed-a-bug-where-most-style-position-and-text-edits-briefly.md +6 -0
  356. package/corpus/templates/design/changelog/2026-07-06-fixed-a-confusing-raw-error-message-when-a-file-upload-fails.md +6 -0
  357. package/corpus/templates/design/changelog/2026-07-06-fixed-a-rare-case-where-an-edit-could-be-silently-overwritte.md +6 -0
  358. package/corpus/templates/design/changelog/2026-07-06-fixed-inserted-assets-sometimes-disappearing-reappearing-or-.md +6 -0
  359. package/corpus/templates/design/changelog/2026-07-06-fixed-inspector-value-scrubbing-producing-erratic-numbers-an.md +6 -0
  360. package/corpus/templates/design/changelog/2026-07-06-fixed-padding-gap-and-min-max-size-scrubbing-not-updating-th.md +6 -0
  361. package/corpus/templates/design/changelog/2026-07-06-fixed-text-stroke-color-turning-black-and-glyphs-disappearin.md +6 -0
  362. package/corpus/templates/design/changelog/2026-07-06-fixed-the-collapsed-effects-and-stroke-inspector-sections-sh.md +6 -0
  363. package/corpus/templates/design/changelog/2026-07-06-fixed-the-new-design-dialog-closing-unexpectedly-when-using-.md +6 -0
  364. package/corpus/templates/design/changelog/2026-07-06-fixed-the-typography-section-missing-when-selecting-text-nes.md +6 -0
  365. package/corpus/templates/design/changelog/2026-07-06-full-view-no-longer-flashes-back-to-the-overview-on-entry-no.md +6 -0
  366. package/corpus/templates/design/changelog/2026-07-06-keyframe-animation-timeline-per-property-keyframes-easing-cu.md +6 -0
  367. package/corpus/templates/design/changelog/2026-07-06-moving-restyling-and-scrubbing-values-on-elements-in-ai-gene.md +6 -0
  368. package/corpus/templates/design/changelog/2026-07-06-padding-and-corner-radius-value-scrubbing-now-snaps-to-whole.md +6 -0
  369. package/corpus/templates/design/changelog/2026-07-06-padding-handles-now-only-resize-on-the-handle-line-itself-sh.md +6 -0
  370. package/corpus/templates/design/changelog/2026-07-06-preview-and-edit-hover-focus-and-pressed-states-with-real-cs.md +6 -0
  371. package/corpus/templates/design/changelog/2026-07-06-promoting-an-element-to-a-component-now-works-correctly-for-.md +6 -0
  372. package/corpus/templates/design/changelog/2026-07-06-reduced-url-history-churn-and-selection-overlay-flicker-whil.md +6 -0
  373. package/corpus/templates/design/changelog/2026-07-06-removed-the-decorative-dot-before-screen-names-in-the-overvi.md +6 -0
  374. package/corpus/templates/design/changelog/2026-07-06-responsive-breakpoints-edit-at-any-width-with-cascading-over.md +6 -0
  375. package/corpus/templates/design/changelog/2026-07-06-screen-labels-no-longer-turn-blue-when-you-hover-inside-the-.md +6 -0
  376. package/corpus/templates/design/changelog/2026-07-06-scrolling-a-screen-with-an-element-selected-stays-smooth-on-.md +6 -0
  377. package/corpus/templates/design/changelog/2026-07-06-selecting-multiple-elements-and-dragging-now-moves-the-whole.md +6 -0
  378. package/corpus/templates/design/changelog/2026-07-06-selection-borders-handles-and-value-readouts-now-stay-the-sa.md +6 -0
  379. package/corpus/templates/design/changelog/2026-07-06-selection-handles-and-editing-chrome-now-stay-a-constant-siz.md +6 -0
  380. package/corpus/templates/design/changelog/2026-07-06-shader-fills-and-effects-ai-authored-or-preset-glsl-shaders-.md +6 -0
  381. package/corpus/templates/design/changelog/2026-07-06-text-drawn-on-the-canvas-now-defaults-to-white-and-inter-in-.md +6 -0
  382. package/corpus/templates/design/changelog/2026-07-06-text-dropped-into-a-shape-now-stays-readable-instead-of-disa.md +6 -0
  383. package/corpus/templates/design/changelog/2026-07-06-the-add-tweak-controls-prompt-no-longer-jumps-to-the-corner-.md +6 -0
  384. package/corpus/templates/design/changelog/2026-07-06-the-padding-value-readout-now-stays-visible-while-you-hover-.md +6 -0
  385. package/corpus/templates/design/changelog/2026-07-06-the-selected-element-attachment-now-clears-from-the-chat-com.md +6 -0
  386. package/corpus/templates/design/changelog/2026-07-06-the-zoom-menu-is-more-compact-with-tight-rows-and-right-alig.md +6 -0
  387. package/corpus/templates/design/changelog/2026-07-06-undo-and-redo-no-longer-flash-the-screen-changes-now-apply-i.md +6 -0
  388. package/corpus/templates/design/changelog/2026-07-06-zoom-presets-like-zoom-to-50-now-stay-on-the-focused-screen-.md +6 -0
  389. package/corpus/templates/design/server/lib/import-design-files.ts +11 -2
  390. package/corpus/templates/design/server/source-workspace.ts +139 -59
  391. package/corpus/templates/design/shared/board-file.ts +11 -2
  392. package/corpus/templates/design/shared/breakpoint-media.ts +543 -0
  393. package/corpus/templates/design/shared/canvas-math.ts +354 -35
  394. package/corpus/templates/design/shared/code-layer.ts +277 -8
  395. package/corpus/templates/design/shared/design-state.ts +11 -4
  396. package/corpus/templates/design/shared/interaction-states.ts +548 -0
  397. package/corpus/templates/design/shared/motion-compiler.ts +186 -23
  398. package/corpus/templates/design/shared/motion-easing.ts +294 -0
  399. package/corpus/templates/design/shared/motion-timeline.ts +400 -34
  400. package/corpus/templates/design/shared/prompt-title.ts +95 -0
  401. package/corpus/templates/design/shared/responsive-classes.ts +448 -10
  402. package/corpus/templates/design/shared/screen-annotation.ts +46 -0
  403. package/corpus/templates/design/shared/shader-fills.ts +1009 -0
  404. package/corpus/templates/design/shared/shader-presets.ts +852 -4
  405. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +15 -2
  406. package/corpus/templates/slides/app/components/editor/ImportButton.tsx +10 -1
  407. package/corpus/templates/slides/app/lib/upload-response.ts +71 -0
  408. package/corpus/templates/slides/app/pages/DeckEditor.tsx +2 -2
  409. package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
  410. package/dist/agent/engine/ai-sdk-engine.js +15 -1
  411. package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
  412. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  413. package/dist/agent/engine/anthropic-engine.js +20 -1
  414. package/dist/agent/engine/anthropic-engine.js.map +1 -1
  415. package/dist/agent/engine/registry.d.ts.map +1 -1
  416. package/dist/agent/engine/registry.js +22 -14
  417. package/dist/agent/engine/registry.js.map +1 -1
  418. package/dist/agent/production-agent.d.ts.map +1 -1
  419. package/dist/agent/production-agent.js +27 -7
  420. package/dist/agent/production-agent.js.map +1 -1
  421. package/dist/client/AgentPanel.js +1 -1
  422. package/dist/client/AgentPanel.js.map +1 -1
  423. package/dist/client/command-navigation/index.d.ts +4 -0
  424. package/dist/client/command-navigation/index.d.ts.map +1 -0
  425. package/dist/client/command-navigation/index.js +4 -0
  426. package/dist/client/command-navigation/index.js.map +1 -0
  427. package/dist/client/comments-review/index.d.ts +2 -0
  428. package/dist/client/comments-review/index.d.ts.map +1 -0
  429. package/dist/client/comments-review/index.js +2 -0
  430. package/dist/client/comments-review/index.js.map +1 -0
  431. package/dist/client/history/VersionHistoryPanel.d.ts +18 -0
  432. package/dist/client/history/VersionHistoryPanel.d.ts.map +1 -0
  433. package/dist/client/history/VersionHistoryPanel.js +24 -0
  434. package/dist/client/history/VersionHistoryPanel.js.map +1 -0
  435. package/dist/client/history/index.d.ts +3 -0
  436. package/dist/client/history/index.d.ts.map +1 -0
  437. package/dist/client/history/index.js +3 -0
  438. package/dist/client/history/index.js.map +1 -0
  439. package/dist/client/history/use-history.d.ts +46 -0
  440. package/dist/client/history/use-history.d.ts.map +1 -0
  441. package/dist/client/history/use-history.js +18 -0
  442. package/dist/client/history/use-history.js.map +1 -0
  443. package/dist/client/index.d.ts +6 -4
  444. package/dist/client/index.d.ts.map +1 -1
  445. package/dist/client/index.js +6 -4
  446. package/dist/client/index.js.map +1 -1
  447. package/dist/client/org/OrgSwitcher.js +5 -5
  448. package/dist/client/org/OrgSwitcher.js.map +1 -1
  449. package/dist/client/org/RequireActiveOrg.js +2 -2
  450. package/dist/client/org/RequireActiveOrg.js.map +1 -1
  451. package/dist/client/org/TeamPage.js +3 -3
  452. package/dist/client/org/TeamPage.js.map +1 -1
  453. package/dist/client/org/hooks.d.ts +12 -1
  454. package/dist/client/org/hooks.d.ts.map +1 -1
  455. package/dist/client/org/hooks.js +15 -0
  456. package/dist/client/org/hooks.js.map +1 -1
  457. package/dist/client/org/index.d.ts +4 -2
  458. package/dist/client/org/index.d.ts.map +1 -1
  459. package/dist/client/org/index.js +3 -1
  460. package/dist/client/org/index.js.map +1 -1
  461. package/dist/client/org-team/index.d.ts +2 -0
  462. package/dist/client/org-team/index.d.ts.map +1 -0
  463. package/dist/client/org-team/index.js +2 -0
  464. package/dist/client/org-team/index.js.map +1 -0
  465. package/dist/client/review/ReviewStatusBadge.d.ts +7 -0
  466. package/dist/client/review/ReviewStatusBadge.d.ts.map +1 -0
  467. package/dist/client/review/ReviewStatusBadge.js +19 -0
  468. package/dist/client/review/ReviewStatusBadge.js.map +1 -0
  469. package/dist/client/review/ReviewThreadPanel.d.ts +20 -0
  470. package/dist/client/review/ReviewThreadPanel.d.ts.map +1 -0
  471. package/dist/client/review/ReviewThreadPanel.js +84 -0
  472. package/dist/client/review/ReviewThreadPanel.js.map +1 -0
  473. package/dist/client/review/index.d.ts +4 -0
  474. package/dist/client/review/index.d.ts.map +1 -0
  475. package/dist/client/review/index.js +4 -0
  476. package/dist/client/review/index.js.map +1 -0
  477. package/dist/client/review/use-review.d.ts +68 -0
  478. package/dist/client/review/use-review.d.ts.map +1 -0
  479. package/dist/client/review/use-review.js +22 -0
  480. package/dist/client/review/use-review.js.map +1 -0
  481. package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts.map +1 -1
  482. package/dist/client/rich-markdown-editor/useCollabReconcile.js +11 -6
  483. package/dist/client/rich-markdown-editor/useCollabReconcile.js.map +1 -1
  484. package/dist/client/settings/index.d.ts +1 -1
  485. package/dist/client/settings/index.d.ts.map +1 -1
  486. package/dist/client/settings/index.js +1 -1
  487. package/dist/client/settings/index.js.map +1 -1
  488. package/dist/client/setup-connections/BuilderConnectCard.d.ts +9 -0
  489. package/dist/client/setup-connections/BuilderConnectCard.d.ts.map +1 -0
  490. package/dist/client/setup-connections/BuilderConnectCard.js +25 -0
  491. package/dist/client/setup-connections/BuilderConnectCard.js.map +1 -0
  492. package/dist/client/setup-connections/ProviderReadinessBadge.d.ts +8 -0
  493. package/dist/client/setup-connections/ProviderReadinessBadge.d.ts.map +1 -0
  494. package/dist/client/setup-connections/ProviderReadinessBadge.js +32 -0
  495. package/dist/client/setup-connections/ProviderReadinessBadge.js.map +1 -0
  496. package/dist/client/setup-connections/SetupConnectionsPage.d.ts +17 -0
  497. package/dist/client/setup-connections/SetupConnectionsPage.d.ts.map +1 -0
  498. package/dist/client/setup-connections/SetupConnectionsPage.js +10 -0
  499. package/dist/client/setup-connections/SetupConnectionsPage.js.map +1 -0
  500. package/dist/client/setup-connections/index.d.ts +7 -0
  501. package/dist/client/setup-connections/index.d.ts.map +1 -0
  502. package/dist/client/setup-connections/index.js +7 -0
  503. package/dist/client/setup-connections/index.js.map +1 -0
  504. package/dist/client/sharing/ShareButton.d.ts +4 -4
  505. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  506. package/dist/client/sharing/ShareButton.js +13 -7
  507. package/dist/client/sharing/ShareButton.js.map +1 -1
  508. package/dist/client/sharing/ShareDialog.js +3 -3
  509. package/dist/client/sharing/ShareDialog.js.map +1 -1
  510. package/dist/client/use-action.d.ts +3 -0
  511. package/dist/client/use-action.d.ts.map +1 -1
  512. package/dist/client/use-action.js +34 -3
  513. package/dist/client/use-action.js.map +1 -1
  514. package/dist/client/use-db-sync.d.ts +4 -0
  515. package/dist/client/use-db-sync.d.ts.map +1 -1
  516. package/dist/client/use-db-sync.js +37 -18
  517. package/dist/client/use-db-sync.js.map +1 -1
  518. package/dist/collab/routes.d.ts +1 -1
  519. package/dist/command-navigation/actions.d.ts +25 -0
  520. package/dist/command-navigation/actions.d.ts.map +1 -0
  521. package/dist/command-navigation/actions.js +64 -0
  522. package/dist/command-navigation/actions.js.map +1 -0
  523. package/dist/command-navigation/index.d.ts +4 -0
  524. package/dist/command-navigation/index.d.ts.map +1 -0
  525. package/dist/command-navigation/index.js +4 -0
  526. package/dist/command-navigation/index.js.map +1 -0
  527. package/dist/comments-review/index.d.ts +2 -0
  528. package/dist/comments-review/index.d.ts.map +1 -0
  529. package/dist/comments-review/index.js +2 -0
  530. package/dist/comments-review/index.js.map +1 -0
  531. package/dist/db/create-get-db.d.ts +25 -0
  532. package/dist/db/create-get-db.d.ts.map +1 -1
  533. package/dist/db/create-get-db.js +25 -2
  534. package/dist/db/create-get-db.js.map +1 -1
  535. package/dist/file-upload/builder.d.ts.map +1 -1
  536. package/dist/file-upload/builder.js +18 -2
  537. package/dist/file-upload/builder.js.map +1 -1
  538. package/dist/file-upload/types.d.ts +3 -0
  539. package/dist/file-upload/types.d.ts.map +1 -1
  540. package/dist/file-upload/types.js.map +1 -1
  541. package/dist/history/actions/create-resource-version.d.ts +10 -0
  542. package/dist/history/actions/create-resource-version.d.ts.map +1 -0
  543. package/dist/history/actions/create-resource-version.js +65 -0
  544. package/dist/history/actions/create-resource-version.js.map +1 -0
  545. package/dist/history/actions/get-resource-version.d.ts +10 -0
  546. package/dist/history/actions/get-resource-version.d.ts.map +1 -0
  547. package/dist/history/actions/get-resource-version.js +38 -0
  548. package/dist/history/actions/get-resource-version.js.map +1 -0
  549. package/dist/history/actions/list-resource-history.d.ts +10 -0
  550. package/dist/history/actions/list-resource-history.d.ts.map +1 -0
  551. package/dist/history/actions/list-resource-history.js +45 -0
  552. package/dist/history/actions/list-resource-history.js.map +1 -0
  553. package/dist/history/actions/list-resource-versions.d.ts +10 -0
  554. package/dist/history/actions/list-resource-versions.d.ts.map +1 -0
  555. package/dist/history/actions/list-resource-versions.js +35 -0
  556. package/dist/history/actions/list-resource-versions.js.map +1 -0
  557. package/dist/history/actions/restore-resource-version.d.ts +11 -0
  558. package/dist/history/actions/restore-resource-version.d.ts.map +1 -0
  559. package/dist/history/actions/restore-resource-version.js +59 -0
  560. package/dist/history/actions/restore-resource-version.js.map +1 -0
  561. package/dist/history/index.d.ts +4 -0
  562. package/dist/history/index.d.ts.map +1 -0
  563. package/dist/history/index.js +3 -0
  564. package/dist/history/index.js.map +1 -0
  565. package/dist/history/registry.d.ts +10 -0
  566. package/dist/history/registry.d.ts.map +1 -0
  567. package/dist/history/registry.js +61 -0
  568. package/dist/history/registry.js.map +1 -0
  569. package/dist/history/store.d.ts +34 -0
  570. package/dist/history/store.d.ts.map +1 -0
  571. package/dist/history/store.js +265 -0
  572. package/dist/history/store.js.map +1 -0
  573. package/dist/history/types.d.ts +55 -0
  574. package/dist/history/types.d.ts.map +1 -0
  575. package/dist/history/types.js +2 -0
  576. package/dist/history/types.js.map +1 -0
  577. package/dist/index.d.ts +6 -0
  578. package/dist/index.d.ts.map +1 -1
  579. package/dist/index.js +6 -0
  580. package/dist/index.js.map +1 -1
  581. package/dist/navigation/index.d.ts +53 -0
  582. package/dist/navigation/index.d.ts.map +1 -0
  583. package/dist/navigation/index.js +105 -0
  584. package/dist/navigation/index.js.map +1 -0
  585. package/dist/observability/routes.d.ts +3 -3
  586. package/dist/org/index.d.ts +1 -0
  587. package/dist/org/index.d.ts.map +1 -1
  588. package/dist/org/index.js +1 -0
  589. package/dist/org/index.js.map +1 -1
  590. package/dist/org/permissions.d.ts +7 -0
  591. package/dist/org/permissions.d.ts.map +1 -0
  592. package/dist/org/permissions.js +21 -0
  593. package/dist/org/permissions.js.map +1 -0
  594. package/dist/org-team/index.d.ts +2 -0
  595. package/dist/org-team/index.d.ts.map +1 -0
  596. package/dist/org-team/index.js +2 -0
  597. package/dist/org-team/index.js.map +1 -0
  598. package/dist/private-blob/registry.d.ts.map +1 -1
  599. package/dist/private-blob/registry.js +1 -0
  600. package/dist/private-blob/registry.js.map +1 -1
  601. package/dist/resources/handlers.d.ts +2 -2
  602. package/dist/review/actions/consume-review-feedback.d.ts +9 -0
  603. package/dist/review/actions/consume-review-feedback.d.ts.map +1 -0
  604. package/dist/review/actions/consume-review-feedback.js +29 -0
  605. package/dist/review/actions/consume-review-feedback.js.map +1 -0
  606. package/dist/review/actions/create-review-comment.d.ts +18 -0
  607. package/dist/review/actions/create-review-comment.d.ts.map +1 -0
  608. package/dist/review/actions/create-review-comment.js +81 -0
  609. package/dist/review/actions/create-review-comment.js.map +1 -0
  610. package/dist/review/actions/delete-review-comment.d.ts +10 -0
  611. package/dist/review/actions/delete-review-comment.d.ts.map +1 -0
  612. package/dist/review/actions/delete-review-comment.js +45 -0
  613. package/dist/review/actions/delete-review-comment.js.map +1 -0
  614. package/dist/review/actions/get-review-feedback.d.ts +10 -0
  615. package/dist/review/actions/get-review-feedback.d.ts.map +1 -0
  616. package/dist/review/actions/get-review-feedback.js +45 -0
  617. package/dist/review/actions/get-review-feedback.js.map +1 -0
  618. package/dist/review/actions/list-review-comments.d.ts +13 -0
  619. package/dist/review/actions/list-review-comments.d.ts.map +1 -0
  620. package/dist/review/actions/list-review-comments.js +44 -0
  621. package/dist/review/actions/list-review-comments.js.map +1 -0
  622. package/dist/review/actions/reply-review-comment.d.ts +16 -0
  623. package/dist/review/actions/reply-review-comment.d.ts.map +1 -0
  624. package/dist/review/actions/reply-review-comment.js +84 -0
  625. package/dist/review/actions/reply-review-comment.js.map +1 -0
  626. package/dist/review/actions/resolve-review-thread.d.ts +11 -0
  627. package/dist/review/actions/resolve-review-thread.d.ts.map +1 -0
  628. package/dist/review/actions/resolve-review-thread.js +46 -0
  629. package/dist/review/actions/resolve-review-thread.js.map +1 -0
  630. package/dist/review/actions/set-review-status.d.ts +9 -0
  631. package/dist/review/actions/set-review-status.d.ts.map +1 -0
  632. package/dist/review/actions/set-review-status.js +43 -0
  633. package/dist/review/actions/set-review-status.js.map +1 -0
  634. package/dist/review/index.d.ts +5 -0
  635. package/dist/review/index.d.ts.map +1 -0
  636. package/dist/review/index.js +4 -0
  637. package/dist/review/index.js.map +1 -0
  638. package/dist/review/mentions.d.ts +4 -0
  639. package/dist/review/mentions.d.ts.map +1 -0
  640. package/dist/review/mentions.js +39 -0
  641. package/dist/review/mentions.js.map +1 -0
  642. package/dist/review/registry.d.ts +10 -0
  643. package/dist/review/registry.d.ts.map +1 -0
  644. package/dist/review/registry.js +61 -0
  645. package/dist/review/registry.js.map +1 -0
  646. package/dist/review/store.d.ts +63 -0
  647. package/dist/review/store.d.ts.map +1 -0
  648. package/dist/review/store.js +558 -0
  649. package/dist/review/store.js.map +1 -0
  650. package/dist/review/types.d.ts +77 -0
  651. package/dist/review/types.d.ts.map +1 -0
  652. package/dist/review/types.js +2 -0
  653. package/dist/review/types.js.map +1 -0
  654. package/dist/secrets/routes.d.ts +9 -9
  655. package/dist/server/action-discovery.d.ts.map +1 -1
  656. package/dist/server/action-discovery.js +54 -0
  657. package/dist/server/action-discovery.js.map +1 -1
  658. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  659. package/dist/server/agent-engine-api-key-route.d.ts.map +1 -1
  660. package/dist/server/agent-engine-api-key-route.js +5 -0
  661. package/dist/server/agent-engine-api-key-route.js.map +1 -1
  662. package/dist/server/credential-provider.d.ts +26 -0
  663. package/dist/server/credential-provider.d.ts.map +1 -1
  664. package/dist/server/credential-provider.js +82 -0
  665. package/dist/server/credential-provider.js.map +1 -1
  666. package/dist/server/framework-request-handler.d.ts.map +1 -1
  667. package/dist/server/framework-request-handler.js +37 -1
  668. package/dist/server/framework-request-handler.js.map +1 -1
  669. package/dist/setup-connections/index.d.ts +6 -0
  670. package/dist/setup-connections/index.d.ts.map +1 -0
  671. package/dist/setup-connections/index.js +6 -0
  672. package/dist/setup-connections/index.js.map +1 -0
  673. package/dist/setup-connections/onboarding.d.ts +14 -0
  674. package/dist/setup-connections/onboarding.d.ts.map +1 -0
  675. package/dist/setup-connections/onboarding.js +23 -0
  676. package/dist/setup-connections/onboarding.js.map +1 -0
  677. package/dist/transcription/builder-transcription.d.ts +1 -0
  678. package/dist/transcription/builder-transcription.d.ts.map +1 -1
  679. package/dist/transcription/builder-transcription.js +5 -2
  680. package/dist/transcription/builder-transcription.js.map +1 -1
  681. package/dist/vite/action-types-plugin.d.ts.map +1 -1
  682. package/dist/vite/action-types-plugin.js +52 -0
  683. package/dist/vite/action-types-plugin.js.map +1 -1
  684. package/docs/content/agent-native-toolkit.mdx +87 -80
  685. package/docs/content/locales/ar-SA/agent-native-toolkit.mdx +89 -80
  686. package/docs/content/locales/de-DE/agent-native-toolkit.mdx +89 -80
  687. package/docs/content/locales/es-ES/agent-native-toolkit.mdx +89 -80
  688. package/docs/content/locales/fr-FR/agent-native-toolkit.mdx +89 -80
  689. package/docs/content/locales/hi-IN/agent-native-toolkit.mdx +89 -80
  690. package/docs/content/locales/ja-JP/agent-native-toolkit.mdx +89 -80
  691. package/docs/content/locales/ko-KR/agent-native-toolkit.mdx +89 -80
  692. package/docs/content/locales/pt-BR/agent-native-toolkit.mdx +89 -80
  693. package/docs/content/locales/zh-CN/agent-native-toolkit.mdx +89 -80
  694. package/docs/content/locales/zh-TW/agent-native-toolkit.mdx +89 -80
  695. package/docs/content/toolkit-agent-ux.mdx +43 -0
  696. package/docs/content/toolkit-app-adapters.mdx +9 -0
  697. package/docs/content/toolkit-collaboration-ui.mdx +12 -0
  698. package/docs/content/toolkit-collaboration.mdx +74 -0
  699. package/docs/content/toolkit-command-navigation.mdx +106 -0
  700. package/docs/content/toolkit-comments-review.mdx +98 -0
  701. package/docs/content/toolkit-history.mdx +95 -0
  702. package/docs/content/toolkit-observability.mdx +41 -0
  703. package/docs/content/toolkit-org-team.mdx +80 -0
  704. package/docs/content/toolkit-resources.mdx +57 -0
  705. package/docs/content/toolkit-settings.mdx +65 -0
  706. package/docs/content/toolkit-setup-connections.mdx +109 -0
  707. package/docs/content/toolkit-sharing-ui.mdx +18 -6
  708. package/docs/content/toolkit-sharing.mdx +81 -0
  709. package/docs/content/toolkit-shell-hooks.mdx +9 -0
  710. package/docs/content/toolkit-ui.mdx +9 -0
  711. package/package.json +36 -2
  712. package/corpus/templates/design/app/components/design/inspector/InspectorAiActions.tsx +0 -153
  713. package/corpus/templates/design/app/hooks/useAgentEditRequest.ts +0 -133
  714. package/corpus/templates/design/app/pages/DesignEditor.tsx +0 -22924
@@ -7,6 +7,7 @@ import {
7
7
  } from "@agent-native/core/client";
8
8
  import {
9
9
  IconCode,
10
+ IconChevronDown,
10
11
  IconExternalLink,
11
12
  IconLink,
12
13
  IconMail,
@@ -34,6 +35,11 @@ import {
34
35
  } from "@/components/sharing/share-ui";
35
36
  import { SlackShareHint } from "@/components/sharing/slack-share-hint";
36
37
  import { Button } from "@/components/ui/button";
38
+ import {
39
+ Collapsible,
40
+ CollapsibleContent,
41
+ CollapsibleTrigger,
42
+ } from "@/components/ui/collapsible";
37
43
  import { Dialog, DialogContent, DialogTitle } from "@/components/ui/dialog";
38
44
  import { Input } from "@/components/ui/input";
39
45
  import { Label } from "@/components/ui/label";
@@ -87,7 +93,6 @@ export function ShareRecordingPopover({
87
93
  videoUrl,
88
94
  animatedThumbnailUrl,
89
95
  isLoomRecording = false,
90
- hasPassword = false,
91
96
  children,
92
97
  open,
93
98
  onOpenChange,
@@ -106,7 +111,6 @@ export function ShareRecordingPopover({
106
111
  videoUrl={videoUrl}
107
112
  animatedThumbnailUrl={animatedThumbnailUrl}
108
113
  isLoomRecording={isLoomRecording}
109
- hasPassword={hasPassword}
110
114
  />
111
115
  </PopoverContent>
112
116
  </Popover>
@@ -124,7 +128,6 @@ export function ShareRecordingDialog({
124
128
  videoUrl,
125
129
  animatedThumbnailUrl,
126
130
  isLoomRecording = false,
127
- hasPassword = false,
128
131
  open,
129
132
  onOpenChange,
130
133
  }: ShareRecordingDialogProps) {
@@ -143,7 +146,6 @@ export function ShareRecordingDialog({
143
146
  videoUrl={videoUrl}
144
147
  animatedThumbnailUrl={animatedThumbnailUrl}
145
148
  isLoomRecording={isLoomRecording}
146
- hasPassword={hasPassword}
147
149
  reserveCloseButton
148
150
  />
149
151
  </DialogContent>
@@ -157,7 +159,6 @@ function ShareRecordingContent({
157
159
  videoUrl,
158
160
  animatedThumbnailUrl,
159
161
  isLoomRecording = false,
160
- hasPassword = false,
161
162
  reserveCloseButton = false,
162
163
  }: {
163
164
  recordingId: string;
@@ -165,7 +166,6 @@ function ShareRecordingContent({
165
166
  videoUrl?: string | null;
166
167
  animatedThumbnailUrl?: string | null;
167
168
  isLoomRecording?: boolean;
168
- hasPassword?: boolean;
169
169
  reserveCloseButton?: boolean;
170
170
  }) {
171
171
  const t = useT();
@@ -230,7 +230,6 @@ function ShareRecordingContent({
230
230
  videoUrl={videoUrl}
231
231
  animatedThumbnailUrl={animatedThumbnailUrl}
232
232
  isLoomRecording={isLoomRecording}
233
- hasPassword={hasPassword}
234
233
  />
235
234
  </TabsContent>
236
235
 
@@ -269,7 +268,6 @@ function LinkTab({
269
268
  videoUrl,
270
269
  animatedThumbnailUrl,
271
270
  isLoomRecording: isLoomRecordingProp,
272
- hasPassword,
273
271
  }: {
274
272
  recordingId: string;
275
273
  shareUrl: string;
@@ -278,7 +276,6 @@ function LinkTab({
278
276
  videoUrl?: string | null;
279
277
  animatedThumbnailUrl?: string | null;
280
278
  isLoomRecording?: boolean;
281
- hasPassword: boolean;
282
279
  }) {
283
280
  const t = useT();
284
281
  const { setResourceVisibility, isPending } = useResourceVisibilityMutation(
@@ -299,6 +296,7 @@ function LinkTab({
299
296
  const agentLinkRequestIdRef = useRef(0);
300
297
  const [agentContextUrl, setAgentContextUrl] = useState("");
301
298
  const [agentLinkError, setAgentLinkError] = useState(false);
299
+ const [agentShareOpen, setAgentShareOpen] = useState(false);
302
300
 
303
301
  useEffect(() => {
304
302
  createAgentLinkAsyncRef.current = createAgentLink.mutateAsync;
@@ -333,12 +331,21 @@ function LinkTab({
333
331
  setAgentLinkError(false);
334
332
  if (!sharesLoaded) return;
335
333
 
336
- void loadAgentContextUrl();
334
+ if (!isPublic && agentShareOpen) {
335
+ void loadAgentContextUrl();
336
+ }
337
337
 
338
338
  return () => {
339
339
  agentLinkRequestIdRef.current += 1;
340
340
  };
341
- }, [recordingId, visibility, sharesLoaded, loadAgentContextUrl]);
341
+ }, [
342
+ agentShareOpen,
343
+ isPublic,
344
+ loadAgentContextUrl,
345
+ recordingId,
346
+ sharesLoaded,
347
+ visibility,
348
+ ]);
342
349
 
343
350
  const agentShareDisabled =
344
351
  isPending || createAgentLink.isPending || !agentContextUrl;
@@ -366,41 +373,62 @@ function LinkTab({
366
373
  (and a connect link) instead of leaving it buried in Settings. */}
367
374
  {isPublic ? <SlackShareHint canManage={canManage} /> : null}
368
375
 
369
- <div className="space-y-2">
370
- <CopyField
371
- label={t("shareDialog.shareWithAgents")}
372
- value={agentContextUrl}
373
- disabled={agentShareDisabled}
374
- />
375
- {agentLinkError ? (
376
- <div className="flex items-center justify-between gap-2 rounded-md border border-border bg-muted/40 px-3 py-2">
377
- <p className="text-xs text-muted-foreground">
378
- {t("shareDialog.agentLinkUnavailable")}
379
- </p>
376
+ {!isPublic ? (
377
+ <Collapsible open={agentShareOpen} onOpenChange={setAgentShareOpen}>
378
+ <CollapsibleTrigger asChild>
380
379
  <Button
381
380
  type="button"
382
381
  variant="ghost"
383
- size="sm"
384
- className="h-7"
385
- onClick={() => void loadAgentContextUrl()}
386
- disabled={createAgentLink.isPending}
382
+ className="h-auto w-full justify-between px-0 py-1 text-left hover:bg-transparent"
387
383
  >
388
- {t("shareDialog.retryAgentLink")}
384
+ <span className="min-w-0">
385
+ <span className="block text-xs font-medium text-foreground">
386
+ {t("shareDialog.shareWithAgents")}
387
+ </span>
388
+ <span className="mt-0.5 block text-xs font-normal text-muted-foreground">
389
+ {t("shareDialog.agentTokenDescription")}
390
+ </span>
391
+ </span>
392
+ <IconChevronDown
393
+ className={`h-4 w-4 shrink-0 text-muted-foreground transition-transform ${
394
+ agentShareOpen ? "rotate-180" : ""
395
+ }`}
396
+ aria-hidden
397
+ />
389
398
  </Button>
390
- </div>
391
- ) : null}
392
- </div>
393
-
394
- <CopyField
395
- label={t("shareDialog.copyAgentPrompt")}
396
- value={agentPrompt}
397
- disabled={agentShareDisabled}
398
- />
399
-
400
- {agentContextUrl || hasPassword || !isPublic ? (
401
- <p className="text-xs text-muted-foreground">
402
- {t("shareDialog.agentTokenDescription")}
403
- </p>
399
+ </CollapsibleTrigger>
400
+ <CollapsibleContent className="pt-2">
401
+ <div className="space-y-3 rounded-md border border-border bg-muted/30 p-3">
402
+ <CopyField
403
+ label={t("shareDialog.shareWithAgents")}
404
+ value={agentContextUrl}
405
+ disabled={agentShareDisabled}
406
+ />
407
+ {agentLinkError ? (
408
+ <div className="flex items-center justify-between gap-2 rounded-md border border-border bg-background px-3 py-2">
409
+ <p className="text-xs text-muted-foreground">
410
+ {t("shareDialog.agentLinkUnavailable")}
411
+ </p>
412
+ <Button
413
+ type="button"
414
+ variant="ghost"
415
+ size="sm"
416
+ className="h-7"
417
+ onClick={() => void loadAgentContextUrl()}
418
+ disabled={createAgentLink.isPending}
419
+ >
420
+ {t("shareDialog.retryAgentLink")}
421
+ </Button>
422
+ </div>
423
+ ) : null}
424
+ <CopyField
425
+ label={t("shareDialog.copyAgentPrompt")}
426
+ value={agentPrompt}
427
+ disabled={agentShareDisabled}
428
+ />
429
+ </div>
430
+ </CollapsibleContent>
431
+ </Collapsible>
404
432
  ) : null}
405
433
 
406
434
  {!isPublic && canManage ? (
@@ -464,6 +464,21 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
464
464
  bumpControls();
465
465
  setPlayError(null);
466
466
 
467
+ if (
468
+ initialVisibleFrameSeekedRef.current &&
469
+ !hasPlaybackStarted &&
470
+ (!startMs || startMs <= 0) &&
471
+ v.currentTime > 0.05
472
+ ) {
473
+ try {
474
+ v.currentTime = 0;
475
+ setCurrentMs(0);
476
+ } catch {
477
+ // If the browser refuses the rewind, continue with the normal play
478
+ // attempt; playback is still better than blocking on a cosmetic seek.
479
+ }
480
+ }
481
+
467
482
  // A <video> element left in an error state (network/decode/unsupported
468
483
  // format) will just re-reject on `.play()` forever — it needs `.load()`
469
484
  // to reset `readyState`/`error` and re-fetch the source before playback
@@ -497,7 +512,9 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
497
512
  attachPlayPromise,
498
513
  bumpControls,
499
514
  currentMs,
515
+ hasPlaybackStarted,
500
516
  rejectPlayAttempt,
517
+ startMs,
501
518
  ]);
502
519
 
503
520
  const retryPendingPlay = useCallback(
@@ -858,7 +875,6 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
858
875
  initialVisibleFrameSeekedRef.current = true;
859
876
  try {
860
877
  v.currentTime = visibleMs / 1000;
861
- setCurrentMs(visibleMs);
862
878
  return true;
863
879
  } catch {
864
880
  return false;
@@ -1142,6 +1158,17 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
1142
1158
  const ct =
1143
1159
  Number.isFinite(raw) && raw >= 0 && raw < 1e7 ? raw : 0;
1144
1160
  const ms = Math.floor(ct * 1000);
1161
+ if (
1162
+ initialVisibleFrameSeekedRef.current &&
1163
+ !hasPlaybackStarted &&
1164
+ !playAttemptPendingRef.current &&
1165
+ v.paused &&
1166
+ (!startMs || startMs <= 0)
1167
+ ) {
1168
+ setCurrentMs(0);
1169
+ onTimeUpdate?.(0, resolvedDurationMs);
1170
+ return;
1171
+ }
1145
1172
  const visibleMs = clampSeek(
1146
1173
  skipExcludedRange(ms, excludedRanges, resolvedDurationMs),
1147
1174
  v,
@@ -1169,10 +1196,20 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
1169
1196
  onTimeUpdate?.(ms, resolvedDurationMs);
1170
1197
  }}
1171
1198
  onEnded={() => {
1199
+ const endedMs =
1200
+ resolvedDurationMs > 0
1201
+ ? resolvedDurationMs
1202
+ : videoRef.current &&
1203
+ Number.isFinite(videoRef.current.duration) &&
1204
+ videoRef.current.duration > 0
1205
+ ? Math.round(videoRef.current.duration * 1000)
1206
+ : currentMs;
1207
+ setCurrentMs(endedMs);
1172
1208
  setIsPlaying(false);
1173
1209
  setIsPlayPending(false);
1174
1210
  setIsBuffering(false);
1175
1211
  setIsPreparing(false);
1212
+ onTimeUpdate?.(endedMs, resolvedDurationMs);
1176
1213
  onEnded?.();
1177
1214
  }}
1178
1215
  onError={(e) => {
@@ -1378,6 +1378,23 @@ export class RecorderEngine {
1378
1378
  };
1379
1379
  this.lastFinalizeMeta = finalizeMeta;
1380
1380
 
1381
+ // Stop camera and mic hardware immediately — privacy-sensitive inputs no
1382
+ // longer needed once the final chunk is flushed. The composite and display
1383
+ // streams are intentionally left alive: the caller holds a compositeStream
1384
+ // reference for an unawaited thumbnail capture in screen+camera mode.
1385
+ // Full stream teardown happens in the finally block below.
1386
+ this.cameraLive = false;
1387
+ this.audioMixSources = [];
1388
+ this.audioMixCtx?.close().catch(() => {});
1389
+ this.audioMixCtx = null;
1390
+ for (const s of [this.cameraStream, this.rawCameraStream, this.micStream]) {
1391
+ s?.getTracks().forEach((t) => {
1392
+ try {
1393
+ t.stop();
1394
+ } catch {}
1395
+ });
1396
+ }
1397
+
1381
1398
  // Drain any legacy in-flight chunk uploads before we either compress or
1382
1399
  // upload. New recordings upload after stop(), but keeping this guard makes
1383
1400
  // retry paths resilient while a release rolls out.
@@ -1929,41 +1946,99 @@ export class RecorderEngine {
1929
1946
  // Keep binary uploads comfortably under Netlify's effective function
1930
1947
  // payload limit. This mirrors the local-file upload path in record.tsx.
1931
1948
  const UPLOAD_SLICE_BYTES = 3 * 1024 * 1024;
1949
+ const PARALLELISM = 4;
1932
1950
  const totalSlices = Math.max(1, Math.ceil(blob.size / UPLOAD_SLICE_BYTES));
1933
1951
 
1934
- let lastResult: Record<string, unknown> | undefined;
1935
- for (let i = 0; i < totalSlices; i++) {
1936
- if (signal?.aborted) {
1937
- throw signal.reason instanceof Error
1938
- ? signal.reason
1939
- : new Error("Upload aborted");
1940
- }
1941
-
1952
+ const slices = Array.from({ length: totalSlices }, (_, i) => {
1942
1953
  const start = i * UPLOAD_SLICE_BYTES;
1943
1954
  const end = Math.min(start + UPLOAD_SLICE_BYTES, blob.size);
1944
- const slice = blob.slice(start, end, mimeType);
1945
- const isFinal = i === totalSlices - 1;
1946
- const index = this.chunkIndex++;
1955
+ return {
1956
+ index: this.chunkIndex++,
1957
+ slice: blob.slice(start, end, mimeType),
1958
+ isFinal: i === totalSlices - 1,
1959
+ };
1960
+ });
1961
+ const finalSlice = slices[slices.length - 1];
1962
+ const parallelSlices = slices.slice(0, -1);
1963
+
1964
+ const results = new Array<Record<string, unknown> | undefined>(totalSlices);
1965
+ const queue = parallelSlices.slice();
1966
+ const chunkAbort = new AbortController();
1967
+ if (signal?.aborted) {
1968
+ chunkAbort.abort(signal.reason);
1969
+ } else {
1970
+ signal?.addEventListener("abort", () => chunkAbort.abort(signal.reason), {
1971
+ once: true,
1972
+ });
1973
+ }
1974
+ let uploadError: Error | null = null;
1975
+ let completedCount = 0;
1976
+
1977
+ const worker = async () => {
1978
+ while (queue.length > 0) {
1979
+ if (chunkAbort.signal.aborted) break;
1980
+ const item = queue.shift();
1981
+ if (!item) break;
1982
+ const { index, slice } = item;
1983
+ try {
1984
+ results[index] = await this.uploadChunk(slice, index, {
1985
+ isFinal: false,
1986
+ total: totalSlices,
1987
+ mimeType,
1988
+ signal: chunkAbort.signal,
1989
+ });
1990
+ this.opts.onChunk?.({
1991
+ index: completedCount++,
1992
+ bytes: slice.size,
1993
+ total: totalSlices,
1994
+ });
1995
+ } catch (err) {
1996
+ if (chunkAbort.signal.aborted) return;
1997
+ if (!uploadError) {
1998
+ uploadError = err instanceof Error ? err : new Error(String(err));
1999
+ chunkAbort.abort(uploadError);
2000
+ }
2001
+ return;
2002
+ }
2003
+ }
2004
+ };
2005
+
2006
+ await Promise.all(
2007
+ Array.from(
2008
+ { length: Math.min(PARALLELISM, parallelSlices.length) },
2009
+ worker,
2010
+ ),
2011
+ );
2012
+
2013
+ if (uploadError) throw uploadError;
2014
+ if (signal?.aborted) {
2015
+ throw signal.reason instanceof Error
2016
+ ? signal.reason
2017
+ : new Error("Upload aborted");
2018
+ }
1947
2019
 
1948
- lastResult = await this.uploadChunk(slice, index, {
1949
- isFinal,
2020
+ results[finalSlice.index] = await this.uploadChunk(
2021
+ finalSlice.slice,
2022
+ finalSlice.index,
2023
+ {
2024
+ isFinal: true,
1950
2025
  total: totalSlices,
1951
2026
  mimeType,
1952
- durationMs: isFinal ? meta.durationMs : undefined,
1953
- width: isFinal ? meta.dimensions.width : undefined,
1954
- height: isFinal ? meta.dimensions.height : undefined,
1955
- hasAudio: isFinal ? meta.hasAudio : undefined,
1956
- hasCamera: isFinal ? meta.hasCamera : undefined,
2027
+ durationMs: meta.durationMs,
2028
+ width: meta.dimensions.width,
2029
+ height: meta.dimensions.height,
2030
+ hasAudio: meta.hasAudio,
2031
+ hasCamera: meta.hasCamera,
1957
2032
  signal,
1958
- });
1959
- this.opts.onChunk?.({
1960
- index,
1961
- bytes: slice.size,
1962
- total: totalSlices,
1963
- });
1964
- }
2033
+ },
2034
+ );
2035
+ this.opts.onChunk?.({
2036
+ index: finalSlice.index,
2037
+ bytes: finalSlice.slice.size,
2038
+ total: totalSlices,
2039
+ });
1965
2040
 
1966
- return lastResult;
2041
+ return results[finalSlice.index];
1967
2042
  }
1968
2043
 
1969
2044
  private async uploadChunk(
@@ -2021,7 +2096,9 @@ export class RecorderEngine {
2021
2096
  uploadErr.name === "AbortError"
2022
2097
  ) {
2023
2098
  if (extra.isFinal && uploadErr.name !== "AbortError") {
2024
- const recovered = await this.recoverReadyAfterFinalUploadError();
2099
+ const recovered = await this.recoverReadyAfterFinalUploadError(
2100
+ extra.signal,
2101
+ );
2025
2102
  if (recovered) return recovered;
2026
2103
  }
2027
2104
  throw uploadErr;
@@ -2040,7 +2117,9 @@ export class RecorderEngine {
2040
2117
  if (extra.isFinal && res.status === 504) {
2041
2118
  triedFinalUploadRecovery = true;
2042
2119
  await res.text().catch(() => "");
2043
- const recovered = await this.recoverReadyAfterFinalUploadError();
2120
+ const recovered = await this.recoverReadyAfterFinalUploadError(
2121
+ extra.signal,
2122
+ );
2044
2123
  if (recovered) return recovered;
2045
2124
  break;
2046
2125
  }
@@ -2075,7 +2154,9 @@ export class RecorderEngine {
2075
2154
  !triedFinalUploadRecovery &&
2076
2155
  this.isFinalUploadRecoveryCandidate(res.status, err)
2077
2156
  ) {
2078
- const recovered = await this.recoverReadyAfterFinalUploadError();
2157
+ const recovered = await this.recoverReadyAfterFinalUploadError(
2158
+ extra.signal,
2159
+ );
2079
2160
  if (recovered) return recovered;
2080
2161
  }
2081
2162
  trackClipUploadBlockingFailure({
@@ -2153,14 +2234,14 @@ export class RecorderEngine {
2153
2234
  return !/too large|exceeds.*limit|chunk too large/i.test(error.message);
2154
2235
  }
2155
2236
 
2156
- private async recoverReadyAfterFinalUploadError(): Promise<Record<
2157
- string,
2158
- unknown
2159
- > | null> {
2237
+ private async recoverReadyAfterFinalUploadError(
2238
+ signal?: AbortSignal,
2239
+ ): Promise<Record<string, unknown> | null> {
2160
2240
  return waitForReadyRecordingAfterFinalizeError({
2161
2241
  uploadUrl: this.opts.uploadUrl,
2162
2242
  recordingId: this.opts.recordingId,
2163
2243
  preferAuthenticated: true,
2244
+ signal,
2164
2245
  });
2165
2246
  }
2166
2247
 
@@ -4,11 +4,11 @@ import {
4
4
  useT,
5
5
  } from "@agent-native/core/client";
6
6
  import {
7
- IconBuilding,
8
7
  IconCheck,
9
8
  IconCopy,
10
9
  IconLock,
11
10
  IconTrash,
11
+ IconUsersGroup,
12
12
  IconWorld,
13
13
  } from "@tabler/icons-react";
14
14
  import { useQueryClient } from "@tanstack/react-query";
@@ -55,7 +55,7 @@ export const VIS_META: Record<Visibility, { Icon: typeof IconLock }> = {
55
55
  Icon: IconLock,
56
56
  },
57
57
  org: {
58
- Icon: IconBuilding,
58
+ Icon: IconUsersGroup,
59
59
  },
60
60
  public: {
61
61
  Icon: IconWorld,
@@ -308,7 +308,7 @@ export function Avatar({ label, org }: { label: string; org?: boolean }) {
308
308
  className="inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-muted text-[11px] font-semibold text-muted-foreground"
309
309
  >
310
310
  {org ? (
311
- <IconBuilding size={14} strokeWidth={1.75} />
311
+ <IconUsersGroup size={14} strokeWidth={1.75} />
312
312
  ) : (
313
313
  (label.split("@")[0]?.[0] ?? label[0] ?? "?").toUpperCase()
314
314
  )}
@@ -35,16 +35,11 @@ export function SlackShareHint({ canManage }: { canManage: boolean }) {
35
35
 
36
36
  if (connected) {
37
37
  return (
38
- <div className="flex items-center gap-2.5 rounded-md border border-border bg-muted/40 px-3 py-2">
38
+ <div className="flex items-center gap-2 rounded-md bg-muted/35 px-2.5 py-1.5 text-xs text-muted-foreground">
39
39
  <IconBrandSlack className="h-4 w-4 shrink-0 text-muted-foreground" />
40
- <div className="min-w-0">
41
- <div className="text-xs font-medium">
42
- {t("slackShareHint.playsInline")}
43
- </div>
44
- <p className="text-[11px] text-muted-foreground">
45
- {t("slackShareHint.connectedDescription")}
46
- </p>
47
- </div>
40
+ <span className="min-w-0 truncate">
41
+ {t("slackShareHint.playsInline")}
42
+ </span>
48
43
  </div>
49
44
  );
50
45
  }
@@ -59,18 +54,13 @@ export function SlackShareHint({ canManage }: { canManage: boolean }) {
59
54
  return (
60
55
  <a
61
56
  href={appPath("/settings#slack")}
62
- className="flex items-center gap-2.5 rounded-md border border-border px-3 py-2 transition-colors hover:bg-muted/50"
57
+ className="flex items-center gap-2 rounded-md bg-muted/35 px-2.5 py-1.5 text-xs text-muted-foreground transition-colors hover:bg-muted/55"
63
58
  >
64
59
  <IconBrandSlack className="h-4 w-4 shrink-0 text-muted-foreground" />
65
- <div className="min-w-0 flex-1">
66
- <div className="text-xs font-medium">
67
- {t("slackShareHint.makeInline")}
68
- </div>
69
- <p className="text-[11px] text-muted-foreground">
70
- {t("slackShareHint.connectDescription")}
71
- </p>
72
- </div>
73
- <span className="shrink-0 text-xs font-medium text-primary">
60
+ <span className="min-w-0 flex-1 truncate">
61
+ {t("slackShareHint.makeInline")}
62
+ </span>
63
+ <span className="shrink-0 font-medium text-primary">
74
64
  {t("slackShareHint.connect")}
75
65
  </span>
76
66
  </a>
@@ -1,3 +1,8 @@
1
+ import { useT } from "@agent-native/core/client";
2
+ import { Button } from "@agent-native/toolkit/ui/button";
3
+ import { IconPlayerRecord } from "@tabler/icons-react";
4
+ import { NavLink } from "react-router";
5
+
1
6
  import { LibraryGrid } from "@/components/library/library-grid";
2
7
 
3
8
  const SEO_TITLE =
@@ -18,5 +23,26 @@ export function meta() {
18
23
  }
19
24
 
20
25
  export default function LibraryIndexRoute() {
21
- return <LibraryGrid view="library" folderId={null} title="Library" />;
26
+ const t = useT();
27
+ return (
28
+ <LibraryGrid
29
+ view="library"
30
+ folderId={null}
31
+ title="Library"
32
+ extraActions={
33
+ <Button
34
+ className="gap-1.5 bg-primary text-primary-foreground shadow-sm hover:bg-primary/90"
35
+ size="sm"
36
+ asChild
37
+ >
38
+ <NavLink to="/record" aria-label={t("navigation.newRecording")}>
39
+ <IconPlayerRecord className="h-4 w-4" />
40
+ <span className="hidden sm:inline">
41
+ {t("navigation.newRecording")}
42
+ </span>
43
+ </NavLink>
44
+ </Button>
45
+ }
46
+ />
47
+ );
22
48
  }
@@ -14,6 +14,7 @@ import {
14
14
  BUILDER_CREDITS_UPGRADE_URL,
15
15
  type BuilderCreditsStatus,
16
16
  } from "@shared/builder-credits";
17
+ import { isStoredButUnservableFinalizeError } from "@shared/finalize-recovery";
17
18
  import {
18
19
  isLoomEmbedBackedRecording,
19
20
  isLoomRecordingSource,
@@ -635,6 +636,8 @@ export default function RecordingPage() {
635
636
  const rawFailureReason =
636
637
  ((recording as any).failureReason as string | null | undefined) ?? null;
637
638
  const waitingForStorage = isStorageSetupFailureReason(rawFailureReason);
639
+ const storedButUnservableFailure =
640
+ isStoredButUnservableFinalizeError(rawFailureReason);
638
641
  const loomStorageSetupFailure = waitingForStorage && isLoomRecording;
639
642
  const nativeSaveFailed =
640
643
  searchParams.get("saveFailed") === "1" ||
@@ -646,13 +649,16 @@ export default function RecordingPage() {
646
649
  const isFailure =
647
650
  explicitFailure || stuckFailure || waitingForStorage || nativeSaveFailed;
648
651
  const displayReason = explicitFailure
649
- ? (rawFailureReason ?? t("recordingPage.retryLibrary"))
652
+ ? storedButUnservableFailure
653
+ ? t("recordingPage.clipDataPreserved")
654
+ : (rawFailureReason ?? t("recordingPage.retryLibrary"))
650
655
  : nativeSaveFailed
651
656
  ? nativeSaveFailureMessage(rawFailureReason)
652
657
  : stuckFailure
653
658
  ? t("recordingPage.processingStuck", { status: recording.status })
654
659
  : t("recordingPage.uploadingAssembling");
655
660
  const storageSetupFailure = waitingForStorage;
661
+ const canRetryFinalize = storageSetupFailure || storedButUnservableFailure;
656
662
  const label = storageSetupFailure
657
663
  ? loomStorageSetupFailure
658
664
  ? t("recordingPage.connectStorageImportLoom")
@@ -744,7 +750,7 @@ export default function RecordingPage() {
744
750
  <div className="flex items-center gap-2">
745
751
  <Button
746
752
  onClick={() => {
747
- if (storageSetupFailure) {
753
+ if (canRetryFinalize) {
748
754
  void retryFinalizeAfterStorage();
749
755
  return;
750
756
  }
@@ -755,7 +761,7 @@ export default function RecordingPage() {
755
761
  size="sm"
756
762
  disabled={retryingFinalize}
757
763
  >
758
- {storageSetupFailure
764
+ {canRetryFinalize
759
765
  ? loomStorageSetupFailure
760
766
  ? t("recordingPage.retryImport")
761
767
  : t("recordingPage.retryUpload")