@agent-native/core 0.117.1 → 0.118.0

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 (815) hide show
  1. package/corpus/README.md +3 -3
  2. package/corpus/core/CHANGELOG.md +40 -0
  3. package/corpus/core/docs/content/custom-design-system.mdx +445 -0
  4. package/corpus/core/docs/content/toolkit-ui.mdx +16 -0
  5. package/corpus/core/package.json +2 -1
  6. package/corpus/core/src/a2a/types.ts +1 -0
  7. package/corpus/core/src/agent/types.ts +1 -1
  8. package/corpus/core/src/cli/context-xray-local.ts +1 -1
  9. package/corpus/core/src/client/AgentPanel.tsx +90 -107
  10. package/corpus/core/src/client/AssistantChat.tsx +30 -13
  11. package/corpus/core/src/client/CommandMenu.tsx +68 -178
  12. package/corpus/core/src/client/agent-chat-adapter.ts +3 -1
  13. package/corpus/core/src/client/app-providers.tsx +1 -1
  14. package/corpus/core/src/client/chat/message-components.tsx +116 -10
  15. package/corpus/core/src/client/chat/tool-call-display.tsx +26 -5
  16. package/corpus/core/src/client/chat/widgets/InlineExtensionWidget.tsx +14 -40
  17. package/corpus/core/src/client/components/ui/message-scroller.tsx +15 -1
  18. package/corpus/core/src/client/extensions/ExtensionViewer.tsx +4 -4
  19. package/corpus/core/src/client/extensions/ExtensionsSidebarSection.tsx +11 -11
  20. package/corpus/core/src/client/extensions/agent-native-extension-runtime.ts +1 -1
  21. package/corpus/core/src/client/extensions/delete-extension.ts +2 -2
  22. package/corpus/core/src/client/i18n.tsx +22 -0
  23. package/corpus/core/src/client/index.ts +17 -0
  24. package/corpus/core/src/client/org/OrgSwitcher.tsx +25 -1
  25. package/corpus/core/src/client/org/TeamPage.tsx +257 -153
  26. package/corpus/core/src/client/progress/RunsTray.tsx +89 -88
  27. package/corpus/core/src/client/resources/McpConnectionSuggestion.tsx +5 -2
  28. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +34 -13
  29. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +13 -0
  30. package/corpus/core/src/client/settings/DemoModeSection.tsx +6 -18
  31. package/corpus/core/src/client/settings/SecretsSection.tsx +97 -52
  32. package/corpus/core/src/client/settings/SettingsPanel.tsx +302 -254
  33. package/corpus/core/src/client/settings/SettingsTabsPage.tsx +23 -2
  34. package/corpus/core/src/client/settings/VoiceTranscriptionSection.tsx +7 -18
  35. package/corpus/core/src/client/settings/index.ts +7 -0
  36. package/corpus/core/src/client/settings/useSettingsPanelController.ts +155 -0
  37. package/corpus/core/src/client/setup-connections/BuilderConnectCard.tsx +116 -51
  38. package/corpus/core/src/client/setup-connections/index.ts +10 -0
  39. package/corpus/core/src/client/setup-connections/useBuilderConnectCardController.ts +82 -0
  40. package/corpus/core/src/client/sharing/ShareButton.tsx +71 -592
  41. package/corpus/core/src/client/sharing/ShareDialog.tsx +299 -633
  42. package/corpus/core/src/client/sharing/index.ts +42 -0
  43. package/corpus/core/src/client/sharing/share-controller-helpers.ts +318 -0
  44. package/corpus/core/src/client/sharing/useShareButtonController.ts +600 -0
  45. package/corpus/core/src/client/sharing/useShareDialogController.ts +559 -0
  46. package/corpus/core/src/client/sse-event-processor.ts +23 -0
  47. package/corpus/core/src/client/tool-display.ts +71 -0
  48. package/corpus/core/src/client/use-agent-engine-configured.ts +12 -19
  49. package/corpus/core/src/client/use-chat-threads.ts +33 -12
  50. package/corpus/core/src/db/client.ts +13 -10
  51. package/corpus/core/src/extensions/actions.ts +13 -5
  52. package/corpus/core/src/extensions/local.ts +1 -0
  53. package/corpus/core/src/extensions/routes.ts +10 -5
  54. package/corpus/core/src/extensions/schema.ts +5 -0
  55. package/corpus/core/src/extensions/slots/store.ts +14 -4
  56. package/corpus/core/src/extensions/store.ts +55 -19
  57. package/corpus/core/src/extensions/theme.ts +1 -1
  58. package/corpus/core/src/file-upload/registry.ts +9 -0
  59. package/corpus/core/src/index.browser.ts +5 -0
  60. package/corpus/core/src/index.ts +1 -0
  61. package/corpus/core/src/localization/default-messages.ts +28 -6
  62. package/corpus/core/src/mcp-client/oauth-routes.ts +16 -2
  63. package/corpus/core/src/scripts/call-agent.ts +5 -1
  64. package/corpus/core/src/server/action-discovery.ts +8 -0
  65. package/corpus/core/src/server/better-auth-instance.ts +7 -2
  66. package/corpus/core/src/server/email-template.ts +18 -0
  67. package/corpus/core/src/server/email-templates.ts +3 -0
  68. package/corpus/core/src/server/email.ts +40 -4
  69. package/corpus/core/src/server/realtime-voice.ts +1 -1
  70. package/corpus/core/src/sharing/actions/share-resource.ts +1 -0
  71. package/corpus/core/src/styles/agent-native.css +0 -24
  72. package/corpus/core/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  73. package/corpus/core/src/templates/default/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  74. package/corpus/core/src/templates/default/.agents/skills/frontend-design/SKILL.md +22 -2
  75. package/corpus/core/src/templates/default/.agents/skills/shadcn-ui/SKILL.md +28 -4
  76. package/corpus/core/src/templates/default/app/components/ui/toolkit-provider.tsx +10 -0
  77. package/corpus/core/src/templates/default/app/design-system.ts +3 -0
  78. package/corpus/core/src/templates/default/app/global.css +1 -1
  79. package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +6 -6
  80. package/corpus/core/src/templates/default/app/i18n/de-DE.ts +6 -6
  81. package/corpus/core/src/templates/default/app/i18n/en-US.ts +6 -6
  82. package/corpus/core/src/templates/default/app/i18n/es-ES.ts +6 -6
  83. package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +6 -6
  84. package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +6 -6
  85. package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +6 -6
  86. package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +6 -6
  87. package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +6 -6
  88. package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +7 -7
  89. package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +7 -7
  90. package/corpus/core/src/templates/default/app/root.tsx +5 -2
  91. package/corpus/core/src/templates/default/package.json +1 -0
  92. package/corpus/core/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  93. package/corpus/core/src/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  94. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  95. package/corpus/core/src/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  96. package/corpus/core/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +22 -2
  97. package/corpus/core/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +28 -4
  98. package/corpus/core/src/user-profile/actions/get-user-profile.ts +16 -0
  99. package/corpus/core/src/user-profile/actions/update-user-profile.ts +24 -0
  100. package/corpus/core/src/user-profile/index.ts +5 -0
  101. package/corpus/core/src/user-profile/shared.ts +14 -0
  102. package/corpus/core/src/user-profile/store.ts +50 -0
  103. package/corpus/core/src/vite/client.ts +39 -0
  104. package/corpus/templates/analytics/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  105. package/corpus/templates/analytics/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  106. package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +22 -2
  107. package/corpus/templates/analytics/.agents/skills/shadcn-ui/SKILL.md +28 -4
  108. package/corpus/templates/analytics/app/components/ui/toolkit-provider.tsx +6 -1
  109. package/corpus/templates/analytics/app/design-system.ts +3 -0
  110. package/corpus/templates/assets/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  111. package/corpus/templates/assets/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  112. package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +22 -2
  113. package/corpus/templates/assets/.agents/skills/shadcn-ui/SKILL.md +28 -4
  114. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +2 -2
  115. package/corpus/templates/assets/app/components/ui/alert.tsx +1 -0
  116. package/corpus/templates/assets/app/components/ui/toolkit-provider.tsx +6 -1
  117. package/corpus/templates/assets/app/design-system.ts +3 -0
  118. package/corpus/templates/assets/app/global.css +1 -1
  119. package/corpus/templates/assets/app/routes/brand-kits.$id_.presets.$presetId.tsx +26 -30
  120. package/corpus/templates/assets/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  121. package/corpus/templates/brain/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  122. package/corpus/templates/brain/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  123. package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +22 -2
  124. package/corpus/templates/brain/.agents/skills/shadcn-ui/SKILL.md +28 -4
  125. package/corpus/templates/brain/app/components/ui/dialog.tsx +1 -0
  126. package/corpus/templates/brain/app/components/ui/toolkit-provider.tsx +6 -1
  127. package/corpus/templates/brain/app/design-system.ts +3 -0
  128. package/corpus/templates/brain/app/global.css +2 -2
  129. package/corpus/templates/brain/app/lib/brain.ts +2 -2
  130. package/corpus/templates/brain/app/root.tsx +2 -2
  131. package/corpus/templates/brain/app/routes/sources.tsx +8 -8
  132. package/corpus/templates/brain/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  133. package/corpus/templates/calendar/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  134. package/corpus/templates/calendar/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  135. package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +22 -2
  136. package/corpus/templates/calendar/.agents/skills/shadcn-ui/SKILL.md +28 -4
  137. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +6 -2
  138. package/corpus/templates/calendar/app/components/ui/toolkit-provider.tsx +6 -1
  139. package/corpus/templates/calendar/app/design-system.ts +3 -0
  140. package/corpus/templates/calendar/app/global.css +1 -1
  141. package/corpus/templates/calendar/app/root.tsx +2 -2
  142. package/corpus/templates/calendar/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  143. package/corpus/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  144. package/corpus/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  145. package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +22 -2
  146. package/corpus/templates/chat/.agents/skills/shadcn-ui/SKILL.md +28 -4
  147. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +2 -2
  148. package/corpus/templates/chat/app/components/ui/toolkit-provider.tsx +6 -1
  149. package/corpus/templates/chat/app/design-system.ts +3 -0
  150. package/corpus/templates/chat/app/global.css +1 -1
  151. package/corpus/templates/chat/app/root.tsx +2 -2
  152. package/corpus/templates/chat/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  153. package/corpus/templates/clips/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  154. package/corpus/templates/clips/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  155. package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +22 -2
  156. package/corpus/templates/clips/.agents/skills/shadcn-ui/SKILL.md +28 -4
  157. package/corpus/templates/clips/actions/export-to-brain.ts +1 -1
  158. package/corpus/templates/clips/actions/invite-member.ts +1 -0
  159. package/corpus/templates/clips/app/components/library/library-layout.tsx +2 -2
  160. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +20 -11
  161. package/corpus/templates/clips/app/components/ui/toolkit-provider.tsx +6 -1
  162. package/corpus/templates/clips/app/design-system.ts +3 -0
  163. package/corpus/templates/clips/app/global.css +1 -1
  164. package/corpus/templates/clips/app/root.tsx +7 -2
  165. package/corpus/templates/clips/app/routes/_app.library._index.tsx +1 -1
  166. package/corpus/templates/clips/app/routes/record.tsx +2 -88
  167. package/corpus/templates/clips/changelog/2026-07-22-builder-connected-recordings-start-resumable-upload-sessions.md +6 -0
  168. package/corpus/templates/clips/changelog/2026-07-22-clip-thumbnails-now-come-from-the-recording-instead-of-the-p.md +6 -0
  169. package/corpus/templates/clips/changelog/2026-07-22-clips-emails-now-render-the-agent-native-logo-in-gmail-and-o.md +6 -0
  170. package/corpus/templates/clips/changelog/2026-07-22-dismissed-zoom-and-teams-meeting-note-prompts-now-stay-dismi.md +6 -0
  171. package/corpus/templates/clips/changelog/2026-07-22-fixed-windows-recordings-aborting-during-the-countdown.md +6 -0
  172. package/corpus/templates/clips/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  173. package/corpus/templates/clips/changelog/2026-07-22-permissions-and-rewind-controls-are-now-grouped-with-clearer.md +6 -0
  174. package/corpus/templates/clips/changelog/2026-07-22-quieter-permissions-and-rewind-controls.md +6 -0
  175. package/corpus/templates/clips/changelog/2026-07-22-the-desktop-popover-opens-centered-under-the-menu-bar-icon-o.md +6 -0
  176. package/corpus/templates/clips/desktop/src/app.tsx +100 -62
  177. package/corpus/templates/clips/desktop/src/lib/meeting-notification-dismissal.ts +31 -0
  178. package/corpus/templates/clips/desktop/src/lib/recorder.ts +4 -167
  179. package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +10 -1
  180. package/corpus/templates/clips/desktop/src/styles.css +111 -36
  181. package/corpus/templates/clips/desktop/src-tauri/src/adhoc_meetings_watcher.rs +67 -4
  182. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +11 -2
  183. package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +51 -0
  184. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +5 -1
  185. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +0 -189
  186. package/corpus/templates/clips/desktop/src-tauri/src/notifications.rs +62 -0
  187. package/corpus/templates/clips/desktop/src-tauri/src/shortcuts.rs +37 -2
  188. package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +18 -0
  189. package/corpus/templates/clips/server/plugins/db.ts +6 -2
  190. package/corpus/templates/content/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  191. package/corpus/templates/content/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  192. package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +22 -2
  193. package/corpus/templates/content/.agents/skills/shadcn-ui/SKILL.md +28 -4
  194. package/corpus/templates/content/app/components/editor/DocumentToolbar.tsx +41 -59
  195. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +41 -41
  196. package/corpus/templates/content/app/components/editor/database/GalleryView.tsx +2 -1
  197. package/corpus/templates/content/app/components/editor/database/ListView.tsx +2 -1
  198. package/corpus/templates/content/app/components/editor/database/TimelineView.tsx +9 -9
  199. package/corpus/templates/content/app/components/editor/database/sidebar.tsx +7 -7
  200. package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +11 -11
  201. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +3 -3
  202. package/corpus/templates/content/app/components/ui/checkbox.tsx +1 -0
  203. package/corpus/templates/content/app/components/ui/collapsible.tsx +1 -0
  204. package/corpus/templates/content/app/components/ui/toolkit-provider.tsx +6 -1
  205. package/corpus/templates/content/app/design-system.ts +3 -0
  206. package/corpus/templates/content/app/global.css +30 -4
  207. package/corpus/templates/content/app/root.tsx +2 -2
  208. package/corpus/templates/content/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  209. package/corpus/templates/content/changelog/2026-07-22-page-actions-are-grouped-into-the-three-dots-menu-for-a-clea.md +6 -0
  210. package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  211. package/corpus/templates/crm/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  212. package/corpus/templates/crm/app/components/crm/CreateCrmRecordDialog.tsx +10 -10
  213. package/corpus/templates/crm/app/components/crm/CrmDashboardPanel.tsx +1 -6
  214. package/corpus/templates/crm/app/components/crm/CrmSignalsPanel.tsx +3 -2
  215. package/corpus/templates/crm/app/components/crm/IntelligenceSettings.tsx +13 -12
  216. package/corpus/templates/crm/app/components/crm/RecordActions.tsx +17 -17
  217. package/corpus/templates/crm/app/components/crm/RecordGrid.tsx +8 -8
  218. package/corpus/templates/crm/app/components/crm/RecordWorkspace.tsx +3 -8
  219. package/corpus/templates/crm/app/components/crm/SavedViewDataProgram.tsx +2 -1
  220. package/corpus/templates/crm/app/components/crm/Surface.tsx +3 -2
  221. package/corpus/templates/crm/app/components/crm/WorkOverview.tsx +2 -2
  222. package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +7 -7
  223. package/corpus/templates/crm/app/components/layout/CrmSidebar.tsx +1 -1
  224. package/corpus/templates/crm/app/components/ui/alert-dialog.tsx +1 -0
  225. package/corpus/templates/crm/app/components/ui/badge.tsx +1 -0
  226. package/corpus/templates/crm/app/components/ui/button.tsx +1 -0
  227. package/corpus/templates/crm/app/components/ui/card.tsx +1 -0
  228. package/corpus/templates/crm/app/components/ui/dialog.tsx +1 -0
  229. package/corpus/templates/crm/app/components/ui/input.tsx +1 -0
  230. package/corpus/templates/crm/app/components/ui/label.tsx +1 -0
  231. package/corpus/templates/crm/app/components/ui/select.tsx +1 -0
  232. package/corpus/templates/crm/app/components/ui/sheet.tsx +1 -0
  233. package/corpus/templates/crm/app/components/ui/skeleton.tsx +1 -0
  234. package/corpus/templates/crm/app/components/ui/switch.tsx +1 -0
  235. package/corpus/templates/crm/app/components/ui/table.tsx +1 -0
  236. package/corpus/templates/crm/app/components/ui/tabs.tsx +1 -0
  237. package/corpus/templates/crm/app/components/ui/textarea.tsx +1 -0
  238. package/corpus/templates/crm/app/components/ui/toolkit-provider.tsx +17 -0
  239. package/corpus/templates/crm/app/design-system.ts +3 -0
  240. package/corpus/templates/crm/app/global.css +1 -1
  241. package/corpus/templates/crm/app/root.tsx +9 -6
  242. package/corpus/templates/crm/app/routes/dashboard.tsx +1 -1
  243. package/corpus/templates/crm/app/routes/proposals.tsx +13 -13
  244. package/corpus/templates/crm/app/routes/setup.tsx +9 -9
  245. package/corpus/templates/crm/app/routes/tasks.tsx +14 -14
  246. package/corpus/templates/crm/app/routes/views.tsx +16 -16
  247. package/corpus/templates/design/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  248. package/corpus/templates/design/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  249. package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +22 -2
  250. package/corpus/templates/design/.agents/skills/shadcn-ui/SKILL.md +28 -4
  251. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +19 -1
  252. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +12 -1
  253. package/corpus/templates/design/app/components/design/EditPanel.tsx +177 -52
  254. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +179 -59
  255. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +74 -27
  256. package/corpus/templates/design/app/components/design/multi-screen/types.ts +2 -0
  257. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +8 -8
  258. package/corpus/templates/design/app/components/layout/Sidebar.tsx +2 -2
  259. package/corpus/templates/design/app/components/ui/command.tsx +1 -0
  260. package/corpus/templates/design/app/components/ui/toolkit-provider.tsx +6 -1
  261. package/corpus/templates/design/app/design-system.ts +3 -0
  262. package/corpus/templates/design/app/global.css +1 -1
  263. package/corpus/templates/design/app/hooks/use-navigation-state.ts +6 -5
  264. package/corpus/templates/design/app/root.tsx +2 -2
  265. package/corpus/templates/design/changelog/2026-07-22-design-owners-can-keep-editing-their-designs-after-switching.md +6 -0
  266. package/corpus/templates/design/changelog/2026-07-22-inspector-tabs-keep-their-text-labels-at-narrow-widths.md +6 -0
  267. package/corpus/templates/design/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  268. package/corpus/templates/design/changelog/2026-07-22-narrow-breakpoint-previews-keep-their-device-labels-readable.md +6 -0
  269. package/corpus/templates/design/changelog/2026-07-22-removed-the-draft-status-chip-from-the-design-editor.md +6 -0
  270. package/corpus/templates/design/changelog/2026-07-22-responsive-breakpoint-controls-stay-within-narrow-sidebars.md +6 -0
  271. package/corpus/templates/design/changelog/2026-07-22-responsive-peers-now-use-a-softer-selection-highlight-withou.md +6 -0
  272. package/corpus/templates/design/changelog/2026-07-22-rotate-from-context-menu.md +6 -0
  273. package/corpus/templates/design/changelog/2026-07-22-the-selection-outline-now-stays-attached-while-moving-screen.md +6 -0
  274. package/corpus/templates/design/changelog/2026-07-22-view-only-designs-now-support-figma-style-layer-inspection-w.md +6 -0
  275. package/corpus/templates/design/server/db/index.ts +4 -0
  276. package/corpus/templates/dispatch/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  277. package/corpus/templates/dispatch/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  278. package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +22 -2
  279. package/corpus/templates/dispatch/.agents/skills/shadcn-ui/SKILL.md +28 -4
  280. package/corpus/templates/dispatch/app/components/ui/button.tsx +1 -0
  281. package/corpus/templates/dispatch/app/components/ui/toolkit-provider.tsx +17 -0
  282. package/corpus/templates/dispatch/app/design-system.ts +3 -0
  283. package/corpus/templates/dispatch/app/dispatch-extensions.tsx +2 -2
  284. package/corpus/templates/dispatch/app/global.css +1 -1
  285. package/corpus/templates/dispatch/app/root.tsx +12 -9
  286. package/corpus/templates/dispatch/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  287. package/corpus/templates/dispatch/package.json +1 -0
  288. package/corpus/templates/forms/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  289. package/corpus/templates/forms/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  290. package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +22 -2
  291. package/corpus/templates/forms/.agents/skills/shadcn-ui/SKILL.md +28 -4
  292. package/corpus/templates/forms/app/components/layout/Layout.tsx +1 -1
  293. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +3 -3
  294. package/corpus/templates/forms/app/components/ui/toolkit-provider.tsx +6 -1
  295. package/corpus/templates/forms/app/design-system.ts +3 -0
  296. package/corpus/templates/forms/app/global.css +1 -1
  297. package/corpus/templates/forms/app/hooks/use-forms.ts +55 -2
  298. package/corpus/templates/forms/app/i18n/en-US.ts +2 -0
  299. package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +3 -3
  300. package/corpus/templates/forms/app/pages/FormsListPage.tsx +23 -6
  301. package/corpus/templates/forms/app/root.tsx +2 -2
  302. package/corpus/templates/forms/changelog/2026-07-22-forms-now-archive-with-optimistic-feedback.md +6 -0
  303. package/corpus/templates/forms/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  304. package/corpus/templates/forms/server/plugins/agent-chat.ts +1 -1
  305. package/corpus/templates/macros/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  306. package/corpus/templates/macros/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  307. package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +22 -2
  308. package/corpus/templates/macros/.agents/skills/shadcn-ui/SKILL.md +28 -4
  309. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +2 -2
  310. package/corpus/templates/macros/app/components/ui/toolkit-provider.tsx +6 -1
  311. package/corpus/templates/macros/app/design-system.ts +3 -0
  312. package/corpus/templates/macros/app/root.tsx +2 -2
  313. package/corpus/templates/macros/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  314. package/corpus/templates/mail/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  315. package/corpus/templates/mail/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  316. package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +22 -2
  317. package/corpus/templates/mail/.agents/skills/shadcn-ui/SKILL.md +28 -4
  318. package/corpus/templates/mail/app/components/email/EmailThread.tsx +134 -93
  319. package/corpus/templates/mail/app/components/email/email-iframe-document.ts +8 -2
  320. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +3 -3
  321. package/corpus/templates/mail/app/components/layout/CommandPalette.tsx +2 -2
  322. package/corpus/templates/mail/app/components/ui/textarea.tsx +1 -21
  323. package/corpus/templates/mail/app/components/ui/toolkit-provider.tsx +6 -1
  324. package/corpus/templates/mail/app/design-system.ts +3 -0
  325. package/corpus/templates/mail/app/global.css +1 -1
  326. package/corpus/templates/mail/changelog/2026-07-22-email-messages-no-longer-flash-with-an-unstyled-page-while-l.md +6 -0
  327. package/corpus/templates/mail/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  328. package/corpus/templates/plan/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  329. package/corpus/templates/plan/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  330. package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +22 -2
  331. package/corpus/templates/plan/.agents/skills/shadcn-ui/SKILL.md +28 -4
  332. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +2 -2
  333. package/corpus/templates/plan/app/components/plan/PlanContentRenderer.tsx +1 -1
  334. package/corpus/templates/plan/app/components/ui/toolkit-provider.tsx +6 -1
  335. package/corpus/templates/plan/app/design-system.ts +3 -0
  336. package/corpus/templates/plan/app/global.css +1 -1
  337. package/corpus/templates/plan/app/root.tsx +2 -2
  338. package/corpus/templates/plan/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  339. package/corpus/templates/slides/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  340. package/corpus/templates/slides/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  341. package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +22 -2
  342. package/corpus/templates/slides/.agents/skills/shadcn-ui/SKILL.md +28 -4
  343. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +2 -2
  344. package/corpus/templates/slides/app/components/ui/toolkit-provider.tsx +6 -1
  345. package/corpus/templates/slides/app/design-system.ts +3 -0
  346. package/corpus/templates/slides/app/root.tsx +2 -2
  347. package/corpus/templates/slides/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  348. package/corpus/templates/slides/changelog/2026-07-22-slides-no-longer-fail-intermittently-on-fresh-server-instances.md +6 -0
  349. package/corpus/templates/slides/changelog/2026-07-22-uploaded-screenshots-can-now-be-analyzed-and-recreated-as-ed.md +6 -0
  350. package/corpus/templates/slides/server/lib/chat-attachments.ts +7 -3
  351. package/corpus/templates/slides/server/plugins/db.ts +44 -17
  352. package/corpus/templates/tasks/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  353. package/corpus/templates/tasks/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  354. package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +22 -2
  355. package/corpus/templates/tasks/.agents/skills/shadcn-ui/SKILL.md +28 -4
  356. package/corpus/templates/tasks/app/components/ui/toolkit-provider.tsx +17 -0
  357. package/corpus/templates/tasks/app/design-system.ts +3 -0
  358. package/corpus/templates/tasks/app/global.css +1 -1
  359. package/corpus/templates/tasks/app/root.tsx +5 -2
  360. package/corpus/toolkit/CHANGELOG.md +14 -0
  361. package/corpus/toolkit/agent-native.eject.json +71 -0
  362. package/corpus/toolkit/package.json +31 -1
  363. package/corpus/toolkit/src/chat-history/ChatHistoryRail.tsx +100 -39
  364. package/corpus/toolkit/src/chat-history/index.ts +9 -0
  365. package/corpus/toolkit/src/chat-history/useChatHistoryRailController.ts +76 -0
  366. package/corpus/toolkit/src/chat-history.css +2 -0
  367. package/corpus/toolkit/src/composer/ComposerPlusMenu.tsx +11 -8
  368. package/corpus/toolkit/src/composer/PromptComposer.tsx +27 -6
  369. package/corpus/toolkit/src/composer/useRealtimeVoiceMode.tsx +107 -22
  370. package/corpus/toolkit/src/conformance/__fixtures__/css-in-js-adapter.tsx +401 -0
  371. package/corpus/toolkit/src/conformance/index.ts +3 -0
  372. package/corpus/toolkit/src/conformance/runner.tsx +710 -0
  373. package/corpus/toolkit/src/conformance/types.ts +45 -0
  374. package/corpus/toolkit/src/conformance/version.ts +22 -0
  375. package/corpus/toolkit/src/design-system/components.tsx +146 -0
  376. package/corpus/toolkit/src/design-system/context.tsx +31 -0
  377. package/corpus/toolkit/src/design-system/default-adapter.tsx +915 -0
  378. package/corpus/toolkit/src/design-system/definition.ts +14 -0
  379. package/corpus/toolkit/src/design-system/error-boundary.tsx +37 -0
  380. package/corpus/toolkit/src/design-system/index.ts +7 -0
  381. package/corpus/toolkit/src/design-system/theme.ts +145 -0
  382. package/corpus/toolkit/src/design-system/types.ts +363 -0
  383. package/corpus/toolkit/src/provider.tsx +98 -5
  384. package/corpus/toolkit/src/ui/button.tsx +95 -6
  385. package/corpus/toolkit/src/ui/dialog.tsx +48 -23
  386. package/corpus/toolkit/src/ui/popover.tsx +16 -2
  387. package/corpus/toolkit/src/ui/select.tsx +7 -3
  388. package/corpus/toolkit/src/ui/sidebar.tsx +47 -48
  389. package/corpus/toolkit/src/ui/tooltip.tsx +7 -3
  390. package/dist/a2a/types.d.ts +1 -1
  391. package/dist/a2a/types.d.ts.map +1 -1
  392. package/dist/a2a/types.js.map +1 -1
  393. package/dist/agent/types.d.ts +1 -1
  394. package/dist/agent/types.d.ts.map +1 -1
  395. package/dist/agent/types.js.map +1 -1
  396. package/dist/cli/context-xray-local.js +1 -1
  397. package/dist/cli/context-xray-local.js.map +1 -1
  398. package/dist/client/AgentPanel.d.ts.map +1 -1
  399. package/dist/client/AgentPanel.js +14 -14
  400. package/dist/client/AgentPanel.js.map +1 -1
  401. package/dist/client/AssistantChat.d.ts.map +1 -1
  402. package/dist/client/AssistantChat.js +26 -15
  403. package/dist/client/AssistantChat.js.map +1 -1
  404. package/dist/client/CommandMenu.d.ts.map +1 -1
  405. package/dist/client/CommandMenu.js +18 -106
  406. package/dist/client/CommandMenu.js.map +1 -1
  407. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  408. package/dist/client/agent-chat-adapter.js +2 -1
  409. package/dist/client/agent-chat-adapter.js.map +1 -1
  410. package/dist/client/app-providers.d.ts.map +1 -1
  411. package/dist/client/app-providers.js +1 -1
  412. package/dist/client/app-providers.js.map +1 -1
  413. package/dist/client/chat/message-components.d.ts +9 -1
  414. package/dist/client/chat/message-components.d.ts.map +1 -1
  415. package/dist/client/chat/message-components.js +62 -7
  416. package/dist/client/chat/message-components.js.map +1 -1
  417. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  418. package/dist/client/chat/tool-call-display.js +20 -5
  419. package/dist/client/chat/tool-call-display.js.map +1 -1
  420. package/dist/client/chat/widgets/InlineExtensionWidget.d.ts.map +1 -1
  421. package/dist/client/chat/widgets/InlineExtensionWidget.js +9 -12
  422. package/dist/client/chat/widgets/InlineExtensionWidget.js.map +1 -1
  423. package/dist/client/components/ui/message-scroller.d.ts +1 -1
  424. package/dist/client/components/ui/message-scroller.d.ts.map +1 -1
  425. package/dist/client/components/ui/message-scroller.js +4 -3
  426. package/dist/client/components/ui/message-scroller.js.map +1 -1
  427. package/dist/client/extensions/ExtensionViewer.js +2 -2
  428. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  429. package/dist/client/extensions/ExtensionsSidebarSection.js +11 -11
  430. package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
  431. package/dist/client/extensions/agent-native-extension-runtime.js +1 -1
  432. package/dist/client/extensions/agent-native-extension-runtime.js.map +1 -1
  433. package/dist/client/extensions/delete-extension.d.ts +1 -1
  434. package/dist/client/extensions/delete-extension.d.ts.map +1 -1
  435. package/dist/client/extensions/delete-extension.js +1 -1
  436. package/dist/client/extensions/delete-extension.js.map +1 -1
  437. package/dist/client/i18n.d.ts.map +1 -1
  438. package/dist/client/i18n.js +9 -0
  439. package/dist/client/i18n.js.map +1 -1
  440. package/dist/client/index.d.ts +2 -2
  441. package/dist/client/index.d.ts.map +1 -1
  442. package/dist/client/index.js +2 -2
  443. package/dist/client/index.js.map +1 -1
  444. package/dist/client/org/OrgSwitcher.d.ts +3 -1
  445. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  446. package/dist/client/org/OrgSwitcher.js +12 -4
  447. package/dist/client/org/OrgSwitcher.js.map +1 -1
  448. package/dist/client/org/TeamPage.d.ts.map +1 -1
  449. package/dist/client/org/TeamPage.js +41 -33
  450. package/dist/client/org/TeamPage.js.map +1 -1
  451. package/dist/client/progress/RunsTray.d.ts.map +1 -1
  452. package/dist/client/progress/RunsTray.js +9 -10
  453. package/dist/client/progress/RunsTray.js.map +1 -1
  454. package/dist/client/resources/McpConnectionSuggestion.d.ts.map +1 -1
  455. package/dist/client/resources/McpConnectionSuggestion.js +5 -4
  456. package/dist/client/resources/McpConnectionSuggestion.js.map +1 -1
  457. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  458. package/dist/client/resources/McpIntegrationDialog.js +10 -8
  459. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  460. package/dist/client/resources/mcp-integration-catalog.d.ts +1 -0
  461. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  462. package/dist/client/resources/mcp-integration-catalog.js +13 -0
  463. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  464. package/dist/client/settings/DemoModeSection.d.ts.map +1 -1
  465. package/dist/client/settings/DemoModeSection.js +2 -5
  466. package/dist/client/settings/DemoModeSection.js.map +1 -1
  467. package/dist/client/settings/SecretsSection.d.ts.map +1 -1
  468. package/dist/client/settings/SecretsSection.js +18 -6
  469. package/dist/client/settings/SecretsSection.js.map +1 -1
  470. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  471. package/dist/client/settings/SettingsPanel.js +87 -119
  472. package/dist/client/settings/SettingsPanel.js.map +1 -1
  473. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  474. package/dist/client/settings/SettingsTabsPage.js +16 -1
  475. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  476. package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -1
  477. package/dist/client/settings/VoiceTranscriptionSection.js +2 -5
  478. package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
  479. package/dist/client/settings/index.d.ts +1 -0
  480. package/dist/client/settings/index.d.ts.map +1 -1
  481. package/dist/client/settings/index.js +1 -0
  482. package/dist/client/settings/index.js.map +1 -1
  483. package/dist/client/settings/useSettingsPanelController.d.ts +22 -0
  484. package/dist/client/settings/useSettingsPanelController.d.ts.map +1 -0
  485. package/dist/client/settings/useSettingsPanelController.js +103 -0
  486. package/dist/client/settings/useSettingsPanelController.js.map +1 -0
  487. package/dist/client/setup-connections/BuilderConnectCard.d.ts +14 -6
  488. package/dist/client/setup-connections/BuilderConnectCard.d.ts.map +1 -1
  489. package/dist/client/setup-connections/BuilderConnectCard.js +24 -16
  490. package/dist/client/setup-connections/BuilderConnectCard.js.map +1 -1
  491. package/dist/client/setup-connections/index.d.ts +2 -1
  492. package/dist/client/setup-connections/index.d.ts.map +1 -1
  493. package/dist/client/setup-connections/index.js +2 -1
  494. package/dist/client/setup-connections/index.js.map +1 -1
  495. package/dist/client/setup-connections/useBuilderConnectCardController.d.ts +34 -0
  496. package/dist/client/setup-connections/useBuilderConnectCardController.d.ts.map +1 -0
  497. package/dist/client/setup-connections/useBuilderConnectCardController.js +39 -0
  498. package/dist/client/setup-connections/useBuilderConnectCardController.js.map +1 -0
  499. package/dist/client/sharing/ShareButton.d.ts +5 -5
  500. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  501. package/dist/client/sharing/ShareButton.js +19 -464
  502. package/dist/client/sharing/ShareButton.js.map +1 -1
  503. package/dist/client/sharing/ShareDialog.d.ts +6 -6
  504. package/dist/client/sharing/ShareDialog.d.ts.map +1 -1
  505. package/dist/client/sharing/ShareDialog.js +69 -283
  506. package/dist/client/sharing/ShareDialog.js.map +1 -1
  507. package/dist/client/sharing/index.d.ts +3 -0
  508. package/dist/client/sharing/index.d.ts.map +1 -1
  509. package/dist/client/sharing/index.js +3 -0
  510. package/dist/client/sharing/index.js.map +1 -1
  511. package/dist/client/sharing/share-controller-helpers.d.ts +70 -0
  512. package/dist/client/sharing/share-controller-helpers.d.ts.map +1 -0
  513. package/dist/client/sharing/share-controller-helpers.js +224 -0
  514. package/dist/client/sharing/share-controller-helpers.js.map +1 -0
  515. package/dist/client/sharing/useShareButtonController.d.ts +91 -0
  516. package/dist/client/sharing/useShareButtonController.d.ts.map +1 -0
  517. package/dist/client/sharing/useShareButtonController.js +397 -0
  518. package/dist/client/sharing/useShareButtonController.js.map +1 -0
  519. package/dist/client/sharing/useShareDialogController.d.ts +109 -0
  520. package/dist/client/sharing/useShareDialogController.d.ts.map +1 -0
  521. package/dist/client/sharing/useShareDialogController.js +348 -0
  522. package/dist/client/sharing/useShareDialogController.js.map +1 -0
  523. package/dist/client/sse-event-processor.d.ts.map +1 -1
  524. package/dist/client/sse-event-processor.js +21 -0
  525. package/dist/client/sse-event-processor.js.map +1 -1
  526. package/dist/client/tool-display.d.ts +16 -0
  527. package/dist/client/tool-display.d.ts.map +1 -1
  528. package/dist/client/tool-display.js +52 -0
  529. package/dist/client/tool-display.js.map +1 -1
  530. package/dist/client/use-agent-engine-configured.d.ts +3 -2
  531. package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
  532. package/dist/client/use-agent-engine-configured.js +7 -19
  533. package/dist/client/use-agent-engine-configured.js.map +1 -1
  534. package/dist/client/use-chat-threads.d.ts.map +1 -1
  535. package/dist/client/use-chat-threads.js +21 -8
  536. package/dist/client/use-chat-threads.js.map +1 -1
  537. package/dist/collab/awareness.d.ts +2 -2
  538. package/dist/collab/awareness.d.ts.map +1 -1
  539. package/dist/db/client.d.ts +7 -7
  540. package/dist/db/client.d.ts.map +1 -1
  541. package/dist/db/client.js +13 -10
  542. package/dist/db/client.js.map +1 -1
  543. package/dist/extensions/actions.d.ts.map +1 -1
  544. package/dist/extensions/actions.js +8 -5
  545. package/dist/extensions/actions.js.map +1 -1
  546. package/dist/extensions/local.d.ts.map +1 -1
  547. package/dist/extensions/local.js +1 -0
  548. package/dist/extensions/local.js.map +1 -1
  549. package/dist/extensions/routes.d.ts.map +1 -1
  550. package/dist/extensions/routes.js +9 -4
  551. package/dist/extensions/routes.js.map +1 -1
  552. package/dist/extensions/schema.d.ts +23 -2
  553. package/dist/extensions/schema.d.ts.map +1 -1
  554. package/dist/extensions/schema.js +5 -0
  555. package/dist/extensions/schema.js.map +1 -1
  556. package/dist/extensions/slots/store.d.ts +1 -1
  557. package/dist/extensions/slots/store.d.ts.map +1 -1
  558. package/dist/extensions/slots/store.js +4 -4
  559. package/dist/extensions/slots/store.js.map +1 -1
  560. package/dist/extensions/store.d.ts +1 -0
  561. package/dist/extensions/store.d.ts.map +1 -1
  562. package/dist/extensions/store.js +38 -21
  563. package/dist/extensions/store.js.map +1 -1
  564. package/dist/extensions/theme.js +1 -1
  565. package/dist/extensions/theme.js.map +1 -1
  566. package/dist/file-upload/registry.d.ts.map +1 -1
  567. package/dist/file-upload/registry.js +9 -0
  568. package/dist/file-upload/registry.js.map +1 -1
  569. package/dist/index.browser.d.ts +1 -0
  570. package/dist/index.browser.d.ts.map +1 -1
  571. package/dist/index.browser.js +1 -0
  572. package/dist/index.browser.js.map +1 -1
  573. package/dist/index.d.ts +1 -0
  574. package/dist/index.d.ts.map +1 -1
  575. package/dist/index.js +1 -0
  576. package/dist/index.js.map +1 -1
  577. package/dist/localization/default-messages.d.ts +20 -0
  578. package/dist/localization/default-messages.d.ts.map +1 -1
  579. package/dist/localization/default-messages.js +26 -6
  580. package/dist/localization/default-messages.js.map +1 -1
  581. package/dist/mcp-client/oauth-routes.d.ts +2 -0
  582. package/dist/mcp-client/oauth-routes.d.ts.map +1 -1
  583. package/dist/mcp-client/oauth-routes.js +12 -2
  584. package/dist/mcp-client/oauth-routes.js.map +1 -1
  585. package/dist/observability/routes.d.ts +3 -3
  586. package/dist/provider-api/actions/custom-provider-registration.d.ts +3 -3
  587. package/dist/provider-api/actions/provider-api.d.ts +11 -11
  588. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  589. package/dist/scripts/call-agent.d.ts.map +1 -1
  590. package/dist/scripts/call-agent.js +5 -1
  591. package/dist/scripts/call-agent.js.map +1 -1
  592. package/dist/secrets/routes.d.ts +6 -6
  593. package/dist/server/action-discovery.d.ts.map +1 -1
  594. package/dist/server/action-discovery.js +8 -0
  595. package/dist/server/action-discovery.js.map +1 -1
  596. package/dist/server/better-auth-instance.d.ts +7 -2
  597. package/dist/server/better-auth-instance.d.ts.map +1 -1
  598. package/dist/server/better-auth-instance.js.map +1 -1
  599. package/dist/server/email-template.d.ts +3 -0
  600. package/dist/server/email-template.d.ts.map +1 -1
  601. package/dist/server/email-template.js +13 -0
  602. package/dist/server/email-template.js.map +1 -1
  603. package/dist/server/email-templates.d.ts.map +1 -1
  604. package/dist/server/email-templates.js +3 -0
  605. package/dist/server/email-templates.js.map +1 -1
  606. package/dist/server/email.d.ts.map +1 -1
  607. package/dist/server/email.js +27 -4
  608. package/dist/server/email.js.map +1 -1
  609. package/dist/server/realtime-voice.js +1 -1
  610. package/dist/server/realtime-voice.js.map +1 -1
  611. package/dist/server/transcribe-voice.d.ts +1 -1
  612. package/dist/sharing/actions/share-resource.js +1 -0
  613. package/dist/sharing/actions/share-resource.js.map +1 -1
  614. package/dist/styles/agent-native.css +0 -24
  615. package/dist/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  616. package/dist/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  617. package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +22 -2
  618. package/dist/templates/chat/.agents/skills/shadcn-ui/SKILL.md +28 -4
  619. package/dist/templates/chat/app/components/layout/Sidebar.tsx +2 -2
  620. package/dist/templates/chat/app/components/ui/toolkit-provider.tsx +6 -1
  621. package/dist/templates/chat/app/design-system.ts +3 -0
  622. package/dist/templates/chat/app/global.css +1 -1
  623. package/dist/templates/chat/app/root.tsx +2 -2
  624. package/dist/templates/chat/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  625. package/dist/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  626. package/dist/templates/default/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  627. package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +22 -2
  628. package/dist/templates/default/.agents/skills/shadcn-ui/SKILL.md +28 -4
  629. package/dist/templates/default/app/components/ui/toolkit-provider.tsx +10 -0
  630. package/dist/templates/default/app/design-system.ts +3 -0
  631. package/dist/templates/default/app/global.css +1 -1
  632. package/dist/templates/default/app/i18n/ar-SA.ts +6 -6
  633. package/dist/templates/default/app/i18n/de-DE.ts +6 -6
  634. package/dist/templates/default/app/i18n/en-US.ts +6 -6
  635. package/dist/templates/default/app/i18n/es-ES.ts +6 -6
  636. package/dist/templates/default/app/i18n/fr-FR.ts +6 -6
  637. package/dist/templates/default/app/i18n/hi-IN.ts +6 -6
  638. package/dist/templates/default/app/i18n/ja-JP.ts +6 -6
  639. package/dist/templates/default/app/i18n/ko-KR.ts +6 -6
  640. package/dist/templates/default/app/i18n/pt-BR.ts +6 -6
  641. package/dist/templates/default/app/i18n/zh-CN.ts +7 -7
  642. package/dist/templates/default/app/i18n/zh-TW.ts +7 -7
  643. package/dist/templates/default/app/root.tsx +5 -2
  644. package/dist/templates/default/package.json +1 -0
  645. package/dist/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  646. package/dist/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  647. package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  648. package/dist/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  649. package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +22 -2
  650. package/dist/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +28 -4
  651. package/dist/user-profile/actions/get-user-profile.d.ts +4 -0
  652. package/dist/user-profile/actions/get-user-profile.d.ts.map +1 -0
  653. package/dist/user-profile/actions/get-user-profile.js +14 -0
  654. package/dist/user-profile/actions/get-user-profile.js.map +1 -0
  655. package/dist/user-profile/actions/update-user-profile.d.ts +6 -0
  656. package/dist/user-profile/actions/update-user-profile.d.ts.map +1 -0
  657. package/dist/user-profile/actions/update-user-profile.js +20 -0
  658. package/dist/user-profile/actions/update-user-profile.js.map +1 -0
  659. package/dist/user-profile/index.d.ts +2 -0
  660. package/dist/user-profile/index.d.ts.map +1 -0
  661. package/dist/user-profile/index.js +2 -0
  662. package/dist/user-profile/index.js.map +1 -0
  663. package/dist/user-profile/shared.d.ts +7 -0
  664. package/dist/user-profile/shared.d.ts.map +1 -0
  665. package/dist/user-profile/shared.js +6 -0
  666. package/dist/user-profile/shared.js.map +1 -0
  667. package/dist/user-profile/store.d.ts +4 -0
  668. package/dist/user-profile/store.d.ts.map +1 -0
  669. package/dist/user-profile/store.js +38 -0
  670. package/dist/user-profile/store.js.map +1 -0
  671. package/dist/vite/client.d.ts +3 -0
  672. package/dist/vite/client.d.ts.map +1 -1
  673. package/dist/vite/client.js +31 -0
  674. package/dist/vite/client.js.map +1 -1
  675. package/docs/content/custom-design-system.mdx +445 -0
  676. package/docs/content/toolkit-ui.mdx +16 -0
  677. package/package.json +3 -2
  678. package/src/a2a/types.ts +1 -0
  679. package/src/agent/types.ts +1 -1
  680. package/src/cli/context-xray-local.ts +1 -1
  681. package/src/client/AgentPanel.tsx +90 -107
  682. package/src/client/AssistantChat.tsx +30 -13
  683. package/src/client/CommandMenu.tsx +68 -178
  684. package/src/client/agent-chat-adapter.ts +3 -1
  685. package/src/client/app-providers.tsx +1 -1
  686. package/src/client/chat/message-components.tsx +116 -10
  687. package/src/client/chat/tool-call-display.tsx +26 -5
  688. package/src/client/chat/widgets/InlineExtensionWidget.tsx +14 -40
  689. package/src/client/components/ui/message-scroller.tsx +15 -1
  690. package/src/client/extensions/ExtensionViewer.tsx +4 -4
  691. package/src/client/extensions/ExtensionsSidebarSection.tsx +11 -11
  692. package/src/client/extensions/agent-native-extension-runtime.ts +1 -1
  693. package/src/client/extensions/delete-extension.ts +2 -2
  694. package/src/client/i18n.tsx +22 -0
  695. package/src/client/index.ts +17 -0
  696. package/src/client/org/OrgSwitcher.tsx +25 -1
  697. package/src/client/org/TeamPage.tsx +257 -153
  698. package/src/client/progress/RunsTray.tsx +89 -88
  699. package/src/client/resources/McpConnectionSuggestion.tsx +5 -2
  700. package/src/client/resources/McpIntegrationDialog.tsx +34 -13
  701. package/src/client/resources/mcp-integration-catalog.ts +13 -0
  702. package/src/client/settings/DemoModeSection.tsx +6 -18
  703. package/src/client/settings/SecretsSection.tsx +97 -52
  704. package/src/client/settings/SettingsPanel.tsx +302 -254
  705. package/src/client/settings/SettingsTabsPage.tsx +23 -2
  706. package/src/client/settings/VoiceTranscriptionSection.tsx +7 -18
  707. package/src/client/settings/index.ts +7 -0
  708. package/src/client/settings/useSettingsPanelController.ts +155 -0
  709. package/src/client/setup-connections/BuilderConnectCard.tsx +116 -51
  710. package/src/client/setup-connections/index.ts +10 -0
  711. package/src/client/setup-connections/useBuilderConnectCardController.ts +82 -0
  712. package/src/client/sharing/ShareButton.tsx +71 -592
  713. package/src/client/sharing/ShareDialog.tsx +299 -633
  714. package/src/client/sharing/index.ts +42 -0
  715. package/src/client/sharing/share-controller-helpers.ts +318 -0
  716. package/src/client/sharing/useShareButtonController.ts +600 -0
  717. package/src/client/sharing/useShareDialogController.ts +559 -0
  718. package/src/client/sse-event-processor.ts +23 -0
  719. package/src/client/tool-display.ts +71 -0
  720. package/src/client/use-agent-engine-configured.ts +12 -19
  721. package/src/client/use-chat-threads.ts +33 -12
  722. package/src/db/client.ts +13 -10
  723. package/src/extensions/actions.ts +13 -5
  724. package/src/extensions/local.ts +1 -0
  725. package/src/extensions/routes.ts +10 -5
  726. package/src/extensions/schema.ts +5 -0
  727. package/src/extensions/slots/store.ts +14 -4
  728. package/src/extensions/store.ts +55 -19
  729. package/src/extensions/theme.ts +1 -1
  730. package/src/file-upload/registry.ts +9 -0
  731. package/src/index.browser.ts +5 -0
  732. package/src/index.ts +1 -0
  733. package/src/localization/default-messages.ts +28 -6
  734. package/src/mcp-client/oauth-routes.ts +16 -2
  735. package/src/scripts/call-agent.ts +5 -1
  736. package/src/server/action-discovery.ts +8 -0
  737. package/src/server/better-auth-instance.ts +7 -2
  738. package/src/server/email-template.ts +18 -0
  739. package/src/server/email-templates.ts +3 -0
  740. package/src/server/email.ts +40 -4
  741. package/src/server/realtime-voice.ts +1 -1
  742. package/src/sharing/actions/share-resource.ts +1 -0
  743. package/src/styles/agent-native.css +0 -24
  744. package/src/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  745. package/src/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  746. package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +22 -2
  747. package/src/templates/chat/.agents/skills/shadcn-ui/SKILL.md +28 -4
  748. package/src/templates/chat/app/components/layout/Sidebar.tsx +2 -2
  749. package/src/templates/chat/app/components/ui/toolkit-provider.tsx +6 -1
  750. package/src/templates/chat/app/design-system.ts +3 -0
  751. package/src/templates/chat/app/global.css +1 -1
  752. package/src/templates/chat/app/root.tsx +2 -2
  753. package/src/templates/chat/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  754. package/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  755. package/src/templates/default/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  756. package/src/templates/default/.agents/skills/frontend-design/SKILL.md +22 -2
  757. package/src/templates/default/.agents/skills/shadcn-ui/SKILL.md +28 -4
  758. package/src/templates/default/app/components/ui/toolkit-provider.tsx +10 -0
  759. package/src/templates/default/app/design-system.ts +3 -0
  760. package/src/templates/default/app/global.css +1 -1
  761. package/src/templates/default/app/i18n/ar-SA.ts +6 -6
  762. package/src/templates/default/app/i18n/de-DE.ts +6 -6
  763. package/src/templates/default/app/i18n/en-US.ts +6 -6
  764. package/src/templates/default/app/i18n/es-ES.ts +6 -6
  765. package/src/templates/default/app/i18n/fr-FR.ts +6 -6
  766. package/src/templates/default/app/i18n/hi-IN.ts +6 -6
  767. package/src/templates/default/app/i18n/ja-JP.ts +6 -6
  768. package/src/templates/default/app/i18n/ko-KR.ts +6 -6
  769. package/src/templates/default/app/i18n/pt-BR.ts +6 -6
  770. package/src/templates/default/app/i18n/zh-CN.ts +7 -7
  771. package/src/templates/default/app/i18n/zh-TW.ts +7 -7
  772. package/src/templates/default/app/root.tsx +5 -2
  773. package/src/templates/default/package.json +1 -0
  774. package/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  775. package/src/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  776. package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  777. package/src/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  778. package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +22 -2
  779. package/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +28 -4
  780. package/src/user-profile/actions/get-user-profile.ts +16 -0
  781. package/src/user-profile/actions/update-user-profile.ts +24 -0
  782. package/src/user-profile/index.ts +5 -0
  783. package/src/user-profile/shared.ts +14 -0
  784. package/src/user-profile/store.ts +50 -0
  785. package/src/vite/client.ts +39 -0
  786. package/corpus/templates/analytics/app/components/ui/calendar.tsx +0 -70
  787. package/corpus/templates/analytics/app/components/ui/chart.tsx +0 -386
  788. package/corpus/templates/calendar/app/components/ui/sonner.tsx +0 -58
  789. package/corpus/templates/forms/app/components/ui/calendar.tsx +0 -214
  790. package/corpus/templates/forms/app/components/ui/chart.tsx +0 -379
  791. package/corpus/templates/forms/app/components/ui/command.tsx +0 -153
  792. package/corpus/templates/forms/app/components/ui/context-menu.tsx +0 -198
  793. package/corpus/templates/forms/app/components/ui/menubar.tsx +0 -254
  794. package/corpus/templates/macros/app/components/ui/menubar.tsx +0 -238
  795. package/corpus/templates/macros/app/components/ui/progress.tsx +0 -26
  796. package/corpus/templates/mail/app/components/ui/calendar.tsx +0 -211
  797. package/corpus/templates/mail/app/components/ui/chart.tsx +0 -379
  798. package/corpus/templates/mail/app/components/ui/command.tsx +0 -153
  799. package/corpus/templates/mail/app/components/ui/context-menu.tsx +0 -198
  800. package/corpus/templates/mail/app/components/ui/menubar.tsx +0 -254
  801. package/corpus/templates/tasks/app/components/ui/accordion.tsx +0 -56
  802. package/corpus/templates/tasks/app/components/ui/aspect-ratio.tsx +0 -5
  803. package/corpus/templates/tasks/app/components/ui/breadcrumb.tsx +0 -115
  804. package/corpus/templates/tasks/app/components/ui/calendar.tsx +0 -70
  805. package/corpus/templates/tasks/app/components/ui/carousel.tsx +0 -260
  806. package/corpus/templates/tasks/app/components/ui/chart.tsx +0 -379
  807. package/corpus/templates/tasks/app/components/ui/form.tsx +0 -177
  808. package/corpus/templates/tasks/app/components/ui/hover-card.tsx +0 -27
  809. package/corpus/templates/tasks/app/components/ui/input-otp.tsx +0 -69
  810. package/corpus/templates/tasks/app/components/ui/menubar.tsx +0 -254
  811. package/corpus/templates/tasks/app/components/ui/navigation-menu.tsx +0 -128
  812. package/corpus/templates/tasks/app/components/ui/pagination.tsx +0 -121
  813. package/corpus/templates/tasks/app/components/ui/resizable.tsx +0 -43
  814. package/corpus/templates/tasks/app/components/ui/sidebar.tsx +0 -782
  815. package/corpus/templates/tasks/app/components/ui/toggle.tsx +0 -43
