@agent-native/core 0.82.0 → 0.84.0

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 (474) hide show
  1. package/README.md +2 -2
  2. package/corpus/README.md +1 -1
  3. package/corpus/core/CHANGELOG.md +34 -0
  4. package/corpus/core/README.md +2 -2
  5. package/corpus/core/docs/content/cloneable-saas.mdx +2 -2
  6. package/corpus/core/docs/content/faq.mdx +1 -1
  7. package/corpus/core/docs/content/locales/ar-SA/cloneable-saas.mdx +2 -2
  8. package/corpus/core/docs/content/locales/ar-SA/faq.mdx +1 -1
  9. package/corpus/core/docs/content/locales/ar-SA/template-chat.mdx +1 -1
  10. package/corpus/core/docs/content/locales/de-DE/cloneable-saas.mdx +2 -2
  11. package/corpus/core/docs/content/locales/de-DE/faq.mdx +1 -1
  12. package/corpus/core/docs/content/locales/de-DE/template-chat.mdx +1 -1
  13. package/corpus/core/docs/content/locales/es-ES/cloneable-saas.mdx +2 -2
  14. package/corpus/core/docs/content/locales/es-ES/faq.mdx +1 -1
  15. package/corpus/core/docs/content/locales/es-ES/template-chat.mdx +1 -1
  16. package/corpus/core/docs/content/locales/fr-FR/cloneable-saas.mdx +2 -2
  17. package/corpus/core/docs/content/locales/fr-FR/faq.mdx +1 -1
  18. package/corpus/core/docs/content/locales/fr-FR/template-chat.mdx +1 -1
  19. package/corpus/core/docs/content/locales/hi-IN/cloneable-saas.mdx +2 -2
  20. package/corpus/core/docs/content/locales/hi-IN/faq.mdx +1 -1
  21. package/corpus/core/docs/content/locales/hi-IN/template-chat.mdx +1 -1
  22. package/corpus/core/docs/content/locales/ja-JP/cloneable-saas.mdx +2 -2
  23. package/corpus/core/docs/content/locales/ja-JP/faq.mdx +1 -1
  24. package/corpus/core/docs/content/locales/ja-JP/template-chat.mdx +1 -1
  25. package/corpus/core/docs/content/locales/ko-KR/cloneable-saas.mdx +2 -2
  26. package/corpus/core/docs/content/locales/ko-KR/faq.mdx +1 -1
  27. package/corpus/core/docs/content/locales/ko-KR/template-chat.mdx +1 -1
  28. package/corpus/core/docs/content/locales/pt-BR/cloneable-saas.mdx +2 -2
  29. package/corpus/core/docs/content/locales/pt-BR/faq.mdx +1 -1
  30. package/corpus/core/docs/content/locales/pt-BR/template-chat.mdx +1 -1
  31. package/corpus/core/docs/content/locales/zh-CN/cloneable-saas.mdx +2 -2
  32. package/corpus/core/docs/content/locales/zh-CN/faq.mdx +1 -1
  33. package/corpus/core/docs/content/locales/zh-CN/template-chat.mdx +1 -1
  34. package/corpus/core/docs/content/locales/zh-TW/cloneable-saas.mdx +2 -2
  35. package/corpus/core/docs/content/locales/zh-TW/faq.mdx +1 -1
  36. package/corpus/core/docs/content/locales/zh-TW/template-chat.mdx +1 -1
  37. package/corpus/core/docs/content/template-chat.mdx +1 -1
  38. package/corpus/core/package.json +1 -1
  39. package/corpus/core/src/agent/engine/builtin.ts +1 -1
  40. package/corpus/core/src/agent/engine/output-tokens.ts +1 -1
  41. package/corpus/core/src/agent/harness/acp-adapter.ts +28 -4
  42. package/corpus/core/src/agent/harness/ai-sdk-adapter.ts +3 -0
  43. package/corpus/core/src/agent/harness/translate.ts +3 -0
  44. package/corpus/core/src/agent/harness/types.ts +1 -0
  45. package/corpus/core/src/agent/model-config.ts +34 -13
  46. package/corpus/core/src/agent/production-agent.ts +87 -10
  47. package/corpus/core/src/agent/thread-data-builder.ts +29 -4
  48. package/corpus/core/src/agent/tool-call-journal.ts +109 -48
  49. package/corpus/core/src/agent/types.ts +6 -1
  50. package/corpus/core/src/cli/design-connect.ts +106 -0
  51. package/corpus/core/src/cli/gateway-helpers.ts +17 -0
  52. package/corpus/core/src/cli/recap.ts +0 -2
  53. package/corpus/core/src/cli/skills.ts +54 -16
  54. package/corpus/core/src/cli/workspace-dev.ts +29 -5
  55. package/corpus/core/src/client/AssistantChat.tsx +89 -42
  56. package/corpus/core/src/client/CommandMenu.tsx +34 -12
  57. package/corpus/core/src/client/DefaultSpinner.tsx +8 -1
  58. package/corpus/core/src/client/chat/message-components.tsx +49 -1
  59. package/corpus/core/src/client/chat/repo-helpers.ts +71 -0
  60. package/corpus/core/src/client/chat/run-recovery.tsx +15 -5
  61. package/corpus/core/src/client/components/ApiKeySettings.tsx +8 -8
  62. package/corpus/core/src/client/components/CodeRequiredDialog.tsx +26 -15
  63. package/corpus/core/src/client/components/MissingKeyCard.tsx +13 -6
  64. package/corpus/core/src/client/composer/TiptapComposer.tsx +4 -3
  65. package/corpus/core/src/client/extensions/ExtensionsSidebarSection.tsx +0 -1
  66. package/corpus/core/src/client/guided-questions.tsx +21 -27
  67. package/corpus/core/src/client/integrations/IntegrationCard.tsx +1 -1
  68. package/corpus/core/src/client/integrations/IntegrationsPanel.tsx +1 -1
  69. package/corpus/core/src/client/onboarding/OnboardingBanner.tsx +2 -2
  70. package/corpus/core/src/client/onboarding/OnboardingPanel.tsx +23 -19
  71. package/corpus/core/src/client/resources/ResourceEditor.tsx +18 -10
  72. package/corpus/core/src/client/resources/ResourcesPanel.tsx +5 -1
  73. package/corpus/core/src/client/settings/SettingsPanel.tsx +8 -3
  74. package/corpus/core/src/client/settings/useBuilderStatus.ts +8 -41
  75. package/corpus/core/src/client/useProductionAgent.ts +6 -2
  76. package/corpus/core/src/deploy/build.ts +1 -1
  77. package/corpus/core/src/observability/traces.ts +3 -3
  78. package/corpus/core/src/onboarding/default-steps.ts +1 -1
  79. package/corpus/core/src/scripts/agent-engines/manage-agent-engine.ts +1 -1
  80. package/corpus/core/src/scripts/agent-engines/set-agent-engine.ts +1 -1
  81. package/corpus/core/src/server/agent-chat-plugin.ts +177 -81
  82. package/corpus/core/src/server/core-routes-plugin.ts +7 -1
  83. package/corpus/core/src/server/open-route.ts +59 -40
  84. package/corpus/core/src/shared/reasoning-effort.ts +2 -0
  85. package/corpus/core/src/sharing/access.ts +22 -2
  86. package/corpus/core/src/sharing/registry.ts +18 -0
  87. package/corpus/core/src/styles/agent-native.css +104 -20
  88. package/corpus/core/src/styles/rich-markdown-editor.css +11 -10
  89. package/corpus/templates/analytics/actions/hubspot-deals.ts +64 -4
  90. package/corpus/templates/analytics/app/components/dashboard/CumulativeNetChart.tsx +10 -10
  91. package/corpus/templates/analytics/app/components/dashboard/RevenueChart.tsx +10 -10
  92. package/corpus/templates/analytics/app/components/dashboard/RevenueComparisonChart.tsx +6 -5
  93. package/corpus/templates/analytics/app/components/dashboard/TimeSeriesChart.tsx +9 -9
  94. package/corpus/templates/analytics/app/global.css +4 -0
  95. package/corpus/templates/analytics/app/lib/chart-theme.ts +13 -0
  96. package/corpus/templates/analytics/app/pages/adhoc/_shared/KpiChart.tsx +22 -24
  97. package/corpus/templates/analytics/changelog/2026-06-30-dashboard-charts-now-use-theme-aware-tooltip-and-grid-colors.md +6 -0
  98. package/corpus/templates/analytics/changelog/2026-06-30-fixed-ask-composer-spacing-so-the-chat-field-has-a-comfortab.md +6 -0
  99. package/corpus/templates/calendar/AGENTS.md +4 -0
  100. package/corpus/templates/calendar/actions/connect-google-calendar.ts +80 -0
  101. package/corpus/templates/calendar/changelog/2026-06-30-calendar-now-gives-the-agent-a-safe-google-connection-link-i.md +6 -0
  102. package/corpus/templates/calendar/server/plugins/agent-chat.ts +4 -0
  103. package/corpus/templates/content/.env.local.example +6 -0
  104. package/corpus/templates/content/AGENTS.md +10 -1
  105. package/corpus/templates/content/actions/_builder-cms-read-client.ts +14 -1
  106. package/corpus/templates/content/actions/_builder-cms-source-adapter.ts +43 -0
  107. package/corpus/templates/content/actions/_builder-cms-write-adapter.ts +79 -7
  108. package/corpus/templates/content/actions/_database-source-utils.ts +987 -22
  109. package/corpus/templates/content/actions/_database-utils.ts +41 -0
  110. package/corpus/templates/content/actions/_local-file-documents.ts +74 -1
  111. package/corpus/templates/content/actions/attach-content-database-source.ts +33 -8
  112. package/corpus/templates/content/actions/change-content-database-source-role.ts +14 -0
  113. package/corpus/templates/content/actions/disconnect-content-database-source.ts +3 -0
  114. package/corpus/templates/content/actions/execute-builder-source-execution.ts +71 -3
  115. package/corpus/templates/content/actions/list-content-databases.ts +41 -33
  116. package/corpus/templates/content/actions/process-builder-body-hydration.ts +47 -0
  117. package/corpus/templates/content/actions/update-document.ts +93 -0
  118. package/corpus/templates/content/app/blocks/SourceComponentBlock.tsx +277 -0
  119. package/corpus/templates/content/app/blocks/contentBlockRegistry.tsx +2 -0
  120. package/corpus/templates/content/app/components/editor/BubbleToolbar.tsx +5 -5
  121. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +45 -4
  122. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +5 -1
  123. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +92 -0
  124. package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +5 -3
  125. package/corpus/templates/content/app/components/editor/extensions/registryBlocks.ts +41 -0
  126. package/corpus/templates/content/app/components/editor/registrySlashItems.ts +4 -0
  127. package/corpus/templates/content/app/global.css +16 -8
  128. package/corpus/templates/content/app/hooks/use-content-database.ts +24 -0
  129. package/corpus/templates/content/app/i18n/zh-TW.ts +24 -0
  130. package/corpus/templates/content/app/i18n-data.ts +212 -0
  131. package/corpus/templates/content/app/lib/content-command-search.ts +64 -0
  132. package/corpus/templates/content/app/root.tsx +236 -8
  133. package/corpus/templates/content/changelog/2026-06-29-builder-cms-sources-now-sync-article-bodies-through-content.md +6 -0
  134. package/corpus/templates/content/changelog/2026-06-30-builder-article-media-now-render-as-images-and-embeds-when-r.md +6 -0
  135. package/corpus/templates/content/changelog/2026-06-30-builder-source-components-now-render-as-preserved-preview-bl.md +6 -0
  136. package/corpus/templates/content/changelog/2026-06-30-cmd-k-search-now-opens-from-the-editor-and-finds-real-content.md +6 -0
  137. package/corpus/templates/content/changelog/2026-06-30-editor-floating-toolbars-now-use-theme-aware-colors-in-light.md +6 -0
  138. package/corpus/templates/content/package.json +3 -1
  139. package/corpus/templates/content/scripts/check-native-deps.mjs +57 -0
  140. package/corpus/templates/content/scripts/dev-database.mjs +83 -0
  141. package/corpus/templates/content/scripts/seed-demo-user.mjs +107 -0
  142. package/corpus/templates/content/server/db/schema.ts +27 -0
  143. package/corpus/templates/content/server/plugins/db.ts +33 -0
  144. package/corpus/templates/content/shared/api.ts +45 -0
  145. package/corpus/templates/content/shared/builder-mdx.ts +905 -5
  146. package/corpus/templates/content/shared/nfm-registry.ts +2 -0
  147. package/corpus/templates/content/shared/source-component-block.ts +141 -0
  148. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +6 -1
  149. package/corpus/templates/design/actions/add-localhost-screens.ts +63 -8
  150. package/corpus/templates/design/actions/apply-motion-edit.ts +12 -46
  151. package/corpus/templates/design/actions/list-design-native-assets.ts +2 -1
  152. package/corpus/templates/design/actions/migrate-board-objects-to-file.ts +49 -1
  153. package/corpus/templates/design/actions/navigate.ts +3 -12
  154. package/corpus/templates/design/actions/open-visual-edit.ts +341 -0
  155. package/corpus/templates/design/actions/view-screen.ts +1 -1
  156. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +1 -1
  157. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +350 -15
  158. package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +71 -91
  159. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +25 -27
  160. package/corpus/templates/design/app/components/design/DeviceFrame.tsx +1 -1
  161. package/corpus/templates/design/app/components/design/DrawOverlay.tsx +2 -2
  162. package/corpus/templates/design/app/components/design/EditPanel.tsx +1111 -570
  163. package/corpus/templates/design/app/components/design/LayersPanel.tsx +162 -32
  164. package/corpus/templates/design/app/components/design/MotionDock.tsx +268 -240
  165. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +1193 -207
  166. package/corpus/templates/design/app/components/design/QuestionFlow.tsx +1 -1
  167. package/corpus/templates/design/app/components/design/ReviewPanel.tsx +81 -102
  168. package/corpus/templates/design/app/components/design/StatesPanel.tsx +6 -6
  169. package/corpus/templates/design/app/components/design/TokensPanel.tsx +11 -11
  170. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +9 -7
  171. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +1225 -154
  172. package/corpus/templates/design/app/components/design/bridge/hit-test.bridge.ts +130 -37
  173. package/corpus/templates/design/app/components/design/canvas-primitive-style.ts +24 -11
  174. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +184 -162
  175. package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +137 -79
  176. package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +13 -13
  177. package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +8 -8
  178. package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +2 -2
  179. package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +4 -4
  180. package/corpus/templates/design/app/components/design/inspector/InspectorAiActions.tsx +3 -3
  181. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +13 -7
  182. package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +14 -11
  183. package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +4 -4
  184. package/corpus/templates/design/app/components/design/inspector/index.ts +2 -0
  185. package/corpus/templates/design/app/components/design/types.ts +19 -0
  186. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +61 -78
  187. package/corpus/templates/design/app/components/layout/Header.tsx +0 -1
  188. package/corpus/templates/design/app/components/layout/Layout.tsx +3 -2
  189. package/corpus/templates/design/app/components/layout/Sidebar.tsx +0 -2
  190. package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +5 -4
  191. package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +1 -1
  192. package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +2 -2
  193. package/corpus/templates/design/app/global.css +56 -0
  194. package/corpus/templates/design/app/hooks/use-agent-generating.ts +4 -5
  195. package/corpus/templates/design/app/hooks/use-navigation-state.ts +6 -7
  196. package/corpus/templates/design/app/hooks/use-question-flow.ts +3 -2
  197. package/corpus/templates/design/app/hooks/useAgentEditRequest.ts +6 -4
  198. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +6 -3
  199. package/corpus/templates/design/app/i18n/zh-TW.ts +5 -14
  200. package/corpus/templates/design/app/i18n-data.ts +63 -188
  201. package/corpus/templates/design/app/lib/agent-chat.ts +13 -0
  202. package/corpus/templates/design/app/pages/DesignEditor.tsx +1755 -401
  203. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +9 -5
  204. package/corpus/templates/design/app/pages/DesignSystems.tsx +2 -2
  205. package/corpus/templates/design/app/pages/Index.tsx +49 -26
  206. package/corpus/templates/design/app/pages/NotFound.tsx +25 -8
  207. package/corpus/templates/design/app/pages/VisualEdit.tsx +17 -5
  208. package/corpus/templates/design/app/routes/examples.tsx +1 -7
  209. package/corpus/templates/design/app/routes/templates.tsx +7 -4
  210. package/corpus/templates/design/changelog/2026-06-30-board-shapes-and-auto-layout-controls-are-clearer.md +6 -0
  211. package/corpus/templates/design/changelog/2026-06-30-canvas-editing-now-keeps-undo-redo-and-cross-screen-layer-mo.md +6 -0
  212. package/corpus/templates/design/changelog/2026-06-30-component-selections-now-use-purple-component-chrome-and-sho.md +6 -0
  213. package/corpus/templates/design/changelog/2026-06-30-constraints-now-stay-tucked-into-a-compact-inspector-preview.md +6 -0
  214. package/corpus/templates/design/changelog/2026-06-30-creating-a-component-now-opens-in-a-compact-inspector-popove.md +6 -0
  215. package/corpus/templates/design/changelog/2026-06-30-design-cards-no-longer-show-legacy-project-type-badges.md +6 -0
  216. package/corpus/templates/design/changelog/2026-06-30-design-chat-now-keeps-new-turns-in-the-visible-design-agent-.md +6 -0
  217. package/corpus/templates/design/changelog/2026-06-30-design-editor-panels-now-keep-their-compact-text-sizing-cons.md +6 -0
  218. package/corpus/templates/design/changelog/2026-06-30-design-no-longer-shows-the-connected-local-code-warning-bann.md +6 -0
  219. package/corpus/templates/design/changelog/2026-06-30-design-now-opens-to-the-files-panel-unless-a-generation-is-a.md +6 -0
  220. package/corpus/templates/design/changelog/2026-06-30-design-opens-with-a-cleaner-empty-canvas-and-loading-preview.md +6 -0
  221. package/corpus/templates/design/changelog/2026-06-30-design-tools-use-simpler-less-decorative-icons.md +6 -0
  222. package/corpus/templates/design/changelog/2026-06-30-dragging-absolute-elements-no-longer-shows-coordinate-labels.md +6 -0
  223. package/corpus/templates/design/changelog/2026-06-30-fixed-all-screens-opening-too-zoomed-in-by-default.md +6 -0
  224. package/corpus/templates/design/changelog/2026-06-30-fixed-the-public-design-assets-sidebar-so-native-components-.md +6 -0
  225. package/corpus/templates/design/changelog/2026-06-30-fixed-the-screen-overview-board-so-empty-board-space-no-long.md +6 -0
  226. package/corpus/templates/design/changelog/2026-06-30-full-view-screens-can-now-scroll-while-remaining-editable.md +6 -0
  227. package/corpus/templates/design/changelog/2026-06-30-inspector-element-headers-show-the-selected-html-tag-and-the.md +6 -0
  228. package/corpus/templates/design/changelog/2026-06-30-inspector-inputs-stay-compact-across-desktop-breakpoints.md +6 -0
  229. package/corpus/templates/design/changelog/2026-06-30-layers-can-be-multi-selected-from-the-canvas-and-edited-toge.md +6 -0
  230. package/corpus/templates/design/changelog/2026-06-30-local-visual-edit-links-can-edit-localhost-frames-without-si.md +6 -0
  231. package/corpus/templates/design/changelog/2026-06-30-localhost-visual-edit-frames-can-now-be-selected-and-edited.md +6 -0
  232. package/corpus/templates/design/changelog/2026-06-30-marquee-selection-now-works-inside-screens-multi-selected-la.md +6 -0
  233. package/corpus/templates/design/changelog/2026-06-30-motion-is-now-available-from-the-persistent-left-rail-and-th.md +6 -0
  234. package/corpus/templates/design/changelog/2026-06-30-motion-timeline-collapse-and-reopen-animations-feel-smoother.md +6 -0
  235. package/corpus/templates/design/changelog/2026-06-30-multi-select-outlines-now-stay-consistent-across-all-screens.md +6 -0
  236. package/corpus/templates/design/changelog/2026-06-30-new-board-shapes-now-start-with-neutral-gray-styling.md +6 -0
  237. package/corpus/templates/design/changelog/2026-06-30-new-designs-open-into-a-steadier-loading-state-before-the-ed.md +6 -0
  238. package/corpus/templates/design/changelog/2026-06-30-new-designs-show-a-loading-state-during-handoff-and-keep-edi.md +6 -0
  239. package/corpus/templates/design/changelog/2026-06-30-public-visual-edit-design-links-now-open-directly-instead-of.md +6 -0
  240. package/corpus/templates/design/changelog/2026-06-30-removed-the-confusing-states-section-from-the-design-editor-.md +6 -0
  241. package/corpus/templates/design/changelog/2026-06-30-removed-the-templates-gallery-from-design-navigation.md +6 -0
  242. package/corpus/templates/design/changelog/2026-06-30-share-stays-visible-as-soon-as-editable-designs-load.md +6 -0
  243. package/corpus/templates/design/changelog/2026-06-30-signed-out-save-and-share-controls-use-simpler-labels-and-op.md +6 -0
  244. package/corpus/templates/design/changelog/2026-06-30-text-added-on-the-canvas-now-focuses-cleanly-with-the-right-.md +6 -0
  245. package/corpus/templates/design/changelog/2026-06-30-the-design-editor-loading-skeleton-is-simpler-and-its-bottom.md +6 -0
  246. package/corpus/templates/design/changelog/2026-06-30-the-design-editor-loading-skeleton-now-follows-the-current-t.md +6 -0
  247. package/corpus/templates/design/changelog/2026-06-30-the-design-inspector-no-longer-shows-child-layout-controls-o.md +6 -0
  248. package/corpus/templates/design/changelog/2026-06-30-the-design-inspector-no-longer-shows-the-ask-ai-section-abov.md +6 -0
  249. package/corpus/templates/design/changelog/2026-06-30-the-design-review-panel-no-longer-shows-a-separate-inline-au.md +6 -0
  250. package/corpus/templates/design/changelog/2026-06-30-the-empty-designs-page-now-focuses-on-a-single-primary-new-d.md +6 -0
  251. package/corpus/templates/design/changelog/2026-06-30-the-layers-panel-header-stays-as-layers-while-multiple-items.md +6 -0
  252. package/corpus/templates/design/changelog/2026-06-30-the-missing-design-screen-now-uses-a-neutral-back-button.md +6 -0
  253. package/corpus/templates/design/changelog/2026-06-30-the-motion-timeline-now-closes-without-squeezing-the-canvas-.md +6 -0
  254. package/corpus/templates/design/changelog/2026-06-30-the-new-design-connect-ai-setup-now-lines-up-with-the-compos.md +6 -0
  255. package/corpus/templates/design/changelog/2026-06-30-the-screen-overview-board-now-blends-into-the-canvas-and-new.md +6 -0
  256. package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-drops-now-show-screen-guides.md +6 -0
  257. package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-layers-now-keep-a-transparent-backdrop-and-.md +6 -0
  258. package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-layers-now-select-reliably-from-all-screens.md +6 -0
  259. package/corpus/templates/design/changelog/2026-06-30-visual-edit-can-open-and-refresh-localhost-screens-in-one-au.md +6 -0
  260. package/corpus/templates/design/e2e/helpers.ts +15 -4
  261. package/corpus/templates/design/server/db/index.ts +52 -0
  262. package/corpus/templates/design/server/plugins/agent-chat.ts +5 -0
  263. package/corpus/templates/design/server/plugins/auth.ts +1 -0
  264. package/corpus/templates/design/server/plugins/core-routes.ts +4 -0
  265. package/corpus/templates/design/shared/board-file.ts +380 -5
  266. package/corpus/templates/design/shared/board-objects.ts +2 -2
  267. package/corpus/templates/design/shared/code-layer.ts +50 -6
  268. package/corpus/templates/design/shared/motion-compiler.ts +27 -0
  269. package/corpus/templates/macros/app/components/DailyProgress.tsx +41 -37
  270. package/corpus/templates/macros/app/components/ExerciseCard.tsx +2 -2
  271. package/corpus/templates/macros/app/components/MealCard.tsx +2 -2
  272. package/corpus/templates/macros/app/components/VoiceDictation.tsx +1 -1
  273. package/corpus/templates/macros/app/components/WeeklyCaloriesChart.tsx +1 -1
  274. package/corpus/templates/macros/app/components/WeightCard.tsx +2 -2
  275. package/corpus/templates/macros/app/components/WeightTracker.tsx +1 -1
  276. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +1 -1
  277. package/corpus/templates/macros/app/routes/_index.tsx +5 -5
  278. package/corpus/templates/macros/app/routes/analytics.tsx +1 -1
  279. package/corpus/templates/macros/changelog/2026-06-30-dashboard-loading-and-chart-surfaces-now-use-theme-aware-col.md +6 -0
  280. package/corpus/templates/mail/app/components/email/ComposeBubbleToolbar.tsx +14 -11
  281. package/corpus/templates/mail/app/global.css +3 -2
  282. package/corpus/templates/mail/changelog/2026-06-30-compose-floating-toolbars-now-use-theme-aware-colors-in-ligh.md +6 -0
  283. package/corpus/templates/plan/app/pages/PlansPage.tsx +2 -2
  284. package/corpus/templates/slides/app/components/deck/DeckCard.tsx +3 -3
  285. package/corpus/templates/slides/app/global.css +10 -0
  286. package/corpus/templates/slides/app/pages/Index.tsx +55 -51
  287. package/corpus/templates/slides/changelog/2026-06-30-deck-thumbnails-collapse-cleanly-to-one-column-when-the-chat.md +6 -0
  288. package/dist/agent/engine/anthropic-engine.d.ts +2 -2
  289. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  290. package/dist/agent/engine/builder-engine.d.ts +2 -2
  291. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  292. package/dist/agent/engine/builtin.js +1 -1
  293. package/dist/agent/engine/builtin.js.map +1 -1
  294. package/dist/agent/engine/output-tokens.js +1 -1
  295. package/dist/agent/engine/output-tokens.js.map +1 -1
  296. package/dist/agent/harness/acp-adapter.d.ts +4 -1
  297. package/dist/agent/harness/acp-adapter.d.ts.map +1 -1
  298. package/dist/agent/harness/acp-adapter.js +19 -2
  299. package/dist/agent/harness/acp-adapter.js.map +1 -1
  300. package/dist/agent/harness/ai-sdk-adapter.d.ts.map +1 -1
  301. package/dist/agent/harness/ai-sdk-adapter.js +3 -0
  302. package/dist/agent/harness/ai-sdk-adapter.js.map +1 -1
  303. package/dist/agent/harness/translate.d.ts.map +1 -1
  304. package/dist/agent/harness/translate.js +3 -0
  305. package/dist/agent/harness/translate.js.map +1 -1
  306. package/dist/agent/harness/types.d.ts +1 -0
  307. package/dist/agent/harness/types.d.ts.map +1 -1
  308. package/dist/agent/harness/types.js.map +1 -1
  309. package/dist/agent/model-config.d.ts +21 -20
  310. package/dist/agent/model-config.d.ts.map +1 -1
  311. package/dist/agent/model-config.js +31 -13
  312. package/dist/agent/model-config.js.map +1 -1
  313. package/dist/agent/production-agent.d.ts.map +1 -1
  314. package/dist/agent/production-agent.js +85 -10
  315. package/dist/agent/production-agent.js.map +1 -1
  316. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  317. package/dist/agent/thread-data-builder.js +27 -6
  318. package/dist/agent/thread-data-builder.js.map +1 -1
  319. package/dist/agent/tool-call-journal.d.ts +11 -9
  320. package/dist/agent/tool-call-journal.d.ts.map +1 -1
  321. package/dist/agent/tool-call-journal.js +92 -40
  322. package/dist/agent/tool-call-journal.js.map +1 -1
  323. package/dist/agent/types.d.ts +5 -1
  324. package/dist/agent/types.d.ts.map +1 -1
  325. package/dist/agent/types.js.map +1 -1
  326. package/dist/cli/design-connect.d.ts.map +1 -1
  327. package/dist/cli/design-connect.js +84 -0
  328. package/dist/cli/design-connect.js.map +1 -1
  329. package/dist/cli/gateway-helpers.d.ts +4 -0
  330. package/dist/cli/gateway-helpers.d.ts.map +1 -1
  331. package/dist/cli/gateway-helpers.js +9 -0
  332. package/dist/cli/gateway-helpers.js.map +1 -1
  333. package/dist/cli/recap.d.ts.map +1 -1
  334. package/dist/cli/recap.js +0 -2
  335. package/dist/cli/recap.js.map +1 -1
  336. package/dist/cli/skills.d.ts.map +1 -1
  337. package/dist/cli/skills.js +54 -16
  338. package/dist/cli/skills.js.map +1 -1
  339. package/dist/cli/workspace-dev.d.ts.map +1 -1
  340. package/dist/cli/workspace-dev.js +33 -6
  341. package/dist/cli/workspace-dev.js.map +1 -1
  342. package/dist/client/AssistantChat.d.ts.map +1 -1
  343. package/dist/client/AssistantChat.js +72 -26
  344. package/dist/client/AssistantChat.js.map +1 -1
  345. package/dist/client/CommandMenu.d.ts +6 -2
  346. package/dist/client/CommandMenu.d.ts.map +1 -1
  347. package/dist/client/CommandMenu.js +25 -14
  348. package/dist/client/CommandMenu.js.map +1 -1
  349. package/dist/client/DefaultSpinner.d.ts.map +1 -1
  350. package/dist/client/DefaultSpinner.js +8 -1
  351. package/dist/client/DefaultSpinner.js.map +1 -1
  352. package/dist/client/chat/message-components.d.ts +7 -1
  353. package/dist/client/chat/message-components.d.ts.map +1 -1
  354. package/dist/client/chat/message-components.js +37 -1
  355. package/dist/client/chat/message-components.js.map +1 -1
  356. package/dist/client/chat/repo-helpers.d.ts +1 -0
  357. package/dist/client/chat/repo-helpers.d.ts.map +1 -1
  358. package/dist/client/chat/repo-helpers.js +59 -0
  359. package/dist/client/chat/repo-helpers.js.map +1 -1
  360. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  361. package/dist/client/chat/run-recovery.js +4 -4
  362. package/dist/client/chat/run-recovery.js.map +1 -1
  363. package/dist/client/components/ApiKeySettings.js +8 -8
  364. package/dist/client/components/ApiKeySettings.js.map +1 -1
  365. package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
  366. package/dist/client/components/CodeRequiredDialog.js +24 -15
  367. package/dist/client/components/CodeRequiredDialog.js.map +1 -1
  368. package/dist/client/components/MissingKeyCard.d.ts.map +1 -1
  369. package/dist/client/components/MissingKeyCard.js +11 -6
  370. package/dist/client/components/MissingKeyCard.js.map +1 -1
  371. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  372. package/dist/client/composer/TiptapComposer.js +4 -3
  373. package/dist/client/composer/TiptapComposer.js.map +1 -1
  374. package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
  375. package/dist/client/extensions/ExtensionsSidebarSection.js +1 -1
  376. package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
  377. package/dist/client/guided-questions.d.ts.map +1 -1
  378. package/dist/client/guided-questions.js +6 -6
  379. package/dist/client/guided-questions.js.map +1 -1
  380. package/dist/client/integrations/IntegrationCard.js +1 -1
  381. package/dist/client/integrations/IntegrationCard.js.map +1 -1
  382. package/dist/client/integrations/IntegrationsPanel.js +1 -1
  383. package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
  384. package/dist/client/onboarding/OnboardingBanner.js +2 -2
  385. package/dist/client/onboarding/OnboardingBanner.js.map +1 -1
  386. package/dist/client/onboarding/OnboardingPanel.js +23 -19
  387. package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
  388. package/dist/client/resources/ResourceEditor.d.ts.map +1 -1
  389. package/dist/client/resources/ResourceEditor.js +13 -10
  390. package/dist/client/resources/ResourceEditor.js.map +1 -1
  391. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  392. package/dist/client/resources/ResourcesPanel.js +2 -1
  393. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  394. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  395. package/dist/client/settings/SettingsPanel.js +8 -3
  396. package/dist/client/settings/SettingsPanel.js.map +1 -1
  397. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  398. package/dist/client/settings/useBuilderStatus.js +6 -38
  399. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  400. package/dist/client/useProductionAgent.d.ts +2 -1
  401. package/dist/client/useProductionAgent.d.ts.map +1 -1
  402. package/dist/client/useProductionAgent.js.map +1 -1
  403. package/dist/deploy/build.js +1 -1
  404. package/dist/deploy/build.js.map +1 -1
  405. package/dist/notifications/routes.d.ts +3 -3
  406. package/dist/observability/routes.d.ts +3 -3
  407. package/dist/observability/traces.d.ts.map +1 -1
  408. package/dist/observability/traces.js.map +1 -1
  409. package/dist/onboarding/default-steps.js +1 -1
  410. package/dist/onboarding/default-steps.js.map +1 -1
  411. package/dist/scripts/agent-engines/manage-agent-engine.js +1 -1
  412. package/dist/scripts/agent-engines/manage-agent-engine.js.map +1 -1
  413. package/dist/scripts/agent-engines/set-agent-engine.js +1 -1
  414. package/dist/scripts/agent-engines/set-agent-engine.js.map +1 -1
  415. package/dist/server/agent-chat-plugin.d.ts +3 -0
  416. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  417. package/dist/server/agent-chat-plugin.js +134 -72
  418. package/dist/server/agent-chat-plugin.js.map +1 -1
  419. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  420. package/dist/server/core-routes-plugin.d.ts +3 -0
  421. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  422. package/dist/server/core-routes-plugin.js +4 -1
  423. package/dist/server/core-routes-plugin.js.map +1 -1
  424. package/dist/server/open-route.d.ts +9 -0
  425. package/dist/server/open-route.d.ts.map +1 -1
  426. package/dist/server/open-route.js +48 -38
  427. package/dist/server/open-route.js.map +1 -1
  428. package/dist/shared/reasoning-effort.js +3 -0
  429. package/dist/shared/reasoning-effort.js.map +1 -1
  430. package/dist/sharing/access.d.ts.map +1 -1
  431. package/dist/sharing/access.js +18 -2
  432. package/dist/sharing/access.js.map +1 -1
  433. package/dist/sharing/registry.d.ts +10 -0
  434. package/dist/sharing/registry.d.ts.map +1 -1
  435. package/dist/sharing/registry.js.map +1 -1
  436. package/dist/styles/agent-native.css +104 -20
  437. package/dist/styles/rich-markdown-editor.css +11 -10
  438. package/docs/content/cloneable-saas.mdx +2 -2
  439. package/docs/content/faq.mdx +1 -1
  440. package/docs/content/locales/ar-SA/cloneable-saas.mdx +2 -2
  441. package/docs/content/locales/ar-SA/faq.mdx +1 -1
  442. package/docs/content/locales/ar-SA/template-chat.mdx +1 -1
  443. package/docs/content/locales/de-DE/cloneable-saas.mdx +2 -2
  444. package/docs/content/locales/de-DE/faq.mdx +1 -1
  445. package/docs/content/locales/de-DE/template-chat.mdx +1 -1
  446. package/docs/content/locales/es-ES/cloneable-saas.mdx +2 -2
  447. package/docs/content/locales/es-ES/faq.mdx +1 -1
  448. package/docs/content/locales/es-ES/template-chat.mdx +1 -1
  449. package/docs/content/locales/fr-FR/cloneable-saas.mdx +2 -2
  450. package/docs/content/locales/fr-FR/faq.mdx +1 -1
  451. package/docs/content/locales/fr-FR/template-chat.mdx +1 -1
  452. package/docs/content/locales/hi-IN/cloneable-saas.mdx +2 -2
  453. package/docs/content/locales/hi-IN/faq.mdx +1 -1
  454. package/docs/content/locales/hi-IN/template-chat.mdx +1 -1
  455. package/docs/content/locales/ja-JP/cloneable-saas.mdx +2 -2
  456. package/docs/content/locales/ja-JP/faq.mdx +1 -1
  457. package/docs/content/locales/ja-JP/template-chat.mdx +1 -1
  458. package/docs/content/locales/ko-KR/cloneable-saas.mdx +2 -2
  459. package/docs/content/locales/ko-KR/faq.mdx +1 -1
  460. package/docs/content/locales/ko-KR/template-chat.mdx +1 -1
  461. package/docs/content/locales/pt-BR/cloneable-saas.mdx +2 -2
  462. package/docs/content/locales/pt-BR/faq.mdx +1 -1
  463. package/docs/content/locales/pt-BR/template-chat.mdx +1 -1
  464. package/docs/content/locales/zh-CN/cloneable-saas.mdx +2 -2
  465. package/docs/content/locales/zh-CN/faq.mdx +1 -1
  466. package/docs/content/locales/zh-CN/template-chat.mdx +1 -1
  467. package/docs/content/locales/zh-TW/cloneable-saas.mdx +2 -2
  468. package/docs/content/locales/zh-TW/faq.mdx +1 -1
  469. package/docs/content/locales/zh-TW/template-chat.mdx +1 -1
  470. package/docs/content/template-chat.mdx +1 -1
  471. package/package.json +1 -1
  472. package/corpus/templates/design/app/components/design/LocalSourceEditBanner.tsx +0 -157
  473. package/corpus/templates/design/app/lib/design-templates.ts +0 -1305
  474. package/corpus/templates/design/app/pages/Templates.tsx +0 -279
