@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
@@ -41,6 +41,10 @@ export interface CapturedTranscript {
41
41
  export interface TranscriptionCapture {
42
42
  stop(): Promise<CapturedTranscript>;
43
43
  cancel(): Promise<void>;
44
+ /** Suspend the audio engine without discarding the captured transcript. */
45
+ pause(): Promise<void>;
46
+ /** Restart the audio engine after a `pause()`. */
47
+ resume(): Promise<void>;
44
48
  }
45
49
 
46
50
  interface SpeechRecognitionResultLike {
@@ -154,6 +158,7 @@ async function startBrowserTranscriptionCapture(): Promise<TranscriptionCapture
154
158
  const recognition = new Ctor();
155
159
  let disposed = false;
156
160
  let stopped = false;
161
+ let paused = false;
157
162
  const transcriptBuffer = createWebSpeechTranscriptBuffer();
158
163
  let stopResolver: ((value: CapturedTranscript) => void) | null = null;
159
164
  let settleTimer: ReturnType<typeof window.setTimeout> | null = null;
@@ -195,11 +200,13 @@ async function startBrowserTranscriptionCapture(): Promise<TranscriptionCapture
195
200
 
196
201
  recognition.onend = () => {
197
202
  if (disposed) return;
198
- transcriptBuffer.commitSession({ preserveInterim: stopped });
203
+ transcriptBuffer.commitSession({ preserveInterim: stopped || paused });
199
204
  if (stopped) {
200
205
  settleStop();
201
206
  return;
202
207
  }
208
+ // While paused, keep the committed transcript but don't restart the engine.
209
+ if (paused) return;
203
210
  try {
204
211
  recognition.start();
205
212
  } catch (err) {
@@ -245,6 +252,29 @@ async function startBrowserTranscriptionCapture(): Promise<TranscriptionCapture
245
252
  // ignore
246
253
  }
247
254
  },
255
+ async pause() {
256
+ if (disposed || stopped || paused) return;
257
+ paused = true;
258
+ console.log("[clips-recorder] transcription paused (web-speech)");
259
+ try {
260
+ recognition.stop();
261
+ } catch {
262
+ // ignore
263
+ }
264
+ },
265
+ async resume() {
266
+ if (disposed || stopped || !paused) return;
267
+ paused = false;
268
+ console.log("[clips-recorder] transcription resumed (web-speech)");
269
+ try {
270
+ recognition.start();
271
+ } catch (err) {
272
+ console.warn(
273
+ "[clips-recorder] Web Speech transcription resume failed:",
274
+ err,
275
+ );
276
+ }
277
+ },
248
278
  };
249
279
  }
250
280
 
