@agent-native/core 0.115.4 → 0.116.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 (408) hide show
  1. package/agent-native.eject.json +1 -0
  2. package/corpus/README.md +3 -3
  3. package/corpus/core/CHANGELOG.md +28 -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 +1 -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/chat/message-components.tsx +43 -16
  36. package/corpus/core/src/client/chat/tool-call-display.tsx +30 -18
  37. package/corpus/core/src/client/chat/tool-render-registry.tsx +2 -0
  38. package/corpus/core/src/client/resources/McpConnectionSuggestion.tsx +19 -2
  39. package/corpus/core/src/client/resources/ResourceTree.tsx +7 -10
  40. package/corpus/core/src/client/resources/ResourcesPanel.tsx +33 -70
  41. package/corpus/core/src/client/resources/mcp-connection-resume.ts +107 -0
  42. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +65 -12
  43. package/corpus/core/src/client/resources/mcp-integration-logos.ts +4 -0
  44. package/corpus/core/src/client/sse-event-processor.ts +50 -14
  45. package/corpus/core/src/client/use-db-sync.ts +16 -6
  46. package/corpus/core/src/connections/catalog.ts +7 -1
  47. package/corpus/core/src/eject/remote-mcp-presets.ts +37 -5
  48. package/corpus/core/src/guards/explicit-collab-access.ts +229 -0
  49. package/corpus/core/src/guards/index.ts +1 -0
  50. package/corpus/core/src/localization/default-messages.ts +54 -5
  51. package/corpus/core/src/mcp/connect-route.ts +34 -51
  52. package/corpus/core/src/provider-api/index.ts +1 -1
  53. package/corpus/core/src/server/collab-plugin.ts +137 -18
  54. package/corpus/core/src/server/index.ts +2 -0
  55. package/corpus/core/src/styles/agent-native.css +40 -0
  56. package/corpus/core/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  57. package/corpus/core/src/templates/default/.agents/skills/real-time-collab/SKILL.md +35 -13
  58. package/corpus/core/src/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
  59. package/corpus/core/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  60. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  61. package/corpus/core/src/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +35 -13
  62. package/corpus/core/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
  63. package/corpus/core/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +12 -8
  64. package/corpus/templates/analytics/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  65. package/corpus/templates/analytics/.agents/skills/real-time-sync/SKILL.md +1 -1
  66. package/corpus/templates/analytics/AGENTS.md +7 -2
  67. package/corpus/templates/analytics/actions/export-dashboard-panel-to-google-sheet.ts +144 -0
  68. package/corpus/templates/analytics/app/components/layout/Layout.tsx +7 -88
  69. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +34 -37
  70. package/corpus/templates/analytics/app/global.css +0 -4
  71. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +2 -7
  72. package/corpus/templates/analytics/app/i18n-data.ts +107 -0
  73. package/corpus/templates/analytics/app/lib/data-source-status.ts +9 -0
  74. package/corpus/templates/analytics/app/lib/sql-query.ts +1 -2
  75. package/corpus/templates/analytics/app/pages/Ask.tsx +2 -7
  76. package/corpus/templates/analytics/app/pages/DataSources.tsx +48 -0
  77. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +59 -0
  78. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +2 -0
  79. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/report-panel-window.ts +3 -1
  80. package/corpus/templates/analytics/changelog/2026-07-22-clear-background-chat-progress.md +6 -0
  81. package/corpus/templates/analytics/changelog/2026-07-22-daily-dashboard-email-query-batches.md +6 -0
  82. package/corpus/templates/analytics/changelog/2026-07-22-export-table-panels-directly-to-google-sheets.md +6 -0
  83. package/corpus/templates/analytics/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +6 -0
  84. package/corpus/templates/analytics/changelog/2026-07-22-recent-chats-can-expand-in-the-sidebar.md +6 -0
  85. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +8 -8
  86. package/corpus/templates/analytics/server/lib/canonical-first-party-dashboard-repair.ts +31 -0
  87. package/corpus/templates/analytics/server/lib/dashboard-report-subscriptions.ts +3 -5
  88. package/corpus/templates/analytics/server/lib/dashboard-report.ts +12 -0
  89. package/corpus/templates/analytics/server/lib/first-party-dashboard-repair.ts +3 -5
  90. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +150 -21
  91. package/corpus/templates/analytics/server/lib/google-sheets-export.ts +188 -0
  92. package/corpus/templates/analytics/server/lib/provider-api.ts +7 -2
  93. package/corpus/templates/analytics/server/plugins/collab.ts +6 -3
  94. package/corpus/templates/analytics/shared/sql-query-limits.ts +1 -0
  95. package/corpus/templates/assets/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  96. package/corpus/templates/assets/.agents/skills/real-time-collab/SKILL.md +35 -13
  97. package/corpus/templates/assets/.agents/skills/real-time-sync/SKILL.md +1 -1
  98. package/corpus/templates/assets/app/components/layout/Layout.tsx +1 -1
  99. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +54 -62
  100. package/corpus/templates/assets/app/hooks/use-navigation-state.ts +2 -6
  101. package/corpus/templates/assets/app/routes/_index.tsx +8 -5
  102. package/corpus/templates/assets/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +6 -0
  103. package/corpus/templates/assets/changelog/2026-07-22-recent-chats-expand-from-a-compact-list.md +6 -0
  104. package/corpus/templates/brain/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  105. package/corpus/templates/brain/.agents/skills/real-time-sync/SKILL.md +1 -1
  106. package/corpus/templates/brain/actions/rotate-source-ingest-token.ts +77 -0
  107. package/corpus/templates/brain/app/components/layout/Layout.tsx +5 -1
  108. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +38 -51
  109. package/corpus/templates/brain/app/hooks/use-navigation-state.ts +2 -9
  110. package/corpus/templates/brain/app/i18n-data.ts +120 -0
  111. package/corpus/templates/brain/app/routes/sources.tsx +156 -5
  112. package/corpus/templates/brain/changelog/2026-07-22-chat-runs-always-end-with-an-answer.md +6 -0
  113. package/corpus/templates/brain/changelog/2026-07-22-clear-background-chat-progress.md +6 -0
  114. package/corpus/templates/brain/changelog/2026-07-22-compact-sidebar-footer.md +6 -0
  115. package/corpus/templates/brain/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +6 -0
  116. package/corpus/templates/brain/changelog/2026-07-22-long-chat-titles-stay-inside-the-sidebar.md +6 -0
  117. package/corpus/templates/brain/changelog/2026-07-22-new-clips-and-webhook-sources-now-show-their-secure-connecti.md +6 -0
  118. package/corpus/templates/brain/jobs/emit-netlify-brain-queue-cron.ts +125 -0
  119. package/corpus/templates/brain/netlify.toml +5 -1
  120. package/corpus/templates/brain/scripts/configure-prod-clips-source.ts +50 -0
  121. package/corpus/templates/brain/server/lib/capture-sanitization.ts +64 -6
  122. package/corpus/templates/brain/server/plugins/agent-chat.ts +4 -0
  123. package/corpus/templates/brain/server/plugins/brain-jobs.ts +1 -0
  124. package/corpus/templates/brain/server/routes/api/brain/queue/run.post.ts +55 -0
  125. package/corpus/templates/calendar/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  126. package/corpus/templates/calendar/.agents/skills/real-time-sync/SKILL.md +1 -1
  127. package/corpus/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  128. package/corpus/templates/chat/.agents/skills/real-time-sync/SKILL.md +1 -1
  129. package/corpus/templates/chat/app/components/layout/Layout.tsx +1 -0
  130. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +43 -67
  131. package/corpus/templates/chat/app/hooks/use-navigation-state.ts +2 -7
  132. package/corpus/templates/chat/app/routes/_index.tsx +8 -5
  133. package/corpus/templates/chat/changelog/2026-07-22-compact-sidebar-footer.md +6 -0
  134. package/corpus/templates/chat/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +6 -0
  135. package/corpus/templates/chat/changelog/2026-07-22-recent-chats-are-easier-to-scan-and-expand.md +6 -0
  136. package/corpus/templates/clips/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  137. package/corpus/templates/clips/AGENTS.md +9 -1
  138. package/corpus/templates/clips/actions/export-to-brain.ts +82 -6
  139. package/corpus/templates/clips/actions/request-transcript.ts +25 -14
  140. package/corpus/templates/clips/changelog/2026-07-22-clips-transcripts-now-retry-brain-export.md +5 -0
  141. package/corpus/templates/clips/changelog/2026-07-22-german-umlauts-and-other-non-ascii-characters-now-paste-corr.md +6 -0
  142. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +26 -3
  143. package/corpus/templates/clips/jobs/emit-netlify-brain-export-cron.ts +118 -0
  144. package/corpus/templates/clips/netlify.toml +4 -1
  145. package/corpus/templates/clips/scripts/configure-prod-brain-export.ts +92 -0
  146. package/corpus/templates/clips/server/jobs/brain-export.ts +182 -0
  147. package/corpus/templates/clips/server/lib/brain-export-state.ts +42 -0
  148. package/corpus/templates/clips/server/lib/post-finalize-dispatch.ts +5 -1
  149. package/corpus/templates/clips/server/plugins/calendar-jobs.ts +2 -0
  150. package/corpus/templates/clips/server/register-secrets.ts +42 -0
  151. package/corpus/templates/clips/server/routes/api/_agent-native-background/post-finalize-worker.post.ts +10 -1
  152. package/corpus/templates/clips/server/routes/api/clips/brain-export/run.post.ts +45 -0
  153. package/corpus/templates/content/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  154. package/corpus/templates/content/.agents/skills/real-time-sync/SKILL.md +1 -1
  155. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +1 -1
  156. package/corpus/templates/content/server/plugins/collab.ts +1 -1
  157. package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  158. package/corpus/templates/crm/actions/_crm-data-program-actions.ts +15 -0
  159. package/corpus/templates/crm/actions/get-crm-dashboard-panel.ts +2 -0
  160. package/corpus/templates/crm/actions/run.ts +2 -6
  161. package/corpus/templates/crm/actions/update-crm-record.ts +4 -2
  162. package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +6 -0
  163. package/corpus/templates/crm/changelog/2026-07-22-crm-field-validation-now-explains-which-fields-cannot-be-edi.md +6 -0
  164. package/corpus/templates/crm/changelog/2026-07-22-fixed-hubspot-contact-syncs-missing-records-updated-after-th.md +6 -0
  165. package/corpus/templates/crm/changelog/2026-07-22-fixed-pipeline-dashboard-panels-so-their-opportunity-data-lo.md +6 -0
  166. package/corpus/templates/crm/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +6 -0
  167. package/corpus/templates/crm/server/crm/hubspot-adapter.ts +4 -1
  168. package/corpus/templates/design/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  169. package/corpus/templates/design/app/components/layout/Sidebar.tsx +1 -1
  170. package/corpus/templates/design/server/plugins/collab.ts +11 -8
  171. package/corpus/templates/dispatch/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  172. package/corpus/templates/forms/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  173. package/corpus/templates/forms/.agents/skills/real-time-sync/SKILL.md +1 -1
  174. package/corpus/templates/forms/app/components/layout/Layout.tsx +1 -0
  175. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +1 -1
  176. package/corpus/templates/forms/app/hooks/use-navigation-state.ts +2 -9
  177. package/corpus/templates/forms/app/root.tsx +1 -6
  178. package/corpus/templates/forms/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +6 -0
  179. package/corpus/templates/macros/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  180. package/corpus/templates/mail/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  181. package/corpus/templates/mail/.agents/skills/real-time-sync/SKILL.md +1 -1
  182. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +2 -2
  183. package/corpus/templates/plan/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  184. package/corpus/templates/plan/.agents/skills/real-time-sync/SKILL.md +1 -1
  185. package/corpus/templates/plan/app/components/layout/Layout.tsx +5 -1
  186. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +57 -72
  187. package/corpus/templates/plan/app/hooks/use-navigation-state.ts +2 -9
  188. package/corpus/templates/plan/app/lib/create-plan-routing.ts +2 -2
  189. package/corpus/templates/plan/app/pages/PlanChatPage.tsx +0 -1
  190. package/corpus/templates/plan/changelog/2026-07-22-compact-sidebar-footer.md +6 -0
  191. package/corpus/templates/plan/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +6 -0
  192. package/corpus/templates/plan/changelog/2026-07-22-recent-chats-and-sidebar-controls-are-more-compact.md +6 -0
  193. package/corpus/templates/plan/server/plugins/collab.ts +5 -2
  194. package/corpus/templates/slides/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  195. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +1 -1
  196. package/corpus/templates/slides/server/plugins/collab.ts +11 -8
  197. package/corpus/templates/tasks/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  198. package/corpus/templates/tasks/.agents/skills/real-time-sync/SKILL.md +1 -1
  199. package/corpus/templates/tasks/app/components/layout/Sidebar.tsx +5 -22
  200. package/corpus/templates/tasks/changelog/2026-07-22-compact-sidebar-footer.md +6 -0
  201. package/corpus/toolkit/CHANGELOG.md +7 -0
  202. package/corpus/toolkit/README.md +12 -3
  203. package/corpus/toolkit/package.json +1 -1
  204. package/corpus/toolkit/src/chat-history/ChatHistoryRail.tsx +89 -0
  205. package/corpus/toolkit/src/chat-history/index.ts +5 -0
  206. package/corpus/toolkit/src/chat-history.css +59 -0
  207. package/corpus/toolkit/src/composer/RealtimeVoiceMode.tsx +106 -36
  208. package/corpus/toolkit/src/composer/VoiceButton.tsx +49 -0
  209. package/corpus/toolkit/src/composer/realtime-voice-audio-level.ts +2 -1
  210. package/corpus/toolkit/src/composer/useRealtimeVoiceMode.tsx +5 -3
  211. package/corpus/toolkit/src/styles.css +35 -0
  212. package/dist/agent/production-agent.d.ts.map +1 -1
  213. package/dist/agent/production-agent.js +13 -3
  214. package/dist/agent/production-agent.js.map +1 -1
  215. package/dist/cli/doctor.d.ts +1 -1
  216. package/dist/cli/doctor.d.ts.map +1 -1
  217. package/dist/cli/doctor.js +5 -2
  218. package/dist/cli/doctor.js.map +1 -1
  219. package/dist/client/AgentPanel.d.ts +1 -0
  220. package/dist/client/AgentPanel.d.ts.map +1 -1
  221. package/dist/client/AgentPanel.js +38 -18
  222. package/dist/client/AgentPanel.js.map +1 -1
  223. package/dist/client/AssistantChat.d.ts.map +1 -1
  224. package/dist/client/AssistantChat.js +55 -20
  225. package/dist/client/AssistantChat.js.map +1 -1
  226. package/dist/client/FeedbackButton.d.ts +4 -2
  227. package/dist/client/FeedbackButton.d.ts.map +1 -1
  228. package/dist/client/FeedbackButton.js +18 -2
  229. package/dist/client/FeedbackButton.js.map +1 -1
  230. package/dist/client/MultiTabAssistantChat.d.ts +1 -1
  231. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  232. package/dist/client/MultiTabAssistantChat.js +2 -3
  233. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  234. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  235. package/dist/client/agent-chat-adapter.js +11 -3
  236. package/dist/client/agent-chat-adapter.js.map +1 -1
  237. package/dist/client/agent-page/AgentTabFrame.d.ts +3 -1
  238. package/dist/client/agent-page/AgentTabFrame.d.ts.map +1 -1
  239. package/dist/client/agent-page/AgentTabFrame.js +3 -2
  240. package/dist/client/agent-page/AgentTabFrame.js.map +1 -1
  241. package/dist/client/agent-page/AgentTabsPage.d.ts +2 -0
  242. package/dist/client/agent-page/AgentTabsPage.d.ts.map +1 -1
  243. package/dist/client/agent-page/AgentTabsPage.js +26 -15
  244. package/dist/client/agent-page/AgentTabsPage.js.map +1 -1
  245. package/dist/client/chat/message-components.d.ts +6 -1
  246. package/dist/client/chat/message-components.d.ts.map +1 -1
  247. package/dist/client/chat/message-components.js +17 -11
  248. package/dist/client/chat/message-components.js.map +1 -1
  249. package/dist/client/chat/tool-call-display.d.ts +11 -1
  250. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  251. package/dist/client/chat/tool-call-display.js +16 -17
  252. package/dist/client/chat/tool-call-display.js.map +1 -1
  253. package/dist/client/chat/tool-render-registry.d.ts +2 -0
  254. package/dist/client/chat/tool-render-registry.d.ts.map +1 -1
  255. package/dist/client/chat/tool-render-registry.js.map +1 -1
  256. package/dist/client/resources/McpConnectionSuggestion.d.ts.map +1 -1
  257. package/dist/client/resources/McpConnectionSuggestion.js +15 -1
  258. package/dist/client/resources/McpConnectionSuggestion.js.map +1 -1
  259. package/dist/client/resources/ResourceTree.d.ts.map +1 -1
  260. package/dist/client/resources/ResourceTree.js +3 -3
  261. package/dist/client/resources/ResourceTree.js.map +1 -1
  262. package/dist/client/resources/ResourcesPanel.d.ts +1 -0
  263. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  264. package/dist/client/resources/ResourcesPanel.js +34 -20
  265. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  266. package/dist/client/resources/mcp-connection-resume.d.ts +11 -0
  267. package/dist/client/resources/mcp-connection-resume.d.ts.map +1 -0
  268. package/dist/client/resources/mcp-connection-resume.js +95 -0
  269. package/dist/client/resources/mcp-connection-resume.js.map +1 -0
  270. package/dist/client/resources/mcp-integration-catalog.d.ts +1 -0
  271. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  272. package/dist/client/resources/mcp-integration-catalog.js +63 -8
  273. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  274. package/dist/client/resources/mcp-integration-logos.d.ts.map +1 -1
  275. package/dist/client/resources/mcp-integration-logos.js +4 -0
  276. package/dist/client/resources/mcp-integration-logos.js.map +1 -1
  277. package/dist/client/sse-event-processor.d.ts +5 -0
  278. package/dist/client/sse-event-processor.d.ts.map +1 -1
  279. package/dist/client/sse-event-processor.js +39 -13
  280. package/dist/client/sse-event-processor.js.map +1 -1
  281. package/dist/client/use-db-sync.d.ts +3 -2
  282. package/dist/client/use-db-sync.d.ts.map +1 -1
  283. package/dist/client/use-db-sync.js +17 -6
  284. package/dist/client/use-db-sync.js.map +1 -1
  285. package/dist/collab/routes.d.ts +1 -1
  286. package/dist/connections/catalog.d.ts +1 -1
  287. package/dist/connections/catalog.d.ts.map +1 -1
  288. package/dist/connections/catalog.js +7 -1
  289. package/dist/connections/catalog.js.map +1 -1
  290. package/dist/eject/remote-mcp-presets.d.ts.map +1 -1
  291. package/dist/eject/remote-mcp-presets.js +33 -3
  292. package/dist/eject/remote-mcp-presets.js.map +1 -1
  293. package/dist/guards/explicit-collab-access.d.ts +8 -0
  294. package/dist/guards/explicit-collab-access.d.ts.map +1 -0
  295. package/dist/guards/explicit-collab-access.js +214 -0
  296. package/dist/guards/explicit-collab-access.js.map +1 -0
  297. package/dist/guards/index.d.ts +1 -0
  298. package/dist/guards/index.d.ts.map +1 -1
  299. package/dist/guards/index.js +1 -0
  300. package/dist/guards/index.js.map +1 -1
  301. package/dist/localization/default-messages.d.ts +43 -0
  302. package/dist/localization/default-messages.d.ts.map +1 -1
  303. package/dist/localization/default-messages.js +48 -5
  304. package/dist/localization/default-messages.js.map +1 -1
  305. package/dist/mcp/connect-route.d.ts.map +1 -1
  306. package/dist/mcp/connect-route.js +34 -48
  307. package/dist/mcp/connect-route.js.map +1 -1
  308. package/dist/notifications/routes.d.ts +3 -3
  309. package/dist/observability/routes.d.ts +1 -1
  310. package/dist/progress/routes.d.ts +1 -1
  311. package/dist/provider-api/actions/custom-provider-registration.d.ts +11 -11
  312. package/dist/provider-api/actions/provider-api.d.ts +7 -7
  313. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  314. package/dist/provider-api/index.js +1 -1
  315. package/dist/provider-api/index.js.map +1 -1
  316. package/dist/server/collab-plugin.d.ts +34 -3
  317. package/dist/server/collab-plugin.d.ts.map +1 -1
  318. package/dist/server/collab-plugin.js +65 -12
  319. package/dist/server/collab-plugin.js.map +1 -1
  320. package/dist/server/index.d.ts +1 -1
  321. package/dist/server/index.d.ts.map +1 -1
  322. package/dist/server/index.js.map +1 -1
  323. package/dist/styles/agent-native.css +40 -0
  324. package/dist/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  325. package/dist/templates/chat/.agents/skills/real-time-sync/SKILL.md +1 -1
  326. package/dist/templates/chat/app/components/layout/Layout.tsx +1 -0
  327. package/dist/templates/chat/app/components/layout/Sidebar.tsx +43 -67
  328. package/dist/templates/chat/app/hooks/use-navigation-state.ts +2 -7
  329. package/dist/templates/chat/app/routes/_index.tsx +8 -5
  330. package/dist/templates/chat/changelog/2026-07-22-compact-sidebar-footer.md +6 -0
  331. package/dist/templates/chat/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +6 -0
  332. package/dist/templates/chat/changelog/2026-07-22-recent-chats-are-easier-to-scan-and-expand.md +6 -0
  333. package/dist/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  334. package/dist/templates/default/.agents/skills/real-time-collab/SKILL.md +35 -13
  335. package/dist/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
  336. package/dist/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  337. package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  338. package/dist/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +35 -13
  339. package/dist/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
  340. package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +12 -8
  341. package/docs/AGENTS.md +1 -1
  342. package/docs/content/agent-mentions.mdx +2 -2
  343. package/docs/content/{workspace.mdx → agent-resources.mdx} +1 -7
  344. package/docs/content/agent-teams.mdx +4 -4
  345. package/docs/content/dispatch.mdx +10 -10
  346. package/docs/content/drop-in-agent.mdx +4 -4
  347. package/docs/content/external-agents.mdx +1 -1
  348. package/docs/content/frames.mdx +1 -1
  349. package/docs/content/integrations.mdx +13 -2
  350. package/docs/content/key-concepts.mdx +2 -2
  351. package/docs/content/mcp-clients.mdx +7 -1
  352. package/docs/content/multi-app-workspace.mdx +3 -3
  353. package/docs/content/real-time-collaboration.mdx +33 -15
  354. package/docs/content/recurring-jobs.mdx +7 -7
  355. package/docs/content/skills-guide.mdx +4 -4
  356. package/docs/content/template-brain.mdx +1 -1
  357. package/docs/content/toolkit-collaboration.mdx +1 -1
  358. package/docs/content/using-your-agent.mdx +1 -1
  359. package/docs/content/what-is-agent-native.mdx +4 -4
  360. package/docs/content/workspace-management.mdx +4 -4
  361. package/package.json +3 -3
  362. package/src/agent/production-agent.ts +13 -3
  363. package/src/cli/doctor.ts +6 -1
  364. package/src/client/AgentPanel.tsx +79 -41
  365. package/src/client/AssistantChat.tsx +71 -25
  366. package/src/client/FeedbackButton.tsx +33 -7
  367. package/src/client/MultiTabAssistantChat.tsx +6 -8
  368. package/src/client/agent-chat-adapter.ts +11 -2
  369. package/src/client/agent-page/AgentTabFrame.tsx +22 -3
  370. package/src/client/agent-page/AgentTabsPage.tsx +34 -19
  371. package/src/client/chat/message-components.tsx +43 -16
  372. package/src/client/chat/tool-call-display.tsx +30 -18
  373. package/src/client/chat/tool-render-registry.tsx +2 -0
  374. package/src/client/resources/McpConnectionSuggestion.tsx +19 -2
  375. package/src/client/resources/ResourceTree.tsx +7 -10
  376. package/src/client/resources/ResourcesPanel.tsx +33 -70
  377. package/src/client/resources/mcp-connection-resume.ts +107 -0
  378. package/src/client/resources/mcp-integration-catalog.ts +65 -12
  379. package/src/client/resources/mcp-integration-logos.ts +4 -0
  380. package/src/client/sse-event-processor.ts +50 -14
  381. package/src/client/use-db-sync.ts +16 -6
  382. package/src/connections/catalog.ts +7 -1
  383. package/src/eject/remote-mcp-presets.ts +37 -5
  384. package/src/guards/explicit-collab-access.ts +229 -0
  385. package/src/guards/index.ts +1 -0
  386. package/src/localization/default-messages.ts +54 -5
  387. package/src/mcp/connect-route.ts +34 -51
  388. package/src/provider-api/index.ts +1 -1
  389. package/src/server/collab-plugin.ts +137 -18
  390. package/src/server/index.ts +2 -0
  391. package/src/styles/agent-native.css +40 -0
  392. package/src/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  393. package/src/templates/chat/.agents/skills/real-time-sync/SKILL.md +1 -1
  394. package/src/templates/chat/app/components/layout/Layout.tsx +1 -0
  395. package/src/templates/chat/app/components/layout/Sidebar.tsx +43 -67
  396. package/src/templates/chat/app/hooks/use-navigation-state.ts +2 -7
  397. package/src/templates/chat/app/routes/_index.tsx +8 -5
  398. package/src/templates/chat/changelog/2026-07-22-compact-sidebar-footer.md +6 -0
  399. package/src/templates/chat/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +6 -0
  400. package/src/templates/chat/changelog/2026-07-22-recent-chats-are-easier-to-scan-and-expand.md +6 -0
  401. package/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  402. package/src/templates/default/.agents/skills/real-time-collab/SKILL.md +35 -13
  403. package/src/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
  404. package/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  405. package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
  406. package/src/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +35 -13
  407. package/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
  408. package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +12 -8
