@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
@@ -23,9 +23,20 @@ import {
23
23
  isImageGenerationSetupError,
24
24
  resolveImageModelForRequest,
25
25
  selectReferences,
26
+ type ReferenceForGeneration,
26
27
  } from "../server/lib/generation.js";
27
- import { compositeLogo } from "../server/lib/image-processing.js";
28
+ import {
29
+ applyPresetSkeleton,
30
+ compositeLogo,
31
+ maskFromManualMaskAlpha,
32
+ maskFromPlateAlpha,
33
+ } from "../server/lib/image-processing.js";
28
34
  import { nowIso, parseJson, stringifyJson } from "../server/lib/json.js";
35
+ import {
36
+ clampCutoutAspectRatio,
37
+ normalizePresetSkeletonSpec,
38
+ skeletonUsesCanonicalLogo,
39
+ } from "../server/lib/preset-skeleton.js";
29
40
  import { getObject } from "../server/lib/storage.js";
30
41
  import {
31
42
  ASPECT_RATIOS,
@@ -35,8 +46,11 @@ import {
35
46
  IMAGE_QUALITY_TIERS,
36
47
  IMAGE_SIZES,
37
48
  STYLE_STRENGTHS,
49
+ supportedAspectRatiosForModel,
50
+ type AspectRatio,
38
51
  type ImageCategory,
39
52
  type ImageQualityTier,
53
+ type PresetSkeletonSpec,
40
54
  type StyleBrief,
41
55
  } from "../shared/api.js";
42
56
  import {
@@ -84,7 +98,7 @@ export default defineAction({
84
98
  .enum(ASPECT_RATIOS)
85
99
  .optional()
86
100
  .describe(
87
- "Image aspect ratio. When a presetId is set, omit this — the preset's aspect ratio is used. Pass a value only when there is no preset, or when the user explicitly asks for a ratio different from the preset's.",
101
+ "Image aspect ratio. When a presetId is set, omit this — the preset's aspect ratio is used. Pass a value only when there is no preset, or when the user explicitly asks for a ratio different from the preset's. Note: OpenAI image models support only 1:1, 2:3, and 3:2; gpt-image-1 is used for transparent cutout skeleton subjects, while other ratios (16:9, 9:16, 4:5, 21:9, …) require a Gemini model.",
88
102
  ),
89
103
  imageSize: z
90
104
  .enum(IMAGE_SIZES)
@@ -92,7 +106,12 @@ export default defineAction({
92
106
  .describe(
93
107
  "Output resolution tier. When a presetId is set, omit this — the preset's size is used unless the user explicitly requests a different one.",
94
108
  ),
95
- model: z.enum(IMAGE_MODELS).optional(),
109
+ model: z
110
+ .enum(IMAGE_MODELS)
111
+ .optional()
112
+ .describe(
113
+ "Image model. Omit to use the user's picker default. Gemini models accept any aspectRatio; gpt-image-2 is the normal opaque OpenAI default, while gpt-image-1 is reserved for transparent cutout skeletons. OpenAI image models support ONLY 1:1, 2:3, and 3:2 — do not pair them with other ratios, choose a Gemini model (e.g. gemini-3-pro-image) for those instead.",
114
+ ),
96
115
  tier: z.enum(IMAGE_QUALITY_TIERS).optional(),
97
116
  intent: z.enum(GENERATION_INTENTS).default("generate"),
98
117
  styleStrength: z.enum(STYLE_STRENGTHS).default("balanced"),
@@ -256,25 +275,32 @@ export default defineAction({
256
275
  ...parseJson<StyleBrief>(library.styleBrief, {}),
257
276
  ...parseJson<StyleBrief>(collection?.styleBrief, {}),
258
277
  };
259
- const resolvedAspectRatio = (args.aspectRatio ??
278
+ const presetSettings = parseJson<{
279
+ tier?: ImageQualityTier;
280
+ includeLogo?: boolean;
281
+ skeletonSpec?: unknown;
282
+ }>(preset?.settings, {});
283
+ const skeletonSpec = normalizePresetSkeletonSpec(
284
+ presetSettings.skeletonSpec,
285
+ );
286
+ const isSkeletonCutout = skeletonSpec?.contentMode === "cutout";
287
+ const outputAspectRatio = (args.aspectRatio ??
260
288
  preset?.aspectRatio ??
261
289
  collection?.defaultAspectRatio ??
262
- "16:9") as (typeof ASPECT_RATIOS)[number];
290
+ "16:9") as AspectRatio;
263
291
  const resolvedImageSize = (args.imageSize ??
264
292
  preset?.imageSize ??
265
293
  collection?.defaultImageSize ??
266
294
  "2K") as (typeof IMAGE_SIZES)[number];
267
- const presetSettings = parseJson<{
268
- tier?: ImageQualityTier;
269
- includeLogo?: boolean;
270
- }>(preset?.settings, {});
271
295
  const resolvedTier = args.tier ?? presetSettings.tier;
272
- const resolvedIncludeLogo =
296
+ const requestedIncludeLogo =
273
297
  args.includeLogo ?? presetSettings.includeLogo ?? false;
298
+ const resolvedIncludeLogo =
299
+ requestedIncludeLogo && !skeletonUsesCanonicalLogo(skeletonSpec);
274
300
  const category = (args.categories?.[0] ??
275
301
  preset?.category ??
276
302
  collection?.category) as ImageCategory | undefined;
277
- const resolvedModel = resolveImageModelForRequest({
303
+ const selectedModel = resolveImageModelForRequest({
278
304
  explicitModel: args.model,
279
305
  imageModelDefault,
280
306
  explicitTier: args.tier,
@@ -283,9 +309,65 @@ export default defineAction({
283
309
  presetModel: preset?.model as (typeof IMAGE_MODELS)[number] | undefined,
284
310
  embeddedText: args.embeddedText,
285
311
  }) as (typeof IMAGE_MODELS)[number];
312
+ if (
313
+ isSkeletonCutout &&
314
+ args.model &&
315
+ args.model !== "gpt-image-1" &&
316
+ args.model !== "gpt-image-2"
317
+ ) {
318
+ throw new Error(
319
+ "Cutout skeleton presets require gpt-image-1 for transparent output or gpt-image-2 for mask inpainting. Remove the explicit model override or choose one of those models.",
320
+ );
321
+ }
322
+ const resolvedModel = (
323
+ isSkeletonCutout && selectedModel !== "gpt-image-2"
324
+ ? "gpt-image-1"
325
+ : selectedModel
326
+ ) as (typeof IMAGE_MODELS)[number];
327
+ if (isSkeletonCutout && selectedModel !== resolvedModel) {
328
+ logSkeletonGeneration("model_overridden", {
329
+ presetId: preset?.id,
330
+ selectedModel,
331
+ model: resolvedModel,
332
+ });
333
+ }
286
334
  const resolvedCategories =
287
335
  args.categories ??
288
336
  (preset?.category ? ([preset.category] as any) : undefined);
337
+ const skeletonReferenceExclusionIds =
338
+ skeletonCompositeAssetIds(skeletonSpec);
339
+ const skeletonAssets = skeletonSpec
340
+ ? await loadSkeletonAssets({
341
+ spec: skeletonSpec,
342
+ libraryId: args.libraryId,
343
+ canonicalLogoAssetId: library.canonicalLogoAssetId,
344
+ appendCanonicalLogo:
345
+ resolvedIncludeLogo &&
346
+ !(isSkeletonCutout && resolvedModel === "gpt-image-2"),
347
+ })
348
+ : null;
349
+ const useSkeletonInpaint =
350
+ isSkeletonCutout &&
351
+ Boolean(skeletonAssets?.backgroundAsset) &&
352
+ resolvedModel === "gpt-image-2";
353
+ const resolvedAspectRatio =
354
+ isSkeletonCutout && !useSkeletonInpaint
355
+ ? clampCutoutAspectRatio({
356
+ aspectRatio: outputAspectRatio,
357
+ supported: supportedAspectRatiosForModel("gpt-image-1"),
358
+ })
359
+ : outputAspectRatio;
360
+ if (
361
+ isSkeletonCutout &&
362
+ !useSkeletonInpaint &&
363
+ outputAspectRatio !== resolvedAspectRatio
364
+ ) {
365
+ logSkeletonGeneration("aspect_ratio_clamped", {
366
+ presetId: preset?.id,
367
+ outputAspectRatio,
368
+ subjectAspectRatio: resolvedAspectRatio,
369
+ });
370
+ }
289
371
  const promptForRun = applyPromptTemplate(
290
372
  preset?.promptTemplate,
291
373
  args.prompt,
@@ -302,21 +384,37 @@ export default defineAction({
302
384
  .filter(Boolean)
303
385
  .join("\n")
304
386
  : "";
305
- const references = await selectReferences({
306
- libraryId: args.libraryId,
307
- collectionId: resolvedCollectionId,
308
- categories: resolvedCategories,
309
- referenceAssetIds: args.referenceAssetIds,
310
- sourceAssetId: args.sourceAssetId,
311
- subjectAssetId: args.subjectAssetId,
312
- intent: args.intent,
313
- limit:
387
+ let references: ReferenceForGeneration[];
388
+ if (useSkeletonInpaint) {
389
+ references = await inpaintReferencesForSkeleton(skeletonAssets);
390
+ } else {
391
+ const backgroundPlateReference =
392
+ backgroundPlateReferenceForSkeleton(skeletonAssets);
393
+ const baseReferenceLimit =
314
394
  args.intent !== "restyle" &&
315
395
  preset?.referencePolicy === "explicit" &&
316
396
  !args.referenceAssetIds?.length
317
397
  ? 0
318
- : DEFAULT_GENERATION_REFERENCE_LIMIT,
319
- });
398
+ : DEFAULT_GENERATION_REFERENCE_LIMIT;
399
+ const referenceLimit =
400
+ backgroundPlateReference && baseReferenceLimit > 0
401
+ ? baseReferenceLimit + 1
402
+ : baseReferenceLimit;
403
+ references = await selectReferences({
404
+ libraryId: args.libraryId,
405
+ collectionId: resolvedCollectionId,
406
+ categories: resolvedCategories,
407
+ referenceAssetIds: args.referenceAssetIds,
408
+ excludeAssetIds: skeletonReferenceExclusionIds,
409
+ sourceAssetId: args.sourceAssetId,
410
+ subjectAssetId: args.subjectAssetId,
411
+ intent: args.intent,
412
+ limit: referenceLimit,
413
+ });
414
+ if (backgroundPlateReference) {
415
+ references.unshift(backgroundPlateReference);
416
+ }
417
+ }
320
418
  const compiledPrompt = compilePrompt({
321
419
  libraryTitle: library.title,
322
420
  styleBrief,
@@ -328,6 +426,13 @@ export default defineAction({
328
426
  textPlacement: args.textPlacement,
329
427
  referenceCount: references.length,
330
428
  includeLogo: resolvedIncludeLogo,
429
+ skeletonContentMode: skeletonSpec?.contentMode ?? null,
430
+ hasBackgroundPlate: Boolean(
431
+ isSkeletonCutout &&
432
+ !useSkeletonInpaint &&
433
+ skeletonAssets?.backgroundAsset,
434
+ ),
435
+ skeletonInpaint: useSkeletonInpaint,
331
436
  aspectRatio: resolvedAspectRatio,
332
437
  imageSize: resolvedImageSize,
333
438
  category,
@@ -371,6 +476,10 @@ export default defineAction({
371
476
  imageSize: resolvedImageSize,
372
477
  groundingMode: args.groundingMode,
373
478
  includeLogo: resolvedIncludeLogo,
479
+ requestedIncludeLogo,
480
+ skeletonSpec: skeletonSpec ?? null,
481
+ outputAspectRatio,
482
+ subjectAspectRatio: resolvedAspectRatio,
374
483
  categories: resolvedCategories ?? [],
375
484
  collectionId: resolvedCollectionId ?? null,
376
485
  presetId: preset?.id ?? null,
@@ -394,6 +503,10 @@ export default defineAction({
394
503
  styleStrength: args.styleStrength,
395
504
  tier: resolvedTier,
396
505
  includeLogo: resolvedIncludeLogo,
506
+ requestedIncludeLogo,
507
+ skeletonSpec: skeletonSpec ?? null,
508
+ outputAspectRatio,
509
+ subjectAspectRatio: resolvedAspectRatio,
397
510
  categories: resolvedCategories ?? [],
398
511
  presetId: preset?.id,
399
512
  sessionId: session?.id,
@@ -409,7 +522,7 @@ export default defineAction({
409
522
  prompt: args.prompt,
410
523
  compiledPrompt,
411
524
  model: resolvedModel,
412
- aspectRatio: resolvedAspectRatio,
525
+ aspectRatio: outputAspectRatio,
413
526
  imageSize: resolvedImageSize,
414
527
  groundingMode: args.groundingMode,
415
528
  referenceAssetIds: stringifyJson(references.map((ref) => ref.id)),
@@ -455,8 +568,13 @@ export default defineAction({
455
568
  compiledPrompt,
456
569
  references,
457
570
  model: resolvedModel,
571
+ mode: useSkeletonInpaint ? "edit" : undefined,
458
572
  aspectRatio: resolvedAspectRatio,
459
573
  imageSize: resolvedImageSize,
574
+ background:
575
+ isSkeletonCutout && !useSkeletonInpaint
576
+ ? "transparent"
577
+ : undefined,
460
578
  groundingMode: args.groundingMode,
461
579
  intent: args.intent,
462
580
  styleStrength: args.styleStrength,
@@ -470,7 +588,17 @@ export default defineAction({
470
588
  await deleteAppState("image-generation-setup").catch(() => {});
471
589
  let image = generated.image;
472
590
  let mimeType = generated.mimeType;
473
- if (resolvedIncludeLogo && library.canonicalLogoAssetId) {
591
+ if (skeletonAssets && !useSkeletonInpaint) {
592
+ image = await applyPresetSkeleton({
593
+ subject: image,
594
+ spec: skeletonAssets.spec,
595
+ canvasAspectRatio: outputAspectRatio,
596
+ backgroundAsset: skeletonAssets.backgroundAsset,
597
+ canonicalLogo: skeletonAssets.canonicalLogo,
598
+ foregroundAssets: skeletonAssets.foregroundAssets,
599
+ });
600
+ mimeType = "image/png";
601
+ } else if (resolvedIncludeLogo && library.canonicalLogoAssetId) {
474
602
  const [logo] = await db
475
603
  .select()
476
604
  .from(schema.assets)
@@ -534,7 +662,7 @@ export default defineAction({
534
662
  status: "candidate",
535
663
  prompt: args.prompt,
536
664
  model: generated.model,
537
- aspectRatio: resolvedAspectRatio,
665
+ aspectRatio: outputAspectRatio,
538
666
  imageSize: resolvedImageSize,
539
667
  generationRunId: runId,
540
668
  metadata: {
@@ -547,6 +675,10 @@ export default defineAction({
547
675
  styleStrength: args.styleStrength,
548
676
  tier: resolvedTier,
549
677
  includeLogo: resolvedIncludeLogo,
678
+ requestedIncludeLogo,
679
+ skeletonSpec: skeletonSpec ?? null,
680
+ outputAspectRatio,
681
+ subjectAspectRatio: resolvedAspectRatio,
550
682
  presetId: preset?.id,
551
683
  sessionId: session?.id,
552
684
  generated: true,
@@ -592,6 +724,10 @@ export default defineAction({
592
724
  styleStrength: args.styleStrength,
593
725
  tier: resolvedTier,
594
726
  includeLogo: resolvedIncludeLogo,
727
+ requestedIncludeLogo,
728
+ skeletonSpec: skeletonSpec ?? null,
729
+ outputAspectRatio,
730
+ subjectAspectRatio: resolvedAspectRatio,
595
731
  categories: resolvedCategories ?? [],
596
732
  referenceSelection,
597
733
  settingsUsed,
@@ -667,3 +803,184 @@ export default defineAction({
667
803
  }
668
804
  },
669
805
  });
806
+
807
+ function skeletonCompositeAssetIds(
808
+ spec: PresetSkeletonSpec | null,
809
+ ): string[] | undefined {
810
+ if (!spec) return undefined;
811
+ const ids = new Set<string>();
812
+ if (spec.background.type === "asset") ids.add(spec.background.assetId);
813
+ if (spec.mask?.type === "asset") ids.add(spec.mask.assetId);
814
+ for (const layer of spec.foreground ?? []) {
815
+ if (layer.source !== "canonicalLogo") ids.add(layer.source.assetId);
816
+ }
817
+ return ids.size ? [...ids] : undefined;
818
+ }
819
+
820
+ function backgroundPlateReferenceForSkeleton(
821
+ skeletonAssets: LoadedSkeletonAssets | null,
822
+ ): ReferenceForGeneration | null {
823
+ if (
824
+ !skeletonAssets?.backgroundAsset ||
825
+ !skeletonAssets.backgroundAssetId ||
826
+ !skeletonAssets.backgroundMimeType
827
+ ) {
828
+ return null;
829
+ }
830
+ return {
831
+ id: skeletonAssets.backgroundAssetId,
832
+ role: "background_reference",
833
+ category: "skeleton",
834
+ mimeType: skeletonAssets.backgroundMimeType,
835
+ data: skeletonAssets.backgroundAsset.toString("base64"),
836
+ selectionReason: "explicit",
837
+ };
838
+ }
839
+
840
+ async function inpaintReferencesForSkeleton(
841
+ skeletonAssets: LoadedSkeletonAssets | null,
842
+ ): Promise<ReferenceForGeneration[]> {
843
+ if (
844
+ !skeletonAssets?.backgroundAsset ||
845
+ !skeletonAssets.backgroundAssetId ||
846
+ !skeletonAssets.backgroundMimeType
847
+ ) {
848
+ throw new Error("Skeleton inpainting requires a background plate image.");
849
+ }
850
+ const mask = skeletonAssets.maskAsset
851
+ ? await maskFromManualMaskAlpha({
852
+ mask: skeletonAssets.maskAsset,
853
+ plate: skeletonAssets.backgroundAsset,
854
+ })
855
+ : await maskFromPlateAlpha(skeletonAssets.backgroundAsset);
856
+ return [
857
+ {
858
+ id: skeletonAssets.backgroundAssetId,
859
+ role: "edit_target",
860
+ category: "skeleton",
861
+ mimeType: skeletonAssets.backgroundMimeType,
862
+ data: skeletonAssets.backgroundAsset.toString("base64"),
863
+ selectionReason: "explicit",
864
+ },
865
+ {
866
+ id:
867
+ skeletonAssets.maskAssetId ??
868
+ `${skeletonAssets.backgroundAssetId}:mask`,
869
+ role: "mask",
870
+ category: "skeleton",
871
+ mimeType: "image/png",
872
+ data: mask.toString("base64"),
873
+ selectionReason: "explicit",
874
+ },
875
+ ];
876
+ }
877
+
878
+ type LoadedSkeletonAssets = {
879
+ spec: PresetSkeletonSpec;
880
+ backgroundAssetId?: string;
881
+ backgroundMimeType?: string;
882
+ backgroundAsset?: Buffer;
883
+ maskAssetId?: string;
884
+ maskAsset?: Buffer;
885
+ canonicalLogo?: Buffer;
886
+ foregroundAssets: Record<string, Buffer>;
887
+ };
888
+
889
+ async function loadSkeletonAssets(input: {
890
+ spec: PresetSkeletonSpec;
891
+ libraryId: string;
892
+ canonicalLogoAssetId?: string | null;
893
+ appendCanonicalLogo: boolean;
894
+ }): Promise<LoadedSkeletonAssets> {
895
+ const db = getDb();
896
+ const spec = appendCanonicalLogoToSkeleton(
897
+ input.spec,
898
+ input.appendCanonicalLogo,
899
+ );
900
+ const assetIds = new Set<string>();
901
+ if (spec.background.type === "asset") assetIds.add(spec.background.assetId);
902
+ if (spec.mask?.type === "asset") assetIds.add(spec.mask.assetId);
903
+ for (const layer of spec.foreground ?? []) {
904
+ if (layer.source !== "canonicalLogo") assetIds.add(layer.source.assetId);
905
+ }
906
+ if (input.canonicalLogoAssetId) assetIds.add(input.canonicalLogoAssetId);
907
+
908
+ const buffers = new Map<string, Buffer>();
909
+ const mimeTypes = new Map<string, string>();
910
+ for (const assetId of assetIds) {
911
+ const [asset] = await db
912
+ .select()
913
+ .from(schema.assets)
914
+ .where(eq(schema.assets.id, assetId))
915
+ .limit(1);
916
+ if (!asset) {
917
+ if (assetId === input.canonicalLogoAssetId) continue;
918
+ throw new Error("Skeleton asset not found.");
919
+ }
920
+ if (asset.libraryId !== input.libraryId) {
921
+ throw new Error("Skeleton assets must belong to the selected brand kit.");
922
+ }
923
+ if (!asset.mimeType.startsWith("image/")) {
924
+ throw new Error("Skeleton assets must be images.");
925
+ }
926
+ buffers.set(assetId, await getObject(asset.objectKey));
927
+ mimeTypes.set(assetId, asset.mimeType);
928
+ }
929
+
930
+ const foregroundAssets: Record<string, Buffer> = {};
931
+ for (const layer of spec.foreground ?? []) {
932
+ if (layer.source !== "canonicalLogo") {
933
+ const buffer = buffers.get(layer.source.assetId);
934
+ if (buffer) foregroundAssets[layer.source.assetId] = buffer;
935
+ }
936
+ }
937
+
938
+ return {
939
+ spec,
940
+ backgroundAssetId:
941
+ spec.background.type === "asset" ? spec.background.assetId : undefined,
942
+ backgroundMimeType:
943
+ spec.background.type === "asset"
944
+ ? mimeTypes.get(spec.background.assetId)
945
+ : undefined,
946
+ backgroundAsset:
947
+ spec.background.type === "asset"
948
+ ? buffers.get(spec.background.assetId)
949
+ : undefined,
950
+ maskAssetId: spec.mask?.type === "asset" ? spec.mask.assetId : undefined,
951
+ maskAsset:
952
+ spec.mask?.type === "asset" ? buffers.get(spec.mask.assetId) : undefined,
953
+ canonicalLogo: input.canonicalLogoAssetId
954
+ ? buffers.get(input.canonicalLogoAssetId)
955
+ : undefined,
956
+ foregroundAssets,
957
+ };
958
+ }
959
+
960
+ function appendCanonicalLogoToSkeleton(
961
+ spec: PresetSkeletonSpec,
962
+ appendCanonicalLogo: boolean,
963
+ ): PresetSkeletonSpec {
964
+ if (!appendCanonicalLogo || skeletonUsesCanonicalLogo(spec)) return spec;
965
+ return {
966
+ ...spec,
967
+ foreground: [
968
+ ...(spec.foreground ?? []),
969
+ { source: "canonicalLogo", x: 0.805, y: 0.06, w: 0.16 },
970
+ ],
971
+ };
972
+ }
973
+
974
+ function logSkeletonGeneration(
975
+ event: string,
976
+ fields: Record<string, unknown>,
977
+ ): void {
978
+ if (process.env.NODE_ENV === "test") return;
979
+ const detail = Object.entries(fields)
980
+ .filter(([, value]) => value !== undefined)
981
+ .map(([key, value]) => `${key}=${value}`)
982
+ .join(" ");
983
+ console.info(
984
+ `[assets] preset-skeleton ${event}${detail ? ` ${detail}` : ""}`,
985
+ );
986
+ }
@@ -4,7 +4,7 @@ import { z } from "zod";
4
4
 
5
5
  import { getDb, schema } from "../server/db/index.js";
6
6
  import {
7
- requireLibrary,
7
+ requireLibraryAccess,
8
8
  serializeAssets,
9
9
  serializeGenerationRun,
10
10
  serializeLibrary,
@@ -19,7 +19,8 @@ export default defineAction({
19
19
  http: { method: "GET" },
20
20
  readOnly: true,
21
21
  run: async ({ id }, ctx) => {
22
- const library = await requireLibrary(id, ctx);
22
+ const access = await requireLibraryAccess(id, ctx);
23
+ const library = access.resource;
23
24
  const db = getDb();
24
25
  const [collections, folders, assets, runs] = await Promise.all([
25
26
  db
@@ -42,7 +43,7 @@ export default defineAction({
42
43
  .orderBy(desc(schema.assetGenerationRuns.createdAt)),
43
44
  ]);
44
45
  return {
45
- library: serializeLibrary(library),
46
+ library: serializeLibrary({ ...library, accessRole: access.role }),
46
47
  collections,
47
48
  folders,
48
49
  assets: serializeAssets(assets),
@@ -4,7 +4,7 @@ import { z } from "zod";
4
4
 
5
5
  export default defineAction({
6
6
  description:
7
- "Navigate the Assets UI. Views (internal keys, with the surface they open): create, picker (the embedded image Library picker), libraries (the unified Library workspace), library (a single Brand Kit inside Library), asset, generation-session, generation-run, extensions, audit, settings. Use threadId to open a specific create/chat thread; use libraryId, assetId, sessionId, runId, or extensionId where appropriate.",
7
+ "Navigate the Assets UI. Views (internal keys, with the surface they open): create, picker (the embedded image Library picker), libraries (the unified Library workspace), library (a single Brand Kit inside Library), preset (a generation preset editor), asset, generation-session, generation-run, extensions, audit, settings. Use threadId to open a specific create/chat thread; use libraryId, presetId, assetId, sessionId, runId, or extensionId where appropriate.",
8
8
  schema: z.object({
9
9
  view: z
10
10
  .enum([
@@ -12,6 +12,7 @@ export default defineAction({
12
12
  "picker",
13
13
  "libraries",
14
14
  "library",
15
+ "preset",
15
16
  "asset",
16
17
  "image",
17
18
  "generation-session",
@@ -9,7 +9,11 @@ import { completeVideoGenerationRun } from "../server/lib/video-runs.js";
9
9
  import { serializeAsset, serializeGenerationRun } from "./_helpers.js";
10
10
  import { upsertVariantSlot } from "./variant-slots.js";
11
11
 
12
- const STALE_IMAGE_RUN_MS = 2 * 60 * 1000;
12
+ // Must stay comfortably above the managed generation budget: the default 300s
13
+ // request window plus up to ~4 minutes of idempotent in-flight polling. Otherwise
14
+ // a slow but healthy run can get prematurely declared "interrupted" before the
15
+ // finished image lands and flips it back to ready.
16
+ const STALE_IMAGE_RUN_MS = 10 * 60 * 1000;
13
17
  const INTERRUPTED_IMAGE_RUN_ERROR =
14
18
  "Image generation was interrupted before a preview was created. Start a new generation to retry.";
15
19
 
@@ -27,6 +27,7 @@ export default defineAction({
27
27
  "product_reference",
28
28
  "diagram_reference",
29
29
  "video_reference",
30
+ "background_reference",
30
31
  "subject_reference",
31
32
  "edit_target",
32
33
  "generated",
@@ -12,7 +12,9 @@ import {
12
12
  IMAGE_MODELS,
13
13
  IMAGE_SIZES,
14
14
  } from "../shared/api.js";
15
+ import { generationPresetSettingsSchema } from "./_generation-preset-settings.js";
15
16
  import { serializeGenerationPreset } from "./_helpers.js";
17
+ import { assertPresetSkeletonAssetsValid } from "./_preset-skeleton-validation.js";
16
18
 
17
19
  export default defineAction({
18
20
  description:
@@ -35,7 +37,7 @@ export default defineAction({
35
37
  .describe(
36
38
  "When true, images generated with this preset composite the library's canonical logo (no-op if the library has no canonical logo).",
37
39
  ),
38
- settings: z.record(z.string(), z.unknown()).optional(),
40
+ settings: generationPresetSettingsSchema.optional(),
39
41
  sortOrder: z.coerce.number().optional(),
40
42
  }),
41
43
  run: async ({ id, ...args }) => {
@@ -81,6 +83,11 @@ export default defineAction({
81
83
  if (args.includeLogo !== undefined) {
82
84
  nextSettings.includeLogo = args.includeLogo;
83
85
  }
86
+ await assertPresetSkeletonAssetsValid({
87
+ db,
88
+ libraryId: preset.libraryId,
89
+ settings: nextSettings,
90
+ });
84
91
  updates.settings = stringifyJson(nextSettings);
85
92
  }
86
93
  await db
@@ -56,7 +56,7 @@ export default defineAction({
56
56
  getLibrary.run({ id: nav.libraryId }, ctx),
57
57
  );
58
58
  if (library) {
59
- await Promise.all([
59
+ const [generationPresets] = await Promise.all([
60
60
  readPart("generationPresets", () =>
61
61
  listGenerationPresets.run(
62
62
  {
@@ -75,6 +75,13 @@ export default defineAction({
75
75
  ),
76
76
  ),
77
77
  ]);
78
+ if (nav?.presetId && generationPresets) {
79
+ const presets = Array.isArray((generationPresets as any).presets)
80
+ ? (generationPresets as any).presets
81
+ : [];
82
+ screen.generationPreset =
83
+ presets.find((preset: any) => preset.id === nav.presetId) ?? null;
84
+ }
78
85
  }
79
86
  }
80
87
  if (nav?.assetId) {
@@ -38,6 +38,14 @@ function variantStateKey(threadId: string | null) {
38
38
  return threadId ? `asset-variants:${threadId}` : "asset-variants";
39
39
  }
40
40
 
41
+ // Only reconcile a still-pending slot once it is old enough that the run cannot
42
+ // plausibly still be generating. Keep this above the server generation budget
43
+ // (IMAGE_GENERATION_REQUEST_TIMEOUT_MS, default 300s) and in step with
44
+ // STALE_IMAGE_RUN_MS in refresh-generation-run, so a slow-but-healthy run (e.g.
45
+ // gpt-image-2) is not flagged "interrupted" and flipped to an error slot before
46
+ // its finished image arrives.
47
+ const STALE_PENDING_RUN_MS = 6 * 60 * 1000;
48
+
41
49
  function slotTime(slot: AssetVariantState["slots"][number]): number {
42
50
  const raw = slot.createdAt ?? slot.updatedAt ?? "";
43
51
  const time = Date.parse(raw);
@@ -51,7 +59,7 @@ function stalePendingRunId(
51
59
  if (!slot.runId) return null;
52
60
  const timestamp = slotTime(slot);
53
61
  if (!timestamp) return null;
54
- return Date.now() - timestamp >= 2 * 60 * 1000 ? slot.runId : null;
62
+ return Date.now() - timestamp >= STALE_PENDING_RUN_MS ? slot.runId : null;
55
63
  }
56
64
 
57
65
  export function GenerationResults({ threadId }: { threadId: string | null }) {
@@ -22,6 +22,7 @@ const IMAGE_MODEL_OPTIONS = [
22
22
  descriptorKey: "create.modelFast",
23
23
  },
24
24
  { value: "gemini-2.5-flash-image", modelName: "Gemini 2.5 Flash" },
25
+ { value: "gpt-image-2", modelName: "GPT Image 2" },
25
26
  ] as const;
26
27
 
27
28
  export function useImageModelMenu() {
@@ -38,6 +38,14 @@ function navigationFromPath(pathname: string, search = "") {
38
38
  threadId: decodePathParam(chat[1]),
39
39
  };
40
40
  }
41
+ const preset = pathname.match(/^\/brand-kits\/([^/]+)\/presets\/([^/]+)/);
42
+ if (preset) {
43
+ return {
44
+ view: "preset",
45
+ libraryId: decodePathParam(preset[1]),
46
+ presetId: decodePathParam(preset[2]),
47
+ };
48
+ }
41
49
  // The "library" view is the unified Library workspace. Keep the internal
42
50
  // detail key stable for agent/MCP callers that already navigate by brand-kit
43
51
  // id, while the URL is now /library/:id.
@@ -113,6 +121,9 @@ function pathFromCommand(command: any): string | null {
113
121
  const query = params.toString();
114
122
  return `/library/${command.libraryId}${query ? `?${query}` : ""}`;
115
123
  }
124
+ if (command.view === "preset" && command.libraryId && command.presetId) {
125
+ return `/brand-kits/${encodeURIComponent(command.libraryId)}/presets/${encodeURIComponent(command.presetId)}`;
126
+ }
116
127
  if (
117
128
  (command.view === "asset" || command.view === "image") &&
118
129
  command.assetId