@@ -36,6 +36,7 @@ import {
36
36
 
37
37
  import { builderDocsBlockConfigs } from "./builder-docs-blocks";
38
38
  import { inlineDatabaseBlockConfig } from "./inline-database-block";
39
+ import { sourceComponentBlockConfig } from "./source-component-block";
39
40
 
40
41
  /**
41
42
  * Register the content block library (the dev-doc + OpenAPI + standard
@@ -62,6 +63,7 @@ export function registerContentBlocks(registry: BlockRegistry): void {
62
63
  for (const block of builderDocsBlockConfigs) {
63
64
  registry.register(block);
64
65
  }
66
+ registry.register(sourceComponentBlockConfig);
65
67
  registry.register(inlineDatabaseBlockConfig);
66
68
  }
67
69
 
@@ -0,0 +1,141 @@
1
+ import {
2
+ defineBlock,
3
+ type BlockMdxConfig,
4
+ type BlockSpec,
5
+ } from "@agent-native/core/blocks/server";
6
+ import { z } from "zod";
7
+
8
+ export interface SourceComponentData {
9
+ provider: string;
10
+ componentName: string;
11
+ rawRef: string;
12
+ rawHash: string;
13
+ sourceLabel?: string;
14
+ previewStatus?: "available" | "unavailable" | "warning";
15
+ previewKind?: "summary" | "table" | "embed" | "symbol" | "component";
16
+ previewUrl?: string;
17
+ previewItems?: string[];
18
+ preview?: SourceComponentPreview;
19
+ title?: string;
20
+ summary?: string;
21
+ }
22
+
23
+ export interface SourceComponentPreview {
24
+ status: "available" | "unavailable" | "warning";
25
+ kind: "summary" | "table" | "embed" | "symbol" | "component";
26
+ label: string;
27
+ summary?: string;
28
+ fields?: SourceComponentPreviewField[];
29
+ table?: SourceComponentPreviewTable;
30
+ url?: string;
31
+ }
32
+
33
+ export interface SourceComponentPreviewField {
34
+ label: string;
35
+ value: string;
36
+ }
37
+
38
+ export interface SourceComponentPreviewTable {
39
+ columns: SourceComponentPreviewTableColumn[];
40
+ rows: Record<string, string>[];
41
+ truncated?: boolean;
42
+ }
43
+
44
+ export interface SourceComponentPreviewTableColumn {
45
+ id: string;
46
+ label: string;
47
+ }
48
+
49
+ const sourceComponentPreviewFieldSchema = z.object({
50
+ label: z.string().trim().min(1).max(80),
51
+ value: z.string().trim().max(200),
52
+ });
53
+
54
+ const sourceComponentPreviewTableColumnSchema = z.object({
55
+ id: z.string().trim().min(1).max(80),
56
+ label: z.string().trim().min(1).max(120),
57
+ });
58
+
59
+ const sourceComponentPreviewTableSchema = z.object({
60
+ columns: z.array(sourceComponentPreviewTableColumnSchema).max(12),
61
+ rows: z.array(z.record(z.string(), z.string().max(500))).max(6),
62
+ truncated: z.boolean().optional(),
63
+ });
64
+
65
+ const sourceComponentPreviewSchema = z.object({
66
+ status: z.enum(["available", "unavailable", "warning"]),
67
+ kind: z.enum(["summary", "table", "embed", "symbol", "component"]),
68
+ label: z.string().trim().min(1).max(160),
69
+ summary: z.string().trim().max(500).optional(),
70
+ fields: z.array(sourceComponentPreviewFieldSchema).max(8).optional(),
71
+ table: sourceComponentPreviewTableSchema.optional(),
72
+ url: z.string().trim().max(2_000).optional(),
73
+ }) satisfies z.ZodType<SourceComponentPreview>;
74
+
75
+ export const sourceComponentSchema = z.object({
76
+ provider: z.string().trim().min(1).max(80),
77
+ componentName: z.string().trim().min(1).max(160),
78
+ rawRef: z.string().trim().min(1),
79
+ rawHash: z.string().trim().min(1),
80
+ sourceLabel: z.string().trim().max(200).optional(),
81
+ previewStatus: z.enum(["available", "unavailable", "warning"]).optional(),
82
+ previewKind: z
83
+ .enum(["summary", "table", "embed", "symbol", "component"])
84
+ .optional(),
85
+ previewUrl: z.string().trim().max(2_000).optional(),
86
+ previewItems: z.array(z.string().trim().max(160)).max(8).optional(),
87
+ preview: sourceComponentPreviewSchema.optional(),
88
+ title: z.string().trim().max(200).optional(),
89
+ summary: z.string().trim().max(500).optional(),
90
+ }) as unknown as z.ZodType<SourceComponentData>;
91
+
92
+ export const sourceComponentMdx: BlockMdxConfig<SourceComponentData> = {
93
+ tag: "SourceComponent",
94
+ toAttrs: (data) => ({
95
+ provider: data.provider,
96
+ componentName: data.componentName,
97
+ rawRef: data.rawRef,
98
+ rawHash: data.rawHash,
99
+ sourceLabel: data.sourceLabel,
100
+ previewStatus: data.previewStatus,
101
+ previewKind: data.previewKind,
102
+ previewUrl: data.previewUrl,
103
+ previewItems: data.previewItems,
104
+ preview: data.preview as Record<string, unknown> | undefined,
105
+ previewTitle: data.title,
106
+ summary: data.summary,
107
+ }),
108
+ fromAttrs: (attrs) => ({
109
+ provider: attrs.string("provider") ?? "",
110
+ componentName: attrs.string("componentName") ?? "",
111
+ rawRef: attrs.string("rawRef") ?? "",
112
+ rawHash: attrs.string("rawHash") ?? "",
113
+ sourceLabel: attrs.string("sourceLabel"),
114
+ previewStatus: attrs.string("previewStatus") as
115
+ | SourceComponentData["previewStatus"]
116
+ | undefined,
117
+ previewKind: attrs.string("previewKind") as
118
+ | SourceComponentData["previewKind"]
119
+ | undefined,
120
+ previewUrl: attrs.string("previewUrl"),
121
+ previewItems: attrs.array<string>("previewItems"),
122
+ preview: attrs.object<SourceComponentPreview>("preview"),
123
+ title: attrs.string("previewTitle") ?? attrs.string("title"),
124
+ summary: attrs.string("summary"),
125
+ }),
126
+ };
127
+
128
+ const ServerReadStub = () => null;
129
+
130
+ export const sourceComponentBlockConfig: BlockSpec<SourceComponentData> =
131
+ defineBlock<SourceComponentData>({
132
+ type: "source-component",
133
+ schema: sourceComponentSchema,
134
+ mdx: sourceComponentMdx,
135
+ Read: ServerReadStub,
136
+ placement: ["block"],
137
+ editSurface: "none",
138
+ label: "Source component",
139
+ description:
140
+ "A read-only source-native component marker that preserves provider-specific body blocks for round-trip sync.",
141
+ });
@@ -65,9 +65,14 @@ For one-shot agent setup, ask for JSON and keep the long-running bridge open in
65
65
  a second terminal if the user needs live updates:
66
66
 
67
67
  ```bash
68
- npx @agent-native/core@latest design connect --url http://localhost:5173 --root . --json
68
+ npx @agent-native/core@latest design connect --url http://localhost:5173 --root .
69
+ curl http://127.0.0.1:7331/manifest.json
69
70
  ```
70
71
 
72
+ Do not use `--json` for an editable session. `--json`, `--once`, and
73
+ `--dry-run` print the manifest and exit, so Design will fall back to a
74
+ non-editable live iframe as soon as it tries to refresh the snapshot.
75
+
71
76
  ## Action Flow
72
77
 
73
78
  1. Register or refresh the bridge in Design:
@@ -17,6 +17,7 @@ import { z } from "zod";
17
17
  import { getDb, schema } from "../server/db/index.js";
18
18
  import {
19
19
  mergeCanvasFramePlacements,
20
+ parseCanvasFrameGeometryById,
20
21
  type CanvasFramePlacement,
21
22
  } from "../shared/canvas-frames.js";
22
23
  import {
@@ -148,6 +149,25 @@ function uniqueFilename(
148
149
  return filename;
149
150
  }
150
151
 
152
+ export function viewportFilename(
153
+ pathOrUrl: string,
154
+ width: number,
155
+ height: number,
156
+ ) {
157
+ const viewport = `${Math.round(width)}x${Math.round(height)}`;
158
+ return `localhost-${slugForPath(pathOrUrl)}-${viewport}.html`;
159
+ }
160
+
161
+ function metadataNumber(
162
+ metadata: Record<string, unknown> | undefined,
163
+ key: "width" | "height",
164
+ ) {
165
+ const value = metadata?.[key];
166
+ return typeof value === "number" && Number.isFinite(value)
167
+ ? value
168
+ : undefined;
169
+ }
170
+
151
171
  export default defineAction({
152
172
  description:
153
173
  "Create or refresh URL-backed localhost screens in a design project. " +
@@ -179,14 +199,12 @@ export default defineAction({
179
199
  .number()
180
200
  .positive()
181
201
  .optional()
182
- .default(1280)
183
- .describe("Default iframe viewport width."),
202
+ .describe("Default iframe viewport width. Defaults to 1280."),
184
203
  defaultHeight: z
185
204
  .number()
186
205
  .positive()
187
206
  .optional()
188
- .default(900)
189
- .describe("Default iframe viewport height."),
207
+ .describe("Default iframe viewport height. Defaults to 900."),
190
208
  startX: z.number().optional().default(0),
191
209
  startY: z.number().optional().default(0),
192
210
  gap: z.number().optional().default(160),
@@ -292,6 +310,13 @@ export default defineAction({
292
310
  .from(schema.designs)
293
311
  .where(eq(schema.designs.id, designId))
294
312
  .limit(1);
313
+ const prevData = parseJson<Record<string, unknown>>(design?.data, {});
314
+ const existingCanvasFrames = parseCanvasFrameGeometryById(
315
+ prevData.canvasFrames,
316
+ );
317
+ const existingMetadata = isRecord(prevData.screenMetadata)
318
+ ? (prevData.screenMetadata as Record<string, unknown>)
319
+ : {};
295
320
  const existingFiles = await db
296
321
  .select()
297
322
  .from(schema.designFiles)
@@ -301,6 +326,8 @@ export default defineAction({
301
326
  );
302
327
  const usedFilenames = new Set(existingFiles.map((file) => file.filename));
303
328
  const now = new Date().toISOString();
329
+ const effectiveDefaultWidth = defaultWidth ?? 1280;
330
+ const effectiveDefaultHeight = defaultHeight ?? 900;
304
331
  const savedScreens: Array<{
305
332
  id: string;
306
333
  filename: string;
@@ -333,9 +360,38 @@ export default defineAction({
333
360
  const title =
334
361
  input.title ?? manifestRoute?.title ?? titleFromRoutePath(path);
335
362
  const sourceFile = input.sourceFile ?? manifestRoute?.sourceFile;
336
- const width = input.width ?? defaultWidth;
337
- const height = input.height ?? defaultHeight;
338
- const preferredFilename = `localhost-${slugForPath(path)}.html`;
363
+ const width = input.width ?? effectiveDefaultWidth;
364
+ const height = input.height ?? effectiveDefaultHeight;
365
+ const basePreferredFilename = `localhost-${slugForPath(path)}.html`;
366
+ const existingBase = existingByFilename.get(basePreferredFilename);
367
+ const requestedViewportExplicitly =
368
+ input.width !== undefined ||
369
+ input.height !== undefined ||
370
+ defaultWidth !== undefined ||
371
+ defaultHeight !== undefined;
372
+ const existingBaseMetadata = isRecord(
373
+ existingBase ? existingMetadata[existingBase.id] : undefined,
374
+ )
375
+ ? (existingMetadata[existingBase!.id] as Record<string, unknown>)
376
+ : undefined;
377
+ const existingBaseFrame = existingBase
378
+ ? existingCanvasFrames[existingBase.id]
379
+ : undefined;
380
+ const existingBaseWidth =
381
+ existingBaseFrame?.width ??
382
+ metadataNumber(existingBaseMetadata, "width");
383
+ const existingBaseHeight =
384
+ existingBaseFrame?.height ??
385
+ metadataNumber(existingBaseMetadata, "height");
386
+ const viewportDiffersFromBase =
387
+ (typeof existingBaseWidth === "number" &&
388
+ existingBaseWidth !== width) ||
389
+ (typeof existingBaseHeight === "number" &&
390
+ existingBaseHeight !== height);
391
+ const preferredFilename =
392
+ existingBase && requestedViewportExplicitly && viewportDiffersFromBase
393
+ ? viewportFilename(path, width, height)
394
+ : basePreferredFilename;
339
395
  const existing = existingByFilename.get(preferredFilename);
340
396
  const filename =
341
397
  existing?.filename ??
@@ -387,7 +443,6 @@ export default defineAction({
387
443
  });
388
444
  }
389
445
 
390
- const prevData = parseJson<Record<string, unknown>>(design?.data, {});
391
446
  const mergedFrames = mergeCanvasFramePlacements({
392
447
  existing: prevData.canvasFrames,
393
448
  placements,
@@ -31,6 +31,7 @@ import {
31
31
  assertSafeMotionCssProperty,
32
32
  assertSafeMotionCssToken,
33
33
  compile,
34
+ injectManagedMotionCss,
34
35
  } from "../shared/motion-compiler.js";
35
36
  import type { MotionTrack } from "../shared/motion-timeline.js";
36
37
 
@@ -69,55 +70,12 @@ const trackSchema = z.object({
69
70
 
70
71
  // ─── Helpers ──────────────────────────────────────────────────────────────────
71
72
 
72
- const MOTION_STYLE_OPEN = "<style data-agent-native-motion>";
73
- const MOTION_STYLE_CLOSE = "</style>";
74
-
75
- /**
76
- * Bounded, case-insensitive matcher for any HTML `</style>` end tag
77
- * (`</style >`, `</STYLE>`, …). Used to locate the close of the managed block
78
- * without a naive `indexOf("</style>")` that would miss case/whitespace
79
- * variants — and to detect any `</style` sequence smuggled into compiled CSS.
80
- */
81
- const STYLE_CLOSE_RE = /<\s*\/\s*style\b[^>]*>/i;
82
-
83
- /**
84
- * Inject or replace the managed `<style data-agent-native-motion>` block in
85
- * the HTML content. Inserts before `</head>` when not already present.
86
- */
87
- function injectMotionStyle(html: string, css: string): string {
88
- const open = MOTION_STYLE_OPEN;
89
- const close = MOTION_STYLE_CLOSE;
90
- const openIdx = html.indexOf(open);
91
-
92
- if (openIdx !== -1) {
93
- // Find the matching closing tag after the open tag using a bounded regex
94
- // (tolerates `</style >`, `</STYLE>`, etc.) instead of a literal indexOf.
95
- const after = html.slice(openIdx + open.length);
96
- const closeMatch = STYLE_CLOSE_RE.exec(after);
97
- if (closeMatch) {
98
- const closeIdx = openIdx + open.length + closeMatch.index;
99
- // Replace the existing block.
100
- return (
101
- html.slice(0, openIdx) + open + "\n" + css + "\n" + html.slice(closeIdx)
102
- );
103
- }
104
- }
105
-
106
- // Not found — insert before </head> or, if there is no <head>, at the top.
107
- const headClose = html.lastIndexOf("</head>");
108
- const block = `${open}\n${css}\n${close}`;
109
- if (headClose !== -1) {
110
- return html.slice(0, headClose) + block + "\n" + html.slice(headClose);
111
- }
112
- return block + "\n" + html;
113
- }
114
-
115
73
  async function persistFileContent(
116
74
  fileId: string,
117
75
  designId: string,
118
76
  content: string,
119
77
  now: string,
120
- ): Promise<void> {
78
+ ): Promise<string> {
121
79
  const db = getDb();
122
80
  await db
123
81
  .update(schema.designFiles)
@@ -134,6 +92,8 @@ async function persistFileContent(
134
92
  .update(schema.designs)
135
93
  .set({ updatedAt: now })
136
94
  .where(eq(schema.designs.id, designId));
95
+
96
+ return now;
137
97
  }
138
98
 
139
99
  // ─── Action ───────────────────────────────────────────────────────────────────
@@ -296,7 +256,7 @@ export default defineAction({
296
256
  });
297
257
 
298
258
  // ── 3. Inject the managed CSS block into the HTML ───────────────────────
299
- const patchedContent = injectMotionStyle(currentContent, css);
259
+ const patchedContent = injectManagedMotionCss(currentContent, css);
300
260
  const bytesBefore = currentContent.length;
301
261
  const bytesAfter = patchedContent.length;
302
262
 
@@ -392,7 +352,12 @@ export default defineAction({
392
352
  // Written after the row so a SQL failure here leaves the timeline row
393
353
  // accurate (correct tracks + hash) and the stale HTML can be recompiled on
394
354
  // the next apply-motion-edit call via compiledHash drift detection.
395
- await persistFileContent(fileId, designId, patchedContent, now);
355
+ const updatedAt = await persistFileContent(
356
+ fileId,
357
+ designId,
358
+ patchedContent,
359
+ now,
360
+ );
396
361
 
397
362
  return {
398
363
  timelineId: resolvedTimelineId,
@@ -401,6 +366,7 @@ export default defineAction({
401
366
  sourceRef: resolvedSourceRef,
402
367
  trackCount: typedTracks.length,
403
368
  compiledHash: hash,
369
+ updatedAt,
404
370
  bytesBefore,
405
371
  bytesAfter,
406
372
  bytesDelta: bytesAfter - bytesBefore,
@@ -90,7 +90,8 @@ export default defineAction({
90
90
  }),
91
91
  http: { method: "GET" },
92
92
  readOnly: true,
93
- publicAgent: { expose: true, readOnly: true, requiresAuth: true },
93
+ requiresAuth: false,
94
+ publicAgent: { expose: true, readOnly: true, requiresAuth: false },
94
95
  run: ({ category }) => {
95
96
  const assets = category
96
97
  ? DESIGN_NATIVE_ASSETS.filter((asset) => asset.category === category)
@@ -39,6 +39,7 @@ import { z } from "zod";
39
39
  import { getDb, schema } from "../server/db/index.js";
40
40
  import {
41
41
  BOARD_FILENAME,
42
+ backfillBoardPrimitiveMarkers,
42
43
  boardObjectEntryToHtmlFragment,
43
44
  emptyBoardHtml,
44
45
  } from "../shared/board-file.js";
@@ -91,10 +92,57 @@ export default defineAction({
91
92
  typeof parsed["boardFileId"] === "string" &&
92
93
  parsed["boardFileId"].length > 0
93
94
  ) {
95
+ // ── Marker backfill path ───────────────────────────────────────────────
96
+ // The board file exists (boardFileId set), but it may have been created
97
+ // before the data-an-primitive marker was introduced. Run the additive
98
+ // backfill so the layers-panel renders the correct icon (ellipse / text /
99
+ // frame / rectangle) instead of the generic code glyph.
100
+ const existingBoardFileId = parsed["boardFileId"] as string;
101
+
102
+ const [boardFileRow] = await db
103
+ .select({ content: schema.designFiles.content })
104
+ .from(schema.designFiles)
105
+ .where(eq(schema.designFiles.id, existingBoardFileId))
106
+ .limit(1);
107
+
108
+ if (boardFileRow) {
109
+ const originalContent = boardFileRow.content ?? "";
110
+ // Only run backfill when the board file has node-id elements but is
111
+ // missing at least one data-an-primitive marker.
112
+ const needsBackfill =
113
+ originalContent.includes("data-agent-native-node-id=") &&
114
+ !originalContent.includes("data-an-primitive=");
115
+
116
+ if (needsBackfill) {
117
+ const backfilledContent =
118
+ backfillBoardPrimitiveMarkers(originalContent);
119
+ const now = new Date().toISOString();
120
+ await db
121
+ .update(schema.designFiles)
122
+ .set({ content: backfilledContent, updatedAt: now })
123
+ .where(eq(schema.designFiles.id, existingBoardFileId));
124
+
125
+ // Best-effort collab re-seed.
126
+ try {
127
+ await seedFromText(existingBoardFileId, backfilledContent);
128
+ } catch {
129
+ // Non-fatal.
130
+ }
131
+
132
+ return {
133
+ designId,
134
+ migrated: false,
135
+ boardFileId: existingBoardFileId,
136
+ reason:
137
+ "boardFileId already set — backfilled missing data-an-primitive markers.",
138
+ };
139
+ }
140
+ }
141
+
94
142
  return {
95
143
  designId,
96
144
  migrated: false,
97
- boardFileId: parsed["boardFileId"] as string,
145
+ boardFileId: existingBoardFileId,
98
146
  reason: "boardFileId already set — migration already complete.",
99
147
  };
100
148
  }
@@ -10,12 +10,11 @@
10
10
  * pnpm action navigate --view=editor --designId=abc123 --filename=checkout.html
11
11
  * pnpm action navigate --view=design-systems
12
12
  * pnpm action navigate --view=design-systems --designSystemId=abc123
13
- * pnpm action navigate --view=templates
14
13
  * pnpm action navigate --view=settings
15
14
  * pnpm action navigate --path=/some/route
16
15
  *
17
16
  * Options:
18
- * --view View name (list, editor, design-systems, present, templates, settings)
17
+ * --view View name (list, editor, design-systems, present, settings)
19
18
  * --designId Design ID (for editor/present views)
20
19
  * --editorView Editor mode for designs: single or overview
21
20
  * --inspectorTab Inspector tab for designs: design or tweaks (extensions opens Tools for compatibility)
@@ -58,19 +57,11 @@ const designLeftPanelSchema = z.enum([
58
57
 
59
58
  export default defineAction({
60
59
  description:
61
- "Navigate the UI to a specific view or path. Views: list, editor, design-systems, present, templates, settings. Use --designId with editor/present views and --designSystemId with design-systems. For designs, use editorView=overview to show the infinite screens canvas, or editorView=single with fileId/filename/screen to focus a screen. Use leftPanel=file|agent|assets|tools|tokens to focus the Figma-style left rail. Legacy inspectorTab=extensions opens Tools. Use tool to activate a design editor tool.",
60
+ "Navigate the UI to a specific view or path. Views: list, editor, design-systems, present, settings. Use --designId with editor/present views and --designSystemId with design-systems. For designs, use editorView=overview to show the infinite screens canvas, or editorView=single with fileId/filename/screen to focus a screen. Use leftPanel=file|agent|assets|tools|tokens to focus the Figma-style left rail. Legacy inspectorTab=extensions opens Tools. Use tool to activate a design editor tool.",
62
61
  schema: z
63
62
  .object({
64
63
  view: z
65
- .enum([
66
- "list",
67
- "editor",
68
- "design-systems",
69
- "present",
70
- "templates",
71
- "examples",
72
- "settings",
73
- ])
64
+ .enum(["list", "editor", "design-systems", "present", "settings"])
74
65
  .optional()
75
66
  .describe("View name to navigate to"),
76
67
  designId: z.string().optional().describe("Design ID for editor/present"),