@agent-native/core 0.115.4 → 0.117.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 (487) hide show
  1. package/agent-native.eject.json +1 -0
  2. package/corpus/README.md +3 -3
  3. package/corpus/core/CHANGELOG.md +43 -0
  4. package/corpus/core/agent-native.eject.json +1 -0
  5. package/corpus/core/docs/AGENTS.md +1 -1
  6. package/corpus/core/docs/content/agent-mentions.mdx +2 -2
  7. package/corpus/core/docs/content/{workspace.mdx → agent-resources.mdx} +1 -7
  8. package/corpus/core/docs/content/agent-teams.mdx +4 -4
  9. package/corpus/core/docs/content/dispatch.mdx +10 -10
  10. package/corpus/core/docs/content/drop-in-agent.mdx +4 -4
  11. package/corpus/core/docs/content/external-agents.mdx +1 -1
  12. package/corpus/core/docs/content/frames.mdx +1 -1
  13. package/corpus/core/docs/content/integrations.mdx +13 -2
  14. package/corpus/core/docs/content/key-concepts.mdx +2 -2
  15. package/corpus/core/docs/content/mcp-clients.mdx +7 -1
  16. package/corpus/core/docs/content/multi-app-workspace.mdx +3 -3
  17. package/corpus/core/docs/content/real-time-collaboration.mdx +33 -15
  18. package/corpus/core/docs/content/recurring-jobs.mdx +7 -7
  19. package/corpus/core/docs/content/skills-guide.mdx +4 -4
  20. package/corpus/core/docs/content/template-brain.mdx +1 -1
  21. package/corpus/core/docs/content/toolkit-collaboration.mdx +1 -1
  22. package/corpus/core/docs/content/using-your-agent.mdx +1 -1
  23. package/corpus/core/docs/content/what-is-agent-native.mdx +4 -4
  24. package/corpus/core/docs/content/workspace-management.mdx +4 -4
  25. package/corpus/core/package.json +4 -1
  26. package/corpus/core/src/agent/production-agent.ts +13 -3
  27. package/corpus/core/src/cli/doctor.ts +6 -1
  28. package/corpus/core/src/client/AgentPanel.tsx +79 -41
  29. package/corpus/core/src/client/AssistantChat.tsx +71 -25
  30. package/corpus/core/src/client/FeedbackButton.tsx +33 -7
  31. package/corpus/core/src/client/MultiTabAssistantChat.tsx +6 -8
  32. package/corpus/core/src/client/agent-chat-adapter.ts +11 -2
  33. package/corpus/core/src/client/agent-page/AgentTabFrame.tsx +22 -3
  34. package/corpus/core/src/client/agent-page/AgentTabsPage.tsx +34 -19
  35. package/corpus/core/src/client/analytics.ts +7 -0
  36. package/corpus/core/src/client/chat/message-components.tsx +43 -16
  37. package/corpus/core/src/client/chat/tool-call-display.tsx +30 -18
  38. package/corpus/core/src/client/chat/tool-render-registry.tsx +2 -0
  39. package/corpus/core/src/client/resources/McpConnectionSuggestion.tsx +19 -2
  40. package/corpus/core/src/client/resources/ResourceTree.tsx +7 -10
  41. package/corpus/core/src/client/resources/ResourcesPanel.tsx +33 -70
  42. package/corpus/core/src/client/resources/mcp-connection-resume.ts +107 -0
  43. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +65 -12
  44. package/corpus/core/src/client/resources/mcp-integration-logos.ts +4 -0
  45. package/corpus/core/src/client/sse-event-processor.ts +50 -14
  46. package/corpus/core/src/client/use-db-sync.ts +370 -21
  47. package/corpus/core/src/collab/client.ts +26 -2
  48. package/corpus/core/src/connections/catalog.ts +7 -1
  49. package/corpus/core/src/db/ddl-guard.ts +49 -10
  50. package/corpus/core/src/deploy/build.ts +25 -2
  51. package/corpus/core/src/eject/remote-mcp-presets.ts +37 -5
  52. package/corpus/core/src/guards/explicit-collab-access.ts +229 -0
  53. package/corpus/core/src/guards/index.ts +1 -0
  54. package/corpus/core/src/localization/default-messages.ts +54 -5
  55. package/corpus/core/src/mcp/connect-route.ts +34 -51
  56. package/corpus/core/src/provider-api/index.ts +1 -1
  57. package/corpus/core/src/realtime-protocol.ts +92 -0
  58. package/corpus/core/src/server/collab-plugin.ts +137 -18
  59. package/corpus/core/src/server/core-routes-plugin.ts +7 -0
  60. package/corpus/core/src/server/index.ts +2 -0
  61. package/corpus/core/src/server/poll-events.ts +29 -8
  62. package/corpus/core/src/server/poll.ts +1123 -865
  63. package/corpus/core/src/server/realtime-token.ts +106 -0
  64. package/corpus/core/src/server/sentry-config.ts +40 -0
  65. package/corpus/core/src/server/short-lived-token.ts +156 -0
  66. package/corpus/core/src/server/sse.ts +15 -0
  67. package/corpus/core/src/server/ssr-handler.ts +9 -3
  68. package/corpus/core/src/styles/agent-native.css +40 -0
  69. package/corpus/core/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  70. package/corpus/core/src/templates/default/.agents/skills/real-time-collab/SKILL.md +35 -13
  71. package/corpus/core/src/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
  72. package/corpus/core/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  73. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  74. package/corpus/core/src/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +35 -13
  75. package/corpus/core/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
  76. package/corpus/core/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +12 -8
  77. package/corpus/templates/analytics/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  78. package/corpus/templates/analytics/.agents/skills/real-time-sync/SKILL.md +1 -1
  79. package/corpus/templates/analytics/AGENTS.md +7 -2
  80. package/corpus/templates/analytics/actions/export-dashboard-panel-to-google-sheet.ts +144 -0
  81. package/corpus/templates/analytics/app/components/layout/Layout.tsx +7 -88
  82. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +34 -37
  83. package/corpus/templates/analytics/app/global.css +0 -4
  84. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +2 -7
  85. package/corpus/templates/analytics/app/i18n-data.ts +107 -0
  86. package/corpus/templates/analytics/app/lib/data-source-status.ts +9 -0
  87. package/corpus/templates/analytics/app/lib/sql-query.ts +1 -2
  88. package/corpus/templates/analytics/app/pages/Ask.tsx +2 -7
  89. package/corpus/templates/analytics/app/pages/DataSources.tsx +48 -0
  90. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +59 -0
  91. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +2 -0
  92. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/report-panel-window.ts +3 -1
  93. package/corpus/templates/analytics/changelog/2026-07-22-clear-background-chat-progress.md +6 -0
  94. package/corpus/templates/analytics/changelog/2026-07-22-daily-dashboard-email-query-batches.md +6 -0
  95. package/corpus/templates/analytics/changelog/2026-07-22-export-table-panels-directly-to-google-sheets.md +6 -0
  96. package/corpus/templates/analytics/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +6 -0
  97. package/corpus/templates/analytics/changelog/2026-07-22-recent-chats-can-expand-in-the-sidebar.md +6 -0
  98. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +8 -8
  99. package/corpus/templates/analytics/server/lib/canonical-first-party-dashboard-repair.ts +31 -0
  100. package/corpus/templates/analytics/server/lib/dashboard-report-subscriptions.ts +3 -5
  101. package/corpus/templates/analytics/server/lib/dashboard-report.ts +12 -0
  102. package/corpus/templates/analytics/server/lib/first-party-dashboard-repair.ts +3 -5
  103. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +150 -21
  104. package/corpus/templates/analytics/server/lib/google-sheets-export.ts +188 -0
  105. package/corpus/templates/analytics/server/lib/provider-api.ts +7 -2
  106. package/corpus/templates/analytics/server/plugins/collab.ts +6 -3
  107. package/corpus/templates/analytics/shared/sql-query-limits.ts +1 -0
  108. package/corpus/templates/assets/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  109. package/corpus/templates/assets/.agents/skills/real-time-collab/SKILL.md +35 -13
  110. package/corpus/templates/assets/.agents/skills/real-time-sync/SKILL.md +1 -1
  111. package/corpus/templates/assets/app/components/layout/Layout.tsx +1 -1
  112. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +54 -62
  113. package/corpus/templates/assets/app/hooks/use-navigation-state.ts +2 -6
  114. package/corpus/templates/assets/app/routes/_index.tsx +8 -5
  115. package/corpus/templates/assets/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +6 -0
  116. package/corpus/templates/assets/changelog/2026-07-22-recent-chats-expand-from-a-compact-list.md +6 -0
  117. package/corpus/templates/brain/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  118. package/corpus/templates/brain/.agents/skills/real-time-sync/SKILL.md +1 -1
  119. package/corpus/templates/brain/actions/rotate-source-ingest-token.ts +77 -0
  120. package/corpus/templates/brain/app/components/layout/Layout.tsx +5 -1
  121. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +38 -51
  122. package/corpus/templates/brain/app/hooks/use-navigation-state.ts +2 -9
  123. package/corpus/templates/brain/app/i18n-data.ts +120 -0
  124. package/corpus/templates/brain/app/routes/sources.tsx +156 -5
  125. package/corpus/templates/brain/changelog/2026-07-22-chat-runs-always-end-with-an-answer.md +6 -0
  126. package/corpus/templates/brain/changelog/2026-07-22-clear-background-chat-progress.md +6 -0
  127. package/corpus/templates/brain/changelog/2026-07-22-compact-sidebar-footer.md +6 -0
  128. package/corpus/templates/brain/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +6 -0
  129. package/corpus/templates/brain/changelog/2026-07-22-long-chat-titles-stay-inside-the-sidebar.md +6 -0
  130. package/corpus/templates/brain/changelog/2026-07-22-new-clips-and-webhook-sources-now-show-their-secure-connecti.md +6 -0
  131. package/corpus/templates/brain/jobs/emit-netlify-brain-queue-cron.ts +125 -0
  132. package/corpus/templates/brain/netlify.toml +5 -1
  133. package/corpus/templates/brain/scripts/configure-prod-clips-source.ts +50 -0
  134. package/corpus/templates/brain/server/lib/capture-sanitization.ts +64 -6
  135. package/corpus/templates/brain/server/plugins/agent-chat.ts +4 -0
  136. package/corpus/templates/brain/server/plugins/brain-jobs.ts +1 -0
  137. package/corpus/templates/brain/server/routes/api/brain/queue/run.post.ts +55 -0
  138. package/corpus/templates/calendar/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  139. package/corpus/templates/calendar/.agents/skills/real-time-sync/SKILL.md +1 -1
  140. package/corpus/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  141. package/corpus/templates/chat/.agents/skills/real-time-sync/SKILL.md +1 -1
  142. package/corpus/templates/chat/app/components/layout/Layout.tsx +1 -0
  143. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +43 -67
  144. package/corpus/templates/chat/app/hooks/use-navigation-state.ts +2 -7
  145. package/corpus/templates/chat/app/routes/_index.tsx +8 -5
  146. package/corpus/templates/chat/changelog/2026-07-22-compact-sidebar-footer.md +6 -0
  147. package/corpus/templates/chat/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +6 -0
  148. package/corpus/templates/chat/changelog/2026-07-22-recent-chats-are-easier-to-scan-and-expand.md +6 -0
  149. package/corpus/templates/clips/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  150. package/corpus/templates/clips/AGENTS.md +9 -1
  151. package/corpus/templates/clips/actions/export-to-brain.ts +82 -6
  152. package/corpus/templates/clips/actions/request-transcript.ts +25 -14
  153. package/corpus/templates/clips/app/components/sharing/share-ui.tsx +12 -0
  154. package/corpus/templates/clips/app/i18n/en-US.ts +1 -0
  155. package/corpus/templates/clips/changelog/2026-07-22-clips-transcripts-now-retry-brain-export.md +5 -0
  156. package/corpus/templates/clips/changelog/2026-07-22-german-umlauts-and-other-non-ascii-characters-now-paste-corr.md +6 -0
  157. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +26 -3
  158. package/corpus/templates/clips/jobs/emit-netlify-brain-export-cron.ts +118 -0
  159. package/corpus/templates/clips/netlify.toml +4 -1
  160. package/corpus/templates/clips/scripts/configure-prod-brain-export.ts +92 -0
  161. package/corpus/templates/clips/server/jobs/brain-export.ts +182 -0
  162. package/corpus/templates/clips/server/lib/brain-export-state.ts +42 -0
  163. package/corpus/templates/clips/server/lib/post-finalize-dispatch.ts +5 -1
  164. package/corpus/templates/clips/server/plugins/calendar-jobs.ts +2 -0
  165. package/corpus/templates/clips/server/register-secrets.ts +42 -0
  166. package/corpus/templates/clips/server/routes/api/_agent-native-background/post-finalize-worker.post.ts +10 -1
  167. package/corpus/templates/clips/server/routes/api/clips/brain-export/run.post.ts +45 -0
  168. package/corpus/templates/content/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  169. package/corpus/templates/content/.agents/skills/real-time-sync/SKILL.md +1 -1
  170. package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +566 -299
  171. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +14 -0
  172. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +1 -1
  173. package/corpus/templates/content/app/i18n-data.ts +90 -0
  174. package/corpus/templates/content/server/plugins/collab.ts +1 -1
  175. package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  176. package/corpus/templates/crm/actions/_crm-data-program-actions.ts +15 -0
  177. package/corpus/templates/crm/actions/get-crm-dashboard-panel.ts +2 -0
  178. package/corpus/templates/crm/actions/run.ts +2 -6
  179. package/corpus/templates/crm/actions/update-crm-record.ts +4 -2
  180. package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +6 -0
  181. package/corpus/templates/crm/changelog/2026-07-22-crm-field-validation-now-explains-which-fields-cannot-be-edi.md +6 -0
  182. package/corpus/templates/crm/changelog/2026-07-22-fixed-hubspot-contact-syncs-missing-records-updated-after-th.md +6 -0
  183. package/corpus/templates/crm/changelog/2026-07-22-fixed-pipeline-dashboard-panels-so-their-opportunity-data-lo.md +6 -0
  184. package/corpus/templates/crm/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +6 -0
  185. package/corpus/templates/crm/server/crm/hubspot-adapter.ts +4 -1
  186. package/corpus/templates/design/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  187. package/corpus/templates/design/app/components/layout/Sidebar.tsx +1 -1
  188. package/corpus/templates/design/server/plugins/collab.ts +11 -8
  189. package/corpus/templates/dispatch/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  190. package/corpus/templates/forms/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  191. package/corpus/templates/forms/.agents/skills/real-time-sync/SKILL.md +1 -1
  192. package/corpus/templates/forms/app/components/layout/Layout.tsx +1 -0
  193. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +1 -1
  194. package/corpus/templates/forms/app/hooks/use-navigation-state.ts +2 -9
  195. package/corpus/templates/forms/app/root.tsx +1 -6
  196. package/corpus/templates/forms/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +6 -0
  197. package/corpus/templates/macros/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  198. package/corpus/templates/mail/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  199. package/corpus/templates/mail/.agents/skills/real-time-sync/SKILL.md +1 -1
  200. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +2 -2
  201. package/corpus/templates/plan/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  202. package/corpus/templates/plan/.agents/skills/real-time-sync/SKILL.md +1 -1
  203. package/corpus/templates/plan/app/components/layout/Layout.tsx +5 -1
  204. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +57 -72
  205. package/corpus/templates/plan/app/hooks/use-navigation-state.ts +2 -9
  206. package/corpus/templates/plan/app/lib/create-plan-routing.ts +2 -2
  207. package/corpus/templates/plan/app/pages/PlanChatPage.tsx +0 -1
  208. package/corpus/templates/plan/changelog/2026-07-22-compact-sidebar-footer.md +6 -0
  209. package/corpus/templates/plan/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +6 -0
  210. package/corpus/templates/plan/changelog/2026-07-22-recent-chats-and-sidebar-controls-are-more-compact.md +6 -0
  211. package/corpus/templates/plan/server/plugins/collab.ts +5 -2
  212. package/corpus/templates/slides/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  213. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +1 -1
  214. package/corpus/templates/slides/server/plugins/collab.ts +11 -8
  215. package/corpus/templates/tasks/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  216. package/corpus/templates/tasks/.agents/skills/real-time-sync/SKILL.md +1 -1
  217. package/corpus/templates/tasks/app/components/layout/Sidebar.tsx +5 -22
  218. package/corpus/templates/tasks/changelog/2026-07-22-compact-sidebar-footer.md +6 -0
  219. package/corpus/toolkit/CHANGELOG.md +7 -0
  220. package/corpus/toolkit/README.md +12 -3
  221. package/corpus/toolkit/package.json +1 -1
  222. package/corpus/toolkit/src/chat-history/ChatHistoryRail.tsx +89 -0
  223. package/corpus/toolkit/src/chat-history/index.ts +5 -0
  224. package/corpus/toolkit/src/chat-history.css +59 -0
  225. package/corpus/toolkit/src/composer/RealtimeVoiceMode.tsx +106 -36
  226. package/corpus/toolkit/src/composer/VoiceButton.tsx +49 -0
  227. package/corpus/toolkit/src/composer/realtime-voice-audio-level.ts +2 -1
  228. package/corpus/toolkit/src/composer/useRealtimeVoiceMode.tsx +5 -3
  229. package/corpus/toolkit/src/styles.css +35 -0
  230. package/dist/agent/production-agent.d.ts.map +1 -1
  231. package/dist/agent/production-agent.js +13 -3
  232. package/dist/agent/production-agent.js.map +1 -1
  233. package/dist/cli/doctor.d.ts +1 -1
  234. package/dist/cli/doctor.d.ts.map +1 -1
  235. package/dist/cli/doctor.js +5 -2
  236. package/dist/cli/doctor.js.map +1 -1
  237. package/dist/client/AgentPanel.d.ts +1 -0
  238. package/dist/client/AgentPanel.d.ts.map +1 -1
  239. package/dist/client/AgentPanel.js +38 -18
  240. package/dist/client/AgentPanel.js.map +1 -1
  241. package/dist/client/AssistantChat.d.ts.map +1 -1
  242. package/dist/client/AssistantChat.js +55 -20
  243. package/dist/client/AssistantChat.js.map +1 -1
  244. package/dist/client/FeedbackButton.d.ts +4 -2
  245. package/dist/client/FeedbackButton.d.ts.map +1 -1
  246. package/dist/client/FeedbackButton.js +18 -2
  247. package/dist/client/FeedbackButton.js.map +1 -1
  248. package/dist/client/MultiTabAssistantChat.d.ts +1 -1
  249. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  250. package/dist/client/MultiTabAssistantChat.js +2 -3
  251. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  252. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  253. package/dist/client/agent-chat-adapter.js +11 -3
  254. package/dist/client/agent-chat-adapter.js.map +1 -1
  255. package/dist/client/agent-page/AgentTabFrame.d.ts +3 -1
  256. package/dist/client/agent-page/AgentTabFrame.d.ts.map +1 -1
  257. package/dist/client/agent-page/AgentTabFrame.js +3 -2
  258. package/dist/client/agent-page/AgentTabFrame.js.map +1 -1
  259. package/dist/client/agent-page/AgentTabsPage.d.ts +2 -0
  260. package/dist/client/agent-page/AgentTabsPage.d.ts.map +1 -1
  261. package/dist/client/agent-page/AgentTabsPage.js +26 -15
  262. package/dist/client/agent-page/AgentTabsPage.js.map +1 -1
  263. package/dist/client/analytics.d.ts +10 -0
  264. package/dist/client/analytics.d.ts.map +1 -1
  265. package/dist/client/analytics.js.map +1 -1
  266. package/dist/client/chat/message-components.d.ts +6 -1
  267. package/dist/client/chat/message-components.d.ts.map +1 -1
  268. package/dist/client/chat/message-components.js +17 -11
  269. package/dist/client/chat/message-components.js.map +1 -1
  270. package/dist/client/chat/tool-call-display.d.ts +11 -1
  271. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  272. package/dist/client/chat/tool-call-display.js +16 -17
  273. package/dist/client/chat/tool-call-display.js.map +1 -1
  274. package/dist/client/chat/tool-render-registry.d.ts +2 -0
  275. package/dist/client/chat/tool-render-registry.d.ts.map +1 -1
  276. package/dist/client/chat/tool-render-registry.js.map +1 -1
  277. package/dist/client/resources/McpConnectionSuggestion.d.ts.map +1 -1
  278. package/dist/client/resources/McpConnectionSuggestion.js +15 -1
  279. package/dist/client/resources/McpConnectionSuggestion.js.map +1 -1
  280. package/dist/client/resources/ResourceTree.d.ts.map +1 -1
  281. package/dist/client/resources/ResourceTree.js +3 -3
  282. package/dist/client/resources/ResourceTree.js.map +1 -1
  283. package/dist/client/resources/ResourcesPanel.d.ts +1 -0
  284. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  285. package/dist/client/resources/ResourcesPanel.js +34 -20
  286. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  287. package/dist/client/resources/mcp-connection-resume.d.ts +11 -0
  288. package/dist/client/resources/mcp-connection-resume.d.ts.map +1 -0
  289. package/dist/client/resources/mcp-connection-resume.js +95 -0
  290. package/dist/client/resources/mcp-connection-resume.js.map +1 -0
  291. package/dist/client/resources/mcp-integration-catalog.d.ts +1 -0
  292. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  293. package/dist/client/resources/mcp-integration-catalog.js +63 -8
  294. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  295. package/dist/client/resources/mcp-integration-logos.d.ts.map +1 -1
  296. package/dist/client/resources/mcp-integration-logos.js +4 -0
  297. package/dist/client/resources/mcp-integration-logos.js.map +1 -1
  298. package/dist/client/sse-event-processor.d.ts +5 -0
  299. package/dist/client/sse-event-processor.d.ts.map +1 -1
  300. package/dist/client/sse-event-processor.js +39 -13
  301. package/dist/client/sse-event-processor.js.map +1 -1
  302. package/dist/client/use-db-sync.d.ts +4 -3
  303. package/dist/client/use-db-sync.d.ts.map +1 -1
  304. package/dist/client/use-db-sync.js +332 -21
  305. package/dist/client/use-db-sync.js.map +1 -1
  306. package/dist/collab/client.d.ts.map +1 -1
  307. package/dist/collab/client.js +26 -2
  308. package/dist/collab/client.js.map +1 -1
  309. package/dist/collab/routes.d.ts +1 -1
  310. package/dist/connections/catalog.d.ts +1 -1
  311. package/dist/connections/catalog.d.ts.map +1 -1
  312. package/dist/connections/catalog.js +7 -1
  313. package/dist/connections/catalog.js.map +1 -1
  314. package/dist/db/ddl-guard.d.ts +7 -2
  315. package/dist/db/ddl-guard.d.ts.map +1 -1
  316. package/dist/db/ddl-guard.js +21 -9
  317. package/dist/db/ddl-guard.js.map +1 -1
  318. package/dist/deploy/build.d.ts.map +1 -1
  319. package/dist/deploy/build.js +25 -2
  320. package/dist/deploy/build.js.map +1 -1
  321. package/dist/eject/remote-mcp-presets.d.ts.map +1 -1
  322. package/dist/eject/remote-mcp-presets.js +33 -3
  323. package/dist/eject/remote-mcp-presets.js.map +1 -1
  324. package/dist/guards/explicit-collab-access.d.ts +8 -0
  325. package/dist/guards/explicit-collab-access.d.ts.map +1 -0
  326. package/dist/guards/explicit-collab-access.js +214 -0
  327. package/dist/guards/explicit-collab-access.js.map +1 -0
  328. package/dist/guards/index.d.ts +1 -0
  329. package/dist/guards/index.d.ts.map +1 -1
  330. package/dist/guards/index.js +1 -0
  331. package/dist/guards/index.js.map +1 -1
  332. package/dist/localization/default-messages.d.ts +43 -0
  333. package/dist/localization/default-messages.d.ts.map +1 -1
  334. package/dist/localization/default-messages.js +48 -5
  335. package/dist/localization/default-messages.js.map +1 -1
  336. package/dist/mcp/connect-route.d.ts.map +1 -1
  337. package/dist/mcp/connect-route.js +34 -48
  338. package/dist/mcp/connect-route.js.map +1 -1
  339. package/dist/observability/routes.d.ts +5 -5
  340. package/dist/provider-api/actions/custom-provider-registration.d.ts +7 -7
  341. package/dist/provider-api/actions/provider-api.d.ts +7 -7
  342. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  343. package/dist/provider-api/index.js +1 -1
  344. package/dist/provider-api/index.js.map +1 -1
  345. package/dist/realtime-protocol.d.ts +40 -0
  346. package/dist/realtime-protocol.d.ts.map +1 -0
  347. package/dist/realtime-protocol.js +69 -0
  348. package/dist/realtime-protocol.js.map +1 -0
  349. package/dist/resources/handlers.d.ts +1 -1
  350. package/dist/secrets/routes.d.ts +3 -3
  351. package/dist/server/collab-plugin.d.ts +34 -3
  352. package/dist/server/collab-plugin.d.ts.map +1 -1
  353. package/dist/server/collab-plugin.js +65 -12
  354. package/dist/server/collab-plugin.js.map +1 -1
  355. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  356. package/dist/server/core-routes-plugin.js +3 -0
  357. package/dist/server/core-routes-plugin.js.map +1 -1
  358. package/dist/server/index.d.ts +1 -1
  359. package/dist/server/index.d.ts.map +1 -1
  360. package/dist/server/index.js.map +1 -1
  361. package/dist/server/poll-events.d.ts +7 -1
  362. package/dist/server/poll-events.d.ts.map +1 -1
  363. package/dist/server/poll-events.js +24 -7
  364. package/dist/server/poll-events.js.map +1 -1
  365. package/dist/server/poll.d.ts +223 -42
  366. package/dist/server/poll.d.ts.map +1 -1
  367. package/dist/server/poll.js +849 -737
  368. package/dist/server/poll.js.map +1 -1
  369. package/dist/server/realtime-token.d.ts +34 -0
  370. package/dist/server/realtime-token.d.ts.map +1 -0
  371. package/dist/server/realtime-token.js +85 -0
  372. package/dist/server/realtime-token.js.map +1 -0
  373. package/dist/server/sentry-config.d.ts +12 -0
  374. package/dist/server/sentry-config.d.ts.map +1 -1
  375. package/dist/server/sentry-config.js +34 -0
  376. package/dist/server/sentry-config.js.map +1 -1
  377. package/dist/server/short-lived-token.d.ts +46 -0
  378. package/dist/server/short-lived-token.d.ts.map +1 -1
  379. package/dist/server/short-lived-token.js +104 -0
  380. package/dist/server/short-lived-token.js.map +1 -1
  381. package/dist/server/sse.d.ts +1 -1
  382. package/dist/server/sse.d.ts.map +1 -1
  383. package/dist/server/sse.js +4 -0
  384. package/dist/server/sse.js.map +1 -1
  385. package/dist/server/ssr-handler.d.ts.map +1 -1
  386. package/dist/server/ssr-handler.js +5 -3
  387. package/dist/server/ssr-handler.js.map +1 -1
  388. package/dist/server/transcribe-voice.d.ts +1 -1
  389. package/dist/styles/agent-native.css +40 -0
  390. package/dist/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  391. package/dist/templates/chat/.agents/skills/real-time-sync/SKILL.md +1 -1
  392. package/dist/templates/chat/app/components/layout/Layout.tsx +1 -0
  393. package/dist/templates/chat/app/components/layout/Sidebar.tsx +43 -67
  394. package/dist/templates/chat/app/hooks/use-navigation-state.ts +2 -7
  395. package/dist/templates/chat/app/routes/_index.tsx +8 -5
  396. package/dist/templates/chat/changelog/2026-07-22-compact-sidebar-footer.md +6 -0
  397. package/dist/templates/chat/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +6 -0
  398. package/dist/templates/chat/changelog/2026-07-22-recent-chats-are-easier-to-scan-and-expand.md +6 -0
  399. package/dist/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  400. package/dist/templates/default/.agents/skills/real-time-collab/SKILL.md +35 -13
  401. package/dist/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
  402. package/dist/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  403. package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  404. package/dist/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +35 -13
  405. package/dist/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
  406. package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +12 -8
  407. package/docs/AGENTS.md +1 -1
  408. package/docs/content/agent-mentions.mdx +2 -2
  409. package/docs/content/{workspace.mdx → agent-resources.mdx} +1 -7
  410. package/docs/content/agent-teams.mdx +4 -4
  411. package/docs/content/dispatch.mdx +10 -10
  412. package/docs/content/drop-in-agent.mdx +4 -4
  413. package/docs/content/external-agents.mdx +1 -1
  414. package/docs/content/frames.mdx +1 -1
  415. package/docs/content/integrations.mdx +13 -2
  416. package/docs/content/key-concepts.mdx +2 -2
  417. package/docs/content/mcp-clients.mdx +7 -1
  418. package/docs/content/multi-app-workspace.mdx +3 -3
  419. package/docs/content/real-time-collaboration.mdx +33 -15
  420. package/docs/content/recurring-jobs.mdx +7 -7
  421. package/docs/content/skills-guide.mdx +4 -4
  422. package/docs/content/template-brain.mdx +1 -1
  423. package/docs/content/toolkit-collaboration.mdx +1 -1
  424. package/docs/content/using-your-agent.mdx +1 -1
  425. package/docs/content/what-is-agent-native.mdx +4 -4
  426. package/docs/content/workspace-management.mdx +4 -4
  427. package/package.json +6 -3
  428. package/src/agent/production-agent.ts +13 -3
  429. package/src/cli/doctor.ts +6 -1
  430. package/src/client/AgentPanel.tsx +79 -41
  431. package/src/client/AssistantChat.tsx +71 -25
  432. package/src/client/FeedbackButton.tsx +33 -7
  433. package/src/client/MultiTabAssistantChat.tsx +6 -8
  434. package/src/client/agent-chat-adapter.ts +11 -2
  435. package/src/client/agent-page/AgentTabFrame.tsx +22 -3
  436. package/src/client/agent-page/AgentTabsPage.tsx +34 -19
  437. package/src/client/analytics.ts +7 -0
  438. package/src/client/chat/message-components.tsx +43 -16
  439. package/src/client/chat/tool-call-display.tsx +30 -18
  440. package/src/client/chat/tool-render-registry.tsx +2 -0
  441. package/src/client/resources/McpConnectionSuggestion.tsx +19 -2
  442. package/src/client/resources/ResourceTree.tsx +7 -10
  443. package/src/client/resources/ResourcesPanel.tsx +33 -70
  444. package/src/client/resources/mcp-connection-resume.ts +107 -0
  445. package/src/client/resources/mcp-integration-catalog.ts +65 -12
  446. package/src/client/resources/mcp-integration-logos.ts +4 -0
  447. package/src/client/sse-event-processor.ts +50 -14
  448. package/src/client/use-db-sync.ts +370 -21
  449. package/src/collab/client.ts +26 -2
  450. package/src/connections/catalog.ts +7 -1
  451. package/src/db/ddl-guard.ts +49 -10
  452. package/src/deploy/build.ts +25 -2
  453. package/src/eject/remote-mcp-presets.ts +37 -5
  454. package/src/guards/explicit-collab-access.ts +229 -0
  455. package/src/guards/index.ts +1 -0
  456. package/src/localization/default-messages.ts +54 -5
  457. package/src/mcp/connect-route.ts +34 -51
  458. package/src/provider-api/index.ts +1 -1
  459. package/src/realtime-protocol.ts +92 -0
  460. package/src/server/collab-plugin.ts +137 -18
  461. package/src/server/core-routes-plugin.ts +7 -0
  462. package/src/server/index.ts +2 -0
  463. package/src/server/poll-events.ts +29 -8
  464. package/src/server/poll.ts +1123 -865
  465. package/src/server/realtime-token.ts +106 -0
  466. package/src/server/sentry-config.ts +40 -0
  467. package/src/server/short-lived-token.ts +156 -0
  468. package/src/server/sse.ts +15 -0
  469. package/src/server/ssr-handler.ts +9 -3
  470. package/src/styles/agent-native.css +40 -0
  471. package/src/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  472. package/src/templates/chat/.agents/skills/real-time-sync/SKILL.md +1 -1
  473. package/src/templates/chat/app/components/layout/Layout.tsx +1 -0
  474. package/src/templates/chat/app/components/layout/Sidebar.tsx +43 -67
  475. package/src/templates/chat/app/hooks/use-navigation-state.ts +2 -7
  476. package/src/templates/chat/app/routes/_index.tsx +8 -5
  477. package/src/templates/chat/changelog/2026-07-22-compact-sidebar-footer.md +6 -0
  478. package/src/templates/chat/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +6 -0
  479. package/src/templates/chat/changelog/2026-07-22-recent-chats-are-easier-to-scan-and-expand.md +6 -0
  480. package/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  481. package/src/templates/default/.agents/skills/real-time-collab/SKILL.md +35 -13
  482. package/src/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
  483. package/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  484. package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  485. package/src/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +35 -13
  486. package/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
  487. package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +12 -8
