@agent-native/core 0.79.27 → 0.80.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 (497) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +34 -0
  3. package/corpus/core/docs/content/locales/ar-SA/skills-guide.mdx +5 -0
  4. package/corpus/core/docs/content/locales/ar-SA/template-design.mdx +55 -1
  5. package/corpus/core/docs/content/locales/de-DE/skills-guide.mdx +5 -0
  6. package/corpus/core/docs/content/locales/de-DE/template-design.mdx +66 -1
  7. package/corpus/core/docs/content/locales/es-ES/skills-guide.mdx +5 -0
  8. package/corpus/core/docs/content/locales/es-ES/template-design.mdx +65 -1
  9. package/corpus/core/docs/content/locales/fr-FR/skills-guide.mdx +5 -0
  10. package/corpus/core/docs/content/locales/fr-FR/template-design.mdx +64 -1
  11. package/corpus/core/docs/content/locales/hi-IN/skills-guide.mdx +5 -0
  12. package/corpus/core/docs/content/locales/hi-IN/template-design.mdx +59 -1
  13. package/corpus/core/docs/content/locales/ja-JP/skills-guide.mdx +5 -0
  14. package/corpus/core/docs/content/locales/ja-JP/template-design.mdx +62 -1
  15. package/corpus/core/docs/content/locales/ko-KR/skills-guide.mdx +5 -0
  16. package/corpus/core/docs/content/locales/ko-KR/template-design.mdx +58 -1
  17. package/corpus/core/docs/content/locales/pt-BR/skills-guide.mdx +5 -0
  18. package/corpus/core/docs/content/locales/pt-BR/template-design.mdx +62 -1
  19. package/corpus/core/docs/content/locales/zh-CN/skills-guide.mdx +5 -0
  20. package/corpus/core/docs/content/locales/zh-CN/template-design.mdx +50 -1
  21. package/corpus/core/docs/content/locales/zh-TW/skills-guide.mdx +5 -0
  22. package/corpus/core/docs/content/locales/zh-TW/template-design.mdx +52 -1
  23. package/corpus/core/docs/content/skills-guide.mdx +5 -0
  24. package/corpus/core/docs/content/template-design.mdx +59 -1
  25. package/corpus/core/package.json +2 -1
  26. package/corpus/core/src/agent/engine/index.ts +1 -0
  27. package/corpus/core/src/agent/engine/registry.ts +40 -0
  28. package/corpus/core/src/agent/production-agent.ts +6 -2
  29. package/corpus/core/src/application-state/handlers.ts +1 -1
  30. package/corpus/core/src/brand-kit/index.ts +1 -1
  31. package/corpus/core/src/cli/design-connect.ts +490 -0
  32. package/corpus/core/src/cli/index.ts +16 -0
  33. package/corpus/core/src/cli/skills.ts +144 -3
  34. package/corpus/core/src/client/AgentPanel.tsx +1 -1
  35. package/corpus/core/src/client/AssistantChat.tsx +43 -7
  36. package/corpus/core/src/client/MultiTabAssistantChat.tsx +1 -1
  37. package/corpus/core/src/client/agent-chat.ts +27 -3
  38. package/corpus/core/src/client/blocks/library/MermaidBlock.tsx +1 -1
  39. package/corpus/core/src/client/blocks/library/diagram.tsx +2 -2
  40. package/corpus/core/src/client/blocks/library/wireframe.tsx +1 -1
  41. package/corpus/core/src/client/chat/message-components.tsx +1 -1
  42. package/corpus/core/src/client/chat-model-groups.ts +1 -2
  43. package/corpus/core/src/client/components/LiveCursorOverlay.tsx +33 -66
  44. package/corpus/core/src/client/composer/TiptapComposer.tsx +99 -24
  45. package/corpus/core/src/client/composer/useVoiceDictation.ts +429 -260
  46. package/corpus/core/src/client/extensions/portable-extension.ts +1 -1
  47. package/corpus/core/src/client/frame-protocol.ts +17 -2
  48. package/corpus/core/src/client/rich-markdown-editor/RegistryBlockNode.tsx +2 -2
  49. package/corpus/core/src/client/sharing/ShareButton.tsx +20 -15
  50. package/corpus/core/src/client/use-agent-engine-configured.ts +80 -28
  51. package/corpus/core/src/code-agents/transcript-normalizer.ts +1 -1
  52. package/corpus/core/src/extensions/path.ts +1 -4
  53. package/corpus/core/src/integrations/a2a-continuation-processor.ts +1 -1
  54. package/corpus/core/src/mcp/build-server.ts +1 -1
  55. package/corpus/core/src/org/handlers.ts +5 -5
  56. package/corpus/core/src/org/plugin.ts +2 -2
  57. package/corpus/core/src/scripts/call-agent.ts +1 -1
  58. package/corpus/core/src/scripts/db/safety.ts +1 -1
  59. package/corpus/core/src/server/auth.ts +3 -0
  60. package/corpus/core/src/server/builder-design-systems.ts +308 -0
  61. package/corpus/core/src/server/core-routes-plugin.ts +29 -3
  62. package/corpus/core/src/server/index.ts +8 -0
  63. package/corpus/core/src/server/transcribe-voice.ts +57 -22
  64. package/corpus/core/src/shared/mcp-embed-headers.ts +23 -1
  65. package/corpus/core/src/styles/agent-native.css +60 -4
  66. package/corpus/core/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
  67. package/corpus/core/src/usage/store.ts +2 -2
  68. package/corpus/core/src/vite/client.ts +2 -0
  69. package/corpus/core/src/voice/index.ts +18 -0
  70. package/corpus/core/src/voice/voice-cleanup-prompt.ts +38 -0
  71. package/corpus/core/src/voice/voice-context.ts +217 -0
  72. package/corpus/core/src/voice/voice-replacements.ts +75 -0
  73. package/corpus/templates/analytics/AGENTS.md +4 -3
  74. package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +298 -15
  75. package/corpus/templates/analytics/actions/get-sql-dashboard.ts +9 -4
  76. package/corpus/templates/analytics/actions/list-session-recordings.ts +6 -1
  77. package/corpus/templates/analytics/actions/mutate-dashboard.ts +18 -2
  78. package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +12 -2
  79. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +557 -400
  80. package/corpus/templates/analytics/app/global.css +0 -4
  81. package/corpus/templates/analytics/app/hooks/use-replay-storage-status.ts +66 -0
  82. package/corpus/templates/analytics/app/i18n/zh-TW.ts +39 -0
  83. package/corpus/templates/analytics/app/i18n-data.ts +424 -0
  84. package/corpus/templates/analytics/app/pages/Settings.tsx +333 -0
  85. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +2 -1
  86. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/dashboard-layout.ts +121 -3
  87. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +82 -34
  88. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +7 -0
  89. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +144 -36
  90. package/corpus/templates/analytics/changelog/2026-06-28-ask-tab-now-matches-the-darker-app-background.md +6 -0
  91. package/corpus/templates/analytics/changelog/2026-06-28-dashboard-email-reports-now-use-cleaner-light-mode-snapshots.md +6 -0
  92. package/corpus/templates/analytics/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  93. package/corpus/templates/analytics/changelog/2026-06-28-sessions-now-show-only-signed-in-recordings-with-playable-re.md +6 -0
  94. package/corpus/templates/analytics/changelog/2026-06-29-analytics-agents-can-now-place-new-charts-into-requested-das.md +6 -0
  95. package/corpus/templates/analytics/changelog/2026-06-29-analytics-queries-now-report-failed-source-query-errors-inst.md +6 -0
  96. package/corpus/templates/analytics/changelog/2026-06-29-charts-can-now-be-dropped-between-full-dashboard-rows-to-cre.md +6 -0
  97. package/corpus/templates/analytics/changelog/2026-06-29-dashboard-email-reports-include-the-full-dashboard-image-wit.md +6 -0
  98. package/corpus/templates/analytics/changelog/2026-06-29-main-surface-border-reaches-the-top.md +6 -0
  99. package/corpus/templates/analytics/changelog/2026-06-29-session-replay-now-records-playable-sessions-in-production-a.md +6 -0
  100. package/corpus/templates/analytics/changelog/2026-06-29-set-up-session-replay-storage-from-settings-connect-builder-.md +6 -0
  101. package/corpus/templates/analytics/scripts/cleanup-empty-session-recordings.ts +102 -0
  102. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +3 -3
  103. package/corpus/templates/analytics/server/lib/dashboard-report.ts +75 -30
  104. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +5 -2
  105. package/corpus/templates/analytics/server/lib/real-data-actions.ts +81 -20
  106. package/corpus/templates/analytics/server/lib/replay-storage.ts +79 -0
  107. package/corpus/templates/analytics/server/lib/s3-upload-provider.ts +255 -0
  108. package/corpus/templates/analytics/server/lib/session-replay.ts +53 -12
  109. package/corpus/templates/analytics/server/plugins/agent-chat.ts +11 -2
  110. package/corpus/templates/analytics/server/plugins/onboarding.ts +97 -0
  111. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +4 -4
  112. package/corpus/templates/assets/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  113. package/corpus/templates/brain/app/components/layout/Layout.tsx +29 -2
  114. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +131 -42
  115. package/corpus/templates/brain/app/i18n/zh-TW.ts +2 -0
  116. package/corpus/templates/brain/app/i18n-data.ts +20 -0
  117. package/corpus/templates/brain/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  118. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +29 -1
  119. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +417 -299
  120. package/corpus/templates/calendar/app/i18n/zh-TW.ts +2 -0
  121. package/corpus/templates/calendar/app/i18n-data.ts +20 -0
  122. package/corpus/templates/calendar/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  123. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +6 -19
  124. package/corpus/templates/chat/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  125. package/corpus/templates/clips/AGENTS.md +4 -0
  126. package/corpus/templates/clips/actions/cleanup-transcript.ts +39 -9
  127. package/corpus/templates/clips/actions/finalize-meeting.ts +81 -12
  128. package/corpus/templates/clips/actions/lib/agents-md-context.ts +4 -1
  129. package/corpus/templates/clips/app/components/library/library-layout.tsx +3 -3
  130. package/corpus/templates/clips/app/components/meetings/share-meeting-dialog.tsx +1 -1
  131. package/corpus/templates/clips/app/components/player/share-dialog.tsx +2 -2
  132. package/corpus/templates/clips/changelog/2026-06-28-left-sidebar-footer-controls-use-less-divider-chrome.md +6 -0
  133. package/corpus/templates/clips/desktop/src/lib/personal-vocabulary.ts +13 -8
  134. package/corpus/templates/clips/desktop/src/lib/recorder.ts +24 -0
  135. package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +105 -5
  136. package/corpus/templates/clips/desktop/src/lib/voice-dictation.ts +60 -1
  137. package/corpus/templates/content/actions/set-image-alt-text.ts +1 -1
  138. package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +1 -1
  139. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +1 -1
  140. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +5 -5
  141. package/corpus/templates/content/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  142. package/corpus/templates/content/shared/document-export.ts +1 -1
  143. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +8 -18
  144. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +154 -0
  145. package/corpus/templates/design/AGENTS.md +95 -5
  146. package/corpus/templates/design/DESIGN.md +82 -0
  147. package/corpus/templates/design/DEVELOPING.md +43 -0
  148. package/corpus/templates/design/actions/add-localhost-screens.ts +453 -0
  149. package/corpus/templates/design/actions/apply-shader.ts +277 -0
  150. package/corpus/templates/design/actions/apply-visual-edit.ts +303 -0
  151. package/corpus/templates/design/actions/connect-localhost.ts +183 -0
  152. package/corpus/templates/design/actions/edit-design.ts +195 -42
  153. package/corpus/templates/design/actions/generate-design.ts +71 -1
  154. package/corpus/templates/design/actions/generate-screens.ts +193 -0
  155. package/corpus/templates/design/actions/get-code-layer-projection.ts +191 -0
  156. package/corpus/templates/design/actions/get-shader.ts +119 -0
  157. package/corpus/templates/design/actions/index-design-system-with-builder.ts +259 -0
  158. package/corpus/templates/design/actions/list-localhost-connections.ts +95 -0
  159. package/corpus/templates/design/actions/navigate.ts +55 -2
  160. package/corpus/templates/design/actions/update-file.ts +9 -2
  161. package/corpus/templates/design/actions/view-screen.ts +68 -1
  162. package/corpus/templates/design/agent-native.app-skill.json +10 -0
  163. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +719 -0
  164. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +2120 -103
  165. package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +74 -38
  166. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +401 -0
  167. package/corpus/templates/design/app/components/design/EditPanel.tsx +3966 -440
  168. package/corpus/templates/design/app/components/design/LayersPanel.tsx +1473 -0
  169. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +3940 -147
  170. package/corpus/templates/design/app/components/design/QuestionFlow.tsx +700 -13
  171. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +105 -63
  172. package/corpus/templates/design/app/components/design/index.ts +0 -5
  173. package/corpus/templates/design/app/components/design/inspector/AlignmentMatrix.tsx +353 -0
  174. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +1589 -0
  175. package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +511 -0
  176. package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +395 -0
  177. package/corpus/templates/design/app/components/design/inspector/FigmaColorPicker.tsx +2010 -0
  178. package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +601 -0
  179. package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +242 -0
  180. package/corpus/templates/design/app/components/design/inspector/SHADER_INTEGRATION.md +420 -0
  181. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +238 -0
  182. package/corpus/templates/design/app/components/design/inspector/ShaderControls.stories.tsx +71 -0
  183. package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +575 -0
  184. package/corpus/templates/design/app/components/design/inspector/ShaderEffectRow.tsx +106 -0
  185. package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +423 -0
  186. package/corpus/templates/design/app/components/design/inspector/figma-icons.tsx +741 -0
  187. package/corpus/templates/design/app/components/design/inspector/index.ts +87 -0
  188. package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +201 -0
  189. package/corpus/templates/design/app/components/design/types.ts +23 -0
  190. package/corpus/templates/design/app/components/layout/Layout.tsx +24 -13
  191. package/corpus/templates/design/app/components/layout/Sidebar.tsx +4 -4
  192. package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +474 -36
  193. package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +22 -5
  194. package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +24 -11
  195. package/corpus/templates/design/app/global.css +149 -5
  196. package/corpus/templates/design/app/hooks/use-agent-generating.ts +4 -0
  197. package/corpus/templates/design/app/hooks/use-navigation-state.ts +130 -8
  198. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +329 -0
  199. package/corpus/templates/design/app/i18n/zh-TW.ts +277 -0
  200. package/corpus/templates/design/app/i18n-data.ts +3028 -1
  201. package/corpus/templates/design/app/pages/DesignEditor.tsx +5831 -904
  202. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +57 -221
  203. package/corpus/templates/design/changelog/2026-06-28-annotate-mode-now-combines-drawing-and-comment-pins-in-one-c.md +6 -0
  204. package/corpus/templates/design/changelog/2026-06-28-design-editor-panel-borders-are-cleaner-so-the-canvas-edge-s.md +6 -0
  205. package/corpus/templates/design/changelog/2026-06-28-drawing-prompts-now-reliably-open-and-submit-to-the-design-a.md +6 -0
  206. package/corpus/templates/design/changelog/2026-06-28-editor-app-menus-now-use-an-outline-agent-native-mark-with-b.md +6 -0
  207. package/corpus/templates/design/changelog/2026-06-28-figma-style-code-design-mode.md +6 -0
  208. package/corpus/templates/design/changelog/2026-06-28-layer-selection-now-updates-chat-context-without-opening-the.md +6 -0
  209. package/corpus/templates/design/changelog/2026-06-28-layer-selections-now-preserve-hidden-and-locked-canvas-state.md +6 -0
  210. package/corpus/templates/design/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  211. package/corpus/templates/design/changelog/2026-06-28-live-cursors-now-keep-names-beside-a-cleaner-pointer-marker.md +6 -0
  212. package/corpus/templates/design/changelog/2026-06-28-mode-switching-now-lives-in-a-compact-bottom-right-icon-dock.md +6 -0
  213. package/corpus/templates/design/changelog/2026-06-28-screen-overview-now-handles-zooming-drawing-opening-and-dele.md +6 -0
  214. package/corpus/templates/design/changelog/2026-06-28-screen-overview-now-selects-screens-on-click-and-opens-them-.md +6 -0
  215. package/corpus/templates/design/changelog/2026-06-28-screen-overview-zooms-into-the-active-screen-with-smoother-e.md +6 -0
  216. package/corpus/templates/design/changelog/2026-06-28-selected-element-chips-in-chat-are-shorter-and-easier-to-sca.md +6 -0
  217. package/corpus/templates/design/changelog/2026-06-28-the-design-editor-toolbar-is-more-compact-and-the-app-menu-m.md +6 -0
  218. package/corpus/templates/design/changelog/2026-06-28-tweaks-now-live-at-the-top-of-the-design-sidebar-instead-of-.md +6 -0
  219. package/corpus/templates/design/changelog/2026-06-28-tweaks-now-live-in-the-right-inspector-beside-the-design-tab.md +6 -0
  220. package/corpus/templates/design/changelog/2026-06-29-active-sidebar-rows-use-soft-highlights.md +6 -0
  221. package/corpus/templates/design/changelog/2026-06-29-agents-can-now-open-screen-overview-focus-screens-and-add.md +6 -0
  222. package/corpus/templates/design/changelog/2026-06-29-canvas-selection-no-longer-flashes-broken-prototype-html-whe.md +6 -0
  223. package/corpus/templates/design/changelog/2026-06-29-command-menu-selections-are-clearer-in-dark-mode.md +6 -0
  224. package/corpus/templates/design/changelog/2026-06-29-design-agents-now-edit-broad-copy-changes-more-reliably.md +6 -0
  225. package/corpus/templates/design/changelog/2026-06-29-design-editor-extensions-now-run-inline-beside-the-artboard.md +6 -0
  226. package/corpus/templates/design/changelog/2026-06-29-design-mode-top-chrome-now-groups-collaborators-preview-shar.md +6 -0
  227. package/corpus/templates/design/changelog/2026-06-29-element-selection-now-stays-on-the-intended-layer-after-sele.md +6 -0
  228. package/corpus/templates/design/changelog/2026-06-29-screen-overview-full-view-controls-now-sit-above-frames-inst.md +6 -0
  229. package/corpus/templates/design/changelog/2026-06-29-screen-overview-tools-can-draw-shapes-create-screens-and-kee.md +6 -0
  230. package/corpus/templates/design/changelog/2026-06-29-sidebars-use-darker-chrome-and-chat-warns-immediately.md +6 -0
  231. package/corpus/templates/design/changelog/2026-06-29-the-pen-tool-now-creates-anchor-based-bezier-vectors-with-ha.md +6 -0
  232. package/corpus/templates/design/changelog/2026-06-29-visual-edit-can-open-localhost-routes-as-url-backed-screens.md +6 -0
  233. package/corpus/templates/design/package.json +1 -0
  234. package/corpus/templates/design/server/db/schema.ts +26 -0
  235. package/corpus/templates/design/server/handlers/import-figma-system.ts +38 -85
  236. package/corpus/templates/design/server/lib/design-snapshot.ts +9 -1
  237. package/corpus/templates/design/server/plugins/agent-chat.ts +3 -0
  238. package/corpus/templates/design/shared/api.ts +27 -0
  239. package/corpus/templates/design/shared/canvas-frames.ts +103 -0
  240. package/corpus/templates/design/shared/canvas-math.ts +1058 -0
  241. package/corpus/templates/design/shared/code-layer.ts +2412 -0
  242. package/corpus/templates/design/shared/color-utils.ts +180 -0
  243. package/corpus/templates/design/shared/generation-session.ts +61 -0
  244. package/corpus/templates/design/shared/html-content.ts +21 -0
  245. package/corpus/templates/design/shared/pen-path.ts +207 -0
  246. package/corpus/templates/design/shared/shader-presets.ts +782 -0
  247. package/corpus/templates/design/shared/shader-safety.ts +137 -0
  248. package/corpus/templates/design/shared/source-mode.ts +237 -0
  249. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +149 -6
  250. package/corpus/templates/forms/app/i18n/ar-SA.ts +2 -0
  251. package/corpus/templates/forms/app/i18n/de-DE.ts +2 -0
  252. package/corpus/templates/forms/app/i18n/en-US.ts +2 -0
  253. package/corpus/templates/forms/app/i18n/es-ES.ts +2 -0
  254. package/corpus/templates/forms/app/i18n/fr-FR.ts +2 -0
  255. package/corpus/templates/forms/app/i18n/hi-IN.ts +2 -0
  256. package/corpus/templates/forms/app/i18n/ja-JP.ts +2 -0
  257. package/corpus/templates/forms/app/i18n/ko-KR.ts +2 -0
  258. package/corpus/templates/forms/app/i18n/pt-BR.ts +2 -0
  259. package/corpus/templates/forms/app/i18n/zh-CN.ts +2 -0
  260. package/corpus/templates/forms/app/i18n/zh-TW.ts +2 -0
  261. package/corpus/templates/forms/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  262. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +2 -2
  263. package/corpus/templates/macros/changelog/2026-06-28-left-sidebar-footer-controls-use-less-divider-chrome.md +6 -0
  264. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +408 -247
  265. package/corpus/templates/mail/app/i18n/ar-SA.ts +4 -0
  266. package/corpus/templates/mail/app/i18n/de-DE.ts +4 -0
  267. package/corpus/templates/mail/app/i18n/en-US.ts +4 -0
  268. package/corpus/templates/mail/app/i18n/es-ES.ts +4 -0
  269. package/corpus/templates/mail/app/i18n/fr-FR.ts +4 -0
  270. package/corpus/templates/mail/app/i18n/hi-IN.ts +4 -0
  271. package/corpus/templates/mail/app/i18n/ja-JP.ts +4 -0
  272. package/corpus/templates/mail/app/i18n/ko-KR.ts +4 -0
  273. package/corpus/templates/mail/app/i18n/pt-BR.ts +4 -0
  274. package/corpus/templates/mail/app/i18n/zh-CN.ts +4 -0
  275. package/corpus/templates/mail/app/i18n/zh-TW.ts +4 -0
  276. package/corpus/templates/mail/app/lib/utils.ts +2 -2
  277. package/corpus/templates/mail/changelog/2026-06-28-pinned-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  278. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +6 -8
  279. package/corpus/templates/plan/app/components/plan/wireframe/Wireframe.tsx +1 -1
  280. package/corpus/templates/plan/app/global.css +61 -78
  281. package/corpus/templates/plan/app/pages/PlansPage.tsx +8 -0
  282. package/corpus/templates/plan/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  283. package/corpus/templates/plan/changelog/2026-06-28-plans-use-the-shared-neutral-light-and-dark-theme.md +6 -0
  284. package/corpus/templates/plan/changelog/2026-06-28-sending-open-feedback-from-a-plan-now-opens-the-inline-plan-.md +6 -0
  285. package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +9 -10
  286. package/corpus/templates/slides/AGENTS.md +3 -2
  287. package/corpus/templates/slides/actions/import-file.ts +26 -17
  288. package/corpus/templates/slides/actions/index-design-system-with-builder.ts +259 -0
  289. package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +35 -167
  290. package/corpus/templates/slides/app/components/design-system/fig-import-response.ts +9 -13
  291. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +5 -5
  292. package/corpus/templates/slides/app/context/DeckContext.tsx +1 -1
  293. package/corpus/templates/slides/app/i18n/ar-SA.ts +9 -37
  294. package/corpus/templates/slides/app/i18n/de-DE.ts +10 -25
  295. package/corpus/templates/slides/app/i18n/en-US.ts +9 -26
  296. package/corpus/templates/slides/app/i18n/es-ES.ts +10 -28
  297. package/corpus/templates/slides/app/i18n/fr-FR.ts +10 -28
  298. package/corpus/templates/slides/app/i18n/hi-IN.ts +9 -26
  299. package/corpus/templates/slides/app/i18n/ja-JP.ts +10 -22
  300. package/corpus/templates/slides/app/i18n/ko-KR.ts +9 -23
  301. package/corpus/templates/slides/app/i18n/pt-BR.ts +10 -28
  302. package/corpus/templates/slides/app/i18n/zh-CN.ts +9 -22
  303. package/corpus/templates/slides/app/i18n/zh-TW.ts +9 -22
  304. package/corpus/templates/slides/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  305. package/corpus/templates/slides/server/handlers/import-figma-system.ts +44 -12
  306. package/corpus/templates/slides/server/lib/chat-attachments.ts +1 -1
  307. package/corpus/templates/videos/app/components/NewCompositionPopover.tsx +1 -1
  308. package/corpus/templates/videos/app/components/Sidebar.tsx +2 -2
  309. package/corpus/templates/videos/app/components/layout/Layout.tsx +29 -2
  310. package/corpus/templates/videos/app/components/layout/NavSidebar.tsx +113 -30
  311. package/corpus/templates/videos/app/i18n/ar-SA.ts +2 -0
  312. package/corpus/templates/videos/app/i18n/de-DE.ts +2 -0
  313. package/corpus/templates/videos/app/i18n/en-US.ts +2 -0
  314. package/corpus/templates/videos/app/i18n/es-ES.ts +2 -0
  315. package/corpus/templates/videos/app/i18n/fr-FR.ts +2 -0
  316. package/corpus/templates/videos/app/i18n/hi-IN.ts +2 -0
  317. package/corpus/templates/videos/app/i18n/ja-JP.ts +2 -0
  318. package/corpus/templates/videos/app/i18n/ko-KR.ts +2 -0
  319. package/corpus/templates/videos/app/i18n/pt-BR.ts +2 -0
  320. package/corpus/templates/videos/app/i18n/zh-CN.ts +2 -0
  321. package/corpus/templates/videos/app/i18n/zh-TW.ts +2 -0
  322. package/corpus/templates/videos/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  323. package/dist/agent/engine/index.d.ts +1 -1
  324. package/dist/agent/engine/index.d.ts.map +1 -1
  325. package/dist/agent/engine/index.js +1 -1
  326. package/dist/agent/engine/index.js.map +1 -1
  327. package/dist/agent/engine/registry.d.ts +9 -0
  328. package/dist/agent/engine/registry.d.ts.map +1 -1
  329. package/dist/agent/engine/registry.js +37 -0
  330. package/dist/agent/engine/registry.js.map +1 -1
  331. package/dist/agent/production-agent.d.ts.map +1 -1
  332. package/dist/agent/production-agent.js +4 -3
  333. package/dist/agent/production-agent.js.map +1 -1
  334. package/dist/application-state/handlers.js +1 -1
  335. package/dist/application-state/handlers.js.map +1 -1
  336. package/dist/brand-kit/index.d.ts +1 -1
  337. package/dist/brand-kit/index.js +1 -1
  338. package/dist/brand-kit/index.js.map +1 -1
  339. package/dist/cli/design-connect.d.ts +52 -0
  340. package/dist/cli/design-connect.d.ts.map +1 -0
  341. package/dist/cli/design-connect.js +409 -0
  342. package/dist/cli/design-connect.js.map +1 -0
  343. package/dist/cli/index.js +15 -0
  344. package/dist/cli/index.js.map +1 -1
  345. package/dist/cli/skills.d.ts +3 -0
  346. package/dist/cli/skills.d.ts.map +1 -1
  347. package/dist/cli/skills.js +139 -3
  348. package/dist/cli/skills.js.map +1 -1
  349. package/dist/client/AgentPanel.js +1 -1
  350. package/dist/client/AgentPanel.js.map +1 -1
  351. package/dist/client/AssistantChat.d.ts.map +1 -1
  352. package/dist/client/AssistantChat.js +38 -8
  353. package/dist/client/AssistantChat.js.map +1 -1
  354. package/dist/client/MultiTabAssistantChat.js +1 -1
  355. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  356. package/dist/client/agent-chat.d.ts +6 -0
  357. package/dist/client/agent-chat.d.ts.map +1 -1
  358. package/dist/client/agent-chat.js +17 -3
  359. package/dist/client/agent-chat.js.map +1 -1
  360. package/dist/client/blocks/library/MermaidBlock.js +1 -1
  361. package/dist/client/blocks/library/MermaidBlock.js.map +1 -1
  362. package/dist/client/blocks/library/diagram.js +1 -1
  363. package/dist/client/blocks/library/diagram.js.map +1 -1
  364. package/dist/client/blocks/library/wireframe.js +1 -1
  365. package/dist/client/blocks/library/wireframe.js.map +1 -1
  366. package/dist/client/chat/message-components.js +1 -1
  367. package/dist/client/chat/message-components.js.map +1 -1
  368. package/dist/client/chat-model-groups.d.ts.map +1 -1
  369. package/dist/client/chat-model-groups.js +1 -2
  370. package/dist/client/chat-model-groups.js.map +1 -1
  371. package/dist/client/components/LiveCursorOverlay.d.ts +1 -2
  372. package/dist/client/components/LiveCursorOverlay.d.ts.map +1 -1
  373. package/dist/client/components/LiveCursorOverlay.js +19 -40
  374. package/dist/client/components/LiveCursorOverlay.js.map +1 -1
  375. package/dist/client/composer/TiptapComposer.d.ts +3 -1
  376. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  377. package/dist/client/composer/TiptapComposer.js +86 -24
  378. package/dist/client/composer/TiptapComposer.js.map +1 -1
  379. package/dist/client/composer/useVoiceDictation.d.ts +9 -0
  380. package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
  381. package/dist/client/composer/useVoiceDictation.js +154 -32
  382. package/dist/client/composer/useVoiceDictation.js.map +1 -1
  383. package/dist/client/extensions/portable-extension.d.ts +1 -1
  384. package/dist/client/extensions/portable-extension.d.ts.map +1 -1
  385. package/dist/client/extensions/portable-extension.js.map +1 -1
  386. package/dist/client/frame-protocol.d.ts +17 -2
  387. package/dist/client/frame-protocol.d.ts.map +1 -1
  388. package/dist/client/frame-protocol.js.map +1 -1
  389. package/dist/client/rich-markdown-editor/RegistryBlockNode.js +2 -2
  390. package/dist/client/rich-markdown-editor/RegistryBlockNode.js.map +1 -1
  391. package/dist/client/sharing/ShareButton.d.ts +2 -0
  392. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  393. package/dist/client/sharing/ShareButton.js +7 -6
  394. package/dist/client/sharing/ShareButton.js.map +1 -1
  395. package/dist/client/use-agent-engine-configured.d.ts +5 -0
  396. package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
  397. package/dist/client/use-agent-engine-configured.js +51 -25
  398. package/dist/client/use-agent-engine-configured.js.map +1 -1
  399. package/dist/code-agents/transcript-normalizer.js +1 -1
  400. package/dist/code-agents/transcript-normalizer.js.map +1 -1
  401. package/dist/collab/routes.d.ts +1 -1
  402. package/dist/extensions/path.d.ts +1 -1
  403. package/dist/extensions/path.d.ts.map +1 -1
  404. package/dist/extensions/path.js.map +1 -1
  405. package/dist/file-upload/actions/upload-image.d.ts +2 -2
  406. package/dist/integrations/a2a-continuation-processor.js +1 -1
  407. package/dist/integrations/a2a-continuation-processor.js.map +1 -1
  408. package/dist/mcp/build-server.d.ts +1 -1
  409. package/dist/mcp/build-server.d.ts.map +1 -1
  410. package/dist/mcp/build-server.js.map +1 -1
  411. package/dist/notifications/routes.d.ts +3 -3
  412. package/dist/observability/routes.d.ts +5 -5
  413. package/dist/org/handlers.js +5 -5
  414. package/dist/org/handlers.js.map +1 -1
  415. package/dist/org/plugin.js +2 -2
  416. package/dist/org/plugin.js.map +1 -1
  417. package/dist/scripts/call-agent.js +1 -1
  418. package/dist/scripts/call-agent.js.map +1 -1
  419. package/dist/scripts/db/safety.js +1 -1
  420. package/dist/scripts/db/safety.js.map +1 -1
  421. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  422. package/dist/server/auth.d.ts.map +1 -1
  423. package/dist/server/auth.js +3 -0
  424. package/dist/server/auth.js.map +1 -1
  425. package/dist/server/builder-design-systems.d.ts +28 -0
  426. package/dist/server/builder-design-systems.d.ts.map +1 -0
  427. package/dist/server/builder-design-systems.js +217 -0
  428. package/dist/server/builder-design-systems.js.map +1 -0
  429. package/dist/server/core-routes-plugin.d.ts +1 -0
  430. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  431. package/dist/server/core-routes-plugin.js +20 -3
  432. package/dist/server/core-routes-plugin.js.map +1 -1
  433. package/dist/server/index.d.ts +1 -0
  434. package/dist/server/index.d.ts.map +1 -1
  435. package/dist/server/index.js +1 -0
  436. package/dist/server/index.js.map +1 -1
  437. package/dist/server/transcribe-voice.d.ts +1 -1
  438. package/dist/server/transcribe-voice.d.ts.map +1 -1
  439. package/dist/server/transcribe-voice.js +40 -24
  440. package/dist/server/transcribe-voice.js.map +1 -1
  441. package/dist/shared/mcp-embed-headers.d.ts +1 -0
  442. package/dist/shared/mcp-embed-headers.d.ts.map +1 -1
  443. package/dist/shared/mcp-embed-headers.js +20 -1
  444. package/dist/shared/mcp-embed-headers.js.map +1 -1
  445. package/dist/styles/agent-native.css +60 -4
  446. package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
  447. package/dist/usage/store.js +2 -2
  448. package/dist/usage/store.js.map +1 -1
  449. package/dist/vite/client.d.ts.map +1 -1
  450. package/dist/vite/client.js +2 -0
  451. package/dist/vite/client.js.map +1 -1
  452. package/dist/voice/index.d.ts +5 -0
  453. package/dist/voice/index.d.ts.map +1 -0
  454. package/dist/voice/index.js +4 -0
  455. package/dist/voice/index.js.map +1 -0
  456. package/dist/voice/voice-cleanup-prompt.d.ts +6 -0
  457. package/dist/voice/voice-cleanup-prompt.d.ts.map +1 -0
  458. package/dist/voice/voice-cleanup-prompt.js +26 -0
  459. package/dist/voice/voice-cleanup-prompt.js.map +1 -0
  460. package/dist/voice/voice-context.d.ts +25 -0
  461. package/dist/voice/voice-context.d.ts.map +1 -0
  462. package/dist/voice/voice-context.js +156 -0
  463. package/dist/voice/voice-context.js.map +1 -0
  464. package/dist/voice/voice-replacements.d.ts +4 -0
  465. package/dist/voice/voice-replacements.d.ts.map +1 -0
  466. package/dist/voice/voice-replacements.js +52 -0
  467. package/dist/voice/voice-replacements.js.map +1 -0
  468. package/docs/content/locales/ar-SA/skills-guide.mdx +5 -0
  469. package/docs/content/locales/ar-SA/template-design.mdx +55 -1
  470. package/docs/content/locales/de-DE/skills-guide.mdx +5 -0
  471. package/docs/content/locales/de-DE/template-design.mdx +66 -1
  472. package/docs/content/locales/es-ES/skills-guide.mdx +5 -0
  473. package/docs/content/locales/es-ES/template-design.mdx +65 -1
  474. package/docs/content/locales/fr-FR/skills-guide.mdx +5 -0
  475. package/docs/content/locales/fr-FR/template-design.mdx +64 -1
  476. package/docs/content/locales/hi-IN/skills-guide.mdx +5 -0
  477. package/docs/content/locales/hi-IN/template-design.mdx +59 -1
  478. package/docs/content/locales/ja-JP/skills-guide.mdx +5 -0
  479. package/docs/content/locales/ja-JP/template-design.mdx +62 -1
  480. package/docs/content/locales/ko-KR/skills-guide.mdx +5 -0
  481. package/docs/content/locales/ko-KR/template-design.mdx +58 -1
  482. package/docs/content/locales/pt-BR/skills-guide.mdx +5 -0
  483. package/docs/content/locales/pt-BR/template-design.mdx +62 -1
  484. package/docs/content/locales/zh-CN/skills-guide.mdx +5 -0
  485. package/docs/content/locales/zh-CN/template-design.mdx +50 -1
  486. package/docs/content/locales/zh-TW/skills-guide.mdx +5 -0
  487. package/docs/content/locales/zh-TW/template-design.mdx +52 -1
  488. package/docs/content/skills-guide.mdx +5 -0
  489. package/docs/content/template-design.mdx +59 -1
  490. package/package.json +2 -1
  491. package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
  492. package/corpus/templates/design/actions/import-figma-file.ts +0 -166
  493. package/corpus/templates/design/app/components/design/DesignToolbar.tsx +0 -339
  494. package/corpus/templates/design/app/components/design/PresentMode.tsx +0 -68
  495. package/corpus/templates/design/app/components/design/ViewportTabs.tsx +0 -149
  496. package/corpus/templates/design/app/components/design/ZoomControls.tsx +0 -157
  497. package/corpus/templates/slides/server/lib/fig-design-system.ts +0 -110
