@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,3 +1,4 @@
1
+ import { Tabs, useDesignSystem } from "@agent-native/toolkit/design-system";
1
2
  import {
2
3
  IconHistory,
3
4
  IconSearch,
@@ -252,7 +253,6 @@ export function SettingsTabsPage({
252
253
  : (tabs[0]?.id ?? "general");
253
254
  const tabGroups = useMemo(() => {
254
255
  const groups: Array<{ id: string; tabs: SettingsTabItem[] }> = [];
255
-
256
256
  for (const tab of tabs) {
257
257
  const groupId = tab.group ?? "app";
258
258
  const previousGroup = groups.at(-1);
@@ -262,7 +262,6 @@ export function SettingsTabsPage({
262
262
  groups.push({ id: groupId, tabs: [tab] });
263
263
  }
264
264
  }
265
-
266
265
  return groups;
267
266
  }, [tabs]);
268
267
  const isControlled = value !== undefined;
@@ -271,6 +270,8 @@ export function SettingsTabsPage({
271
270
  );
272
271
  const activeTab = isControlled ? value : internalTab;
273
272
  const [query, setQuery] = useState("");
273
+ const designSystem = useDesignSystem();
274
+ const hasCustomTabs = Boolean(designSystem?.components?.Tabs);
274
275
 
275
276
  const changeTab = useCallback(
276
277
  (tabId: string) => {
@@ -517,6 +518,26 @@ export function SettingsTabsPage({
517
518
  })
518
519
  )}
519
520
  </div>
521
+ ) : hasCustomTabs ? (
522
+ <Tabs
523
+ items={tabs.map((tab) => ({
524
+ value: tab.id,
525
+ label: tab.label,
526
+ icon: tab.icon ? <tab.icon className="size-4 shrink-0" /> : null,
527
+ // The panel stays outside this navigation rail so settings
528
+ // keeps its existing scroll container and deep-link behavior.
529
+ content: null,
530
+ }))}
531
+ value={activeTab}
532
+ onChange={(tabId) => {
533
+ const nextTab = String(tabId);
534
+ changeTab(nextTab);
535
+ if (!isControlled) updateHashForTab(nextTab);
536
+ }}
537
+ orientation="vertical"
538
+ aria-label={ariaLabel}
539
+ className="flex gap-1 overflow-x-auto sm:flex-col sm:overflow-x-visible"
540
+ />
520
541
  ) : (
521
542
  <nav
522
543
  aria-label={ariaLabel}
@@ -10,6 +10,7 @@
10
10
  * mirrors the server transcription route's key/env resolution.
11
11
  */
12
12
 
13
+ import { Switch } from "@agent-native/toolkit/design-system";
13
14
  import {
14
15
  IconAlertCircle,
15
16
  IconCheck,
@@ -467,24 +468,12 @@ export function VoiceTranscriptionSection() {
467
468
  </p>
468
469
  </div>
469
470
  <div className="flex shrink-0 flex-col items-end gap-1">
470
- <button
471
- type="button"
472
- role="switch"
473
- aria-checked={!!cleanupEnabled}
474
- onClick={() => toggleCleanup(!cleanupEnabled)}
475
- // Theme tokens; streaming agent owns layout.
476
- className={`relative inline-flex h-4 w-7 shrink-0 cursor-pointer items-center rounded-full transition-colors ${
477
- cleanupEnabled
478
- ? "bg-primary"
479
- : "bg-muted-foreground/30 hover:bg-muted-foreground/50"
480
- }`}
481
- >
482
- <span
483
- className={`inline-block h-3 w-3 transform rounded-full bg-background transition-transform ${
484
- cleanupEnabled ? "translate-x-3.5" : "translate-x-0.5"
485
- }`}
486
- />
487
- </button>
471
+ <Switch
472
+ checked={!!cleanupEnabled}
473
+ onChange={toggleCleanup}
474
+ aria-label="AI cleanup"
475
+ className="shrink-0"
476
+ />
488
477
  {cleanupEnabled && (
489
478
  <span className="text-[10px] text-muted-foreground">
490
479
  {builderStatus?.configured
@@ -25,3 +25,10 @@ export {
25
25
  type OpenBuilderConnectPopupOptions,
26
26
  } from "./useBuilderStatus.js";
27
27
  export { SecretsSection, type SecretsSectionProps } from "./SecretsSection.js";
28
+ export {
29
+ normalizeSettingsSection,
30
+ settingsSectionDomId,
31
+ useSettingsPanelController,
32
+ type SettingsPanelController,
33
+ type SettingsPanelControllerOptions,
34
+ } from "./useSettingsPanelController.js";
@@ -0,0 +1,155 @@
1
+ import { useCallback, useEffect, useMemo, useState } from "react";
2
+
3
+ import {
4
+ ALL_SETTINGS_SECTIONS,
5
+ SETTINGS_SECTION_IDS,
6
+ type SettingsSectionId,
7
+ } from "./agent-settings-search.js";
8
+
9
+ export interface SettingsPanelControllerOptions {
10
+ sections?: readonly SettingsSectionId[];
11
+ initialSection?: string | null;
12
+ sectionRequestKey?: number;
13
+ onScrollToSection?: (section: SettingsSectionId) => void;
14
+ }
15
+
16
+ export interface SettingsPanelController {
17
+ sections: readonly SettingsSectionId[];
18
+ openSection: SettingsSectionId | null;
19
+ focusSecretKey: string | undefined;
20
+ isSectionVisible: (section: SettingsSectionId) => boolean;
21
+ isSectionOpen: (section: SettingsSectionId) => boolean;
22
+ toggleSection: (section: SettingsSectionId) => void;
23
+ openSettingsSection: (
24
+ section: SettingsSectionId,
25
+ options?: { scroll?: boolean },
26
+ ) => void;
27
+ }
28
+
29
+ export function normalizeSettingsSection(
30
+ value?: string | null,
31
+ ): SettingsSectionId | null {
32
+ const normalized = value?.replace(/^#/, "").toLowerCase() ?? "";
33
+ if (!normalized) return null;
34
+ if (normalized.startsWith("secrets")) return "secrets";
35
+ if (
36
+ normalized === "workspace" ||
37
+ normalized === "workspace-settings" ||
38
+ normalized === "organization" ||
39
+ normalized === "org"
40
+ ) {
41
+ return "secrets";
42
+ }
43
+ if (normalized === "agent-engine") return "llm";
44
+ if (
45
+ normalized === "agent-model-defaults" ||
46
+ normalized === "app-model-defaults" ||
47
+ normalized === "models"
48
+ ) {
49
+ return "app-models";
50
+ }
51
+ if (normalized === "agent-limits" || normalized === "loop-settings") {
52
+ return "limits";
53
+ }
54
+ return SETTINGS_SECTION_IDS.has(normalized as SettingsSectionId)
55
+ ? (normalized as SettingsSectionId)
56
+ : null;
57
+ }
58
+
59
+ export function settingsSectionDomId(section: SettingsSectionId): string {
60
+ return `agent-settings-section-${section}`;
61
+ }
62
+
63
+ function firstVisibleSection(
64
+ sections: readonly SettingsSectionId[],
65
+ ): SettingsSectionId {
66
+ if (sections.includes("llm")) return "llm";
67
+ return sections[0] ?? "llm";
68
+ }
69
+
70
+ function initialOpenSection(
71
+ sections: readonly SettingsSectionId[],
72
+ ): SettingsSectionId {
73
+ const hashSection =
74
+ typeof window === "undefined"
75
+ ? null
76
+ : normalizeSettingsSection(window.location.hash);
77
+ return hashSection && sections.includes(hashSection)
78
+ ? hashSection
79
+ : firstVisibleSection(sections);
80
+ }
81
+
82
+ export function useSettingsPanelController({
83
+ sections = ALL_SETTINGS_SECTIONS,
84
+ initialSection,
85
+ sectionRequestKey,
86
+ onScrollToSection,
87
+ }: SettingsPanelControllerOptions = {}): SettingsPanelController {
88
+ const visibleSections = useMemo(() => new Set(sections), [sections]);
89
+ const isSectionVisible = useCallback(
90
+ (section: SettingsSectionId) => visibleSections.has(section),
91
+ [visibleSections],
92
+ );
93
+ const [openSection, setOpenSection] = useState<SettingsSectionId | null>(() =>
94
+ initialOpenSection(sections),
95
+ );
96
+ const [focusSecretKey, setFocusSecretKey] = useState<string>();
97
+
98
+ const openSettingsSection = useCallback(
99
+ (section: SettingsSectionId, options: { scroll?: boolean } = {}) => {
100
+ setOpenSection(section);
101
+ if (options.scroll) onScrollToSection?.(section);
102
+ },
103
+ [onScrollToSection],
104
+ );
105
+
106
+ const toggleSection = useCallback((section: SettingsSectionId) => {
107
+ setOpenSection((current) => (current === section ? null : section));
108
+ }, []);
109
+
110
+ const isSectionOpen = useCallback(
111
+ (section: SettingsSectionId) => openSection === section,
112
+ [openSection],
113
+ );
114
+
115
+ useEffect(() => {
116
+ const section = normalizeSettingsSection(initialSection);
117
+ if (!section || !isSectionVisible(section)) return;
118
+ if (section !== "secrets") setFocusSecretKey(undefined);
119
+ openSettingsSection(section, { scroll: true });
120
+ }, [
121
+ initialSection,
122
+ sectionRequestKey,
123
+ isSectionVisible,
124
+ openSettingsSection,
125
+ ]);
126
+
127
+ useEffect(() => {
128
+ if (typeof window === "undefined") return;
129
+ const handleHashChange = () => {
130
+ const hash = window.location.hash?.replace(/^#/, "") ?? "";
131
+ const section = normalizeSettingsSection(hash);
132
+ if (!section || !isSectionVisible(section)) return;
133
+ if (hash.startsWith("secrets:") || hash === "secrets") {
134
+ const key = hash.slice("secrets:".length);
135
+ setFocusSecretKey(key || undefined);
136
+ } else {
137
+ setFocusSecretKey(undefined);
138
+ }
139
+ openSettingsSection(section, { scroll: true });
140
+ };
141
+ handleHashChange();
142
+ window.addEventListener("hashchange", handleHashChange);
143
+ return () => window.removeEventListener("hashchange", handleHashChange);
144
+ }, [isSectionVisible, openSettingsSection]);
145
+
146
+ return {
147
+ sections,
148
+ openSection,
149
+ focusSecretKey,
150
+ isSectionVisible,
151
+ isSectionOpen,
152
+ toggleSection,
153
+ openSettingsSection,
154
+ };
155
+ }
@@ -1,39 +1,51 @@
1
- import { IconCheck, IconLoader2, IconPlugConnected } from "@tabler/icons-react";
1
+ import {
2
+ ActionButton,
3
+ DesignSystemErrorBoundary,
4
+ Status,
5
+ Surface,
6
+ } from "@agent-native/toolkit/design-system";
7
+ import { IconCheck, IconPlugConnected } from "@tabler/icons-react";
8
+ import type { ReactNode } from "react";
2
9
 
3
- import { useBuilderConnectFlow } from "../settings/useBuilderStatus.js";
4
10
  import { cn } from "../utils.js";
11
+ import {
12
+ useBuilderConnectCardController,
13
+ type BuilderConnectCardControllerOptions,
14
+ type BuilderConnectCardViewModel,
15
+ } from "./useBuilderConnectCardController.js";
5
16
 
6
- export interface BuilderConnectCardProps {
7
- title?: string;
8
- description?: string;
9
- trackingSource?: string;
17
+ export interface BuilderConnectCardProps extends BuilderConnectCardControllerOptions {
10
18
  className?: string;
11
- onConnected?: (orgName: string | null) => void;
19
+ render?: (context: BuilderConnectCardRenderContext) => ReactNode;
12
20
  }
13
21
 
14
- export function BuilderConnectCard({
15
- title = "Builder connect",
16
- description = "Connect Builder for managed model access, browser automation, and workspace identity.",
17
- trackingSource = "setup_connections_page",
18
- className,
19
- onConnected,
20
- }: BuilderConnectCardProps) {
21
- const flow = useBuilderConnectFlow({
22
- trackingSource,
23
- onConnected: ({ orgName }) => onConnected?.(orgName),
24
- });
22
+ export interface BuilderConnectCardRenderContext {
23
+ viewModel: BuilderConnectCardViewModel;
24
+ className?: string;
25
+ }
25
26
 
26
- const connectedLabel = flow.orgName
27
- ? `Connected to ${flow.orgName}`
28
- : "Connected";
29
- const statusLabel = !flow.hasFetchedStatus
30
- ? "Checking"
31
- : flow.configured
32
- ? connectedLabel
33
- : "Ready to connect";
27
+ export interface DefaultBuilderConnectCardViewProps {
28
+ viewModel: BuilderConnectCardViewModel;
29
+ className?: string;
30
+ }
31
+
32
+ export function DefaultBuilderConnectCardView({
33
+ viewModel,
34
+ className,
35
+ }: DefaultBuilderConnectCardViewProps) {
36
+ const action = viewModel.action;
37
+ const statusTone =
38
+ viewModel.status.kind === "connected"
39
+ ? "success"
40
+ : viewModel.status.kind === "checking"
41
+ ? "info"
42
+ : "neutral";
34
43
 
35
44
  return (
36
- <section
45
+ <Surface
46
+ as="section"
47
+ elevation="low"
48
+ padding="none"
37
49
  className={cn(
38
50
  "rounded-lg border border-border bg-background p-4 shadow-sm",
39
51
  className,
@@ -43,12 +55,12 @@ export function BuilderConnectCard({
43
55
  <span
44
56
  className={cn(
45
57
  "mt-0.5 flex size-8 shrink-0 items-center justify-center rounded-md border",
46
- flow.configured
58
+ viewModel.configured
47
59
  ? "border-emerald-500/30 bg-emerald-500/10 text-emerald-600"
48
60
  : "border-border bg-muted text-muted-foreground",
49
61
  )}
50
62
  >
51
- {flow.configured ? (
63
+ {viewModel.configured ? (
52
64
  <IconCheck className="size-4" />
53
65
  ) : (
54
66
  <IconPlugConnected className="size-4" />
@@ -56,34 +68,87 @@ export function BuilderConnectCard({
56
68
  </span>
57
69
  <div className="min-w-0 flex-1">
58
70
  <div className="flex flex-wrap items-center gap-2">
59
- <h2 className="text-sm font-semibold text-foreground">{title}</h2>
60
- <span className="rounded-md border border-border bg-muted px-1.5 py-0.5 text-[11px] font-medium text-muted-foreground">
61
- {statusLabel}
62
- </span>
71
+ <h2 className="text-sm font-semibold text-foreground">
72
+ {viewModel.title}
73
+ </h2>
74
+ <Status
75
+ tone={statusTone}
76
+ size="compact"
77
+ className="rounded-md border border-border bg-muted px-1.5 py-0.5 text-[11px] font-medium text-muted-foreground"
78
+ >
79
+ {viewModel.status.label}
80
+ </Status>
63
81
  </div>
64
82
  <p className="mt-1 text-sm leading-5 text-muted-foreground">
65
- {description}
83
+ {viewModel.description}
66
84
  </p>
67
- {flow.error ? (
68
- <p className="mt-2 text-xs text-destructive">{flow.error}</p>
85
+ {viewModel.error ? (
86
+ <p className="mt-2 text-xs text-destructive">{viewModel.error}</p>
69
87
  ) : null}
70
- {!flow.configured ? (
71
- <button
72
- type="button"
73
- onClick={() => flow.start()}
74
- disabled={flow.connecting}
75
- className="mt-3 inline-flex h-8 items-center gap-2 rounded-md border border-border bg-foreground px-3 text-xs font-medium text-background transition-colors hover:bg-foreground/90 disabled:cursor-not-allowed disabled:opacity-60"
76
- >
77
- {flow.connecting ? (
78
- <IconLoader2 className="size-3.5 animate-spin" />
79
- ) : (
80
- <IconPlugConnected className="size-3.5" />
81
- )}
82
- Connect Builder
83
- </button>
88
+ {action ? (
89
+ <div className="mt-3">
90
+ <ActionButton
91
+ type="button"
92
+ intent="primary"
93
+ size="compact"
94
+ pending={action.pending}
95
+ disabled={action.disabled}
96
+ className="inline-flex h-8 items-center gap-2 rounded-md border border-border bg-foreground px-3 text-xs font-medium text-background transition-colors hover:bg-foreground/90 disabled:cursor-not-allowed disabled:opacity-60"
97
+ leadingIcon={<IconPlugConnected className="size-3.5" />}
98
+ onPress={action.onPress}
99
+ >
100
+ {action.label}
101
+ </ActionButton>
102
+ </div>
84
103
  ) : null}
85
104
  </div>
86
105
  </div>
87
- </section>
106
+ </Surface>
88
107
  );
89
108
  }
109
+
110
+ export function BuilderConnectCard({
111
+ title,
112
+ description,
113
+ trackingSource,
114
+ className,
115
+ onConnected,
116
+ render,
117
+ }: BuilderConnectCardProps) {
118
+ const viewModel = useBuilderConnectCardController({
119
+ title,
120
+ description,
121
+ trackingSource,
122
+ onConnected,
123
+ });
124
+
125
+ const fallback = (
126
+ <DefaultBuilderConnectCardView
127
+ viewModel={viewModel}
128
+ className={className}
129
+ />
130
+ );
131
+ return render ? (
132
+ <DesignSystemErrorBoundary
133
+ component="BuilderConnectCard"
134
+ fallback={fallback}
135
+ >
136
+ <BuilderConnectCardCustomView
137
+ render={render}
138
+ viewModel={viewModel}
139
+ className={className}
140
+ />
141
+ </DesignSystemErrorBoundary>
142
+ ) : (
143
+ fallback
144
+ );
145
+ }
146
+
147
+ function BuilderConnectCardCustomView({
148
+ render,
149
+ viewModel,
150
+ className,
151
+ }: Required<Pick<BuilderConnectCardProps, "render">> &
152
+ BuilderConnectCardRenderContext) {
153
+ return render({ viewModel, className });
154
+ }
@@ -1,7 +1,17 @@
1
1
  export {
2
2
  BuilderConnectCard,
3
+ DefaultBuilderConnectCardView,
4
+ type DefaultBuilderConnectCardViewProps,
3
5
  type BuilderConnectCardProps,
6
+ type BuilderConnectCardRenderContext,
4
7
  } from "./BuilderConnectCard.js";
8
+ export {
9
+ useBuilderConnectCardController,
10
+ type BuilderConnectCardAction,
11
+ type BuilderConnectCardControllerOptions,
12
+ type BuilderConnectCardStatus,
13
+ type BuilderConnectCardViewModel,
14
+ } from "./useBuilderConnectCardController.js";
5
15
  export { BUILT_IN_SETUP_READINESS_UI_IDS } from "./catalog.js";
6
16
  export {
7
17
  ProviderReadinessBadge,
@@ -0,0 +1,82 @@
1
+ import { useCallback } from "react";
2
+
3
+ import { useBuilderConnectFlow } from "../settings/useBuilderStatus.js";
4
+
5
+ const DEFAULT_TITLE = "Builder connect";
6
+ const DEFAULT_DESCRIPTION =
7
+ "Connect Builder for managed model access, browser automation, and workspace identity.";
8
+ const DEFAULT_TRACKING_SOURCE = "setup_connections_page";
9
+
10
+ export interface BuilderConnectCardControllerOptions {
11
+ title?: string;
12
+ description?: string;
13
+ trackingSource?: string;
14
+ onConnected?: (orgName: string | null) => void;
15
+ }
16
+
17
+ export type BuilderConnectCardStatus =
18
+ | { kind: "checking"; label: "Checking" }
19
+ | { kind: "ready"; label: "Ready to connect" }
20
+ | { kind: "connected"; label: string };
21
+
22
+ export interface BuilderConnectCardAction {
23
+ label: "Connect Builder";
24
+ pending: boolean;
25
+ disabled: boolean;
26
+ onPress: () => void;
27
+ }
28
+
29
+ export interface BuilderConnectCardViewModel {
30
+ title: string;
31
+ description: string;
32
+ status: BuilderConnectCardStatus;
33
+ configured: boolean;
34
+ pending: boolean;
35
+ error: string | null;
36
+ orgName: string | null;
37
+ action: BuilderConnectCardAction | null;
38
+ }
39
+
40
+ export function useBuilderConnectCardController({
41
+ title = DEFAULT_TITLE,
42
+ description = DEFAULT_DESCRIPTION,
43
+ trackingSource = DEFAULT_TRACKING_SOURCE,
44
+ onConnected,
45
+ }: BuilderConnectCardControllerOptions = {}): BuilderConnectCardViewModel {
46
+ const handleConnected = useCallback(
47
+ ({ orgName }: { orgName: string | null }) => onConnected?.(orgName),
48
+ [onConnected],
49
+ );
50
+ const flow = useBuilderConnectFlow({
51
+ trackingSource,
52
+ onConnected: handleConnected,
53
+ });
54
+ const handlePress = useCallback(() => flow.start(), [flow.start]);
55
+
56
+ const status: BuilderConnectCardStatus = !flow.hasFetchedStatus
57
+ ? { kind: "checking", label: "Checking" }
58
+ : flow.configured
59
+ ? {
60
+ kind: "connected",
61
+ label: flow.orgName ? `Connected to ${flow.orgName}` : "Connected",
62
+ }
63
+ : { kind: "ready", label: "Ready to connect" };
64
+
65
+ return {
66
+ title,
67
+ description,
68
+ status,
69
+ configured: flow.configured,
70
+ pending: flow.connecting,
71
+ error: flow.error,
72
+ orgName: flow.orgName,
73
+ action: flow.configured
74
+ ? null
75
+ : {
76
+ label: "Connect Builder",
77
+ pending: flow.connecting,
78
+ disabled: flow.connecting,
79
+ onPress: handlePress,
80
+ },
81
+ };
82
+ }