@@ -260,6 +290,13 @@ export async function startTranscriptionCapture(
260
290
  const lines: string[] = [];
261
291
  const segments: SourcedTranscriptSegment[] = [];
262
292
  let disposed = false;
293
+ let paused = false;
294
+ let desiredPaused = false;
295
+ let transitioning = false;
296
+ // When a pause stops the engine, Whisper still flushes trailing finals
297
+ // asynchronously. Track when those are expected to have landed so a stop
298
+ // soon after a pause waits for them instead of dropping the last words.
299
+ let pauseFinalsSettleUntil = 0;
263
300
  const unlistens: UnlistenFn[] = [];
264
301
 
265
302
  const cleanup = () => {
@@ -299,8 +336,59 @@ export async function startTranscriptionCapture(
299
336
  : null;
300
337
  }
301
338
 
339
+ // Pause/resume run fire-and-forget from the recorder, so a quick
340
+ // pause→resume can arrive while a transition is still awaiting the engine.
341
+ // Track the desired state and re-apply once the in-flight transition settles
342
+ // so the last request always wins (instead of being dropped).
343
+ const applyAudioState = async () => {
344
+ if (transitioning || disposed || desiredPaused === paused) return;
345
+ transitioning = true;
346
+ try {
347
+ if (desiredPaused) {
348
+ await stopTranscriptionEngine(engine);
349
+ paused = true;
350
+ pauseFinalsSettleUntil = Date.now() + WHISPER_STOP_SETTLE_MS;
351
+ console.log(`[clips-recorder] transcription paused (${engine})`);
352
+ } else {
353
+ engine = await startTranscriptionEngine({ mic, captureSystem });
354
+ // stop()/cancel() can run during the await above; if it did, the new
355
+ // engine would leak (mic/system capture stays live). Tear it down.
356
+ if (disposed) {
357
+ await stopTranscriptionEngine(engine).catch(() => {});
358
+ return;
359
+ }
360
+ paused = false;
361
+ console.log(`[clips-recorder] transcription resumed (${engine})`);
362
+ }
363
+ } catch (err) {
364
+ // Transition failed. Keep `desiredPaused` as the still-unmet intent (don't
365
+ // reset it) so the next pause/resume toggle retries and converges, and
366
+ // return early so we don't busy-loop re-applying a persistently failing
367
+ // transition. `paused` still reflects the real engine state.
368
+ console.warn(
369
+ `[clips-recorder] transcription ${desiredPaused ? "pause" : "resume"} failed; engine still ${paused ? "paused" : "live"}:`,
370
+ err,
371
+ );
372
+ // `finally` resets `transitioning`; returning skips the auto re-apply.
373
+ return;
374
+ } finally {
375
+ transitioning = false;
376
+ }
377
+ // Re-apply in case the desired state changed mid-transition.
378
+ void applyAudioState();
379
+ };
380
+
302
381
  return {
303
382
  async stop() {
383
+ // Already paused: the engine is stopped, but the pause-time flush may
384
+ // still be in flight. Wait out any remaining settle window so trailing
385
+ // finals land before we drop the listener.
386
+ if (paused) {
387
+ const remaining = pauseFinalsSettleUntil - Date.now();
388
+ if (remaining > 0) await wait(remaining);
389
+ cleanup();
390
+ return captured();
391
+ }
304
392
  try {
305
393
  await stopTranscriptionEngine(engine);
306
394
  } catch (err) {
@@ -314,12 +402,24 @@ export async function startTranscriptionCapture(
314
402
  return captured();
315
403
  },
316
404
  async cancel() {
317
- try {
318
- await stopTranscriptionEngine(engine);
319
- } catch {
320
- // ignore
405
+ if (!paused) {
406
+ try {
407
+ await stopTranscriptionEngine(engine);
408
+ } catch {
409
+ // ignore
410
+ }
321
411
  }
322
412
  cleanup();
323
413
  },
414
+ async pause() {
415
+ if (disposed) return;
416
+ desiredPaused = true;
417
+ await applyAudioState();
418
+ },
419
+ async resume() {
420
+ if (disposed) return;
421
+ desiredPaused = false;
422
+ await applyAudioState();
423
+ },
324
424
  };
325
425
  }
@@ -1,3 +1,4 @@
1
+ import type { VoiceContextPack } from "@agent-native/core/voice";
1
2
  import { invoke } from "@tauri-apps/api/core";
2
3
  import { emit, listen } from "@tauri-apps/api/event";
3
4
 
@@ -5,6 +6,7 @@ import { applyBacktrack } from "./backtrack";
5
6
  import {
6
7
  configureVocabularyClient,
7
8
  loadVocabulary,
9
+ loadVocabularyEntries,
8
10
  recordPasteForLearn,
9
11
  } from "./personal-vocabulary";
10
12
  import {
@@ -312,6 +314,7 @@ async function transcribe(
312
314
  providerPref: ServerVoiceProvider,
313
315
  controller: AbortController,
314
316
  instructions?: string,
317
+ contextPack?: VoiceContextPack,
315
318
  ): Promise<string> {
316
319
  const audioBlob = new Blob(chunks, { type: mimeType });
317
320
  const form = new FormData();
@@ -329,6 +332,7 @@ async function transcribe(
329
332
  if (trimmedInstructions) {
330
333
  form.append("instructions", trimmedInstructions);
331
334
  }
335
+ appendVoiceContext(form, contextPack);
332
336
  // Aggressive timeout — short clips should transcribe in well under
333
337
  // 2 seconds with Gemini Flash Lite or Whisper. If the server hasn't
334
338
  // come back in 8s it's hanging; abort and let the bar dismiss with an
@@ -367,6 +371,7 @@ async function cleanupTranscript(
367
371
  providerPref: ServerVoiceProvider,
368
372
  controller: AbortController,
369
373
  instructions?: string,
374
+ contextPack?: VoiceContextPack,
370
375
  ): Promise<string> {
371
376
  const form = new FormData();
372
377
  form.append("text", text);
@@ -375,6 +380,7 @@ async function cleanupTranscript(
375
380
  if (trimmedInstructions) {
376
381
  form.append("instructions", trimmedInstructions);
377
382
  }
383
+ appendVoiceContext(form, contextPack);
378
384
 
379
385
  const timeout = window.setTimeout(() => controller.abort(), 8_000);
380
386
  try {
@@ -400,6 +406,18 @@ async function cleanupTranscript(
400
406
  }
401
407
  }
402
408
 
409
+ function appendVoiceContext(
410
+ form: FormData,
411
+ contextPack: VoiceContextPack | undefined,
412
+ ): void {
413
+ if (!contextPack) return;
414
+ try {
415
+ form.append("voiceContext", JSON.stringify(contextPack));
416
+ } catch {
417
+ /* best effort */
418
+ }
419
+ }
420
+
403
421
  export function installDesktopVoiceDictation(
404
422
  options: DesktopVoiceDictationOptions,
405
423
  ): () => void {
@@ -640,6 +658,7 @@ export function installDesktopVoiceDictation(
640
658
  const controller = new AbortController();
641
659
  target.transcribeAbort = controller;
642
660
  try {
661
+ const contextPack = await buildDesktopVoiceContextPack();
643
662
  text =
644
663
  (await cleanupTranscript(
645
664
  serverUrl,
@@ -647,6 +666,7 @@ export function installDesktopVoiceDictation(
647
666
  target.cleanupProvider,
648
667
  controller,
649
668
  instructions,
669
+ contextPack,
650
670
  )) || original;
651
671
  } catch (err) {
652
672
  if ((err as { name?: string })?.name !== "AbortError") {
@@ -709,6 +729,42 @@ export function installDesktopVoiceDictation(
709
729
  micDeviceLabel: micDeviceLabel || null,
710
730
  });
711
731
 
732
+ const buildDesktopVoiceContextPack = async (): Promise<
733
+ VoiceContextPack | undefined
734
+ > => {
735
+ const vocabulary = await loadVocabularyEntries().catch(() => []);
736
+ const terms = vocabulary.map((entry) => ({
737
+ term: entry.term,
738
+ replacement: entry.replacement,
739
+ confidence: entry.confidence,
740
+ source: "learned-correction",
741
+ scope: "user",
742
+ }));
743
+ const snippets: NonNullable<VoiceContextPack["snippets"]> = [
744
+ { label: "Target surface", value: "Desktop dictation paste" },
745
+ ];
746
+ if (micDeviceLabel) {
747
+ snippets.push({ label: "Microphone", value: micDeviceLabel });
748
+ }
749
+ if (instructions.trim()) {
750
+ snippets.push({
751
+ label: "Saved voice instructions",
752
+ value: instructions.trim().slice(0, 1200),
753
+ });
754
+ }
755
+ return {
756
+ surface: "clips-desktop",
757
+ mode: "dictation",
758
+ snippets,
759
+ terms,
760
+ metadata: {
761
+ provider,
762
+ locale: navigator.language || "en-US",
763
+ micDeviceLabel: micDeviceLabel || null,
764
+ },
765
+ };
766
+ };
767
+
712
768
  /**
713
769
  * Server-path: capture audio with MediaRecorder, POST it to the
714
770
  * transcribe-voice endpoint on Fn-up, paste the response text. The
@@ -790,6 +846,7 @@ export function installDesktopVoiceDictation(
790
846
  const controller = new AbortController();
791
847
  next.transcribeAbort = controller;
792
848
  try {
849
+ const contextPack = await buildDesktopVoiceContextPack();
793
850
  const text = await transcribe(
794
851
  serverUrl,
795
852
  next.chunks,
@@ -797,6 +854,7 @@ export function installDesktopVoiceDictation(
797
854
  providerPref,
798
855
  controller,
799
856
  instructions,
857
+ contextPack,
800
858
  );
801
859
  if (next.cancelled) {
802
860
  cleanup(next);
@@ -920,7 +978,8 @@ export function installDesktopVoiceDictation(
920
978
  // metadata to `native_speech_start` without also carrying vocabulary.
921
979
  // Best-effort — if the load failed we just stage an empty list and
922
980
  // the recognizer behaves as before.
923
- const contextualStrings = await loadVocabulary().catch(() => []);
981
+ const vocabularyEntries = await loadVocabularyEntries().catch(() => []);
982
+ const contextualStrings = vocabularyEntries.map((v) => v.replacement);
924
983
  await invoke("native_speech_set_vocabulary", {
925
984
  strings: contextualStrings,
926
985
  }).catch(() => {});
@@ -52,7 +52,7 @@ function imageAltCandidates({
52
52
  const candidates: ImageAltCandidate[] = [];
53
53
 
54
54
  const markdownImagePattern = new RegExp(
55
- `!\\[[^\\]]*\\]\\((${escapedUrl})(\\s+\"[^\"]*\")?\\)`,
55
+ `!\\[[^\\]]*\\]\\((${escapedUrl})(\\s+"[^"]*")?\\)`,
56
56
  "g",
57
57
  );
58
58
  for (const match of content.matchAll(markdownImagePattern)) {
@@ -7824,7 +7824,7 @@ function DatabaseTimelineView({
7824
7824
  <div
7825
7825
  key={`${dateKey}-header`}
7826
7826
  className={cn(
7827
- "sticky top-0 z-10 grid gap-0.5 border-r border-b border-border bg-background/95 px-2 py-2 backdrop-blur last:border-r-0",
7827
+ "sticky top-0 z-10 grid gap-0.5 border-r border-b border-border bg-background px-2 py-2 last:border-r-0",
7828
7828
  !inMonth && "bg-muted/70",
7829
7829
  )}
7830
7830
  style={{ gridColumn: index + 1, gridRow: 1 }}
@@ -7767,7 +7767,7 @@ function DatabaseTimelineView({
7767
7767
  <div
7768
7768
  key={`${dateKey}-header`}
7769
7769
  className={cn(
7770
- "sticky top-0 z-10 grid gap-0.5 border-r border-b border-border bg-background/95 px-2 py-2 backdrop-blur last:border-r-0",
7770
+ "sticky top-0 z-10 grid gap-0.5 border-r border-b border-border bg-background px-2 py-2 last:border-r-0",
7771
7771
  !inMonth && "bg-muted/70",
7772
7772
  )}
7773
7773
  style={{ gridColumn: index + 1, gridRow: 1 }}
@@ -701,7 +701,7 @@ export function DocumentSidebar({
701
701
 
702
702
  if (collapsed) {
703
703
  return (
704
- <div className="flex flex-col h-full w-12 border-e border-border bg-muted/30 items-center py-3 gap-1">
704
+ <div className="flex h-full w-12 flex-col items-center gap-1 border-e border-border bg-muted/30 py-3 transition-[width] duration-200 ease-out">
705
705
  <Tooltip>
706
706
  <TooltipTrigger asChild>
707
707
  <button
@@ -763,7 +763,7 @@ export function DocumentSidebar({
763
763
  return (
764
764
  <div
765
765
  className={cn(
766
- "agent-layout-left-drawer relative flex h-full min-h-0 flex-col border-e border-border bg-muted/30",
766
+ "agent-layout-left-drawer relative flex h-full min-h-0 flex-col border-e border-border bg-muted/30 transition-[width] duration-200 ease-out",
767
767
  width === undefined && "w-full",
768
768
  )}
769
769
  style={width === undefined ? undefined : { width, flexShrink: 0 }}
@@ -962,14 +962,14 @@ export function DocumentSidebar({
962
962
  </div>
963
963
  </ScrollArea>
964
964
 
965
- <div className="shrink-0 border-t border-border px-3 py-2">
965
+ <div className="shrink-0 px-3 py-2">
966
966
  <div className="space-y-1">
967
967
  {renderLocalFilesNavButton()}
968
968
  {renderSettingsNavButton()}
969
969
  </div>
970
970
  </div>
971
971
 
972
- <div className="shrink-0 border-t border-border">
972
+ <div className="shrink-0">
973
973
  <ExtensionSlot
974
974
  id="content.sidebar.bottom"
975
975
  context={{
@@ -985,7 +985,7 @@ export function DocumentSidebar({
985
985
  </div>
986
986
 
987
987
  {/* Footer */}
988
- <div className="shrink-0 space-y-2 border-t border-border px-3 py-2">
988
+ <div className="shrink-0 space-y-2 px-3 py-2">
989
989
  <OrgSwitcher />
990
990
  {isCodeMode ? <DevDatabaseLink /> : null}
991
991
  <div className="flex items-center gap-1">
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-06-28
4
+ ---
5
+
6
+ Left sidebar collapse motion and footer controls now feel smoother and use less divider chrome.
@@ -115,7 +115,7 @@ function inlineMarkdownToHtml(text: string): string {
115
115
  .replace(/\*\*([^*]+)\*\*/g, "<strong>$1</strong>")
116
116
  .replace(/__([^_]+)__/g, "<strong>$1</strong>")
117
117
  .replace(/~~([^~]+)~~/g, "<s>$1</s>")
118
- .replace(/(^|[^\*])\*([^*]+)\*/g, "$1<em>$2</em>")
118
+ .replace(/(^|[^*])\*([^*]+)\*/g, "$1<em>$2</em>")
119
119
  .replace(/(^|[^_])_([^_]+)_/g, "$1<em>$2</em>");
120
120
  }
121
121
 
@@ -145,18 +145,18 @@ Returns CSS custom properties, colors, fonts, Google Fonts links, theme-color, O
145
145
  ### Source: GitHub Repository
146
146
 
147
147
  ```bash
148
- pnpm action import-github --repoUrl "https://github.com/acme/ui"
148
+ pnpm action index-design-system-with-builder --githubRepoUrl "https://github.com/acme/ui"
149
149
  ```
150
150
 
151
- Fetches Tailwind configs, CSS files, theme files, package.json. Returns extracted colors, fonts, spacing, border-radius, and styling framework detection.
151
+ Starts Builder design-system indexing for the repository. Builder is the source of truth for the indexed brand kit, generated docs, and usage guidance. If Builder is not connected, stop and ask the user to connect Builder.
152
152
 
153
153
  ### Source: Local Code Files
154
154
 
155
155
  ```bash
156
- pnpm action import-code --files '[{"filename":"globals.css","content":"..."}]'
156
+ pnpm action index-design-system-with-builder --codeFiles '[{"filename":"globals.css","content":"..."}]'
157
157
  ```
158
158
 
159
- Analyzes CSS, Tailwind configs, JSON theme files, TS/JS theme files. Returns structured tokens.
159
+ Uploads code/design files to Builder and starts design-system indexing. Do not create a local design system from uploaded code files unless the user explicitly asks for a manual local fallback.
160
160
 
161
161
  ### Source: Documents (DOCX, PPTX, PDF)
162
162
 
@@ -192,20 +192,10 @@ effects to CSS box-shadow, and text styles to font tokens; snap spacing to a
192
192
  4/8px scale. If no Figma MCP is connected, ask the user to paste the token
193
193
  values or describe the file.
194
194
 
195
- **When the user uploads a raw `.fig` file**, parse it in-process with
196
- `import-figma-file` (no Figma account needed):
197
-
198
- ```bash
199
- pnpm action import-figma-file --fileBase64 "<base64 of the .fig>" # or --fileDataUrl
200
- ```
201
-
202
- It decodes the binary `.fig`, returns `frames` (each Figma frame rendered to
203
- HTML), an extracted `designSystem` (colors with assigned roles, typography,
204
- spacing, radius, shadows — ready for `DesignSystemData`), and image metadata.
205
- It's read-only/preview: review the result, then call `create-design-system`
206
- with the `designSystem` and/or `create-design` + `generate-design` with the
207
- `frames`. The full `palette` is returned too, so re-assign a color role if a
208
- heuristic looks off.
195
+ **When the user uploads a raw `.fig` file**, send it to Builder design-system
196
+ indexing through the setup page upload route. Do not parse `.fig` files locally
197
+ and do not call `create-design-system` from raw `.fig` output; Builder owns the
198
+ indexed brand kit, generated docs, and usage guidance.
209
199
 
210
200
  ### Source: Brand Analysis (combines website + notes)
211
201
 
@@ -0,0 +1,154 @@
1
+ ---
2
+ name: visual-edit
3
+ description: >-
4
+ Open a running local app in Design overview mode as URL-backed iframe screens
5
+ for visual editing, flow review, duplication, and route-state exploration.
6
+ metadata:
7
+ visibility: exported
8
+ ---
9
+
10
+ # Visual Edit
11
+
12
+ Use `/visual-edit` when the user wants to inspect or edit a real local app
13
+ visually instead of generating standalone Alpine HTML. The source of truth is
14
+ the running localhost app plus its route URLs. Design shows those routes as
15
+ iframe-backed screens on the infinite canvas.
16
+
17
+ ## Core Model
18
+
19
+ - Each screen is a URL-backed iframe, not copied HTML.
20
+ - Each screen keeps its own URL metadata: `connectionId`, `routeId`, `path`,
21
+ `url`, `bridgeUrl`, title, and viewport size.
22
+ - Start in Design's screen overview mode. The user can edit/select/drop on any
23
+ visible screen from the overview canvas.
24
+ - In overview, screens are static like Figma frames: no iframe scrolling or app
25
+ interaction. Full-screen focus is for scrolling and app interaction.
26
+ - Alt-drag duplicates a screen. For localhost screens, duplication copies the
27
+ iframe frame and URL metadata; change the copy's path/query when you need a
28
+ new flow state.
29
+ - Flow visualization is just multiple URL states: `/checkout?step=shipping`,
30
+ `/checkout?step=payment`, `/checkout?step=done`, etc.
31
+ - When the user gives a named flow or numbered screen list, preserve that order
32
+ and create one screen per URL/path. Shorthand like
33
+ `localhost:1234/onboarding/1` means `http://localhost:1234/onboarding/1`.
34
+
35
+ ## Required Local Bridge
36
+
37
+ From the target app repo, make sure its dev server is running, then run the
38
+ Design bridge with `npx`:
39
+
40
+ ```bash
41
+ npx @agent-native/core@latest design connect --url http://localhost:5173 --root .
42
+ ```
43
+
44
+ Use the app's real port. The command starts a local bridge on
45
+ `http://127.0.0.1:7331` by default and exposes:
46
+
47
+ - `GET /manifest.json` — dev server URL, bridge URL, discovered routes, root.
48
+ - `GET /routes.json` — route manifest only.
49
+ - `GET /health` — bridge liveness.
50
+
51
+ For one-shot agent setup, ask for JSON and keep the long-running bridge open in
52
+ a second terminal if the user needs live updates:
53
+
54
+ ```bash
55
+ npx @agent-native/core@latest design connect --url http://localhost:5173 --root . --json
56
+ ```
57
+
58
+ ## Action Flow
59
+
60
+ 1. Register or refresh the bridge in Design:
61
+
62
+ ```bash
63
+ pnpm action connect-localhost '{
64
+ "devServerUrl": "http://localhost:5173",
65
+ "bridgeUrl": "http://127.0.0.1:7331",
66
+ "rootPath": ".",
67
+ "routeManifest": { "version": 1, "sourceType": "localhost", "routes": [] }
68
+ }'
69
+ ```
70
+
71
+ Prefer passing the actual `/manifest.json` result as `routeManifest` and
72
+ `capabilities`. Keep any local filesystem paths out of user-facing summaries
73
+ unless the user asks.
74
+
75
+ 2. Create or reuse a Design project:
76
+
77
+ ```bash
78
+ pnpm action create-design --title "Local app visual edit" --projectType prototype
79
+ ```
80
+
81
+ 3. Place URL-backed screens on the overview canvas:
82
+
83
+ ```bash
84
+ pnpm action add-localhost-screens '{
85
+ "designId": "<design-id>",
86
+ "connectionId": "<connection-id>",
87
+ "routes": [
88
+ { "path": "/", "title": "Home", "width": 1280, "height": 900 },
89
+ { "path": "/pricing", "title": "Pricing", "width": 1280, "height": 900 },
90
+ { "path": "/checkout?step=payment", "title": "Checkout payment", "width": 1280, "height": 900 }
91
+ ],
92
+ "startX": 0,
93
+ "startY": 0,
94
+ "gap": 160
95
+ }'
96
+ ```
97
+
98
+ For a numbered flow the user describes in chat, keep the labels and order:
99
+
100
+ ```bash
101
+ pnpm action add-localhost-screens '{
102
+ "designId": "<design-id>",
103
+ "connectionId": "<connection-id>",
104
+ "routes": [
105
+ { "url": "localhost:1234/onboarding/1", "title": "Screen 1" },
106
+ { "url": "localhost:1234/onboarding/2", "title": "Screen 2" },
107
+ { "url": "localhost:1234/onboarding/3", "title": "Screen 3" }
108
+ ]
109
+ }'
110
+ ```
111
+
112
+ If no `routes` or `paths` are supplied, `add-localhost-screens` uses every route
113
+ from the latest localhost manifest. Use `paths` for a concise flow:
114
+
115
+ ```bash
116
+ pnpm action add-localhost-screens '{
117
+ "designId": "<design-id>",
118
+ "paths": ["/", "/pricing", "/checkout?step=payment"]
119
+ }'
120
+ ```
121
+
122
+ 4. Navigate the user to overview mode:
123
+
124
+ ```bash
125
+ pnpm action navigate --view editor --designId "<design-id>" --editorView overview
126
+ ```
127
+
128
+ ## Editing URLs
129
+
130
+ To change a localhost screen's URL, update that screen through
131
+ `add-localhost-screens` again using the same route-derived filename/path or use
132
+ normal Design screen duplication followed by a route/path update. Keep the file
133
+ content as the absolute URL and keep `screenMetadata[fileId]` aligned:
134
+
135
+ ```json
136
+ {
137
+ "sourceType": "localhost",
138
+ "previewState": "live",
139
+ "url": "http://localhost:5173/checkout?step=done",
140
+ "previewUrl": "http://localhost:5173/checkout?step=done",
141
+ "path": "/checkout?step=done"
142
+ }
143
+ ```
144
+
145
+ Do not replace localhost screens with copied `srcdoc` HTML unless the user
146
+ explicitly asks to freeze a snapshot.
147
+
148
+ ## Verification
149
+
150
+ - `list-localhost-connections` returns the expected connection and routes.
151
+ - The Design editor opens in overview mode.
152
+ - Every requested screen renders the intended localhost URL.
153
+ - Alt-dragging a screen copies the URL-backed frame, not an inline HTML clone.
154
+ - A query/path edit changes only the target screen's URL metadata and iframe.