@@ -0,0 +1,259 @@
1
+ import { defineAction } from "@agent-native/core";
2
+ import {
3
+ startBuilderDesignSystemIndex,
4
+ type BuilderDesignSystemIndexFile,
5
+ } from "@agent-native/core/server";
6
+ import {
7
+ getRequestOrgId,
8
+ getRequestUserEmail,
9
+ } from "@agent-native/core/server/request-context";
10
+ import { eq } from "drizzle-orm";
11
+ import { nanoid } from "nanoid";
12
+ import { z } from "zod";
13
+
14
+ import { getDb, schema } from "../server/db/index.js";
15
+
16
+ const MAX_CODE_FILES = 50;
17
+ const MAX_TOTAL_CODE_BYTES = 2 * 1024 * 1024;
18
+
19
+ const codeFileSchema = z.object({
20
+ filename: z.string().trim().min(1).describe("File name or relative path"),
21
+ content: z.string().describe("Raw text content of the code/design file"),
22
+ mimeType: z.string().trim().optional().describe("Optional MIME type"),
23
+ });
24
+
25
+ function mimeTypeForFilename(filename: string, explicit?: string): string {
26
+ if (explicit?.trim()) return explicit.trim();
27
+ const lower = filename.toLowerCase();
28
+ if (lower.endsWith(".css")) return "text/css";
29
+ if (lower.endsWith(".json")) return "application/json";
30
+ if (lower.endsWith(".md") || lower.endsWith(".mdx")) return "text/markdown";
31
+ if (lower.endsWith(".html")) return "text/html";
32
+ if (lower.endsWith(".svg")) return "image/svg+xml";
33
+ return "text/plain";
34
+ }
35
+
36
+ function makeFiles(
37
+ codeFiles: Array<z.infer<typeof codeFileSchema>> | undefined,
38
+ ): BuilderDesignSystemIndexFile[] {
39
+ const encoder = new TextEncoder();
40
+ const files: BuilderDesignSystemIndexFile[] = [];
41
+ let totalBytes = 0;
42
+ for (const file of (codeFiles ?? []).slice(0, MAX_CODE_FILES)) {
43
+ const data = encoder.encode(file.content);
44
+ if (totalBytes + data.byteLength > MAX_TOTAL_CODE_BYTES) break;
45
+ totalBytes += data.byteLength;
46
+ files.push({
47
+ name: file.filename.replace(/^\/+/, "") || "code.txt",
48
+ data,
49
+ mimeType: mimeTypeForFilename(file.filename, file.mimeType),
50
+ });
51
+ }
52
+ return files;
53
+ }
54
+
55
+ function localBuilderDesignSystemId(builderDesignSystemId: string): string {
56
+ const slug = builderDesignSystemId
57
+ .replace(/[^a-zA-Z0-9_-]+/g, "-")
58
+ .replace(/^-+|-+$/g, "")
59
+ .slice(0, 96);
60
+ return `builder-${slug || "design-system"}`;
61
+ }
62
+
63
+ function builderProxyData({
64
+ builderDesignSystemId,
65
+ jobId,
66
+ builderUrl,
67
+ projectName,
68
+ description,
69
+ }: {
70
+ builderDesignSystemId: string;
71
+ jobId: string;
72
+ builderUrl: string;
73
+ projectName?: string;
74
+ description?: string;
75
+ }) {
76
+ return JSON.stringify({
77
+ source: "builder",
78
+ builderDesignSystemId,
79
+ builderJobId: jobId,
80
+ builderUrl,
81
+ colors: {
82
+ primary: "var(--primary)",
83
+ secondary: "var(--secondary)",
84
+ accent: "var(--accent)",
85
+ background: "var(--background)",
86
+ surface: "var(--card)",
87
+ text: "var(--foreground)",
88
+ textMuted: "var(--muted-foreground)",
89
+ },
90
+ typography: {
91
+ headingFont: "inherit",
92
+ bodyFont: "inherit",
93
+ headingWeight: "700",
94
+ bodyWeight: "400",
95
+ headingSizes: { h1: "48px", h2: "32px", h3: "24px" },
96
+ },
97
+ spacing: { elementGap: "24px", pagePadding: "48px" },
98
+ borders: { radius: "12px", accentWidth: "1px" },
99
+ logos: [],
100
+ notes: [
101
+ "This is a local proxy for a Builder-indexed design system.",
102
+ `Builder design system id: ${builderDesignSystemId}`,
103
+ `Builder indexing job id: ${jobId}`,
104
+ `Builder URL: ${builderUrl}`,
105
+ projectName ? `Requested name: ${projectName}` : "",
106
+ description ? `Context: ${description}` : "",
107
+ "Use Builder as the source of truth for extracted tokens and guidance.",
108
+ ]
109
+ .filter(Boolean)
110
+ .join("\n"),
111
+ });
112
+ }
113
+
114
+ function builderProxyInstructions({
115
+ builderDesignSystemId,
116
+ jobId,
117
+ builderUrl,
118
+ }: {
119
+ builderDesignSystemId: string;
120
+ jobId: string;
121
+ builderUrl: string;
122
+ }) {
123
+ return [
124
+ "This design system is indexed and owned by Builder.",
125
+ `Builder design system id: ${builderDesignSystemId}`,
126
+ `Builder job id: ${jobId}`,
127
+ `Builder URL: ${builderUrl}`,
128
+ "When generating designs, treat Builder as the source of truth for the final extracted tokens, assets, and guidance.",
129
+ ].join("\n");
130
+ }
131
+
132
+ export default defineAction({
133
+ description:
134
+ "Start Builder design-system indexing from a GitHub repository and/or code files. " +
135
+ "Use this instead of local import-code/import-github when the user wants a reusable brand kit or design system. " +
136
+ "Requires Builder.io to be connected; Builder owns the indexed design-system docs, generated guidance, and job state.",
137
+ schema: z.object({
138
+ projectName: z
139
+ .string()
140
+ .optional()
141
+ .describe("Optional Builder project/design-system name"),
142
+ description: z
143
+ .string()
144
+ .optional()
145
+ .describe("Additional brand context or instructions for Builder"),
146
+ githubRepoUrl: z
147
+ .string()
148
+ .optional()
149
+ .describe("GitHub repository URL to index with Builder"),
150
+ connectedProjectId: z
151
+ .string()
152
+ .optional()
153
+ .describe("Optional existing Builder project id to attach indexing to"),
154
+ codeFiles: z
155
+ .array(codeFileSchema)
156
+ .optional()
157
+ .describe("Optional inlined code/design files to upload to Builder"),
158
+ }),
159
+ run: async ({
160
+ projectName,
161
+ description,
162
+ githubRepoUrl,
163
+ connectedProjectId,
164
+ codeFiles,
165
+ }) => {
166
+ const files = makeFiles(codeFiles);
167
+ const result = await startBuilderDesignSystemIndex({
168
+ projectName,
169
+ description,
170
+ githubRepoUrl,
171
+ connectedProjectId,
172
+ files,
173
+ });
174
+ const ownerEmail = getRequestUserEmail();
175
+ if (!ownerEmail) throw new Error("no authenticated user");
176
+
177
+ const db = getDb();
178
+ const now = new Date().toISOString();
179
+ const orgId = getRequestOrgId();
180
+ const baseLocalDesignSystemId = localBuilderDesignSystemId(
181
+ result.designSystemId,
182
+ );
183
+ const title = projectName?.trim() || "Builder indexed design system";
184
+ const localData = builderProxyData({
185
+ builderDesignSystemId: result.designSystemId,
186
+ jobId: result.jobId,
187
+ builderUrl: result.builderUrl,
188
+ projectName,
189
+ description,
190
+ });
191
+ const customInstructions = builderProxyInstructions({
192
+ builderDesignSystemId: result.designSystemId,
193
+ jobId: result.jobId,
194
+ builderUrl: result.builderUrl,
195
+ });
196
+ const [existing] = await db
197
+ .select({
198
+ id: schema.designSystems.id,
199
+ ownerEmail: schema.designSystems.ownerEmail,
200
+ })
201
+ .from(schema.designSystems)
202
+ .where(eq(schema.designSystems.id, baseLocalDesignSystemId))
203
+ .limit(1);
204
+ const localDesignSystemId =
205
+ existing && existing.ownerEmail !== ownerEmail
206
+ ? `${baseLocalDesignSystemId}-${nanoid(8)}`
207
+ : baseLocalDesignSystemId;
208
+ if (existing && existing.ownerEmail === ownerEmail) {
209
+ await db
210
+ .update(schema.designSystems)
211
+ .set({
212
+ title,
213
+ description:
214
+ description ??
215
+ `Builder indexed design system ${result.designSystemId}`,
216
+ data: localData,
217
+ assets: "[]",
218
+ customInstructions,
219
+ updatedAt: now,
220
+ })
221
+ .where(eq(schema.designSystems.id, existing.id));
222
+ } else {
223
+ const [ownedSystem] = await db
224
+ .select({ id: schema.designSystems.id })
225
+ .from(schema.designSystems)
226
+ .where(eq(schema.designSystems.ownerEmail, ownerEmail))
227
+ .limit(1);
228
+ await db.insert(schema.designSystems).values({
229
+ id: localDesignSystemId,
230
+ title,
231
+ description:
232
+ description ??
233
+ `Builder indexed design system ${result.designSystemId}`,
234
+ data: localData,
235
+ assets: "[]",
236
+ customInstructions,
237
+ isDefault: !ownedSystem,
238
+ ownerEmail,
239
+ orgId,
240
+ createdAt: now,
241
+ updatedAt: now,
242
+ });
243
+ }
244
+
245
+ return {
246
+ ...result,
247
+ localDesignSystemId,
248
+ uploadedFileCount: files.length,
249
+ instructions: [
250
+ "Builder design-system indexing has started.",
251
+ `Builder design system: ${result.designSystemId}`,
252
+ `Local selectable design system: ${localDesignSystemId}`,
253
+ `Builder job: ${result.jobId}`,
254
+ `Open: ${result.builderUrl}`,
255
+ "Use the local design system id in Design flows; Builder remains the source of truth for the indexed brand kit.",
256
+ ].join("\n"),
257
+ };
258
+ },
259
+ });
@@ -0,0 +1,95 @@
1
+ import { defineAction } from "@agent-native/core";
2
+ import {
3
+ getRequestOrgId,
4
+ getRequestUserEmail,
5
+ } from "@agent-native/core/server/request-context";
6
+ import { and, desc, eq, isNull } from "drizzle-orm";
7
+ import { z } from "zod";
8
+
9
+ import { getDb, schema } from "../server/db/index.js";
10
+ import type {
11
+ DesignBridgeCapability,
12
+ LocalhostDesignRouteManifest,
13
+ } from "../shared/source-mode.js";
14
+
15
+ function parseJson<T>(value: string, fallback: T): T {
16
+ try {
17
+ return JSON.parse(value) as T;
18
+ } catch {
19
+ return fallback;
20
+ }
21
+ }
22
+
23
+ export default defineAction({
24
+ description:
25
+ "List localhost Design source connections for the current user. Use this before creating localhost artboards or resolving local routes.",
26
+ schema: z.object({
27
+ id: z.string().optional().describe("Optional connection ID filter."),
28
+ status: z
29
+ .enum(["connected", "detected", "manual", "error"])
30
+ .optional()
31
+ .describe("Optional status filter."),
32
+ }),
33
+ readOnly: true,
34
+ http: { method: "GET" },
35
+ run: async ({ id, status }) => {
36
+ const ownerEmail = getRequestUserEmail();
37
+ if (!ownerEmail) throw new Error("no authenticated user");
38
+ const orgId = getRequestOrgId() ?? null;
39
+ const clauses = [
40
+ eq(schema.designLocalhostConnections.ownerEmail, ownerEmail),
41
+ orgId
42
+ ? eq(schema.designLocalhostConnections.orgId, orgId)
43
+ : isNull(schema.designLocalhostConnections.orgId),
44
+ ];
45
+ if (id) clauses.push(eq(schema.designLocalhostConnections.id, id));
46
+ if (status) {
47
+ clauses.push(eq(schema.designLocalhostConnections.status, status));
48
+ }
49
+
50
+ const rows = await getDb()
51
+ .select()
52
+ .from(schema.designLocalhostConnections)
53
+ .where(and(...clauses))
54
+ .orderBy(desc(schema.designLocalhostConnections.updatedAt));
55
+
56
+ const connections = rows.map((row) => {
57
+ const routeManifest = parseJson<LocalhostDesignRouteManifest>(
58
+ row.routeManifest,
59
+ {
60
+ version: 1,
61
+ sourceType: "localhost",
62
+ devServerUrl: row.devServerUrl,
63
+ rootPath: row.rootPath ?? undefined,
64
+ routes: [],
65
+ generatedAt: row.updatedAt ?? new Date(0).toISOString(),
66
+ },
67
+ );
68
+ const capabilities = parseJson<DesignBridgeCapability[]>(
69
+ row.capabilities,
70
+ [],
71
+ );
72
+ return {
73
+ id: row.id,
74
+ sourceType: row.sourceType,
75
+ name: row.name,
76
+ devServerUrl: row.devServerUrl,
77
+ bridgeUrl: row.bridgeUrl ?? null,
78
+ rootPath: row.rootPath ?? null,
79
+ routeManifest,
80
+ routes: routeManifest.routes,
81
+ routeCount: routeManifest.routes.length,
82
+ capabilities,
83
+ status: row.status,
84
+ lastSeenAt: row.lastSeenAt ?? null,
85
+ createdAt: row.createdAt,
86
+ updatedAt: row.updatedAt,
87
+ };
88
+ });
89
+
90
+ return {
91
+ count: connections.length,
92
+ connections,
93
+ };
94
+ },
95
+ });
@@ -6,6 +6,8 @@
6
6
  * Usage:
