@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
@@ -0,0 +1,559 @@
1
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
2
+
3
+ import { writeClipboardText } from "../clipboard.js";
4
+ import { useT } from "../i18n.js";
5
+ import {
6
+ extractShareErrorMessage,
7
+ optimisticallyUpdateShareCache,
8
+ rollbackShareCache,
9
+ useShareMutationGuard,
10
+ useShareMutations,
11
+ useShareOrgMemberSearch,
12
+ useShareQuery,
13
+ } from "./share-controller-helpers.js";
14
+ import type { ShareOrgMember } from "./share-controller-helpers.js";
15
+
16
+ export type ShareVisibility = "private" | "org" | "public";
17
+ export type ShareRole = "viewer" | "editor" | "admin";
18
+ export type ShareDialogTab = "link" | "invite" | "embed";
19
+
20
+ export interface ResourceShare {
21
+ id: string;
22
+ principalType: "user" | "org";
23
+ principalId: string;
24
+ displayName?: string | null;
25
+ role: ShareRole;
26
+ }
27
+
28
+ export interface ResourceSharesResponse {
29
+ ownerEmail: string | null;
30
+ orgId: string | null;
31
+ visibility: ShareVisibility | null;
32
+ role?: "owner" | ShareRole;
33
+ shares: ResourceShare[];
34
+ policy?: { allowPublic: boolean; requireOrgMemberForUserShares?: boolean };
35
+ }
36
+
37
+ export interface ShareDialogControllerOptions {
38
+ open: boolean;
39
+ onClose: () => void;
40
+ resourceType: string;
41
+ resourceId: string;
42
+ resourceTitle?: string;
43
+ shareUrl?: string;
44
+ embedUrl?: string;
45
+ }
46
+
47
+ export interface ShareOption<TValue extends string> {
48
+ value: TValue;
49
+ label: string;
50
+ description: string;
51
+ }
52
+
53
+ export interface ShareDialogPerson {
54
+ key: string;
55
+ label: string;
56
+ roleLabel: string;
57
+ principalType: "owner" | "user" | "org";
58
+ avatarText: string | null;
59
+ share: ResourceShare | null;
60
+ }
61
+
62
+ export interface ShareDialogController {
63
+ open: boolean;
64
+ onOpenChange: (open: boolean) => void;
65
+ close: () => void;
66
+ title: string;
67
+ ownerLabel: string | null;
68
+ activeTab: ShareDialogTab;
69
+ setActiveTab: (tab: ShareDialogTab) => void;
70
+ tabsEnabled: boolean;
71
+ tabs: Array<{ value: ShareDialogTab; label: string }>;
72
+ labels: {
73
+ close: string;
74
+ done: string;
75
+ shareOptions: string;
76
+ generalAccess: string;
77
+ shareLink: string;
78
+ peopleWithAccess: string;
79
+ addPeopleByEmail: string;
80
+ notifyPeople: string;
81
+ role: string;
82
+ remove: string;
83
+ noAccess: string;
84
+ copy: string;
85
+ embedUrl: string;
86
+ embedCode: string;
87
+ };
88
+ visibility: {
89
+ value: ShareVisibility;
90
+ label: string;
91
+ description: string;
92
+ options: Array<ShareOption<ShareVisibility>>;
93
+ disabled: boolean;
94
+ pending: boolean;
95
+ set: (visibility: ShareVisibility) => void;
96
+ };
97
+ invite: {
98
+ email: string;
99
+ setEmail: (email: string) => void;
100
+ role: ShareRole;
101
+ setRole: (role: ShareRole) => void;
102
+ roleOptions: Array<ShareOption<ShareRole>>;
103
+ notifyPeople: boolean;
104
+ setNotifyPeople: (notify: boolean) => void;
105
+ showNotifyPeople: boolean;
106
+ disabled: boolean;
107
+ pending: boolean;
108
+ submit: () => void;
109
+ };
110
+ people: ShareDialogPerson[];
111
+ removeShare: (share: ResourceShare) => void;
112
+ removing: boolean;
113
+ shareUrl?: string;
114
+ embedUrl?: string;
115
+ embedCode?: string;
116
+ copiedField: string | null;
117
+ copy: (field: string, value: string) => Promise<boolean>;
118
+ loading: boolean;
119
+ error: unknown;
120
+ refetch: () => unknown;
121
+ canManage: boolean;
122
+ }
123
+
124
+ export function useShareDialogController({
125
+ open,
126
+ onClose,
127
+ resourceType,
128
+ resourceId,
129
+ resourceTitle,
130
+ shareUrl,
131
+ embedUrl,
132
+ }: ShareDialogControllerOptions): ShareDialogController {
133
+ const t = useT();
134
+ const {
135
+ query: sharesQuery,
136
+ queryKey: shareQueryKey,
137
+ queryClient,
138
+ } = useShareQuery<ResourceSharesResponse>(resourceType, resourceId);
139
+ const {
140
+ share: shareMutation,
141
+ unshare: unshareMutation,
142
+ setVisibility: visibilityMutation,
143
+ } = useShareMutations();
144
+ const memberSearch = useShareOrgMemberSearch("", true, {
145
+ limit: undefined,
146
+ debounceMs: 0,
147
+ });
148
+ const orgMembers = memberSearch.members;
149
+ const hasLinkTab = Boolean(shareUrl);
150
+ const hasEmbedTab = Boolean(embedUrl);
151
+ const tabsEnabled = hasLinkTab || hasEmbedTab;
152
+ const [activeTab, setActiveTab] = useState<ShareDialogTab>(
153
+ hasLinkTab ? "link" : "invite",
154
+ );
155
+ const [email, setEmail] = useState("");
156
+ const [role, setRole] = useState<ShareRole>("viewer");
157
+ const [notifyPeople, setNotifyPeople] = useState(true);
158
+ const [copiedField, setCopiedField] = useState<string | null>(null);
159
+ const [visibilityOverride, setVisibilityOverride] =
160
+ useState<ShareVisibility | null>(null);
161
+ const [mutationError, setMutationError] = useState<unknown>(null);
162
+ const visibilityGuard = useShareMutationGuard();
163
+ const copyResetTimer = useRef<ReturnType<typeof setTimeout> | null>(null);
164
+
165
+ useEffect(() => {
166
+ if (open) setActiveTab(hasLinkTab ? "link" : "invite");
167
+ }, [hasLinkTab, open]);
168
+
169
+ useEffect(
170
+ () => () => {
171
+ if (copyResetTimer.current) clearTimeout(copyResetTimer.current);
172
+ },
173
+ [],
174
+ );
175
+
176
+ const data = sharesQuery.data;
177
+ const visibility = visibilityOverride ?? data?.visibility ?? "private";
178
+ const canManage = data?.role === "owner" || data?.role === "admin";
179
+ const visibilityOptions = useMemo(
180
+ () =>
181
+ (["private", "org", "public"] as const)
182
+ .filter(
183
+ (value) =>
184
+ value !== "public" ||
185
+ value === visibility ||
186
+ data?.policy?.allowPublic !== false,
187
+ )
188
+ .map((value) => visibilityOption(value, t)),
189
+ [data?.policy?.allowPublic, t, visibility],
190
+ );
191
+ const roleOptions = useMemo(
192
+ () =>
193
+ (["viewer", "editor", "admin"] as const).map((value) =>
194
+ roleOption(value, t),
195
+ ),
196
+ [t],
197
+ );
198
+
199
+ const refetch = useCallback(() => sharesQuery.refetch(), [sharesQuery]);
200
+ const setVisibility = useCallback(
201
+ (next: ShareVisibility) => {
202
+ if (!canManage || next === visibility) return;
203
+ const requestId = visibilityGuard.begin();
204
+ const previous = optimisticallyUpdateShareCache<ResourceSharesResponse>(
205
+ queryClient,
206
+ shareQueryKey,
207
+ (cached) => (cached ? { ...cached, visibility: next } : cached),
208
+ );
209
+ setMutationError(null);
210
+ setVisibilityOverride(next);
211
+ visibilityMutation.mutate(
212
+ { resourceType, resourceId, visibility: next } as never,
213
+ {
214
+ onSuccess: (result: unknown) => {
215
+ if (visibilityGuard.isLatest(requestId)) {
216
+ const resultVisibility =
217
+ typeof result === "object" &&
218
+ result !== null &&
219
+ "visibility" in result &&
220
+ (result as { visibility?: unknown }).visibility;
221
+ optimisticallyUpdateShareCache<ResourceSharesResponse>(
222
+ queryClient,
223
+ shareQueryKey,
224
+ (cached) =>
225
+ cached
226
+ ? {
227
+ ...cached,
228
+ visibility:
229
+ (resultVisibility as ShareVisibility | undefined) ??
230
+ next,
231
+ }
232
+ : cached,
233
+ );
234
+ }
235
+ if (!visibilityGuard.isLatest(requestId)) return;
236
+ Promise.resolve(refetch())
237
+ .catch((error) => {
238
+ if (visibilityGuard.isLatest(requestId)) {
239
+ setMutationError(extractShareErrorMessage(error));
240
+ }
241
+ })
242
+ .finally(() => {
243
+ if (visibilityGuard.isLatest(requestId)) {
244
+ setVisibilityOverride(null);
245
+ }
246
+ });
247
+ },
248
+ onError: (error: unknown) => {
249
+ if (visibilityGuard.isLatest(requestId)) {
250
+ rollbackShareCache(queryClient, shareQueryKey, previous);
251
+ setVisibilityOverride(null);
252
+ setMutationError(extractShareErrorMessage(error));
253
+ }
254
+ },
255
+ },
256
+ );
257
+ },
258
+ [
259
+ canManage,
260
+ refetch,
261
+ resourceId,
262
+ resourceType,
263
+ queryClient,
264
+ shareQueryKey,
265
+ visibility,
266
+ visibilityGuard,
267
+ visibilityMutation,
268
+ ],
269
+ );
270
+ const submitInvite = useCallback(() => {
271
+ const principalId = email.trim();
272
+ if (!canManage || !principalId) return;
273
+ const optimistic: ResourceShare = {
274
+ id: `pending-${principalId}`,
275
+ principalType: "user",
276
+ principalId,
277
+ role,
278
+ };
279
+ const previous = optimisticallyUpdateShareCache<ResourceSharesResponse>(
280
+ queryClient,
281
+ shareQueryKey,
282
+ (cached) =>
283
+ cached ? { ...cached, shares: [...cached.shares, optimistic] } : cached,
284
+ );
285
+ setMutationError(null);
286
+ shareMutation.mutate(
287
+ {
288
+ resourceType,
289
+ resourceId,
290
+ principalType: "user",
291
+ principalId,
292
+ role,
293
+ notify: notifyPeople,
294
+ resourceUrl: getNotificationUrl(shareUrl),
295
+ } as never,
296
+ {
297
+ onSuccess: () => {
298
+ setEmail("");
299
+ void refetch();
300
+ },
301
+ onError: (error: unknown) => {
302
+ rollbackShareCache(queryClient, shareQueryKey, previous);
303
+ setMutationError(extractShareErrorMessage(error));
304
+ },
305
+ },
306
+ );
307
+ }, [
308
+ canManage,
309
+ email,
310
+ notifyPeople,
311
+ refetch,
312
+ resourceId,
313
+ resourceType,
314
+ role,
315
+ queryClient,
316
+ shareQueryKey,
317
+ shareMutation,
318
+ shareUrl,
319
+ ]);
320
+ const removeShare = useCallback(
321
+ (share: ResourceShare) => {
322
+ if (!canManage) return;
323
+ const previous = optimisticallyUpdateShareCache<ResourceSharesResponse>(
324
+ queryClient,
325
+ shareQueryKey,
326
+ (cached) =>
327
+ cached
328
+ ? {
329
+ ...cached,
330
+ shares: cached.shares.filter(
331
+ (current) =>
332
+ !(
333
+ current.principalType === share.principalType &&
334
+ current.principalId === share.principalId
335
+ ),
336
+ ),
337
+ }
338
+ : cached,
339
+ );
340
+ setMutationError(null);
341
+ unshareMutation.mutate(
342
+ {
343
+ resourceType,
344
+ resourceId,
345
+ principalType: share.principalType,
346
+ principalId: share.principalId,
347
+ } as never,
348
+ {
349
+ onSuccess: refetch,
350
+ onError: (error: unknown) => {
351
+ rollbackShareCache(queryClient, shareQueryKey, previous);
352
+ setMutationError(extractShareErrorMessage(error));
353
+ },
354
+ },
355
+ );
356
+ },
357
+ [
358
+ canManage,
359
+ queryClient,
360
+ refetch,
361
+ resourceId,
362
+ resourceType,
363
+ shareQueryKey,
364
+ unshareMutation,
365
+ ],
366
+ );
367
+ const copy = useCallback(async (field: string, value: string) => {
368
+ const copied = await writeClipboardText(value);
369
+ if (!copied) {
370
+ setCopiedField(null);
371
+ return false;
372
+ }
373
+ setCopiedField(field);
374
+ if (copyResetTimer.current) clearTimeout(copyResetTimer.current);
375
+ copyResetTimer.current = setTimeout(() => setCopiedField(null), 1_400);
376
+ return true;
377
+ }, []);
378
+
379
+ const currentVisibility = visibilityOption(visibility, t);
380
+ const people = buildPeople(data, orgMembers, t);
381
+
382
+ return {
383
+ open,
384
+ onOpenChange: (nextOpen) => {
385
+ if (!nextOpen) onClose();
386
+ },
387
+ close: onClose,
388
+ title: resourceTitle
389
+ ? t("share.titleWithResource", { title: resourceTitle })
390
+ : t("share.titleWithType", { type: resourceType }),
391
+ ownerLabel: data?.ownerEmail
392
+ ? t("share.owner", {
393
+ name: displayName(data.ownerEmail, orgMembers),
394
+ })
395
+ : null,
396
+ activeTab,
397
+ setActiveTab,
398
+ tabsEnabled,
399
+ tabs: [
400
+ ...(hasLinkTab
401
+ ? [{ value: "link" as const, label: t("share.link") }]
402
+ : []),
403
+ { value: "invite", label: t("share.invite") },
404
+ ...(hasEmbedTab
405
+ ? [{ value: "embed" as const, label: t("share.embed") }]
406
+ : []),
407
+ ],
408
+ labels: {
409
+ close: t("share.close"),
410
+ done: t("share.done"),
411
+ shareOptions: t("share.shareOptions"),
412
+ generalAccess: t("share.generalAccess"),
413
+ shareLink: t("share.shareLink"),
414
+ peopleWithAccess: t("share.peopleWithAccess"),
415
+ addPeopleByEmail: t("share.addPeopleByEmail"),
416
+ notifyPeople: t("share.notifyPeople"),
417
+ role: t("share.role"),
418
+ remove: t("share.remove"),
419
+ noAccess: t("share.noAccess"),
420
+ copy: t("share.copy"),
421
+ embedUrl: t("share.embedUrl"),
422
+ embedCode: t("share.embedCode"),
423
+ },
424
+ visibility: {
425
+ value: visibility,
426
+ label: currentVisibility.label,
427
+ description: currentVisibility.description,
428
+ options: visibilityOptions,
429
+ disabled: !canManage,
430
+ pending: visibilityMutation.isPending,
431
+ set: setVisibility,
432
+ },
433
+ invite: {
434
+ email,
435
+ setEmail,
436
+ role,
437
+ setRole,
438
+ roleOptions,
439
+ notifyPeople,
440
+ setNotifyPeople,
441
+ showNotifyPeople: email.trim().length > 0,
442
+ disabled: !canManage || email.trim().length === 0,
443
+ pending: shareMutation.isPending,
444
+ submit: submitInvite,
445
+ },
446
+ people,
447
+ removeShare,
448
+ removing: unshareMutation.isPending,
449
+ shareUrl,
450
+ embedUrl,
451
+ embedCode: embedUrl ? createEmbedCode(embedUrl) : undefined,
452
+ copiedField,
453
+ copy,
454
+ loading: sharesQuery.isLoading,
455
+ error: sharesQuery.error ?? mutationError,
456
+ refetch,
457
+ canManage,
458
+ };
459
+ }
460
+
461
+ function visibilityOption(
462
+ visibility: ShareVisibility,
463
+ t: ReturnType<typeof useT>,
464
+ ): ShareOption<ShareVisibility> {
465
+ const keys = {
466
+ private: ["share.private", "share.privateDescription"],
467
+ org: ["share.organization", "share.organizationDescription"],
468
+ public: ["share.public", "share.publicDescription"],
469
+ } as const;
470
+ return {
471
+ value: visibility,
472
+ label: t(keys[visibility][0]),
473
+ description: t(keys[visibility][1]),
474
+ };
475
+ }
476
+
477
+ function roleOption(
478
+ role: ShareRole,
479
+ t: ReturnType<typeof useT>,
480
+ ): ShareOption<ShareRole> {
481
+ const keys = {
482
+ viewer: ["share.viewer", "share.viewerDescription"],
483
+ editor: ["share.editor", "share.editorDescription"],
484
+ admin: ["share.admin", "share.adminDescription"],
485
+ } as const;
486
+ return {
487
+ value: role,
488
+ label: t(keys[role][0]),
489
+ description: t(keys[role][1]),
490
+ };
491
+ }
492
+
493
+ function buildPeople(
494
+ data: ResourceSharesResponse | undefined,
495
+ members: ShareOrgMember[],
496
+ t: ReturnType<typeof useT>,
497
+ ): ShareDialogPerson[] {
498
+ const people: ShareDialogPerson[] = [];
499
+ if (data?.ownerEmail) {
500
+ const label = displayName(data.ownerEmail, members);
501
+ people.push({
502
+ key: `owner:${data.ownerEmail}`,
503
+ label,
504
+ roleLabel: t("share.ownerRole"),
505
+ principalType: "owner",
506
+ avatarText: avatarText(label),
507
+ share: null,
508
+ });
509
+ }
510
+ for (const share of data?.shares ?? []) {
511
+ const label = principalLabel(share, members);
512
+ people.push({
513
+ key: `${share.principalType}:${share.principalId}`,
514
+ label,
515
+ roleLabel: capitalize(share.role),
516
+ principalType: share.principalType,
517
+ avatarText: share.principalType === "org" ? null : avatarText(label),
518
+ share,
519
+ });
520
+ }
521
+ return people;
522
+ }
523
+
524
+ function displayName(email: string, members: ShareOrgMember[]): string {
525
+ const normalized = email.trim().toLowerCase();
526
+ const match = members.find(
527
+ (member) => member.email.toLowerCase() === normalized,
528
+ );
529
+ if (match?.name?.trim()) return match.name;
530
+ return normalized.includes("@") ? email : "Unknown person";
531
+ }
532
+
533
+ function principalLabel(
534
+ share: ResourceShare,
535
+ members: ShareOrgMember[],
536
+ ): string {
537
+ const serverLabel = share.displayName?.trim();
538
+ if (serverLabel) return serverLabel;
539
+ if (share.principalType === "org") return "Organization";
540
+ return displayName(share.principalId, members);
541
+ }
542
+
543
+ function avatarText(label: string): string {
544
+ return (label.split("@")[0]?.[0] ?? label[0] ?? "?").toUpperCase();
545
+ }
546
+
547
+ function capitalize(value: string): string {
548
+ return value.charAt(0).toUpperCase() + value.slice(1);
549
+ }
550
+
551
+ function getNotificationUrl(explicit?: string): string | undefined {
552
+ if (explicit) return explicit;
553
+ if (typeof window === "undefined") return undefined;
554
+ return window.location.href;
555
+ }
556
+
557
+ function createEmbedCode(embedUrl: string): string {
558
+ return `<div style="position:relative;padding-bottom:56.25%;height:0"><iframe src="${embedUrl}" frameborder="0" allowfullscreen allow="autoplay; picture-in-picture" style="position:absolute;inset:0;width:100%;height:100%"></iframe></div>`;
559
+ }
@@ -974,6 +974,27 @@ function completedToolOnlyMessage(toolNames: string[]): string | null {
974
974
  return `The agent completed ${label}, but stopped before sending a final message. Review the completed tool card above or ask the agent to continue.`;
975
975
  }
