@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
@@ -9,21 +9,35 @@
9
9
  * { type: 'motion-load-tracks', tracks: Array<{
10
10
  * targetNodeId: string,
11
11
  * property: string,
12
- * keyframes: Array<{ t: number, value: string, ease?: string }>
13
- * }>, defaultEase?: string }
14
- * Load (or replace) the track list. t [0, 1]. defaultEase is the
15
- * timeline-level fallback easing applied to any keyframe that omits its
16
- * own `ease` (mirrors the compiled stylesheet); defaults to "ease".
12
+ * keyframes: Array<{ t: number, value: string, ease?: string }>,
13
+ * delayMs?: number, // track start offset within the timeline
14
+ * durationMs?: number // per-track span; omitted = whole timeline
15
+ * }>, defaultEase?: string, durationMs?: number }
16
+ * Load (or replace) the track list. Keyframe t ∈ [0, 1] is normalised to
17
+ * the TRACK's own span. defaultEase is the timeline-level fallback easing
18
+ * applied to any keyframe that omits its own `ease` (mirrors the compiled
19
+ * stylesheet); defaults to "ease". durationMs is the timeline duration,
20
+ * needed to map offset tracks; also refreshed by each motion-preview tick.
17
21
  *
18
22
  * { type: 'motion-preview', t, durationMs }
19
- * Seek all loaded tracks to normalised position t ∈ [0, 1] and apply
20
- * interpolated CSS property values as inline styles on the matching
21
- * [data-agent-native-node-id="…"] elements. Never writes to storage.
23
+ * Seek all loaded tracks to normalised TIMELINE position t ∈ [0, 1] and
24
+ * apply interpolated CSS property values as inline styles on the matching
25
+ * [data-agent-native-node-id="…"] elements. Tracks with delayMs /
26
+ * durationMs map the timeline time into their own span, clamping outside
27
+ * it (animation-fill-mode: both semantics). Never writes to storage.
22
28
  *
23
29
  * { type: 'motion-preview-clear' }
24
30
  * Remove all motion-preview inline-style overrides and the in-memory
25
31
  * track list. Called when the dock is closed or the timeline is discarded.
26
32
  *
33
+ * Easing parity: per-segment easing reads the ease of the keyframe LEAVING
34
+ * each interval (CSS keyframe semantics — equivalently, Figma's easing INTO
35
+ * the next keyframe). Supported forms: CSS keywords, cubic-bezier(...),
36
+ * steps(...), CSS linear(...) stop lists, and real spring physics via
37
+ * spring(bounce[, settle]) tokens — keep the samplers in sync with
38
+ * shared/motion-easing.ts. Playback modes (loop/once/ping-pong) live in the
39
+ * MotionDock's rAF driver, which shapes the `t` values it sends here.
40
+ *
27
41
  * Rules:
28
42
  * • No import/require of any module (DOM globals only).
29
43
  * • No references to outer/module scope (the code runs inside an iframe).
@@ -35,12 +49,19 @@
35
49
  targetNodeId: string;
36
50
  property: string;
37
51
  keyframes: Array<{ t: number; value: string; ease?: string }>;
52
+ delayMs?: number;
53
+ durationMs?: number;
38
54
  }> = [];
39
55
  // Timeline-level default easing sent alongside the tracks. Applied to any
40
56
  // keyframe that omits its own `ease`, matching the compiled stylesheet's
41
57
  // defaultEase fallback so scrub/playback preview equals the persisted CSS.
42
58
  // Falls back to "ease" when the loader doesn't provide one.
43
59
  var loadedDefaultEase = "ease";
60
+ // Timeline duration in ms, needed to map timeline time into the local span
61
+ // of tracks that carry delayMs / durationMs offsets. Provided by
62
+ // 'motion-load-tracks' and refreshed by every 'motion-preview' tick; when
63
+ // unknown, offset-free tracks still preview correctly (local t = t).
64
+ var loadedTimelineDurationMs: number | null = null;
44
65
  // Map of nodeId -> [property, ...] we have touched, for cleanup.
45
66
  var touchedProps: Record<string, string[]> = {};
46
67
  // Map of nodeId -> property -> original inline style value.
@@ -348,13 +369,131 @@
348
369
  );
