@agent-native/core 0.117.2 → 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 (524) hide show
  1. package/corpus/README.md +3 -3
  2. package/corpus/core/CHANGELOG.md +30 -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 +1 -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/client/AgentPanel.tsx +90 -107
  9. package/corpus/core/src/client/AssistantChat.tsx +30 -13
  10. package/corpus/core/src/client/CommandMenu.tsx +68 -178
  11. package/corpus/core/src/client/agent-chat-adapter.ts +3 -1
  12. package/corpus/core/src/client/app-providers.tsx +1 -1
  13. package/corpus/core/src/client/chat/message-components.tsx +116 -10
  14. package/corpus/core/src/client/chat/tool-call-display.tsx +26 -5
  15. package/corpus/core/src/client/chat/widgets/InlineExtensionWidget.tsx +14 -40
  16. package/corpus/core/src/client/components/ui/message-scroller.tsx +15 -1
  17. package/corpus/core/src/client/i18n.tsx +22 -0
  18. package/corpus/core/src/client/index.ts +17 -0
  19. package/corpus/core/src/client/org/TeamPage.tsx +257 -153
  20. package/corpus/core/src/client/progress/RunsTray.tsx +89 -88
  21. package/corpus/core/src/client/resources/McpConnectionSuggestion.tsx +5 -2
  22. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +34 -13
  23. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +13 -0
  24. package/corpus/core/src/client/settings/DemoModeSection.tsx +6 -18
  25. package/corpus/core/src/client/settings/SecretsSection.tsx +97 -52
  26. package/corpus/core/src/client/settings/SettingsPanel.tsx +202 -246
  27. package/corpus/core/src/client/settings/SettingsTabsPage.tsx +23 -2
  28. package/corpus/core/src/client/settings/VoiceTranscriptionSection.tsx +7 -18
  29. package/corpus/core/src/client/settings/index.ts +7 -0
  30. package/corpus/core/src/client/settings/useSettingsPanelController.ts +155 -0
  31. package/corpus/core/src/client/setup-connections/BuilderConnectCard.tsx +116 -51
  32. package/corpus/core/src/client/setup-connections/index.ts +10 -0
  33. package/corpus/core/src/client/setup-connections/useBuilderConnectCardController.ts +82 -0
  34. package/corpus/core/src/client/sharing/ShareButton.tsx +64 -586
  35. package/corpus/core/src/client/sharing/ShareDialog.tsx +299 -633
  36. package/corpus/core/src/client/sharing/index.ts +42 -0
  37. package/corpus/core/src/client/sharing/share-controller-helpers.ts +318 -0
  38. package/corpus/core/src/client/sharing/useShareButtonController.ts +600 -0
  39. package/corpus/core/src/client/sharing/useShareDialogController.ts +559 -0
  40. package/corpus/core/src/client/sse-event-processor.ts +23 -0
  41. package/corpus/core/src/client/tool-display.ts +71 -0
  42. package/corpus/core/src/client/use-agent-engine-configured.ts +12 -19
  43. package/corpus/core/src/client/use-chat-threads.ts +33 -12
  44. package/corpus/core/src/localization/default-messages.ts +5 -0
  45. package/corpus/core/src/mcp-client/oauth-routes.ts +16 -2
  46. package/corpus/core/src/scripts/call-agent.ts +5 -1
  47. package/corpus/core/src/server/realtime-voice.ts +1 -1
  48. package/corpus/core/src/styles/agent-native.css +0 -24
  49. package/corpus/core/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  50. package/corpus/core/src/templates/default/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  51. package/corpus/core/src/templates/default/.agents/skills/frontend-design/SKILL.md +22 -2
  52. package/corpus/core/src/templates/default/.agents/skills/shadcn-ui/SKILL.md +28 -4
  53. package/corpus/core/src/templates/default/app/components/ui/toolkit-provider.tsx +10 -0
  54. package/corpus/core/src/templates/default/app/design-system.ts +3 -0
  55. package/corpus/core/src/templates/default/app/root.tsx +5 -2
  56. package/corpus/core/src/templates/default/package.json +1 -0
  57. package/corpus/core/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  58. package/corpus/core/src/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  59. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  60. package/corpus/core/src/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  61. package/corpus/core/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +22 -2
  62. package/corpus/core/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +28 -4
  63. package/corpus/core/src/vite/client.ts +39 -0
  64. package/corpus/templates/analytics/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  65. package/corpus/templates/analytics/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  66. package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +22 -2
  67. package/corpus/templates/analytics/.agents/skills/shadcn-ui/SKILL.md +28 -4
  68. package/corpus/templates/analytics/app/components/ui/toolkit-provider.tsx +6 -1
  69. package/corpus/templates/analytics/app/design-system.ts +3 -0
  70. package/corpus/templates/assets/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  71. package/corpus/templates/assets/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  72. package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +22 -2
  73. package/corpus/templates/assets/.agents/skills/shadcn-ui/SKILL.md +28 -4
  74. package/corpus/templates/assets/app/components/ui/alert.tsx +1 -0
  75. package/corpus/templates/assets/app/components/ui/toolkit-provider.tsx +6 -1
  76. package/corpus/templates/assets/app/design-system.ts +3 -0
  77. package/corpus/templates/assets/app/routes/brand-kits.$id_.presets.$presetId.tsx +26 -30
  78. package/corpus/templates/brain/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  79. package/corpus/templates/brain/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  80. package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +22 -2
  81. package/corpus/templates/brain/.agents/skills/shadcn-ui/SKILL.md +28 -4
  82. package/corpus/templates/brain/app/components/ui/dialog.tsx +1 -0
  83. package/corpus/templates/brain/app/components/ui/toolkit-provider.tsx +6 -1
  84. package/corpus/templates/brain/app/design-system.ts +3 -0
  85. package/corpus/templates/brain/app/routes/sources.tsx +8 -8
  86. package/corpus/templates/calendar/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  87. package/corpus/templates/calendar/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  88. package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +22 -2
  89. package/corpus/templates/calendar/.agents/skills/shadcn-ui/SKILL.md +28 -4
  90. package/corpus/templates/calendar/app/components/ui/toolkit-provider.tsx +6 -1
  91. package/corpus/templates/calendar/app/design-system.ts +3 -0
  92. package/corpus/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  93. package/corpus/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  94. package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +22 -2
  95. package/corpus/templates/chat/.agents/skills/shadcn-ui/SKILL.md +28 -4
  96. package/corpus/templates/chat/app/components/ui/toolkit-provider.tsx +6 -1
  97. package/corpus/templates/chat/app/design-system.ts +3 -0
  98. package/corpus/templates/clips/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  99. package/corpus/templates/clips/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  100. package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +22 -2
  101. package/corpus/templates/clips/.agents/skills/shadcn-ui/SKILL.md +28 -4
  102. package/corpus/templates/clips/app/components/ui/toolkit-provider.tsx +6 -1
  103. package/corpus/templates/clips/app/design-system.ts +3 -0
  104. package/corpus/templates/clips/app/routes/_app.library._index.tsx +1 -1
  105. package/corpus/templates/clips/changelog/2026-07-22-fixed-windows-recordings-aborting-during-the-countdown.md +6 -0
  106. package/corpus/templates/clips/changelog/2026-07-22-permissions-and-rewind-controls-are-now-grouped-with-clearer.md +6 -0
  107. package/corpus/templates/clips/changelog/2026-07-22-the-desktop-popover-opens-centered-under-the-menu-bar-icon-o.md +6 -0
  108. package/corpus/templates/clips/desktop/src/app.tsx +86 -82
  109. package/corpus/templates/clips/desktop/src/styles.css +13 -0
  110. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +10 -1
  111. package/corpus/templates/clips/desktop/src-tauri/src/shortcuts.rs +37 -2
  112. package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +18 -0
  113. package/corpus/templates/content/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  114. package/corpus/templates/content/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  115. package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +22 -2
  116. package/corpus/templates/content/.agents/skills/shadcn-ui/SKILL.md +28 -4
  117. package/corpus/templates/content/app/components/editor/DocumentToolbar.tsx +41 -59
  118. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +41 -41
  119. package/corpus/templates/content/app/components/editor/database/GalleryView.tsx +2 -1
  120. package/corpus/templates/content/app/components/editor/database/ListView.tsx +2 -1
  121. package/corpus/templates/content/app/components/editor/database/TimelineView.tsx +9 -9
  122. package/corpus/templates/content/app/components/editor/database/sidebar.tsx +7 -7
  123. package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +11 -11
  124. package/corpus/templates/content/app/components/ui/checkbox.tsx +1 -0
  125. package/corpus/templates/content/app/components/ui/collapsible.tsx +1 -0
  126. package/corpus/templates/content/app/components/ui/toolkit-provider.tsx +6 -1
  127. package/corpus/templates/content/app/design-system.ts +3 -0
  128. package/corpus/templates/content/app/global.css +29 -3
  129. package/corpus/templates/content/changelog/2026-07-22-page-actions-are-grouped-into-the-three-dots-menu-for-a-clea.md +6 -0
  130. package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  131. package/corpus/templates/crm/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  132. package/corpus/templates/crm/app/components/crm/CreateCrmRecordDialog.tsx +10 -10
  133. package/corpus/templates/crm/app/components/crm/CrmDashboardPanel.tsx +1 -6
  134. package/corpus/templates/crm/app/components/crm/CrmSignalsPanel.tsx +3 -2
  135. package/corpus/templates/crm/app/components/crm/IntelligenceSettings.tsx +13 -12
  136. package/corpus/templates/crm/app/components/crm/RecordActions.tsx +17 -17
  137. package/corpus/templates/crm/app/components/crm/RecordGrid.tsx +8 -8
  138. package/corpus/templates/crm/app/components/crm/RecordWorkspace.tsx +3 -8
  139. package/corpus/templates/crm/app/components/crm/SavedViewDataProgram.tsx +2 -1
  140. package/corpus/templates/crm/app/components/crm/Surface.tsx +3 -2
  141. package/corpus/templates/crm/app/components/crm/WorkOverview.tsx +2 -2
  142. package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +7 -7
  143. package/corpus/templates/crm/app/components/layout/CrmSidebar.tsx +1 -1
  144. package/corpus/templates/crm/app/components/ui/alert-dialog.tsx +1 -0
  145. package/corpus/templates/crm/app/components/ui/badge.tsx +1 -0
  146. package/corpus/templates/crm/app/components/ui/button.tsx +1 -0
  147. package/corpus/templates/crm/app/components/ui/card.tsx +1 -0
  148. package/corpus/templates/crm/app/components/ui/dialog.tsx +1 -0
  149. package/corpus/templates/crm/app/components/ui/input.tsx +1 -0
  150. package/corpus/templates/crm/app/components/ui/label.tsx +1 -0
  151. package/corpus/templates/crm/app/components/ui/select.tsx +1 -0
  152. package/corpus/templates/crm/app/components/ui/sheet.tsx +1 -0
  153. package/corpus/templates/crm/app/components/ui/skeleton.tsx +1 -0
  154. package/corpus/templates/crm/app/components/ui/switch.tsx +1 -0
  155. package/corpus/templates/crm/app/components/ui/table.tsx +1 -0
  156. package/corpus/templates/crm/app/components/ui/tabs.tsx +1 -0
  157. package/corpus/templates/crm/app/components/ui/textarea.tsx +1 -0
  158. package/corpus/templates/crm/app/components/ui/toolkit-provider.tsx +17 -0
  159. package/corpus/templates/crm/app/design-system.ts +3 -0
  160. package/corpus/templates/crm/app/root.tsx +9 -6
  161. package/corpus/templates/crm/app/routes/dashboard.tsx +1 -1
  162. package/corpus/templates/crm/app/routes/proposals.tsx +13 -13
  163. package/corpus/templates/crm/app/routes/setup.tsx +9 -9
  164. package/corpus/templates/crm/app/routes/tasks.tsx +14 -14
  165. package/corpus/templates/crm/app/routes/views.tsx +16 -16
  166. package/corpus/templates/design/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  167. package/corpus/templates/design/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  168. package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +22 -2
  169. package/corpus/templates/design/.agents/skills/shadcn-ui/SKILL.md +28 -4
  170. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +8 -8
  171. package/corpus/templates/design/app/components/ui/command.tsx +1 -0
  172. package/corpus/templates/design/app/components/ui/toolkit-provider.tsx +6 -1
  173. package/corpus/templates/design/app/design-system.ts +3 -0
  174. package/corpus/templates/dispatch/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  175. package/corpus/templates/dispatch/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  176. package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +22 -2
  177. package/corpus/templates/dispatch/.agents/skills/shadcn-ui/SKILL.md +28 -4
  178. package/corpus/templates/dispatch/app/components/ui/button.tsx +1 -0
  179. package/corpus/templates/dispatch/app/components/ui/toolkit-provider.tsx +17 -0
  180. package/corpus/templates/dispatch/app/design-system.ts +3 -0
  181. package/corpus/templates/dispatch/app/root.tsx +10 -7
  182. package/corpus/templates/dispatch/package.json +1 -0
  183. package/corpus/templates/forms/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  184. package/corpus/templates/forms/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  185. package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +22 -2
  186. package/corpus/templates/forms/.agents/skills/shadcn-ui/SKILL.md +28 -4
  187. package/corpus/templates/forms/app/components/ui/toolkit-provider.tsx +6 -1
  188. package/corpus/templates/forms/app/design-system.ts +3 -0
  189. package/corpus/templates/macros/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  190. package/corpus/templates/macros/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  191. package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +22 -2
  192. package/corpus/templates/macros/.agents/skills/shadcn-ui/SKILL.md +28 -4
  193. package/corpus/templates/macros/app/components/ui/toolkit-provider.tsx +6 -1
  194. package/corpus/templates/macros/app/design-system.ts +3 -0
  195. package/corpus/templates/mail/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  196. package/corpus/templates/mail/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  197. package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +22 -2
  198. package/corpus/templates/mail/.agents/skills/shadcn-ui/SKILL.md +28 -4
  199. package/corpus/templates/mail/app/components/email/EmailThread.tsx +134 -93
  200. package/corpus/templates/mail/app/components/email/email-iframe-document.ts +8 -2
  201. package/corpus/templates/mail/app/components/ui/textarea.tsx +1 -21
  202. package/corpus/templates/mail/app/components/ui/toolkit-provider.tsx +6 -1
  203. package/corpus/templates/mail/app/design-system.ts +3 -0
  204. package/corpus/templates/mail/changelog/2026-07-22-email-messages-no-longer-flash-with-an-unstyled-page-while-l.md +6 -0
  205. package/corpus/templates/plan/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  206. package/corpus/templates/plan/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  207. package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +22 -2
  208. package/corpus/templates/plan/.agents/skills/shadcn-ui/SKILL.md +28 -4
  209. package/corpus/templates/plan/app/components/plan/PlanContentRenderer.tsx +1 -1
  210. package/corpus/templates/plan/app/components/ui/toolkit-provider.tsx +6 -1
  211. package/corpus/templates/plan/app/design-system.ts +3 -0
  212. package/corpus/templates/slides/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  213. package/corpus/templates/slides/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  214. package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +22 -2
  215. package/corpus/templates/slides/.agents/skills/shadcn-ui/SKILL.md +28 -4
  216. package/corpus/templates/slides/app/components/ui/toolkit-provider.tsx +6 -1
  217. package/corpus/templates/slides/app/design-system.ts +3 -0
  218. package/corpus/templates/tasks/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  219. package/corpus/templates/tasks/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  220. package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +22 -2
  221. package/corpus/templates/tasks/.agents/skills/shadcn-ui/SKILL.md +28 -4
  222. package/corpus/templates/tasks/app/components/ui/toolkit-provider.tsx +17 -0
  223. package/corpus/templates/tasks/app/design-system.ts +3 -0
  224. package/corpus/templates/tasks/app/root.tsx +5 -2
  225. package/corpus/toolkit/CHANGELOG.md +14 -0
  226. package/corpus/toolkit/agent-native.eject.json +71 -0
  227. package/corpus/toolkit/package.json +31 -1
  228. package/corpus/toolkit/src/chat-history/ChatHistoryRail.tsx +100 -39
  229. package/corpus/toolkit/src/chat-history/index.ts +9 -0
  230. package/corpus/toolkit/src/chat-history/useChatHistoryRailController.ts +76 -0
  231. package/corpus/toolkit/src/chat-history.css +2 -0
  232. package/corpus/toolkit/src/composer/ComposerPlusMenu.tsx +11 -8
  233. package/corpus/toolkit/src/composer/PromptComposer.tsx +27 -6
  234. package/corpus/toolkit/src/composer/useRealtimeVoiceMode.tsx +107 -22
  235. package/corpus/toolkit/src/conformance/__fixtures__/css-in-js-adapter.tsx +401 -0
  236. package/corpus/toolkit/src/conformance/index.ts +3 -0
  237. package/corpus/toolkit/src/conformance/runner.tsx +710 -0
  238. package/corpus/toolkit/src/conformance/types.ts +45 -0
  239. package/corpus/toolkit/src/conformance/version.ts +22 -0
  240. package/corpus/toolkit/src/design-system/components.tsx +146 -0
  241. package/corpus/toolkit/src/design-system/context.tsx +31 -0
  242. package/corpus/toolkit/src/design-system/default-adapter.tsx +915 -0
  243. package/corpus/toolkit/src/design-system/definition.ts +14 -0
  244. package/corpus/toolkit/src/design-system/error-boundary.tsx +37 -0
  245. package/corpus/toolkit/src/design-system/index.ts +7 -0
  246. package/corpus/toolkit/src/design-system/theme.ts +145 -0
  247. package/corpus/toolkit/src/design-system/types.ts +363 -0
  248. package/corpus/toolkit/src/provider.tsx +98 -5
  249. package/corpus/toolkit/src/ui/button.tsx +95 -6
  250. package/corpus/toolkit/src/ui/dialog.tsx +48 -23
  251. package/corpus/toolkit/src/ui/popover.tsx +16 -2
  252. package/corpus/toolkit/src/ui/select.tsx +7 -3
  253. package/corpus/toolkit/src/ui/sidebar.tsx +47 -48
  254. package/corpus/toolkit/src/ui/tooltip.tsx +7 -3
  255. package/dist/a2a/types.d.ts +1 -1
  256. package/dist/a2a/types.d.ts.map +1 -1
  257. package/dist/a2a/types.js.map +1 -1
  258. package/dist/agent/types.d.ts +1 -1
  259. package/dist/agent/types.d.ts.map +1 -1
  260. package/dist/agent/types.js.map +1 -1
  261. package/dist/client/AgentPanel.d.ts.map +1 -1
  262. package/dist/client/AgentPanel.js +14 -14
  263. package/dist/client/AgentPanel.js.map +1 -1
  264. package/dist/client/AssistantChat.d.ts.map +1 -1
  265. package/dist/client/AssistantChat.js +26 -15
  266. package/dist/client/AssistantChat.js.map +1 -1
  267. package/dist/client/CommandMenu.d.ts.map +1 -1
  268. package/dist/client/CommandMenu.js +18 -106
  269. package/dist/client/CommandMenu.js.map +1 -1
  270. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  271. package/dist/client/agent-chat-adapter.js +2 -1
  272. package/dist/client/agent-chat-adapter.js.map +1 -1
  273. package/dist/client/app-providers.d.ts.map +1 -1
  274. package/dist/client/app-providers.js +1 -1
  275. package/dist/client/app-providers.js.map +1 -1
  276. package/dist/client/chat/message-components.d.ts +9 -1
  277. package/dist/client/chat/message-components.d.ts.map +1 -1
  278. package/dist/client/chat/message-components.js +62 -7
  279. package/dist/client/chat/message-components.js.map +1 -1
  280. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  281. package/dist/client/chat/tool-call-display.js +20 -5
  282. package/dist/client/chat/tool-call-display.js.map +1 -1
  283. package/dist/client/chat/widgets/InlineExtensionWidget.d.ts.map +1 -1
  284. package/dist/client/chat/widgets/InlineExtensionWidget.js +9 -12
  285. package/dist/client/chat/widgets/InlineExtensionWidget.js.map +1 -1
  286. package/dist/client/components/ui/message-scroller.d.ts +1 -1
  287. package/dist/client/components/ui/message-scroller.d.ts.map +1 -1
  288. package/dist/client/components/ui/message-scroller.js +4 -3
  289. package/dist/client/components/ui/message-scroller.js.map +1 -1
  290. package/dist/client/i18n.d.ts.map +1 -1
  291. package/dist/client/i18n.js +9 -0
  292. package/dist/client/i18n.js.map +1 -1
  293. package/dist/client/index.d.ts +2 -2
  294. package/dist/client/index.d.ts.map +1 -1
  295. package/dist/client/index.js +2 -2
  296. package/dist/client/index.js.map +1 -1
  297. package/dist/client/org/TeamPage.d.ts.map +1 -1
  298. package/dist/client/org/TeamPage.js +41 -33
  299. package/dist/client/org/TeamPage.js.map +1 -1
  300. package/dist/client/progress/RunsTray.d.ts.map +1 -1
  301. package/dist/client/progress/RunsTray.js +9 -10
  302. package/dist/client/progress/RunsTray.js.map +1 -1
  303. package/dist/client/resources/McpConnectionSuggestion.d.ts.map +1 -1
  304. package/dist/client/resources/McpConnectionSuggestion.js +5 -4
  305. package/dist/client/resources/McpConnectionSuggestion.js.map +1 -1
  306. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  307. package/dist/client/resources/McpIntegrationDialog.js +10 -8
  308. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  309. package/dist/client/resources/mcp-integration-catalog.d.ts +1 -0
  310. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  311. package/dist/client/resources/mcp-integration-catalog.js +13 -0
  312. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  313. package/dist/client/settings/DemoModeSection.d.ts.map +1 -1
  314. package/dist/client/settings/DemoModeSection.js +2 -5
  315. package/dist/client/settings/DemoModeSection.js.map +1 -1
  316. package/dist/client/settings/SecretsSection.d.ts.map +1 -1
  317. package/dist/client/settings/SecretsSection.js +18 -6
  318. package/dist/client/settings/SecretsSection.js.map +1 -1
  319. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  320. package/dist/client/settings/SettingsPanel.js +52 -117
  321. package/dist/client/settings/SettingsPanel.js.map +1 -1
  322. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  323. package/dist/client/settings/SettingsTabsPage.js +16 -1
  324. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  325. package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -1
  326. package/dist/client/settings/VoiceTranscriptionSection.js +2 -5
  327. package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
  328. package/dist/client/settings/index.d.ts +1 -0
  329. package/dist/client/settings/index.d.ts.map +1 -1
  330. package/dist/client/settings/index.js +1 -0
  331. package/dist/client/settings/index.js.map +1 -1
  332. package/dist/client/settings/useSettingsPanelController.d.ts +22 -0
  333. package/dist/client/settings/useSettingsPanelController.d.ts.map +1 -0
  334. package/dist/client/settings/useSettingsPanelController.js +103 -0
  335. package/dist/client/settings/useSettingsPanelController.js.map +1 -0
  336. package/dist/client/setup-connections/BuilderConnectCard.d.ts +14 -6
  337. package/dist/client/setup-connections/BuilderConnectCard.d.ts.map +1 -1
  338. package/dist/client/setup-connections/BuilderConnectCard.js +24 -16
  339. package/dist/client/setup-connections/BuilderConnectCard.js.map +1 -1
  340. package/dist/client/setup-connections/index.d.ts +2 -1
  341. package/dist/client/setup-connections/index.d.ts.map +1 -1
  342. package/dist/client/setup-connections/index.js +2 -1
  343. package/dist/client/setup-connections/index.js.map +1 -1
  344. package/dist/client/setup-connections/useBuilderConnectCardController.d.ts +34 -0
  345. package/dist/client/setup-connections/useBuilderConnectCardController.d.ts.map +1 -0
  346. package/dist/client/setup-connections/useBuilderConnectCardController.js +39 -0
  347. package/dist/client/setup-connections/useBuilderConnectCardController.js.map +1 -0
  348. package/dist/client/sharing/ShareButton.d.ts +2 -1
  349. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  350. package/dist/client/sharing/ShareButton.js +17 -463
  351. package/dist/client/sharing/ShareButton.js.map +1 -1
  352. package/dist/client/sharing/ShareDialog.d.ts +6 -6
  353. package/dist/client/sharing/ShareDialog.d.ts.map +1 -1
  354. package/dist/client/sharing/ShareDialog.js +69 -283
  355. package/dist/client/sharing/ShareDialog.js.map +1 -1
  356. package/dist/client/sharing/index.d.ts +3 -0
  357. package/dist/client/sharing/index.d.ts.map +1 -1
  358. package/dist/client/sharing/index.js +3 -0
  359. package/dist/client/sharing/index.js.map +1 -1
  360. package/dist/client/sharing/share-controller-helpers.d.ts +70 -0
  361. package/dist/client/sharing/share-controller-helpers.d.ts.map +1 -0
  362. package/dist/client/sharing/share-controller-helpers.js +224 -0
  363. package/dist/client/sharing/share-controller-helpers.js.map +1 -0
  364. package/dist/client/sharing/useShareButtonController.d.ts +91 -0
  365. package/dist/client/sharing/useShareButtonController.d.ts.map +1 -0
  366. package/dist/client/sharing/useShareButtonController.js +397 -0
  367. package/dist/client/sharing/useShareButtonController.js.map +1 -0
  368. package/dist/client/sharing/useShareDialogController.d.ts +109 -0
  369. package/dist/client/sharing/useShareDialogController.d.ts.map +1 -0
  370. package/dist/client/sharing/useShareDialogController.js +348 -0
  371. package/dist/client/sharing/useShareDialogController.js.map +1 -0
  372. package/dist/client/sse-event-processor.d.ts.map +1 -1
  373. package/dist/client/sse-event-processor.js +21 -0
  374. package/dist/client/sse-event-processor.js.map +1 -1
  375. package/dist/client/tool-display.d.ts +16 -0
  376. package/dist/client/tool-display.d.ts.map +1 -1
  377. package/dist/client/tool-display.js +52 -0
  378. package/dist/client/tool-display.js.map +1 -1
  379. package/dist/client/use-agent-engine-configured.d.ts +3 -2
  380. package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
  381. package/dist/client/use-agent-engine-configured.js +7 -19
  382. package/dist/client/use-agent-engine-configured.js.map +1 -1
  383. package/dist/client/use-chat-threads.d.ts.map +1 -1
  384. package/dist/client/use-chat-threads.js +21 -8
  385. package/dist/client/use-chat-threads.js.map +1 -1
  386. package/dist/localization/default-messages.d.ts +4 -0
  387. package/dist/localization/default-messages.d.ts.map +1 -1
  388. package/dist/localization/default-messages.js +4 -0
  389. package/dist/localization/default-messages.js.map +1 -1
  390. package/dist/mcp-client/oauth-routes.d.ts +2 -0
  391. package/dist/mcp-client/oauth-routes.d.ts.map +1 -1
  392. package/dist/mcp-client/oauth-routes.js +12 -2
  393. package/dist/mcp-client/oauth-routes.js.map +1 -1
  394. package/dist/observability/routes.d.ts +3 -3
  395. package/dist/provider-api/actions/custom-provider-registration.d.ts +4 -4
  396. package/dist/scripts/call-agent.d.ts.map +1 -1
  397. package/dist/scripts/call-agent.js +5 -1
  398. package/dist/scripts/call-agent.js.map +1 -1
  399. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  400. package/dist/server/realtime-voice.js +1 -1
  401. package/dist/server/realtime-voice.js.map +1 -1
  402. package/dist/server/transcribe-voice.d.ts +1 -1
  403. package/dist/styles/agent-native.css +0 -24
  404. package/dist/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  405. package/dist/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  406. package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +22 -2
  407. package/dist/templates/chat/.agents/skills/shadcn-ui/SKILL.md +28 -4
  408. package/dist/templates/chat/app/components/ui/toolkit-provider.tsx +6 -1
  409. package/dist/templates/chat/app/design-system.ts +3 -0
  410. package/dist/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  411. package/dist/templates/default/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  412. package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +22 -2
  413. package/dist/templates/default/.agents/skills/shadcn-ui/SKILL.md +28 -4
  414. package/dist/templates/default/app/components/ui/toolkit-provider.tsx +10 -0
  415. package/dist/templates/default/app/design-system.ts +3 -0
  416. package/dist/templates/default/app/root.tsx +5 -2
  417. package/dist/templates/default/package.json +1 -0
  418. package/dist/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  419. package/dist/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  420. package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  421. package/dist/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  422. package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +22 -2
  423. package/dist/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +28 -4
  424. package/dist/vite/client.d.ts +3 -0
  425. package/dist/vite/client.d.ts.map +1 -1
  426. package/dist/vite/client.js +31 -0
  427. package/dist/vite/client.js.map +1 -1
  428. package/docs/content/custom-design-system.mdx +445 -0
  429. package/docs/content/toolkit-ui.mdx +16 -0
  430. package/package.json +2 -2
  431. package/src/a2a/types.ts +1 -0
  432. package/src/agent/types.ts +1 -1
  433. package/src/client/AgentPanel.tsx +90 -107
  434. package/src/client/AssistantChat.tsx +30 -13
  435. package/src/client/CommandMenu.tsx +68 -178
  436. package/src/client/agent-chat-adapter.ts +3 -1
  437. package/src/client/app-providers.tsx +1 -1
  438. package/src/client/chat/message-components.tsx +116 -10
  439. package/src/client/chat/tool-call-display.tsx +26 -5
  440. package/src/client/chat/widgets/InlineExtensionWidget.tsx +14 -40
  441. package/src/client/components/ui/message-scroller.tsx +15 -1
  442. package/src/client/i18n.tsx +22 -0
  443. package/src/client/index.ts +17 -0
  444. package/src/client/org/TeamPage.tsx +257 -153
  445. package/src/client/progress/RunsTray.tsx +89 -88
  446. package/src/client/resources/McpConnectionSuggestion.tsx +5 -2
  447. package/src/client/resources/McpIntegrationDialog.tsx +34 -13
  448. package/src/client/resources/mcp-integration-catalog.ts +13 -0
  449. package/src/client/settings/DemoModeSection.tsx +6 -18
  450. package/src/client/settings/SecretsSection.tsx +97 -52
  451. package/src/client/settings/SettingsPanel.tsx +202 -246
  452. package/src/client/settings/SettingsTabsPage.tsx +23 -2
  453. package/src/client/settings/VoiceTranscriptionSection.tsx +7 -18
  454. package/src/client/settings/index.ts +7 -0
  455. package/src/client/settings/useSettingsPanelController.ts +155 -0
  456. package/src/client/setup-connections/BuilderConnectCard.tsx +116 -51
  457. package/src/client/setup-connections/index.ts +10 -0
  458. package/src/client/setup-connections/useBuilderConnectCardController.ts +82 -0
  459. package/src/client/sharing/ShareButton.tsx +64 -586
  460. package/src/client/sharing/ShareDialog.tsx +299 -633
  461. package/src/client/sharing/index.ts +42 -0
  462. package/src/client/sharing/share-controller-helpers.ts +318 -0
  463. package/src/client/sharing/useShareButtonController.ts +600 -0
  464. package/src/client/sharing/useShareDialogController.ts +559 -0
  465. package/src/client/sse-event-processor.ts +23 -0
  466. package/src/client/tool-display.ts +71 -0
  467. package/src/client/use-agent-engine-configured.ts +12 -19
  468. package/src/client/use-chat-threads.ts +33 -12
  469. package/src/localization/default-messages.ts +5 -0
  470. package/src/mcp-client/oauth-routes.ts +16 -2
  471. package/src/scripts/call-agent.ts +5 -1
  472. package/src/server/realtime-voice.ts +1 -1
  473. package/src/styles/agent-native.css +0 -24
  474. package/src/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  475. package/src/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  476. package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +22 -2
  477. package/src/templates/chat/.agents/skills/shadcn-ui/SKILL.md +28 -4
  478. package/src/templates/chat/app/components/ui/toolkit-provider.tsx +6 -1
  479. package/src/templates/chat/app/design-system.ts +3 -0
  480. package/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  481. package/src/templates/default/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  482. package/src/templates/default/.agents/skills/frontend-design/SKILL.md +22 -2
  483. package/src/templates/default/.agents/skills/shadcn-ui/SKILL.md +28 -4
  484. package/src/templates/default/app/components/ui/toolkit-provider.tsx +10 -0
  485. package/src/templates/default/app/design-system.ts +3 -0
  486. package/src/templates/default/app/root.tsx +5 -2
  487. package/src/templates/default/package.json +1 -0
  488. package/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  489. package/src/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  490. package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  491. package/src/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  492. package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +22 -2
  493. package/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +28 -4
  494. package/src/vite/client.ts +39 -0
  495. package/corpus/templates/analytics/app/components/ui/calendar.tsx +0 -70
  496. package/corpus/templates/analytics/app/components/ui/chart.tsx +0 -386
  497. package/corpus/templates/calendar/app/components/ui/sonner.tsx +0 -58
  498. package/corpus/templates/forms/app/components/ui/calendar.tsx +0 -214
  499. package/corpus/templates/forms/app/components/ui/chart.tsx +0 -379
  500. package/corpus/templates/forms/app/components/ui/command.tsx +0 -153
  501. package/corpus/templates/forms/app/components/ui/context-menu.tsx +0 -198
  502. package/corpus/templates/forms/app/components/ui/menubar.tsx +0 -254
  503. package/corpus/templates/macros/app/components/ui/menubar.tsx +0 -238
  504. package/corpus/templates/macros/app/components/ui/progress.tsx +0 -26
  505. package/corpus/templates/mail/app/components/ui/calendar.tsx +0 -211
  506. package/corpus/templates/mail/app/components/ui/chart.tsx +0 -379
  507. package/corpus/templates/mail/app/components/ui/command.tsx +0 -153
  508. package/corpus/templates/mail/app/components/ui/context-menu.tsx +0 -198
  509. package/corpus/templates/mail/app/components/ui/menubar.tsx +0 -254
  510. package/corpus/templates/tasks/app/components/ui/accordion.tsx +0 -56
  511. package/corpus/templates/tasks/app/components/ui/aspect-ratio.tsx +0 -5
  512. package/corpus/templates/tasks/app/components/ui/breadcrumb.tsx +0 -115
  513. package/corpus/templates/tasks/app/components/ui/calendar.tsx +0 -70
  514. package/corpus/templates/tasks/app/components/ui/carousel.tsx +0 -260
  515. package/corpus/templates/tasks/app/components/ui/chart.tsx +0 -379
  516. package/corpus/templates/tasks/app/components/ui/form.tsx +0 -177
  517. package/corpus/templates/tasks/app/components/ui/hover-card.tsx +0 -27
  518. package/corpus/templates/tasks/app/components/ui/input-otp.tsx +0 -69
  519. package/corpus/templates/tasks/app/components/ui/menubar.tsx +0 -254
  520. package/corpus/templates/tasks/app/components/ui/navigation-menu.tsx +0 -128
  521. package/corpus/templates/tasks/app/components/ui/pagination.tsx +0 -121
  522. package/corpus/templates/tasks/app/components/ui/resizable.tsx +0 -43
  523. package/corpus/templates/tasks/app/components/ui/sidebar.tsx +0 -782
  524. 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,6 +40,7 @@ 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";
