@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
@@ -6,7 +6,11 @@ import { agentNativePath } from "./api-path.js";
6
6
  const PROVIDER_ENV_VAR_SET = new Set(PROVIDER_ENV_VARS);
7
7
 
8
8
  /** `unknown` until the first check resolves, so callers don't flash the gate. */
9
- export type AgentEngineConfiguredState = "unknown" | "configured" | "missing";
9
+ export type AgentEngineConfiguredState =
10
+ | "unknown"
11
+ | "configured"
12
+ | "missing"
13
+ | "unavailable";
10
14
 
11
15
  export interface UseAgentEngineConfiguredResult {
12
16
  /** True once we know nothing can run the agent (no key / Builder / BYOK). */
@@ -30,7 +34,6 @@ export interface UseAgentEngineConfiguredOptions {
30
34
  }
31
35
 
32
36
  const DEFAULT_STATUS_CHECK_TIMEOUT_MS = 2500;
33
- const UNKNOWN_STATUS_RETRY_MS = 2000;
34
37
 
35
38
  async function fetchStatusJson(
36
39
  path: string,
@@ -108,11 +111,10 @@ export async function fetchAgentEngineConfiguredState(
108
111
  fetchStatusJson("/_agent-native/agent-engine/status", timeoutMs),
109
112
  ]);
110
113
 
111
- // All three failed — likely a flaky network; keep the caller in unknown.
112
- // Even an explicit missing-key stream event should not pin the composer into
113
- // setup without a fresh authoritative status response.
114
+ // All three failed — surface a retryable unavailable state instead of
115
+ // leaving the composer in an infinite checking loop.
114
116
  if (envKeys == null && builderStatus == null && engineStatus == null) {
115
- return "unknown";
117
+ return "unavailable";
116
118
  }
117
119
 
118
120
  const envKeysKnown = Array.isArray(envKeys);
@@ -138,7 +140,7 @@ export async function fetchAgentEngineConfiguredState(
138
140
  if (engineStatusKnown) return "missing";
139
141
 
140
142
  // Compatibility fallback for older hosts without the canonical route.
141
- return envKeysKnown && builderStatusKnown ? "missing" : "unknown";
143
+ return envKeysKnown && builderStatusKnown ? "missing" : "unavailable";
142
144
  }
143
145
 
144
146
  /**
@@ -146,7 +148,8 @@ export async function fetchAgentEngineConfiguredState(
146
148
  * composer and app prompt boxes. Checks the env-key / Builder / BYOK status
147
149
  * endpoints on mount, re-checks on `agent-engine:configured-changed`, and folds
148
150
  * in the adapter's `agent-chat:missing-api-key` signal. Pass `enabled = false`
149
- * to short-circuit to configured; flaky requests stay `unknown`.
151
+ * to short-circuit to configured; unavailable checks can be retried by firing
152
+ * `agent-engine:configured-changed`.
150
153
  */
151
154
  export function useAgentEngineConfigured(
152
155
  enabled = true,
@@ -156,25 +159,16 @@ export function useAgentEngineConfigured(
156
159
 
157
160
  useEffect(() => {
158
161
  let cancelled = false;
159
- let retryId: ReturnType<typeof setTimeout> | undefined;
160
162
  // Monotonic call counter: overlapping checks (mount + a
161
163
  // `agent-engine:configured-changed` fired right after a key is saved) can
162
164
  // resolve out of order; only the latest call may write state, or a slow
163
165
  // stale "missing" response would overwrite the fresh "configured" one.
164
166
  let requestSeq = 0;
165
167
  const check = async (options?: { missingFallback?: boolean }) => {
166
- if (retryId !== undefined) {
167
- clearTimeout(retryId);
168
- retryId = undefined;
169
- }
170
168
  const seq = ++requestSeq;
171
169
  const nextState = await fetchAgentEngineConfiguredState(enabled, options);
172
170
  if (cancelled || seq !== requestSeq) return;
173
- if (nextState === "unknown") {
174
- retryId = setTimeout(() => void check(), UNKNOWN_STATUS_RETRY_MS);
175
- return;
176
- }
177
- setState(nextState);
171
+ setState(nextState === "unknown" ? "unavailable" : nextState);
178
172
  };
179
173
  const onConfiguredChanged = () => {
180
174
  void check();
@@ -198,7 +192,6 @@ export function useAgentEngineConfigured(
198
192
  window.addEventListener("agent-chat:missing-api-key", onMissing);
199
193
  return () => {
200
194
  cancelled = true;
201
- if (retryId !== undefined) clearTimeout(retryId);
202
195
  window.removeEventListener(
203
196
  "agent-engine:configured-changed",
204
197
  onConfiguredChanged,
@@ -344,6 +344,24 @@ export function useChatThreads(
344
344
  const activeThreadIdRef = useRef(activeThreadId);
345
345
  activeThreadIdRef.current = activeThreadId;
346
346
 
347
+ const persistActiveThreadId = useCallback(
348
+ (id: string) => {
349
+ try {
350
+ const threadScope = readKnownThreadScope(id);
351
+ const targetKey =
352
+ threadScope === undefined
353
+ ? activeThreadKey
354
+ : activeThreadStorageKey(storageKey, threadScope);
355
+ localStorage.setItem(targetKey, id);
356
+ localStorage.setItem(
357
+ activeThreadSeenStorageKey(targetKey),
358
+ String(Date.now()),
359
+ );
360
+ } catch {}
361
+ },
362
+ [activeThreadKey, readKnownThreadScope, storageKey],
363
+ );
364
+
347
365
  // Persist active thread ID — and rehydrate on scope flips. When the user
348
366
  // navigates from deck A to deck B, `activeThreadKey` changes; we re-read B's
349
367
  // scoped thread only if the currently visible chat is itself scoped to a
@@ -388,6 +406,9 @@ export function useChatThreads(
388
406
  setActiveThreadId(nextActiveThreadId);
389
407
  return;
390
408
  }
409
+ if (!activeThreadId && !restoreActiveThread && !routeControlsActiveThread) {
410
+ return;
411
+ }
391
412
  try {
392
413
  if (routeControlsActiveThread && !routeThreadId) {
393
414
  localStorage.removeItem(activeThreadKey);
@@ -395,14 +416,7 @@ export function useChatThreads(
395
416
  return;
396
417
  }
397
418
  if (activeThreadId) {
398
- const threadScope = readKnownThreadScope(activeThreadId);
399
- if (threadScope === undefined) return;
400
- const targetKey = activeThreadStorageKey(storageKey, threadScope);
401
- localStorage.setItem(targetKey, activeThreadId);
402
- localStorage.setItem(
403
- activeThreadSeenStorageKey(targetKey),
404
- String(Date.now()),
405
- );
419
+ persistActiveThreadId(activeThreadId);
406
420
  } else {
407
421
  localStorage.removeItem(activeThreadKey);
408
422
  localStorage.removeItem(activeThreadSeenKey);
@@ -414,7 +428,9 @@ export function useChatThreads(
414
428
  activeThreadSeenKey,
415
429
  addOptimisticThread,
416
430
  autoCreate,
431
+ persistActiveThreadId,
417
432
  readKnownThreadScope,
433
+ restoreActiveThread,
418
434
  routeControlsActiveThread,
419
435
  routeThreadId,
420
436
  storageKey,
@@ -640,10 +656,11 @@ export function useChatThreads(
640
656
  const id = preferredId || createLocalThreadId();
641
657
  newlyCreatedRef.current.add(id);
642
658
  addOptimisticThread(id, scopeRef.current ?? null);
659
+ persistActiveThreadId(id);
643
660
  setActiveThreadId(id);
644
661
  return Promise.resolve(id);
645
662
  },
646
- [addOptimisticThread],
663
+ [addOptimisticThread, persistActiveThreadId],
647
664
  );
648
665
 
649
666
  useEffect(() => {
@@ -890,9 +907,13 @@ export function useChatThreads(
890
907
  [],
891
908
  );
892
909
 
893
- const switchThread = useCallback((id: string) => {
894
- setActiveThreadId(id);
895
- }, []);
910
+ const switchThread = useCallback(
911
+ (id: string) => {
912
+ persistActiveThreadId(id);
913
+ setActiveThreadId(id);
914
+ },
915
+ [persistActiveThreadId],
916
+ );
896
917
 
897
918
  const removeThread = useCallback(
898
919
  async (id: string) => {
@@ -32,6 +32,10 @@ const messages = {
32
32
  openTeamSettings: "Open team settings",
33
33
  openResourceSettings: "Open resource settings",
34
34
  backHome: "Back to home",
35
+ mcpConnectionsTitle: "MCP connections",
36
+ mcpConnectionsDescription:
37
+ "Connect remote MCP servers so the agent can use their tools.",
38
+ openMcpConnections: "Manage MCP connections",
35
39
  profileTitle: "Account",
36
40
  profileDescription: "Your name, profile photo, and signed-in identity.",
37
41
  profileLoading: "Loading...",
@@ -332,6 +336,7 @@ const messages = {
332
336
  addOwnKeys: "Add your own keys",
333
337
  configureProviderKeys: "Configure Anthropic, OpenAI, or another provider",
334
338
  checkingAiConnection: "Checking AI connection...",
339
+ connectionUnavailable: "Unable to check AI connection. Click to retry.",
335
340
  voiceMode: {
336
341
  entryButtonLabel: "Use microphone",
337
342
  promptTitle: "Use your voice",
@@ -54,6 +54,20 @@ export interface McpOAuthRoutesOptions {
54
54
  reconfigure: () => Promise<void>;
55
55
  }
56
56
 
57
+ export function redirectWithStagedCookies(
58
+ event: H3Event,
59
+ location: string,
60
+ ): Response {
61
+ const headers = new Headers({
62
+ Location: location,
63
+ "Cache-Control": "no-store",
64
+ });
65
+ for (const cookie of event.res?.headers?.getSetCookie?.() ?? []) {
66
+ headers.append("set-cookie", cookie);
67
+ }
68
+ return new Response(null, { status: 302, headers });
69
+ }
70
+
57
71
  export function mountMcpOAuthRoutes(
58
72
  nitroApp: any,
59
73
  options: McpOAuthRoutesOptions,
@@ -182,7 +196,7 @@ async function handleMcpOAuthStart(
182
196
  path: "/",
183
197
  maxAge: FLOW_TTL_SECONDS,
184
198
  });
185
- return Response.redirect(started.authorizationUrl.href, 302);
199
+ return redirectWithStagedCookies(event, started.authorizationUrl.href);
186
200
  } catch {
187
201
  setResponseStatus(event, 400);
188
202
  return {
@@ -254,7 +268,7 @@ async function handleMcpOAuthCallback(
254
268
  const returnPath =
255
269
  flow.returnUrl ??
256
270
  `/settings/connections?connected=mcp-${encodeURIComponent(flow.name)}`;
257
- return Response.redirect(getAppUrl(event, returnPath), 302);
271
+ return redirectWithStagedCookies(event, getAppUrl(event, returnPath));
258
272
  } catch {
259
273
  setResponseStatus(event, 400);
260
274
  return { error: "MCP OAuth authorization could not be completed." };
@@ -443,7 +443,11 @@ export async function run(
443
443
  // Terminal states resolve the poll; "input-required" means the remote is
444
444
  // blocked waiting on us, not making progress. Only actively-working
445
445
  // states count as liveness worth surfacing.
446
- const ACTIVELY_WORKING_STATES = new Set(["working", "submitted"]);
446
+ const ACTIVELY_WORKING_STATES = new Set([
447
+ "working",
448
+ "submitted",
449
+ "processing",
450
+ ]);
447
451
  const callStartedAt = Date.now();
448
452
  let lastProgressEmitAt = callStartedAt;
449
453
  const onRemotePollUpdate = (task: Task) => {
@@ -646,7 +646,7 @@ function createSessionHandler(
646
646
  },
647
647
  turn_detection: {
648
648
  type: "semantic_vad",
649
- create_response: true,
649
+ create_response: false,
650
650
  interrupt_response: true,
651
651
  eagerness: "auto",
652
652
  },
@@ -927,35 +927,11 @@
927
927
  display: inline-block;
928
928
  }
929
929
 
930
- .agent-tool-call {
931
- position: relative;
932
- }
933
-
934
930
  @media (prefers-reduced-motion: no-preference) {
935
931
  .agent-tool-call--entering {
936
932
  animation: agent-tool-call-enter 220ms var(--ease-out-strong) both;
937
933
  }
938
934
 
939
- .agent-tool-call[data-active-tail="true"]::after {
940
- position: absolute;
941
- z-index: 1;
942
- inset: 0 0 auto;
943
- height: 2rem;
944
- pointer-events: none;
945
- content: "";
946
- background: linear-gradient(
947
- 90deg,
948
- transparent 0%,
949
- transparent 38%,
950
- hsl(var(--foreground) / 0.055) 50%,
951
- transparent 62%,
952
- transparent 100%
953
- );
954
- background-repeat: repeat;
955
- background-size: 14rem 100%;
956
- animation: agent-thinking-shine 2.6s linear infinite;
957
- }
958
-
959
935
  @supports ((background-clip: text) or (-webkit-background-clip: text)) {
960
936
  .agent-thinking-indicator__text,
961
937
  .agent-running-shimmer {
@@ -47,6 +47,34 @@ Before creating an app-local version of repeated workspace or agent UI:
47
47
  Use public package exports at runtime. Published source and ejection manifests
48
48
  are discovery and ownership-transfer mechanisms, not private runtime APIs.
49
49
 
50
+ ## Design-System Boundary
51
+
52
+ Every app keeps an explicit design-system seam in `app/design-system.ts` using
53
+ `defineDesignSystem` from `@agent-native/toolkit/design-system`, and supplies it
54
+ to `ToolkitProvider`. The semantic contract contains:
55
+
56
+ - nine leaf components: `ActionButton`, `IconButton`, `TextField`, `TextArea`,
57
+ `Spinner`, `Skeleton`, `Status`, `Surface`, and `Avatar`
58
+ - eight behavior components: `Tooltip`, `Menu`, `Popover`, `Dialog`, `Picker`,
59
+ `Checkbox`, `Switch`, and `Tabs`
60
+
61
+ These are semantic contracts, not styling contracts. An adapter may use
62
+ Tailwind/shadcn, MUI-style theme providers, React Aria, CSS modules, CSS-in-JS,
63
+ or another React design system. Do not assume CVA, utility classes, or even a
64
+ `className`; behavior adapters may supply their overlay and focus
65
+ implementation wholesale while honoring portal, focus-restoration, keyboard,
66
+ dismissal, ARIA, and z-index interoperability.
67
+
68
+ Pages, routes, and domain components import ordinary controls through the app's
69
+ local adapter layer, usually `@/components/ui/*`. They must not import
70
+ `@agent-native/toolkit/ui/*` directly. Toolkit feature exports are still the
71
+ right home for shared workspace behavior; their presentation flows through the
72
+ registered semantic components, feature controller, and product-level slots.
73
+
74
+ Customer adapter packages are normal npm packages imported explicitly by the
75
+ app. Never auto-detect them or load React components from JSON. Run the adapter
76
+ against `@agent-native/toolkit/conformance` in customer CI before adopting it.
77
+
50
78
  ## Settings Direction
51
79
 
52
80
  Durable settings belong in the Settings app or a registered settings route. The
@@ -113,8 +141,9 @@ in the moment of agent use.
113
141
  When adding or refactoring one of these areas:
114
142
 
115
143
  1. Search existing framework and template code for duplicated UI or actions.
116
- 2. Decide the shared contract: data shape, action API, React component/hook, and
117
- app adapter points.
144
+ 2. Decide the shared contract: data shape, action API, feature-level headless
145
+ controller, default view, semantic components, and product-level render
146
+ slots.
118
147
  3. Keep shared data provider-agnostic and scoped by auth/sharing rules.
119
148
  4. Expose the same capability to the UI and agent through actions or documented
120
149
  client helpers.
@@ -125,6 +154,12 @@ When adding or refactoring one of these areas:
125
154
  ship readable source plus a complete ejection unit so apps can take ownership
126
155
  of the smallest feature when needed. See `customizing-agent-native` for the
127
156
  configure → compose → eject → propose seam ladder.
157
+ 8. Keep one controller as the source of truth for the default and custom render
158
+ paths. A custom design must not fork actions, analytics, async state, or
159
+ accessibility behavior.
160
+ 9. Verify the default adapter and at least one non-Tailwind adapter with the
161
+ conformance kit, including focus and portal stacking across mixed overlay
162
+ implementations.
128
163
 
129
164
  ## Related Skills
130
165
 
@@ -13,22 +13,93 @@ metadata:
13
13
 
14
14
  ## Rule
15
15
 
16
- Start with the public component and its props, slots, callbacks, and stable
17
- class names. If those seams are not enough, use the eject CLI to transfer the
18
- smallest supported feature into the app and make that copy app-owned. Never
19
- edit `node_modules`, deep-import a private source file at runtime, or patch an
20
- `@agent-native/*` package.
16
+ Start with the app's registered design system and local UI adapters, then use
17
+ the public feature's props, semantic components, controller, product slots,
18
+ and callbacks. If those seams are not enough, use the eject CLI to transfer
19
+ the smallest supported feature into the app and make that copy app-owned.
20
+ Never edit `node_modules`, deep-import a private source file at runtime, or
21
+ patch an `@agent-native/*` package.
21
22
 
22
23
  Use this order:
23
24
 
24
- 1. Configure the public component.
25
- 2. Compose public primitives behind a local app component.
26
- 3. Eject the smallest feature into app-owned source.
27
- 4. Propose a new Toolkit seam when the same override is useful in two apps.
25
+ 1. Set brand tokens with the build-time theme configuration when tokens are
26
+ enough.
27
+ 2. Register company components in `app/design-system.ts` with
28
+ `defineDesignSystem`, then pass that definition to `ToolkitProvider`.
29
+ 3. Configure a public feature through its semantic components, headless
30
+ controller, and product-level render slots.
31
+ 4. Compose app primitives behind the app's local UI adapter layer.
32
+ 5. Eject the smallest feature into app-owned source.
33
+ 6. Propose a new Toolkit seam when the same override is useful in two apps.
28
34
 
29
35
  Ejection is for intentional product customization, not for hiding an upgrade
30
36
  failure or replacing Core runtime behavior.
31
37
 
38
+ ## Use A Company Design System
39
+
40
+ Keep the explicit, typed registration seam in `app/design-system.ts`:
41
+
42
+ ```tsx
43
+ import { defineDesignSystem } from "@agent-native/toolkit/design-system";
44
+ import {
45
+ AcmeActionButtonAdapter,
46
+ AcmeDialogAdapter,
47
+ } from "./design-system/acme-adapter";
48
+
49
+ export const designSystem = defineDesignSystem({
50
+ name: "Acme",
51
+ components: {
52
+ ActionButton: AcmeActionButtonAdapter,
53
+ Dialog: AcmeDialogAdapter,
54
+ },
55
+ });
56
+ ```
57
+
58
+ Adapters translate the semantic Toolkit contract into company component props.
59
+ They are ordinary React components and may use MUI-style providers, React Aria,
60
+ CSS modules, CSS-in-JS, or another styling runtime. `className` and `style` are
61
+ optional interoperability hooks, not Tailwind or CVA requirements.
62
+
63
+ The contract has nine leaf components (`ActionButton`, `IconButton`,
64
+ `TextField`, `TextArea`, `Spinner`, `Skeleton`, `Status`, `Surface`, `Avatar`)
65
+ and eight behavior components (`Tooltip`, `Menu`, `Popover`, `Dialog`,
66
+ `Picker`, `Checkbox`, `Switch`, `Tabs`). `Picker` covers select and combobox
67
+ behavior, not date picking. Behavior adapters own their portal, focus,
68
+ keyboard, dismissal, and stacking implementation while honoring the semantic
69
+ props and `portalContainer` interop contract.
70
+
71
+ App product code imports standard controls from its local adapter path, usually
72
+ `@/components/ui/*`. Do not import `@agent-native/toolkit/ui/*` directly from
73
+ pages, routes, or domain components. That bypasses the app seam and makes a
74
+ future design-system replacement incomplete. Toolkit feature packages remain
75
+ valid imports; configure their presentation through the registered semantic
76
+ components, controller, and product slots.
77
+
78
+ Run the published conformance kit against a complete adapter in its own CI:
79
+
80
+ ```tsx
81
+ import { assertDesignSystemConformance } from "@agent-native/toolkit/conformance";
82
+ import { DESIGN_SYSTEM_CONTRACT_VERSION } from "@agent-native/toolkit/design-system";
83
+
84
+ await assertDesignSystemConformance({
85
+ adapterName: "Acme",
86
+ components,
87
+ contractVersion: DESIGN_SYSTEM_CONTRACT_VERSION,
88
+ });
89
+ ```
90
+
91
+ New components and optional props are minor contract changes. Required props,
92
+ removed APIs, or behavioral changes require a new contract major.
93
+
94
+ ## Customize A Shared Feature
95
+
96
+ Prefer feature-level headless controllers over rebuilding individual widgets.
97
+ One controller must power both the Toolkit default view and every custom render
98
+ path so behavior, actions, analytics, accessibility state, and error handling
99
+ cannot drift. Use a product-level render slot to replace the view while keeping
100
+ that controller. Eject only when the controller and slots cannot express the
101
+ required product behavior.
102
+
32
103
  ## Eject A Feature
33
104
 
34
105
  Discover and inspect the ejection units published by installed first-party
@@ -104,11 +175,14 @@ UI ownership may change; product contracts should not:
104
175
  Core. Do not copy those runtimes into the app.
105
176
  - Keep local adapters narrow so package upgrades still improve every surface
106
177
  the app has not intentionally taken ownership of.
178
+ - Keep page, route, and domain code on local UI adapter imports. Never reach
179
+ around the registered design system with direct Toolkit UI primitive imports.
107
180
 
108
181
  ## App Shapes
109
182
 
110
- - **Template app:** begin with its existing local adapters and domain UI. Use
111
- Toolkit for repeated workspace UI; eject only the unit being customized.
183
+ - **Template app:** begin with `app/design-system.ts`, its local UI adapters,
184
+ and domain UI. Use Toolkit features for repeated workspace behavior; eject
185
+ only the unit being customized.
112
186
  - **Chat app:** keep `AgentChatSurface`, thread state, and chat transport in
113
187
  Core. Compose or eject Toolkit presentation such as chat-history UI around it.
114
188
  - **Headless app:** stay action-first while no UI is needed. When adding a UI,
@@ -135,6 +209,7 @@ UI ownership may change; product contracts should not:
135
209
  - Don't copy Core auth, DB, action, agent-loop, or transport internals.
136
210
  - Don't manually copy a first-party unit with a missing recipe; fix its manifest.
137
211
  - Don't eject a full package when a prop, slot, wrapper, or smaller unit works.
212
+ - Don't fork feature state into a custom view; consume the feature's controller.
138
213
 
139
214
  ## Related Skills
140
215
 
@@ -57,10 +57,26 @@ Default to Apple/Linear-level restraint: make the primary workflow obvious, then
57
57
 
58
58
  ## Agent-Native UI Rules
59
59
 
60
- - Agent-native apps use React, Vite, Tailwind CSS, shadcn/ui, and `@tabler/icons-react`.
61
- - **Use shadcn/ui primitives for standard UI**: `DropdownMenu`, `Popover`, `Dialog`, `AlertDialog`, `Sheet`, `Tabs`, `Tooltip`, `Select`, `Command`, `Sidebar`, `Table`, `Card`, `Badge`, `Skeleton`, and related primitives.
60
+ - Agent-native apps use React and Vite. The default adapter uses Tailwind CSS,
61
+ shadcn/ui, and `@tabler/icons-react`, but an app may register a different
62
+ company design system in `app/design-system.ts`.
63
+ - **Use the app's design-system seam for standard UI.** Inspect
64
+ `app/design-system.ts`, `ToolkitProvider`, and the local UI adapter directory
65
+ before choosing a primitive. Use shadcn primitives when they are the active
66
+ adapter; use the registered company components when they are not.
62
67
  - **When touching shadcn/ui components, also read `shadcn-ui` if it exists.** That skill covers `components.json`, CLI docs, component composition, theming, and registry workflows.
63
68
  - Check `app/components/ui/` before importing a shadcn component. If a primitive is missing, add it from the app root with `pnpm dlx shadcn@latest add <component>`, then review the generated file.
69
+ - Pages, routes, and domain components must import controls through the app's
70
+ local adapter path, usually `@/components/ui/*`. Never import
71
+ `@agent-native/toolkit/ui/*` directly in app product code.
72
+ - Toolkit/Core feature presentation flows through the semantic components from
73
+ `@agent-native/toolkit/design-system`. Their props express intent, emphasis,
74
+ size, controlled values, and behavior; they do not require Tailwind, CVA, or
75
+ `className`.
76
+ - For deeper feature customization, consume the feature-level headless
77
+ controller through its product render slot. The same controller must power
78
+ the default and custom views. Eject the smallest supported unit only after
79
+ tokens, semantic components, controllers, and slots are insufficient.
64
80
  - Do not build custom dropdowns, menus, popovers, modals, or confirmations with manual absolute positioning and click-outside effects.
65
81
  - Never use browser dialogs (`window.alert`, `window.confirm`, `window.prompt`). Use `AlertDialog`, `Dialog`, or app-specific confirmation UI.
66
82
  - Use Tabler icons for all first-party UI icons. Do not add Lucide, Heroicons, inline SVG icon sets, or emoji icons.
@@ -103,10 +119,14 @@ For substantial frontend work:
103
119
  2. Start the dev server when the app needs one.
104
120
  3. Verify with browser screenshots at desktop and mobile widths.
105
121
  4. Check interactive states: hover, focus, loading, empty, error, and destructive confirmations.
122
+ 5. When registering or changing a company adapter, run
123
+ `@agent-native/toolkit/conformance`, including mixed-overlay focus,
124
+ `portalContainer`, and z-index stacking checks.
106
125
 
107
126
  ## Related Skills
108
127
 
109
128
  - **shadcn-ui** — shadcn CLI, component docs, composition rules, theming, and registries
129
+ - **customizing-agent-native** — Design-system registration, feature controllers, product slots, conformance, and ejection
110
130
  - **self-modifying-code** — The agent can edit source code to apply design changes
111
131
  - **storing-data** — All data lives in SQL; use actions for data access
112
132
  - **actions** — `useActionQuery`/`useActionMutation` hooks for frontend data fetching
@@ -17,10 +17,33 @@ This skill keeps shadcn/ui work project-aware. Components are source files in th
17
17
  ## First Steps
18
18
 
19
19
  1. Work from the app root that owns `components.json`.
20
- 2. Run `pnpm dlx shadcn@latest info --json` when you need current project context: framework, Tailwind version, aliases, icon library, installed components, and resolved paths.
21
- 3. Use the actual aliases from `components.json` or `shadcn info`; do not assume `@/components/ui` if the project says otherwise.
22
- 4. Check `app/components/ui/` or the resolved `ui` path before importing a component.
23
- 5. For unfamiliar components, run `pnpm dlx shadcn@latest docs <component>` and read the returned docs or examples before coding.
20
+ 2. In an Agent Native app, inspect `app/design-system.ts` and
21
+ `ToolkitProvider` before choosing a primitive. A registered company design
22
+ system takes precedence over the default shadcn adapter.
23
+ 3. Run `pnpm dlx shadcn@latest info --json` when you need current project context: framework, Tailwind version, aliases, icon library, installed components, and resolved paths.
24
+ 4. Use the actual aliases from `components.json` or `shadcn info`; do not assume `@/components/ui` if the project says otherwise.
25
+ 5. Check `app/components/ui/` or the resolved `ui` path before importing a component.
26
+ 6. For unfamiliar components, run `pnpm dlx shadcn@latest docs <component>` and read the returned docs or examples before coding.
27
+
28
+ ## Agent Native Adapter Rule
29
+
30
+ Pages, routes, and domain components import controls through the app's local UI
31
+ adapter layer. Never import `@agent-native/toolkit/ui/*` directly in app product
32
+ code. Direct imports bypass `app/design-system.ts` and make Toolkit/Core
33
+ surfaces use different controls from the app.
34
+
35
+ When shadcn is the app's adapter, add or update the local primitive and keep
36
+ product code on that local import. When a company design system is registered,
37
+ adapt its components to the semantic contracts from
38
+ `@agent-native/toolkit/design-system`; do not recreate a parallel shadcn
39
+ surface. The semantic API is styling-runtime agnostic, so do not require
40
+ Tailwind, CVA, or `className` in customer adapters.
41
+
42
+ For shared Toolkit features, customize presentation through semantic
43
+ components, a feature-level controller, and product-level render slots. Keep
44
+ the same controller for default and custom views. Use the conformance kit for
45
+ behavior components whose focus, portal, keyboard, dismissal, or stacking
46
+ behavior comes from the company design system.
24
47
 
25
48
  ## Adding Or Updating Components
26
49
 
@@ -91,5 +114,6 @@ Do not wrap triggers in extra divs just to place a Button or Link inside them.
91
114
  ## Related Skills
92
115
 
93
116
  - **frontend-design** — Product UX, visual direction, responsive polish, and verification
117
+ - **customizing-agent-native** — Registered design systems, controllers, slots, conformance, and ejection
94
118
  - **actions** — Data fetching and mutation patterns for agent-native apps
95
119
  - **security** — User data, forms, external input, and action safety
@@ -2,11 +2,16 @@ import { ToolkitProvider, type ToolkitComponents } from "@agent-native/toolkit";
2
2
  import type { ReactNode } from "react";
3
3
 
4
4
  import { Button } from "@/components/ui/button";
5
+ import { designSystem } from "@/design-system";
5
6
 
6
7
  const components: ToolkitComponents = {
7
8
  Button: Button as ToolkitComponents["Button"],
8
9
  };
9
10
 
10
11
  export function AppToolkitProvider({ children }: { children: ReactNode }) {
11
- return <ToolkitProvider components={components}>{children}</ToolkitProvider>;
12
+ return (
13
+ <ToolkitProvider components={components} designSystem={designSystem}>
14
+ {children}
15
+ </ToolkitProvider>
16
+ );
12
17
  }
@@ -0,0 +1,3 @@
1
+ import { defineDesignSystem } from "@agent-native/toolkit/design-system";
2
+
3
+ export const designSystem = defineDesignSystem({});
@@ -47,6 +47,34 @@ Before creating an app-local version of repeated workspace or agent UI:
47
47
  Use public package exports at runtime. Published source and ejection manifests
48
48
  are discovery and ownership-transfer mechanisms, not private runtime APIs.
49
49
 
50
+ ## Design-System Boundary
51
+
52
+ Every app keeps an explicit design-system seam in `app/design-system.ts` using
53
+ `defineDesignSystem` from `@agent-native/toolkit/design-system`, and supplies it
54
+ to `ToolkitProvider`. The semantic contract contains:
55
+
56
+ - nine leaf components: `ActionButton`, `IconButton`, `TextField`, `TextArea`,
57
+ `Spinner`, `Skeleton`, `Status`, `Surface`, and `Avatar`
58
+ - eight behavior components: `Tooltip`, `Menu`, `Popover`, `Dialog`, `Picker`,
59
+ `Checkbox`, `Switch`, and `Tabs`
60
+
61
+ These are semantic contracts, not styling contracts. An adapter may use
62
+ Tailwind/shadcn, MUI-style theme providers, React Aria, CSS modules, CSS-in-JS,
63
+ or another React design system. Do not assume CVA, utility classes, or even a
64
+ `className`; behavior adapters may supply their overlay and focus
65
+ implementation wholesale while honoring portal, focus-restoration, keyboard,
66
+ dismissal, ARIA, and z-index interoperability.
67
+
68
+ Pages, routes, and domain components import ordinary controls through the app's
69
+ local adapter layer, usually `@/components/ui/*`. They must not import
70
+ `@agent-native/toolkit/ui/*` directly. Toolkit feature exports are still the
71
+ right home for shared workspace behavior; their presentation flows through the
72
+ registered semantic components, feature controller, and product-level slots.
73
+
74
+ Customer adapter packages are normal npm packages imported explicitly by the
75
+ app. Never auto-detect them or load React components from JSON. Run the adapter
76
+ against `@agent-native/toolkit/conformance` in customer CI before adopting it.
77
+
50
78
  ## Settings Direction
51
79
 
52
80
  Durable settings belong in the Settings app or a registered settings route. The
@@ -113,8 +141,9 @@ in the moment of agent use.
113
141
  When adding or refactoring one of these areas:
114
142
 
115
143
  1. Search existing framework and template code for duplicated UI or actions.
116
- 2. Decide the shared contract: data shape, action API, React component/hook, and
117
- app adapter points.
144
+ 2. Decide the shared contract: data shape, action API, feature-level headless
145
+ controller, default view, semantic components, and product-level render
146
+ slots.
118
147
  3. Keep shared data provider-agnostic and scoped by auth/sharing rules.
119
148
  4. Expose the same capability to the UI and agent through actions or documented
120
149
  client helpers.
@@ -125,6 +154,12 @@ When adding or refactoring one of these areas:
125
154
  ship readable source plus a complete ejection unit so apps can take ownership
126
155
  of the smallest feature when needed. See `customizing-agent-native` for the
127
156
  configure → compose → eject → propose seam ladder.
157
+ 8. Keep one controller as the source of truth for the default and custom render
158
+ paths. A custom design must not fork actions, analytics, async state, or
159
+ accessibility behavior.
160
+ 9. Verify the default adapter and at least one non-Tailwind adapter with the
161
+ conformance kit, including focus and portal stacking across mixed overlay
162
+ implementations.
128
163
 
129
164
  ## Related Skills
130
165