@@ -1,3 +1,4 @@
1
+ import { IconHelpCircle } from "@tabler/icons-react";
1
2
  import type { ReactNode } from "react";
2
3
 
3
4
  import { cn } from "../utils.js";
@@ -5,6 +6,8 @@ import { cn } from "../utils.js";
5
6
  interface AgentTabFrameProps {
6
7
  title: string;
7
8
  description: string;
9
+ helpHref?: string;
10
+ helpLabel?: string;
8
11
  actions?: ReactNode;
9
12
  children: ReactNode;
10
13
  className?: string;
@@ -14,6 +17,8 @@ interface AgentTabFrameProps {
14
17
  export function AgentTabFrame({
15
18
  title,
16
19
  description,
20
+ helpHref,
21
+ helpLabel,
17
22
  actions,
18
23
  children,
19
24
  className,
@@ -24,9 +29,23 @@ export function AgentTabFrame({
24
29
  >
25
30
  <header className="flex flex-wrap items-start justify-between gap-4 border-b border-border/70 pb-5">
26
31
  <div className="space-y-1">
27
- <h2 className="text-xl font-semibold tracking-tight text-foreground">
28
- {title}
29
- </h2>
32
+ <div className="flex items-center gap-1.5">
33
+ <h2 className="text-xl font-semibold tracking-tight text-foreground">
34
+ {title}
35
+ </h2>
36
+ {helpHref && (
37
+ <a
38
+ href={helpHref}
39
+ target="_blank"
40
+ rel="noopener noreferrer"
41
+ aria-label={helpLabel ?? `Open ${title} documentation`}
42
+ title={helpLabel ?? `Open ${title} documentation`}
43
+ className="inline-flex size-6 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground"
44
+ >
45
+ <IconHelpCircle className="size-4" />
46
+ </a>
47
+ )}
48
+ </div>
30
49
  <p className="max-w-2xl text-sm leading-relaxed text-muted-foreground">
31
50
  {description}
32
51
  </p>
@@ -133,40 +133,48 @@ function EmptySlot({ label }: { label: string }) {
133
133
  );
134
134
  }
135
135
 
136
+ export const AGENT_RESOURCE_DOCS_HREF: Record<ResourceView, string> = {
137
+ files: "https://agent-native.com/docs/agent-resources#resources-tab",
138
+ instructions: "https://agent-native.com/docs/agent-resources#agents-md",
139
+ agents: "https://agent-native.com/docs/agent-resources#custom-agents",
140
+ memory: "https://agent-native.com/docs/agent-resources#memory",
141
+ skills: "https://agent-native.com/docs/skills-guide",
142
+ learnings: "https://agent-native.com/docs/agent-resources#memory",
143
+ "remote-agents":
144
+ "https://agent-native.com/docs/agent-resources#remote-vs-custom-agents",
145
+ };
146
+
136
147
  const RESOURCE_TAB_COPY: Record<
137
148
  ResourceView,
138
- { title: string; description: string }
149
+ { titleKey: string; descriptionKey: string }
139
150
  > = {
140
151
  files: {
141
- title: "Files",
142
- description: "Plain workspace files the agent can read and write.",
152
+ titleKey: "agentResources.files.title",
153
+ descriptionKey: "agentResources.files.description",
143
154
  },
144
155
  instructions: {
145
- title: "Instructions",
146
- description:
147
- "The rules, preferences, and project guidance that steer the agent.",
156
+ titleKey: "agentResources.instructions.title",
157
+ descriptionKey: "agentResources.instructions.description",
148
158
  },
149
159
  agents: {
150
- title: "Agents",
151
- description: "Reusable profiles for focused sub-agents and delegated work.",
160
+ titleKey: "agentResources.agents.title",
161
+ descriptionKey: "agentResources.agents.description",
152
162
  },
153
163
  memory: {
154
- title: "Memory",
155
- description: "Durable notes the agent can retrieve across conversations.",
164
+ titleKey: "agentResources.memory.title",
165
+ descriptionKey: "agentResources.memory.description",
156
166
  },
157
167
  skills: {
158
- title: "Skills",
159
- description:
160
- "Specialized instructions that give the agent repeatable abilities.",
168
+ titleKey: "agentResources.skills.title",
169
+ descriptionKey: "agentResources.skills.description",
161
170
  },
162
171
  learnings: {
163
- title: "Learnings",
164
- description:
165
- "Corrections and patterns worth carrying forward for future work.",
172
+ titleKey: "agentResources.learnings.title",
173
+ descriptionKey: "agentResources.learnings.description",
166
174
  },
167
175
  "remote-agents": {
168
- title: "Remote agents",
169
- description: "Other agents this workspace can call through A2A.",
176
+ titleKey: "agentResources.remoteAgents.title",
177
+ descriptionKey: "agentResources.remoteAgents.description",
170
178
  },
171
179
  };
172
180
 
@@ -174,9 +182,16 @@ function AgentResourceTab({
174
182
  scope,
175
183
  view,
176
184
  }: AgentPageTabProps & { view: ResourceView }) {
185
+ const t = useT();
177
186
  const copy = RESOURCE_TAB_COPY[view];
187
+ const title = t(copy.titleKey);
178
188
  return (
179
- <AgentTabFrame title={copy.title} description={copy.description}>
189
+ <AgentTabFrame
190
+ title={title}
191
+ description={t(copy.descriptionKey)}
192
+ helpHref={AGENT_RESOURCE_DOCS_HREF[view]}
193
+ helpLabel={t("agentResources.openDocs", { section: title })}
194
+ >
180
195
  <div className="min-h-[480px]">
181
196
  <ResourcesPanel
182
197
  key={`${scope}-${view}`}
@@ -50,6 +50,13 @@ declare global {
50
50
  __AGENT_NATIVE_CONFIG__?: {
51
51
  sentryDsn?: string;
52
52
  sentryEnvironment?: string;
53
+ /**
54
+ * Hosted Realtime Gateway config. Impersonal (same for every visitor),
55
+ * so it is safe inside the CDN-cached SSR shell — unlike the per-user
56
+ * subscribe token, which is minted client-side after load. Absent when
57
+ * the app uses the in-process (local) transport.
58
+ */
59
+ realtime?: { transport?: string; gatewayBaseUrl?: string };
53
60
  };
54
61
  }
55
62
  }
@@ -14,9 +14,9 @@ import {
14
14
  ComposerPrimitive,
15
15
  useMessagePartReasoning,
16
16
  useMessagePartRuntime,
17
+ useAuiState,
17
18
  } from "@assistant-ui/react";
18
19
  import type { Attachment } from "@assistant-ui/react";
19
- import { useAuiState } from "@assistant-ui/store";
20
20
  import {
21
21
  IconX,
22
22
  IconCheck,
@@ -71,6 +71,7 @@ import {
71
71
  } from "./markdown-renderer.js";
72
72
  import {
73
73
  ToolCallFallback,
74
+ ToolActivityPresentation,
74
75
  FilesChangedSummary,
75
76
  ASSISTANT_VISIBLE_TOOL_CALL_LIMIT,
76
77
  ChatRunningContext,
@@ -862,7 +863,7 @@ export function assistantMessageHasUnresolvedTool(content: unknown): boolean {
862
863
  // Only the last assistant message may shimmer as "the currently running
863
864
  // tool" — an older message's dangling unresolved tool-call must never
864
865
  // shimmer once a later run is active.
865
- export function computeLatestRunningToolCallId(
866
+ export function computeActiveTailToolCallId(
866
867
  content: ContentPart[] | undefined,
867
868
  { chatRunning, isLast }: { chatRunning: boolean; isLast: boolean },
868
869
  ): string | null {
@@ -870,9 +871,7 @@ export function computeLatestRunningToolCallId(
870
871
  return (
871
872
  content?.reduce(
872
873
  (latestToolCallId, part) =>
873
- part.type === "tool-call" &&
874
- part.result === undefined &&
875
- (chatRunning || part.activity === true)
874
+ part.type === "tool-call" && (chatRunning || part.activity === true)
876
875
  ? part.toolCallId
877
876
  : latestToolCallId,
878
877
  null as string | null,
@@ -900,6 +899,18 @@ export function shouldShowAssistantMessageFooter({
900
899
  return statusIsTerminal;
901
900
  }
902
901
 
902
+ export function shouldShowMissingFinalResponse({
903
+ statusIsTerminal,
904
+ hasAssistantText,
905
+ hasUnresolvedTool,
906
+ }: {
907
+ statusIsTerminal: boolean;
908
+ hasAssistantText: boolean;
909
+ hasUnresolvedTool: boolean;
910
+ }): boolean {
911
+ return statusIsTerminal && !hasAssistantText && !hasUnresolvedTool;
912
+ }
913
+
903
914
  export function shouldShowAssistantWorkSummary({
904
915
  isLast,
905
916
  isComplete,
@@ -1061,12 +1072,18 @@ export function AssistantMessage() {
1061
1072
  const hasRenderableContent = assistantMessageHasRenderableContent(msg);
1062
1073
  const hasUnresolvedTool = assistantMessageHasUnresolvedTool(msg.content);
1063
1074
  const responseConnectionText = messageTextFromContent(msg.content);
1075
+ const statusIsTerminal = assistantMessageStatusIsTerminal(msg);
1076
+ const showMissingFinalResponse = shouldShowMissingFinalResponse({
1077
+ statusIsTerminal,
1078
+ hasAssistantText: responseConnectionText.trim().length > 0,
1079
+ hasUnresolvedTool,
1080
+ });
1064
1081
  const responseConnectionContext = latestUserMessageText(thread.messages);
1065
1082
  const isComplete = shouldShowAssistantMessageFooter({
1066
1083
  isLast,
1067
1084
  chatRunning,
1068
1085
  hasRenderableContent,
1069
- statusIsTerminal: assistantMessageStatusIsTerminal(msg),
1086
+ statusIsTerminal,
1070
1087
  hasUnresolvedTool,
1071
1088
  });
1072
1089
  const cpCtx = React.useContext(CheckpointContext);
@@ -1178,7 +1195,7 @@ export function AssistantMessage() {
1178
1195
  (p.type !== "tool-call" || p.activity !== true) &&
1179
1196
  isCollapsibleAssistantWorkPart(p),
1180
1197
  );
1181
- const latestRunningToolCallId = computeLatestRunningToolCallId(msgContent, {
1198
+ const activeTailToolCallId = computeActiveTailToolCallId(msgContent, {
1182
1199
  chatRunning,
1183
1200
  isLast,
1184
1201
  });
@@ -1226,21 +1243,31 @@ export function AssistantMessage() {
1226
1243
  case "reasoning":
1227
1244
  return <ReasoningMessagePart />;
1228
1245
  case "tool-call":
1229
- return (
1230
- part.toolUI ?? (
1231
- <ToolCallFallback
1232
- {...part}
1233
- isLatestRunning={
1234
- part.toolCallId === latestRunningToolCallId
1235
- }
1236
- />
1237
- )
1246
+ return part.toolUI ? (
1247
+ <ToolActivityPresentation
1248
+ toolName={part.toolName}
1249
+ isRunning={part.status?.type === "running"}
1250
+ isActiveTail={part.toolCallId === activeTailToolCallId}
1251
+ >
1252
+ {part.toolUI}
1253
+ </ToolActivityPresentation>
1254
+ ) : (
1255
+ <ToolCallFallback
1256
+ {...part}
1257
+ isActiveTail={part.toolCallId === activeTailToolCallId}
1258
+ />
1238
1259
  );
1239
1260
  default:
1240
1261
  return null;
1241
1262
  }
1242
1263
  }}
1243
1264
  </MessagePrimitive.GroupedParts>
1265
+ {showMissingFinalResponse && (
1266
+ <p role="status" className="text-muted-foreground">
1267
+ The agent stopped without sending a final message. Ask it to
1268
+ continue or retry.
1269
+ </p>
1270
+ )}
1244
1271
  {isComplete && hasCodeAgentTools && msgContent && (
1245
1272
  <FilesChangedSummary parts={msgContent} />
1246
1273
  )}
@@ -94,20 +94,22 @@ export const ApprovalContext = React.createContext<ApprovalContextValue | null>(
94
94
 
95
95
  export const TOOL_LONG_RUNNING_HINT_DELAY_MS = 45_000;
96
96
 
97
- function ToolLongRunningHintShell({
97
+ export function ToolActivityPresentation({
98
98
  toolName,
99
99
  isRunning,
100
+ isActiveTail,
100
101
  children,
101
102
  }: {
102
103
  toolName: string;
103
104
  isRunning: boolean;
105
+ isActiveTail: boolean;
104
106
  children: React.ReactNode;
105
107
  }) {
106
108
  const [showLongRunningHint, setShowLongRunningHint] = useState(false);
107
- // useState initializer runs once at mount: a row that mounts already
108
- // resolved never animates, while a tool appended during an active stream
109
- // mounts running and animates in.
110
- const [animateEntry] = useState(isRunning);
109
+ // A batched update can first reveal a tool with its result already attached.
110
+ // Presentation follows the active chat tail rather than execution state so
111
+ // that newly revealed completed tools still get their entrance motion.
112
+ const [animateEntry] = useState(isActiveTail);
111
113
 
112
114
  useEffect(() => {
113
115
  if (!isRunning) {
@@ -125,10 +127,10 @@ function ToolLongRunningHintShell({
125
127
  <div
126
128
  className={cn(
127
129
  "agent-tool-call",
128
- animateEntry &&
129
- "motion-safe:animate-in motion-safe:fade-in-0 motion-safe:slide-in-from-bottom-1 motion-safe:duration-200 motion-safe:ease-[var(--ease-out-strong)]",
130
+ animateEntry && "agent-tool-call--entering",
130
131
  )}
131
132
  data-running={isRunning ? "true" : undefined}
133
+ data-active-tail={isActiveTail ? "true" : undefined}
132
134
  >
133
135
  {children}
134
136
  {isRunning && showLongRunningHint && (
@@ -554,6 +556,7 @@ export function ToolCallDisplay({
554
556
  approval,
555
557
  repeatCount,
556
558
  isLatestRunning = isRunning,
559
+ isActiveTail,
557
560
  }: {
558
561
  toolName: string;
559
562
  argsText?: string;
@@ -565,16 +568,24 @@ export function ToolCallDisplay({
565
568
  structuredMeta?: Record<string, unknown>;
566
569
  approval?: { approvalKey: string; dismissed?: boolean };
567
570
  repeatCount?: number;
571
+ /** The latest tool shown while the overall chat turn is still active. */
572
+ isActiveTail?: boolean;
573
+ /** @deprecated Use isActiveTail. */
568
574
  isLatestRunning?: boolean;
569
575
  }) {
576
+ const showActiveTail = isActiveTail ?? isLatestRunning;
570
577
  // Delegate to bespoke cells when structured metadata is present.
571
578
  // These must be separate components so hook order in ToolCallDisplayGeneric
572
579
  // is always stable (no conditional hook calls).
573
580
  const toolKind = structuredMeta?.toolKind as string | undefined;
574
581
  const wrapToolDisplay = (children: React.ReactNode) => (
575
- <ToolLongRunningHintShell toolName={toolName} isRunning={isRunning}>
582
+ <ToolActivityPresentation
583
+ toolName={toolName}
584
+ isRunning={isRunning}
585
+ isActiveTail={showActiveTail}
586
+ >
576
587
  {children}
577
- </ToolLongRunningHintShell>
588
+ </ToolActivityPresentation>
578
589
  );
579
590
  if (toolKind === "bash") {
580
591
  return wrapToolDisplay(
@@ -616,7 +627,7 @@ export function ToolCallDisplay({
616
627
  mcpApp={mcpApp}
617
628
  chatUI={chatUI}
618
629
  isRunning={isRunning}
619
- isLatestRunning={isLatestRunning}
630
+ isActiveTail={showActiveTail}
620
631
  approval={approval}
621
632
  repeatCount={repeatCount}
622
633
  />,
@@ -631,7 +642,7 @@ function ToolCallDisplayGeneric({
631
642
  mcpApp,
632
643
  chatUI,
633
644
  isRunning,
634
- isLatestRunning,
645
+ isActiveTail,
635
646
  approval,
636
647
  repeatCount,
637
648
  }: {
@@ -642,7 +653,7 @@ function ToolCallDisplayGeneric({
642
653
  mcpApp?: AgentMcpAppPayload;
643
654
  chatUI?: ActionChatUIConfig;
644
655
  isRunning: boolean;
645
- isLatestRunning: boolean;
656
+ isActiveTail: boolean;
646
657
  approval?: { approvalKey: string; dismissed?: boolean };
647
658
  repeatCount?: number;
648
659
  }) {
@@ -734,6 +745,7 @@ function ToolCallDisplayGeneric({
734
745
  resultText: result,
735
746
  resultJson: parsedResult,
736
747
  isRunning,
748
+ isActiveTail,
737
749
  chatUI,
738
750
  };
739
751
  const skipRegistryRenderer =
@@ -805,7 +817,7 @@ function ToolCallDisplayGeneric({
805
817
  <span
806
818
  className={cn(
807
819
  "min-w-0 truncate font-normal",
808
- isRunning && isLatestRunning && "agent-running-shimmer",
820
+ isActiveTail && "agent-running-shimmer",
809
821
  )}
810
822
  >
811
823
  {displayName}
@@ -888,6 +900,7 @@ export function ToolCallFallback({
888
900
  approval?: { approvalKey: string; dismissed?: boolean };
889
901
  repeatCount?: number;
890
902
  isLatestRunning?: boolean;
903
+ isActiveTail?: boolean;
891
904
  }) {
892
905
  const chatRunning = React.useContext(ChatRunningContext);
893
906
  const isRunning =
@@ -908,6 +921,7 @@ export function ToolCallFallback({
908
921
  chatUI={rest.chatUI}
909
922
  structuredMeta={rest.structuredMeta}
910
923
  isRunning={isRunning}
924
+ isActiveTail={rest.isActiveTail}
911
925
  isLatestRunning={rest.isLatestRunning}
912
926
  approval={rest.approval}
913
927
  repeatCount={rest.repeatCount}
@@ -935,11 +949,9 @@ export function ReconnectStreamMessage({
935
949
  content.at(-1)?.type === "text" ? content.length - 1 : -1;
936
950
  const streamingReasoningPartIndex =
937
951
  content.at(-1)?.type === "reasoning" ? content.length - 1 : -1;
938
- const latestRunningToolIndex = content.reduce(
952
+ const latestActiveToolIndex = content.reduce(
939
953
  (latestIndex, part, index) =>
940
- part.type === "tool-call" &&
941
- part.result === undefined &&
942
- (chatRunning || part.activity === true)
954
+ part.type === "tool-call" && (chatRunning || part.activity === true)
943
955
  ? index
944
956
  : latestIndex,
945
957
  -1,
@@ -983,7 +995,7 @@ export function ReconnectStreamMessage({
983
995
  isRunning={
984
996
  part.result === undefined && (chatRunning || part.activity === true)
985
997
  }
986
- isLatestRunning={i === latestRunningToolIndex}
998
+ isActiveTail={i === latestActiveToolIndex}
987
999
  approval={part.approval}
988
1000
  repeatCount={part.repeatCount}
989
1001
  />
@@ -8,6 +8,8 @@ export interface ToolRendererContext {
8
8
  resultText?: string;
9
9
  resultJson: unknown;
10
10
  isRunning: boolean;
11
+ /** True while this is the newest tool representing an active chat turn. */
12
+ isActiveTail?: boolean;
11
13
  chatUI?: ActionChatUIConfig;
12
14
  }
13
15
 
@@ -9,6 +9,11 @@ import { useEffect, useMemo, useState } from "react";
9
9
  import { agentNativePath } from "../api-path.js";
10
10
  import { openAgentSettings } from "../CommandMenu.js";
11
11
  import { useT } from "../i18n.js";
12
+ import {
13
+ clearMcpConnectionResume,
14
+ notifyMcpConnectionComplete,
15
+ saveMcpConnectionResume,
16
+ } from "./mcp-connection-resume.js";
12
17
  import {
13
18
  buildMcpOAuthStartUrl,
14
19
  findMcpIntegrationForText,
@@ -144,6 +149,7 @@ export function McpConnectionSuggestion({
144
149
  }
145
150
 
146
151
  if (canStartOAuth(integration)) {
152
+ saveMcpConnectionResume(variant === "response" ? contextText : text);
147
153
  window.location.assign(
148
154
  agentNativePath(
149
155
  buildMcpOAuthStartUrl({
@@ -162,6 +168,7 @@ export function McpConnectionSuggestion({
162
168
  integration.authMode === "none" &&
163
169
  integration.connectionMode === "direct"
164
170
  ) {
171
+ saveMcpConnectionResume(variant === "response" ? contextText : text);
165
172
  setConnecting(true);
166
173
  try {
167
174
  await createMcpServer.mutateAsync({
@@ -171,7 +178,9 @@ export function McpConnectionSuggestion({
171
178
  description: integration.description,
172
179
  });
173
180
  setDismissedId(integration.id);
181
+ notifyMcpConnectionComplete();
174
182
  } catch (cause) {
183
+ clearMcpConnectionResume();
175
184
  setError(
176
185
  cause instanceof Error ? cause.message : t("mcpIntegrations.failed"),
177
186
  );
@@ -181,6 +190,7 @@ export function McpConnectionSuggestion({
181
190
  return;
182
191
  }
183
192
 
193
+ saveMcpConnectionResume(variant === "response" ? contextText : text);
184
194
  setDialogOpen(true);
185
195
  };
186
196
 
@@ -262,13 +272,20 @@ export function McpConnectionSuggestion({
262
272
  )}
263
273
  <McpIntegrationDialog
264
274
  open={dialogOpen}
265
- onOpenChange={setDialogOpen}
275
+ onOpenChange={(open) => {
276
+ setDialogOpen(open);
277
+ if (!open) clearMcpConnectionResume();
278
+ }}
266
279
  initialIntegrationId={integration.id}
267
280
  defaultScope="user"
268
281
  canCreateOrgMcp={false}
269
282
  hasOrg={Boolean(mcpServersQuery.data?.orgId)}
270
283
  onCreateMcpServer={(args) => createMcpServer.mutateAsync(args)}
271
- onCreated={() => setDismissedId(integration.id)}
284
+ onCreated={() => {
285
+ setDismissedId(integration.id);
286
+ saveMcpConnectionResume(variant === "response" ? contextText : text);
287
+ notifyMcpConnectionComplete();
288
+ }}
272
289
  integrations={integrations}
273
290
  />
274
291
  </>
@@ -849,16 +849,13 @@ export function ResourceTree({
849
849
  )}
850
850
 
851
851
  {isEmpty && !creating && !isLoading && (
852
- <div className="flex items-start gap-2 border-y border-border/60 px-2 py-4">
853
- <IconFile className="mt-0.5 size-3.5 shrink-0 text-muted-foreground" />
854
- <div className="flex flex-col items-start gap-2">
855
- <p className="text-xs text-muted-foreground">
856
- {variant === "collection"
857
- ? "No resources in this collection yet"
858
- : "No files yet"}
859
- </p>
860
- {emptyStateAction}
861
- </div>
852
+ <div className="flex flex-col items-start border-y border-border/60 px-2 py-5">
853
+ <p className="ps-5 text-xs text-muted-foreground">
854
+ {variant === "collection"
855
+ ? "No resources in this collection yet"
856
+ : "No files yet"}
857
+ </p>
858
+ {emptyStateAction && <div className="mt-4">{emptyStateAction}</div>}
862
859
  </div>
863
860
  )}
864
861
  </div>