7
7
  * pnpm action navigate --view=list
8
8
  * pnpm action navigate --view=editor --designId=abc123
9
+ * pnpm action navigate --view=editor --designId=abc123 --editorView=overview
10
+ * pnpm action navigate --view=editor --designId=abc123 --filename=checkout.html
9
11
  * pnpm action navigate --view=design-systems
10
12
  * pnpm action navigate --view=design-systems --designSystemId=abc123
11
13
  * pnpm action navigate --view=templates
@@ -15,6 +17,10 @@
15
17
  * Options:
16
18
  * --view View name (list, editor, design-systems, present, templates, settings)
17
19
  * --designId Design ID (for editor/present views)
20
+ * --editorView Editor mode for designs: single or overview
21
+ * --inspectorTab Inspector tab for designs: design, tweaks, or extensions
22
+ * --fileId Screen/file id to focus in the design editor
23
+ * --filename Screen filename to focus in the design editor
18
24
  * --designSystemId Design system ID (for design-systems view)
19
25
  * --path URL path to navigate to
20
26
  */
@@ -25,7 +31,7 @@ import { z } from "zod";
25
31
 
26
32
  export default defineAction({
27
33
  description:
28
- "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.",
34
+ "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 inspectorTab=extensions to focus the in-editor extension panel.",
29
35
  schema: z.object({
30
36
  view: z
31
37
  .enum([
@@ -40,6 +46,38 @@ export default defineAction({
40
46
  .optional()
41
47
  .describe("View name to navigate to"),
42
48
  designId: z.string().optional().describe("Design ID for editor/present"),
49
+ editorView: z
50
+ .enum(["single", "overview"])
51
+ .optional()
52
+ .describe(
53
+ "Design editor view: overview for the infinite screens canvas, single for a focused screen",
54
+ ),
55
+ viewMode: z
56
+ .enum(["single", "overview"])
57
+ .optional()
58
+ .describe("Alias for editorView"),
59
+ inspectorTab: z
60
+ .enum(["design", "tweaks", "extensions"])
61
+ .optional()
62
+ .describe("Design editor inspector tab to focus"),
63
+ inspector: z
64
+ .enum(["design", "tweaks", "extensions"])
65
+ .optional()
66
+ .describe("Alias for inspectorTab"),
67
+ fileId: z.string().optional().describe("Design file/screen ID to focus"),
68
+ screenId: z.string().optional().describe("Alias for fileId"),
69
+ filename: z
70
+ .string()
71
+ .optional()
72
+ .describe("Design screen filename to focus, such as checkout.html"),
73
+ screen: z
74
+ .string()
75
+ .optional()
76
+ .describe("Screen id, filename, or name to focus"),
77
+ zoom: z
78
+ .number()
79
+ .optional()
80
+ .describe("Optional design canvas zoom percentage"),
43
81
  designSystemId: z
44
82
  .string()
45
83
  .optional()
@@ -51,14 +89,29 @@ export default defineAction({
51
89
  if (!args.view && !args.path) {
52
90
  throw new Error("At least --view or --path is required.");
53
91
  }
54
- const nav: Record<string, string> = {};
92
+ const nav: Record<string, unknown> = {};
55
93
  if (args.view) nav.view = args.view;
56
94
  if (args.designId) nav.designId = args.designId;
95
+ const editorView = args.editorView ?? args.viewMode;
96
+ if (editorView) nav.editorView = editorView;
97
+ const inspectorTab = args.inspectorTab ?? args.inspector;
98
+ if (inspectorTab) nav.inspectorTab = inspectorTab;
99
+ if (args.fileId) nav.fileId = args.fileId;
100
+ if (args.screenId) nav.screenId = args.screenId;
101
+ if (args.filename) nav.filename = args.filename;
102
+ if (args.screen) nav.screen = args.screen;
103
+ if (args.zoom !== undefined) nav.zoom = args.zoom;
57
104
  if (args.designSystemId) nav.designSystemId = args.designSystemId;
58
105
  if (args.path) nav.path = args.path;
59
106
  await writeAppState("navigate", nav);
60
107
  return `Navigating to ${args.view || args.path}${
61
108
  args.designId ? ` (design: ${args.designId})` : ""
109
+ }${editorView ? ` (${editorView} view)` : ""}${
110
+ inspectorTab ? ` (${inspectorTab} inspector)` : ""
111
+ }${
112
+ args.fileId || args.screenId || args.filename || args.screen
113
+ ? ` (screen: ${args.fileId ?? args.screenId ?? args.filename ?? args.screen})`
114
+ : ""
62
115
  }${args.designSystemId ? ` (design system: ${args.designSystemId})` : ""}`;
63
116
  },
64
117
  });
@@ -23,8 +23,15 @@ export default defineAction({
23
23
  .enum(["html", "css", "jsx", "asset"])
24
24
  .optional()
25
25
  .describe("Updated file type"),
26
+ syncCollab: z
27
+ .boolean()
28
+ .optional()
29
+ .default(true)
30
+ .describe(
31
+ "Whether to mirror content updates into the live collaboration document.",
32
+ ),
26
33
  }),
27
- run: async ({ id, content, filename, fileType }) => {
34
+ run: async ({ id, content, filename, fileType, syncCollab }) => {
28
35
  // Path traversal guard on filename
29
36
  if (
30
37
  filename &&
@@ -74,7 +81,7 @@ export default defineAction({
74
81
  .where(eq(schema.designFiles.id, id));
75
82
 
76
83
  // Push content through the collab layer so live editors see the change
77
- if (content !== undefined) {
84
+ if (content !== undefined && syncCollab) {
78
85
  const collabExists = await hasCollabState(id);
79
86
  if (collabExists) {
80
87
  await applyText(id, content, "content", "agent");
@@ -12,11 +12,17 @@ import {
12
12
  readAppState,
13
13
  readAppStateForCurrentTab,
14
14
  } from "@agent-native/core/application-state";
15
+ import { resolveAccess } from "@agent-native/core/sharing";
16
+ import { eq } from "drizzle-orm";
15
17
  import { z } from "zod";
16
18
 
19
+ import { getDb, schema } from "../server/db/index.js";
20
+ import { parseCanvasFrameGeometryById } from "../shared/canvas-frames.js";
21
+ import { designGenerationSessionKey } from "../shared/generation-session.js";
22
+
17
23
  export default defineAction({
18
24
  description:
19
- "See what the user is currently looking at on screen. Returns the current navigation state including which design is open, which view they are on (list, editor, design-systems, present, templates, settings), plus any pending question overlay or variant grid. Always call this first before taking any action.",
25
+ "See what the user is currently looking at on screen. Returns the current navigation state including which design is open, which view they are on (list, editor, design-systems, present, templates, settings), active/focused design screen, selected element, active inspector tab (design, tweaks, or extensions), overview canvas state, plus any pending question overlay or variant grid. Always call this first before taking any action.",
20
26
  schema: z.object({}),
21
27
  http: false,
22
28
  run: async () => {
@@ -35,10 +41,68 @@ export default defineAction({
35
41
  (designId
36
42
  ? await readAppState(`show-questions:${designId}`)
37
43
  : undefined) ?? (await readAppState("show-questions"));
44
+ const generationSession = designId
45
+ ? await readAppState(designGenerationSessionKey(designId))
46
+ : undefined;
38
47
 
39
48
  const screen: Record<string, unknown> = {};
40
49
  if (navigation) screen.navigation = navigation;
41
50
  if (designSelection) screen.designSelection = designSelection;
51
+ if (designId) {
52
+ const access = await resolveAccess("design", designId).catch(() => null);
53
+ if (access) {
54
+ const db = getDb();
55
+ const files = await db
56
+ .select({
57
+ id: schema.designFiles.id,
58
+ filename: schema.designFiles.filename,
59
+ fileType: schema.designFiles.fileType,
60
+ updatedAt: schema.designFiles.updatedAt,
61
+ })
62
+ .from(schema.designFiles)
63
+ .where(eq(schema.designFiles.designId, designId));
64
+ let data: Record<string, unknown> = {};
65
+ const rawData = (access.resource as { data?: unknown }).data;
66
+ if (typeof rawData === "string") {
67
+ try {
68
+ const parsed = JSON.parse(rawData);
69
+ if (
70
+ parsed &&
71
+ typeof parsed === "object" &&
72
+ !Array.isArray(parsed)
73
+ ) {
74
+ data = parsed as Record<string, unknown>;
75
+ }
76
+ } catch {
77
+ data = {};
78
+ }
79
+ }
80
+ const activeFileId =
81
+ designSelection &&
82
+ typeof designSelection === "object" &&
83
+ typeof (designSelection as { activeFileId?: unknown })
84
+ .activeFileId === "string"
85
+ ? (designSelection as { activeFileId: string }).activeFileId
86
+ : undefined;
87
+ const activeFilename =
88
+ designSelection &&
89
+ typeof designSelection === "object" &&
90
+ typeof (designSelection as { activeFilename?: unknown })
91
+ .activeFilename === "string"
92
+ ? (designSelection as { activeFilename: string }).activeFilename
93
+ : undefined;
94
+ screen.design = {
95
+ id: designId,
96
+ title: (access.resource as { title?: unknown }).title ?? null,
97
+ screens: files,
98
+ activeScreen:
99
+ files.find((file) => file.id === activeFileId) ??
100
+ files.find((file) => file.filename === activeFilename) ??
101
+ null,
102
+ canvasFrames: parseCanvasFrameGeometryById(data.canvasFrames),
103
+ };
104
+ }
105
+ }
42
106
  if (showQuestions) {
43
107
  screen.pendingQuestions = showQuestions;
44
108
  screen.note =
@@ -49,6 +113,9 @@ export default defineAction({
49
113
  screen.variantsNote =
50
114
  'A variant picker is open. Wait for the user to choose a direction before generating further. In an inline MCP app their pick returns to you automatically; if it opened as a browser tab (a CLI or code editor), they paste an auto-copied summary or just tell you which one (e.g. "use variant A"). Once you know the choice, read the saved index.html with get-design-snapshot. Do not call generate-design while this picker is open.';
51
115
  }
116
+ if (generationSession) {
117
+ screen.generationSession = generationSession;
118
+ }
52
119
 
53
120
  if (Object.keys(screen).length === 0) {
54
121
  return "No application state found. Is the app running?";
@@ -29,6 +29,11 @@
29
29
  "id": "design-exploration",
30
30
  "action": "present-design-variants",
31
31
  "path": "/design"
32
+ },
33
+ {
34
+ "id": "visual-edit",
35
+ "action": "add-localhost-screens",
36
+ "path": "/design"
32
37
  }
33
38
  ],
34
39
  "skills": [
@@ -36,6 +41,11 @@
36
41
  "path": ".agents/skills/design-generation",
37
42
  "visibility": "both",
38
43
  "exportAs": "design-exploration"
44
+ },
45
+ {
46
+ "path": ".agents/skills/visual-edit",
47
+ "visibility": "both",
48
+ "exportAs": "visual-edit"
39
49
  }
40
50
  ],
41
51
  "hostAdapters": [