349
370
  }
350
371
  }
351
- // Spring approximation: gentle overshoot bezier.
372
+ // Real spring physics: spring(bounce[, settle]) tokens sampled from a
373
+ // damped oscillator. Keep in sync with shared/motion-easing.ts.
352
374
  if (raw.indexOf("spring") === 0) {
353
- return cubicBezierY(0.34, 1.56, 0.64, 1, clamped);
375
+ var spr = parseSpringEase(raw);
376
+ if (spr) return sampleSpringAt(spr[0], spr[1], clamped);
377
+ return clamped;
378
+ }
379
+ // CSS linear(...) stop lists (compiled springs / recovered timelines).
380
+ if (raw.indexOf("linear(") === 0) {
381
+ var lin = evalCssLinear(raw, clamped);
382
+ if (lin !== null) return lin;
354
383
  }
355
384
  return clamped;
356
385
  }
357
386
 
387
+ // Parse spring(bounce[, settle]) or the bare `spring` keyword into
388
+ // [bounce, settle], or null. Mirror of shared/motion-easing.ts.
389
+ function parseSpringEase(raw: string): [number, number] | null {
390
+ if (/^spring$/.test(raw)) return [0.25, 1];
391
+ var m = /^spring\(\s*([+-]?[\d.]+)\s*(?:,\s*([+-]?[\d.]+)\s*)?\)$/.exec(
392
+ raw,
393
+ );
394
+ if (!m) return null;
395
+ var bounce = parseFloat(m[1]);
396
+ if (!Number.isFinite(bounce)) return null;
397
+ var settle = m[2] === undefined ? 1 : parseFloat(m[2]);
398
+ if (!Number.isFinite(settle)) return null;
399
+ if (settle < 0.05) settle = 0.05;
400
+ if (settle > 1) settle = 1;
401
+ return [clamp01(bounce), settle];
402
+ }
403
+
404
+ // Damped-oscillator sampler. Mirror of sampleSpring in
405
+ // shared/motion-easing.ts — keep the two in sync.
406
+ function sampleSpringAt(bounce: number, settle: number, x: number): number {
407
+ if (x <= 0) return 0;
408
+ var u = x / settle;
409
+ if (u >= 1) return 1;
410
+ var zeta = 1 - clamp01(bounce);
411
+ if (zeta < 0.02) zeta = 0.02;
412
+ if (zeta > 1) zeta = 1;
413
+ var omega = Math.log(1 / 0.001) / zeta;
414
+ if (zeta >= 1) {
415
+ return 1 - Math.exp(-omega * u) * (1 + omega * u);
416
+ }
417
+ var omegaD = omega * Math.sqrt(1 - zeta * zeta);
418
+ var decay = Math.exp(-zeta * omega * u);
419
+ return (
420
+ 1 -
421
+ decay *
422
+ (Math.cos(omegaD * u) +
423
+ ((zeta * omega) / omegaD) * Math.sin(omegaD * u))
424
+ );
425
+ }
426
+
427
+ // Evaluate a CSS linear(value <percent>{0,2}, ...) timing function at
428
+ // progress x. Mirror of evaluateCssLinear in shared/motion-easing.ts.
429
+ function evalCssLinear(raw: string, x: number): number | null {
430
+ var m = /^linear\(([^)]*)\)$/.exec(raw);
431
+ if (!m) return null;
432
+ var entries = m[1].split(",");
433
+ var values: number[] = [];
434
+ var positions: Array<number | null> = [];
435
+ for (var i = 0; i < entries.length; i++) {
436
+ var entry = entries[i].trim();
437
+ if (!entry) continue;
438
+ var parts = entry.split(/\s+/);
439
+ var value = parseFloat(parts[0]);
440
+ if (!Number.isFinite(value)) return null;
441
+ var found = 0;
442
+ for (var j = 1; j < parts.length && j <= 2; j++) {
443
+ if (!/%$/.test(parts[j])) return null;
444
+ var pct = parseFloat(parts[j]);
445
+ if (!Number.isFinite(pct)) return null;
446
+ values.push(value);
447
+ positions.push(pct / 100);
448
+ found++;
449
+ }
450
+ if (found === 0) {
451
+ values.push(value);
452
+ positions.push(null);
453
+ }
454
+ }
455
+ if (values.length < 2) return null;
456
+ if (positions[0] === null) positions[0] = 0;
457
+ if (positions[positions.length - 1] === null) {
458
+ positions[positions.length - 1] = 1;
459
+ }
460
+ var runningMax = positions[0] as number;
461
+ for (var k = 0; k < positions.length; k++) {
462
+ var pos = positions[k];
463
+ if (pos !== null) {
464
+ var clampedPos = pos < runningMax ? runningMax : pos;
465
+ positions[k] = clampedPos;
466
+ runningMax = clampedPos;
467
+ continue;
468
+ }
469
+ var nextIdx = k + 1;
470
+ while (nextIdx < positions.length && positions[nextIdx] === null) {
471
+ nextIdx++;
472
+ }
473
+ var prevPos = runningMax;
474
+ var nextPosRaw = positions[nextIdx] as number;
475
+ var nextPos = nextPosRaw < prevPos ? prevPos : nextPosRaw;
476
+ var span = nextIdx - (k - 1);
477
+ for (var q = k; q < nextIdx; q++) {
478
+ positions[q] = prevPos + ((q - (k - 1)) / span) * (nextPos - prevPos);
479
+ }
480
+ k = nextIdx - 1;
481
+ runningMax = nextPos;
482
+ }
483
+ var cx = clamp01(x);
484
+ if (cx <= (positions[0] as number)) return values[0];
485
+ for (var p = 0; p < values.length - 1; p++) {
486
+ var aPos = positions[p] as number;
487
+ var bPos = positions[p + 1] as number;
488
+ if (cx > bPos) continue;
489
+ if (bPos === aPos) return values[p + 1];
490
+ return (
491
+ values[p] + ((values[p + 1] - values[p]) * (cx - aPos)) / (bPos - aPos)
492
+ );
493
+ }
494
+ return values[values.length - 1];
495
+ }
496
+
358
497
  // Build the identity counterpart of a transform/filter list so a