976
976
 
977
+ function hasCompletedCustomUi(content: ContentPart[]): boolean {
978
+ const lastTextIndex = lastAssistantTextIndex(content);
979
+ let lastCompletedToolIsCustomUi = false;
980
+ let hasCompletedTool = false;
981
+ for (let index = lastTextIndex + 1; index < content.length; index++) {
982
+ const part = content[index];
983
+ if (
984
+ part?.type !== "tool-call" ||
985
+ part.activity === true ||
986
+ part.result === undefined ||
987
+ part.isError === true
988
+ ) {
989
+ continue;
990
+ }
991
+ hasCompletedTool = true;
992
+ lastCompletedToolIsCustomUi =
993
+ part.chatUI !== undefined || part.mcpApp !== undefined;
994
+ }
995
+ return hasCompletedTool && lastCompletedToolIsCustomUi;
996
+ }
997
+
977
998
  export function appendMissingFinalResponseWarning(
978
999
  content: ContentPart[],
979
1000
  completedToolNames?: Iterable<string>,
@@ -997,6 +1018,7 @@ export function appendMissingFinalResponseWarning(
997
1018
  materializedToolNames.add(part.toolName);
998
1019
  }
999
1020
  }
1021
+ if (hasCompletedCustomUi(content)) return null;
1000
1022
  if (successfulToolNames.length === 0 && lastTextIndex > lastToolIndex) {
1001
1023
  return null;
1002
1024
  }