40
46
  import type { UserProfile } from "../../user-profile/shared.js";
@@ -62,7 +68,6 @@ import {
62
68
  AGENT_SETTINGS_SECTIONS,
63
69
  ALL_SETTINGS_SECTIONS,
64
70
  CONNECTION_SETTINGS_SECTIONS,
65
- SETTINGS_SECTION_IDS,
66
71
  WORKSPACE_SETTINGS_SECTIONS,
67
72
  getAgentSettingsSearchTabs,
68
73
  type SettingsSectionId,
@@ -84,8 +89,28 @@ import {
84
89
  useBuilderConnectFlow,
85
90
  useBuilderStatus,
86
91
  } from "./useBuilderStatus.js";
92
+ import {
93
+ settingsSectionDomId,
94
+ useSettingsPanelController,
95
+ } from "./useSettingsPanelController.js";
87
96
  import { VoiceTranscriptionSection } from "./VoiceTranscriptionSection.js";
88
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
+
89
114
  const IntegrationsPanel = lazy(() =>
90
115
  import("../integrations/IntegrationsPanel.js").then((m) => ({
91
116
  default: m.IntegrationsPanel,
@@ -189,7 +214,6 @@ function SettingsSelect({
189
214
  }) {
190
215
  const isPage = useSettingsSurface() === "page";
191
216
  const controlStyle = isPage ? CONTROL_STYLE_PAGE : CONTROL_STYLE;
192
- const selected = options.find((option) => option.value === value);
193
217
 
194
218
  return (
195
219
  <div className="space-y-1.5">
@@ -197,69 +221,27 @@ function SettingsSelect({
197
221
  <p className={fieldLabelClass(isPage)}>{label}</p>
198
222
  {labelAdornment}
199
223
  </div>
200
- <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
+ }))}
201
232
  value={value}
202
- onValueChange={onValueChange}
233
+ onChange={(next) => {
234
+ if (next != null) onValueChange(String(next));
235
+ }}
203
236
  disabled={disabled}
204
- >
205
- <SelectPrimitive.Trigger
206
- className={cn(
207
- "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",
208
- isPage ? "h-10 text-sm" : "h-9 text-[12px]",
209
- )}
210
- aria-label={label}
211
- style={controlStyle}
212
- >
213
- <SelectPrimitive.Value>
214
- {selected?.label ?? value}
215
- </SelectPrimitive.Value>
216
- <SelectPrimitive.Icon asChild>
217
- <IconChevronDown size={16} className="text-muted-foreground" />
218
- </SelectPrimitive.Icon>
219
- </SelectPrimitive.Trigger>
220
- <SelectPrimitive.Portal>
221
- <SelectPrimitive.Content
222
- position="popper"
223
- sideOffset={6}
224
- className="z-[9999] w-[var(--radix-select-trigger-width)] overflow-hidden rounded-lg border border-border bg-popover shadow-lg"
225
- >
226
- <SelectPrimitive.Viewport className="p-1">
227
- {options.map((option) => (
228
- <SelectPrimitive.Item
229
- key={option.value}
230
- value={option.value}
231
- className={cn(
232
- "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",
233
- isPage ? "py-2.5 text-sm" : "py-2.5 text-[12px]",
234
- )}
235
- style={controlStyle}
236
- >
237
- <span className="absolute start-2 top-2.5 flex h-4 w-4 items-center justify-center text-muted-foreground">
238
- <SelectPrimitive.ItemIndicator>
239
- <IconCheck size={14} />
240
- </SelectPrimitive.ItemIndicator>
241
- </span>
242
- <div className="flex min-w-0 flex-col">
243
- <SelectPrimitive.ItemText>
244
- <span className="text-foreground">{option.label}</span>
245
- </SelectPrimitive.ItemText>
246
- {option.description ? (
247
- <span
248
- className={cn(
249
- "mt-0.5 leading-relaxed text-muted-foreground",
250
- isPage ? "text-xs" : "text-[11px]",
251
- )}
252
- >
253
- {option.description}
254
- </span>
255
- ) : null}
256
- </div>
257
- </SelectPrimitive.Item>
258
- ))}
259
- </SelectPrimitive.Viewport>
260
- </SelectPrimitive.Content>
261
- </SelectPrimitive.Portal>
262
- </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
+ />
263
245
  </div>
264
246
  );
265
247
  }
@@ -375,28 +357,34 @@ function DisconnectBuilderButton() {
375
357
  if (phase === "armed") {
376
358
  return (
377
359
  <>
378
- <button
360
+ <Button
379
361
  type="button"
362
+ intent="danger"
363
+ emphasis="solid"
380
364
  onClick={handleDisconnectClick}
381
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"
382
366
  >
383
367
  Confirm disconnect
384
- </button>
385
- <button
368
+ </Button>
369
+ <Button
386
370
  type="button"
371
+ intent="neutral"
372
+ emphasis="outline"
387
373
  onClick={handleCancel}
388
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"
389
375
  >
390
376
  Cancel
391
- </button>
377
+ </Button>
392
378
  </>
393
379
  );
394
380
  }
395
381
 
396
382
  return (
397
383
  <>
398
- <button
384
+ <Button
399
385
  type="button"
386
+ intent="danger"
387
+ emphasis="outline"
400
388
  onClick={handleDisconnectClick}
401
389
  disabled={phase === "busy"}
402
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"
@@ -410,7 +398,7 @@ function DisconnectBuilderButton() {
410
398
  ) : (
411
399
  "Disconnect"
412
400
  )}
413
- </button>
401
+ </Button>
414
402
  {err && <span className="text-[10px] text-destructive">{err}</span>}
415
403
  </>
416
404
  );
@@ -485,8 +473,10 @@ function UseBuilderCard({
485
473
  {connectUrl || credentialSource !== "env" ? (
486
474
  <div className="flex items-center gap-2 mt-2.5">
487
475
  {connectUrl && (
488
- <button
476
+ <Button
489
477
  type="button"
478
+ intent="neutral"
479
+ emphasis="ghost"
490
480
  onClick={() =>
491
481
  builderFlow.start({ trackingSource, trackingFlow })
492
482
  }
@@ -499,7 +489,7 @@ function UseBuilderCard({
499
489
  ? "Connect account"
500
490
  : "Reconnect"}
501
491
  <IconExternalLink size={isPage ? 14 : 10} />
502
- </button>
492
+ </Button>
503
493
  )}
504
494
  {credentialSource !== "env" ? <DisconnectBuilderButton /> : null}
505
495
  </div>
@@ -511,13 +501,14 @@ function UseBuilderCard({
511
501
  if (!connectUrl) return null;
512
502
 
513
503
  return (
514
- <button
504
+ <Button
515
505
  type="button"
516
506
  onClick={() => builderFlow.start({ trackingSource, trackingFlow })}
517
507
  disabled={builderFlow.connecting}
518
508
  className={cn(
519
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",
520
510
  isPage ? "px-4 py-3.5" : "px-3 py-3",
511
+ isPage ? "[&_svg]:!size-4" : "[&_svg]:!size-3.5",
521
512
  )}
522
513
  >
523
514
  <div className="flex items-start gap-2.5">
@@ -565,7 +556,7 @@ function UseBuilderCard({
565
556
  className="shrink-0 text-muted-foreground mt-0.5"
566
557
  />
567
558
  </div>
568
- </button>
559
+ </Button>
569
560
  );
570
561
  }
571
562
 
@@ -766,19 +757,21 @@ export function AppDefaultModelField({
766
757
  return (
767
758
  <div className="space-y-1.5">
768
759
  <p className={fieldLabelClass(isPage)}>Model</p>
769
- <input
770
- type="text"
771
- list={`app-model-suggestions-${engine}`}
760
+ <TextField
772
761
  value={value}
762
+ onChange={onValueChange}
773
763
  disabled={disabled}
774
- onChange={(event) => onValueChange(event.target.value)}
764
+ list={`app-model-suggestions-${engine}`}
775
765
  onKeyDown={(event) => {
776
766
  if (event.key === "Enter") onEnter?.();
777
767
  }}
778
768
  placeholder={defaultModel ?? "model-id"}
779
- spellCheck={false}
780
769
  autoComplete="off"
781
- 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
+ )}
782
775
  style={isPage ? CONTROL_STYLE_PAGE : CONTROL_STYLE}
783
776
  />
784
777
  {modelOptions.length > 0 && (
@@ -1180,7 +1173,7 @@ function LLMSectionInner({
1180
1173
 
1181
1174
  {isOpenAiEngine && (
1182
1175
  <div className="border-t border-border/70 pt-2">
1183
- <button
1176
+ <Button
1184
1177
  type="button"
1185
1178
  onClick={() => setAdvancedOpen((v) => !v)}
1186
1179
  className="flex w-full cursor-pointer items-center justify-between gap-2 rounded px-0.5 py-1 text-left hover:text-foreground"
@@ -1199,7 +1192,7 @@ function LLMSectionInner({
1199
1192
  <span className="truncate text-[10px] text-muted-foreground">
1200
1193
  OpenAI-compatible endpoint
1201
1194
  </span>
1202
- </button>
1195
+ </Button>
1203
1196
 
1204
1197
  {advancedOpen && (
1205
1198
  <div className="mt-1.5 space-y-1.5">
@@ -1238,21 +1231,23 @@ function LLMSectionInner({
1238
1231
  </p>
1239
1232
  {baseUrlConfigured && (
1240
1233
  <label className="flex items-center gap-1.5 text-[10px] text-muted-foreground">
1241
- <input
1242
- type="checkbox"
1234
+ <Checkbox
1243
1235
  checked={clearBaseUrl}
1244
- onChange={(e) => {
1245
- setClearBaseUrl(e.target.checked);
1246
- if (e.target.checked) setBaseUrl("");
1236
+ onChange={(checked) => {
1237
+ setClearBaseUrl(checked);
1238
+ if (checked) setBaseUrl("");
1247
1239
  }}
1248
- className="h-3 w-3 accent-current"
1240
+ aria-label="Clear saved endpoint override"
1241
+ className="shrink-0"
1249
1242
  />
1250
1243
  Clear saved endpoint override
1251
1244
  </label>
1252
1245
  )}
1253
1246
  {envVar && envConfigured && endpointChanged && (
1254
- <button
1247
+ <Button
1255
1248
  type="button"
1249
+ intent="neutral"
1250
+ emphasis="solid"
1256
1251
  onClick={handleSave}
1257
1252
  disabled={saving}
1258
1253
  className="rounded bg-accent px-2.5 py-1 text-[10px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40"
@@ -1264,7 +1259,7 @@ function LLMSectionInner({
1264
1259
  ) : (
1265
1260
  "Save endpoint"
1266
1261
  )}
1267
- </button>
1262
+ </Button>
1268
1263
  )}
1269
1264
  </div>
1270
1265
  )}
@@ -1294,7 +1289,9 @@ function LLMSectionInner({
1294
1289
  className={cn(textInputClass(isPage), "flex-1")}
1295
1290
  style={isPage ? CONTROL_STYLE_PAGE : undefined}
1296
1291
  />
1297
- <button
1292
+ <Button
1293
+ intent="primary"
1294
+ emphasis="solid"
1298
1295
  onClick={handleSave}
1299
1296
  disabled={!providerSettingsChanged || saving}
1300
1297
  className={pillButtonClass(isPage, "solid")}
@@ -1309,12 +1306,14 @@ function LLMSectionInner({
1309
1306
  ) : (
1310
1307
  "Save"
1311
1308
  )}
1312
- </button>
1309
+ </Button>
1313
1310
  </div>
1314
1311
  ) : null}
1315
1312
 
1316
1313
  <div className="flex items-center gap-2">
1317
- <button
1314
+ <Button
1315
+ intent="neutral"
1316
+ emphasis="outline"
1318
1317
  onClick={handleTest}
1319
1318
  disabled={testing}
1320
1319
  className={pillButtonClass(isPage, "outline")}
@@ -1330,19 +1329,23 @@ function LLMSectionInner({
1330
1329
  ) : (
1331
1330
  "Test"
1332
1331
  )}
1333
- </button>
1332
+ </Button>
1334
1333
  {engineChanged && (
1335
- <button
1334
+ <Button
1335
+ intent="primary"
1336
+ emphasis="solid"
1336
1337
  onClick={handleApply}
1337
1338
  className={pillButtonClass(isPage, "solid")}
1338
1339
  >
1339
1340
  Apply
1340
- </button>
1341
+ </Button>
1341
1342
  )}
1342
1343
  {settingsStatus != null && (
1343
1344
  <Tooltip>
1344
1345
  <TooltipTrigger asChild>
1345
- <button
1346
+ <Button
1347
+ intent="danger"
1348
+ emphasis="outline"
1346
1349
  onClick={handleDisconnect}
1347
1350
  className={cn(
1348
1351
  pillButtonClass(isPage, "outline"),
@@ -1350,7 +1353,7 @@ function LLMSectionInner({
1350
1353
  )}
1351
1354
  >
1352
1355
  Disconnect
1353
- </button>
1356
+ </Button>
1354
1357
  </TooltipTrigger>
1355
1358
  <TooltipContent>
1356
1359
  Clear the saved engine — the app will fall back to the
@@ -1663,8 +1666,10 @@ function AppModelDefaultsSectionInner({
1663
1666
  />
1664
1667
 
1665
1668
  <div className="flex items-center gap-1.5">
1666
- <button
1669
+ <Button
1667
1670
  type="button"
1671
+ intent="primary"
1672
+ emphasis="solid"
1668
1673
  onClick={save}
1669
1674
  disabled={!hasPendingChange || saving}
1670
1675
  className={pillButtonClass(isPage, "solid")}
@@ -1679,15 +1684,17 @@ function AppModelDefaultsSectionInner({
1679
1684
  ) : (
1680
1685
  "Save"
1681
1686
  )}
1682
- </button>
1683
- <button
1687
+ </Button>
1688
+ <Button
1684
1689
  type="button"
1690
+ intent="neutral"
1691
+ emphasis="outline"
1685
1692
  onClick={reset}
1686
1693
  disabled={!settings.canUpdate || !hasAppDefault || saving}
1687
1694
  className={pillButtonClass(isPage, "outline")}
1688
1695
  >
1689
1696
  Reset
1690
- </button>
1697
+ </Button>
1691
1698
  </div>
1692
1699
  </div>
1693
1700
 
@@ -1839,27 +1846,17 @@ function EmailSectionInner({
1839
1846
  <SettingsSkeleton lines={2} />
1840
1847
  ) : (
1841
1848
  <div className="space-y-2">
1842
- <label className="block space-y-1">
1843
- <span
1844
- className={cn(
1845
- "uppercase tracking-wide text-muted-foreground",
1846
- noteTextClass(isPage),
1847
- )}
1848
- >
1849
- Provider
1850
- </span>
1851
- <select
1852
- value={emailProvider}
1853
- onChange={(e) =>
1854
- setEmailProvider(e.target.value as "resend" | "sendgrid")
1855
- }
1856
- className={cn(textInputClass(isPage), "w-full")}
1857
- style={isPage ? CONTROL_STYLE_PAGE : undefined}
1858
- >
1859
- <option value="resend">Resend</option>
1860
- <option value="sendgrid">SendGrid</option>
1861
- </select>
1862
- </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
+ />
1863
1860
 
1864
1861
  {emailProvider === "resend" ? (
1865
1862
  <ManualSetupCard
@@ -1889,7 +1886,9 @@ function EmailSectionInner({
1889
1886
  placeholder="re_..."
1890
1887
  className={emailInputCls}
1891
1888
  />
1892
- <button
1889
+ <Button
1890
+ intent="primary"
1891
+ emphasis="solid"
1893
1892
  onClick={saveResend}
1894
1893
  disabled={!resendKey.trim() || saving}
1895
1894
  className={emailBtnCls}
@@ -1901,7 +1900,7 @@ function EmailSectionInner({
1901
1900
  ) : (
1902
1901
  "Save"
1903
1902
  )}
1904
- </button>
1903
+ </Button>
1905
1904
  </div>
1906
1905
  )}
1907
1906
  {fromConfigured ? (
@@ -1927,7 +1926,9 @@ function EmailSectionInner({
1927
1926
  className={emailInputCls}
1928
1927
  />
1929
1928
  {!resendConfigured ? null : (
1930
- <button
1929
+ <Button
1930
+ intent="primary"
1931
+ emphasis="solid"
1931
1932
  onClick={saveResend}
1932
1933
  disabled={!fromAddr.trim() || saving}
1933
1934
  className={emailBtnCls}
@@ -1939,7 +1940,7 @@ function EmailSectionInner({
1939
1940
  ) : (
1940
1941
  "Save"
1941
1942
  )}
1942
- </button>
1943
+ </Button>
1943
1944
  )}
1944
1945
  </div>
1945
1946
  )}
@@ -1972,7 +1973,9 @@ function EmailSectionInner({
1972
1973
  placeholder="SG...."
1973
1974
  className={emailInputCls}
1974
1975
  />
1975
- <button
1976
+ <Button
1977
+ intent="primary"
1978
+ emphasis="solid"
1976
1979
  onClick={saveSendgrid}
1977
1980
  disabled={!sendgridKey.trim() || saving}
1978
1981
  className={emailBtnCls}
@@ -1984,7 +1987,7 @@ function EmailSectionInner({
1984
1987
  ) : (
1985
1988
  "Save"
1986
1989
  )}
1987
- </button>
1990
+ </Button>
1988
1991
  </div>
1989
1992
  )}
1990
1993
  {fromConfigured ? (
@@ -2010,7 +2013,9 @@ function EmailSectionInner({
2010
2013
  className={emailInputCls}
2011
2014
  />
2012
2015
  {!sendgridConfigured ? null : (
2013
- <button
2016
+ <Button
2017
+ intent="primary"
2018
+ emphasis="solid"
2014
2019
  onClick={saveSendgrid}
2015
2020
  disabled={!fromAddr.trim() || saving}
2016
2021
  className={emailBtnCls}
@@ -2022,7 +2027,7 @@ function EmailSectionInner({
2022
2027
  ) : (
2023
2028
  "Save"
2024
2029
  )}
2025
- </button>
2030
+ </Button>
2026
2031
  )}
2027
2032
  </div>
2028
2033
  )}
@@ -2246,8 +2251,10 @@ function AgentLimitsSectionInner({
2246
2251
  )}
2247
2252
  style={isPage ? CONTROL_STYLE_PAGE : undefined}
2248
2253
  />
2249
- <button
2254
+ <Button
2250
2255
  type="button"
2256
+ intent="primary"
2257
+ emphasis="solid"
2251
2258
  onClick={save}
2252
2259
  disabled={!hasPendingChange || saving}
2253
2260
  className={pillButtonClass(isPage, "solid")}
@@ -2262,9 +2269,11 @@ function AgentLimitsSectionInner({
2262
2269
  ) : (
2263
2270
  "Save"
2264
2271
  )}
2265
- </button>
2266
- <button
2272
+ </Button>
2273
+ <Button
2267
2274
  type="button"
2275
+ intent="neutral"
2276
+ emphasis="outline"
2268
2277
  onClick={reset}
2269
2278
  disabled={
2270
2279
  !settings.canUpdate ||
@@ -2274,7 +2283,7 @@ function AgentLimitsSectionInner({
2274
2283
  className={pillButtonClass(isPage, "outline")}
2275
2284
  >
2276
2285
  Reset
2277
- </button>
2286
+ </Button>
2278
2287
  </div>
2279
2288
  {!settings.canUpdate && (
2280
2289
  <p
@@ -2313,51 +2322,6 @@ export interface SettingsPanelProps {
2313
2322
  sectionRequestKey?: number;
2314
2323
  }
2315
2324
 
2316
- function normalizeSettingsSection(
2317
- value?: string | null,
2318
- ): SettingsSectionId | null {
2319
- const normalized = value?.replace(/^#/, "").toLowerCase() ?? "";
2320
- if (!normalized) return null;
2321
- if (normalized.startsWith("secrets")) return "secrets";
2322
- if (
2323
- normalized === "workspace" ||
2324
- normalized === "workspace-settings" ||
2325
- normalized === "organization" ||
2326
- normalized === "org"
2327
- ) {
2328
- return "secrets";
2329
- }
2330
- if (normalized === "agent-engine") return "llm";
2331
- if (
2332
- normalized === "agent-model-defaults" ||
2333
- normalized === "app-model-defaults" ||
2334
- normalized === "models"
2335
- ) {
2336
- return "app-models";
2337
- }
2338
- if (normalized === "agent-limits" || normalized === "loop-settings") {
2339
- return "limits";
2340
- }
2341
- return SETTINGS_SECTION_IDS.has(normalized as SettingsSectionId)
2342
- ? (normalized as SettingsSectionId)
2343
- : null;
2344
- }
2345
-
2346
- function settingsSectionDomId(section: SettingsSectionId): string {
2347
- return `agent-settings-section-${section}`;
2348
- }
2349
-
2350
- function initialOpenSection(): SettingsSectionId {
2351
- if (typeof window === "undefined") return "llm";
2352
- return normalizeSettingsSection(window.location.hash) ?? "llm";
2353
- }
2354
-
2355
- function firstVisibleSection(
2356
- sections: readonly SettingsSectionId[],
2357
- ): SettingsSectionId {
2358
- return sections[0] ?? "llm";
2359
- }
2360
-
2361
2325
  // Agent capability modes. The internal values ("production"/"development") are
2362
2326
  // kept for back-compat with the AGENT_MODE wiring; only the visible labels
2363
2327
  // changed to "App mode" / "Code mode" so this control reads as the agent
@@ -2441,13 +2405,15 @@ function CapabilityStatusStrip({
2441
2405
  ) : builderConnected ? (
2442
2406
  "Connected"
2443
2407
  ) : (
2444
- <button
2408
+ <Button
2445
2409
  type="button"
2410
+ intent="neutral"
2411
+ emphasis="outline"
2446
2412
  onClick={onOpenLlm}
2447
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"
2448
2414
  >
2449
2415
  Connect
2450
- </button>
2416
+ </Button>
2451
2417
  )
2452
2418
  }
2453
2419
  />
@@ -2590,8 +2556,10 @@ function AccountSectionInner({
2590
2556
  className="hidden"
2591
2557
  onChange={handleAvatarChange}
2592
2558
  />
2593
- <button
2559
+ <Button
2594
2560
  type="button"
2561
+ intent="neutral"
2562
+ emphasis="outline"
2595
2563
  disabled={!email || uploading}
2596
2564
  onClick={() => fileInputRef.current?.click()}
2597
2565
  className={cn(
@@ -2602,7 +2570,7 @@ function AccountSectionInner({
2602
2570
  {uploading
2603
2571
  ? t("settings.profileUploading")
2604
2572
  : t("settings.profileChangePhoto")}
2605
- </button>
2573
+ </Button>
2606
2574
  </div>
2607
2575
  <form
2608
2576
  className="space-y-1.5"
@@ -2646,8 +2614,10 @@ function AccountSectionInner({
2646
2614
  </p>
2647
2615
  )}
2648
2616
  </div>
2649
- <button
2617
+ <Button
2650
2618
  type="submit"
2619
+ intent="primary"
2620
+ emphasis="solid"
2651
2621
  disabled={
2652
2622
  !email ||
2653
2623
  profileQuery.isLoading ||
@@ -2660,7 +2630,7 @@ function AccountSectionInner({
2660
2630
  {updateProfile.isPending
2661
2631
  ? t("settings.profileSaving")
2662
2632
  : t("settings.profileSave")}
2663
- </button>
2633
+ </Button>
2664
2634
  </div>
2665
2635
  </form>
2666
2636
  </SettingsSection>
@@ -2703,27 +2673,6 @@ function SettingsPanelContent({
2703
2673
  trackingSource: "settings_panel_builder_card",
2704
2674
  });
2705
2675
 
2706
- // When opened via a `#secrets:<KEY>` hash, focus that specific secret input
2707
- // inside the "API Keys & Connections" section.
2708
- const [focusSecretKey, setFocusSecretKey] = useState<string | undefined>(
2709
- undefined,
2710
- );
2711
- const visibleSections = useMemo(() => new Set(sections), [sections]);
2712
- const shouldShowSection = useCallback(
2713
- (section: SettingsSectionId) => visibleSections.has(section),
2714
- [visibleSections],
2715
- );
2716
-
2717
- // Accordion: only one section open at a time (null = all closed)
2718
- const [openSection, setOpenSection] = useState<string | null>(() => {
2719
- const initial = initialOpenSection();
2720
- return visibleSections.has(initial)
2721
- ? initial
2722
- : firstVisibleSection(sections);
2723
- });
2724
- const toggle = (id: string) =>
2725
- setOpenSection((prev) => (prev === id ? null : id));
2726
-
2727
2676
  const scrollSectionIntoView = useCallback((section: SettingsSectionId) => {
2728
2677
  window.requestAnimationFrame(() => {
2729
2678
  document.getElementById(settingsSectionDomId(section))?.scrollIntoView({
@@ -2732,47 +2681,23 @@ function SettingsPanelContent({
2732
2681
  });
2733
2682
  });
2734
2683
  }, []);
2735
-
2736
- const openSettingsSection = useCallback(
2737
- (section: SettingsSectionId, scroll = false) => {
2738
- setOpenSection(section);
2739
- if (scroll) scrollSectionIntoView(section);
2740
- },
2741
- [scrollSectionIntoView],
2742
- );
2743
-
2744
- useEffect(() => {
2745
- const section = normalizeSettingsSection(initialSection);
2746
- if (!section || !shouldShowSection(section)) return;
2747
- if (section !== "secrets") setFocusSecretKey(undefined);
2748
- openSettingsSection(section, true);
2749
- }, [
2684
+ const {
2685
+ focusSecretKey,
2686
+ isSectionVisible: shouldShowSection,
2687
+ openSection,
2688
+ toggleSection: toggle,
2689
+ openSettingsSection: openControllerSection,
2690
+ } = useSettingsPanelController({
2691
+ sections,
2750
2692
  initialSection,
2751
2693
  sectionRequestKey,
2752
- openSettingsSection,
2753
- shouldShowSection,
2754
- ]);
2755
-
2756
- // Support `#secrets:<KEY>` hash fragments from the onboarding CTA — opens
2757
- // the section and focuses the matching input.
2758
- useEffect(() => {
2759
- if (typeof window === "undefined") return;
2760
- const handleHash = () => {
2761
- const hash = window.location.hash?.replace(/^#/, "") ?? "";
2762
- const section = normalizeSettingsSection(hash);
2763
- if (!section || !shouldShowSection(section)) return;
2764
- if (hash.startsWith("secrets:") || hash === "secrets") {
2765
- const key = hash.slice("secrets:".length);
2766
- setFocusSecretKey(key || undefined);
2767
- } else {
2768
- setFocusSecretKey(undefined);
2769
- }
2770
- openSettingsSection(section, true);
2771
- };
2772
- handleHash();
2773
- window.addEventListener("hashchange", handleHash);
2774
- return () => window.removeEventListener("hashchange", handleHash);
2775
- }, [openSettingsSection, shouldShowSection]);
2694
+ onScrollToSection: scrollSectionIntoView,
2695
+ });
2696
+ const openSettingsSection = useCallback(
2697
+ (section: SettingsSectionId, scroll = false) =>
2698
+ openControllerSection(section, { scroll }),
2699
+ [openControllerSection],
2700
+ );
2776
2701
 
2777
2702
  const isPage = surface === "page";
2778
2703
 
@@ -3158,6 +3083,36 @@ export function SettingsPanel(props: SettingsPanelProps) {
3158
3083
  return <SettingsPanelContent {...props} />;
3159
3084
  }
3160
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
+
3161
3116
  export function ConnectionsSettingsContent({
3162
3117
  settingsPanelProps,
3163
3118
  }: {
@@ -3166,6 +3121,7 @@ export function ConnectionsSettingsContent({
3166
3121
  return (
3167
3122
  <div className="mx-auto w-full max-w-2xl space-y-4">
3168
3123
  <BuilderConnectCard trackingSource="settings_connections" />
3124
+ <McpConnectionsCard />
3169
3125
  <SettingsPanelContent
3170
3126
  {...settingsPanelProps}
3171
3127
  surface="page"