@@ -1,4 +1,9 @@
1
- import * as SelectPrimitive from "@radix-ui/react-select";
1
+ import {
2
+ Checkbox,
3
+ Picker,
4
+ TextField,
5
+ } from "@agent-native/toolkit/design-system";
6
+ import { Button as ToolkitButton } from "@agent-native/toolkit/ui/button";
2
7
  import {
3
8
  IconChevronDown,
4
9
  IconChevronRight,
@@ -35,8 +40,10 @@ import React, {
35
40
  useMemo,
36
41
  useRef,
37
42
  } from "react";
43
+ import { Link } from "react-router";
38
44
 
39
45
  import { PROVIDER_ENV_PLACEHOLDERS } from "../../agent/engine/provider-env-vars.js";
46
+ import type { UserProfile } from "../../user-profile/shared.js";
40
47
  import { saveAgentEngineProviderSettings } from "../agent-engine-key.js";
41
48
  import { agentNativePath } from "../api-path.js";
42
49
  import { BuilderBMark } from "../builder-mark.js";
@@ -45,9 +52,14 @@ import {
45
52
  TooltipContent,
46
53
  TooltipTrigger,
47
54
  } from "../components/ui/tooltip.js";
55
+ import { useT } from "../i18n.js";
48
56
  import { TeamPage } from "../org/TeamPage.js";
49
57
  import { BuilderConnectCard } from "../setup-connections/BuilderConnectCard.js";
50
- import { callAction } from "../use-action.js";
58
+ import {
59
+ useActionMutation,
60
+ useActionQuery,
61
+ callAction,
62
+ } from "../use-action.js";
51
63
  import { uploadAvatar, useAvatarUrl } from "../use-avatar.js";
52
64
  import { useDevMode } from "../use-dev-mode.js";
53
65
  import { useSession } from "../use-session.js";
@@ -56,7 +68,6 @@ import {
56
68
  AGENT_SETTINGS_SECTIONS,
57
69
  ALL_SETTINGS_SECTIONS,
58
70
  CONNECTION_SETTINGS_SECTIONS,
59
- SETTINGS_SECTION_IDS,
60
71
  WORKSPACE_SETTINGS_SECTIONS,
61
72
  getAgentSettingsSearchTabs,
62
73
  type SettingsSectionId,
@@ -78,8 +89,28 @@ import {
78
89
  useBuilderConnectFlow,
79
90
  useBuilderStatus,
80
91
  } from "./useBuilderStatus.js";
92
+ import {
93
+ settingsSectionDomId,
94
+ useSettingsPanelController,
95
+ } from "./useSettingsPanelController.js";
81
96
  import { VoiceTranscriptionSection } from "./VoiceTranscriptionSection.js";
82
97
 
98
+ const Button = React.forwardRef<
99
+ HTMLButtonElement,
100
+ React.ComponentPropsWithoutRef<typeof ToolkitButton>
101
+ >(({ className, ...props }, ref) => (
102
+ <ToolkitButton
103
+ ref={ref}
104
+ variant="ghost"
105
+ className={cn(
106
+ "h-auto p-0 hover:bg-transparent hover:text-inherit active:scale-100 [&_svg]:!size-auto",
107
+ className,
108
+ )}
109
+ {...props}
110
+ />
111
+ ));
112
+ Button.displayName = "SettingsPrimitiveButton";
113
+
83
114
  const IntegrationsPanel = lazy(() =>
84
115
  import("../integrations/IntegrationsPanel.js").then((m) => ({
85
116
  default: m.IntegrationsPanel,
@@ -183,7 +214,6 @@ function SettingsSelect({
183
214
  }) {
184
215
  const isPage = useSettingsSurface() === "page";
185
216
  const controlStyle = isPage ? CONTROL_STYLE_PAGE : CONTROL_STYLE;
186
- const selected = options.find((option) => option.value === value);
187
217
 
188
218
  return (
189
219
  <div className="space-y-1.5">
@@ -191,69 +221,27 @@ function SettingsSelect({
191
221
  <p className={fieldLabelClass(isPage)}>{label}</p>
192
222
  {labelAdornment}
193
223
  </div>
194
- <SelectPrimitive.Root
224
+ <Picker
225
+ mode="select"
226
+ options={options.map((option) => ({
227
+ value: option.value,
228
+ label: option.label,
229
+ description: option.description,
230
+ textValue: option.label,
231
+ }))}
195
232
  value={value}
196
- onValueChange={onValueChange}
233
+ onChange={(next) => {
234
+ if (next != null) onValueChange(String(next));
235
+ }}
197
236
  disabled={disabled}
198
- >
199
- <SelectPrimitive.Trigger
200
- className={cn(
201
- "flex w-full items-center justify-between rounded-md border border-border bg-background px-3 text-start text-foreground outline-none transition-colors hover:bg-accent/40 data-[placeholder]:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-60",
202
- isPage ? "h-10 text-sm" : "h-9 text-[12px]",
203
- )}
204
- aria-label={label}
205
- style={controlStyle}
206
- >
207
- <SelectPrimitive.Value>
208
- {selected?.label ?? value}
209
- </SelectPrimitive.Value>
210
- <SelectPrimitive.Icon asChild>
211
- <IconChevronDown size={16} className="text-muted-foreground" />
212
- </SelectPrimitive.Icon>
213
- </SelectPrimitive.Trigger>
214
- <SelectPrimitive.Portal>
215
- <SelectPrimitive.Content
216
- position="popper"
217
- sideOffset={6}
218
- className="z-[9999] w-[var(--radix-select-trigger-width)] overflow-hidden rounded-lg border border-border bg-popover shadow-lg"
219
- >
220
- <SelectPrimitive.Viewport className="p-1">
221
- {options.map((option) => (
222
- <SelectPrimitive.Item
223
- key={option.value}
224
- value={option.value}
225
- className={cn(
226
- "relative flex w-full cursor-pointer select-none items-start gap-2 rounded-md px-8 outline-none data-[highlighted]:bg-accent/60 data-[state=checked]:bg-accent/40",
227
- isPage ? "py-2.5 text-sm" : "py-2.5 text-[12px]",
228
- )}
229
- style={controlStyle}
230
- >
231
- <span className="absolute start-2 top-2.5 flex h-4 w-4 items-center justify-center text-muted-foreground">
232
- <SelectPrimitive.ItemIndicator>
233
- <IconCheck size={14} />
234
- </SelectPrimitive.ItemIndicator>
235
- </span>
236
- <div className="flex min-w-0 flex-col">
237
- <SelectPrimitive.ItemText>
238
- <span className="text-foreground">{option.label}</span>
239
- </SelectPrimitive.ItemText>
240
- {option.description ? (
241
- <span
242
- className={cn(
243
- "mt-0.5 leading-relaxed text-muted-foreground",
244
- isPage ? "text-xs" : "text-[11px]",
245
- )}
246
- >
247
- {option.description}
248
- </span>
249
- ) : null}
250
- </div>
251
- </SelectPrimitive.Item>
252
- ))}
253
- </SelectPrimitive.Viewport>
254
- </SelectPrimitive.Content>
255
- </SelectPrimitive.Portal>
256
- </SelectPrimitive.Root>
237
+ aria-label={label}
238
+ placeholder={value}
239
+ style={controlStyle}
240
+ className={cn(
241
+ "w-full text-start text-foreground",
242
+ isPage ? "text-sm" : "text-[12px]",
243
+ )}
244
+ />
257
245
  </div>
258
246
  );
259
247
  }
@@ -369,28 +357,34 @@ function DisconnectBuilderButton() {
369
357
  if (phase === "armed") {
370
358
  return (
371
359
  <>
372
- <button
360
+ <Button
373
361
  type="button"
362
+ intent="danger"
363
+ emphasis="solid"
374
364
  onClick={handleDisconnectClick}
375
365
  className="inline-flex items-center gap-1 rounded border border-destructive/40 bg-destructive/10 px-2 py-0.5 text-[10px] font-medium text-destructive hover:bg-destructive/20"
376
366
  >
377
367
  Confirm disconnect
378
- </button>
379
- <button
368
+ </Button>
369
+ <Button
380
370
  type="button"
371
+ intent="neutral"
372
+ emphasis="outline"
381
373
  onClick={handleCancel}
382
374
  className="inline-flex items-center gap-1 rounded border border-border px-2 py-0.5 text-[10px] text-muted-foreground hover:text-foreground hover:bg-accent/40"
383
375
  >
384
376
  Cancel
385
- </button>
377
+ </Button>
386
378
  </>
387
379
  );
388
380
  }
389
381
 
390
382
  return (
391
383
  <>
392
- <button
384
+ <Button
393
385
  type="button"
386
+ intent="danger"
387
+ emphasis="outline"
394
388
  onClick={handleDisconnectClick}
395
389
  disabled={phase === "busy"}
396
390
  className="inline-flex items-center gap-1 rounded border border-border px-2 py-0.5 text-[10px] text-muted-foreground hover:text-foreground hover:bg-accent/40 disabled:opacity-60 disabled:cursor-wait"
@@ -404,7 +398,7 @@ function DisconnectBuilderButton() {
404
398
  ) : (
405
399
  "Disconnect"
406
400
  )}
407
- </button>
401
+ </Button>
408
402
  {err && <span className="text-[10px] text-destructive">{err}</span>}
409
403
  </>
410
404
  );
@@ -479,8 +473,10 @@ function UseBuilderCard({
479
473
  {connectUrl || credentialSource !== "env" ? (
480
474
  <div className="flex items-center gap-2 mt-2.5">
481
475
  {connectUrl && (
482
- <button
476
+ <Button
483
477
  type="button"
478
+ intent="neutral"
479
+ emphasis="ghost"
484
480
  onClick={() =>
485
481
  builderFlow.start({ trackingSource, trackingFlow })
486
482
  }
@@ -493,7 +489,7 @@ function UseBuilderCard({
493
489
  ? "Connect account"
494
490
  : "Reconnect"}
495
491
  <IconExternalLink size={isPage ? 14 : 10} />
496
- </button>
492
+ </Button>
497
493
  )}
498
494
  {credentialSource !== "env" ? <DisconnectBuilderButton /> : null}
499
495
  </div>
@@ -505,13 +501,14 @@ function UseBuilderCard({
505
501
  if (!connectUrl) return null;
506
502
 
507
503
  return (
508
- <button
504
+ <Button
509
505
  type="button"
510
506
  onClick={() => builderFlow.start({ trackingSource, trackingFlow })}
511
507
  disabled={builderFlow.connecting}
512
508
  className={cn(
513
509
  "block w-full rounded-md border border-border text-start no-underline bg-gradient-to-br from-teal-500/10 via-transparent to-transparent hover:border-foreground/30 transition-colors disabled:cursor-wait disabled:opacity-70",
514
510
  isPage ? "px-4 py-3.5" : "px-3 py-3",
511
+ isPage ? "[&_svg]:!size-4" : "[&_svg]:!size-3.5",
515
512
  )}
516
513
  >
517
514
  <div className="flex items-start gap-2.5">
@@ -559,7 +556,7 @@ function UseBuilderCard({
559
556
  className="shrink-0 text-muted-foreground mt-0.5"
560
557
  />
561
558
  </div>
562
- </button>
559
+ </Button>
563
560
  );
564
561
  }
565
562
 
@@ -760,19 +757,21 @@ export function AppDefaultModelField({
760
757
  return (
761
758
  <div className="space-y-1.5">
762
759
  <p className={fieldLabelClass(isPage)}>Model</p>
763
- <input
764
- type="text"
765
- list={`app-model-suggestions-${engine}`}
760
+ <TextField
766
761
  value={value}
762
+ onChange={onValueChange}
767
763
  disabled={disabled}
768
- onChange={(event) => onValueChange(event.target.value)}
764
+ list={`app-model-suggestions-${engine}`}
769
765
  onKeyDown={(event) => {
770
766
  if (event.key === "Enter") onEnter?.();
771
767
  }}
772
768
  placeholder={defaultModel ?? "model-id"}
773
- spellCheck={false}
774
769
  autoComplete="off"
775
- className={cn(textInputClass(isPage), "disabled:opacity-60")}
770
+ aria-label="Model"
771
+ className={cn(
772
+ "w-full disabled:opacity-60",
773
+ isPage ? "text-sm" : "text-[12px]",
774
+ )}
776
775
  style={isPage ? CONTROL_STYLE_PAGE : CONTROL_STYLE}
777
776
  />
778
777
  {modelOptions.length > 0 && (
@@ -1174,7 +1173,7 @@ function LLMSectionInner({
1174
1173
 
1175
1174
  {isOpenAiEngine && (
1176
1175
  <div className="border-t border-border/70 pt-2">
1177
- <button
1176
+ <Button
1178
1177
  type="button"
1179
1178
  onClick={() => setAdvancedOpen((v) => !v)}
1180
1179
  className="flex w-full cursor-pointer items-center justify-between gap-2 rounded px-0.5 py-1 text-left hover:text-foreground"
@@ -1193,7 +1192,7 @@ function LLMSectionInner({
1193
1192
  <span className="truncate text-[10px] text-muted-foreground">
1194
1193
  OpenAI-compatible endpoint
1195
1194
  </span>
1196
- </button>
1195
+ </Button>
1197
1196
 
1198
1197
  {advancedOpen && (
1199
1198
  <div className="mt-1.5 space-y-1.5">
@@ -1232,21 +1231,23 @@ function LLMSectionInner({
1232
1231
  </p>
1233
1232
  {baseUrlConfigured && (
1234
1233
  <label className="flex items-center gap-1.5 text-[10px] text-muted-foreground">
1235
- <input
1236
- type="checkbox"
1234
+ <Checkbox
1237
1235
  checked={clearBaseUrl}
1238
- onChange={(e) => {
1239
- setClearBaseUrl(e.target.checked);
1240
- if (e.target.checked) setBaseUrl("");
1236
+ onChange={(checked) => {
1237
+ setClearBaseUrl(checked);
1238
+ if (checked) setBaseUrl("");
1241
1239
  }}
1242
- className="h-3 w-3 accent-current"
1240
+ aria-label="Clear saved endpoint override"
1241
+ className="shrink-0"
1243
1242
  />
1244
1243
  Clear saved endpoint override
1245
1244
  </label>
1246
1245
  )}
1247
1246
  {envVar && envConfigured && endpointChanged && (
1248
- <button
1247
+ <Button
1249
1248
  type="button"
1249
+ intent="neutral"
1250
+ emphasis="solid"
1250
1251
  onClick={handleSave}
1251
1252
  disabled={saving}
1252
1253
  className="rounded bg-accent px-2.5 py-1 text-[10px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40"
@@ -1258,7 +1259,7 @@ function LLMSectionInner({
1258
1259
  ) : (
1259
1260
  "Save endpoint"
1260
1261
  )}
1261
- </button>
1262
+ </Button>
1262
1263
  )}
1263
1264
  </div>
1264
1265
  )}
@@ -1288,7 +1289,9 @@ function LLMSectionInner({
1288
1289
  className={cn(textInputClass(isPage), "flex-1")}
1289
1290
  style={isPage ? CONTROL_STYLE_PAGE : undefined}
1290
1291
  />
1291
- <button
1292
+ <Button
1293
+ intent="primary"
1294
+ emphasis="solid"
1292
1295
  onClick={handleSave}
1293
1296
  disabled={!providerSettingsChanged || saving}
1294
1297
  className={pillButtonClass(isPage, "solid")}
@@ -1303,12 +1306,14 @@ function LLMSectionInner({
1303
1306
  ) : (
1304
1307
  "Save"
1305
1308
  )}
1306
- </button>
1309
+ </Button>
1307
1310
  </div>
1308
1311
  ) : null}
1309
1312
 
1310
1313
  <div className="flex items-center gap-2">
1311
- <button
1314
+ <Button
1315
+ intent="neutral"
1316
+ emphasis="outline"
1312
1317
  onClick={handleTest}
1313
1318
  disabled={testing}
1314
1319
  className={pillButtonClass(isPage, "outline")}
@@ -1324,19 +1329,23 @@ function LLMSectionInner({
1324
1329
  ) : (
1325
1330
  "Test"
1326
1331
  )}
1327
- </button>
1332
+ </Button>
1328
1333
  {engineChanged && (
1329
- <button
1334
+ <Button
1335
+ intent="primary"
1336
+ emphasis="solid"
1330
1337
  onClick={handleApply}
1331
1338
  className={pillButtonClass(isPage, "solid")}
1332
1339
  >
1333
1340
  Apply
1334
- </button>
1341
+ </Button>
1335
1342
  )}
1336
1343
  {settingsStatus != null && (
1337
1344
  <Tooltip>
1338
1345
  <TooltipTrigger asChild>
1339
- <button
1346
+ <Button
1347
+ intent="danger"
1348
+ emphasis="outline"
1340
1349
  onClick={handleDisconnect}
1341
1350
  className={cn(
1342
1351
  pillButtonClass(isPage, "outline"),
@@ -1344,7 +1353,7 @@ function LLMSectionInner({
1344
1353
  )}
1345
1354
  >
1346
1355
  Disconnect
1347
- </button>
1356
+ </Button>
1348
1357
  </TooltipTrigger>
1349
1358
  <TooltipContent>
1350
1359
  Clear the saved engine — the app will fall back to the
@@ -1657,8 +1666,10 @@ function AppModelDefaultsSectionInner({
1657
1666
  />
1658
1667
 
1659
1668
  <div className="flex items-center gap-1.5">
1660
- <button
1669
+ <Button
1661
1670
  type="button"
1671
+ intent="primary"
1672
+ emphasis="solid"
1662
1673
  onClick={save}
1663
1674
  disabled={!hasPendingChange || saving}
1664
1675
  className={pillButtonClass(isPage, "solid")}
@@ -1673,15 +1684,17 @@ function AppModelDefaultsSectionInner({
1673
1684
  ) : (
1674
1685
  "Save"
1675
1686
  )}
1676
- </button>
1677
- <button
1687
+ </Button>
1688
+ <Button
1678
1689
  type="button"
1690
+ intent="neutral"
1691
+ emphasis="outline"
1679
1692
  onClick={reset}
1680
1693
  disabled={!settings.canUpdate || !hasAppDefault || saving}
1681
1694
  className={pillButtonClass(isPage, "outline")}
1682
1695
  >
1683
1696
  Reset
1684
- </button>
1697
+ </Button>
1685
1698
  </div>
1686
1699
  </div>
1687
1700
 
@@ -1833,27 +1846,17 @@ function EmailSectionInner({
1833
1846
  <SettingsSkeleton lines={2} />
1834
1847
  ) : (
1835
1848
  <div className="space-y-2">
1836
- <label className="block space-y-1">
1837
- <span
1838
- className={cn(
1839
- "uppercase tracking-wide text-muted-foreground",
1840
- noteTextClass(isPage),
1841
- )}
1842
- >
1843
- Provider
1844
- </span>
1845
- <select
1846
- value={emailProvider}
1847
- onChange={(e) =>
1848
- setEmailProvider(e.target.value as "resend" | "sendgrid")
1849
- }
1850
- className={cn(textInputClass(isPage), "w-full")}
1851
- style={isPage ? CONTROL_STYLE_PAGE : undefined}
1852
- >
1853
- <option value="resend">Resend</option>
1854
- <option value="sendgrid">SendGrid</option>
1855
- </select>
1856
- </label>
1849
+ <SettingsSelect
1850
+ label="Provider"
1851
+ value={emailProvider}
1852
+ options={[
1853
+ { value: "resend", label: "Resend" },
1854
+ { value: "sendgrid", label: "SendGrid" },
1855
+ ]}
1856
+ onValueChange={(value) =>
1857
+ setEmailProvider(value as "resend" | "sendgrid")
1858
+ }
1859
+ />
1857
1860
 
1858
1861
  {emailProvider === "resend" ? (
1859
1862
  <ManualSetupCard
@@ -1883,7 +1886,9 @@ function EmailSectionInner({
1883
1886
  placeholder="re_..."
1884
1887
  className={emailInputCls}
1885
1888
  />
1886
- <button
1889
+ <Button
1890
+ intent="primary"
1891
+ emphasis="solid"
1887
1892
  onClick={saveResend}
1888
1893
  disabled={!resendKey.trim() || saving}
1889
1894
  className={emailBtnCls}
@@ -1895,7 +1900,7 @@ function EmailSectionInner({
1895
1900
  ) : (
1896
1901
  "Save"
1897
1902
  )}
1898
- </button>
1903
+ </Button>
1899
1904
  </div>
1900
1905
  )}
1901
1906
  {fromConfigured ? (
@@ -1921,7 +1926,9 @@ function EmailSectionInner({
1921
1926
  className={emailInputCls}
1922
1927
  />
1923
1928
  {!resendConfigured ? null : (
1924
- <button
1929
+ <Button
1930
+ intent="primary"
1931
+ emphasis="solid"
1925
1932
  onClick={saveResend}
1926
1933
  disabled={!fromAddr.trim() || saving}
1927
1934
  className={emailBtnCls}
@@ -1933,7 +1940,7 @@ function EmailSectionInner({
1933
1940
  ) : (
1934
1941
  "Save"
1935
1942
  )}
1936
- </button>
1943
+ </Button>
1937
1944
  )}
1938
1945
  </div>
1939
1946
  )}
@@ -1966,7 +1973,9 @@ function EmailSectionInner({
1966
1973
  placeholder="SG...."
1967
1974
  className={emailInputCls}
1968
1975
  />
1969
- <button
1976
+ <Button
1977
+ intent="primary"
1978
+ emphasis="solid"
1970
1979
  onClick={saveSendgrid}
1971
1980
  disabled={!sendgridKey.trim() || saving}
1972
1981
  className={emailBtnCls}
@@ -1978,7 +1987,7 @@ function EmailSectionInner({
1978
1987
  ) : (
1979
1988
  "Save"
1980
1989
  )}
1981
- </button>
1990
+ </Button>
1982
1991
  </div>
1983
1992
  )}
1984
1993
  {fromConfigured ? (
@@ -2004,7 +2013,9 @@ function EmailSectionInner({
2004
2013
  className={emailInputCls}
2005
2014
  />
2006
2015
  {!sendgridConfigured ? null : (
2007
- <button
2016
+ <Button
2017
+ intent="primary"
2018
+ emphasis="solid"
2008
2019
  onClick={saveSendgrid}
2009
2020
  disabled={!fromAddr.trim() || saving}
2010
2021
  className={emailBtnCls}
@@ -2016,7 +2027,7 @@ function EmailSectionInner({
2016
2027
  ) : (
2017
2028
  "Save"
2018
2029
  )}
2019
- </button>
2030
+ </Button>
2020
2031
  )}
2021
2032
  </div>
2022
2033
  )}
@@ -2240,8 +2251,10 @@ function AgentLimitsSectionInner({
2240
2251
  )}
2241
2252
  style={isPage ? CONTROL_STYLE_PAGE : undefined}
2242
2253
  />
2243
- <button
2254
+ <Button
2244
2255
  type="button"
2256
+ intent="primary"
2257
+ emphasis="solid"
2245
2258
  onClick={save}
2246
2259
  disabled={!hasPendingChange || saving}
2247
2260
  className={pillButtonClass(isPage, "solid")}
@@ -2256,9 +2269,11 @@ function AgentLimitsSectionInner({
2256
2269
  ) : (
2257
2270
  "Save"
2258
2271
  )}
2259
- </button>
2260
- <button
2272
+ </Button>
2273
+ <Button
2261
2274
  type="button"
2275
+ intent="neutral"
2276
+ emphasis="outline"
2262
2277
  onClick={reset}
2263
2278
  disabled={
2264
2279
  !settings.canUpdate ||
@@ -2268,7 +2283,7 @@ function AgentLimitsSectionInner({
2268
2283
  className={pillButtonClass(isPage, "outline")}
2269
2284
  >
2270
2285
  Reset
2271
- </button>
2286
+ </Button>
2272
2287
  </div>
2273
2288
  {!settings.canUpdate && (
2274
2289
  <p
@@ -2307,51 +2322,6 @@ export interface SettingsPanelProps {
2307
2322
  sectionRequestKey?: number;
2308
2323
  }
2309
2324
 
2310
- function normalizeSettingsSection(
2311
- value?: string | null,
2312
- ): SettingsSectionId | null {
2313
- const normalized = value?.replace(/^#/, "").toLowerCase() ?? "";
2314
- if (!normalized) return null;
2315
- if (normalized.startsWith("secrets")) return "secrets";
2316
- if (
2317
- normalized === "workspace" ||
2318
- normalized === "workspace-settings" ||
2319
- normalized === "organization" ||
2320
- normalized === "org"
2321
- ) {
2322
- return "secrets";
2323
- }
2324
- if (normalized === "agent-engine") return "llm";
2325
- if (
2326
- normalized === "agent-model-defaults" ||
2327
- normalized === "app-model-defaults" ||
2328
- normalized === "models"
2329
- ) {
2330
- return "app-models";
2331
- }
2332
- if (normalized === "agent-limits" || normalized === "loop-settings") {
2333
- return "limits";
2334
- }
2335
- return SETTINGS_SECTION_IDS.has(normalized as SettingsSectionId)
2336
- ? (normalized as SettingsSectionId)
2337
- : null;
2338
- }
2339
-
2340
- function settingsSectionDomId(section: SettingsSectionId): string {
2341
- return `agent-settings-section-${section}`;
2342
- }
2343
-
2344
- function initialOpenSection(): SettingsSectionId {
2345
- if (typeof window === "undefined") return "llm";
2346
- return normalizeSettingsSection(window.location.hash) ?? "llm";
2347
- }
2348
-
2349
- function firstVisibleSection(
2350
- sections: readonly SettingsSectionId[],
2351
- ): SettingsSectionId {
2352
- return sections[0] ?? "llm";
2353
- }
2354
-
2355
2325
  // Agent capability modes. The internal values ("production"/"development") are
2356
2326
  // kept for back-compat with the AGENT_MODE wiring; only the visible labels
2357
2327
  // changed to "App mode" / "Code mode" so this control reads as the agent
@@ -2435,13 +2405,15 @@ function CapabilityStatusStrip({
2435
2405
  ) : builderConnected ? (
2436
2406
  "Connected"
2437
2407
  ) : (
2438
- <button
2408
+ <Button
2439
2409
  type="button"
2410
+ intent="neutral"
2411
+ emphasis="outline"
2440
2412
  onClick={onOpenLlm}
2441
2413
  className="rounded border border-border px-1.5 py-0.5 text-[10px] text-muted-foreground transition-colors hover:bg-accent/40 hover:text-foreground"
2442
2414
  >
2443
2415
  Connect
2444
- </button>
2416
+ </Button>
2445
2417
  )
2446
2418
  }
2447
2419
  />
@@ -2458,21 +2430,40 @@ function AccountSectionInner({
2458
2430
  onToggle: () => void;
2459
2431
  }) {
2460
2432
  const isPage = useSettingsSurface() === "page";
2433
+ const t = useT();
2461
2434
  const { session, isLoading } = useSession();
2462
2435
  const email = session?.email;
2436
+ const profileQuery = useActionQuery<UserProfile>(
2437
+ "get-user-profile",
2438
+ undefined,
2439
+ { enabled: !!email },
2440
+ );
2441
+ const updateProfile = useActionMutation<UserProfile, { name: string }>(
2442
+ "update-user-profile",
2443
+ );
2463
2444
  const avatarUrl = useAvatarUrl(email);
2464
2445
  const fileInputRef = useRef<HTMLInputElement>(null);
2465
2446
  const [uploading, setUploading] = useState(false);
2466
2447
  const [status, setStatus] = useState<"idle" | "saved" | "error">("idle");
2467
-
2468
- const displayName = session?.name || email || "Signed out";
2469
- const initials = (session?.name || email || "?")
2448
+ const [name, setName] = useState("");
2449
+
2450
+ const displayName =
2451
+ profileQuery.data?.name ||
2452
+ session?.name ||
2453
+ email ||
2454
+ t("settings.profileSignedOut");
2455
+ const initials = (displayName || "?")
2470
2456
  .split(/[ @._-]+/)
2471
2457
  .filter(Boolean)
2472
2458
  .slice(0, 2)
2473
2459
  .map((part) => part[0]?.toUpperCase())
2474
2460
  .join("");
2475
2461
 
2462
+ useEffect(() => {
2463
+ const nextName = profileQuery.data?.name || session?.name;
2464
+ if (nextName) setName(nextName);
2465
+ }, [profileQuery.data?.name, session?.name]);
2466
+
2476
2467
  const handleAvatarChange = async (
2477
2468
  event: React.ChangeEvent<HTMLInputElement>,
2478
2469
  ) => {
@@ -2491,12 +2482,18 @@ function AccountSectionInner({
2491
2482
  }
2492
2483
  };
2493
2484
 
2485
+ const handleProfileSave = () => {
2486
+ const nextName = name.trim();
2487
+ if (!nextName || !email) return;
2488
+ updateProfile.mutate({ name: nextName });
2489
+ };
2490
+
2494
2491
  return (
2495
2492
  <SettingsSection
2496
2493
  id={settingsSectionDomId("account")}
2497
2494
  icon={<IconUserCircle size={14} />}
2498
- title="Account"
2499
- subtitle="Your profile photo and signed-in identity."
2495
+ title={t("settings.profileTitle")}
2496
+ subtitle={t("settings.profileDescription")}
2500
2497
  open={open}
2501
2498
  onToggle={onToggle}
2502
2499
  >
@@ -2524,7 +2521,7 @@ function AccountSectionInner({
2524
2521
  isPage ? "text-sm" : "text-[12px]",
2525
2522
  )}
2526
2523
  >
2527
- {isLoading ? "Loading..." : displayName}
2524
+ {isLoading ? t("settings.profileLoading") : displayName}
2528
2525
  </p>
2529
2526
  {email && (
2530
2527
  <p
@@ -2543,12 +2540,12 @@ function AccountSectionInner({
2543
2540
  subTextClass(isPage),
2544
2541
  )}
2545
2542
  >
2546
- Photo updated
2543
+ {t("settings.profilePhotoUpdated")}
2547
2544
  </p>
2548
2545
  )}
2549
2546
  {status === "error" && (
2550
2547
  <p className={cn("mt-1 text-destructive", subTextClass(isPage))}>
2551
- Could not update photo
2548
+ {t("settings.profilePhotoError")}
2552
2549
  </p>
2553
2550
  )}
2554
2551
  </div>
@@ -2559,8 +2556,10 @@ function AccountSectionInner({
2559
2556
  className="hidden"
2560
2557
  onChange={handleAvatarChange}
2561
2558
  />
2562
- <button
2559
+ <Button
2563
2560
  type="button"
2561
+ intent="neutral"
2562
+ emphasis="outline"
2564
2563
  disabled={!email || uploading}
2565
2564
  onClick={() => fileInputRef.current?.click()}
2566
2565
  className={cn(
@@ -2568,9 +2567,72 @@ function AccountSectionInner({
2568
2567
  "shrink-0 justify-center",
2569
2568
  )}
2570
2569
  >
2571
- {uploading ? "Uploading..." : "Change photo"}
2572
- </button>
2570
+ {uploading
2571
+ ? t("settings.profileUploading")
2572
+ : t("settings.profileChangePhoto")}
2573
+ </Button>
2573
2574
  </div>
2575
+ <form
2576
+ className="space-y-1.5"
2577
+ onSubmit={(event) => {
2578
+ event.preventDefault();
2579
+ handleProfileSave();
2580
+ }}
2581
+ >
2582
+ <label
2583
+ htmlFor="agent-native-profile-name"
2584
+ className={fieldLabelClass(isPage)}
2585
+ >
2586
+ {t("settings.profileNameLabel")}
2587
+ </label>
2588
+ <input
2589
+ id="agent-native-profile-name"
2590
+ type="text"
2591
+ value={name}
2592
+ onChange={(event) => {
2593
+ updateProfile.reset();
2594
+ setName(event.target.value);
2595
+ }}
2596
+ placeholder={t("settings.profileNamePlaceholder")}
2597
+ disabled={!email || profileQuery.isLoading || updateProfile.isPending}
2598
+ maxLength={120}
2599
+ className={textInputClass(isPage)}
2600
+ />
2601
+ <p className={cn("text-muted-foreground", noteTextClass(isPage))}>
2602
+ {t("settings.profileNameDescription")}
2603
+ </p>
2604
+ <div className="flex items-center justify-between gap-3 pt-1">
2605
+ <div className="min-h-4">
2606
+ {updateProfile.isSuccess && (
2607
+ <p className="text-green-600 dark:text-green-400">
2608
+ {t("settings.profileSaved")}
2609
+ </p>
2610
+ )}
2611
+ {updateProfile.error && (
2612
+ <p className="text-destructive">
2613
+ {t("settings.profileSaveError")}
2614
+ </p>
2615
+ )}
2616
+ </div>
2617
+ <Button
2618
+ type="submit"
2619
+ intent="primary"
2620
+ emphasis="solid"
2621
+ disabled={
2622
+ !email ||
2623
+ profileQuery.isLoading ||
2624
+ updateProfile.isPending ||
2625
+ !name.trim() ||
2626
+ name.trim() === displayName
2627
+ }
2628
+ className={pillButtonClass(isPage, "solid")}
2629
+ >
2630
+ {updateProfile.isPending
2631
+ ? t("settings.profileSaving")
2632
+ : t("settings.profileSave")}
2633
+ </Button>
2634
+ </div>
2635
+ </form>
2574
2636
  </SettingsSection>
2575
2637
  );
2576
2638
  }
@@ -2611,27 +2673,6 @@ function SettingsPanelContent({
2611
2673
  trackingSource: "settings_panel_builder_card",
2612
2674
  });
2613
2675
 
2614
- // When opened via a `#secrets:<KEY>` hash, focus that specific secret input
2615
- // inside the "API Keys & Connections" section.
2616
- const [focusSecretKey, setFocusSecretKey] = useState<string | undefined>(
2617
- undefined,
2618
- );
2619
- const visibleSections = useMemo(() => new Set(sections), [sections]);
2620
- const shouldShowSection = useCallback(
2621
- (section: SettingsSectionId) => visibleSections.has(section),
2622
- [visibleSections],
2623
- );
2624
-
2625
- // Accordion: only one section open at a time (null = all closed)
2626
- const [openSection, setOpenSection] = useState<string | null>(() => {
2627
- const initial = initialOpenSection();
2628
- return visibleSections.has(initial)
2629
- ? initial
2630
- : firstVisibleSection(sections);
2631
- });
2632
- const toggle = (id: string) =>
2633
- setOpenSection((prev) => (prev === id ? null : id));
2634
-
2635
2676
  const scrollSectionIntoView = useCallback((section: SettingsSectionId) => {
2636
2677
  window.requestAnimationFrame(() => {
2637
2678
  document.getElementById(settingsSectionDomId(section))?.scrollIntoView({
@@ -2640,47 +2681,23 @@ function SettingsPanelContent({
2640
2681
  });
2641
2682
  });
2642
2683
  }, []);
2643
-
2644
- const openSettingsSection = useCallback(
2645
- (section: SettingsSectionId, scroll = false) => {
2646
- setOpenSection(section);
2647
- if (scroll) scrollSectionIntoView(section);
2648
- },
2649
- [scrollSectionIntoView],
2650
- );
2651
-
2652
- useEffect(() => {
2653
- const section = normalizeSettingsSection(initialSection);
2654
- if (!section || !shouldShowSection(section)) return;
2655
- if (section !== "secrets") setFocusSecretKey(undefined);
2656
- openSettingsSection(section, true);
2657
- }, [
2684
+ const {
2685
+ focusSecretKey,
2686
+ isSectionVisible: shouldShowSection,
2687
+ openSection,
2688
+ toggleSection: toggle,
2689
+ openSettingsSection: openControllerSection,
2690
+ } = useSettingsPanelController({
2691
+ sections,
2658
2692
  initialSection,
2659
2693
  sectionRequestKey,
2660
- openSettingsSection,
2661
- shouldShowSection,
2662
- ]);
2663
-
2664
- // Support `#secrets:<KEY>` hash fragments from the onboarding CTA — opens
2665
- // the section and focuses the matching input.
2666
- useEffect(() => {
2667
- if (typeof window === "undefined") return;
2668
- const handleHash = () => {
2669
- const hash = window.location.hash?.replace(/^#/, "") ?? "";
2670
- const section = normalizeSettingsSection(hash);
2671
- if (!section || !shouldShowSection(section)) return;
2672
- if (hash.startsWith("secrets:") || hash === "secrets") {
2673
- const key = hash.slice("secrets:".length);
2674
- setFocusSecretKey(key || undefined);
2675
- } else {
2676
- setFocusSecretKey(undefined);
2677
- }
2678
- openSettingsSection(section, true);
2679
- };
2680
- handleHash();
2681
- window.addEventListener("hashchange", handleHash);
2682
- return () => window.removeEventListener("hashchange", handleHash);
2683
- }, [openSettingsSection, shouldShowSection]);
2694
+ onScrollToSection: scrollSectionIntoView,
2695
+ });
2696
+ const openSettingsSection = useCallback(
2697
+ (section: SettingsSectionId, scroll = false) =>
2698
+ openControllerSection(section, { scroll }),
2699
+ [openControllerSection],
2700
+ );
2684
2701
 
2685
2702
  const isPage = surface === "page";
2686
2703
 
@@ -3066,6 +3083,36 @@ export function SettingsPanel(props: SettingsPanelProps) {
3066
3083
  return <SettingsPanelContent {...props} />;
3067
3084
  }
3068
3085
 
3086
+ function McpConnectionsCard() {
3087
+ const t = useT();
3088
+
3089
+ return (
3090
+ <section className="rounded-lg border border-border bg-muted/20 p-3">
3091
+ <div className="flex items-start gap-2.5">
3092
+ <IconPlugConnected
3093
+ size={16}
3094
+ className="mt-0.5 shrink-0 text-muted-foreground"
3095
+ />
3096
+ <div className="min-w-0 flex-1">
3097
+ <h2 className="text-sm font-semibold text-foreground">
3098
+ {t("settings.mcpConnectionsTitle")}
3099
+ </h2>
3100
+ <p className="mt-1 text-xs leading-5 text-muted-foreground">
3101
+ {t("settings.mcpConnectionsDescription")}
3102
+ </p>
3103
+ <Link
3104
+ to="/agent#connections"
3105
+ className="mt-2 inline-flex items-center gap-1 text-xs font-medium text-foreground underline-offset-4 hover:underline"
3106
+ >
3107
+ {t("settings.openMcpConnections")}
3108
+ <IconExternalLink size={13} />
3109
+ </Link>
3110
+ </div>
3111
+ </div>
3112
+ </section>
3113
+ );
3114
+ }
3115
+
3069
3116
  export function ConnectionsSettingsContent({
3070
3117
  settingsPanelProps,
3071
3118
  }: {
@@ -3074,6 +3121,7 @@ export function ConnectionsSettingsContent({
3074
3121
  return (
3075
3122
  <div className="mx-auto w-full max-w-2xl space-y-4">
3076
3123
  <BuilderConnectCard trackingSource="settings_connections" />
3124
+ <McpConnectionsCard />
3077
3125
  <SettingsPanelContent
3078
3126
  {...settingsPanelProps}
3079
3127
  surface="page"