@agent-native/core 0.83.0 → 0.84.1

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 (508) 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/evals.mdx +34 -12
  7. package/corpus/core/docs/content/faq.mdx +1 -1
  8. package/corpus/core/docs/content/locales/ar-SA/cloneable-saas.mdx +2 -2
  9. package/corpus/core/docs/content/locales/ar-SA/evals.mdx +7 -0
  10. package/corpus/core/docs/content/locales/ar-SA/faq.mdx +1 -1
  11. package/corpus/core/docs/content/locales/ar-SA/template-chat.mdx +1 -1
  12. package/corpus/core/docs/content/locales/de-DE/cloneable-saas.mdx +2 -2
  13. package/corpus/core/docs/content/locales/de-DE/evals.mdx +8 -0
  14. package/corpus/core/docs/content/locales/de-DE/faq.mdx +1 -1
  15. package/corpus/core/docs/content/locales/de-DE/template-chat.mdx +1 -1
  16. package/corpus/core/docs/content/locales/es-ES/cloneable-saas.mdx +2 -2
  17. package/corpus/core/docs/content/locales/es-ES/evals.mdx +8 -0
  18. package/corpus/core/docs/content/locales/es-ES/faq.mdx +1 -1
  19. package/corpus/core/docs/content/locales/es-ES/template-chat.mdx +1 -1
  20. package/corpus/core/docs/content/locales/fr-FR/cloneable-saas.mdx +2 -2
  21. package/corpus/core/docs/content/locales/fr-FR/evals.mdx +8 -0
  22. package/corpus/core/docs/content/locales/fr-FR/faq.mdx +1 -1
  23. package/corpus/core/docs/content/locales/fr-FR/template-chat.mdx +1 -1
  24. package/corpus/core/docs/content/locales/hi-IN/cloneable-saas.mdx +2 -2
  25. package/corpus/core/docs/content/locales/hi-IN/evals.mdx +8 -0
  26. package/corpus/core/docs/content/locales/hi-IN/faq.mdx +1 -1
  27. package/corpus/core/docs/content/locales/hi-IN/template-chat.mdx +1 -1
  28. package/corpus/core/docs/content/locales/ja-JP/cloneable-saas.mdx +2 -2
  29. package/corpus/core/docs/content/locales/ja-JP/evals.mdx +7 -0
  30. package/corpus/core/docs/content/locales/ja-JP/faq.mdx +1 -1
  31. package/corpus/core/docs/content/locales/ja-JP/template-chat.mdx +1 -1
  32. package/corpus/core/docs/content/locales/ko-KR/cloneable-saas.mdx +2 -2
  33. package/corpus/core/docs/content/locales/ko-KR/evals.mdx +7 -0
  34. package/corpus/core/docs/content/locales/ko-KR/faq.mdx +1 -1
  35. package/corpus/core/docs/content/locales/ko-KR/template-chat.mdx +1 -1
  36. package/corpus/core/docs/content/locales/pt-BR/cloneable-saas.mdx +2 -2
  37. package/corpus/core/docs/content/locales/pt-BR/evals.mdx +8 -0
  38. package/corpus/core/docs/content/locales/pt-BR/faq.mdx +1 -1
  39. package/corpus/core/docs/content/locales/pt-BR/template-chat.mdx +1 -1
  40. package/corpus/core/docs/content/locales/zh-CN/cloneable-saas.mdx +2 -2
  41. package/corpus/core/docs/content/locales/zh-CN/evals.mdx +7 -0
  42. package/corpus/core/docs/content/locales/zh-CN/faq.mdx +1 -1
  43. package/corpus/core/docs/content/locales/zh-CN/template-chat.mdx +1 -1
  44. package/corpus/core/docs/content/locales/zh-TW/cloneable-saas.mdx +2 -2
  45. package/corpus/core/docs/content/locales/zh-TW/evals.mdx +7 -0
  46. package/corpus/core/docs/content/locales/zh-TW/faq.mdx +1 -1
  47. package/corpus/core/docs/content/locales/zh-TW/template-chat.mdx +1 -1
  48. package/corpus/core/docs/content/template-chat.mdx +1 -1
  49. package/corpus/core/package.json +1 -1
  50. package/corpus/core/src/agent/engine/builtin.ts +1 -1
  51. package/corpus/core/src/agent/engine/output-tokens.ts +1 -1
  52. package/corpus/core/src/agent/harness/acp-adapter.ts +28 -4
  53. package/corpus/core/src/agent/harness/ai-sdk-adapter.ts +3 -0
  54. package/corpus/core/src/agent/harness/translate.ts +3 -0
  55. package/corpus/core/src/agent/harness/types.ts +1 -0
  56. package/corpus/core/src/agent/model-config.ts +34 -13
  57. package/corpus/core/src/agent/production-agent.ts +87 -10
  58. package/corpus/core/src/agent/thread-data-builder.ts +29 -4
  59. package/corpus/core/src/agent/tool-call-journal.ts +109 -48
  60. package/corpus/core/src/agent/types.ts +6 -1
  61. package/corpus/core/src/cli/design-connect.ts +106 -0
  62. package/corpus/core/src/cli/gateway-helpers.ts +17 -0
  63. package/corpus/core/src/cli/recap.ts +0 -2
  64. package/corpus/core/src/cli/skills.ts +54 -16
  65. package/corpus/core/src/cli/workspace-dev.ts +29 -5
  66. package/corpus/core/src/client/AssistantChat.tsx +89 -42
  67. package/corpus/core/src/client/DefaultSpinner.tsx +8 -1
  68. package/corpus/core/src/client/chat/message-components.tsx +49 -1
  69. package/corpus/core/src/client/chat/repo-helpers.ts +71 -0
  70. package/corpus/core/src/client/chat/run-recovery.tsx +15 -5
  71. package/corpus/core/src/client/components/ApiKeySettings.tsx +8 -8
  72. package/corpus/core/src/client/components/CodeRequiredDialog.tsx +26 -15
  73. package/corpus/core/src/client/components/MissingKeyCard.tsx +13 -6
  74. package/corpus/core/src/client/composer/TiptapComposer.tsx +4 -3
  75. package/corpus/core/src/client/extensions/ExtensionsSidebarSection.tsx +0 -1
  76. package/corpus/core/src/client/guided-questions.tsx +21 -27
  77. package/corpus/core/src/client/integrations/IntegrationCard.tsx +1 -1
  78. package/corpus/core/src/client/integrations/IntegrationsPanel.tsx +1 -1
  79. package/corpus/core/src/client/onboarding/OnboardingBanner.tsx +2 -2
  80. package/corpus/core/src/client/onboarding/OnboardingPanel.tsx +23 -19
  81. package/corpus/core/src/client/resources/ResourceEditor.tsx +18 -10
  82. package/corpus/core/src/client/resources/ResourcesPanel.tsx +5 -1
  83. package/corpus/core/src/client/settings/SettingsPanel.tsx +8 -3
  84. package/corpus/core/src/client/settings/useBuilderStatus.ts +8 -41
  85. package/corpus/core/src/client/useProductionAgent.ts +6 -2
  86. package/corpus/core/src/deploy/build.ts +1 -1
  87. package/corpus/core/src/eval/define-eval.ts +4 -1
  88. package/corpus/core/src/eval/report.ts +23 -8
  89. package/corpus/core/src/eval/runner.ts +41 -6
  90. package/corpus/core/src/eval/types.ts +11 -0
  91. package/corpus/core/src/observability/traces.ts +3 -3
  92. package/corpus/core/src/onboarding/default-steps.ts +1 -1
  93. package/corpus/core/src/scripts/agent-engines/manage-agent-engine.ts +1 -1
  94. package/corpus/core/src/scripts/agent-engines/set-agent-engine.ts +1 -1
  95. package/corpus/core/src/server/agent-chat-plugin.ts +177 -81
  96. package/corpus/core/src/server/core-routes-plugin.ts +7 -1
  97. package/corpus/core/src/server/open-route.ts +59 -40
  98. package/corpus/core/src/shared/reasoning-effort.ts +2 -0
  99. package/corpus/core/src/sharing/access.ts +22 -2
  100. package/corpus/core/src/sharing/registry.ts +18 -0
  101. package/corpus/core/src/styles/agent-native.css +104 -20
  102. package/corpus/core/src/styles/rich-markdown-editor.css +11 -10
  103. package/corpus/templates/analytics/app/components/dashboard/CumulativeNetChart.tsx +10 -10
  104. package/corpus/templates/analytics/app/components/dashboard/RevenueChart.tsx +10 -10
  105. package/corpus/templates/analytics/app/components/dashboard/RevenueComparisonChart.tsx +6 -5
  106. package/corpus/templates/analytics/app/components/dashboard/TimeSeriesChart.tsx +9 -9
  107. package/corpus/templates/analytics/app/global.css +4 -0
  108. package/corpus/templates/analytics/app/lib/chart-theme.ts +13 -0
  109. package/corpus/templates/analytics/app/pages/adhoc/_shared/KpiChart.tsx +22 -24
  110. package/corpus/templates/analytics/changelog/2026-06-30-dashboard-charts-now-use-theme-aware-tooltip-and-grid-colors.md +6 -0
  111. package/corpus/templates/analytics/changelog/2026-06-30-fixed-ask-composer-spacing-so-the-chat-field-has-a-comfortab.md +6 -0
  112. package/corpus/templates/calendar/AGENTS.md +4 -0
  113. package/corpus/templates/calendar/actions/connect-google-calendar.ts +80 -0
  114. package/corpus/templates/calendar/changelog/2026-06-30-calendar-now-gives-the-agent-a-safe-google-connection-link-i.md +6 -0
  115. package/corpus/templates/calendar/server/plugins/agent-chat.ts +4 -0
  116. package/corpus/templates/content/AGENTS.md +9 -2
  117. package/corpus/templates/content/actions/_database-row-batch.ts +230 -0
  118. package/corpus/templates/content/actions/_database-utils.ts +17 -9
  119. package/corpus/templates/content/actions/_notion-action-utils.ts +26 -0
  120. package/corpus/templates/content/actions/connect-notion-status.ts +13 -4
  121. package/corpus/templates/content/actions/create-and-link-notion-page.ts +23 -0
  122. package/corpus/templates/content/actions/delete-database-items.ts +55 -0
  123. package/corpus/templates/content/actions/delete-document.ts +4 -4
  124. package/corpus/templates/content/actions/disconnect-notion.ts +16 -0
  125. package/corpus/templates/content/actions/duplicate-database-item.ts +1 -1
  126. package/corpus/templates/content/actions/duplicate-database-items.ts +191 -0
  127. package/corpus/templates/content/actions/link-notion-page.ts +10 -7
  128. package/corpus/templates/content/actions/list-notion-links.ts +3 -4
  129. package/corpus/templates/content/actions/pull-notion-page.ts +7 -9
  130. package/corpus/templates/content/actions/push-notion-page.ts +7 -9
  131. package/corpus/templates/content/actions/refresh-notion-sync-status.ts +24 -0
  132. package/corpus/templates/content/actions/resolve-notion-sync-conflict.ts +23 -0
  133. package/corpus/templates/content/actions/search-notion-pages.ts +67 -0
  134. package/corpus/templates/content/actions/unlink-notion-page.ts +23 -0
  135. package/corpus/templates/content/app/components/editor/BubbleToolbar.tsx +5 -5
  136. package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +27 -34
  137. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +16 -13
  138. package/corpus/templates/content/app/components/editor/DocumentToolbar.tsx +10 -10
  139. package/corpus/templates/content/app/components/editor/NotionConflictBanner.tsx +1 -1
  140. package/corpus/templates/content/app/components/editor/NotionSyncBar.tsx +18 -9
  141. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +27 -34
  142. package/corpus/templates/content/app/components/editor/database/navigation-state.ts +10 -4
  143. package/corpus/templates/content/app/components/sidebar/NotionButton.tsx +32 -17
  144. package/corpus/templates/content/app/global.css +6 -5
  145. package/corpus/templates/content/app/hooks/use-content-database.ts +35 -0
  146. package/corpus/templates/content/app/hooks/use-notion.ts +108 -99
  147. package/corpus/templates/content/changelog/2026-06-30-editor-floating-toolbars-now-use-theme-aware-colors-in-light.md +6 -0
  148. package/corpus/templates/content/package.json +3 -0
  149. package/corpus/templates/content/parity/README.md +69 -0
  150. package/corpus/templates/content/parity/eval-scenarios.ts +118 -0
  151. package/corpus/templates/content/parity/exceptions.allowlist.ts +17 -0
  152. package/corpus/templates/content/parity/matrix.md +28 -0
  153. package/corpus/templates/content/parity/matrix.ts +606 -0
  154. package/corpus/templates/content/parity/matrix.types.ts +42 -0
  155. package/corpus/templates/content/parity/parity-evals.eval.ts +4 -0
  156. package/corpus/templates/content/parity/render-matrix.ts +90 -0
  157. package/corpus/templates/content/parity/scenario-to-eval.ts +57 -0
  158. package/corpus/templates/content/shared/api.ts +11 -0
  159. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +6 -1
  160. package/corpus/templates/design/actions/add-localhost-screens.ts +63 -8
  161. package/corpus/templates/design/actions/apply-motion-edit.ts +12 -46
  162. package/corpus/templates/design/actions/list-design-native-assets.ts +2 -1
  163. package/corpus/templates/design/actions/migrate-board-objects-to-file.ts +49 -1
  164. package/corpus/templates/design/actions/navigate.ts +3 -12
  165. package/corpus/templates/design/actions/open-visual-edit.ts +341 -0
  166. package/corpus/templates/design/actions/view-screen.ts +1 -1
  167. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +1 -1
  168. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +345 -14
  169. package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +71 -91
  170. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +25 -27
  171. package/corpus/templates/design/app/components/design/DeviceFrame.tsx +1 -1
  172. package/corpus/templates/design/app/components/design/DrawOverlay.tsx +2 -2
  173. package/corpus/templates/design/app/components/design/EditPanel.tsx +1111 -570
  174. package/corpus/templates/design/app/components/design/LayersPanel.tsx +162 -32
  175. package/corpus/templates/design/app/components/design/MotionDock.tsx +268 -240
  176. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +1038 -150
  177. package/corpus/templates/design/app/components/design/QuestionFlow.tsx +1 -1
  178. package/corpus/templates/design/app/components/design/ReviewPanel.tsx +81 -102
  179. package/corpus/templates/design/app/components/design/StatesPanel.tsx +6 -6
  180. package/corpus/templates/design/app/components/design/TokensPanel.tsx +11 -11
  181. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +9 -7
  182. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +1129 -155
  183. package/corpus/templates/design/app/components/design/bridge/hit-test.bridge.ts +130 -37
  184. package/corpus/templates/design/app/components/design/canvas-primitive-style.ts +24 -11
  185. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +184 -162
  186. package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +137 -79
  187. package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +13 -13
  188. package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +8 -8
  189. package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +2 -2
  190. package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +4 -4
  191. package/corpus/templates/design/app/components/design/inspector/InspectorAiActions.tsx +3 -3
  192. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +13 -7
  193. package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +14 -11
  194. package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +4 -4
  195. package/corpus/templates/design/app/components/design/inspector/index.ts +2 -0
  196. package/corpus/templates/design/app/components/design/types.ts +19 -0
  197. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +61 -78
  198. package/corpus/templates/design/app/components/layout/Header.tsx +0 -1
  199. package/corpus/templates/design/app/components/layout/Layout.tsx +3 -2
  200. package/corpus/templates/design/app/components/layout/Sidebar.tsx +0 -2
  201. package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +5 -4
  202. package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +1 -1
  203. package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +2 -2
  204. package/corpus/templates/design/app/global.css +56 -0
  205. package/corpus/templates/design/app/hooks/use-agent-generating.ts +4 -5
  206. package/corpus/templates/design/app/hooks/use-navigation-state.ts +6 -7
  207. package/corpus/templates/design/app/hooks/use-question-flow.ts +3 -2
  208. package/corpus/templates/design/app/hooks/useAgentEditRequest.ts +6 -4
  209. package/corpus/templates/design/app/i18n/zh-TW.ts +5 -14
  210. package/corpus/templates/design/app/i18n-data.ts +63 -188
  211. package/corpus/templates/design/app/lib/agent-chat.ts +13 -0
  212. package/corpus/templates/design/app/pages/DesignEditor.tsx +1428 -384
  213. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +9 -5
  214. package/corpus/templates/design/app/pages/DesignSystems.tsx +2 -2
  215. package/corpus/templates/design/app/pages/Index.tsx +49 -26
  216. package/corpus/templates/design/app/pages/NotFound.tsx +25 -8
  217. package/corpus/templates/design/app/pages/VisualEdit.tsx +17 -5
  218. package/corpus/templates/design/app/routes/examples.tsx +1 -7
  219. package/corpus/templates/design/app/routes/templates.tsx +7 -4
  220. package/corpus/templates/design/changelog/2026-06-30-board-shapes-and-auto-layout-controls-are-clearer.md +6 -0
  221. package/corpus/templates/design/changelog/2026-06-30-component-selections-now-use-purple-component-chrome-and-sho.md +6 -0
  222. package/corpus/templates/design/changelog/2026-06-30-constraints-now-stay-tucked-into-a-compact-inspector-preview.md +6 -0
  223. package/corpus/templates/design/changelog/2026-06-30-creating-a-component-now-opens-in-a-compact-inspector-popove.md +6 -0
  224. package/corpus/templates/design/changelog/2026-06-30-design-cards-no-longer-show-legacy-project-type-badges.md +6 -0
  225. package/corpus/templates/design/changelog/2026-06-30-design-chat-now-keeps-new-turns-in-the-visible-design-agent-.md +6 -0
  226. package/corpus/templates/design/changelog/2026-06-30-design-editor-panels-now-keep-their-compact-text-sizing-cons.md +6 -0
  227. package/corpus/templates/design/changelog/2026-06-30-design-no-longer-shows-the-connected-local-code-warning-bann.md +6 -0
  228. package/corpus/templates/design/changelog/2026-06-30-design-now-opens-to-the-files-panel-unless-a-generation-is-a.md +6 -0
  229. package/corpus/templates/design/changelog/2026-06-30-design-opens-with-a-cleaner-empty-canvas-and-loading-preview.md +6 -0
  230. package/corpus/templates/design/changelog/2026-06-30-design-tools-use-simpler-less-decorative-icons.md +6 -0
  231. package/corpus/templates/design/changelog/2026-06-30-dragging-absolute-elements-no-longer-shows-coordinate-labels.md +6 -0
  232. package/corpus/templates/design/changelog/2026-06-30-fixed-all-screens-opening-too-zoomed-in-by-default.md +6 -0
  233. package/corpus/templates/design/changelog/2026-06-30-fixed-the-public-design-assets-sidebar-so-native-components-.md +6 -0
  234. package/corpus/templates/design/changelog/2026-06-30-fixed-the-screen-overview-board-so-empty-board-space-no-long.md +6 -0
  235. package/corpus/templates/design/changelog/2026-06-30-full-view-screens-can-now-scroll-while-remaining-editable.md +6 -0
  236. package/corpus/templates/design/changelog/2026-06-30-inspector-element-headers-show-the-selected-html-tag-and-the.md +6 -0
  237. package/corpus/templates/design/changelog/2026-06-30-inspector-inputs-stay-compact-across-desktop-breakpoints.md +6 -0
  238. package/corpus/templates/design/changelog/2026-06-30-layers-can-be-multi-selected-from-the-canvas-and-edited-toge.md +6 -0
  239. package/corpus/templates/design/changelog/2026-06-30-local-visual-edit-links-can-edit-localhost-frames-without-si.md +6 -0
  240. package/corpus/templates/design/changelog/2026-06-30-localhost-visual-edit-frames-can-now-be-selected-and-edited.md +6 -0
  241. package/corpus/templates/design/changelog/2026-06-30-marquee-selection-now-works-inside-screens-multi-selected-la.md +6 -0
  242. package/corpus/templates/design/changelog/2026-06-30-motion-is-now-available-from-the-persistent-left-rail-and-th.md +6 -0
  243. package/corpus/templates/design/changelog/2026-06-30-motion-timeline-collapse-and-reopen-animations-feel-smoother.md +6 -0
  244. package/corpus/templates/design/changelog/2026-06-30-multi-select-outlines-now-stay-consistent-across-all-screens.md +6 -0
  245. package/corpus/templates/design/changelog/2026-06-30-new-board-shapes-now-start-with-neutral-gray-styling.md +6 -0
  246. package/corpus/templates/design/changelog/2026-06-30-new-designs-open-into-a-steadier-loading-state-before-the-ed.md +6 -0
  247. package/corpus/templates/design/changelog/2026-06-30-new-designs-show-a-loading-state-during-handoff-and-keep-edi.md +6 -0
  248. package/corpus/templates/design/changelog/2026-06-30-public-visual-edit-design-links-now-open-directly-instead-of.md +6 -0
  249. package/corpus/templates/design/changelog/2026-06-30-removed-the-confusing-states-section-from-the-design-editor-.md +6 -0
  250. package/corpus/templates/design/changelog/2026-06-30-removed-the-templates-gallery-from-design-navigation.md +6 -0
  251. package/corpus/templates/design/changelog/2026-06-30-share-stays-visible-as-soon-as-editable-designs-load.md +6 -0
  252. package/corpus/templates/design/changelog/2026-06-30-signed-out-save-and-share-controls-use-simpler-labels-and-op.md +6 -0
  253. package/corpus/templates/design/changelog/2026-06-30-text-added-on-the-canvas-now-focuses-cleanly-with-the-right-.md +6 -0
  254. package/corpus/templates/design/changelog/2026-06-30-the-design-editor-loading-skeleton-is-simpler-and-its-bottom.md +6 -0
  255. package/corpus/templates/design/changelog/2026-06-30-the-design-editor-loading-skeleton-now-follows-the-current-t.md +6 -0
  256. package/corpus/templates/design/changelog/2026-06-30-the-design-inspector-no-longer-shows-child-layout-controls-o.md +6 -0
  257. package/corpus/templates/design/changelog/2026-06-30-the-design-inspector-no-longer-shows-the-ask-ai-section-abov.md +6 -0
  258. package/corpus/templates/design/changelog/2026-06-30-the-design-review-panel-no-longer-shows-a-separate-inline-au.md +6 -0
  259. package/corpus/templates/design/changelog/2026-06-30-the-empty-designs-page-now-focuses-on-a-single-primary-new-d.md +6 -0
  260. package/corpus/templates/design/changelog/2026-06-30-the-layers-panel-header-stays-as-layers-while-multiple-items.md +6 -0
  261. package/corpus/templates/design/changelog/2026-06-30-the-missing-design-screen-now-uses-a-neutral-back-button.md +6 -0
  262. package/corpus/templates/design/changelog/2026-06-30-the-motion-timeline-now-closes-without-squeezing-the-canvas-.md +6 -0
  263. package/corpus/templates/design/changelog/2026-06-30-the-new-design-connect-ai-setup-now-lines-up-with-the-compos.md +6 -0
  264. package/corpus/templates/design/changelog/2026-06-30-the-screen-overview-board-now-blends-into-the-canvas-and-new.md +6 -0
  265. package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-drops-now-show-screen-guides.md +6 -0
  266. package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-layers-now-keep-a-transparent-backdrop-and-.md +6 -0
  267. package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-layers-now-select-reliably-from-all-screens.md +6 -0
  268. package/corpus/templates/design/changelog/2026-06-30-visual-edit-can-open-and-refresh-localhost-screens-in-one-au.md +6 -0
  269. package/corpus/templates/design/e2e/helpers.ts +15 -4
  270. package/corpus/templates/design/server/db/index.ts +52 -0
  271. package/corpus/templates/design/server/plugins/agent-chat.ts +5 -0
  272. package/corpus/templates/design/server/plugins/auth.ts +1 -0
  273. package/corpus/templates/design/server/plugins/core-routes.ts +4 -0
  274. package/corpus/templates/design/shared/board-file.ts +380 -5
  275. package/corpus/templates/design/shared/board-objects.ts +2 -2
  276. package/corpus/templates/design/shared/code-layer.ts +50 -6
  277. package/corpus/templates/design/shared/motion-compiler.ts +27 -0
  278. package/corpus/templates/macros/app/components/DailyProgress.tsx +41 -37
  279. package/corpus/templates/macros/app/components/ExerciseCard.tsx +2 -2
  280. package/corpus/templates/macros/app/components/MealCard.tsx +2 -2
  281. package/corpus/templates/macros/app/components/VoiceDictation.tsx +1 -1
  282. package/corpus/templates/macros/app/components/WeeklyCaloriesChart.tsx +1 -1
  283. package/corpus/templates/macros/app/components/WeightCard.tsx +2 -2
  284. package/corpus/templates/macros/app/components/WeightTracker.tsx +1 -1
  285. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +1 -1
  286. package/corpus/templates/macros/app/routes/_index.tsx +5 -5
  287. package/corpus/templates/macros/app/routes/analytics.tsx +1 -1
  288. package/corpus/templates/macros/changelog/2026-06-30-dashboard-loading-and-chart-surfaces-now-use-theme-aware-col.md +6 -0
  289. package/corpus/templates/mail/app/components/email/ComposeBubbleToolbar.tsx +14 -11
  290. package/corpus/templates/mail/app/global.css +3 -2
  291. package/corpus/templates/mail/changelog/2026-06-30-compose-floating-toolbars-now-use-theme-aware-colors-in-ligh.md +6 -0
  292. package/corpus/templates/plan/app/pages/PlansPage.tsx +2 -2
  293. package/corpus/templates/slides/app/components/deck/DeckCard.tsx +3 -3
  294. package/corpus/templates/slides/app/global.css +10 -0
  295. package/corpus/templates/slides/app/pages/Index.tsx +55 -51
  296. package/corpus/templates/slides/changelog/2026-06-30-deck-thumbnails-collapse-cleanly-to-one-column-when-the-chat.md +6 -0
  297. package/dist/agent/engine/anthropic-engine.d.ts +2 -2
  298. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  299. package/dist/agent/engine/builder-engine.d.ts +2 -2
  300. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  301. package/dist/agent/engine/builtin.js +1 -1
  302. package/dist/agent/engine/builtin.js.map +1 -1
  303. package/dist/agent/engine/output-tokens.js +1 -1
  304. package/dist/agent/engine/output-tokens.js.map +1 -1
  305. package/dist/agent/harness/acp-adapter.d.ts +4 -1
  306. package/dist/agent/harness/acp-adapter.d.ts.map +1 -1
  307. package/dist/agent/harness/acp-adapter.js +19 -2
  308. package/dist/agent/harness/acp-adapter.js.map +1 -1
  309. package/dist/agent/harness/ai-sdk-adapter.d.ts.map +1 -1
  310. package/dist/agent/harness/ai-sdk-adapter.js +3 -0
  311. package/dist/agent/harness/ai-sdk-adapter.js.map +1 -1
  312. package/dist/agent/harness/translate.d.ts.map +1 -1
  313. package/dist/agent/harness/translate.js +3 -0
  314. package/dist/agent/harness/translate.js.map +1 -1
  315. package/dist/agent/harness/types.d.ts +1 -0
  316. package/dist/agent/harness/types.d.ts.map +1 -1
  317. package/dist/agent/harness/types.js.map +1 -1
  318. package/dist/agent/model-config.d.ts +21 -20
  319. package/dist/agent/model-config.d.ts.map +1 -1
  320. package/dist/agent/model-config.js +31 -13
  321. package/dist/agent/model-config.js.map +1 -1
  322. package/dist/agent/production-agent.d.ts.map +1 -1
  323. package/dist/agent/production-agent.js +85 -10
  324. package/dist/agent/production-agent.js.map +1 -1
  325. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  326. package/dist/agent/thread-data-builder.js +27 -6
  327. package/dist/agent/thread-data-builder.js.map +1 -1
  328. package/dist/agent/tool-call-journal.d.ts +11 -9
  329. package/dist/agent/tool-call-journal.d.ts.map +1 -1
  330. package/dist/agent/tool-call-journal.js +92 -40
  331. package/dist/agent/tool-call-journal.js.map +1 -1
  332. package/dist/agent/types.d.ts +5 -1
  333. package/dist/agent/types.d.ts.map +1 -1
  334. package/dist/agent/types.js.map +1 -1
  335. package/dist/cli/design-connect.d.ts.map +1 -1
  336. package/dist/cli/design-connect.js +84 -0
  337. package/dist/cli/design-connect.js.map +1 -1
  338. package/dist/cli/gateway-helpers.d.ts +4 -0
  339. package/dist/cli/gateway-helpers.d.ts.map +1 -1
  340. package/dist/cli/gateway-helpers.js +9 -0
  341. package/dist/cli/gateway-helpers.js.map +1 -1
  342. package/dist/cli/recap.d.ts.map +1 -1
  343. package/dist/cli/recap.js +0 -2
  344. package/dist/cli/recap.js.map +1 -1
  345. package/dist/cli/skills.d.ts.map +1 -1
  346. package/dist/cli/skills.js +54 -16
  347. package/dist/cli/skills.js.map +1 -1
  348. package/dist/cli/workspace-dev.d.ts.map +1 -1
  349. package/dist/cli/workspace-dev.js +33 -6
  350. package/dist/cli/workspace-dev.js.map +1 -1
  351. package/dist/client/AssistantChat.d.ts.map +1 -1
  352. package/dist/client/AssistantChat.js +72 -26
  353. package/dist/client/AssistantChat.js.map +1 -1
  354. package/dist/client/DefaultSpinner.d.ts.map +1 -1
  355. package/dist/client/DefaultSpinner.js +8 -1
  356. package/dist/client/DefaultSpinner.js.map +1 -1
  357. package/dist/client/chat/message-components.d.ts +7 -1
  358. package/dist/client/chat/message-components.d.ts.map +1 -1
  359. package/dist/client/chat/message-components.js +37 -1
  360. package/dist/client/chat/message-components.js.map +1 -1
  361. package/dist/client/chat/repo-helpers.d.ts +1 -0
  362. package/dist/client/chat/repo-helpers.d.ts.map +1 -1
  363. package/dist/client/chat/repo-helpers.js +59 -0
  364. package/dist/client/chat/repo-helpers.js.map +1 -1
  365. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  366. package/dist/client/chat/run-recovery.js +4 -4
  367. package/dist/client/chat/run-recovery.js.map +1 -1
  368. package/dist/client/components/ApiKeySettings.js +8 -8
  369. package/dist/client/components/ApiKeySettings.js.map +1 -1
  370. package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
  371. package/dist/client/components/CodeRequiredDialog.js +24 -15
  372. package/dist/client/components/CodeRequiredDialog.js.map +1 -1
  373. package/dist/client/components/MissingKeyCard.d.ts.map +1 -1
  374. package/dist/client/components/MissingKeyCard.js +11 -6
  375. package/dist/client/components/MissingKeyCard.js.map +1 -1
  376. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  377. package/dist/client/composer/TiptapComposer.js +4 -3
  378. package/dist/client/composer/TiptapComposer.js.map +1 -1
  379. package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
  380. package/dist/client/extensions/ExtensionsSidebarSection.js +1 -1
  381. package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
  382. package/dist/client/guided-questions.d.ts.map +1 -1
  383. package/dist/client/guided-questions.js +6 -6
  384. package/dist/client/guided-questions.js.map +1 -1
  385. package/dist/client/integrations/IntegrationCard.js +1 -1
  386. package/dist/client/integrations/IntegrationCard.js.map +1 -1
  387. package/dist/client/integrations/IntegrationsPanel.js +1 -1
  388. package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
  389. package/dist/client/onboarding/OnboardingBanner.js +2 -2
  390. package/dist/client/onboarding/OnboardingBanner.js.map +1 -1
  391. package/dist/client/onboarding/OnboardingPanel.js +23 -19
  392. package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
  393. package/dist/client/resources/ResourceEditor.d.ts.map +1 -1
  394. package/dist/client/resources/ResourceEditor.js +13 -10
  395. package/dist/client/resources/ResourceEditor.js.map +1 -1
  396. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  397. package/dist/client/resources/ResourcesPanel.js +2 -1
  398. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  399. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  400. package/dist/client/settings/SettingsPanel.js +8 -3
  401. package/dist/client/settings/SettingsPanel.js.map +1 -1
  402. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  403. package/dist/client/settings/useBuilderStatus.js +6 -38
  404. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  405. package/dist/client/useProductionAgent.d.ts +2 -1
  406. package/dist/client/useProductionAgent.d.ts.map +1 -1
  407. package/dist/client/useProductionAgent.js.map +1 -1
  408. package/dist/collab/awareness.d.ts +2 -2
  409. package/dist/collab/awareness.d.ts.map +1 -1
  410. package/dist/collab/routes.d.ts +1 -1
  411. package/dist/deploy/build.js +1 -1
  412. package/dist/deploy/build.js.map +1 -1
  413. package/dist/eval/define-eval.d.ts.map +1 -1
  414. package/dist/eval/define-eval.js +2 -1
  415. package/dist/eval/define-eval.js.map +1 -1
  416. package/dist/eval/report.d.ts.map +1 -1
  417. package/dist/eval/report.js +19 -4
  418. package/dist/eval/report.js.map +1 -1
  419. package/dist/eval/runner.d.ts.map +1 -1
  420. package/dist/eval/runner.js +38 -6
  421. package/dist/eval/runner.js.map +1 -1
  422. package/dist/eval/types.d.ts +11 -0
  423. package/dist/eval/types.d.ts.map +1 -1
  424. package/dist/eval/types.js.map +1 -1
  425. package/dist/file-upload/actions/upload-image.d.ts +2 -2
  426. package/dist/notifications/routes.d.ts +3 -3
  427. package/dist/observability/routes.d.ts +5 -5
  428. package/dist/observability/traces.d.ts.map +1 -1
  429. package/dist/observability/traces.js.map +1 -1
  430. package/dist/onboarding/default-steps.js +1 -1
  431. package/dist/onboarding/default-steps.js.map +1 -1
  432. package/dist/progress/routes.d.ts +1 -1
  433. package/dist/resources/handlers.d.ts +1 -1
  434. package/dist/scripts/agent-engines/manage-agent-engine.js +1 -1
  435. package/dist/scripts/agent-engines/manage-agent-engine.js.map +1 -1
  436. package/dist/scripts/agent-engines/set-agent-engine.js +1 -1
  437. package/dist/scripts/agent-engines/set-agent-engine.js.map +1 -1
  438. package/dist/server/agent-chat-plugin.d.ts +3 -0
  439. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  440. package/dist/server/agent-chat-plugin.js +134 -72
  441. package/dist/server/agent-chat-plugin.js.map +1 -1
  442. package/dist/server/core-routes-plugin.d.ts +3 -0
  443. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  444. package/dist/server/core-routes-plugin.js +4 -1
  445. package/dist/server/core-routes-plugin.js.map +1 -1
  446. package/dist/server/open-route.d.ts +9 -0
  447. package/dist/server/open-route.d.ts.map +1 -1
  448. package/dist/server/open-route.js +48 -38
  449. package/dist/server/open-route.js.map +1 -1
  450. package/dist/shared/reasoning-effort.js +3 -0
  451. package/dist/shared/reasoning-effort.js.map +1 -1
  452. package/dist/sharing/access.d.ts.map +1 -1
  453. package/dist/sharing/access.js +18 -2
  454. package/dist/sharing/access.js.map +1 -1
  455. package/dist/sharing/registry.d.ts +10 -0
  456. package/dist/sharing/registry.d.ts.map +1 -1
  457. package/dist/sharing/registry.js.map +1 -1
  458. package/dist/styles/agent-native.css +104 -20
  459. package/dist/styles/rich-markdown-editor.css +11 -10
  460. package/docs/content/cloneable-saas.mdx +2 -2
  461. package/docs/content/evals.mdx +34 -12
  462. package/docs/content/faq.mdx +1 -1
  463. package/docs/content/locales/ar-SA/cloneable-saas.mdx +2 -2
  464. package/docs/content/locales/ar-SA/evals.mdx +7 -0
  465. package/docs/content/locales/ar-SA/faq.mdx +1 -1
  466. package/docs/content/locales/ar-SA/template-chat.mdx +1 -1
  467. package/docs/content/locales/de-DE/cloneable-saas.mdx +2 -2
  468. package/docs/content/locales/de-DE/evals.mdx +8 -0
  469. package/docs/content/locales/de-DE/faq.mdx +1 -1
  470. package/docs/content/locales/de-DE/template-chat.mdx +1 -1
  471. package/docs/content/locales/es-ES/cloneable-saas.mdx +2 -2
  472. package/docs/content/locales/es-ES/evals.mdx +8 -0
  473. package/docs/content/locales/es-ES/faq.mdx +1 -1
  474. package/docs/content/locales/es-ES/template-chat.mdx +1 -1
  475. package/docs/content/locales/fr-FR/cloneable-saas.mdx +2 -2
  476. package/docs/content/locales/fr-FR/evals.mdx +8 -0
  477. package/docs/content/locales/fr-FR/faq.mdx +1 -1
  478. package/docs/content/locales/fr-FR/template-chat.mdx +1 -1
  479. package/docs/content/locales/hi-IN/cloneable-saas.mdx +2 -2
  480. package/docs/content/locales/hi-IN/evals.mdx +8 -0
  481. package/docs/content/locales/hi-IN/faq.mdx +1 -1
  482. package/docs/content/locales/hi-IN/template-chat.mdx +1 -1
  483. package/docs/content/locales/ja-JP/cloneable-saas.mdx +2 -2
  484. package/docs/content/locales/ja-JP/evals.mdx +7 -0
  485. package/docs/content/locales/ja-JP/faq.mdx +1 -1
  486. package/docs/content/locales/ja-JP/template-chat.mdx +1 -1
  487. package/docs/content/locales/ko-KR/cloneable-saas.mdx +2 -2
  488. package/docs/content/locales/ko-KR/evals.mdx +7 -0
  489. package/docs/content/locales/ko-KR/faq.mdx +1 -1
  490. package/docs/content/locales/ko-KR/template-chat.mdx +1 -1
  491. package/docs/content/locales/pt-BR/cloneable-saas.mdx +2 -2
  492. package/docs/content/locales/pt-BR/evals.mdx +8 -0
  493. package/docs/content/locales/pt-BR/faq.mdx +1 -1
  494. package/docs/content/locales/pt-BR/template-chat.mdx +1 -1
  495. package/docs/content/locales/zh-CN/cloneable-saas.mdx +2 -2
  496. package/docs/content/locales/zh-CN/evals.mdx +7 -0
  497. package/docs/content/locales/zh-CN/faq.mdx +1 -1
  498. package/docs/content/locales/zh-CN/template-chat.mdx +1 -1
  499. package/docs/content/locales/zh-TW/cloneable-saas.mdx +2 -2
  500. package/docs/content/locales/zh-TW/evals.mdx +7 -0
  501. package/docs/content/locales/zh-TW/faq.mdx +1 -1
  502. package/docs/content/locales/zh-TW/template-chat.mdx +1 -1
  503. package/docs/content/template-chat.mdx +1 -1
  504. package/package.json +1 -1
  505. package/corpus/templates/content/server/routes/api/notion/disconnect.post.ts +0 -12
  506. package/corpus/templates/design/app/components/design/LocalSourceEditBanner.tsx +0 -157
  507. package/corpus/templates/design/app/lib/design-templates.ts +0 -1305
  508. package/corpus/templates/design/app/pages/Templates.tsx +0 -279