@@ -1350,6 +1372,7 @@ export function processEvent(
1350
1372
  toolName: `agent:${agentName}`,
1351
1373
  argsText: "",
1352
1374
  args: {},
1375
+ activity: true,
1353
1376
  });
1354
1377
  } else if (ev.status === "done" || ev.status === "error") {
1355
1378
  for (let i = content.length - 1; i >= 0; i--) {
@@ -39,3 +39,74 @@ export function humanizeToolLabelText(
39
39
  if (!tool) return text;
40
40
  return text.split(tool).join(humanizeToolName(tool));
41
41
  }
42
+
43
+ type ToolDisplayPart = {
44
+ type?: string;
45
+ toolCallId?: string;
46
+ toolName?: string;
47
+ argsText?: string;
48
+ args?: Record<string, unknown>;
49
+ };
50
+
51
+ function normalizedAgentName(value: unknown): string | null {
52
+ if (typeof value !== "string") return null;
53
+ const name = value.trim().toLowerCase();
54
+ return name || null;
55
+ }
56
+
57
+ function callAgentTarget(part: ToolDisplayPart): string | null {
58
+ const parsedTarget = normalizedAgentName(part.args?.agent);
59
+ if (parsedTarget) return parsedTarget;
60
+ if (!part.argsText) return null;
61
+
62
+ try {
63
+ const args = JSON.parse(part.argsText) as Record<string, unknown>;
64
+ return normalizedAgentName(args.agent);
65
+ } catch {
66
+ return null;
67
+ }
68
+ }
69
+
70
+ /**
71
+ * `call-agent` emits both its ordinary tool row and a richer `agent:<name>`
72
+ * progress row. Keep the ordinary part in message state for tool completion
73
+ * and history, but let presentation code suppress it once the richer row is
74
+ * available.
75
+ */
76
+ export function isCallAgentToolCallShadowed(
77
+ parts: readonly ToolDisplayPart[],
78
+ index: number,
79
+ ): boolean {
80
+ const part = parts[index];
81
+ if (part?.type !== "tool-call" || part.toolName !== "call-agent") {
82
+ return false;
83
+ }
84
+
85
+ const agentRows = parts.filter((candidate) => {
86
+ if (
87
+ candidate.type !== "tool-call" ||
88
+ !candidate.toolName?.startsWith("agent:")
89
+ ) {
90
+ return false;
91
+ }
92
+ return true;
93
+ });
94
+ const target = callAgentTarget(part);
95
+ if (!target) return agentRows.length > 0;
96
+
97
+ return agentRows.some(
98
+ (candidate) => normalizedAgentName(candidate.toolName?.slice(6)) === target,
99
+ );
100
+ }
101
+
102
+ export function shadowedCallAgentToolCallIds(
103
+ parts: readonly ToolDisplayPart[],
104
+ ): Set<string> {
105
+ const ids = new Set<string>();
106
+ parts.forEach((part, index) => {
107
+ if (part.toolCallId && isCallAgentToolCallShadowed(parts, index)) {
108
+ ids.add(part.toolCallId);
109
+ }
110
+ });
111
+ return ids;
112
+ }