@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", slidePadding: "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 slides, 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 slide 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 Slides flows; Builder remains the source of truth for the indexed brand kit.",
256
+ ].join("\n"),
257
+ };
258
+ },
259
+ });
@@ -4,7 +4,6 @@ import {
4
4
  sendToAgentChat,
5
5
  openAgentSidebar,
6
6
  appApiPath,
7
- useFormatters,
8
7
  useT,
9
8
  } from "@agent-native/core/client";
10
9
  import {
@@ -18,6 +17,7 @@ import {
18
17
  IconFileDescription,
19
18
  IconPhoto,
20
19
  IconCheck,
20
+ IconExternalLink,
21
21
  } from "@tabler/icons-react";
22
22
  import { useState, useCallback, useEffect, useRef, useMemo } from "react";
23
23
 
@@ -108,14 +108,11 @@ export function DesignSystemSetup({
108
108
  const [figParsing, setFigParsing] = useState(false);
109
109
  const [figResult, setFigResult] = useState<FigImportResult | null>(null);
110
110
  const [figError, setFigError] = useState<string | null>(null);
111
- const [figTitle, setFigTitle] = useState("");
112
- const [figCreating, setFigCreating] = useState(false);
113
111
 
114
112
  const codeInputRef = useRef<HTMLInputElement>(null);
115
113
  const docInputRef = useRef<HTMLInputElement>(null);
116
114
  const imageInputRef = useRef<HTMLInputElement>(null);
117
115
  const figInputRef = useRef<HTMLInputElement>(null);
118
- const createSystemMutation = useActionMutation("create-design-system");
119
116
  const updateSystemMutation = useActionMutation("update-design-system");
120
117
 
121
118
  const { data: existingDs } = useActionQuery<{
@@ -164,8 +161,6 @@ export function DesignSystemSetup({
164
161
  setFigParsing(false);
165
162
  setFigResult(null);
166
163
  setFigError(null);
167
- setFigTitle("");
168
- setFigCreating(false);
169
164
  }
170
165
  }, [open]);
171
166
 
@@ -273,9 +268,6 @@ export function DesignSystemSetup({
273
268
  });
274
269
  const parsed = await readFigImportResponse(res);
275
270
  setFigResult(parsed);
276
- setFigTitle(
277
- parsed.suggestedTitle || t("designSystemSetup.importedBrand"),
278
- );
279
271
  } catch (err) {
280
272
  setFigError(
281
273
  err instanceof Error
@@ -286,37 +278,9 @@ export function DesignSystemSetup({
286
278
  setFigParsing(false);
287
279
  }
288
280
  },
289
- [],
281
+ [t],
290
282
  );
291
283
 
292
- const handleCreateFromFig = useCallback(async () => {
293
- if (!figResult) return;
294
- const title =
295
- figTitle.trim() ||
296
- figResult.suggestedTitle ||
297
- t("designSystemSetup.importedBrand");
298
- setFigCreating(true);
299
- try {
300
- await createSystemMutation.mutateAsync({
301
- title,
302
- data: JSON.stringify(figResult.data),
303
- customInstructions: figResult.customInstructions || "",
304
- } as any);
305
- toast({ title: t("designSystemSetup.figmaCreated") });
306
- onComplete();
307
- } catch (err) {
308
- setFigCreating(false);
309
- toast({
310
- title: t("designSystemSetup.createFailed"),
311
- description:
312
- err instanceof Error
313
- ? err.message
314
- : t("designSystemSetup.genericError"),
315
- variant: "destructive",
316
- });
317
- }
318
- }, [figResult, figTitle, createSystemMutation, onComplete, t]);
319
-
320
284
  const handleEditSave = async () => {
321
285
  if (!editingId) return;
322
286
  setGenerating(true);
@@ -371,7 +335,7 @@ export function DesignSystemSetup({
371
335
 
372
336
  if (githubLinks.length > 0) {
373
337
  parts.push(
374
- `\n## GitHub Repositories\nExtract design tokens from code. Call \`import-github\` for each:\n${githubLinks.map((l) => `- ${l.url}`).join("\n")}`,
338
+ `\n## GitHub Repositories\nStart Builder design-system indexing for each repository with \`index-design-system-with-builder\`:\n${githubLinks.map((l) => `- ${l.url}`).join("\n")}\n\nBuilder is the source of truth for repo/code design-system indexing. The action also creates a local selectable proxy design system for Slides flows. If Builder is not connected, stop and tell me to connect Builder from Settings.`,
375
339
  );
376
340
  }
377
341
 
@@ -379,7 +343,7 @@ export function DesignSystemSetup({
379
343
  const withContent = codeFiles.filter((f) => f.textContent);
380
344
  if (withContent.length > 0) {
381
345
  parts.push(
382
- `\n## Code Files (${withContent.length} files)\nCall \`import-code\` with these files:`,
346
+ `\n## Code Files (${withContent.length} files)\nStart Builder design-system indexing with \`index-design-system-with-builder\` using these files:`,
383
347
  );
384
348
  for (const f of withContent) {
385
349
  parts.push(
@@ -430,12 +394,12 @@ export function DesignSystemSetup({
430
394
 
431
395
  if (customInstructions.trim()) {
432
396
  parts.push(
433
- `\n## Custom Instructions (durable — store on the design system)\nWhen you call \`create-design-system\`, pass these verbatim as the \`customInstructions\` argument. They will be re-applied every time the design system is used to generate slides:\n\n${customInstructions.trim()}`,
397
+ `\n## Custom Instructions (durable — store on the design system)\nIf you create a local design system from non-Builder sources, pass these verbatim as the \`customInstructions\` argument. They will be re-applied every time the design system is used to generate slides:\n\n${customInstructions.trim()}`,
434
398
  );
435
399
  }
436
400
 
437
401
  parts.push(
438
- `\n---\nAfter processing all sources, call \`create-design-system\` with the combined tokens${
402
+ `\n---\nAfter processing all sources, if you started Builder design-system indexing, report the Builder job/design-system URL plus the local selectable design-system id returned by \`index-design-system-with-builder\`. Do not call \`create-design-system\` again for those Builder-indexed sources. If you processed non-Builder sources into concrete tokens, call \`create-design-system\` with the combined tokens${
439
403
  customInstructions.trim()
440
404
  ? " AND the verbatim --customInstructions string from above"
441
405
  : ""
@@ -543,14 +507,9 @@ export function DesignSystemSetup({
543
507
  ) : (
544
508
  <FigImportPreview
545
509
  result={figResult}
546
- title={figTitle}
547
- onTitleChange={setFigTitle}
548
- creating={figCreating}
549
- onCreate={handleCreateFromFig}
550
510
  onReset={() => {
551
511
  setFigResult(null);
552
512
  setFigError(null);
553
- setFigTitle("");
554
513
  }}
555
514
  />
556
515
  )}
@@ -885,148 +844,57 @@ function TagList({
885
844
 
886
845
  function FigImportPreview({
887
846
  result,
888
- title,
889
- onTitleChange,
890
- creating,
891
- onCreate,
892
847
  onReset,
893
848
  }: {
894
849
  result: FigImportResult;
895
- title: string;
896
- onTitleChange: (value: string) => void;
897
- creating: boolean;
898
- onCreate: () => void;
899
850
  onReset: () => void;
900
851
  }) {
901
852
  const t = useT();
902
- const { formatNumber } = useFormatters();
903
- const colors = result.data.colors;
904
- const colorEntries = (
905
- [
906
- [t("designSystemSetup.colorAccent"), "accent"],
907
- [t("designSystemSetup.colorPrimary"), "primary"],
908
- [t("designSystemSetup.colorSecondary"), "secondary"],
909
- [t("designSystemSetup.colorBackground"), "background"],
910
- [t("designSystemSetup.colorText"), "text"],
911
- ] as const
912
- ).filter(([, key]) => colors[key]);
913
- const typography = result.data.typography;
914
- const gradients = result.preview.gradients ?? [];
915
-
916
853
  return (
917
854
  <div className="space-y-4 rounded-lg border border-border bg-accent/40 p-4">
918
855
  <div className="flex items-start gap-3">
919
- {result.preview.thumbnailDataUrl ? (
920
- <img
921
- src={result.preview.thumbnailDataUrl}
922
- alt={t("designSystemSetup.figmaThumbnailAlt")}
923
- className="h-16 w-24 shrink-0 rounded-md border border-border object-cover"
924
- />
925
- ) : null}
856
+ <div className="flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-[#609FF8]/10">
857
+ <IconBrandFigma className="h-5 w-5 text-[#609FF8]" />
858
+ </div>
926
859
  <div className="min-w-0 flex-1 space-y-1.5">
927
- <Label className="text-xs text-muted-foreground">
928
- {t("designSystemSetup.designSystemName")}
929
- </Label>
930
- <Input
931
- value={title}
932
- onChange={(event) => onTitleChange(event.target.value)}
933
- className="bg-card border-border text-foreground"
934
- placeholder={t("designSystemSetup.brandNamePlaceholder")}
935
- />
936
- <p className="text-[11px] text-muted-foreground">
937
- {t("designSystemSetup.figPreviewStats", {
938
- nodes: t("designSystemSetup.nodeCount", {
939
- count: result.preview.nodeCount,
940
- formattedCount: formatNumber(result.preview.nodeCount),
941
- }),
942
- gradients: t("designSystemSetup.gradientCount", {
943
- count: gradients.length,
944
- formattedCount: formatNumber(gradients.length),
945
- }),
946
- images: t("designSystemSetup.imageCount", {
947
- count: result.preview.imageCount,
948
- formattedCount: formatNumber(result.preview.imageCount),
949
- }),
860
+ <h4 className="text-sm font-medium text-foreground">
861
+ {t("designSystemSetup.builderIndexingStarted")}
862
+ </h4>
863
+ <p className="text-xs text-muted-foreground">
864
+ {t("designSystemSetup.builderIndexingDescription", {
865
+ title:
866
+ result.suggestedTitle || t("designSystemSetup.importedBrand"),
950
867
  })}
951
868
  </p>
952
869
  </div>
953
870
  </div>
954
871
 
955
- {colorEntries.length > 0 && (
956
- <div className="flex flex-wrap gap-3">
957
- {colorEntries.map(([label, key]) => (
958
- <div key={key} className="flex items-center gap-2">
959
- <div
960
- className="h-7 w-7 rounded-md border border-border"
961
- style={{ backgroundColor: colors[key] }}
962
- />
963
- <div className="text-xs">
964
- <div className="text-foreground/80">{label}</div>
965
- <div className="font-mono text-[10px] text-muted-foreground">
966
- {colors[key]}
967
- </div>
968
- </div>
969
- </div>
970
- ))}
971
- </div>
972
- )}
973
-
974
- {gradients.length > 0 && (
975
- <div className="flex flex-wrap gap-2">
976
- {gradients.slice(0, 4).map((gradient, index) => (
977
- <div
978
- key={index}
979
- className="h-8 w-24 rounded-md border border-border"
980
- style={{ backgroundImage: gradient }}
981
- title={gradient}
982
- />
983
- ))}
984
- </div>
985
- )}
986
-
987
- {(typography.headingFont || typography.bodyFont) && (
988
- <div className="text-xs text-foreground/80">
989
- {typography.headingFont && (
990
- <span>
991
- <span className="text-muted-foreground">
992
- {t("designSystemSetup.headingsLabel")}
993
- </span>{" "}
994
- {typography.headingFont}
995
- {typography.headingWeight ? ` ${typography.headingWeight}` : ""}
996
- </span>
997
- )}
998
- {typography.bodyFont && (
999
- <span className="ml-3">
1000
- <span className="text-muted-foreground">
1001
- {t("designSystemSetup.bodyLabel")}
1002
- </span>{" "}
1003
- {typography.bodyFont}
1004
- </span>
1005
- )}
1006
- </div>
1007
- )}
872
+ <dl className="grid grid-cols-[112px_minmax(0,1fr)] gap-x-3 gap-y-2 rounded-md border border-border bg-card/50 p-3 text-xs">
873
+ <dt className="text-muted-foreground">
874
+ {t("designSystemSetup.builderDesignSystemId")}
875
+ </dt>
876
+ <dd className="truncate font-mono text-foreground/80">
877
+ {result.designSystemId}
878
+ </dd>
879
+ <dt className="text-muted-foreground">
880
+ {t("designSystemSetup.builderJobId")}
881
+ </dt>
882
+ <dd className="truncate font-mono text-foreground/80">
883
+ {result.jobId}
884
+ </dd>
885
+ </dl>
1008
886
 
1009
887
  <div className="flex flex-wrap items-center gap-2 border-t border-border pt-3">
1010
- <Button
1011
- size="sm"
1012
- onClick={onCreate}
1013
- disabled={creating || !title.trim()}
1014
- className="cursor-pointer"
1015
- >
1016
- {creating ? (
1017
- <>
1018
- <IconLoader2 className="w-3.5 h-3.5 animate-spin" />
1019
- {t("designSystemSetup.creating")}
1020
- </>
1021
- ) : (
1022
- t("designSystemSetup.createDesignSystem")
1023
- )}
888
+ <Button size="sm" asChild className="cursor-pointer">
889
+ <a href={result.builderUrl} target="_blank" rel="noreferrer">
890
+ <IconExternalLink className="w-3.5 h-3.5" />
891
+ {t("designSystemSetup.openInBuilder")}
892
+ </a>
1024
893
  </Button>
1025
894
  <Button
1026
895
  size="sm"
1027
896
  variant="ghost"
1028
897
  onClick={onReset}
1029
- disabled={creating}
1030
898
  className="cursor-pointer"
1031
899
  >
1032
900
  {t("designSystemSetup.chooseAnotherFile")}
@@ -1,18 +1,13 @@
1
- import type { DesignSystemData } from "../../../shared/api";
2
-
3
1
  export interface FigImportResult {
4
2
  ok: boolean;
3
+ source: "builder";
5
4
  suggestedTitle: string;
6
- data: DesignSystemData;
7
- customInstructions: string;
8
- preview: {
9
- gradients: string[];
10
- palette: { hex: string; name?: string; count: number }[];
11
- namedColors: Record<string, string>;
12
- thumbnailDataUrl: string | null;
13
- nodeCount: number;
14
- imageCount: number;
15
- };
5
+ projectId: string;
6
+ jobId: string;
7
+ designSystemId: string;
8
+ builderUrl: string;
9
+ status: "in-progress";
10
+ builderConnectUrl?: string;
16
11
  }
17
12
 
18
13
  export const MAX_FIG_UPLOAD_BYTES = 200 * 1024 * 1024;
@@ -51,7 +46,8 @@ export async function readFigImportResponse(
51
46
  }
52
47
 
53
48
  if (json && typeof json === "object" && "error" in json) {
54
- const error = (json as { error?: unknown }).error;
49
+ const error = (json as { error?: unknown; builderConnectUrl?: unknown })
50
+ .error;
55
51
  throw new Error(
56
52
  typeof error === "string"
57
53
  ? error
@@ -50,7 +50,7 @@ export function Sidebar({ collapsed, onToggleCollapsed }: SidebarProps) {
50
50
 
51
51
  if (collapsed) {
52
52
  return (
53
- <aside className="flex h-full w-12 shrink-0 flex-col items-center gap-1 overflow-hidden border-e border-border bg-sidebar py-2 text-sidebar-foreground">
53
+ <aside className="flex h-full w-12 shrink-0 flex-col items-center gap-1 overflow-hidden border-e border-border bg-sidebar py-2 text-sidebar-foreground transition-[width] duration-200 ease-out">
54
54
  {onToggleCollapsed && (
55
55
  <Tooltip delayDuration={0}>
56
56
  <TooltipTrigger asChild>
@@ -97,7 +97,7 @@ export function Sidebar({ collapsed, onToggleCollapsed }: SidebarProps) {
97
97
  }
98
98
 
99
99
  return (
100
- <aside className="flex h-full w-56 min-w-0 shrink-0 flex-col overflow-hidden border-e border-border bg-sidebar text-sidebar-foreground">
100
+ <aside className="flex h-full w-56 min-w-0 shrink-0 flex-col overflow-hidden border-e border-border bg-sidebar text-sidebar-foreground transition-[width] duration-200 ease-out">
101
101
  <div className="flex h-12 shrink-0 items-center justify-between border-b border-border px-4">
102
102
  <div className="flex items-center gap-2">
103
103
  <img
@@ -156,15 +156,15 @@ export function Sidebar({ collapsed, onToggleCollapsed }: SidebarProps) {
156
156
  </nav>
157
157
 
158
158
  <div className="mt-auto shrink-0">
159
- <div className="border-t border-border px-2 py-1">
159
+ <div className="px-2 py-1">
160
160
  <ExtensionsSidebarSection />
161
161
  </div>
162
162
 
163
- <div className="border-t border-border px-3 py-2">
163
+ <div className="px-3 py-2">
164
164
  <OrgSwitcher />
165
165
  </div>
166
166
 
167
- <div className="border-t border-border px-3 py-2">
167
+ <div className="px-3 py-2">
168
168
  <DevDatabaseLink />
169
169
  <FeedbackButton />
170
170
  </div>
@@ -1091,7 +1091,7 @@ export function DeckProvider({ children }: { children: ReactNode }) {
1091
1091
  ...updates,
1092
1092
  };
1093
1093
  void _slides;
1094
- void _ca;
1094
+ _ca;
1095
1095
  if (Object.keys(persistableUpdates).length > 0) {
1096
1096
  enqueueDeckOp(id, {
1097
1097
  op: "patch-deck-fields",