359
498
  // `none` endpoint interpolates smoothly instead of midpoint-snapping
360
499
  // (e.g. none -> translateY(16px) lerps from translateY(0px)).
@@ -505,6 +644,32 @@
505
644
  return lerp(prev.value, next.value, eased);
506
645
  }
507
646
 
647
+ // Map a normalised TIMELINE time to a track-local normalised time,
648
+ // honouring the track's delayMs / durationMs span. Clamped outside the
649
+ // span (animation-fill-mode: both semantics). Without a known timeline
650
+ // duration, offset-free tracks behave as before (local t = t).
651
+ function trackLocalT(
652
+ track: { delayMs?: number; durationMs?: number },
653
+ t: number,
654
+ ): number {
655
+ var delay =
656
+ typeof track.delayMs === "number" && track.delayMs > 0
657
+ ? track.delayMs
658
+ : 0;
659
+ var dur =
660
+ typeof track.durationMs === "number" && track.durationMs > 0
661
+ ? track.durationMs
662
+ : null;
663
+ if (loadedTimelineDurationMs === null || (delay === 0 && dur === null)) {
664
+ return t;
665
+ }
666
+ var timeMs = t * loadedTimelineDurationMs;
667
+ var span = dur === null ? loadedTimelineDurationMs : dur;
668
+ if (span <= 0) return 0;
669
+ var local = (timeMs - delay) / span;
670
+ return local < 0 ? 0 : local > 1 ? 1 : local;
671
+ }
672
+
508
673
  function applyPreview(t: number): void {
509
674
  for (var i = 0; i < loadedTracks.length; i++) {
510
675
  var track = loadedTracks[i];
@@ -512,7 +677,7 @@
512
677
  '[data-agent-native-node-id="' + track.targetNodeId + '"]',
513
678
  ) as HTMLElement | null;
514
679
  if (!el) continue;
515
- var value = interpolate(track.keyframes, t);
680
+ var value = interpolate(track.keyframes, trackLocalT(track, t));
516
681
  if (value === "") continue;
517
682
  // Normalize kebab properties (e.g. background-color) to the camelCase
518
683
  // CSSOM accessor; el.style['background-color'] = … is unreliable.
@@ -552,6 +717,7 @@
552
717
  originalInlineValues = {};
553
718
  loadedTracks = [];
554
719
  loadedDefaultEase = "ease";
720
+ loadedTimelineDurationMs = null;
555
721
  }
