@agent-native/core 0.80.8 → 0.80.10

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 (359) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +19 -0
  3. package/corpus/core/docs/content/locales/ar-SA/template-design.mdx +6 -0
  4. package/corpus/core/docs/content/locales/de-DE/template-design.mdx +8 -0
  5. package/corpus/core/docs/content/locales/es-ES/template-design.mdx +10 -2
  6. package/corpus/core/docs/content/locales/fr-FR/template-design.mdx +10 -2
  7. package/corpus/core/docs/content/locales/hi-IN/template-design.mdx +7 -0
  8. package/corpus/core/docs/content/locales/ja-JP/template-design.mdx +7 -0
  9. package/corpus/core/docs/content/locales/ko-KR/template-design.mdx +7 -0
  10. package/corpus/core/docs/content/locales/pt-BR/template-design.mdx +9 -2
  11. package/corpus/core/docs/content/locales/zh-CN/template-design.mdx +6 -0
  12. package/corpus/core/docs/content/locales/zh-TW/template-design.mdx +6 -0
  13. package/corpus/core/docs/content/template-design.mdx +9 -2
  14. package/corpus/core/package.json +1 -1
  15. package/corpus/core/src/cli/design-connect.ts +28 -2
  16. package/corpus/core/src/cli/mcp.ts +10 -0
  17. package/corpus/core/src/cli/skills.ts +103 -36
  18. package/corpus/core/src/client/error-format.ts +25 -0
  19. package/corpus/core/src/client/extensions/ExtensionViewer.tsx +13 -11
  20. package/corpus/core/src/client/guided-questions.tsx +32 -4
  21. package/corpus/core/src/client/onboarding/OnboardingPanel.tsx +33 -1
  22. package/corpus/core/src/client/resources/BuiltinCapabilityDetail.tsx +8 -0
  23. package/corpus/core/src/client/resources/use-builtin-capabilities.ts +4 -2
  24. package/corpus/core/src/client/session-replay.ts +34 -0
  25. package/corpus/core/src/client/sharing/ShareButton.tsx +106 -21
  26. package/corpus/core/src/coding-tools/index.ts +1 -1
  27. package/corpus/core/src/mcp/index.ts +2 -0
  28. package/corpus/core/src/mcp/screen-memory-stdio.ts +290 -0
  29. package/corpus/core/src/mcp-client/builtin-capabilities.ts +13 -1
  30. package/corpus/core/src/mcp-client/index.ts +9 -0
  31. package/corpus/core/src/mcp-client/screen-memory-local.ts +461 -0
  32. package/corpus/core/src/onboarding/types.ts +7 -0
  33. package/corpus/core/src/server/agent-chat-plugin.ts +25 -0
  34. package/corpus/core/src/server/agents-bundle.ts +35 -7
  35. package/corpus/core/src/styles/agent-native.css +5 -0
  36. package/corpus/core/src/templates/default/app/global.css +35 -35
  37. package/corpus/templates/analytics/AGENTS.md +6 -0
  38. package/corpus/templates/analytics/actions/github-repo-files.ts +9 -0
  39. package/corpus/templates/analytics/app/components/layout/Layout.tsx +4 -4
  40. package/corpus/templates/analytics/app/global.css +144 -40
  41. package/corpus/templates/analytics/app/pages/adhoc/explorer/index.tsx +1 -1
  42. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/ChartCard.tsx +1 -1
  43. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +1 -1
  44. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +4 -4
  45. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +9 -9
  46. package/corpus/templates/analytics/changelog/2026-06-29-agents-can-search-and-read-connected-github-repositories-whe.md +6 -0
  47. package/corpus/templates/analytics/changelog/2026-06-29-sessions-and-explorer-layouts-adapt-when-the-agent-sidebar-is.md +6 -0
  48. package/corpus/templates/assets/app/components/layout/Layout.tsx +3 -1
  49. package/corpus/templates/assets/app/components/library/LibraryPresetGrid.tsx +1 -1
  50. package/corpus/templates/assets/app/global.css +99 -35
  51. package/corpus/templates/assets/app/routes/asset.$id.tsx +2 -2
  52. package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +4 -4
  53. package/corpus/templates/assets/app/routes/library.tsx +4 -4
  54. package/corpus/templates/assets/changelog/2026-06-29-asset-library-and-detail-layouts-adapt-when-the-agent-sidebar.md +6 -0
  55. package/corpus/templates/brain/app/components/layout/Layout.tsx +1 -1
  56. package/corpus/templates/brain/app/global.css +63 -35
  57. package/corpus/templates/brain/app/routes/search.tsx +1 -1
  58. package/corpus/templates/brain/app/routes/settings.tsx +1 -1
  59. package/corpus/templates/brain/app/routes/sources.tsx +2 -2
  60. package/corpus/templates/brain/changelog/2026-06-29-search-settings-and-source-layouts-adapt-when-the-agent-sidebar.md +6 -0
  61. package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +4 -4
  62. package/corpus/templates/calendar/app/components/calendar/FindTimePanel.tsx +3 -2
  63. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +4 -2
  64. package/corpus/templates/calendar/app/global.css +69 -35
  65. package/corpus/templates/calendar/changelog/2026-06-29-event-and-find-time-layouts-adapt-when-the-agent-sidebar-is.md +6 -0
  66. package/corpus/templates/chat/app/components/layout/Layout.tsx +1 -1
  67. package/corpus/templates/chat/app/global.css +35 -35
  68. package/corpus/templates/chat/changelog/2026-06-29-chat-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
  69. package/corpus/templates/clips/AGENTS.md +13 -0
  70. package/corpus/templates/clips/actions/get-screen-memory-status.ts +12 -0
  71. package/corpus/templates/clips/actions/query-screen-memory-context.ts +29 -0
  72. package/corpus/templates/clips/actions/view-screen.ts +2 -2
  73. package/corpus/templates/clips/app/components/library/library-layout.tsx +1 -1
  74. package/corpus/templates/clips/app/global.css +47 -35
  75. package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +3 -3
  76. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +45 -18
  77. package/corpus/templates/clips/changelog/2026-06-29-meeting-detail-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
  78. package/corpus/templates/clips/changelog/2026-06-29-screen-memory-keeps-a-local-rolling-screen-buffer-for-agent-context.md +5 -0
  79. package/corpus/templates/clips/changelog/2026-06-29-video-chat-is-easier-to-find-on-recording-pages-and-s3-setup.md +6 -0
  80. package/corpus/templates/clips/chrome-extension/src/styles.css +39 -39
  81. package/corpus/templates/clips/desktop/src/app.tsx +290 -1
  82. package/corpus/templates/clips/desktop/src/shared/config.ts +83 -0
  83. package/corpus/templates/clips/desktop/src/styles.css +67 -52
  84. package/corpus/templates/clips/desktop/src-tauri/src/config.rs +50 -0
  85. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +17 -0
  86. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +13 -13
  87. package/corpus/templates/clips/desktop/src-tauri/src/screen_memory.rs +990 -0
  88. package/corpus/templates/clips/server/plugins/onboarding.ts +2 -0
  89. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +3 -3
  90. package/corpus/templates/content/app/components/layout/Layout.tsx +1 -1
  91. package/corpus/templates/content/app/global.css +29 -15
  92. package/corpus/templates/content/changelog/2026-06-29-database-gallery-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
  93. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +25 -20
  94. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +8 -0
  95. package/corpus/templates/design/.agents/skills/export-handoff/SKILL.md +8 -0
  96. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +13 -0
  97. package/corpus/templates/design/AGENTS.md +20 -12
  98. package/corpus/templates/design/CODE_NATIVE_DESIGN_STUDIO_IMPLEMENTATION_PLAN.md +1054 -0
  99. package/corpus/templates/design/DESIGN-STUDIO-PLAN.md +717 -0
  100. package/corpus/templates/design/actions/add-breakpoint.ts +143 -0
  101. package/corpus/templates/design/actions/add-localhost-screens.ts +5 -0
  102. package/corpus/templates/design/actions/apply-a11y-fix.ts +317 -0
  103. package/corpus/templates/design/actions/apply-component-prop-edit.ts +433 -0
  104. package/corpus/templates/design/actions/apply-design-state.ts +200 -0
  105. package/corpus/templates/design/actions/apply-design-token-edit.ts +202 -0
  106. package/corpus/templates/design/actions/apply-motion-edit.ts +450 -0
  107. package/corpus/templates/design/actions/apply-shader-fill.ts +404 -0
  108. package/corpus/templates/design/actions/apply-visual-edit.ts +214 -8
  109. package/corpus/templates/design/actions/capture-design-state.ts +224 -0
  110. package/corpus/templates/design/actions/connect-builder-app.ts +162 -0
  111. package/corpus/templates/design/actions/create-component.ts +447 -0
  112. package/corpus/templates/design/actions/create-design-branch.ts +263 -0
  113. package/corpus/templates/design/actions/create-design-state.ts +162 -0
  114. package/corpus/templates/design/actions/delete-design-state.ts +55 -0
  115. package/corpus/templates/design/actions/deploy-design-preview.ts +275 -0
  116. package/corpus/templates/design/actions/export-coding-handoff.ts +12 -4
  117. package/corpus/templates/design/actions/generate-design.ts +6 -21
  118. package/corpus/templates/design/actions/generate-screens.ts +43 -2
  119. package/corpus/templates/design/actions/get-component-details.ts +242 -0
  120. package/corpus/templates/design/actions/get-design-branch-diff.ts +362 -0
  121. package/corpus/templates/design/actions/get-design-review.ts +314 -0
  122. package/corpus/templates/design/actions/get-design-surface-index.ts +582 -0
  123. package/corpus/templates/design/actions/get-design.ts +1 -0
  124. package/corpus/templates/design/actions/get-motion-timeline.ts +99 -0
  125. package/corpus/templates/design/actions/index-components.ts +258 -0
  126. package/corpus/templates/design/actions/index-design-tokens.ts +273 -0
  127. package/corpus/templates/design/actions/list-design-extensions.ts +309 -0
  128. package/corpus/templates/design/actions/list-design-source-capabilities.ts +153 -0
  129. package/corpus/templates/design/actions/list-design-states.ts +72 -0
  130. package/corpus/templates/design/actions/migrate-inline-design-to-app.ts +298 -0
  131. package/corpus/templates/design/actions/open-component-source.ts +237 -0
  132. package/corpus/templates/design/actions/present-design-variants.ts +355 -30
  133. package/corpus/templates/design/actions/preview-component-prop-edit.ts +254 -0
  134. package/corpus/templates/design/actions/preview-design-token-edit.ts +113 -0
  135. package/corpus/templates/design/actions/preview-shader-fill.ts +189 -0
  136. package/corpus/templates/design/actions/remove-breakpoint.ts +103 -0
  137. package/corpus/templates/design/actions/remove-motion-timeline.ts +196 -0
  138. package/corpus/templates/design/actions/run-design-audit.ts +421 -0
  139. package/corpus/templates/design/actions/run-design-extension-action.ts +284 -0
  140. package/corpus/templates/design/actions/set-active-breakpoint.ts +39 -0
  141. package/corpus/templates/design/actions/view-screen.ts +75 -31
  142. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +1738 -135
  143. package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +1 -1
  144. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +632 -43
  145. package/corpus/templates/design/app/components/design/DrawOverlay.tsx +1 -1
  146. package/corpus/templates/design/app/components/design/EditPanel.tsx +1873 -132
  147. package/corpus/templates/design/app/components/design/LayersPanel.tsx +384 -219
  148. package/corpus/templates/design/app/components/design/LocalSourceEditBanner.tsx +157 -0
  149. package/corpus/templates/design/app/components/design/MotionDock.tsx +1062 -0
  150. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +2103 -295
  151. package/corpus/templates/design/app/components/design/QuestionFlow.tsx +83 -206
  152. package/corpus/templates/design/app/components/design/ReviewPanel.tsx +759 -0
  153. package/corpus/templates/design/app/components/design/StatesPanel.tsx +579 -0
  154. package/corpus/templates/design/app/components/design/TokensPanel.tsx +573 -0
  155. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +1 -1
  156. package/corpus/templates/design/app/components/design/canvas-primitive-style.ts +241 -0
  157. package/corpus/templates/design/app/components/design/index.ts +16 -1
  158. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +238 -137
  159. package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +188 -14
  160. package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +24 -5
  161. package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +57 -1
  162. package/corpus/templates/design/app/components/design/inspector/InspectorAiActions.tsx +145 -0
  163. package/corpus/templates/design/app/components/design/inspector/SHADER_INTEGRATION.md +42 -12
  164. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +37 -12
  165. package/corpus/templates/design/app/components/design/inspector/index.ts +1 -0
  166. package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +12 -5
  167. package/corpus/templates/design/app/components/design/types.ts +9 -0
  168. package/corpus/templates/design/app/components/layout/Layout.tsx +23 -5
  169. package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +1 -1
  170. package/corpus/templates/design/app/global.css +77 -49
  171. package/corpus/templates/design/app/hooks/use-question-flow.ts +2 -2
  172. package/corpus/templates/design/app/hooks/useAgentEditRequest.ts +131 -0
  173. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +11 -2
  174. package/corpus/templates/design/app/i18n/zh-TW.ts +34 -0
  175. package/corpus/templates/design/app/i18n-data.ts +314 -3
  176. package/corpus/templates/design/app/pages/DesignEditor.tsx +4929 -892
  177. package/corpus/templates/design/app/root.tsx +1 -1
  178. package/corpus/templates/design/changelog/2026-06-29-added-a-review-panel-in-the-design-editor-s-inspector-with-a.md +6 -0
  179. package/corpus/templates/design/changelog/2026-06-29-containers-no-longer-block-selecting-nested-elements-and-nor.md +6 -0
  180. package/corpus/templates/design/changelog/2026-06-29-copying-and-pasting-layers-no-longer-shows-success-notificat.md +6 -0
  181. package/corpus/templates/design/changelog/2026-06-29-design-agents-now-generate-and-refine-variants-from-stronger.md +6 -0
  182. package/corpus/templates/design/changelog/2026-06-29-design-inspector-controls-now-match-figmas-softer-dark-chrome.md +6 -0
  183. package/corpus/templates/design/changelog/2026-06-29-design-questions-now-appear-as-a-cleaner-canvas-intake-with-.md +6 -0
  184. package/corpus/templates/design/changelog/2026-06-29-design-variant-directions-now-appear-as-board-screens-with-chat-buttons.md +5 -0
  185. package/corpus/templates/design/changelog/2026-06-29-device-presets-in-all-screens-view-resize-the-selected-previ.md +6 -0
  186. package/corpus/templates/design/changelog/2026-06-29-element-selection-no-longer-snaps-back-to-the-previous-layer.md +6 -0
  187. package/corpus/templates/design/changelog/2026-06-29-frame-resize-measurements-now-stay-beside-the-cursor-while-d.md +6 -0
  188. package/corpus/templates/design/changelog/2026-06-29-inspector-number-fields-have-cleaner-tooltips-and-draggable-.md +6 -0
  189. package/corpus/templates/design/changelog/2026-06-29-layer-and-canvas-drags-keep-the-layer-list-stable-while-chan.md +6 -0
  190. package/corpus/templates/design/changelog/2026-06-29-layer-locking-layer-nesting-generated-question-intake-and-im.md +6 -0
  191. package/corpus/templates/design/changelog/2026-06-29-layer-moves-can-be-undone-and-redone-without-flashing-the-ca.md +6 -0
  192. package/corpus/templates/design/changelog/2026-06-29-layer-names-in-the-sidebar-can-scroll-horizontally-instead-o.md +6 -0
  193. package/corpus/templates/design/changelog/2026-06-29-layer-nesting-in-the-sidebar-now-uses-tighter-spacing-so-nam.md +6 -0
  194. package/corpus/templates/design/changelog/2026-06-29-layers-no-longer-repeat-document-wrapper-rows-when-a-screen-.md +6 -0
  195. package/corpus/templates/design/changelog/2026-06-29-overview-previews-now-keep-element-hover-and-selection-tied-.md +6 -0
  196. package/corpus/templates/design/changelog/2026-06-29-pressing-escape-now-cancels-a-stuck-screen-drag-in-the-overv.md +6 -0
  197. package/corpus/templates/design/changelog/2026-06-29-screen-overview-is-easier-to-find-and-named-screens-open-dir.md +6 -0
  198. package/corpus/templates/design/changelog/2026-06-29-screen-overview-only-highlights-screens-when-the-frame-or-ti.md +6 -0
  199. package/corpus/templates/design/changelog/2026-06-29-screen-overview-previews-now-resize-to-match-the-selected-de.md +6 -0
  200. package/corpus/templates/design/changelog/2026-06-29-screen-overview-selection-now-uses-a-pointer-cursor-instead-.md +6 -0
  201. package/corpus/templates/design/changelog/2026-06-29-screen-overview-selection-outlines-now-stay-locked-to-the-se.md +6 -0
  202. package/corpus/templates/design/changelog/2026-06-29-screen-overview-zoom-now-reports-real-screen-scale-separatel.md +6 -0
  203. package/corpus/templates/design/changelog/2026-06-29-screen-overview-zooming-feels-smoother-and-selection-outline.md +6 -0
  204. package/corpus/templates/design/changelog/2026-06-29-screen-overview-zooming-now-stays-on-the-overview-canvas-ins.md +6 -0
  205. package/corpus/templates/design/changelog/2026-06-29-screen-previews-use-a-single-blue-hover-border-in-all-screen.md +6 -0
  206. package/corpus/templates/design/changelog/2026-06-29-selected-containers-show-draggable-padding-and-gap-guides-on.md +6 -0
  207. package/corpus/templates/design/changelog/2026-06-29-selecting-a-nested-layer-from-all-screens-now-keeps-you-in-a.md +6 -0
  208. package/corpus/templates/design/changelog/2026-06-29-share-now-groups-link-sharing-exports-and-agent-handoff.md +6 -0
  209. package/corpus/templates/design/changelog/2026-06-29-the-design-editor-adds-a-studio-layer-with-tokens-respon.md +6 -0
  210. package/corpus/templates/design/changelog/2026-06-29-the-design-editor-loading-skeleton-now-uses-a-softer-charcoa.md +6 -0
  211. package/corpus/templates/design/changelog/2026-06-29-the-device-preview-menu-now-sits-next-to-the-preview-button-.md +6 -0
  212. package/corpus/templates/design/changelog/2026-06-29-the-inspector-stays-read-only-while-an-empty-design-is-still.md +6 -0
  213. package/corpus/templates/design/changelog/2026-06-29-the-missing-design-view-now-matches-the-rest-of-the-editor-c.md +6 -0
  214. package/corpus/templates/design/changelog/2026-06-29-the-pen-tool-icon-and-tool-option-menus-better-match-the-edi.md +6 -0
  215. package/corpus/templates/design/changelog/2026-06-29-typography-controls-now-keep-the-font-name-visible-and-move-.md +6 -0
  216. package/corpus/templates/design/changelog/2026-06-30-accessibility-findings-now-offer-a-one-click-fix.md +6 -0
  217. package/corpus/templates/design/changelog/2026-06-30-component-instances-now-have-editable-props-in-the-inspe.md +6 -0
  218. package/corpus/templates/design/changelog/2026-06-30-inspect-code-now-shows-the-elements-opening-tag-at-a-gla.md +6 -0
  219. package/corpus/templates/design/changelog/2026-06-30-shader-fill-presets-can-now-be-applied-to-an-element.md +6 -0
  220. package/corpus/templates/design/changelog/2026-06-30-the-motion-timeline-can-now-add-a-track-to-any-element-a.md +6 -0
  221. package/corpus/templates/design/changelog/2026-06-30-visual-editor-selection-layer-paint-and-drawing-controls-are-more-reliable.md +6 -0
  222. package/corpus/templates/design/e2e/README.md +3 -3
  223. package/corpus/templates/design/e2e/global-setup.ts +11 -22
  224. package/corpus/templates/design/e2e/helpers.ts +128 -11
  225. package/corpus/templates/design/playwright.config.ts +9 -3
  226. package/corpus/templates/design/server/db/schema.ts +123 -0
  227. package/corpus/templates/design/server/lib/coding-handoff.ts +126 -2
  228. package/corpus/templates/design/server/plugins/core-routes.ts +1 -2
  229. package/corpus/templates/design/server/plugins/db.ts +90 -0
  230. package/corpus/templates/design/server/routes/api/design-handoff/[id].zip.get.ts +86 -0
  231. package/corpus/templates/design/shared/builder-app.ts +297 -0
  232. package/corpus/templates/design/shared/capability-resolver.ts +123 -0
  233. package/corpus/templates/design/shared/capture-sanitize.ts +70 -0
  234. package/corpus/templates/design/shared/code-layer.ts +1141 -93
  235. package/corpus/templates/design/shared/component-model.ts +239 -0
  236. package/corpus/templates/design/shared/design-review.ts +275 -0
  237. package/corpus/templates/design/shared/design-source-capabilities.ts +286 -0
  238. package/corpus/templates/design/shared/design-state.ts +112 -0
  239. package/corpus/templates/design/shared/design-surface-index.ts +258 -0
  240. package/corpus/templates/design/shared/generation-session.ts +41 -0
  241. package/corpus/templates/design/shared/motion-compiler.ts +278 -0
  242. package/corpus/templates/design/shared/motion-timeline.ts +193 -0
  243. package/corpus/templates/design/shared/responsive-classes.ts +452 -0
  244. package/corpus/templates/design/shared/shader-fill.ts +323 -0
  245. package/corpus/templates/design/shared/source-mode.ts +245 -0
  246. package/corpus/templates/dispatch/app/global.css +79 -35
  247. package/corpus/templates/dispatch/app/routes/integrations.tsx +8 -7
  248. package/corpus/templates/dispatch/changelog/2026-06-29-integration-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
  249. package/corpus/templates/forms/app/components/layout/Layout.tsx +6 -2
  250. package/corpus/templates/forms/app/global.css +64 -35
  251. package/corpus/templates/forms/app/pages/FormsListPage.tsx +2 -2
  252. package/corpus/templates/forms/app/pages/ResponseInsightsPage.tsx +3 -3
  253. package/corpus/templates/forms/changelog/2026-06-29-form-list-and-insight-layouts-adapt-when-the-agent-sidebar.md +6 -0
  254. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +3 -1
  255. package/corpus/templates/macros/app/global.css +25 -9
  256. package/corpus/templates/macros/changelog/2026-06-29-macro-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
  257. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +6 -2
  258. package/corpus/templates/mail/app/global.css +42 -36
  259. package/corpus/templates/mail/app/pages/InboxPage.tsx +1 -1
  260. package/corpus/templates/mail/changelog/2026-06-29-the-contact-panel-now-adapts-to-the-available-mail-pane-width.md +6 -0
  261. package/corpus/templates/plan/app/components/layout/Layout.tsx +3 -1
  262. package/corpus/templates/plan/app/components/plan/CanvasArea.tsx +6 -2
  263. package/corpus/templates/plan/app/components/plan/DocumentArea.tsx +6 -7
  264. package/corpus/templates/plan/app/global.css +74 -42
  265. package/corpus/templates/plan/changelog/2026-06-29-plan-canvases-open-without-an-initial-pan-and-zoom-flicker.md +6 -0
  266. package/corpus/templates/plan/changelog/2026-06-29-plan-document-blocks-adapt-to-the-available-document-width.md +6 -0
  267. package/corpus/templates/plan/changelog/2026-06-29-plan-titles-and-summaries-can-be-edited-inline-without-focus.md +6 -0
  268. package/corpus/templates/slides/app/components/layout/Layout.tsx +3 -1
  269. package/corpus/templates/slides/app/global.css +49 -33
  270. package/corpus/templates/slides/changelog/2026-06-29-slide-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
  271. package/corpus/templates/videos/app/components/layout/Layout.tsx +3 -1
  272. package/corpus/templates/videos/app/global.css +35 -35
  273. package/corpus/templates/videos/changelog/2026-06-29-video-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
  274. package/dist/cli/design-connect.d.ts.map +1 -1
  275. package/dist/cli/design-connect.js +28 -2
  276. package/dist/cli/design-connect.js.map +1 -1
  277. package/dist/cli/mcp.d.ts.map +1 -1
  278. package/dist/cli/mcp.js +10 -0
  279. package/dist/cli/mcp.js.map +1 -1
  280. package/dist/cli/skills.d.ts.map +1 -1
  281. package/dist/cli/skills.js +95 -33
  282. package/dist/cli/skills.js.map +1 -1
  283. package/dist/client/error-format.d.ts.map +1 -1
  284. package/dist/client/error-format.js +17 -0
  285. package/dist/client/error-format.js.map +1 -1
  286. package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
  287. package/dist/client/extensions/ExtensionViewer.js +3 -4
  288. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  289. package/dist/client/guided-questions.d.ts +4 -0
  290. package/dist/client/guided-questions.d.ts.map +1 -1
  291. package/dist/client/guided-questions.js +16 -7
  292. package/dist/client/guided-questions.js.map +1 -1
  293. package/dist/client/onboarding/OnboardingPanel.js +26 -1
  294. package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
  295. package/dist/client/resources/BuiltinCapabilityDetail.d.ts.map +1 -1
  296. package/dist/client/resources/BuiltinCapabilityDetail.js +1 -1
  297. package/dist/client/resources/BuiltinCapabilityDetail.js.map +1 -1
  298. package/dist/client/resources/use-builtin-capabilities.d.ts +1 -1
  299. package/dist/client/resources/use-builtin-capabilities.d.ts.map +1 -1
  300. package/dist/client/resources/use-builtin-capabilities.js +2 -1
  301. package/dist/client/resources/use-builtin-capabilities.js.map +1 -1
  302. package/dist/client/session-replay.d.ts.map +1 -1
  303. package/dist/client/session-replay.js +31 -0
  304. package/dist/client/session-replay.js.map +1 -1
  305. package/dist/client/sharing/ShareButton.d.ts +14 -0
  306. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  307. package/dist/client/sharing/ShareButton.js +36 -7
  308. package/dist/client/sharing/ShareButton.js.map +1 -1
  309. package/dist/coding-tools/index.js +1 -1
  310. package/dist/coding-tools/index.js.map +1 -1
  311. package/dist/mcp/index.d.ts +2 -0
  312. package/dist/mcp/index.d.ts.map +1 -1
  313. package/dist/mcp/index.js +1 -0
  314. package/dist/mcp/index.js.map +1 -1
  315. package/dist/mcp/screen-memory-stdio.d.ts +6 -0
  316. package/dist/mcp/screen-memory-stdio.d.ts.map +1 -0
  317. package/dist/mcp/screen-memory-stdio.js +213 -0
  318. package/dist/mcp/screen-memory-stdio.js.map +1 -0
  319. package/dist/mcp-client/builtin-capabilities.d.ts +1 -1
  320. package/dist/mcp-client/builtin-capabilities.d.ts.map +1 -1
  321. package/dist/mcp-client/builtin-capabilities.js +10 -0
  322. package/dist/mcp-client/builtin-capabilities.js.map +1 -1
  323. package/dist/mcp-client/index.d.ts +1 -0
  324. package/dist/mcp-client/index.d.ts.map +1 -1
  325. package/dist/mcp-client/index.js +1 -0
  326. package/dist/mcp-client/index.js.map +1 -1
  327. package/dist/mcp-client/screen-memory-local.d.ts +61 -0
  328. package/dist/mcp-client/screen-memory-local.d.ts.map +1 -0
  329. package/dist/mcp-client/screen-memory-local.js +336 -0
  330. package/dist/mcp-client/screen-memory-local.js.map +1 -0
  331. package/dist/observability/routes.d.ts +3 -3
  332. package/dist/onboarding/types.d.ts +7 -0
  333. package/dist/onboarding/types.d.ts.map +1 -1
  334. package/dist/onboarding/types.js.map +1 -1
  335. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  336. package/dist/server/agent-chat-plugin.js +26 -0
  337. package/dist/server/agent-chat-plugin.js.map +1 -1
  338. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  339. package/dist/server/agents-bundle.d.ts.map +1 -1
  340. package/dist/server/agents-bundle.js +22 -7
  341. package/dist/server/agents-bundle.js.map +1 -1
  342. package/dist/styles/agent-native.css +5 -0
  343. package/dist/templates/default/app/global.css +35 -35
  344. package/docs/content/locales/ar-SA/template-design.mdx +6 -0
  345. package/docs/content/locales/de-DE/template-design.mdx +8 -0
  346. package/docs/content/locales/es-ES/template-design.mdx +10 -2
  347. package/docs/content/locales/fr-FR/template-design.mdx +10 -2
  348. package/docs/content/locales/hi-IN/template-design.mdx +7 -0
  349. package/docs/content/locales/ja-JP/template-design.mdx +7 -0
  350. package/docs/content/locales/ko-KR/template-design.mdx +7 -0
  351. package/docs/content/locales/pt-BR/template-design.mdx +9 -2
  352. package/docs/content/locales/zh-CN/template-design.mdx +6 -0
  353. package/docs/content/locales/zh-TW/template-design.mdx +6 -0
  354. package/docs/content/template-design.mdx +9 -2
  355. package/package.json +1 -1
  356. package/src/templates/default/app/global.css +35 -35
  357. package/corpus/templates/design/app/components/design/VariantGrid.tsx +0 -189
  358. package/corpus/templates/design/app/components/design/VariantHandoffCard.tsx +0 -115
  359. package/corpus/templates/design/app/hooks/use-variant-flow.ts +0 -342
