@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
@@ -1,9 +1,5 @@
1
1
  import { defineAction } from "@agent-native/core";
2
2
  import {
3
- hasCollabState,
4
- getText,
5
- applyText,
6
- seedFromText,
7
3
  agentEnterDocument,
8
4
  agentLeaveDocument,
9
5
  agentUpdateSelection,
@@ -13,6 +9,11 @@ import { and, eq } from "drizzle-orm";
13
9
  import { z } from "zod";
14
10
 
15
11
  import { getDb, schema } from "../server/db/index.js";
12
+ import {
13
+ readLiveSourceFile,
14
+ writeInlineSourceFile,
15
+ type SourceWorkspaceFile,
16
+ } from "../server/source-workspace.js";
16
17
  import {
17
18
  applyOneEdit,
18
19
  type ApplyEditsResult,
@@ -225,7 +226,6 @@ export default defineAction({
225
226
  await assertAccess("design", designId, "editor");
226
227
 
227
228
  const db = getDb();
228
- const now = new Date().toISOString();
229
229
  const requestedFileId = fileId?.trim();
230
230
  const targetFilename = requestedFileId
231
231
  ? undefined
@@ -238,7 +238,9 @@ export default defineAction({
238
238
  const [file] = await db
239
239
  .select({
240
240
  id: schema.designFiles.id,
241
+ designId: schema.designFiles.designId,
241
242
  filename: schema.designFiles.filename,
243
+ fileType: schema.designFiles.fileType,
242
244
  content: schema.designFiles.content,
243
245
  })
244
246
  .from(schema.designFiles)
@@ -263,20 +265,26 @@ export default defineAction({
263
265
  );
264
266
  }
265
267
 
266
- // Prefer live collab content so we edit in-flight changes, not a stale
267
- // persisted copy (mirrors get-design-snapshot).
268
- let base = file.content ?? "";
269
- try {
270
- if (await hasCollabState(file.id)) {
271
- // When a collab session exists it is authoritative use its text even
272
- // if empty (a legitimately cleared file), rather than silently editing
273
- // stale stored HTML.
274
- const live = await getText(file.id, "content");
275
- if (typeof live === "string") base = live;
276
- }
277
- } catch {
278
- // Collab read is best-effort; fall back to stored content.
279
- }
268
+ // Read the LIVE base (collab text when present, else the SQL row) right
269
+ // before transforming, and carry its versionHash through to the write
270
+ // below. writeInlineSourceFile re-reads the live text immediately before
271
+ // its own applyText/DB write and rejects if it no longer matches this
272
+ // hash closing the race window where a concurrent editor/agent write
273
+ // lands between this read and the persist (the same stale-diff-base bug
274
+ // fixed for insert-design-native-asset.ts and insert-asset.ts: a diff
275
+ // computed from a stale base, char-diffed into a collab doc that has
276
+ // since moved on, corrupts or drops the other writer's change).
277
+ const workspaceFile: SourceWorkspaceFile = {
278
+ id: file.id,
279
+ designId: file.designId,
280
+ filename: file.filename ?? "",
281
+ fileType: file.fileType ?? "html",
282
+ content: file.content,
283
+ createdAt: null,
284
+ updatedAt: null,
285
+ };
286
+ const live = await readLiveSourceFile(workspaceFile);
287
+ const base = live.content;
280
288
 
281
289
  const resolvedMode =
282
290
  mode ??
@@ -296,8 +304,9 @@ export default defineAction({
296
304
  // rather than a fabricated `[data-edit-target=...]` selector that could
297
305
  // never resolve against the rendered iframe. Region attribution instead
298
306
  // rides on the `{ kind: "text", quote }` recentEdits descriptor that
299
- // `applyText(..., "agent")` auto-publishes from the content diff below —
300
- // clients render a lingering highlight over the changed text.
307
+ // `applyText(..., "agent")` auto-publishes from the content diff inside
308
+ // writeInlineSourceFile below — clients render a lingering highlight
309
+ // over the changed text.
301
310
  agentEnterDocument(file.id);
302
311
  agentUpdateSelection(file.id, {
303
312
  selection: null,
@@ -306,23 +315,12 @@ export default defineAction({
306
315
  });
307
316
 
308
317
  try {
309
- await db
310
- .update(schema.designFiles)
311
- .set({ content: nextContent, updatedAt: now })
312
- .where(eq(schema.designFiles.id, file.id));
313
-
314
- // Push the full new content through the collab layer; it diffs internally
315
- // so live editors get a minimal update.
316
- if (await hasCollabState(file.id)) {
317
- await applyText(file.id, nextContent, "content", "agent");
318
- } else {
319
- await seedFromText(file.id, nextContent);
320
- }
321
-
322
- await db
323
- .update(schema.designs)
324
- .set({ updatedAt: now })
325
- .where(eq(schema.designs.id, designId));
318
+ await writeInlineSourceFile({
319
+ designId: file.designId,
320
+ file: workspaceFile,
321
+ content: nextContent,
322
+ expectedVersionHash: live.versionHash,
323
+ });
326
324
  } finally {
327
325
  agentLeaveDocument(file.id);
328
326
  }
@@ -0,0 +1,87 @@
1
+ import { defineAction } from "@agent-native/core";
2
+ import { completeText } from "@agent-native/core/server";
3
+ import { assertAccess } from "@agent-native/core/sharing";
4
+ import { eq } from "drizzle-orm";
5
+ import { z } from "zod";
6
+
7
+ import { getDb, schema } from "../server/db/index.js";
8
+ import { sanitizeGeneratedDesignTitle } from "../shared/prompt-title.js";
9
+
10
+ const TITLE_SYSTEM_PROMPT =
11
+ "Generate a very short title (2-5 words) for a design/prototype that " +
12
+ "starts from this brief. Title Case, no quotes, no trailing punctuation. " +
13
+ "Return only the title, nothing else.";
14
+
15
+ export default defineAction({
16
+ description:
17
+ "Generate a concise, human-friendly title for a design from its " +
18
+ "generation prompt and save it. Internal plumbing used right after a " +
19
+ "design is created from the prompt box — not a step in the normal " +
20
+ "design-generation flow, so agents should not call this directly.",
21
+ // UI-only plumbing: callable via the frontend action surface, hidden from
22
+ // the agent/MCP/A2A tool lists so it doesn't spend a tool-call slot.
23
+ agentTool: false,
24
+ schema: z.object({
25
+ designId: z.string().describe("Design ID to update"),
26
+ prompt: z.string().describe("The user's original generation prompt"),
27
+ previousTitle: z
28
+ .string()
29
+ .optional()
30
+ .describe(
31
+ "The placeholder title written when the design was created. If the " +
32
+ "design's current title no longer matches this (the user renamed " +
33
+ "it in the meantime), the generated title is discarded.",
34
+ ),
35
+ }),
36
+ run: async ({ designId, prompt, previousTitle }) => {
37
+ await assertAccess("design", designId, "editor");
38
+
39
+ const cleanPrompt = prompt.replace(/\s+/g, " ").trim().slice(0, 2000);
40
+ if (!cleanPrompt) return { updated: false, reason: "empty-prompt" };
41
+
42
+ let generated: string | null = null;
43
+ try {
44
+ const result = await completeText({
45
+ systemPrompt: TITLE_SYSTEM_PROMPT,
46
+ input: cleanPrompt.slice(0, 500),
47
+ maxOutputTokens: 30,
48
+ temperature: 0.3,
49
+ timeoutMs: 15_000,
50
+ });
51
+ generated = sanitizeGeneratedDesignTitle(result.text);
52
+ } catch {
53
+ // Best-effort: the placeholder title (already saved at creation time)
54
+ // stays as-is on any model/engine failure.
55
+ return { updated: false, reason: "generation-failed" };
56
+ }
57
+
58
+ if (!generated) return { updated: false, reason: "empty-result" };
59
+
60
+ const db = getDb();
61
+ const now = new Date().toISOString();
62
+
63
+ // Read-then-write inside one transaction so we only overwrite the
64
+ // placeholder title — never a title the user already changed in the
65
+ // meantime (manual rename racing this background call).
66
+ const outcome = await db.transaction(async (tx) => {
67
+ const [current] = await tx
68
+ .select({ title: schema.designs.title })
69
+ .from(schema.designs)
70
+ .where(eq(schema.designs.id, designId));
71
+
72
+ if (!current) return { updated: false, reason: "not-found" as const };
73
+ if (previousTitle !== undefined && current.title !== previousTitle) {
74
+ return { updated: false, reason: "title-changed" as const };
75
+ }
76
+
77
+ await tx
78
+ .update(schema.designs)
79
+ .set({ title: generated, updatedAt: now })
80
+ .where(eq(schema.designs.id, designId));
81
+
82
+ return { updated: true as const, title: generated };
83
+ });
84
+
85
+ return outcome;
86
+ },
87
+ });
@@ -4,8 +4,6 @@ import {
4
4
  writeAppState,
5
5
  } from "@agent-native/core/application-state";
6
6
  import {
7
- hasCollabState,
8
- applyText,
9
7
  seedFromText,
10
8
  agentEnterDocument,
11
9
  agentLeaveDocument,
@@ -18,6 +16,11 @@ import { nanoid } from "nanoid";
18
16
  import { z } from "zod";
19
17
 
20
18
  import { getDb, schema } from "../server/db/index.js";
19
+ import {
20
+ readLiveSourceFile,
21
+ writeInlineSourceFile,
22
+ type SourceWorkspaceFile,
23
+ } from "../server/source-workspace.js";
21
24
  import {
22
25
  mergeCanvasFramePlacements,
23
26
  type CanvasFramePlacement,
@@ -27,6 +30,7 @@ import {
27
30
  type DesignGenerationSession,
28
31
  updateGenerationSessionWithSavedFiles,
29
32
  } from "../shared/generation-session.js";
33
+ import { annotateScreenHtmlForPersist } from "../shared/screen-annotation.js";
30
34
 
31
35
  /** Editor deep link so external agents can surface "Open design". */
32
36
  function designDeepLink(designId: string): string {
@@ -287,7 +291,16 @@ const generateDesignAction = defineAction({
287
291
 
288
292
  const existingByName = new Map(existingFiles.map((f) => [f.filename, f]));
289
293
 
290
- for (const file of files) {
294
+ // Stamp missing data-agent-native-node-id attributes before persisting so
295
+ // every generated screen is born fully addressable by id-keyed editor
296
+ // operations (move/select/style), instead of depending on a client-side
297
+ // backfill the first time a human opens the screen.
298
+ const annotatedFiles = files.map((file) => ({
299
+ ...file,
300
+ content: annotateScreenHtmlForPersist(file.content, file.fileType),
301
+ }));
302
+
303
+ for (const file of annotatedFiles) {
291
304
  const existing = existingByName.get(file.filename);
292
305
  if (existing) {
293
306
  // Publish agent presence so live editors see "AI is generating" in place.
@@ -298,22 +311,44 @@ const generateDesignAction = defineAction({
298
311
  });
299
312
 
300
313
  try {
301
- // Update existing file
302
- await db
303
- .update(schema.designFiles)
304
- .set({
305
- content: file.content,
306
- fileType: file.fileType ?? "html",
307
- updatedAt: now,
308
- })
309
- .where(eq(schema.designFiles.id, existing.id));
314
+ // `file.content` here is LLM-generated content produced upstream of
315
+ // this action call, so there can be a large async window (the full
316
+ // generation time) between whenever this file's content was last
317
+ // known and this write. Read the LIVE base (collab text when
318
+ // present, else the SQL row) right before persisting and carry its
319
+ // versionHash through to writeInlineSourceFile, which re-reads the
320
+ // live text immediately before its own applyText/DB write and
321
+ // rejects if it no longer matches — closing the race window where a
322
+ // concurrent editor/agent write lands mid-generation. See
323
+ // insert-design-native-asset.ts and insert-asset.ts for the
324
+ // identical pattern.
325
+ const workspaceFile: SourceWorkspaceFile = {
326
+ id: existing.id,
327
+ designId: existing.designId,
328
+ filename: existing.filename ?? "",
329
+ fileType: existing.fileType ?? "html",
330
+ content: existing.content,
331
+ createdAt: null,
332
+ updatedAt: null,
333
+ };
334
+ const live = await readLiveSourceFile(workspaceFile);
335
+
336
+ await writeInlineSourceFile({
337
+ designId: existing.designId,
338
+ file: workspaceFile,
339
+ content: file.content,
340
+ expectedVersionHash: live.versionHash,
341
+ });
310
342
 
311
- // Push content through collab layer for live editors
312
- const collabExists = await hasCollabState(existing.id);
313
- if (collabExists) {
314
- await applyText(existing.id, file.content, "content", "agent");
315
- } else {
316
- await seedFromText(existing.id, file.content);
343
+ // writeInlineSourceFile only persists content/updatedAt; keep
344
+ // fileType in sync separately when the caller changed it (e.g.
345
+ // html -> jsx), matching the original update behavior.
346
+ const nextFileType = file.fileType ?? "html";
347
+ if (nextFileType !== (existing.fileType ?? "html")) {
348
+ await db
349
+ .update(schema.designFiles)
350
+ .set({ fileType: nextFileType, updatedAt: now })
351
+ .where(eq(schema.designFiles.id, existing.id));
317
352
  }
318
353
  } finally {
319
354
  agentLeaveDocument(existing.id);
@@ -6,13 +6,87 @@ import { nanoid } from "nanoid";
6
6
  import { z } from "zod";
7
7
 
8
8
  import "../server/db/index.js";
9
- import { assignRegions } from "../shared/canvas-math.js";
9
+ import {
10
+ type AssignedCanvasRegion,
11
+ DEFAULT_ASSIGNED_REGION_GAP,
12
+ DEFAULT_ASSIGNED_REGION_MAX_COLUMNS,
13
+ } from "../shared/canvas-math.js";
10
14
  import {
11
15
  designGenerationSessionKey,
12
16
  type DesignGenerationFrame,
13
17
  type DesignGenerationSession,
14
18
  } from "../shared/generation-session.js";
15
19
 
20
+ // Mirrors the mobile/tablet/desktop viewport vocabulary already used by
21
+ // present-design-variants.ts's inferVariantSize, so a screen's canvas region
22
+ // matches its intended device instead of every screen defaulting to the same
23
+ // fixed desktop-shaped region regardless of content (B5-10: AI-generated
24
+ // desktop designs were being placed in mobile-width screens because neither
25
+ // this schema nor assignRegions had any per-screen size signal).
26
+ const DEVICE_REGION_SIZE: Record<
27
+ "mobile" | "tablet" | "desktop",
28
+ { width: number; height: number }
29
+ > = {
30
+ mobile: { width: 390, height: 844 },
31
+ tablet: { width: 768, height: 1024 },
32
+ desktop: { width: 1440, height: 1024 },
33
+ };
34
+
35
+ function regionSizeForScreen(screen: {
36
+ deviceType?: "mobile" | "tablet" | "desktop";
37
+ width?: number;
38
+ height?: number;
39
+ }): { width: number; height: number } {
40
+ const base = DEVICE_REGION_SIZE[screen.deviceType ?? "desktop"];
41
+ return {
42
+ width: screen.width && screen.width > 0 ? screen.width : base.width,
43
+ height: screen.height && screen.height > 0 ? screen.height : base.height,
44
+ };
45
+ }
46
+
47
+ /**
48
+ * Pack per-screen-sized regions into rows/columns, matching assignRegions'
49
+ * layout shape (row/column-major, one gap between cells) but sizing each
50
+ * region individually instead of assuming every region is the same fixed
51
+ * size. Row height is the tallest region in that row, mirroring how
52
+ * assignRegions would behave if every item in a row shared one size.
53
+ */
54
+ function assignRegionsForSizes(
55
+ sizes: Array<{ width: number; height: number }>,
56
+ {
57
+ columns,
58
+ gap = DEFAULT_ASSIGNED_REGION_GAP,
59
+ }: { columns: number; gap?: number },
60
+ ): AssignedCanvasRegion[] {
61
+ const regions: AssignedCanvasRegion[] = [];
62
+ let rowY = 0;
63
+
64
+ for (let rowStart = 0; rowStart < sizes.length; rowStart += columns) {
65
+ const row = sizes.slice(rowStart, rowStart + columns);
66
+ let x = 0;
67
+ let rowHeight = 0;
68
+
69
+ row.forEach((size, offset) => {
70
+ const index = rowStart + offset;
71
+ regions.push({
72
+ index,
73
+ row: Math.floor(index / columns),
74
+ column: index % columns,
75
+ x,
76
+ y: rowY,
77
+ width: size.width,
78
+ height: size.height,
79
+ });
80
+ x += size.width + gap;
81
+ rowHeight = Math.max(rowHeight, size.height);
82
+ });
83
+
84
+ rowY += rowHeight + gap;
85
+ }
86
+
87
+ return regions;
88
+ }
89
+
16
90
  const AGENT_NAMES = [
17
91
  "Atlas",
18
92
  "Nova",
@@ -52,6 +126,29 @@ const requestedScreenSchema = z
52
126
  .describe("Target filename for this screen, such as onboarding.html"),
53
127
  role: z.enum(["screen", "variant"]).optional().default("screen"),
54
128
  variantOf: z.string().trim().min(1).optional(),
129
+ deviceType: z
130
+ .enum(["mobile", "tablet", "desktop"])
131
+ .optional()
132
+ .describe(
133
+ "Intended viewport for this screen. Defaults to desktop-sized when " +
134
+ "omitted — pass 'mobile' for phone screens and 'tablet' for iPad-" +
135
+ "width screens so the canvas region matches the content instead of " +
136
+ "always sizing every screen as desktop.",
137
+ ),
138
+ width: z
139
+ .number()
140
+ .positive()
141
+ .optional()
142
+ .describe(
143
+ "Optional explicit canvas region width in px, overriding deviceType.",
144
+ ),
145
+ height: z
146
+ .number()
147
+ .positive()
148
+ .optional()
149
+ .describe(
150
+ "Optional explicit canvas region height in px, overriding deviceType.",
151
+ ),
55
152
  })
56
153
  .superRefine((screen, ctx) => {
57
154
  if (screen.role === "variant" && !screen.variantOf) {
@@ -71,6 +168,10 @@ export default defineAction({
71
168
  "assigns non-overlapping canvas regions and returns per-frame generation " +
72
169
  "instructions including canvasFrame placements. The session state is " +
73
170
  "agent-facing planning state consumed by generate-design and view-screen. " +
171
+ "Pass each screen's deviceType ('mobile', 'tablet', or 'desktop') so its " +
172
+ "canvas region matches the content — a desktop dashboard should not be " +
173
+ "boxed into a 390px mobile-width frame. Defaults to desktop when omitted; " +
174
+ "pass explicit width/height instead for a non-standard viewport. " +
74
175
  "After this action, fan out calls to generate-design for each returned " +
75
176
  "frame, passing the returned canvasFrame values to generate-design so " +
76
177
  "screens appear in the infinite overview canvas.",
@@ -150,9 +251,12 @@ export default defineAction({
150
251
  await assertAccess("design-system", designSystemId, "viewer");
151
252
  }
152
253
 
153
- const regions = assignRegions(screens.length, {
154
- origin: { x: 0, y: 0 },
155
- columns: screens.length <= 3 ? screens.length : 3,
254
+ const regionSizes = screens.map(regionSizeForScreen);
255
+ const regions = assignRegionsForSizes(regionSizes, {
256
+ columns:
257
+ screens.length <= 3
258
+ ? screens.length
259
+ : DEFAULT_ASSIGNED_REGION_MAX_COLUMNS,
156
260
  });
157
261
 
158
262
  const seenFilenames = new Map<string, number>();
@@ -10,8 +10,17 @@ import {
10
10
  hashCss,
11
11
  parse,
12
12
  parseFirstAnimationDurationMs,
13
+ parsePlaybackMode,
14
+ parseTimelineSpanMs,
13
15
  } from "../shared/motion-compiler.js";
14
- import type { MotionTrack } from "../shared/motion-timeline.js";
16
+ import type {
17
+ MotionPlaybackMode,
18
+ MotionTrack,
19
+ } from "../shared/motion-timeline.js";
20
+ import {
21
+ MOTION_DEFAULT_PLAYBACK_MODE,
22
+ readTimelinePlaybackMode,
23
+ } from "../shared/motion-timeline.js";
15
24
 
16
25
  type TimelineSource = "stored" | "recovered-css" | "stored-css-drift";
17
26
 
@@ -22,6 +31,12 @@ interface TimelineResult {
22
31
  filePath: string | null;
23
32
  tracks: unknown;
24
33
  durationMs: number;
34
+ /**
35
+ * Timeline playback mode: from the tracks JSON stamp for stored rows,
36
+ * recovered from animation-iteration-count/direction for CSS-recovered
37
+ * timelines, "once" for timelines that predate the field.
38
+ */
39
+ playbackMode: MotionPlaybackMode;
25
40
  defaultEase: string;
26
41
  compiledHash: string | null;
27
42
  cssHash?: string | null;
@@ -47,6 +62,7 @@ async function readManagedCssForSource(args: {
47
62
  hash: string;
48
63
  tracks: MotionTrack[];
49
64
  durationMs: number | null;
65
+ playbackMode: MotionPlaybackMode | null;
50
66
  } | null> {
51
67
  if (!args.sourceRef) return null;
52
68
 
@@ -88,7 +104,10 @@ async function readManagedCssForSource(args: {
88
104
  css,
89
105
  hash: hashCss(css),
90
106
  tracks,
91
- durationMs: parseFirstAnimationDurationMs(css),
107
+ // Timeline span (max delay + duration) is robust when tracks carry
108
+ // per-track offsets/durations; fall back to the first duration.
109
+ durationMs: parseTimelineSpanMs(css) ?? parseFirstAnimationDurationMs(css),
110
+ playbackMode: parsePlaybackMode(css),
92
111
  };
93
112
  }
94
113
 
@@ -96,10 +115,13 @@ export default defineAction({
96
115
  description:
97
116
  "Read one or all motion timelines for a design. " +
98
117
  "Returns timeline metadata (id, sourceRef, filePath, durationMs, " +
99
- "defaultEase, compiledHash) and the full tracks array (each track has " +
100
- "targetNodeId, property, and keyframes). If sourceRef points at a design " +
101
- "file and the metadata is missing or stale, recovers editable tracks from " +
102
- "the managed <style data-agent-native-motion> block. Read-only.",
118
+ "playbackMode [loop|once|ping-pong], defaultEase, compiledHash) and the " +
119
+ "full tracks array (each track has targetNodeId, property, keyframes " +
120
+ "with per-segment easing incl. spring(...)/linear(...), and optional " +
121
+ "delayMs/durationMs start-offset timing). If sourceRef points at a " +
122
+ "design file and the metadata is missing or stale, recovers editable " +
123
+ "tracks (incl. offsets and playback mode) from the managed " +
124
+ "<style data-agent-native-motion> block. Read-only.",
103
125
  readOnly: true,
104
126
  http: { method: "GET" },
105
127
  schema: z.object({
@@ -151,13 +173,17 @@ export default defineAction({
151
173
  .limit(timelineId ? 1 : 100);
152
174
 
153
175
  const timelines: TimelineResult[] = rows.map((row) => {
176
+ const parsedTracks = parseTrackJson(row.tracks);
154
177
  return {
155
178
  id: row.id,
156
179
  designId: row.designId,
157
180
  sourceRef: row.sourceRef ?? null,
158
181
  filePath: row.filePath ?? null,
159
- tracks: parseTrackJson(row.tracks),
182
+ tracks: parsedTracks,
160
183
  durationMs: row.durationMs,
184
+ playbackMode:
185
+ readTimelinePlaybackMode(parsedTracks) ??
186
+ MOTION_DEFAULT_PLAYBACK_MODE,
161
187
  defaultEase: row.defaultEase,
162
188
  compiledHash: row.compiledHash ?? null,
163
189
  cssHash: null,
@@ -183,6 +209,7 @@ export default defineAction({
183
209
  // Recover the compiled animation-duration instead of inventing a
184
210
  // default the next save would silently persist.
185
211
  durationMs: managedCss.durationMs ?? 1000,
212
+ playbackMode: managedCss.playbackMode ?? MOTION_DEFAULT_PLAYBACK_MODE,
186
213
  defaultEase: "ease",
187
214
  compiledHash: managedCss.hash,
188
215
  cssHash: managedCss.hash,
@@ -197,6 +224,7 @@ export default defineAction({
197
224
  // In the drift case the CSS is the runtime truth — surface its
198
225
  // compiled duration alongside its recovered tracks.
199
226
  durationMs: managedCss.durationMs ?? first.durationMs,
227
+ playbackMode: managedCss.playbackMode ?? first.playbackMode,
200
228
  cssHash: managedCss.hash,
201
229
  source: "stored-css-drift",
202
230
  };
@@ -1,16 +1,15 @@
1
1
  import { defineAction } from "@agent-native/core";
2
2
  import { readAppStateForCurrentTab } from "@agent-native/core/application-state";
3
- import {
4
- hasCollabState,
5
- getText,
6
- applyText,
7
- seedFromText,
8
- } from "@agent-native/core/collab";
9
3
  import { accessFilter, assertAccess } from "@agent-native/core/sharing";
10
4
  import { and, eq } from "drizzle-orm";
11
5
  import { z } from "zod";
12
6
 
13
7
  import { getDb, schema } from "../server/db/index.js";
8
+ import {
9
+ readLiveSourceFile,
10
+ writeInlineSourceFile,
11
+ type SourceWorkspaceFile,
12
+ } from "../server/source-workspace.js";
14
13
 
15
14
  const schemaInput = z.object({
16
15
  assetUrl: z
@@ -355,15 +354,29 @@ export default defineAction({
355
354
  if (!file) throw new Error("No editable HTML design file found.");
356
355
  await assertAccess("design", file.designId, "editor");
357
356
 
358
- let base = file.content ?? "";
359
- try {
360
- if (await hasCollabState(file.id)) {
361
- const live = await getText(file.id, "content");
362
- if (typeof live === "string") base = live;
363
- }
364
- } catch {
365
- // Collab read is best-effort; fall back to stored content.
366
- }
357
+ // Read the LIVE base (collab text when present, else the SQL row) right
358
+ // before transforming, and carry its versionHash through to the write
359
+ // below. writeInlineSourceFile re-reads the live text immediately before
360
+ // its own applyText/DB write and rejects if it no longer matches this
361
+ // hash closing the race window where a concurrent editor/agent write
362
+ // lands between this read and the persist (the same stale-diff-base bug
363
+ // fixed for update-file: a diff computed from a stale base, char-diffed
364
+ // into a collab doc that has since moved on, corrupts or drops the
365
+ // other writer's change). See update-file.ts and apply-source-edit.ts
366
+ // for the identical pattern. writeInlineSourceFile/readLiveSourceFile
367
+ // only ever dereference file.id (and content/filename for the read); the
368
+ // createdAt/updatedAt fields aren't selected above and aren't needed.
369
+ const workspaceFile: SourceWorkspaceFile = {
370
+ id: file.id,
371
+ designId: file.designId,
372
+ filename: file.filename ?? "",
373
+ fileType: file.fileType ?? "html",
374
+ content: file.content,
375
+ createdAt: null,
376
+ updatedAt: null,
377
+ };
378
+ const live = await readLiveSourceFile(workspaceFile);
379
+ const base = live.content;
367
380
 
368
381
  const mode = args.mode ?? "figure";
369
382
  let content: string;
@@ -384,21 +397,13 @@ export default defineAction({
384
397
  insertedNodeId = createInsertedNodeId("asset");
385
398
  content = appendAssetMarkup(base, args, insertedNodeId);
386
399
  }
387
- const now = new Date().toISOString();
388
- await db
389
- .update(schema.designFiles)
390
- .set({ content, updatedAt: now })
391
- .where(eq(schema.designFiles.id, file.id));
392
- await db
393
- .update(schema.designs)
394
- .set({ updatedAt: now })
395
- .where(eq(schema.designs.id, file.designId));
396
400
 
397
- if (await hasCollabState(file.id)) {
398
- await applyText(file.id, content, "content", "agent");
399
- } else {
400
- await seedFromText(file.id, content);
401
- }
401
+ await writeInlineSourceFile({
402
+ designId: file.designId,
403
+ file: workspaceFile,
404
+ content,
405
+ expectedVersionHash: live.versionHash,
406
+ });
402
407
 
403
408
  return {
404
409
  designId: file.designId,