556
722
 
557
723
  // Last previewed playhead position, so reloading the track list (which
@@ -573,6 +739,12 @@
573
739
  typeof e.data.defaultEase === "string" && e.data.defaultEase
574
740
  ? e.data.defaultEase
575
741
  : "ease";
742
+ // Timeline duration (read AFTER clearPreview, which resets it): needed
743
+ // to map offset tracks before the first motion-preview tick arrives.
744
+ var loadDur = Number(e.data.durationMs);
745
+ if (Number.isFinite(loadDur) && loadDur > 0) {
746
+ loadedTimelineDurationMs = loadDur;
747
+ }
576
748
  // Defensive: interpolate() scans keyframe pairs in array order, so an
577
749
  // unsorted track (e.g. mid-drag ordering) would fail the window test.
578
750
  for (var i = 0; i < loadedTracks.length; i++) {
@@ -592,6 +764,10 @@
592
764
  var t = Number(e.data.t);
593
765
  if (!Number.isFinite(t)) return;
594
766
  t = Math.max(0, Math.min(1, t));
767
+ var tickDur = Number(e.data.durationMs);
768
+ if (Number.isFinite(tickDur) && tickDur > 0) {
769
+ loadedTimelineDurationMs = tickDur;
770
+ }
595
771
  lastPreviewT = t;
596
772
  applyPreview(t);
597
773
  return;
@@ -10,13 +10,49 @@
10
10
  * Apply `css` as the `background` inline style on the first element that
11
11
  * matches `selector` (preferred) or `[data-agent-native-node-id="nodeId"]`.
12
12
  * When both are absent, targets `document.body`. Stores the previous
13
- * background value so it can be restored on clear.
13
+ * background value so it can be restored on clear. `css` is run through
14
+ * isSafeBackgroundStyleValue() below (a minimal duplicate of
15
+ * isSafeStyleValue() in shared/code-layer.ts) before it ever touches
16
+ * el.style.background — unsafe values are dropped silently (no style
17
+ * write) and a `shader-fill-preview-rejected` message is posted back.
14
18
  * Preview-only — never writes to DB, Yjs, or source files.
15
19
  *
16
20
  * { type: 'shader-fill-preview-clear' }
17
21
  * Remove the applied background override and restore the previous value.
18
22
  * Called when the user discards the preview or switches selections.
19
23
  *
24
+ * GLSL protocol (delegates to the code-backed shader runtime injected right
25
+ * before this bridge — see shader-runtime.bridge.ts / window.__anShaders; all
26
+ * of these no-op harmlessly when the runtime is unavailable):
27
+ *
28
+ * { type: 'glsl-shader-preview', target: { selector?, nodeId? },
29
+ * shader: { id?, name?, glsl, uniforms? }, values?, mode: 'fill'|'effect' }
30
+ * Mount a live WebGL preview of the shader on the target element without
31
+ * persisting anything. Only the iframe that actually contains the target
32
+ * mounts it (no body fallback), so the parent can safely broadcast to
33
+ * every screen iframe. `shader.glsl`/`shader.uniforms` are run through
34
+ * validatePreviewShaderDef() below — a minimal duplicate of the
35
+ * structural checks validateShaderDef()/validateGlslSource()/
36
+ * validateUniformManifest() apply on the persist path in
37
+ * shared/shader-fills.ts — before ever reaching the WebGL compiler; a
38
+ * rejected shader posts `glsl-shader-preview-rejected` with the reasons
39
+ * instead of compiling. Also enforces a local MAX_PREVIEW_MOUNTS (8) cap
40
+ * — every accepted preview request increments a counter that only resets
41
+ * on `glsl-shader-preview-clear` — matching the runtime's own MAX_MOUNTS,
42
+ * independent of the runtime's internal bookkeeping.
43
+ *
44
+ * { type: 'glsl-shader-set-uniform', filter: { shaderId?, nodeId?, preview? },
45
+ * name, value }
46
+ * Live-update one uniform on matching mounts (knob scrubbing).
47
+ *
48
+ * { type: 'glsl-shader-update', id, glsl?, uniforms? }
49
+ * Hot-swap a registered shader's source/manifest (Edit-code live preview).
50
+ * Same structural validation as glsl-shader-preview runs before the
51
+ * hot-swap is forwarded to the runtime.
52
+ *
53
+ * { type: 'glsl-shader-preview-clear' } — unmount preview mounts.
54
+ * { type: 'glsl-shader-rescan' } — re-scan persisted annotations.
55
+ *
20
56
  * Rules:
21
57
  * • No import/require of any module (DOM globals only).
22
58
  * • No references to outer/module scope (the code runs inside an iframe).
@@ -43,9 +79,45 @@
43
79
  return document.body;
44
80
  }
