@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
@@ -149,6 +149,8 @@ const messages = {
149
149
  "已從 Google Calendar 同步 {{count}} 個事件",
150
150
  },
151
151
  sidebar: {
152
+ collapseSidebar: "收合側邊欄",
153
+ expandSidebar: "展開側邊欄",
152
154
  addGoogleAccount: "新增 Google 帳號",
153
155
  colorByMeetingType: "按會議型別著色(外部、內部、一對一、小組等)",
154
156
  googleCalendarSettings: "Google Calendar 設定",
@@ -161,6 +161,8 @@ const enUS = {
161
161
  "Synced {{count}} events from Google Calendar",
162
162
  },
163
163
  sidebar: {
164
+ collapseSidebar: "Collapse sidebar",
165
+ expandSidebar: "Expand sidebar",
164
166
  addGoogleAccount: "Add Google account",
165
167
  colorByMeetingType:
166
168
  "Color by meeting type (external, internal, 1:1, group, etc.)",
@@ -6133,6 +6135,8 @@ const translatedCalendarRemainingRaw = {
6133
6135
  "已从 Google Calendar 同步 {{count}} 个事件",
6134
6136
  },
6135
6137
  sidebar: {
6138
+ collapseSidebar: "折叠侧边栏",
6139
+ expandSidebar: "展开侧边栏",
6136
6140
  addGoogleAccount: "添加 Google 账号",
6137
6141
  colorByMeetingType: "按会议类型着色(外部、内部、一对一、小组等)",
6138
6142
  googleCalendarSettings: "Google Calendar 设置",
@@ -6254,6 +6258,8 @@ const translatedCalendarRemainingRaw = {
6254
6258
  "{{count}} eventos sincronizados desde Google Calendar",
6255
6259
  },
6256
6260
  sidebar: {
6261
+ collapseSidebar: "Contraer barra lateral",
6262
+ expandSidebar: "Expandir barra lateral",
6257
6263
  addGoogleAccount: "Añadir cuenta de Google",
6258
6264
  colorByMeetingType:
6259
6265
  "Color por tipo de reunión (externa, interna, 1:1, grupo, etc.)",
@@ -6592,6 +6598,8 @@ const translatedCalendarExactCleanup = {
6592
6598
  "{{count}} événements synchronisés depuis Google Calendar",
6593
6599
  },
6594
6600
  sidebar: {
6601
+ collapseSidebar: "Réduire la barre latérale",
6602
+ expandSidebar: "Développer la barre latérale",
6595
6603
  addGoogleAccount: "Ajouter un compte Google",
6596
6604
  colorByMeetingType:
6597
6605
  "Couleur par type de réunion (externe, interne, 1:1, groupe, etc.)",
@@ -6772,6 +6780,8 @@ const translatedCalendarExactCleanup = {
6772
6780
  "{{count}} Termine aus Google Calendar synchronisiert",
6773
6781
  },
6774
6782
  sidebar: {
6783
+ collapseSidebar: "Seitenleiste einklappen",
6784
+ expandSidebar: "Seitenleiste erweitern",
6775
6785
  addGoogleAccount: "Google-Konto hinzufügen",
6776
6786
  colorByMeetingType:
6777
6787
  "Nach Meetingtyp einfärben (extern, intern, 1:1, Gruppe usw.)",
@@ -6941,6 +6951,8 @@ const translatedCalendarExactCleanup = {
6941
6951
  "Google Calendar から {{count}} 件の予定を同期しました",
6942
6952
  },
6943
6953
  sidebar: {
6954
+ collapseSidebar: "サイドバーを折りたたむ",
6955
+ expandSidebar: "サイドバーを展開",
6944
6956
  addGoogleAccount: "Google アカウントを追加",
6945
6957
  colorByMeetingType:
6946
6958
  "会議タイプ別に色分け (外部、内部、1:1、グループなど)",
@@ -7106,6 +7118,8 @@ const translatedCalendarExactCleanup = {
7106
7118
  "Google Calendar에서 이벤트 {{count}}개 동기화됨",
7107
7119
  },
7108
7120
  sidebar: {
7121
+ collapseSidebar: "사이드바 접기",
7122
+ expandSidebar: "사이드바 펼치기",
7109
7123
  addGoogleAccount: "Google 계정 추가",
7110
7124
  colorByMeetingType: "회의 유형별 색상 지정(외부, 내부, 1:1, 그룹 등)",
7111
7125
  googleCalendarSettings: "Google Calendar 설정",
@@ -7285,6 +7299,8 @@ const translatedCalendarExactCleanup = {
7285
7299
  "{{count}} eventos sincronizados do Google Calendar",
7286
7300
  },
7287
7301
  sidebar: {
7302
+ collapseSidebar: "Recolher barra lateral",
7303
+ expandSidebar: "Expandir barra lateral",
7288
7304
  addGoogleAccount: "Adicionar conta Google",
7289
7305
  colorByMeetingType:
7290
7306
  "Colorir por tipo de reunião (externa, interna, 1:1, grupo etc.)",
@@ -7452,6 +7468,8 @@ const translatedCalendarExactCleanup = {
7452
7468
  syncedFromGoogleCalendar_other: "Google Calendar से {{count}} इवेंट सिंक हुए",
7453
7469
  },
7454
7470
  sidebar: {
7471
+ collapseSidebar: "साइडबार समेटें",
7472
+ expandSidebar: "साइडबार फैलाएं",
7455
7473
  addGoogleAccount: "Google खाता जोड़ें",
7456
7474
  colorByMeetingType: "मीटिंग प्रकार से रंग दें (बाहरी, आंतरिक, 1:1, समूह आदि)",
7457
7475
  googleCalendarSettings: "Google Calendar सेटिंग",
@@ -7634,6 +7652,8 @@ const translatedCalendarExactCleanup = {
7634
7652
  "تمت مزامنة {{count}} حدث من Google Calendar",
7635
7653
  },
7636
7654
  sidebar: {
7655
+ collapseSidebar: "طي الشريط الجانبي",
7656
+ expandSidebar: "توسيع الشريط الجانبي",
7637
7657
  addGoogleAccount: "إضافة حساب Google",
7638
7658
  colorByMeetingType:
7639
7659
  "التلوين حسب نوع الاجتماع (خارجي، داخلي، 1:1، مجموعة، إلخ)",
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-06-28
4
+ ---
5
+
6
+ The left sidebar now collapses into an animated icon rail with quieter footer controls.
@@ -442,7 +442,7 @@ export function Sidebar({
442
442
  <aside
443
443
  data-collapsed={collapsed ? "true" : "false"}
444
444
  className={cn(
445
- "flex h-full min-w-0 shrink-0 flex-col overflow-hidden border-e border-sidebar-border bg-sidebar text-sidebar-foreground transition-[width] duration-150",
445
+ "flex h-full min-w-0 shrink-0 flex-col overflow-hidden border-e border-sidebar-border bg-sidebar text-sidebar-foreground transition-[width] duration-200 ease-out",
446
446
  collapsed ? "w-12" : "w-60",
447
447
  )}
448
448
  >
@@ -540,25 +540,14 @@ export function Sidebar({
540
540
  </div>
541
541
  </nav>
542
542
 
543
- <div
544
- className={cn(
545
- "mt-auto shrink-0",
546
- collapsed && "border-t border-sidebar-border py-2",
547
- )}
548
- >
543
+ <div className={cn("mt-auto shrink-0", collapsed && "py-2")}>
549
544
  {!collapsed ? (
550
- <div className="border-t border-sidebar-border px-2 py-1">
545
+ <div className="px-2 py-1">
551
546
  <ExtensionsSidebarSection />
552
547
  </div>
553
548
  ) : null}
554
549
 
555
- <div
556
- className={cn(
557
- collapsed
558
- ? "px-1 py-1"
559
- : "border-t border-sidebar-border px-3 py-2",
560
- )}
561
- >
550
+ <div className={cn(collapsed ? "px-1 py-1" : "px-3 py-2")}>
562
551
  <OrgSwitcher
563
552
  reserveSpace
564
553
  className={
@@ -571,9 +560,7 @@ export function Sidebar({
571
560
 
572
561
  <div
573
562
  className={cn(
574
- collapsed
575
- ? "flex justify-center px-1 py-1"
576
- : "border-t border-sidebar-border px-3 py-2",
563
+ collapsed ? "flex justify-center px-1 py-1" : "px-3 py-2",
577
564
  )}
578
565
  >
579
566
  <FeedbackButton
@@ -588,7 +575,7 @@ export function Sidebar({
588
575
  className={cn(
589
576
  collapsed
590
577
  ? "flex justify-center px-1 py-1"
591
- : "flex justify-end border-t border-sidebar-border px-3 py-2",
578
+ : "flex justify-end px-3 py-2",
592
579
  )}
593
580
  >
594
581
  {collapseButton}
@@ -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.
@@ -25,6 +25,10 @@ Detailed media, meeting, dictation, editing, and sharing rules live in
25
25
  download the original from Loom and use "Upload video".
26
26
  - Native transcript first. Cleanup and title generation can run in the
27
27
  background; do not hide a usable native transcript behind a failed cleanup.
28
+ - Dictation cleanup, Clip title/cleanup, and meeting summaries should pass
29
+ bounded `voiceContext` to the shared cleanup/transcription path when active
30
+ app context, learned vocabulary, user notes, or AGENTS.md preferences are
31
+ available.
28
32
  - Cloud transcription is fallback-only for Clips recordings and should use the
29
33
  configured Builder/Gemini or Groq paths, not OpenAI.
30
34
  - AI setup must be visible and paid-account-backed: lead with Builder.io Connect
@@ -31,6 +31,11 @@ import {
31
31
  resolveSecret,
32
32
  FeatureNotConfiguredError,
33
33
  } from "@agent-native/core/server";
34
+ import {
35
+ applyVoiceContextReplacements,
36
+ formatVoiceContextPackForPrompt,
37
+ type VoiceContextPack,
38
+ } from "@agent-native/core/voice";
34
39
  import { z } from "zod";
35
40
 
36
41
  import { isBuilderCreditsExhaustedMessage } from "../shared/builder-credits.js";
@@ -90,6 +95,12 @@ export default defineAction({
90
95
  .describe(
91
96
  "Optional surrounding context (e.g. meeting title, attendees, previous notes) to ground the cleanup pass.",
92
97
  ),
98
+ contextPack: z
99
+ .unknown()
100
+ .optional()
101
+ .describe(
102
+ "Optional structured voice context: snippets, vocabulary replacements, and metadata.",
103
+ ),
93
104
  language: z
94
105
  .string()
95
106
  .optional()
@@ -97,10 +108,12 @@ export default defineAction({
97
108
  }),
98
109
  run: async (args): Promise<CleanupResult> => {
99
110
  const transcript = args.transcript.slice(0, MAX_INPUT_CHARS);
111
+ const contextPack = args.contextPack as VoiceContextPack | undefined;
100
112
  const prompt = buildPrompt({
101
113
  task: args.task,
102
114
  transcript,
103
115
  context: args.context,
116
+ contextPack,
104
117
  language: args.language,
105
118
  });
106
119
  const wantJson = args.task === "summary";
@@ -124,7 +137,7 @@ export default defineAction({
124
137
  });
125
138
  if (text.trim()) {
126
139
  await clearBuilderCreditsExhausted();
127
- return shapeResult(args.task, text, "builder");
140
+ return shapeResult(args.task, text, "builder", contextPack);
128
141
  }
129
142
  builderReturnedEmpty = true;
130
143
  console.warn("[cleanup-transcript] Builder path returned empty text");
@@ -157,7 +170,7 @@ export default defineAction({
157
170
  prompt,
158
171
  wantJson,
159
172
  });
160
- return shapeResult(args.task, text, "gemini-byok");
173
+ return shapeResult(args.task, text, "gemini-byok", contextPack);
161
174
  }
162
175
 
163
176
  throw buildCleanupConfigurationError({
@@ -317,13 +330,16 @@ function shapeResult(
317
330
  task: "cleanup" | "title" | "summary",
318
331
  raw: string,
319
332
  provider: "builder" | "gemini-byok",
333
+ contextPack?: VoiceContextPack,
320
334
  ): CleanupResult {
321
335
  const stripped = stripEnvelope(raw);
336
+ const applyContext = (value: string) =>
337
+ applyVoiceContextReplacements(value, contextPack).trim();
322
338
  if (task === "title") {
323
- return { task, title: stripped.slice(0, 120), provider };
339
+ return { task, title: applyContext(stripped).slice(0, 120), provider };
324
340
  }
325
341
  if (task === "cleanup") {
326
- return { task, cleanedText: stripped, provider };
342
+ return { task, cleanedText: applyContext(stripped), provider };
327
343
  }
328
344
  // task === 'summary' — expect JSON.
329
345
  try {
@@ -338,11 +354,16 @@ function shapeResult(
338
354
  };
339
355
  return {
340
356
  task,
341
- summaryMd: typeof parsed.summaryMd === "string" ? parsed.summaryMd : "",
357
+ summaryMd:
358
+ typeof parsed.summaryMd === "string"
359
+ ? applyContext(parsed.summaryMd)
360
+ : "",
342
361
  bullets: Array.isArray(parsed.bullets)
343
362
  ? parsed.bullets
344
363
  .map((b) =>
345
- typeof b === "string" ? { text: b } : { text: b.text ?? "" },
364
+ typeof b === "string"
365
+ ? { text: applyContext(b) }
366
+ : { text: applyContext(b.text ?? "") },
346
367
  )
347
368
  .filter((b) => b.text)
348
369
  : [],
@@ -359,7 +380,7 @@ function shapeResult(
359
380
  : "";
360
381
  const isEmail = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(rawEmail);
361
382
  return {
362
- text: (a.text ?? "").trim(),
383
+ text: applyContext(a.text ?? ""),
363
384
  ...(isEmail ? { assigneeEmail: rawEmail } : {}),
364
385
  ...(a.dueDate ? { dueDate: a.dueDate } : {}),
365
386
  };
@@ -371,7 +392,7 @@ function shapeResult(
371
392
  // Provider didn't return JSON — fall back to raw markdown summary.
372
393
  return {
373
394
  task,
374
- summaryMd: stripped,
395
+ summaryMd: applyContext(stripped),
375
396
  bullets: [],
376
397
  actionItems: [],
377
398
  provider,
@@ -391,15 +412,24 @@ function buildPrompt({
391
412
  task,
392
413
  transcript,
393
414
  context,
415
+ contextPack,
394
416
  language,
395
417
  }: {
396
418
  task: "cleanup" | "title" | "summary";
397
419
  transcript: string;
398
420
  context?: string;
421
+ contextPack?: VoiceContextPack;
399
422
  language?: string;
400
423
  }): { system: string; user: string } {
401
424
  const langHint = language ? ` The transcript language is ${language}.` : "";
402
- const ctxBlock = context ? `\n\n<context>\n${context}\n</context>` : "";
425
+ const voiceContext = formatVoiceContextPackForPrompt(contextPack);
426
+ const contextParts = [
427
+ context?.trim(),
428
+ voiceContext ? `Voice context:\n${voiceContext}` : "",
429
+ ].filter(Boolean);
430
+ const ctxBlock = contextParts.length
431
+ ? `\n\n<context>\n${contextParts.join("\n\n")}\n</context>`
432
+ : "";
403
433
 
404
434
  if (task === "title") {
405
435
  return {
@@ -13,12 +13,20 @@
13
13
  import { defineAction } from "@agent-native/core";
14
14
  import { writeAppState } from "@agent-native/core/application-state";
15
15
  import { assertAccess } from "@agent-native/core/sharing";
16
+ import type { VoiceContextPack } from "@agent-native/core/voice";
16
17
  import { eq } from "drizzle-orm";
17
18
  import { z } from "zod";
18
19
 
19
20
  import { getDb, schema } from "../server/db/index.js";
20
21
  import { nanoid } from "../server/lib/recordings.js";
21
22
  import cleanupTranscript, { CleanupResult } from "./cleanup-transcript.js";
23
+ import { loadAgentsMdContext } from "./lib/agents-md-context.js";
24
+
25
+ function trimContextValue(value: string, maxChars: number): string {
26
+ const trimmed = value.replace(/\0/g, "").trim();
27
+ if (trimmed.length <= maxChars) return trimmed;
28
+ return `${trimmed.slice(0, maxChars).trimEnd()}\n[truncated]`;
29
+ }
22
30
 
23
31
  export default defineAction({
24
32
  description:
@@ -72,29 +80,90 @@ export default defineAction({
72
80
  .set({ transcriptStatus: "pending", updatedAt: nowIso })
73
81
  .where(eq(schema.meetings.id, args.meetingId));
74
82
 
75
- const participants = await db
76
- .select()
77
- .from(schema.meetingParticipants)
78
- .where(eq(schema.meetingParticipants.meetingId, args.meetingId));
83
+ const [participants, recordingRows, agentsContext] = await Promise.all([
84
+ db
85
+ .select()
86
+ .from(schema.meetingParticipants)
87
+ .where(eq(schema.meetingParticipants.meetingId, args.meetingId)),
88
+ meeting.recordingId
89
+ ? db
90
+ .select({
91
+ title: schema.recordings.title,
92
+ sourceAppName: schema.recordings.sourceAppName,
93
+ sourceWindowTitle: schema.recordings.sourceWindowTitle,
94
+ description: schema.recordings.description,
95
+ })
96
+ .from(schema.recordings)
97
+ .where(eq(schema.recordings.id, meeting.recordingId))
98
+ .limit(1)
99
+ : Promise.resolve([]),
100
+ loadAgentsMdContext({
101
+ ownerEmail: meeting.ownerEmail,
102
+ purpose: "summary",
103
+ }),
104
+ ]);
105
+ const linkedRecording = recordingRows[0] ?? null;
79
106
 
80
- const contextLines: string[] = [];
81
- if (meeting.title) contextLines.push(`Meeting: ${meeting.title}`);
107
+ // Build a single bounded context pack for the summary prompt. Avoid also
108
+ // emitting the same fields as a parallel plain-text `context` string: the
109
+ // cleanup prompt concatenates both into one <context> block, so passing
110
+ // both would duplicate every snippet (and the plain-text path was
111
+ // unbounded at ~20k chars per field).
112
+ const contextSnippets: NonNullable<VoiceContextPack["snippets"]> = [];
113
+ const addSnippet = (label: string, value: string, maxChars = 2_000) => {
114
+ const trimmed = trimContextValue(value, maxChars);
115
+ if (trimmed) contextSnippets.push({ label, value: trimmed });
116
+ };
117
+ if (meeting.title) addSnippet("Meeting title", meeting.title, 200);
82
118
  if (meeting.scheduledStart)
83
- contextLines.push(`Scheduled: ${meeting.scheduledStart}`);
119
+ addSnippet("Scheduled start", meeting.scheduledStart, 120);
84
120
  if (participants.length) {
85
- contextLines.push(
86
- `Attendees: ${participants
87
- .map((p) => `${p.name ?? p.email} <${p.email}>`)
88
- .join(", ")}`,
121
+ addSnippet(
122
+ "Attendees",
123
+ participants.map((p) => `${p.name ?? p.email} <${p.email}>`).join(", "),
124
+ 1800,
125
+ );
126
+ }
127
+ if (meeting.userNotesMd.trim()) {
128
+ addSnippet("User notes", meeting.userNotesMd, 3_000);
129
+ }
130
+ if (linkedRecording) {
131
+ addSnippet(
132
+ "Linked Clip",
133
+ [
134
+ linkedRecording.title,
135
+ linkedRecording.sourceAppName,
136
+ linkedRecording.sourceWindowTitle,
137
+ linkedRecording.description,
138
+ ]
139
+ .filter(Boolean)
140
+ .join("\n"),
141
+ 1800,
89
142
  );
90
143
  }
144
+ if (agentsContext)
145
+ addSnippet("AGENTS.md preferences", agentsContext, 3_000);
146
+ const contextPack: VoiceContextPack | undefined = contextSnippets.length
147
+ ? {
148
+ surface: "clips-meeting",
149
+ mode: "summary",
150
+ snippets: contextSnippets,
151
+ metadata: {
152
+ meetingId: meeting.id,
153
+ recordingId: meeting.recordingId,
154
+ calendarEventId: meeting.calendarEventId,
155
+ source: meeting.source,
156
+ platform: meeting.platform,
157
+ },
158
+ }
159
+ : undefined;
91
160
 
92
161
  let result: CleanupResult;
93
162
  try {
94
163
  result = await cleanupTranscript.run({
95
164
  transcript: transcriptText,
96
165
  task: "summary",
97
- context: contextLines.join("\n") || undefined,
166
+ contextPack,
98
167
  });
99
168
  } catch (err) {
100
169
  await db
@@ -5,7 +5,7 @@ import {
5
5
 
6
6
  const MAX_AGENTS_MD_CONTEXT_CHARS = 60_000;
7
7
 
8
- type AgentsContextPurpose = "title" | "cleanup";
8
+ type AgentsContextPurpose = "title" | "cleanup" | "summary";
9
9
 
10
10
  function trimAgentsMdContext(content: string): string {
11
11
  const trimmed = content.trim();
@@ -31,6 +31,9 @@ function purposeInstruction(purpose: AgentsContextPurpose): string {
31
31
  if (purpose === "cleanup") {
32
32
  return "Use these AGENTS.md resources only for relevant transcript cleanup preferences: vocabulary, casing, punctuation style, formatting style, terminology, speaker voice, and team/personal conventions. If the personal and organization instructions conflict, prefer the personal instructions.";
33
33
  }
34
+ if (purpose === "summary") {
35
+ return "Use these AGENTS.md resources only for relevant meeting-summary preferences: vocabulary, casing, terminology, action-item style, formatting style, and team/personal conventions. If the personal and organization instructions conflict, prefer the personal instructions.";
36
+ }
34
37
 
35
38
  return "Use these AGENTS.md resources only for relevant Clip naming, terminology, style, and personal/team preferences. If the personal and organization instructions conflict, prefer the personal instructions.";
36
39
  }
@@ -498,7 +498,7 @@ export function LibraryLayout({ children }: LibraryLayoutProps) {
498
498
 
499
499
  {!showCollapsedSidebar && (
500
500
  <>
501
- <div className="shrink-0 space-y-1.5 border-t border-border px-2 py-1.5">
501
+ <div className="shrink-0 space-y-1.5 px-2 py-1.5">
502
502
  {shouldShowSidebarLink && (
503
503
  <CaptureInstallInlineLink className="flex items-center gap-2 rounded px-2 py-1.5 text-xs text-foreground hover:bg-accent/60">
504
504
  <IconAppWindow className="h-4 w-4" />
@@ -508,11 +508,11 @@ export function LibraryLayout({ children }: LibraryLayoutProps) {
508
508
  <SearchBar />
509
509
  </div>
510
510
 
511
- <div className="shrink-0 border-t border-border px-1 py-1">
511
+ <div className="shrink-0 px-1 py-1">
512
512
  <ExtensionsSidebarSection />
513
513
  </div>
514
514
 
515
- <div className="shrink-0 space-y-2 border-t border-border px-3 py-2">
515
+ <div className="shrink-0 space-y-2 px-3 py-2">
516
516
  <OrgSwitcher settingsPath="/settings/organization" />
517
517
  <DevDatabaseLink />
518
518
  <FeedbackButton />
@@ -38,7 +38,7 @@ export function ShareMeetingPopover({
38
38
  <PopoverTrigger asChild>{children}</PopoverTrigger>
39
39
  <PopoverContent
40
40
  align="end"
41
- className="w-[440px] max-w-[calc(100vw-1rem)] overflow-hidden p-0"
41
+ className="w-[440px] max-w-[calc(100vw-1rem)] overflow-hidden border-border p-0"
42
42
  >
43
43
  <ShareMeetingContent
44
44
  meetingId={meetingId}
@@ -91,7 +91,7 @@ export function ShareRecordingPopover({
91
91
  <PopoverTrigger asChild>{children}</PopoverTrigger>
92
92
  <PopoverContent
93
93
  align="end"
94
- className="w-[440px] max-w-[calc(100vw-1rem)] overflow-hidden p-0"
94
+ className="w-[440px] max-w-[calc(100vw-1rem)] overflow-hidden border-border p-0"
95
95
  >
96
96
  <ShareRecordingContent
97
97
  recordingId={recordingId}
@@ -124,7 +124,7 @@ export function ShareRecordingDialog({
124
124
  const t = useT();
125
125
  return (
126
126
  <Dialog open={open} onOpenChange={onOpenChange}>
127
- <DialogContent className="w-[calc(100vw-2rem)] overflow-hidden p-0 sm:max-w-[440px]">
127
+ <DialogContent className="w-[calc(100vw-2rem)] overflow-hidden border-border p-0 sm:max-w-[440px]">
128
128
  <DialogTitle className="sr-only">
129
129
  {recordingTitle
130
130
  ? t("shareDialog.sharePlainTitle", { title: recordingTitle })
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-06-28
4
+ ---
5
+
6
+ Left sidebar footer controls now use less divider chrome.
@@ -21,7 +21,7 @@
21
21
 
22
22
  import { invoke } from "@tauri-apps/api/core";
23
23
 
24
- interface VocabularyEntry {
24
+ export interface VocabularyEntry {
25
25
  id: string;
26
26
  term: string;
27
27
  replacement: string;
@@ -37,13 +37,9 @@ export function configureVocabularyClient(url: string): void {
37
37
  serverUrl = url.replace(/\/+$/, "");
38
38
  }
39
39
 
40
- /**
41
- * Fetch the current user's vocabulary from the server. Cached for 60s so
42
- * the dictation start path stays snappy on rapid Fn re-presses.
43
- */
44
- export async function loadVocabulary(): Promise<string[]> {
40
+ export async function loadVocabularyEntries(): Promise<VocabularyEntry[]> {
45
41
  if (cachedVocabulary && Date.now() - cachedAt < 60_000) {
46
- return cachedVocabulary.map((v) => v.replacement);
42
+ return cachedVocabulary;
47
43
  }
48
44
  if (!serverUrl) return [];
49
45
  try {
@@ -55,13 +51,22 @@ export async function loadVocabulary(): Promise<string[]> {
55
51
  const data = (await res.json()) as { vocabulary?: VocabularyEntry[] };
56
52
  cachedVocabulary = data.vocabulary ?? [];
57
53
  cachedAt = Date.now();
58
- return cachedVocabulary.map((v) => v.replacement);
54
+ return cachedVocabulary;
59
55
  } catch (err) {
60
56
  console.warn("[personal-vocabulary] loadVocabulary failed:", err);
61
57
  return [];
62
58
  }
63
59
  }
64
60
 
61
+ /**
62
+ * Fetch the current user's vocabulary from the server. Cached for 60s so
63
+ * the dictation start path stays snappy on rapid Fn re-presses.
64
+ */
65
+ export async function loadVocabulary(): Promise<string[]> {
66
+ const vocabulary = await loadVocabularyEntries();
67
+ return vocabulary.map((v) => v.replacement);
68
+ }
69
+
65
70
  /**
66
71
  * Token-level diff between two short strings. Returns the first
67
72
  * `{term, replacement}` pair where a single word changed and length didn't
@@ -2069,6 +2069,8 @@ async function startNativeFullscreenRecording(
2069
2069
  .then(() => {
2070
2070
  pausedAt = at;
2071
2071
  emitState();
2072
+ console.log("[clips-recorder] native pause: pausing transcription");
2073
+ void transcriptionCapture?.pause().catch(() => {});
2072
2074
  })
2073
2075
  .catch((err) => {
2074
2076
  console.warn("[clips-recorder] native pause failed:", err);
@@ -2076,6 +2078,8 @@ async function startNativeFullscreenRecording(
2076
2078
  }),
2077
2079
  listen("clips:recorder-resume", () => {
2078
2080
  if (pausedAt == null) return;
2081
+ // Only resume transcription once the recorder actually resumed, so a
2082
+ // rejected IPC can't leave transcription running over a paused recording.
2079
2083
  invoke("native_fullscreen_recording_resume")
2080
2084
  .then(() => {
2081
2085
  if (pausedAt != null) {
@@ -2083,6 +2087,8 @@ async function startNativeFullscreenRecording(
2083
2087
  pausedAt = null;
2084
2088
  }
2085
2089
  emitState();
2090
+ console.log("[clips-recorder] native resume: resuming transcription");
2091
+ void transcriptionCapture?.resume().catch(() => {});
2086
2092
  })
2087
2093
  .catch((err) => {
2088
2094
  console.warn("[clips-recorder] native resume failed:", err);
@@ -2125,6 +2131,12 @@ async function startNativeFullscreenRecording(
2125
2131
  if (stopped && transcriptionCapture) {
2126
2132
  void transcriptionCapture.cancel().catch(() => {});
2127
2133
  transcriptionCapture = null;
2134
+ } else if (pausedAt != null && transcriptionCapture) {
2135
+ // The user paused while the engine was still starting; honor it now.
2136
+ console.log(
2137
+ "[clips-recorder] native: paused during startup, pausing transcription",
2138
+ );
2139
+ void transcriptionCapture.pause().catch(() => {});
2128
2140
  } else if (
2129
2141
  wantsAudio &&
2130
2142
  !transcriptionCapture &&
@@ -2885,6 +2897,8 @@ async function startRecordingInner(
2885
2897
  recorder.pause();
2886
2898
  pausedAt = Date.now();
2887
2899
  emitState(true);
2900
+ console.log("[clips-recorder] recorder pause: pausing transcription");
2901
+ void transcriptionCapture?.pause().catch(() => {});
2888
2902
  } catch {
2889
2903
  // ignore
2890
2904
  }
@@ -2897,6 +2911,10 @@ async function startRecordingInner(
2897
2911
  if (pausedAt) accumulatedPauseMs += Date.now() - pausedAt;
2898
2912
  pausedAt = null;
2899
2913
  emitState(false);
2914
+ console.log(
2915
+ "[clips-recorder] recorder resume: resuming transcription",
2916
+ );
2917
+ void transcriptionCapture?.resume().catch(() => {});
2900
2918
  } catch {
2901
2919
  // ignore
2902
2920
  }
@@ -2951,6 +2969,12 @@ async function startRecordingInner(
2951
2969
  if (stopped && transcriptionCapture) {
2952
2970
  void transcriptionCapture.cancel().catch(() => {});
2953
2971
  transcriptionCapture = null;
2972
+ } else if (pausedAt != null && transcriptionCapture) {
2973
+ // The user paused while the engine was still starting; honor it now.
2974
+ console.log(
2975
+ "[clips-recorder] recorder: paused during startup, pausing transcription",
2976
+ );
2977
+ void transcriptionCapture.pause().catch(() => {});
2954
2978
  } else if (
2955
2979
  wantsAudio &&
2956
2980
  !transcriptionCapture &&