@@ -12,7 +12,7 @@ import { useT } from "@agent-native/core/client/i18n";
12
12
  import { OrgSwitcher } from "@agent-native/core/client/org";
13
13
  import { FeedbackButton } from "@agent-native/core/client/ui";
14
14
  import {
15
- ChatHistoryList,
15
+ ChatHistoryRail,
16
16
  type ChatHistoryItem,
17
17
  } from "@agent-native/toolkit/chat-history";
18
18
  import {
@@ -22,7 +22,6 @@ import {
22
22
  IconLayoutSidebarLeftExpand,
23
23
  IconLayoutGrid,
24
24
  IconPhotoPlus,
25
- IconPlus,
26
25
  IconSettings,
27
26
  IconShare3,
28
27
  } from "@tabler/icons-react";
@@ -96,6 +95,12 @@ function persistedActiveThreadId() {
96
95
  }
97
96
  }
98
97
 
98
+ function persistActiveThreadId(threadId: string) {
99
+ try {
100
+ localStorage.setItem(ASSETS_ACTIVE_THREAD_KEY, threadId);
101
+ } catch {}
102
+ }
103
+
99
104
  function threadIdFromPath(pathname: string) {
100
105
  const match = pathname.match(/^\/chat\/([^/]+)/);
101
106
  if (!match) return null;
@@ -134,8 +139,7 @@ function AssetsChatsSection() {
134
139
  () =>
135
140
  threads
136
141
  .filter((thread) => thread.messageCount > 0 && !thread.archivedAt)
137
- .sort(compareThreads)
138
- .slice(0, 10),
142
+ .sort(compareThreads),
139
143
  [threads],
140
144
  );
141
145
  const displayedActiveThreadId =
@@ -177,6 +181,7 @@ function AssetsChatsSection() {
177
181
 
178
182
  function openThread(threadId: string, options?: { isNew?: boolean }) {
179
183
  switchThread(threadId);
184
+ persistActiveThreadId(threadId);
180
185
  navigateWithAgentChatViewTransition(
181
186
  navigate,
182
187
  options?.isNew ? "/" : chatThreadPath(threadId),
@@ -236,63 +241,50 @@ function AssetsChatsSection() {
236
241
 
237
242
  return (
238
243
  <div className="mt-2 border-s border-border/70 ps-3">
239
- <div className="mb-1 flex h-7 items-center gap-2 pe-1">
240
- <div className="min-w-0 flex-1 text-xs font-medium text-muted-foreground">
241
- {t("chat.chats")}
242
- </div>
243
- <Tooltip>
244
- <TooltipTrigger asChild>
245
- <button
246
- type="button"
247
- onClick={handleNewChat}
248
- className="flex size-6 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground"
249
- aria-label={t("chat.newAssetsChat")}
250
- >
251
- <IconPlus className="size-3.5" />
252
- </button>
253
- </TooltipTrigger>
254
- <TooltipContent side="right">{t("chat.newChat")}</TooltipContent>
255
- </Tooltip>
256
- </div>
257
- {visibleThreads.length > 0 && (
258
- <ChatHistoryList
259
- items={chatItems}
260
- activeId={displayedActiveThreadId}
261
- onSelect={openThread}
262
- onTogglePin={(threadId) => {
263
- const thread = visibleThreads.find((item) => item.id === threadId);
264
- if (thread) void pinThread(threadId, !thread.pinnedAt);
265
- }}
266
- onRename={handleRenameThread}
267
- renameMaxLength={160}
268
- onDelete={(threadId) => void handleArchiveThread(threadId)}
269
- renderAdditionalRowActions={(item, closeMenu) => (
270
- <button
271
- type="button"
272
- role="menuitem"
273
- className="an-chat-history-row__menu-item"
274
- onClick={() => {
275
- closeMenu();
276
- void handleCopyShareLink(item.id);
277
- }}
278
- >
279
- <IconShare3 size={13} strokeWidth={1.8} />
280
- <span>{t("chat.copyShareLink")}</span>
281
- </button>
282
- )}
283
- labels={{
284
- options: (item) =>
285
- t("chat.optionsFor", { title: item.titleText ?? "" }),
286
- renameInput: (item) => `Rename ${item.titleText ?? ""}`,
287
- rename: t("chat.renameChat"),
288
- pin: t("chat.pinChat"),
289
- unpin: t("chat.unpinChat"),
290
- delete: t("chat.archiveChat"),
291
- }}
292
- variant="rail"
293
- className="min-w-0"
294
- />
295
- )}
244
+ <ChatHistoryRail
245
+ items={chatItems}
246
+ activeId={displayedActiveThreadId}
247
+ onSelect={openThread}
248
+ onNewChat={() => void handleNewChat()}
249
+ railLabels={{
250
+ newChat: t("chat.newChat"),
251
+ showMore: t("chat.chats"),
252
+ showLess: t("chat.chats"),
253
+ }}
254
+ previewCount={5}
255
+ expandedCount={15}
256
+ onTogglePin={(threadId) => {
257
+ const thread = visibleThreads.find((item) => item.id === threadId);
258
+ if (thread) void pinThread(threadId, !thread.pinnedAt);
259
+ }}
260
+ onRename={handleRenameThread}
261
+ renameMaxLength={160}
262
+ onDelete={(threadId) => void handleArchiveThread(threadId)}
263
+ renderAdditionalRowActions={(item, closeMenu) => (
264
+ <button
265
+ type="button"
266
+ role="menuitem"
267
+ className="an-chat-history-row__menu-item"
268
+ onClick={() => {
269
+ closeMenu();
270
+ void handleCopyShareLink(item.id);
271
+ }}
272
+ >
273
+ <IconShare3 size={13} strokeWidth={1.8} />
274
+ <span>{t("chat.copyShareLink")}</span>
275
+ </button>
276
+ )}
277
+ labels={{
278
+ options: (item) =>
279
+ t("chat.optionsFor", { title: item.titleText ?? "" }),
280
+ renameInput: (item) => `Rename ${item.titleText ?? ""}`,
281
+ rename: t("chat.renameChat"),
282
+ pin: t("chat.pinChat"),
283
+ unpin: t("chat.unpinChat"),
284
+ delete: t("chat.archiveChat"),
285
+ }}
286
+ className="min-w-0"
287
+ />
296
288
  </div>
297
289
  );
298
290
  }
@@ -466,7 +458,7 @@ export function Sidebar() {
466
458
  <OrgSwitcher />
467
459
  </div>
468
460
 
469
- <div className="px-3 py-2">
461
+ <div className="px-3 py-2 empty:hidden">
470
462
  <DevDatabaseLink />
471
463
  <FeedbackButton />
472
464
  </div>
@@ -1,7 +1,4 @@
1
- import {
2
- isAgentChatHomeHandoffActive,
3
- markAgentChatHomeHandoff,
4
- } from "@agent-native/core/client/agent-chat";
1
+ import { markAgentChatHomeHandoff } from "@agent-native/core/client/agent-chat";
5
2
  import { getBrowserTabId } from "@agent-native/core/client/hooks";
6
3
  import { useAgentRouteState } from "@agent-native/core/client/navigation";
7
4
  import { useLocation } from "react-router";
@@ -204,8 +201,7 @@ export function useNavigationState() {
204
201
  onNavigate: (_command, path) => {
205
202
  if (
206
203
  isCreatePath(location.pathname) &&
207
- !isCreatePath(pathnameFromPath(path)) &&
208
- isAgentChatHomeHandoffActive(ASSETS_CHAT_STORAGE_KEY)
204
+ !isCreatePath(pathnameFromPath(path))
209
205
  ) {
210
206
  markAgentChatHomeHandoff(ASSETS_CHAT_STORAGE_KEY);
211
207
  }
@@ -59,6 +59,13 @@ export default function CreatePage() {
59
59
  const { threadId } = useParams();
60
60
  const navigate = useNavigate();
61
61
  const t = useT();
62
+ const threadUrlSync = threadId
63
+ ? {
64
+ routeThreadId: threadId,
65
+ getPath: chatThreadPath,
66
+ navigate,
67
+ }
68
+ : undefined;
62
69
  const imageModelMenu = useImageModelMenu();
63
70
 
64
71
  useEffect(() => {
@@ -82,11 +89,7 @@ export default function CreatePage() {
82
89
  className="assets-create-chat-panel"
83
90
  defaultMode="chat"
84
91
  storageKey={ASSETS_CHAT_STORAGE_KEY}
85
- threadUrlSync={{
86
- routeThreadId: threadId ?? null,
87
- getPath: chatThreadPath,
88
- navigate,
89
- }}
92
+ threadUrlSync={threadUrlSync}
90
93
  browserTabId={getBrowserTabId()}
91
94
  threadFooterSlot={({ threadId }) => (
92
95
  <GenerationResults threadId={threadId} />
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-22
4
+ ---
5
+
6
+ Full-page chat keeps the active conversation when moving to and from the sidebar.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-22
4
+ ---
5
+
6
+ Recent chats now expand from a compact five-item list with New chat anchored at the bottom.
@@ -85,7 +85,10 @@ in the moment of agent use.
85
85
  approval, generative UI, progress, and screen-state exposure.
86
86
  - **Chat history kit**: presentational chat lists and recent-chat rails belong
87
87
  in Toolkit; Core keeps thread persistence, agent execution, transport, and
88
- page-to-sidebar handoff. Apps inject routing, labels, and domain actions.
88
+ page-to-sidebar handoff. Use Toolkit's `ChatHistoryRail` for the standard
89
+ five-item sidebar preview and a footer row with New chat followed by an
90
+ ellipsis disclosure up to fifteen. Apps inject routing, labels, and domain
91
+ actions.
89
92
  - **Agent page kit**: the full-page `/agent` surface (`AgentTabsPage` from
90
93
  `@agent-native/core/client`) with Context, Files, Connections, Jobs, and
91
94
  Access tabs plus a Personal/Organization scope toggle. The canonical home
@@ -72,7 +72,7 @@ The agent modifies data in SQL, but the UI runs in the browser. SSE bridges same
72
72
  });
73
73
  ```
74
74
 
75
- `useDbSync` and every `subscribeSyncEvents` subscriber share one `EventSource` and one fallback poll loop per tab — this is how collaborative documents receive doc updates and cursor/awareness events.
75
+ `useDbSync` and every `subscribeSyncEvents` subscriber share one `EventSource` and one fallback poll loop per tab — this is how collaborative documents receive doc updates and cursor/awareness events. Hidden tabs keep that shared transport alive by default: SSE stays connected and active fallback polling relaxes to a 10-second floor (idle polling remains once per minute). Pass `pauseWhenHidden: true` only for a consumer that explicitly must stop all hidden-tab sync.
76
76
 
77
77
  ## Which sources to depend on
78
78
 
@@ -0,0 +1,77 @@
1
+ import { defineAction } from "@agent-native/core";
2
+ import { assertAccess } from "@agent-native/core/sharing";
3
+ import { eq } from "drizzle-orm";
4
+ import { z } from "zod";
5
+
6
+ import { getDb, schema } from "../server/db/index.js";
7
+ import {
8
+ nanoid,
9
+ nowIso,
10
+ parseJson,
11
+ serializeSource,
12
+ sha256Hex,
13
+ stableJson,
14
+ } from "../server/lib/brain.js";
15
+
16
+ function sourceKeyFor(source: {
17
+ sourceKey?: string | null;
18
+ configJson?: string | null;
19
+ }) {
20
+ const columnValue = source.sourceKey?.trim();
21
+ if (columnValue) return columnValue;
22
+ const config = parseJson<Record<string, unknown>>(source.configJson, {});
23
+ const configValue = config.sourceKey;
24
+ return typeof configValue === "string" && configValue.trim()
25
+ ? configValue.trim()
26
+ : null;
27
+ }
28
+
29
+ export default defineAction({
30
+ description:
31
+ "Rotate the signed ingest token for a configured Clips or generic Brain source. The new token is returned once so it can be saved in the sending app.",
32
+ agentTool: false,
33
+ toolCallable: false,
34
+ schema: z.object({
35
+ sourceId: z.string().min(1),
36
+ }),
37
+ run: async ({ sourceId }) => {
38
+ const access = await assertAccess("brain-source", sourceId, "admin");
39
+ const existing = access.resource;
40
+ if (existing.provider !== "clips" && existing.provider !== "generic") {
41
+ throw new Error(
42
+ "Only configured Clips or generic sources can rotate an ingest token.",
43
+ );
44
+ }
45
+
46
+ const sourceKey = sourceKeyFor(existing);
47
+ if (!sourceKey) {
48
+ throw new Error("This source is missing a signed-ingest source key.");
49
+ }
50
+
51
+ const ingestToken = `brain_${nanoid(32)}`;
52
+ const ingestTokenHash = await sha256Hex(ingestToken);
53
+ const config = {
54
+ ...parseJson<Record<string, unknown>>(existing.configJson, {}),
55
+ sourceKey,
56
+ ingestTokenHash,
57
+ };
58
+ const db = getDb();
59
+ await db
60
+ .update(schema.brainSources)
61
+ .set({
62
+ sourceKey,
63
+ ingestTokenHash,
64
+ configJson: stableJson(config),
65
+ updatedAt: nowIso(),
66
+ })
67
+ .where(eq(schema.brainSources.id, sourceId));
68
+ const [source] = await db
69
+ .select()
70
+ .from(schema.brainSources)
71
+ .where(eq(schema.brainSources.id, sourceId))
72
+ .limit(1);
73
+ if (!source) throw new Error(`Brain source ${sourceId} was not found`);
74
+
75
+ return { source: serializeSource(source), ingestToken };
76
+ },
77
+ });
@@ -44,7 +44,11 @@ export function Layout({ children }: { children: React.ReactNode }) {
44
44
  activePath: location.pathname,
45
45
  enabled: !isAskRoute,
46
46
  });
47
- useAgentChatHomeHandoffLinks({ storageKey: "brain", chatPath: "/" });
47
+ useAgentChatHomeHandoffLinks({
48
+ storageKey: "brain",
49
+ chatPath: "/",
50
+ requireActiveHandoff: false,
51
+ });
48
52
 
49
53
  useEffect(() => {
50
54
  setMobileSidebarOpen(false);
@@ -10,13 +10,12 @@ import { useT } from "@agent-native/core/client/i18n";
10
10
  import { OrgSwitcher } from "@agent-native/core/client/org";
11
11
  import { FeedbackButton } from "@agent-native/core/client/ui";
12
12
  import {
13
- ChatHistoryList,
13
+ ChatHistoryRail,
14
14
  type ChatHistoryItem,
15
15
  } from "@agent-native/toolkit/chat-history";
16
16
  import {
17
17
  IconLayoutSidebarLeftCollapse,
18
18
  IconLayoutSidebarLeftExpand,
19
- IconPlus,
20
19
  } from "@tabler/icons-react";
21
20
  import { useEffect, useMemo } from "react";
22
21
  import { Link, NavLink, useLocation, useNavigate } from "react-router";
@@ -102,8 +101,7 @@ function BrainChatsSection() {
102
101
  () =>
103
102
  threads
104
103
  .filter((thread) => thread.messageCount > 0 && !thread.archivedAt)
105
- .sort(compareThreads)
106
- .slice(0, 8),
104
+ .sort(compareThreads),
107
105
  [threads],
108
106
  );
109
107
  const chatItems = useMemo<ChatHistoryItem[]>(
@@ -178,50 +176,37 @@ function BrainChatsSection() {
178
176
 
179
177
  return (
180
178
  <div className="mt-2 border-s border-sidebar-border/70 ps-3">
181
- <div className="mb-1 flex h-7 items-center gap-2 pe-1">
182
- <div className="min-w-0 flex-1 text-xs font-medium text-sidebar-foreground/70">
183
- {t("chat.chats")}
184
- </div>
185
- <Tooltip>
186
- <TooltipTrigger asChild>
187
- <button
188
- type="button"
189
- onClick={handleNewChat}
190
- className="flex size-6 shrink-0 items-center justify-center rounded-md text-sidebar-foreground/65 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground"
191
- aria-label={t("chat.newBrainChat")}
192
- >
193
- <IconPlus className="size-3.5" />
194
- </button>
195
- </TooltipTrigger>
196
- <TooltipContent>{t("chat.newChat")}</TooltipContent>
197
- </Tooltip>
198
- </div>
199
- {visibleThreads.length > 0 && (
200
- <ChatHistoryList
201
- items={chatItems}
202
- activeId={activeThreadId}
203
- onSelect={openThread}
204
- onTogglePin={(threadId) => {
205
- const thread = visibleThreads.find((item) => item.id === threadId);
206
- if (thread) void pinThread(threadId, !thread.pinnedAt);
207
- }}
208
- onRename={handleRenameThread}
209
- renameMaxLength={160}
210
- onDelete={(threadId) => void handleArchiveThread(threadId)}
211
- labels={{
212
- options: (item) =>
213
- t("chat.optionsFor", { title: item.titleText ?? "" }),
214
- renameInput: (item) =>
215
- t("chat.renameThread", { title: item.titleText ?? "" }),
216
- rename: t("chat.renameChat"),
217
- pin: t("chat.pinChat"),
218
- unpin: t("chat.unpinChat"),
219
- delete: t("chat.archiveChat"),
220
- }}
221
- variant="rail"
222
- className="min-w-0"
223
- />
224
- )}
179
+ <ChatHistoryRail
180
+ items={chatItems}
181
+ activeId={activeThreadId}
182
+ onSelect={openThread}
183
+ onNewChat={() => void handleNewChat()}
184
+ railLabels={{
185
+ newChat: t("chat.newChat"),
186
+ showMore: t("chat.chats"),
187
+ showLess: t("chat.chats"),
188
+ }}
189
+ previewCount={5}
190
+ expandedCount={15}
191
+ onTogglePin={(threadId) => {
192
+ const thread = visibleThreads.find((item) => item.id === threadId);
193
+ if (thread) void pinThread(threadId, !thread.pinnedAt);
194
+ }}
195
+ onRename={handleRenameThread}
196
+ renameMaxLength={160}
197
+ onDelete={(threadId) => void handleArchiveThread(threadId)}
198
+ labels={{
199
+ options: (item) =>
200
+ t("chat.optionsFor", { title: item.titleText ?? "" }),
201
+ renameInput: (item) =>
202
+ t("chat.renameThread", { title: item.titleText ?? "" }),
203
+ rename: t("chat.renameChat"),
204
+ pin: t("chat.pinChat"),
205
+ unpin: t("chat.unpinChat"),
206
+ delete: t("chat.archiveChat"),
207
+ }}
208
+ className="min-w-0"
209
+ />
225
210
  </div>
226
211
  );
227
212
  }
@@ -312,7 +297,6 @@ export function Sidebar({
312
297
  </p>
313
298
  </div>
314
299
  </Link>
315
- {!collapsed ? collapseButton : null}
316
300
  </div>
317
301
 
318
302
  <nav
@@ -394,11 +378,14 @@ export function Sidebar({
394
378
  {!collapsed ? (
395
379
  <div className="px-3 py-2">
396
380
  <DevDatabaseLink />
397
- <FeedbackButton />
381
+ <div className="flex items-center justify-end gap-1">
382
+ <FeedbackButton className="min-w-0 flex-1" side="right" />
383
+ {collapseButton}
384
+ </div>
398
385
  </div>
399
386
  ) : null}
400
387
 
401
- {collapseButton ? (
388
+ {collapsed && collapseButton ? (
402
389
  <div className="flex justify-center px-2 py-2">{collapseButton}</div>
403
390
  ) : null}
404
391
  </div>
@@ -1,7 +1,4 @@
1
- import {
2
- isAgentChatHomeHandoffActive,
3
- markAgentChatHomeHandoff,
4
- } from "@agent-native/core/client/agent-chat";
1
+ import { markAgentChatHomeHandoff } from "@agent-native/core/client/agent-chat";
5
2
  import { appBasePath, appPath } from "@agent-native/core/client/api-path";
6
3
  import { useAgentRouteState } from "@agent-native/core/client/navigation";
7
4
  import { useLocation } from "react-router";
@@ -109,11 +106,7 @@ export function useNavigationState() {
109
106
  return `${path}${params.size ? `?${params.toString()}` : ""}`;
110
107
  },
111
108
  onNavigate: (_command, path) => {
112
- if (
113
- location.pathname === "/" &&
114
- pathnameFromPath(path) !== "/" &&
115
- isAgentChatHomeHandoffActive("brain")
116
- ) {
109
+ if (location.pathname === "/" && pathnameFromPath(path) !== "/") {
117
110
  markAgentChatHomeHandoff("brain");
118
111
  }
119
112
  },