@@ -0,0 +1,90 @@
1
+ import { writeFileSync } from "node:fs";
2
+ import { fileURLToPath } from "node:url";
3
+
4
+ import { parityMatrix } from "./matrix";
5
+ import type { ParityRow } from "./matrix.types";
6
+
7
+ function escapeCell(value: string) {
8
+ return value.replace(/\|/g, "\\|").replace(/\n/g, "<br>");
9
+ }
10
+
11
+ function cell(value: string | string[] | null | undefined) {
12
+ if (Array.isArray(value))
13
+ return escapeCell(value.length ? value.join(", ") : "-");
14
+ if (value === null || value === undefined || value === "") return "-";
15
+ return escapeCell(value);
16
+ }
17
+
18
+ const headers = [
19
+ "ID",
20
+ "Surface",
21
+ "User-visible action",
22
+ "Status",
23
+ "Actions",
24
+ "UI entrypoints",
25
+ "Durable effect",
26
+ "Exception / gap",
27
+ "Reliability risk",
28
+ "Spine priority",
29
+ "Test coverage",
30
+ "Coverage refs",
31
+ "Eval scenarios",
32
+ "Follow-up",
33
+ ];
34
+
35
+ function renderRow(row: ParityRow) {
36
+ return [
37
+ row.id,
38
+ row.surface,
39
+ row.label,
40
+ row.status,
41
+ row.actions.length
42
+ ? row.actions.map((action) => `\`${action}\``).join(", ")
43
+ : "-",
44
+ row.uiEntrypoints.map((entry) => `\`${entry}\``).join(", "),
45
+ row.durableEffect,
46
+ row.exception,
47
+ row.reliabilityRisk === "none" ? "-" : row.reliabilityRisk,
48
+ row.spinePriority,
49
+ row.testCoverage,
50
+ row.coverageRefs?.map((ref) => `\`${ref}\``).join(", "),
51
+ row.evalScenarioIds?.map((id) => `\`${id}\``).join(", "),
52
+ row.followUpPR,
53
+ ].map(cell);
54
+ }
55
+
56
+ function renderTable(rows: string[][]) {
57
+ const widths = headers.map((header, index) =>
58
+ Math.max(header.length, ...rows.map((row) => row[index]?.length ?? 0)),
59
+ );
60
+ const renderCells = (cells: string[]) =>
61
+ `| ${cells.map((value, index) => value.padEnd(widths[index])).join(" | ")} |`;
62
+ return [
63
+ renderCells(headers),
64
+ renderCells(widths.map((width) => "-".repeat(width))),
65
+ ...rows.map(renderCells),
66
+ ];
67
+ }
68
+
69
+ export function renderParityMatrixMarkdown(rows: ParityRow[] = parityMatrix) {
70
+ const sortedRows = [...rows].sort((a, b) => a.id.localeCompare(b.id));
71
+ return [
72
+ "# Content Agent/UI Action Parity Matrix",
73
+ "",
74
+ "This generated matrix tracks whether high-value Content UI operations use the same action surface agents can call, or have an explicit exception. Edit `matrix.ts`, then regenerate this file.",
75
+ "",
76
+ ...renderTable(sortedRows.map(renderRow)),
77
+ "",
78
+ ].join("\n");
79
+ }
80
+
81
+ const isCli = process.argv[1] === fileURLToPath(import.meta.url);
82
+
83
+ if (isCli) {
84
+ const markdown = renderParityMatrixMarkdown();
85
+ if (process.argv.includes("--write")) {
86
+ writeFileSync(new URL("./matrix.md", import.meta.url), markdown);
87
+ } else {
88
+ process.stdout.write(markdown);
89
+ }
90
+ }
@@ -0,0 +1,57 @@
1
+ import {
2
+ contains,
3
+ createScorer,
4
+ defineEval,
5
+ type AgentRunOutput,
6
+ type Eval,
7
+ } from "@agent-native/core/eval";
8
+
9
+ import type { ParityEvalScenario } from "./eval-scenarios.ts";
10
+
11
+ function expectedToolScorer(expectedTools: string[]) {
12
+ return createScorer<AgentRunOutput, { used: string[]; missing: string[] }>({
13
+ name: "expected_tools",
14
+ analyze(run) {
15
+ const usedTools = new Set(run.toolCalls);
16
+ return {
17
+ used: expectedTools.filter((tool) => usedTools.has(tool)),
18
+ missing: expectedTools.filter((tool) => !usedTools.has(tool)),
19
+ };
20
+ },
21
+ generateScore({ missing }) {
22
+ return expectedTools.length === 0 || missing.length === 0 ? 1 : 0;
23
+ },
24
+ generateReason({ analysis: { used, missing } }) {
25
+ if (missing.length === 0) {
26
+ return `Agent called all expected tool(s): ${used.join(", ")}`;
27
+ }
28
+ return `Called expected tool(s): ${used.join(", ") || "none"}; missing: ${missing.join(", ")}`;
29
+ },
30
+ });
31
+ }
32
+
33
+ export function scenarioToEval(scenario: ParityEvalScenario): Eval {
34
+ const name = `content-parity:${scenario.id}`;
35
+
36
+ if (!process.env[scenario.gateEnv]) {
37
+ return defineEval({
38
+ name,
39
+ input: { prompt: scenario.prompt },
40
+ threshold: 1,
41
+ skipReason: `Skipped because ${scenario.gateEnv} is unset`,
42
+ scorers: [],
43
+ });
44
+ }
45
+
46
+ return defineEval({
47
+ name,
48
+ input: { prompt: scenario.prompt },
49
+ threshold: 0.6,
50
+ scorers: [
51
+ contains(scenario.successSignals),
52
+ ...(scenario.expectedTools?.length
53
+ ? [expectedToolScorer(scenario.expectedTools)]
54
+ : []),
55
+ ],
56
+ });
57
+ }
@@ -646,6 +646,10 @@ export interface ContentDatabaseResponse {
646
646
  createdDocumentId?: string;
647
647
  duplicatedItemId?: string;
648
648
  duplicatedDocumentId?: string;
649
+ duplicatedItemIds?: string[];
650
+ duplicatedDocumentIds?: string[];
651
+ deletedItemIds?: string[];
652
+ deletedDocumentIds?: string[];
649
653
  }
650
654
 
651
655
  export interface ContentDatabaseUnavailableResponse {
@@ -701,6 +705,13 @@ export interface DuplicateDatabaseItemRequest {
701
705
  title?: string;
702
706
  }
703
707
 
708
+ export interface DatabaseItemsBatchRequest {
709
+ databaseId?: string;
710
+ documentId?: string;
711
+ itemIds?: string[];
712
+ documentIds?: string[];
713
+ }
714
+
704
715
  export interface MoveDatabaseItemRequest {
705
716
  itemId?: string;
706
717
  documentId?: string;
@@ -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"),