@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
@@ -1,4 +1,8 @@
1
- import { getSession } from "@agent-native/core/server";
1
+ import {
2
+ FeatureNotConfiguredError,
3
+ getSession,
4
+ startBuilderDesignSystemIndex,
5
+ } from "@agent-native/core/server";
2
6
  import {
3
7
  defineEventHandler,
4
8
  getRequestHeader,
@@ -6,11 +10,7 @@ import {
6
10
  setResponseStatus,
7
11
  } from "h3";
8
12
 
9
- import {
10
- MAX_FIG_BYTES,
11
- parseSlidesFigDesignSystem,
12
- } from "../lib/fig-design-system.js";
13
-
13
+ const MAX_FIG_BYTES = 200 * 1024 * 1024;
14
14
  const MULTIPART_OVERHEAD_BYTES = 1024 * 1024;
15
15
 
16
16
  function requestContentLength(event: Parameters<typeof getRequestHeader>[0]) {
@@ -55,15 +55,47 @@ export const importFigmaSystem = defineEventHandler(async (event) => {
55
55
  error: "No .fig file uploaded (expected multipart field 'file').",
56
56
  };
57
57
  }
58
+ if (part.data.length > MAX_FIG_BYTES) {
59
+ setResponseStatus(event, 413);
60
+ return {
61
+ error: `File too large (max ${Math.round(MAX_FIG_BYTES / 1024 / 1024)} MB).`,
62
+ };
63
+ }
64
+
65
+ const suggestedTitle =
66
+ (part.filename || "Imported brand")
67
+ .replace(/\.fig$/i, "")
68
+ .replace(/[-_]+/g, " ")
69
+ .trim() || "Imported brand";
58
70
 
59
71
  try {
60
- return parseSlidesFigDesignSystem({
61
- data: part.data,
62
- filename: part.filename,
72
+ return await startBuilderDesignSystemIndex({
73
+ projectName: suggestedTitle,
74
+ files: [
75
+ {
76
+ name: part.filename || "brand.fig",
77
+ data: part.data,
78
+ mimeType: "application/octet-stream",
79
+ },
80
+ ],
63
81
  });
64
82
  } catch (err) {
65
- const message = err instanceof Error ? err.message : "Invalid .fig file";
66
- setResponseStatus(event, message.startsWith("File too large") ? 413 : 422);
67
- return { error: message };
83
+ if (err instanceof FeatureNotConfiguredError) {
84
+ setResponseStatus(event, 412);
85
+ return {
86
+ error:
87
+ err.message ||
88
+ "Connect Builder.io before indexing a design system from Figma.",
89
+ builderConnectUrl:
90
+ err.builderConnectUrl ?? "/_agent-native/builder/connect",
91
+ };
92
+ }
93
+ setResponseStatus(event, 502);
94
+ return {
95
+ error:
96
+ err instanceof Error
97
+ ? err.message
98
+ : "Builder design-system indexing failed.",
99
+ };
68
100
  }
69
101
  });
@@ -106,7 +106,7 @@ export async function prepareSlidesChatAttachments(args: {
106
106
  "- If the request refers to the current or visible deck, call `view-screen` first to confirm the active deckId, then pass that deckId to import or slide-edit actions.",
107
107
  '- PPTX files: call `import-pptx --filePath "<path>" --deckId <deckId>` when updating the visible deck, or omit deckId only when the user explicitly wants a new deck.',
108
108
  '- PDF and DOCX files: call `import-file --filePath "<path>" --format auto --deckId <deckId>` and use the returned extracted text as source material before creating slides. The returned text is capped for reliability; re-run with maxChars only if more context is needed. If the user wants a direct replacement import, pass `--importIntoDeck true` as well.',
109
- '- Figma `.fig` files: call `import-file --filePath "<path>" --format fig`, then call `create-design-system` with the returned `designSystem` data and `customInstructions`.',
109
+ '- Figma `.fig` files: call `import-file --filePath "<path>" --format fig` to start Builder design-system indexing. Do not create a local design system from raw `.fig` output.',
110
110
  "- For deck-generation requests, start mutating promptly: create or update the first slide as soon as source material is extracted, then continue slide-by-slide with add-slide/update-slide.",
111
111
  '- Image files with an embeddable URL can be inserted directly into slide HTML as `<img src="...">` or used as visual references.',
112
112
  "- Do not say no PDF/PPTX/DOCX/FIG/image was attached when a matching saved path is listed here.",
@@ -40,7 +40,7 @@ export function NewCompositionPopover({
40
40
  sessionStorage.removeItem("videos:new-composition-generating");
41
41
  window.dispatchEvent(new CustomEvent("videos:new-composition-status"));
42
42
  setTimeout(() => {
43
- const match = window.location.pathname.match(/\/c\/([^\/]+)/);
43
+ const match = window.location.pathname.match(/\/c\/([^/]+)/);
44
44
  if (match && match[1] !== "new") {
45
45
  try {
46
46
  window.dispatchEvent(
@@ -594,11 +594,11 @@ export function Sidebar({
594
594
  </TabsContent>
595
595
  </Tabs>
596
596
 
597
- <div className="border-t border-border px-2 py-1.5 shrink-0">
597
+ <div className="shrink-0 px-2 py-1.5">
598
598
  <ExtensionsSidebarSection />
599
599
  </div>
600
600
 
601
- <div className="border-t border-border px-3 py-1.5 shrink-0 space-y-2">
601
+ <div className="shrink-0 space-y-2 px-3 py-1.5">
602
602
  <DevDatabaseLink />
603
603
  <FeedbackButton />
604
604
  <OrgSwitcher />
@@ -14,6 +14,17 @@ interface LayoutProps {
14
14
  children: React.ReactNode;
15
15
  }
16
16
 
17
+ const SIDEBAR_COLLAPSE_KEY = "videos.sidebar.collapsed";
18
+
19
+ function readSidebarCollapsed() {
20
+ if (typeof window === "undefined") return false;
21
+ try {
22
+ return window.localStorage.getItem(SIDEBAR_COLLAPSE_KEY) === "1";
23
+ } catch {
24
+ return false;
25
+ }
26
+ }
27
+
17
28
  /**
18
29
  * Routes whose page renders its own h-12 toolbar (with title + AgentToggleButton).
19
30
  * Layout still wraps these with the AgentSidebar but skips the global Header
@@ -39,11 +50,24 @@ export function Layout({ children }: LayoutProps) {
39
50
  const location = useLocation();
40
51
  const t = useT();
41
52
  const [mobileSidebarOpen, setMobileSidebarOpen] = useState(false);
53
+ const [sidebarCollapsed, setSidebarCollapsed] =
54
+ useState(readSidebarCollapsed);
42
55
 
43
56
  useEffect(() => {
44
57
  setMobileSidebarOpen(false);
45
58
  }, [location.pathname]);
46
59
 
60
+ useEffect(() => {
61
+ try {
62
+ window.localStorage.setItem(
63
+ SIDEBAR_COLLAPSE_KEY,
64
+ sidebarCollapsed ? "1" : "0",
65
+ );
66
+ } catch {
67
+ // Ignore storage failures; the in-memory preference still works.
68
+ }
69
+ }, [sidebarCollapsed]);
70
+
47
71
  const isStudio = studioRoute(location.pathname);
48
72
  const ownsToolbar = routeOwnsToolbar(location.pathname);
49
73
 
@@ -58,14 +82,17 @@ export function Layout({ children }: LayoutProps) {
58
82
  <HeaderActionsProvider>
59
83
  <div className="agent-layout-shell flex h-screen w-full overflow-hidden bg-background text-foreground">
60
84
  <div className="agent-layout-left-drawer hidden md:block">
61
- <NavSidebar />
85
+ <NavSidebar
86
+ collapsed={sidebarCollapsed}
87
+ onCollapsedChange={setSidebarCollapsed}
88
+ />
62
89
  </div>
63
90
  <Sheet open={mobileSidebarOpen} onOpenChange={setMobileSidebarOpen}>
64
91
  <SheetContent side="left" className="p-0 w-[260px]">
65
92
  <SheetTitle className="sr-only">
66
93
  {t("sidebar.navigation")}
67
94
  </SheetTitle>
68
- <NavSidebar />
95
+ <NavSidebar collapsed={false} collapsible={false} />
69
96
  </SheetContent>
70
97
  </Sheet>
71
98
  <AgentSidebar
@@ -11,9 +11,16 @@ import {
11
11
  IconComponents,
12
12
  IconPalette,
13
13
  IconSettings,
14
+ IconLayoutSidebarLeftCollapse,
15
+ IconLayoutSidebarLeftExpand,
14
16
  } from "@tabler/icons-react";
15
17
  import { Link, useLocation } from "react-router";
16
18
 
19
+ import {
20
+ Tooltip,
21
+ TooltipContent,
22
+ TooltipTrigger,
23
+ } from "@/components/ui/tooltip";
17
24
  import { cn } from "@/lib/utils";
18
25
 
19
26
  const navItems = [
@@ -31,31 +38,90 @@ const navItems = [
31
38
  { icon: IconSettings, labelKey: "navigation.settings", href: "/settings" },
32
39
  ];
33
40
 
34
- export function NavSidebar() {
41
+ interface NavSidebarProps {
42
+ collapsed?: boolean;
43
+ collapsible?: boolean;
44
+ onCollapsedChange?: (collapsed: boolean) => void;
45
+ }
46
+
47
+ export function NavSidebar({
48
+ collapsed = false,
49
+ collapsible = true,
50
+ onCollapsedChange,
51
+ }: NavSidebarProps) {
35
52
  const location = useLocation();
36
53
  const t = useT();
37
54
 
38
55
  return (
39
- <aside className="flex h-full w-56 shrink-0 flex-col border-e border-border bg-sidebar text-sidebar-foreground">
40
- <div className="flex h-12 shrink-0 items-center gap-2 px-4 border-b border-border">
41
- <img
42
- src={appPath("/agent-native-icon-light.svg")}
43
- alt=""
44
- aria-hidden="true"
45
- className="block h-4 w-auto shrink-0 dark:hidden"
46
- />
47
- <img
48
- src={appPath("/agent-native-icon-dark.svg")}
49
- alt=""
50
- aria-hidden="true"
51
- className="hidden h-4 w-auto shrink-0 dark:block"
52
- />
53
- <span className="text-sm font-semibold tracking-tight">
54
- {t("navigation.brand")}
55
- </span>
56
+ <aside
57
+ data-collapsed={collapsed ? "true" : "false"}
58
+ className={cn(
59
+ "flex h-full shrink-0 flex-col overflow-hidden border-e border-border bg-sidebar text-sidebar-foreground transition-[width] duration-200 ease-out",
60
+ collapsed ? "w-12" : "w-56",
61
+ )}
62
+ >
63
+ <div
64
+ className={cn(
65
+ "flex h-12 shrink-0 items-center border-b border-border",
66
+ collapsed ? "justify-center px-1" : "gap-2 px-4",
67
+ )}
68
+ >
69
+ {!collapsed && (
70
+ <>
71
+ <img
72
+ src={appPath("/agent-native-icon-light.svg")}
73
+ alt=""
74
+ aria-hidden="true"
75
+ className="block h-4 w-auto shrink-0 dark:hidden"
76
+ />
77
+ <img
78
+ src={appPath("/agent-native-icon-dark.svg")}
79
+ alt=""
80
+ aria-hidden="true"
81
+ className="hidden h-4 w-auto shrink-0 dark:block"
82
+ />
83
+ <span className="min-w-0 flex-1 truncate text-sm font-semibold tracking-tight">
84
+ {t("navigation.brand")}
85
+ </span>
86
+ </>
87
+ )}
88
+ {collapsible && (
89
+ <Tooltip>
90
+ <TooltipTrigger asChild>
91
+ <button
92
+ type="button"
93
+ onClick={() => onCollapsedChange?.(!collapsed)}
94
+ aria-label={
95
+ collapsed
96
+ ? t("sidebar.expandSidebar")
97
+ : t("sidebar.collapseSidebar")
98
+ }
99
+ className="flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-sidebar-accent/50 hover:text-foreground"
100
+ >
101
+ {collapsed ? (
102
+ <IconLayoutSidebarLeftExpand className="h-4 w-4 rtl:-scale-x-100" />
103
+ ) : (
104
+ <IconLayoutSidebarLeftCollapse className="h-4 w-4 rtl:-scale-x-100" />
105
+ )}
106
+ </button>
107
+ </TooltipTrigger>
108
+ <TooltipContent side="right">
109
+ {collapsed
110
+ ? t("sidebar.expandSidebar")
111
+ : t("sidebar.collapseSidebar")}
112
+ </TooltipContent>
113
+ </Tooltip>
114
+ )}
56
115
  </div>
57
116
 
58
- <nav className="flex-1 overflow-y-auto px-2 py-2 space-y-1">
117
+ <nav
118
+ className={cn(
119
+ "flex-1 overflow-y-auto py-2",
120
+ collapsed
121
+ ? "flex flex-col items-center gap-1 px-1"
122
+ : "space-y-1 px-2",
123
+ )}
124
+ >
59
125
  {navItems.map((item) => {
60
126
  const Icon = item.icon;
61
127
  const isActive =
@@ -65,33 +131,50 @@ export function NavSidebar() {
65
131
  !location.pathname.startsWith("/settings") &&
66
132
  !location.pathname.startsWith("/extensions")
67
133
  : location.pathname.startsWith(item.href);
68
- return (
134
+ const link = (
69
135
  <Link
70
136
  key={item.href}
71
137
  to={item.href}
138
+ aria-label={collapsed ? t(item.labelKey) : undefined}
72
139
  className={cn(
73
- "flex items-center gap-3 rounded-lg px-3 py-2 text-sm transition-colors",
140
+ "flex items-center rounded-lg text-sm transition-colors",
141
+ collapsed ? "h-10 w-10 justify-center" : "gap-3 px-3 py-2",
74
142
  isActive
75
143
  ? "bg-sidebar-accent text-sidebar-accent-foreground"
76
144
  : "text-muted-foreground hover:bg-sidebar-accent/50 hover:text-foreground",
77
145
  )}
78
146
  >
79
147
  <Icon className="h-4 w-4 shrink-0" />
80
- {t(item.labelKey)}
148
+ {collapsed ? (
149
+ <span className="sr-only">{t(item.labelKey)}</span>
150
+ ) : (
151
+ t(item.labelKey)
152
+ )}
81
153
  </Link>
82
154
  );
155
+ if (!collapsed) return link;
156
+ return (
157
+ <Tooltip key={item.href}>
158
+ <TooltipTrigger asChild>{link}</TooltipTrigger>
159
+ <TooltipContent side="right">{t(item.labelKey)}</TooltipContent>
160
+ </Tooltip>
161
+ );
83
162
  })}
84
163
  </nav>
85
164
 
86
- <div className="border-t border-border px-2 py-2">
87
- <ExtensionsSidebarSection />
88
- </div>
165
+ {!collapsed && (
166
+ <div className="px-2 py-2">
167
+ <ExtensionsSidebarSection />
168
+ </div>
169
+ )}
89
170
 
90
- <div className="border-t border-border px-3 py-2 space-y-2">
91
- <DevDatabaseLink />
92
- <FeedbackButton />
93
- <OrgSwitcher />
94
- </div>
171
+ {!collapsed && (
172
+ <div className="space-y-2 px-3 py-2">
173
+ <DevDatabaseLink />
174
+ <FeedbackButton />
175
+ <OrgSwitcher />
176
+ </div>
177
+ )}
95
178
  </aside>
96
179
  );
97
180
  }
@@ -46,6 +46,8 @@ const messages = {
46
46
  suggestionSlow: "أبطئ حركة المقدمة",
47
47
  },
48
48
  sidebar: {
49
+ collapseSidebar: "طي الشريط الجانبي",
50
+ expandSidebar: "توسيع الشريط الجانبي",
49
51
  navigation: "التنقل",
50
52
  openNavigation: "فتح التنقل",
51
53
  },
@@ -47,6 +47,8 @@ const messages = {
47
47
  suggestionSlow: "Verlangsame die Intro-Animation",
48
48
  },
49
49
  sidebar: {
50
+ collapseSidebar: "Seitenleiste einklappen",
51
+ expandSidebar: "Seitenleiste erweitern",
50
52
  navigation: "Navigation",
51
53
  openNavigation: "Navigation öffnen",
52
54
  },
@@ -47,6 +47,8 @@ const messages = {
47
47
  suggestionSlow: "Slow down the intro animation",
48
48
  },
49
49
  sidebar: {
50
+ collapseSidebar: "Collapse sidebar",
51
+ expandSidebar: "Expand sidebar",
50
52
  navigation: "Navigation",
51
53
  openNavigation: "Open navigation",
52
54
  },
@@ -47,6 +47,8 @@ const messages = {
47
47
  suggestionSlow: "Ralentiza la animación de introducción",
48
48
  },
49
49
  sidebar: {
50
+ collapseSidebar: "Contraer barra lateral",
51
+ expandSidebar: "Expandir barra lateral",
50
52
  navigation: "Navegación",
51
53
  openNavigation: "Abrir navegación",
52
54
  },
@@ -47,6 +47,8 @@ const messages = {
47
47
  suggestionSlow: "Ralentir l’animation d’introduction",
48
48
  },
49
49
  sidebar: {
50
+ collapseSidebar: "Réduire la barre latérale",
51
+ expandSidebar: "Développer la barre latérale",
50
52
  navigation: "Navigation",
51
53
  openNavigation: "Ouvrir la navigation",
52
54
  },
@@ -46,6 +46,8 @@ const messages = {
46
46
  suggestionSlow: "इंट्रो एनिमेशन धीमा करें",
47
47
  },
48
48
  sidebar: {
49
+ collapseSidebar: "साइडबार समेटें",
50
+ expandSidebar: "साइडबार फैलाएं",
49
51
  navigation: "नेविगेशन",
50
52
  openNavigation: "नेविगेशन खोलें",
51
53
  },
@@ -47,6 +47,8 @@ const messages = {
47
47
  suggestionSlow: "イントロアニメーションを遅くする",
48
48
  },
49
49
  sidebar: {
50
+ collapseSidebar: "サイドバーを折りたたむ",
51
+ expandSidebar: "サイドバーを展開",
50
52
  navigation: "ナビゲーション",
51
53
  openNavigation: "ナビゲーションを開く",
52
54
  },
@@ -47,6 +47,8 @@ const messages = {
47
47
  suggestionSlow: "인트로 애니메이션 느리게 하기",
48
48
  },
49
49
  sidebar: {
50
+ collapseSidebar: "사이드바 접기",
51
+ expandSidebar: "사이드바 펼치기",
50
52
  navigation: "탐색",
51
53
  openNavigation: "탐색 열기",
52
54
  },
@@ -47,6 +47,8 @@ const messages = {
47
47
  suggestionSlow: "Desacelere a animação de introdução",
48
48
  },
49
49
  sidebar: {
50
+ collapseSidebar: "Recolher barra lateral",
51
+ expandSidebar: "Expandir barra lateral",
50
52
  navigation: "Navegação",
51
53
  openNavigation: "Abrir navegação",
52
54
  },
@@ -45,6 +45,8 @@ const messages = {
45
45
  suggestionSlow: "放慢开场动画",
46
46
  },
47
47
  sidebar: {
48
+ collapseSidebar: "折叠侧边栏",
49
+ expandSidebar: "展开侧边栏",
48
50
  navigation: "导航",
49
51
  openNavigation: "打开导航",
50
52
  },
@@ -45,6 +45,8 @@ const messages = {
45
45
  suggestionSlow: "放慢開場動畫",
46
46
  },
47
47
  sidebar: {
48
+ collapseSidebar: "收合側邊欄",
49
+ expandSidebar: "展開側邊欄",
48
50
  navigation: "導覽",
49
51
  openNavigation: "開啟導覽",
50
52
  },
@@ -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.
@@ -2,7 +2,7 @@
2
2
  * Public exports for the pluggable agent engine system.
3
3
  */
4
4
  export type { AgentEngine, EngineCapabilities, EngineTool, EngineMessage, EngineContentPart, EngineTextPart, EngineImagePart, EngineToolCallPart, EngineToolResultPart, EngineThinkingPart, EngineEvent, EngineStreamOptions, } from "./types.js";
5
- export { registerAgentEngine, getAgentEngineEntry, listAgentEngines, resolveEngine, getStoredModelForEngine, normalizeModelForEngine, detectEngineFromEnv, detectEngineFromUserSecrets, isAgentEngineSettingConfigured, isAgentEnginePackageInstalled, isStoredEngineUsable, isStoredEngineUsableForRequest, type AgentEngineEntry, type ResolveEngineConfig, } from "./registry.js";
5
+ export { registerAgentEngine, getAgentEngineEntry, listAgentEngines, resolveEngine, getStoredModelForEngine, normalizeModelForEngine, detectEngineFromEnv, detectEngineFromUserSecrets, isAgentEngineSettingConfigured, isAgentEnginePackageInstalled, isStoredEngineUsable, isStoredEngineUsableForRequest, isResolvedEngineUsableForRequest, type AgentEngineEntry, type ResolveEngineConfig, } from "./registry.js";
6
6
  export { createBuilderEngine, BUILDER_DEFAULT_MODEL, BUILDER_SUPPORTED_MODELS, BUILDER_CAPABILITIES, } from "./builder-engine.js";
7
7
  export { createAnthropicEngine, ANTHROPIC_DEFAULT_MODEL, ANTHROPIC_SUPPORTED_MODELS, ANTHROPIC_CAPABILITIES, } from "./anthropic-engine.js";
8
8
  export { createAISDKEngine, type AISDKProvider } from "./ai-sdk-engine.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agent/engine/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EACV,WAAW,EACX,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,WAAW,EACX,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,aAAa,EACb,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,2BAA2B,EAC3B,8BAA8B,EAC9B,6BAA6B,EAC7B,oBAAoB,EACpB,8BAA8B,EAC9B,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,GACzB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,0BAA0B,EAC1B,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agent/engine/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EACV,WAAW,EACX,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,WAAW,EACX,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,aAAa,EACb,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,2BAA2B,EAC3B,8BAA8B,EAC9B,6BAA6B,EAC7B,oBAAoB,EACpB,8BAA8B,EAC9B,gCAAgC,EAChC,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,GACzB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,0BAA0B,EAC1B,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Public exports for the pluggable agent engine system.
3
3
  */
4
- export { registerAgentEngine, getAgentEngineEntry, listAgentEngines, resolveEngine, getStoredModelForEngine, normalizeModelForEngine, detectEngineFromEnv, detectEngineFromUserSecrets, isAgentEngineSettingConfigured, isAgentEnginePackageInstalled, isStoredEngineUsable, isStoredEngineUsableForRequest, } from "./registry.js";
4
+ export { registerAgentEngine, getAgentEngineEntry, listAgentEngines, resolveEngine, getStoredModelForEngine, normalizeModelForEngine, detectEngineFromEnv, detectEngineFromUserSecrets, isAgentEngineSettingConfigured, isAgentEnginePackageInstalled, isStoredEngineUsable, isStoredEngineUsableForRequest, isResolvedEngineUsableForRequest, } from "./registry.js";
5
5
  export { createBuilderEngine, BUILDER_DEFAULT_MODEL, BUILDER_SUPPORTED_MODELS, BUILDER_CAPABILITIES, } from "./builder-engine.js";
6
6
  export { createAnthropicEngine, ANTHROPIC_DEFAULT_MODEL, ANTHROPIC_SUPPORTED_MODELS, ANTHROPIC_CAPABILITIES, } from "./anthropic-engine.js";
7
7
  export { createAISDKEngine } from "./ai-sdk-engine.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agent/engine/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiBH,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,aAAa,EACb,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,2BAA2B,EAC3B,8BAA8B,EAC9B,6BAA6B,EAC7B,oBAAoB,EACpB,8BAA8B,GAG/B,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,0BAA0B,EAC1B,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAsB,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC","sourcesContent":["/**\n * Public exports for the pluggable agent engine system.\n */\n\nexport type {\n AgentEngine,\n EngineCapabilities,\n EngineTool,\n EngineMessage,\n EngineContentPart,\n EngineTextPart,\n EngineImagePart,\n EngineToolCallPart,\n EngineToolResultPart,\n EngineThinkingPart,\n EngineEvent,\n EngineStreamOptions,\n} from \"./types.js\";\n\nexport {\n registerAgentEngine,\n getAgentEngineEntry,\n listAgentEngines,\n resolveEngine,\n getStoredModelForEngine,\n normalizeModelForEngine,\n detectEngineFromEnv,\n detectEngineFromUserSecrets,\n isAgentEngineSettingConfigured,\n isAgentEnginePackageInstalled,\n isStoredEngineUsable,\n isStoredEngineUsableForRequest,\n type AgentEngineEntry,\n type ResolveEngineConfig,\n} from \"./registry.js\";\n\nexport {\n createBuilderEngine,\n BUILDER_DEFAULT_MODEL,\n BUILDER_SUPPORTED_MODELS,\n BUILDER_CAPABILITIES,\n} from \"./builder-engine.js\";\n\nexport {\n createAnthropicEngine,\n ANTHROPIC_DEFAULT_MODEL,\n ANTHROPIC_SUPPORTED_MODELS,\n ANTHROPIC_CAPABILITIES,\n} from \"./anthropic-engine.js\";\nexport { createAISDKEngine, type AISDKProvider } from \"./ai-sdk-engine.js\";\nexport { registerBuiltinEngines } from \"./builtin.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agent/engine/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiBH,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,aAAa,EACb,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,2BAA2B,EAC3B,8BAA8B,EAC9B,6BAA6B,EAC7B,oBAAoB,EACpB,8BAA8B,EAC9B,gCAAgC,GAGjC,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,0BAA0B,EAC1B,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAsB,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC","sourcesContent":["/**\n * Public exports for the pluggable agent engine system.\n */\n\nexport type {\n AgentEngine,\n EngineCapabilities,\n EngineTool,\n EngineMessage,\n EngineContentPart,\n EngineTextPart,\n EngineImagePart,\n EngineToolCallPart,\n EngineToolResultPart,\n EngineThinkingPart,\n EngineEvent,\n EngineStreamOptions,\n} from \"./types.js\";\n\nexport {\n registerAgentEngine,\n getAgentEngineEntry,\n listAgentEngines,\n resolveEngine,\n getStoredModelForEngine,\n normalizeModelForEngine,\n detectEngineFromEnv,\n detectEngineFromUserSecrets,\n isAgentEngineSettingConfigured,\n isAgentEnginePackageInstalled,\n isStoredEngineUsable,\n isStoredEngineUsableForRequest,\n isResolvedEngineUsableForRequest,\n type AgentEngineEntry,\n type ResolveEngineConfig,\n} from \"./registry.js\";\n\nexport {\n createBuilderEngine,\n BUILDER_DEFAULT_MODEL,\n BUILDER_SUPPORTED_MODELS,\n BUILDER_CAPABILITIES,\n} from \"./builder-engine.js\";\n\nexport {\n createAnthropicEngine,\n ANTHROPIC_DEFAULT_MODEL,\n ANTHROPIC_SUPPORTED_MODELS,\n ANTHROPIC_CAPABILITIES,\n} from \"./anthropic-engine.js\";\nexport { createAISDKEngine, type AISDKProvider } from \"./ai-sdk-engine.js\";\nexport { registerBuiltinEngines } from \"./builtin.js\";\n"]}
@@ -97,6 +97,15 @@ export declare function isStoredEngineUsable(stored: unknown, entry: AgentEngine
97
97
  * when deciding whether a stored engine can actually run for the current user.
98
98
  */
99
99
  export declare function isStoredEngineUsableForRequest(stored: unknown, entry: AgentEngineEntry): Promise<boolean>;
100
+ /**
101
+ * Request-aware credential preflight for an already-resolved engine instance.
102
+ * `resolveEngine()` may still return a default or explicitly requested engine
103
+ * object before credentials are actually usable; call this before starting a
104
+ * user-visible run so missing providers fail immediately.
105
+ */
106
+ export declare function isResolvedEngineUsableForRequest(engine: AgentEngine, options?: {
107
+ apiKey?: string;
108
+ }): Promise<boolean>;
100
109
  export interface ResolveEngineConfig {
101
110
  /** Explicit engine name or instance from createAgentChatPlugin options */
102
111
  engineOption?: string | AgentEngine | {
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/agent/engine/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAgBH,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAIlE,MAAM,WAAW,gBAAgB;IAC/B,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0BAA0B;IAC1B,YAAY,EAAE,kBAAkB,CAAC;IACjC,2BAA2B;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,6DAA6D;IAC7D,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,4CAA4C;IAC5C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC;CACtD;AAKD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAajE;AAED,uEAAuE;AACvE,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,GACX,gBAAgB,GAAG,SAAS,CAE9B;AAED,yCAAyC;AACzC,wBAAgB,gBAAgB,IAAI,gBAAgB,EAAE,CAErD;AA8BD,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAOT;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,GAAG,iBAAiB,CAAC,EACtE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,MAAM,CAWR;AAYD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,GAAG,IAAI,CAyB7D;AAUD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CA8EpF;AAED;;;;;;GAMG;AACH,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAOvE;AAsDD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAKT;AAED;;;;;;;GAOG;AACH,wBAAsB,8BAA8B,CAClD,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,OAAO,CAAC,CAsBlB;AAED,MAAM,WAAW,mBAAmB;IAClC,0EAA0E;IAC1E,YAAY,CAAC,EACT,MAAM,GACN,WAAW,GACX;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IACtD,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,WAAW,CAAC,CA+HtB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,WAAW,GAAG,MAAM,EAC5B,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAgC7B"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/agent/engine/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAgBH,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAIlE,MAAM,WAAW,gBAAgB;IAC/B,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0BAA0B;IAC1B,YAAY,EAAE,kBAAkB,CAAC;IACjC,2BAA2B;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,6DAA6D;IAC7D,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,4CAA4C;IAC5C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC;CACtD;AAKD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAajE;AAED,uEAAuE;AACvE,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,GACX,gBAAgB,GAAG,SAAS,CAE9B;AAED,yCAAyC;AACzC,wBAAgB,gBAAgB,IAAI,gBAAgB,EAAE,CAErD;AA8BD,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAOT;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,GAAG,iBAAiB,CAAC,EACtE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,MAAM,CAWR;AAYD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,GAAG,IAAI,CAyB7D;AAUD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CA8EpF;AAED;;;;;;GAMG;AACH,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAOvE;AAsDD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAKT;AAED;;;;;;;GAOG;AACH,wBAAsB,8BAA8B,CAClD,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,OAAO,CAAC,CAsBlB;AAED;;;;;GAKG;AACH,wBAAsB,gCAAgC,CACpD,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAChC,OAAO,CAAC,OAAO,CAAC,CA6BlB;AAED,MAAM,WAAW,mBAAmB;IAClC,0EAA0E;IAC1E,YAAY,CAAC,EACT,MAAM,GACN,WAAW,GACX;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IACtD,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,WAAW,CAAC,CA+HtB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,WAAW,GAAG,MAAM,EAC5B,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAgC7B"}
@@ -332,6 +332,43 @@ export async function isStoredEngineUsableForRequest(stored, entry) {
332
332
  }
333
333
  return true;
334
334
  }
335
+ /**
336
+ * Request-aware credential preflight for an already-resolved engine instance.
337
+ * `resolveEngine()` may still return a default or explicitly requested engine
338
+ * object before credentials are actually usable; call this before starting a
339
+ * user-visible run so missing providers fail immediately.
340
+ */
341
+ export async function isResolvedEngineUsableForRequest(engine, options = {}) {
342
+ const entry = _registry.get(engine.name);
343
+ // Custom engines may have their own credential contract outside the core
344
+ // registry metadata, so do not block them speculatively.
345
+ if (!entry)
346
+ return true;
347
+ if (!isAgentEnginePackageInstalled(entry))
348
+ return false;
349
+ if (entry.requiredEnvVars.length === 0)
350
+ return true;
351
+ if (entry.name === "builder") {
352
+ const creds = await resolveBuilderCredentials();
353
+ return Boolean(creds.privateKey && creds.publicKey);
354
+ }
355
+ if (options.apiKey?.trim())
356
+ return true;
357
+ for (const key of entry.requiredEnvVars) {
358
+ try {
359
+ if (await resolveSecret(key))
360
+ continue;
361
+ }
362
+ catch {
363
+ // Fall through to deployment-level fallback when allowed.
364
+ }
365
+ if (!canUseDeployCredentialFallbackForRequest() ||
366
+ !readDeployCredentialEnv(key)) {
367
+ return false;
368
+ }
369
+ }
370
+ return true;
371
+ }
335
372
  /**
336
373
  * Resolve an AgentEngine from options → explicit env → app default →
337
374
  * request credentials → settings → env → default.