@@ -0,0 +1,298 @@
1
+ /**
2
+ * migrate-inline-design-to-app — generate a real React + Tailwind app branch
3
+ * from an inline Alpine/HTML design via the Builder cloud agent.
4
+ *
5
+ * ## What this action does
6
+ *
7
+ * 1. Requires viewer access to the design and that Builder is fully configured
8
+ * (credentials + branch project ID). When Builder is not configured it
9
+ * returns a connect CTA gracefully, never throws.
10
+ * 2. Reads the current design snapshot (live Yjs content when available).
11
+ * 3. Snapshots the current state into `design_versions` (reversible baseline).
12
+ * 4. Builds a migration seed (HTML + :root CSS vars + Brand Kit tokens) via
13
+ * `buildMigrationSeed` and hands it to `runBuilderAgent`.
14
+ * 5. Returns `{ branchName, url, status, versionId }` so the caller can track
15
+ * the Builder branch and roll back via `versionId` if needed.
16
+ *
17
+ * ## Write gating (per DESIGN-STUDIO-PLAN.md §3 & §5)
18
+ *
19
+ * - `writeFile` / `writeTokens` / `writeMotion` on the inline source stay
20
+ * **planned** until bridge hardening. This action does NOT write to the
21
+ * inline design's source files.
22
+ * - `branch` / `deploy` capabilities are **available** once Builder is
23
+ * configured (fusion source tier). This action is the entry point for that
24
+ * tier — it creates the Builder branch, NOT a local file write.
25
+ * - The `design_versions` snapshot is the only local write: it is additive and
26
+ * never modifies the existing design data.
27
+ *
28
+ * ## Reversibility
29
+ *
30
+ * The snapshot saved as `design_versions` before the migration gives the user
31
+ * a named restore point ("Pre-migration snapshot"). A future `restore-design-
32
+ * version` action can replay it. The original inline design row is unchanged.
33
+ *
34
+ * ## Connect CTA path
35
+ *
36
+ * When Builder is not connected this action returns:
37
+ * ```json
38
+ * { "status": "not-configured", "cta": { "kind": "connect-builder", ... } }
39
+ * ```
40
+ * so the UI can render the "Make it real" upgrade card without throwing.
41
+ * The caller should offer `connect-builder-app` to surface the CTA first.
42
+ */
43
+
44
+ import { defineAction } from "@agent-native/core";
45
+ import {
46
+ runBuilderAgent,
47
+ resolveBuilderBranchProjectId,
48
+ } from "@agent-native/core/server";
49
+ import { getRequestUserEmail } from "@agent-native/core/server/request-context";
50
+ import { assertAccess, resolveAccess } from "@agent-native/core/sharing";
51
+ import { eq } from "drizzle-orm";
52
+ import { nanoid } from "nanoid";
53
+ import { z } from "zod";
54
+
55
+ import { getDb, schema } from "../server/db/index.js";
56
+ import { buildDesignSnapshot } from "../server/lib/design-snapshot.js";
57
+ import "../server/db/index.js"; // ensure registerShareableResource runs
58
+ import {
59
+ resolveBuilderStatus,
60
+ buildMigrationSeed,
61
+ } from "../shared/builder-app.js";
62
+
63
+ // ---------------------------------------------------------------------------
64
+ // Helpers
65
+ // ---------------------------------------------------------------------------
66
+
67
+ /** The default Builder app host — mirrors the constant in builder-browser.ts. */
68
+ const DEFAULT_BUILDER_APP_HOST = "https://builder.io";
69
+
70
+ function resolveBuilderAppHost(): string {
71
+ return (
72
+ process.env.BUILDER_APP_HOST ||
73
+ process.env.BUILDER_PUBLIC_APP_HOST ||
74
+ DEFAULT_BUILDER_APP_HOST
75
+ );
76
+ }
77
+
78
+ function buildConnectUrl(origin: string): string {
79
+ const base = origin.replace(/\/+$/, "");
80
+ return `${base}/_agent-native/builder/connect`;
81
+ }
82
+
83
+ // ---------------------------------------------------------------------------
84
+ // Snapshot helpers
85
+ // ---------------------------------------------------------------------------
86
+
87
+ /**
88
+ * Persist a `design_versions` snapshot row before the migration so the user
89
+ * has a named restore point. Additive only — never modifies existing rows.
90
+ *
91
+ * Returns the new version ID.
92
+ */
93
+ async function snapshotDesign(
94
+ designId: string,
95
+ label: string,
96
+ ): Promise<string> {
97
+ const db = getDb();
98
+ const versionId = nanoid();
99
+ const now = new Date().toISOString();
100
+
101
+ // Read the current file contents for the snapshot (stored content only;
102
+ // we intentionally capture the persisted baseline, not in-flight collab text,
103
+ // so the snapshot is stable and reproducible).
104
+ const files = await db
105
+ .select({
106
+ filename: schema.designFiles.filename,
107
+ content: schema.designFiles.content,
108
+ fileType: schema.designFiles.fileType,
109
+ })
110
+ .from(schema.designFiles)
111
+ .where(eq(schema.designFiles.designId, designId));
112
+
113
+ // Also capture the design data blob (tweaks, source type, etc.).
114
+ // guard:allow-unscoped — the action's run() resolves and asserts editor
115
+ // access on the design (resolveAccess + assertAccess "design", designId)
116
+ // before this snapshot helper runs; reads only the addressed design row by id.
117
+ const [design] = await db
118
+ .select({ data: schema.designs.data, title: schema.designs.title })
119
+ .from(schema.designs)
120
+ .where(eq(schema.designs.id, designId))
121
+ .limit(1);
122
+
123
+ const snapshot = JSON.stringify({
124
+ designId,
125
+ label,
126
+ capturedAt: now,
127
+ designData: design?.data ?? "{}",
128
+ files: files.map((f) => ({
129
+ filename: f.filename,
130
+ fileType: f.fileType,
131
+ content: f.content,
132
+ })),
133
+ });
134
+
135
+ await db.insert(schema.designVersions).values({
136
+ id: versionId,
137
+ designId,
138
+ label,
139
+ snapshot,
140
+ createdAt: now,
141
+ });
142
+
143
+ return versionId;
144
+ }
145
+
146
+ // ---------------------------------------------------------------------------
147
+ // Action
148
+ // ---------------------------------------------------------------------------
149
+
150
+ export default defineAction({
151
+ description:
152
+ "Migrate an inline Alpine/HTML design to a real React + Tailwind app " +
153
+ "by handing the design's HTML and tokens to the Builder cloud agent. " +
154
+ "Requires Builder.io to be connected (credentials + branch project ID). " +
155
+ "When Builder is NOT configured returns a connect CTA — never throws. " +
156
+ "Snapshots the current design into design_versions before migrating so " +
157
+ "the inline baseline is always recoverable. " +
158
+ "Returns { branchName, url, status, versionId } on success. " +
159
+ "Real-app source writes (writeFile/writeTokens/writeMotion to the inline " +
160
+ "design) remain planned until bridge hardening; this action only creates a " +
161
+ "Builder-hosted branch — it does NOT modify the inline design's files.",
162
+ schema: z.object({
163
+ designId: z.string().describe("Design project ID to migrate to a real app"),
164
+ brandKitSummary: z
165
+ .string()
166
+ .optional()
167
+ .describe(
168
+ "Optional human-readable summary of the linked design system tokens " +
169
+ "(e.g. from index-design-tokens) to include in the migration seed. " +
170
+ "Improves token fidelity in the generated React app.",
171
+ ),
172
+ branchName: z
173
+ .string()
174
+ .optional()
175
+ .describe(
176
+ "Optional branch name for the Builder agent to use. " +
177
+ "If omitted, Builder generates one.",
178
+ ),
179
+ }),
180
+ run: async ({ designId, brandKitSummary, branchName }) => {
181
+ // ── 1. Access check ────────────────────────────────────────────────────
182
+ const access = await resolveAccess("design", designId);
183
+ if (!access) {
184
+ throw new Error("Design not found");
185
+ }
186
+ const design = access.resource as typeof schema.designs.$inferSelect;
187
+
188
+ // Snapshotting a design_versions row + kicking off a paid Builder cloud run
189
+ // are mutations: require editor access. A read-only (viewer) share must not
190
+ // be able to trigger them.
191
+ await assertAccess("design", designId, "editor");
192
+
193
+ // ── 2. Builder status check ────────────────────────────────────────────
194
+ const builderStatus = await resolveBuilderStatus();
195
+
196
+ if (!builderStatus.connected || !builderStatus.builderEnabled) {
197
+ // Return a graceful CTA; never throw so the UI can render the card.
198
+ const connectUrl = buildConnectUrl(
199
+ process.env.APP_URL ??
200
+ process.env.VITE_APP_URL ??
201
+ process.env.BETTER_AUTH_URL ??
202
+ "",
203
+ );
204
+ const appHost = resolveBuilderAppHost();
205
+
206
+ if (!builderStatus.connected) {
207
+ return {
208
+ status: "not-configured" as const,
209
+ designId,
210
+ cta: {
211
+ kind: "connect-builder" as const,
212
+ label: "Make this a real app",
213
+ description:
214
+ "Connect Builder.io to migrate this design to a real React app " +
215
+ "with components, props, data states, branches, and deploys.",
216
+ primaryAction: "Connect Builder.io",
217
+ connectUrl,
218
+ },
219
+ message:
220
+ "Builder is not connected. Call connect-builder-app to start " +
221
+ "the OAuth flow, then retry migrate-inline-design-to-app.",
222
+ };
223
+ }
224
+
225
+ // Connected but no project ID.
226
+ return {
227
+ status: "not-configured" as const,
228
+ designId,
229
+ cta: {
230
+ kind: "configure-project" as const,
231
+ label: "Configure Builder project",
232
+ description:
233
+ "Builder credentials are present but no branch project ID is set. " +
234
+ "Set DISPATCH_BUILDER_PROJECT_ID, BUILDER_BRANCH_PROJECT_ID, or " +
235
+ "BUILDER_PROJECT_ID to enable cloud agent migration.",
236
+ primaryAction: "Open Builder settings",
237
+ connectUrl: `${appHost}/account-settings`,
238
+ },
239
+ message:
240
+ "Builder credentials are configured but no branch project ID is set. " +
241
+ "Set DISPATCH_BUILDER_PROJECT_ID to enable cloud agent migration.",
242
+ };
243
+ }
244
+
245
+ // ── 3. Resolve branch project ID ──────────────────────────────────────
246
+ const projectId = await resolveBuilderBranchProjectId();
247
+ if (!projectId) {
248
+ throw new Error(
249
+ "Builder branch project ID is not configured. " +
250
+ "Set DISPATCH_BUILDER_PROJECT_ID, BUILDER_BRANCH_PROJECT_ID, or " +
251
+ "BUILDER_PROJECT_ID and try again.",
252
+ );
253
+ }
254
+
255
+ // ── 4. Snapshot the current design (reversible baseline) ──────────────
256
+ const versionId = await snapshotDesign(
257
+ designId,
258
+ `Pre-migration snapshot — ${design.title}`,
259
+ );
260
+
261
+ // ── 5. Build the live snapshot (Yjs preferred for in-flight edits) ────
262
+ const snapshot = await buildDesignSnapshot(designId, design.data);
263
+
264
+ // ── 6. Build the migration seed prompt ────────────────────────────────
265
+ const seed = buildMigrationSeed({
266
+ title: design.title,
267
+ files: snapshot.files,
268
+ resolvedCssVars: snapshot.resolvedCssVars,
269
+ brandKitSummary,
270
+ });
271
+
272
+ // ── 7. Hand off to the Builder cloud agent ────────────────────────────
273
+ const ownerEmail = getRequestUserEmail();
274
+ const result = await runBuilderAgent({
275
+ prompt: seed.prompt,
276
+ projectId,
277
+ branchName: branchName?.trim() || undefined,
278
+ userEmail: ownerEmail ?? undefined,
279
+ });
280
+
281
+ return {
282
+ status: "processing" as const,
283
+ designId,
284
+ versionId,
285
+ snapshotLabel: `Pre-migration snapshot — ${design.title}`,
286
+ branchName: result.branchName,
287
+ projectId: result.projectId,
288
+ url: result.url,
289
+ builderStatus: result.status,
290
+ seedFileCount: seed.fileCount,
291
+ seedTotalBytes: seed.totalBytes,
292
+ message:
293
+ `Migration started. Builder is generating a React app branch ` +
294
+ `"${result.branchName}". Open the url to track progress. ` +
295
+ `The original inline design is preserved as version ${versionId}.`,
296
+ };
297
+ },
298
+ });
@@ -0,0 +1,237 @@
1
+ /**
2
+ * open-component-source — navigate / deep-link action.
3
+ *
4
+ * For a selected component instance, resolves the source file path (via
5
+ * `resolveNodeToFile` bridge op when the capability is available) and writes
6
+ * a navigation command to application state so the editor opens the correct
7
+ * file and highlights the component.
8
+ *
9
+ * **Inline / Alpine tier:** the "source file" is the design HTML file itself.
10
+ * The action navigates the editor to the file and selects the component node —
11
+ * there is no external source file to open. The response includes a
12
+ * `ctaRequired` flag pointing to the real-app CTA for full jump-to-source.
13
+ *
14
+ * **Real-app tier (localhost / fusion):** uses the persisted `component_index`
15
+ * row's `filePath` / `exportName` as the target (populated by `index-components`
16
+ * after a bridge handshake or AST parse). The `resolveNodeToFile` capability
17
+ * gate is checked and the response includes the external file path for the IDE
18
+ * to open.
19
+ *
20
+ * Navigation is written via `writeAppState("navigate", ...)` — the same
21
+ * mechanism used by the `navigate` action — so the caller can trigger UI
22
+ * navigation without a round-trip.
23
+ *
24
+ * See DESIGN-STUDIO-PLAN.md §6.1 (jump-to-source) and §7 (action surface).
25
+ */
26
+
27
+ import { defineAction } from "@agent-native/core";
28
+ import { writeAppState } from "@agent-native/core/application-state";
29
+ import { getText, hasCollabState } from "@agent-native/core/collab";
30
+ import { accessFilter, resolveAccess } from "@agent-native/core/sharing";
31
+ import { and, eq } from "drizzle-orm";
32
+ import { z } from "zod";
33
+
34
+ import { getDb, schema } from "../server/db/index.js";
35
+ import "../server/db/index.js"; // ensure registerShareableResource runs
36
+ import { resolveSourceCapabilities } from "../shared/capability-resolver.js";
37
+ import { buildCodeLayerProjection } from "../shared/code-layer.js";
38
+ import type { CodeLayerSource } from "../shared/code-layer.js";
39
+ import { componentNameFor } from "../shared/component-model.js";
40
+ import { hasCapability } from "../shared/design-source-capabilities.js";
41
+ import { normalizeDesignSourceType } from "../shared/source-mode.js";
42
+
43
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
44
+
45
+ async function liveContent(
46
+ fileId: string,
47
+ storedContent: string,
48
+ ): Promise<string> {
49
+ try {
50
+ if (await hasCollabState(fileId)) {
51
+ const live = await getText(fileId, "content");
52
+ if (typeof live === "string") return live;
53
+ }
54
+ } catch {
55
+ // Collab reads are best-effort; SQL content is the fallback.
56
+ }
57
+ return storedContent;
58
+ }
59
+
60
+ // ─── Action ───────────────────────────────────────────────────────────────────
61
+
62
+ export default defineAction({
63
+ description:
64
+ "Navigate to a component's source: for inline/Alpine designs, selects " +
65
+ "the component root in the editor and returns the design file as the " +
66
+ "source location. For real-app sources (localhost / fusion), resolves the " +
67
+ "external source file path + export name via the component_index and the " +
68
+ "resolveNodeToFile bridge capability, and emits a navigation command so the " +
69
+ "IDE can open the file at the correct line.",
70
+ schema: z.object({
71
+ designId: z.string().describe("Design project ID"),
72
+ nodeId: z
73
+ .string()
74
+ .describe("data-agent-native-node-id of the component instance root"),
75
+ fileId: z
76
+ .string()
77
+ .optional()
78
+ .describe("Design file id; defaults to index.html"),
79
+ }),
80
+ readOnly: true,
81
+ http: { method: "GET" },
82
+ run: async ({ designId, nodeId, fileId }) => {
83
+ const db = getDb();
84
+
85
+ // ── Access check ────────────────────────────────────────────────────────
86
+ const access = await resolveAccess("design", designId);
87
+ if (!access) throw new Error("Design not found");
88
+
89
+ // ── Source type + capabilities ───────────────────────────────────────────
90
+ let rawSourceType: unknown = "inline";
91
+ const rawData = (access.resource as { data?: unknown }).data;
92
+ if (typeof rawData === "string") {
93
+ try {
94
+ const parsed: unknown = JSON.parse(rawData);
95
+ if (
96
+ parsed !== null &&
97
+ typeof parsed === "object" &&
98
+ "sourceType" in (parsed as object)
99
+ ) {
100
+ rawSourceType = (parsed as { sourceType: unknown }).sourceType;
101
+ }
102
+ } catch {
103
+ // Default to inline.
104
+ }
105
+ }
106
+
107
+ const sourceType = normalizeDesignSourceType(rawSourceType) ?? "inline";
108
+ const caps = resolveSourceCapabilities(sourceType);
109
+ const canResolveToFile = hasCapability(caps, "resolveNodeToFile");
110
+
111
+ // ── Fetch design file ────────────────────────────────────────────────────
112
+ const conditions = [
113
+ accessFilter(schema.designs, schema.designShares),
114
+ eq(schema.designFiles.designId, designId),
115
+ fileId
116
+ ? eq(schema.designFiles.id, fileId)
117
+ : eq(schema.designFiles.filename, "index.html"),
118
+ ];
119
+
120
+ const [file] = await db
121
+ .select({
122
+ id: schema.designFiles.id,
123
+ designId: schema.designFiles.designId,
124
+ filename: schema.designFiles.filename,
125
+ content: schema.designFiles.content,
126
+ })
127
+ .from(schema.designFiles)
128
+ .innerJoin(
129
+ schema.designs,
130
+ eq(schema.designFiles.designId, schema.designs.id),
131
+ )
132
+ .where(and(...conditions))
133
+ .limit(1);
134
+
135
+ if (!file) throw new Error("Design HTML file not found.");
136
+
137
+ const html = await liveContent(file.id, file.content ?? "");
138
+
139
+ // ── Resolve node ─────────────────────────────────────────────────────────
140
+ const codeLayerSource: CodeLayerSource = {
141
+ kind: "design-file",
142
+ designId: file.designId,
143
+ fileId: file.id,
144
+ filename: file.filename,
145
+ };
146
+
147
+ const projection = buildCodeLayerProjection(html, {
148
+ source: codeLayerSource,
149
+ });
150
+
151
+ const node = projection.nodes.find((n) => n.id === nodeId);
152
+ if (!node) {
153
+ throw new Error(
154
+ `Node "${nodeId}" not found. Run get-code-layer-projection to list current ids.`,
155
+ );
156
+ }
157
+
158
+ const componentName = componentNameFor(node);
159
+ if (!componentName) {
160
+ throw new Error(
161
+ `Node "${nodeId}" is not a component root (no data-agent-native-component attribute).`,
162
+ );
163
+ }
164
+
165
+ // ── Lookup persisted component_index for real-app source location ────────
166
+ const [indexRow] = await db
167
+ .select({
168
+ id: schema.componentIndex.id,
169
+ filePath: schema.componentIndex.filePath,
170
+ exportName: schema.componentIndex.exportName,
171
+ })
172
+ .from(schema.componentIndex)
173
+ .where(
174
+ and(
175
+ eq(schema.componentIndex.designId, designId),
176
+ eq(schema.componentIndex.name, componentName),
177
+ ),
178
+ )
179
+ .limit(1);
180
+
181
+ // ── Build source location ─────────────────────────────────────────────────
182
+ // For inline designs: the design file is the "source".
183
+ // For real-app designs: the external file path from component_index.
184
+ const isRealApp = sourceType !== "inline";
185
+ const externalFilePath =
186
+ isRealApp && canResolveToFile ? (indexRow?.filePath ?? null) : null;
187
+ const exportName =
188
+ isRealApp && canResolveToFile ? (indexRow?.exportName ?? null) : null;
189
+
190
+ const sourceLocation = {
191
+ /** The design file that contains this component instance. */
192
+ designFileId: file.id,
193
+ designFilename: file.filename,
194
+ /** Node id within the design file. */
195
+ nodeId,
196
+ /** CSS selector for the component root in the rendered HTML. */
197
+ selector: node.selector,
198
+ /** External source file for real-app components (null on inline). */
199
+ externalFilePath,
200
+ exportName,
201
+ };
202
+
203
+ // ── Emit navigation command ──────────────────────────────────────────────
204
+ // Use the same application state key as the `navigate` action so the UI
205
+ // client picks it up and selects the element in the editor.
206
+ await writeAppState("navigate", {
207
+ view: "editor",
208
+ designId,
209
+ editorView: "single",
210
+ fileId: file.id,
211
+ filename: file.filename,
212
+ selectedNodeId: nodeId,
213
+ inspectorTab: "design",
214
+ inspectorSection: "component",
215
+ });
216
+
217
+ return {
218
+ designId,
219
+ nodeId,
220
+ componentName,
221
+ sourceType,
222
+ sourceLocation,
223
+ capabilities: {
224
+ canResolveToFile,
225
+ hasExternalSource: Boolean(externalFilePath),
226
+ ctaRequired: isRealApp && !canResolveToFile,
227
+ ctaMessage:
228
+ isRealApp && !canResolveToFile
229
+ ? "Jump to external source file requires the resolveNodeToFile bridge capability. Connect Builder and run index-components to enable full jump-to-source."
230
+ : isRealApp && !externalFilePath
231
+ ? "Component source file not yet indexed. Run index-components to populate file paths."
232
+ : undefined,
233
+ },
234
+ navigated: true,
235
+ };
236
+ },
237
+ });