45
81
 
82
+ /**
83
+ * Minimal inline equivalent of isSafeStyleValue() in shared/code-layer.ts
84
+ * (the sanitizer the persist path runs style edits through), scoped to the
85
+ * one property this bridge ever writes: the `background` shorthand. Bridge
86
+ * files cannot import shared modules (see bridge.guard.spec.ts's no-import
87
+ * guard), so this duplicates the source-of-truth's rules instead of
88
+ * reusing them — keep in sync with isSafeStyleValue() in
89
+ * shared/code-layer.ts:
90
+ * - reject empty values
91
+ * - reject expression(...) and javascript: breakouts
92
+ * - reject url(...) (only the background-image longhand is ever allowed
93
+ * a url() reference on the persist path; the background shorthand
94
+ * this bridge writes stays on the strict no-url path)
95
+ * - reject raw <>{}; breakout characters
96
+ */
97
+ function isSafeBackgroundStyleValue(value: string): boolean {
98
+ if (typeof value !== "string") return false;
99
+ var trimmed = value.trim();
100
+ if (!trimmed) return false;
101
+ if (/expression\s*\(/i.test(trimmed)) return false;
102
+ if (/javascript\s*:/i.test(trimmed)) return false;
103
+ if (/url\s*\(/i.test(trimmed)) return false;
104
+ if (/[<>{};]/.test(trimmed)) return false;
105
+ return true;
106
+ }
107
+
46
108
  function applyPreview(selector: string, nodeId: string, css: string): void {
47
109
  // Clear any prior patch first so we don't stack patches.
48
110
  clearPreview();
111
+ if (css && !isSafeBackgroundStyleValue(css)) {
112
+ // Reject silently (no style write) + tell the parent why.
113
+ try {
114
+ window.parent.postMessage(
115
+ { type: "shader-fill-preview-rejected", reason: "unsafe-css-value" },
116
+ "*",
117
+ );
118
+ } catch (_err) {}
119
+ return;
120
+ }
49
121
  var el = resolveTarget(selector, nodeId);
50
122
  if (!el) return;
51
123
  originalBackground = el.style.background || "";
@@ -60,6 +132,214 @@
60
132
  originalBackground = "";
61
133
  }
62
134
 
135
+ /**
136
+ * Minimal inline duplicate of the STRUCTURAL (string-level) checks
137
+ * validateGlslSource() / validateUniformManifest() / validateShaderDef()
138
+ * apply on the persist path in shared/shader-fills.ts, run here before any
139
+ * preview/live-edit GLSL reaches the WebGL compiler. Bridge files cannot
140
+ * import shared modules (see bridge.guard.spec.ts's no-import guard), so
141
+ * this duplicates the source-of-truth's rules instead of reusing them —
142
+ * keep in sync with shared/shader-fills.ts. Deliberately a SUBSET: it skips
143
+ * the cross-check that every manifest uniform is declared in the GLSL with
144
+ * the matching type (a knob-completeness nicety, not a GPU-hang/injection
145
+ * risk), since previews render even with unused/partial knobs.
146
+ *
147
+ * Script-tag handling also intentionally differs from a naive "reject both
148
+ * tags" rule, to stay in sync with shader script breakout hardening in
149
+ * shared/shader-fills.ts: an opening `<script` tag is a real injection
150
+ * vector (starts a brand new, arbitrary script), so it stays a hard
151
+ * rejection here too. A bare closing `</script` — e.g. inside a GLSL line
152
+ * comment — is NOT rejected here or on the persist path: escaping
153
+ * (escapeShaderScriptBreakout) happens only at persist-time serialization
154
+ * (serializeShaderScriptBlock), not here on the preview path, since preview
155
+ * GLSL never gets embedded in a `<script>` block in the first place.
156
+ */
157
+ var MAX_GLSL_LENGTH = 20000;
158
+ var UNIFORM_NAME_RE = /^u_[A-Za-z0-9_]{1,48}$/;
159
+ var SHADER_BUILTIN_UNIFORMS = ["u_time", "u_resolution"];
160
+
161
+ function validatePreviewGlslSource(glsl: unknown): string[] {
162
+ var errors: string[] = [];
163
+ if (typeof glsl !== "string" || glsl.trim().length === 0) {
164
+ return ["GLSL source is empty"];
165
+ }
166
+ if (glsl.length > MAX_GLSL_LENGTH) {
167
+ errors.push(
168
+ "GLSL source is " + glsl.length + " chars — max is " + MAX_GLSL_LENGTH,
169
+ );
170
+ }
171
+ if (!/void\s+main\s*\(/.test(glsl)) {
172
+ errors.push("GLSL source must define void main()");
173
+ }
174
+ if (!/gl_FragColor/.test(glsl)) {
175
+ errors.push("GLSL source must write gl_FragColor");
176
+ }
177
+ if (/<script/i.test(glsl)) {
178
+ errors.push("GLSL source must not contain an opening script tag");
179
+ }
180
+ // eslint-disable-next-line no-control-regex
181
+ if (/[\u0000-\u0008\u000B\u000C\u000E-\u001F]/.test(glsl)) {
182
+ errors.push("GLSL source contains control characters");
183
+ }
184
+ return errors;
185
+ }
186
+
187
+ function validatePreviewUniformManifest(uniforms: unknown): string[] {
188
+ var errors: string[] = [];
189
+ if (uniforms === undefined || uniforms === null) return errors;
190
+ if (typeof uniforms !== "object") {
191
+ return ["uniforms manifest must be an object"];
192
+ }
193
+ var manifest = uniforms as Record<string, unknown>;
194
+ var names = Object.keys(manifest);
195
+ if (names.length > 16) {
196
+ errors.push("too many uniforms (" + names.length + ") — max is 16");
197
+ }
198
+ for (var i = 0; i < names.length; i++) {
199
+ var name = names[i];
200
+ var def = manifest[name] as
201
+ | { type?: unknown; value?: unknown; min?: unknown; max?: unknown }
202
+ | undefined;
203
+ if (!UNIFORM_NAME_RE.test(name)) {
204
+ errors.push(
205
+ 'uniform "' + name + '" must match u_[A-Za-z0-9_]+ (max 50 chars)',
206
+ );
207
+ continue;
208
+ }
209
+ if (SHADER_BUILTIN_UNIFORMS.indexOf(name) !== -1) {
210
+ errors.push(
211
+ 'uniform "' + name + '" is a built-in provided by the runtime',
212
+ );
213
+ continue;
214
+ }
215
+ if (!def || typeof def !== "object") {
216
+ errors.push('uniform "' + name + '" definition must be an object');
217
+ continue;
218
+ }
219
+ if (def.type === "float") {
220
+ if (typeof def.value !== "number" || !isFinite(def.value as number)) {
221
+ errors.push('uniform "' + name + '" value must be a finite number');
222
+ }
223
+ } else if (def.type === "vec2") {
224
+ var v = def.value;
225
+ if (
226
+ !Array.isArray(v) ||
227
+ v.length !== 2 ||
228
+ typeof v[0] !== "number" ||
229
+ typeof v[1] !== "number" ||
230
+ !isFinite(v[0]) ||
231
+ !isFinite(v[1])
232
+ ) {
233
+ errors.push(
234
+ 'uniform "' + name + '" value must be [x, y] finite numbers',
235
+ );
236
+ }
237
+ } else if (def.type === "color") {
238
+ if (
239
+ typeof def.value !== "string" ||
240
+ !/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(def.value)
241
+ ) {
242
+ errors.push(
243
+ 'uniform "' + name + '" value must be a hex color like "#1a2b3c"',
244
+ );
245
+ }
246
+ } else {
247
+ errors.push(
248
+ 'uniform "' + name + '" has unknown type — use float, vec2, or color',
249
+ );
250
+ }
251
+ }
252
+ return errors;
253
+ }
254
+
255
+ /**
256
+ * Full structural validation for a preview/live-edit shader def. Returns an
257
+ * empty array when valid. Mirrors validateShaderDef()'s string-level checks
258
+ * (see the comment above) without the GLSL↔manifest type cross-check.
259
+ */
260
+ function validatePreviewShaderDef(shader: {
261
+ id?: unknown;
262
+ name?: unknown;
263
+ glsl?: unknown;
264
+ uniforms?: unknown;
265
+ }): string[] {
266
+ var errors = validatePreviewGlslSource(shader.glsl);
267
+ errors = errors.concat(validatePreviewUniformManifest(shader.uniforms));
268
+ if (shader.name !== undefined) {
269
+ if (typeof shader.name !== "string" || shader.name.length > 80) {
270
+ errors.push("shader name must be a string ≤ 80 chars");
271
+ } else if (
272
+ shader.name.indexOf("*/") !== -1 ||
273
+ /<\/?script/i.test(shader.name)
274
+ ) {
275
+ errors.push("shader name contains forbidden sequences");
276
+ }
277
+ }
278
+ return errors;
279
+ }
280
+
281
+ function postShaderRejected(errors: string[]): void {
282
+ try {
283
+ window.parent.postMessage(
284
+ { type: "glsl-shader-preview-rejected", errors: errors },
285
+ "*",
286
+ );
287
+ } catch (_err) {}
288
+ }
289
+
290
+ // Local preview-mount bookkeeping — enforces the same cap the runtime uses
291
+ // (MAX_MOUNTS = 8 in shader-runtime.bridge.ts) independent of the
292
+ // runtime's own internal `mounts` array, which this bridge has no access
293
+ // to (no imports). Today's single-target glsl-shader-preview protocol only
294
+ // ever needs ONE live preview mount at a time (the runtime's own
295
+ // applyPreview() tears down any prior preview mount before creating a new
296
+ // one), so this counter is deliberately conservative: it counts every
297
+ // ACCEPTED preview request since the last explicit clear rather than
298
+ // trusting that every caller pairs each preview with one, so a
299
+ // hostile/misbehaving parent that fires many previews without ever
300
+ // clearing still gets capped at MAX_PREVIEW_MOUNTS instead of unbounded
301
+ // WebGL context churn.
302
+ var MAX_PREVIEW_MOUNTS = 8;
303
+ var acceptedPreviewCountSinceClear = 0;
304
+
305
+ /**
306
+ * The code-backed GLSL runtime (shader-runtime.bridge.ts) registers itself
307
+ * as window.__anShaders. It is injected immediately before this bridge in
308
+ * the editor, and embedded directly in persisted screen HTML. Everything
309
+ * here degrades to a no-op when it is missing.
310
+ */
311
+ interface AnShadersGlobal {
312
+ version: number;
313
+ scan: () => void;
314
+ applyPreview: (
315
+ target: { nodeId?: string; selector?: string },
316
+ def: {
317
+ id?: string;
318
+ name?: string;
319
+ glsl: string;
320
+ uniforms?: Record<string, unknown>;
321
+ values?: Record<string, unknown>;
322
+ },
323
+ mode?: string,
324
+ ) => boolean;
325
+ clearPreview: () => void;
326
+ setUniform: (
327
+ filter: { shaderId?: string; nodeId?: string; preview?: boolean },
328
+ name: string,
329
+ value: unknown,
330
+ ) => void;
331
+ updateShader: (
332
+ id: string,
333
+ patch: { glsl?: string; uniforms?: Record<string, unknown> },
334
+ ) => void;
335
+ }
336
+
337
+ function runtime(): AnShadersGlobal | null {
338
+ var api = (window as unknown as { __anShaders?: AnShadersGlobal })
339
+ .__anShaders;
340
+ return api && api.version >= 1 ? api : null;
341
+ }
342
+
63
343
  window.addEventListener("message", function (e: MessageEvent) {
64
344
  if (e.source !== window.parent) return;
65
345
  if (!e.data || typeof e.data.type !== "string") return;
@@ -74,5 +354,100 @@
74
354
  clearPreview();
75
355
  return;
76
356
  }
357
+ if (e.data.type === "glsl-shader-preview") {
358
+ var api = runtime();
359
+ if (!api) return;
360
+ var target =
361
+ e.data.target && typeof e.data.target === "object" ? e.data.target : {};
362
+ var shader =
363
+ e.data.shader && typeof e.data.shader === "object"
364
+ ? e.data.shader
365
+ : null;
366
+ if (!shader || typeof shader.glsl !== "string") return;
367
+ // Reject a hostile/broken shader BEFORE it ever reaches the WebGL
368
+ // compiler (GPU-hang risk from arbitrary postMessage GLSL) — same
369
+ // structural checks the persist path runs via validateShaderDef().
370
+ var validationErrors = validatePreviewShaderDef(shader);
371
+ if (validationErrors.length > 0) {
372
+ postShaderRejected(validationErrors);
373
+ return;
374
+ }
375
+ // Enforce the same mount cap the runtime uses (8), independent of the
376
+ // runtime's own bookkeeping — see acceptedPreviewCountSinceClear above.
377
+ if (acceptedPreviewCountSinceClear >= MAX_PREVIEW_MOUNTS) {
378
+ postShaderRejected([
379
+ "too many active shader previews — max is " + MAX_PREVIEW_MOUNTS,
380
+ ]);
381
+ return;
382
+ }
383
+ acceptedPreviewCountSinceClear += 1;
384
+ api.applyPreview(
385
+ { nodeId: target.nodeId, selector: target.selector },
386
+ {
387
+ id: shader.id,
388
+ name: shader.name,
389
+ glsl: shader.glsl,
390
+ uniforms: shader.uniforms,
391
+ values:
392
+ e.data.values && typeof e.data.values === "object"
393
+ ? e.data.values
394
+ : undefined,
395
+ },
396
+ e.data.mode === "effect" ? "effect" : "fill",
397
+ );
398
+ return;
399
+ }
400
+ if (e.data.type === "glsl-shader-set-uniform") {
401
+ var api2 = runtime();
402
+ if (!api2) return;
403
+ if (typeof e.data.name !== "string") return;
404
+ api2.setUniform(
405
+ e.data.filter && typeof e.data.filter === "object" ? e.data.filter : {},
406
+ e.data.name,
407
+ e.data.value,
408
+ );
409
+ return;
410
+ }
411
+ if (e.data.type === "glsl-shader-update") {
412
+ var api3 = runtime();
413
+ if (!api3) return;
414
+ if (typeof e.data.id !== "string") return;
415
+ // Same structural validation as glsl-shader-preview before hot-swapping
416
+ // a registered shader's live GLSL/manifest — glsl-shader-update allows
417
+ // a partial patch (e.g. uniforms-only), so only validate whichever
418
+ // parts are actually present in this message.
419
+ var updateErrors: string[] = [];
420
+ if (typeof e.data.glsl === "string") {
421
+ updateErrors = updateErrors.concat(
422
+ validatePreviewGlslSource(e.data.glsl),
423
+ );
424
+ }
425
+ updateErrors = updateErrors.concat(
426
+ validatePreviewUniformManifest(e.data.uniforms),
427
+ );
428
+ if (updateErrors.length > 0) {
429
+ postShaderRejected(updateErrors);
430
+ return;
431
+ }
432
+ api3.updateShader(e.data.id, {
433
+ glsl: typeof e.data.glsl === "string" ? e.data.glsl : undefined,
434
+ uniforms:
435
+ e.data.uniforms && typeof e.data.uniforms === "object"
436
+ ? e.data.uniforms
437
+ : undefined,
438
+ });
439
+ return;
440
+ }
441
+ if (e.data.type === "glsl-shader-preview-clear") {
442
+ var api4 = runtime();
443
+ if (api4) api4.clearPreview();
444
+ acceptedPreviewCountSinceClear = 0;
445
+ return;
446
+ }
447
+ if (e.data.type === "glsl-shader-rescan") {
448
+ var api5 = runtime();
449
+ if (api5) api5.scan();
450
+ return;
451
+ }
77
452
  });
78
453
  })();