@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
@@ -629,6 +629,11 @@ const enUS = {
629
629
  refresh: "Refresh",
630
630
  refreshing: "Refreshing...",
631
631
  downloadCsv: "Download CSV",
632
+ exportToGoogleSheets: "Export to Google Sheets",
633
+ exportingToGoogleSheets: "Exporting to Google Sheets...",
634
+ googleSheetsExported: "Exported to Google Sheets",
635
+ openGoogleSheet: "Open sheet",
636
+ googleSheetsExportFailed: "Couldn't export to Google Sheets: {{message}}",
632
637
  viewSql: "View SQL",
633
638
  dragToReorder: "Drag to reorder",
634
639
  deleteSectionTitle: "Delete section?",
@@ -814,6 +819,11 @@ const enUS = {
814
819
  },
815
820
  dataSources: {
816
821
  uploadFile: "Upload file",
822
+ googleSheetsExport: "Google Sheets export",
823
+ googleSheetsExportDescription:
824
+ "Export dashboard reports to Google Sheets through a shared Google connection.",
825
+ connected: "Connected",
826
+ googleSheets: "Google Sheets",
817
827
  open: "Open",
818
828
  savedValueHint:
819
829
  "A value is already saved. Leave blank to keep it, or enter a new value to replace it.",
@@ -1274,6 +1284,11 @@ const analyticsSliceTranslations: {
1274
1284
  },
1275
1285
  dataSources: {
1276
1286
  uploadFile: "上传文件",
1287
+ googleSheetsExport: "Google Sheets 导出",
1288
+ googleSheetsExportDescription:
1289
+ "通过共享的 Google 连接将仪表板报告导出到 Google Sheets。",
1290
+ connected: "已连接",
1291
+ googleSheets: "Google Sheets",
1277
1292
  open: "打开",
1278
1293
  savedValueHint: "值已保存。留空以保留它,或输入新值以替换它。",
1279
1294
  githubOAuth: "GitHub OAuth",
@@ -1557,6 +1572,11 @@ const analyticsSliceTranslations: {
1557
1572
  },
1558
1573
  dataSources: {
1559
1574
  uploadFile: "Subir archivo",
1575
+ googleSheetsExport: "Exportación a Google Sheets",
1576
+ googleSheetsExportDescription:
1577
+ "Exporte informes del panel a Google Sheets mediante una conexión de Google compartida.",
1578
+ connected: "Conectado",
1579
+ googleSheets: "Google Sheets",
1560
1580
  open: "Abierto",
1561
1581
  savedValueHint:
1562
1582
  "Ya hay un valor guardado. Déjelo en blanco para conservarlo o ingrese un nuevo valor para reemplazarlo.",
@@ -1862,6 +1882,11 @@ const analyticsSliceTranslations: {
1862
1882
  },
1863
1883
  dataSources: {
1864
1884
  uploadFile: "Télécharger le fichier",
1885
+ googleSheetsExport: "Export Google Sheets",
1886
+ googleSheetsExportDescription:
1887
+ "Exportez les rapports du tableau de bord vers Google Sheets grâce à une connexion Google partagée.",
1888
+ connected: "Connecté",
1889
+ googleSheets: "Google Sheets",
1865
1890
  open: "Ouvrir",
1866
1891
  savedValueHint:
1867
1892
  "Une valeur est déjà enregistrée. Laissez vide pour le conserver ou saisissez une nouvelle valeur pour le remplacer.",
@@ -2163,6 +2188,11 @@ const analyticsSliceTranslations: {
2163
2188
  },
2164
2189
  dataSources: {
2165
2190
  uploadFile: "Datei hochladen",
2191
+ googleSheetsExport: "Google-Sheets-Export",
2192
+ googleSheetsExportDescription:
2193
+ "Exportieren Sie Dashboard-Berichte über eine gemeinsame Google-Verbindung nach Google Sheets.",
2194
+ connected: "Verbunden",
2195
+ googleSheets: "Google Sheets",
2166
2196
  open: "Offen",
2167
2197
  savedValueHint:
2168
2198
  "Ein Wert ist bereits gespeichert. Lassen Sie das Feld leer, um es beizubehalten, oder geben Sie einen neuen Wert ein, um es zu ersetzen.",
@@ -2463,6 +2493,11 @@ const analyticsSliceTranslations: {
2463
2493
  },
2464
2494
  dataSources: {
2465
2495
  uploadFile: "ファイルをアップロードする",
2496
+ googleSheetsExport: "Google スプレッドシートへのエクスポート",
2497
+ googleSheetsExportDescription:
2498
+ "共有 Google 接続を使用してダッシュボードレポートを Google スプレッドシートにエクスポートします。",
2499
+ connected: "接続済み",
2500
+ googleSheets: "Google Sheets",
2466
2501
  open: "開ける",
2467
2502
  savedValueHint:
2468
2503
  "値はすでに保存されています。空白のままにして保持するか、新しい値を入力して置き換えます。",
@@ -2758,6 +2793,11 @@ const analyticsSliceTranslations: {
2758
2793
  },
2759
2794
  dataSources: {
2760
2795
  uploadFile: "파일 업로드",
2796
+ googleSheetsExport: "Google Sheets 내보내기",
2797
+ googleSheetsExportDescription:
2798
+ "공유 Google 연결을 통해 대시보드 보고서를 Google Sheets로 내보냅니다.",
2799
+ connected: "연결됨",
2800
+ googleSheets: "Google Sheets",
2761
2801
  open: "열려 있는",
2762
2802
  savedValueHint:
2763
2803
  "값이 이미 저장되어 있습니다. 유지하려면 비워두고, 바꾸려면 새 값을 입력하세요.",
@@ -3049,6 +3089,11 @@ const analyticsSliceTranslations: {
3049
3089
  },
3050
3090
  dataSources: {
3051
3091
  uploadFile: "Carregar arquivo",
3092
+ googleSheetsExport: "Exportação para o Google Sheets",
3093
+ googleSheetsExportDescription:
3094
+ "Exporte relatórios do painel para o Google Sheets por meio de uma conexão Google compartilhada.",
3095
+ connected: "Conectado",
3096
+ googleSheets: "Google Sheets",
3052
3097
  open: "Abrir",
3053
3098
  savedValueHint:
3054
3099
  "Um valor já está salvo. Deixe em branco para mantê-lo ou insira um novo valor para substituí-lo.",
@@ -3345,6 +3390,11 @@ const analyticsSliceTranslations: {
3345
3390
  },
3346
3391
  dataSources: {
3347
3392
  uploadFile: "फ़ाइल अपलोड करें",
3393
+ googleSheetsExport: "Google Sheets निर्यात",
3394
+ googleSheetsExportDescription:
3395
+ "साझा Google कनेक्शन के माध्यम से डैशबोर्ड रिपोर्ट को Google Sheets में निर्यात करें।",
3396
+ connected: "कनेक्टेड",
3397
+ googleSheets: "Google Sheets",
3348
3398
  open: "खुला",
3349
3399
  savedValueHint:
3350
3400
  "एक मान पहले से ही सहेजा गया है. इसे रखने के लिए खाली छोड़ दें, या इसे बदलने के लिए एक नया मान दर्ज करें।",
@@ -3632,6 +3682,11 @@ const analyticsSliceTranslations: {
3632
3682
  },
3633
3683
  dataSources: {
3634
3684
  uploadFile: "تحميل الملف",
3685
+ googleSheetsExport: "تصدير Google Sheets",
3686
+ googleSheetsExportDescription:
3687
+ "صدّر تقارير لوحة المعلومات إلى Google Sheets من خلال اتصال Google مشترك.",
3688
+ connected: "متصل",
3689
+ googleSheets: "Google Sheets",
3635
3690
  open: "يفتح",
3636
3691
  savedValueHint:
3637
3692
  "تم حفظ القيمة بالفعل. اتركه فارغًا للاحتفاظ به، أو أدخل قيمة جديدة لاستبداله.",
@@ -6059,6 +6114,11 @@ const translatedAnalyticsDebtTranslations = {
6059
6114
  discardChanges: "放弃更改",
6060
6115
  dismissDemoIntro: "关闭演示介绍",
6061
6116
  downloadCsv: "下载CSV",
6117
+ exportToGoogleSheets: "导出到 Google Sheets",
6118
+ exportingToGoogleSheets: "正在导出到 Google Sheets...",
6119
+ googleSheetsExported: "已导出到 Google Sheets",
6120
+ openGoogleSheet: "打开表格",
6121
+ googleSheetsExportFailed: "无法导出到 Google Sheets:{{message}}",
6062
6122
  dragToReorder: "拖动以重新排序",
6063
6123
  expandFilters: "展开过滤器",
6064
6124
  failedToFormatSql: "无法格式化 SQL",
@@ -6271,6 +6331,12 @@ const translatedAnalyticsDebtTranslations = {
6271
6331
  discardChanges: "Descartar cambios",
6272
6332
  dismissDemoIntro: "Descartar la introducción de la demostración",
6273
6333
  downloadCsv: "Descargar CSV",
6334
+ exportToGoogleSheets: "Exportar a Google Sheets",
6335
+ exportingToGoogleSheets: "Exportando a Google Sheets...",
6336
+ googleSheetsExported: "Exportado a Google Sheets",
6337
+ openGoogleSheet: "Abrir hoja",
6338
+ googleSheetsExportFailed:
6339
+ "No se pudo exportar a Google Sheets: {{message}}",
6274
6340
  dragToReorder: "Arrastra para reordenar",
6275
6341
  expandFilters: "Ampliar filtros",
6276
6342
  failedToFormatSql: "No se pudo formatear SQL",
@@ -6488,6 +6554,12 @@ const translatedAnalyticsDebtTranslations = {
6488
6554
  discardChanges: "Ignorer les modifications",
6489
6555
  dismissDemoIntro: "Ignorer l'intro de la démo",
6490
6556
  downloadCsv: "Télécharger CSV",
6557
+ exportToGoogleSheets: "Exporter vers Google Sheets",
6558
+ exportingToGoogleSheets: "Exportation vers Google Sheets...",
6559
+ googleSheetsExported: "Exporté vers Google Sheets",
6560
+ openGoogleSheet: "Ouvrir la feuille",
6561
+ googleSheetsExportFailed:
6562
+ "Impossible d’exporter vers Google Sheets : {{message}}",
6491
6563
  dragToReorder: "Faites glisser pour réorganiser",
6492
6564
  expandFilters: "Développer les filtres",
6493
6565
  failedToFormatSql: "Échec du formatage de SQL",
@@ -6706,6 +6778,12 @@ const translatedAnalyticsDebtTranslations = {
6706
6778
  discardChanges: "Änderungen verwerfen",
6707
6779
  dismissDemoIntro: "Demo-Intro schließen",
6708
6780
  downloadCsv: "Laden Sie CSV herunter",
6781
+ exportToGoogleSheets: "Nach Google Sheets exportieren",
6782
+ exportingToGoogleSheets: "Export nach Google Sheets...",
6783
+ googleSheetsExported: "Nach Google Sheets exportiert",
6784
+ openGoogleSheet: "Tabelle öffnen",
6785
+ googleSheetsExportFailed:
6786
+ "Export nach Google Sheets fehlgeschlagen: {{message}}",
6709
6787
  dragToReorder: "Zum Neuanordnen ziehen",
6710
6788
  expandFilters: "Filter erweitern",
6711
6789
  failedToFormatSql: "SQL konnte nicht formatiert werden",
@@ -6919,6 +6997,12 @@ const translatedAnalyticsDebtTranslations = {
6919
6997
  discardChanges: "変更を破棄する",
6920
6998
  dismissDemoIntro: "デモのイントロを閉じる",
6921
6999
  downloadCsv: "CSVをダウンロード",
7000
+ exportToGoogleSheets: "Google スプレッドシートにエクスポート",
7001
+ exportingToGoogleSheets: "Google スプレッドシートにエクスポート中...",
7002
+ googleSheetsExported: "Google スプレッドシートにエクスポートしました",
7003
+ openGoogleSheet: "シートを開く",
7004
+ googleSheetsExportFailed:
7005
+ "Google スプレッドシートへのエクスポートに失敗しました: {{message}}",
6922
7006
  dragToReorder: "ドラッグして並べ替えます",
6923
7007
  expandFilters: "フィルターを展開する",
6924
7008
  failedToFormatSql: "SQLのフォーマットに失敗しました",
@@ -7131,6 +7215,12 @@ const translatedAnalyticsDebtTranslations = {
7131
7215
  discardChanges: "변경사항 취소",
7132
7216
  dismissDemoIntro: "데모 소개 닫기",
7133
7217
  downloadCsv: "CSV 다운로드",
7218
+ exportToGoogleSheets: "Google Sheets로 내보내기",
7219
+ exportingToGoogleSheets: "Google Sheets로 내보내는 중...",
7220
+ googleSheetsExported: "Google Sheets로 내보냈습니다",
7221
+ openGoogleSheet: "시트 열기",
7222
+ googleSheetsExportFailed:
7223
+ "Google Sheets로 내보내지 못했습니다: {{message}}",
7134
7224
  dragToReorder: "드래그하여 재정렬하세요.",
7135
7225
  expandFilters: "필터 확장",
7136
7226
  failedToFormatSql: "SQL을 포맷하지 못했습니다.",
@@ -7347,6 +7437,12 @@ const translatedAnalyticsDebtTranslations = {
7347
7437
  discardChanges: "Descartar alterações",
7348
7438
  dismissDemoIntro: "Ignorar introdução da demonstração",
7349
7439
  downloadCsv: "Baixar CSV",
7440
+ exportToGoogleSheets: "Exportar para o Google Sheets",
7441
+ exportingToGoogleSheets: "Exportando para o Google Sheets...",
7442
+ googleSheetsExported: "Exportado para o Google Sheets",
7443
+ openGoogleSheet: "Abrir planilha",
7444
+ googleSheetsExportFailed:
7445
+ "Não foi possível exportar para o Google Sheets: {{message}}",
7350
7446
  dragToReorder: "Arraste para reordenar",
7351
7447
  expandFilters: "Expandir filtros",
7352
7448
  failedToFormatSql: "Falha ao formatar SQL",
@@ -7559,6 +7655,12 @@ const translatedAnalyticsDebtTranslations = {
7559
7655
  discardChanges: "परिवर्तन त्यागें",
7560
7656
  dismissDemoIntro: "डेमो परिचय ख़ारिज करें",
7561
7657
  downloadCsv: "CSV डाउनलोड करें",
7658
+ exportToGoogleSheets: "Google Sheets में निर्यात करें",
7659
+ exportingToGoogleSheets: "Google Sheets में निर्यात किया जा रहा है...",
7660
+ googleSheetsExported: "Google Sheets में निर्यात किया गया",
7661
+ openGoogleSheet: "शीट खोलें",
7662
+ googleSheetsExportFailed:
7663
+ "Google Sheets में निर्यात नहीं किया जा सका: {{message}}",
7562
7664
  dragToReorder: "पुनः व्यवस्थित करने के लिए खींचें",
7563
7665
  expandFilters: "फ़िल्टर का विस्तार करें",
7564
7666
  failedToFormatSql: "SQL को प्रारूपित करने में विफल",
@@ -7770,6 +7872,11 @@ const translatedAnalyticsDebtTranslations = {
7770
7872
  discardChanges: "تجاهل التغييرات",
7771
7873
  dismissDemoIntro: "رفض المقدمة التجريبية",
7772
7874
  downloadCsv: "تحميل CSV",
7875
+ exportToGoogleSheets: "تصدير إلى Google Sheets",
7876
+ exportingToGoogleSheets: "جارٍ التصدير إلى Google Sheets...",
7877
+ googleSheetsExported: "تم التصدير إلى Google Sheets",
7878
+ openGoogleSheet: "فتح الورقة",
7879
+ googleSheetsExportFailed: "تعذر التصدير إلى Google Sheets: {{message}}",
7773
7880
  dragToReorder: "اسحب لإعادة الترتيب",
7774
7881
  expandFilters: "قم بتوسيع عوامل التصفية",
7775
7882
  failedToFormatSql: "فشل تنسيق SQL",
@@ -74,6 +74,15 @@ const dataSourceWorkspaceProviderIds: Record<string, string> = {
74
74
  slack: "slack",
75
75
  };
76
76
 
77
+ export function getGoogleDriveConnection(
78
+ data: DataSourceStatusResponse | undefined,
79
+ ): WorkspaceConnectionProviderSummary | undefined {
80
+ return data?.workspaceConnections?.providers.find(
81
+ (provider) =>
82
+ provider.provider === "google_drive" || provider.id === "google_drive",
83
+ );
84
+ }
85
+
77
86
  const sharedConnectionLabels: Record<SharedConnectionStatusKind, string> = {
78
87
  ready: "Ready via workspace",
79
88
  needs_grant: "Needs grant",
@@ -1,4 +1,5 @@
1
1
  import { callAction } from "@agent-native/core/client/hooks";
2
+ import { MAX_CONCURRENT_SQL_QUERIES } from "@shared/sql-query-limits";
2
3
  import { useQuery } from "@tanstack/react-query";
3
4
 
4
5
  import type { DataSourceType } from "@/pages/adhoc/sql-dashboard/types";
@@ -11,8 +12,6 @@ export interface SqlQueryResult {
11
12
  schema?: { name: string; type: string }[];
12
13
  }
13
14
 
14
- const MAX_CONCURRENT_SQL_QUERIES = 4;
15
-
16
15
  type PendingSqlQuerySlot = {
17
16
  resolve: (release: () => void) => void;
18
17
  reject: (reason: unknown) => void;
@@ -4,12 +4,9 @@ import {
4
4
  } from "@agent-native/core/client/agent-chat";
5
5
  import { useT } from "@agent-native/core/client/i18n";
6
6
  import { CreativeContextComposerChip } from "@agent-native/creative-context/client";
7
- import { useEffect, useMemo, useState } from "react";
7
+ import { useEffect, useMemo } from "react";
8
8
 
9
- import {
10
- ANALYTICS_CHAT_STORAGE_KEY,
11
- hasRecentAnalyticsChat,
12
- } from "@/lib/chat-handoff";
9
+ import { ANALYTICS_CHAT_STORAGE_KEY } from "@/lib/chat-handoff";
13
10
  import { TAB_ID } from "@/lib/tab-id";
14
11
 
15
12
  const DASHBOARD_CONTEXT_KEYS = new Set([
@@ -19,7 +16,6 @@ const DASHBOARD_CONTEXT_KEYS = new Set([
19
16
 
20
17
  export default function AskPage() {
21
18
  const t = useT();
22
- const [restoreActiveThread] = useState(() => hasRecentAnalyticsChat());
23
19
  const { items: chatContextItems, remove: removeChatContextItem } =
24
20
  useAgentChatContext();
25
21
  const staleDashboardContextKey = useMemo(
@@ -43,7 +39,6 @@ export default function AskPage() {
43
39
  className="analytics-chat-panel"
44
40
  defaultMode="chat"
45
41
  storageKey={ANALYTICS_CHAT_STORAGE_KEY}
46
- restoreActiveThread={restoreActiveThread}
47
42
  browserTabId={TAB_ID}
48
43
  showHeader={false}
49
44
  showTabBar={false}
@@ -28,6 +28,7 @@ import {
28
28
  IconCopy,
29
29
  IconDotsVertical,
30
30
  IconBrandGithub,
31
+ IconBrandGoogle,
31
32
  IconPlugConnected,
32
33
  } from "@tabler/icons-react";
33
34
  import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
@@ -69,6 +70,7 @@ import { getIdToken } from "@/lib/auth";
69
70
  import {
70
71
  getOptionalCredentialKeys,
71
72
  getSharedConnectionStatus,
73
+ getGoogleDriveConnection,
72
74
  isSourceReady,
73
75
  isSourceLocallyConfigured,
74
76
  credentialRowsFromStatus,
@@ -479,6 +481,50 @@ function WorkspaceOAuthView({
479
481
  );
480
482
  }
481
483
 
484
+ function GoogleSheetsExportCard({
485
+ statusData,
486
+ }: {
487
+ statusData: DataSourceStatusResponse | undefined;
488
+ }) {
489
+ const t = useT();
490
+ const connection = getGoogleDriveConnection(statusData);
491
+ const connected = connection?.grantState === "connected";
492
+
493
+ return (
494
+ <Card className="data-source-card bg-card border-border/50">
495
+ <CardContent className="space-y-4 p-5">
496
+ <div className="flex items-start justify-between gap-4">
497
+ <div className="flex min-w-0 items-start gap-3">
498
+ <div className="flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-primary/10 text-primary">
499
+ <IconBrandGoogle className="h-5 w-5" />
500
+ </div>
501
+ <div className="min-w-0 space-y-1">
502
+ <p className="text-sm font-medium">
503
+ {t("dataSources.googleSheetsExport")}
504
+ </p>
505
+ <p className="text-xs text-muted-foreground">
506
+ {t("dataSources.googleSheetsExportDescription")}
507
+ </p>
508
+ </div>
509
+ </div>
510
+ <span
511
+ className={`shrink-0 text-xs font-medium ${connected ? "text-emerald-500" : "text-muted-foreground"}`}
512
+ >
513
+ {connected
514
+ ? t("dataSources.connected")
515
+ : t("dataSources.notConfigured")}
516
+ </span>
517
+ </div>
518
+ <WorkspaceOAuthView
519
+ provider="google_drive"
520
+ label={t("dataSources.googleSheets")}
521
+ connected={connected}
522
+ />
523
+ </CardContent>
524
+ </Card>
525
+ );
526
+ }
527
+
482
528
  function SharedConnectionBadge({ status }: { status: SharedConnectionStatus }) {
483
529
  const tone =
484
530
  status.kind === "ready"
@@ -1708,6 +1754,8 @@ export default function DataSources() {
1708
1754
  ))}
1709
1755
  </p>
1710
1756
 
1757
+ <GoogleSheetsExportCard statusData={statusData} />
1758
+
1711
1759
  {/* Search bar + Add Data Source */}
1712
1760
  <div className="data-sources-toolbar">
1713
1761
  <div className="relative min-w-0 flex-1">
@@ -1,3 +1,4 @@
1
+ import { useActionMutation } from "@agent-native/core/client/hooks";
1
2
  import { useT } from "@agent-native/core/client/i18n";
2
3
  import { useDraggable } from "@dnd-kit/core";
3
4
  import {
@@ -11,10 +12,12 @@ import {
11
12
  IconCode,
12
13
  IconDownload,
13
14
  IconMessageCircle,
15
+ IconBrandGoogle,
14
16
  } from "@tabler/icons-react";
15
17
  import { useIsFetching, useQueryClient } from "@tanstack/react-query";
16
18
  import { memo, useCallback, useEffect, useMemo, useRef, useState } from "react";
17
19
  import { useNavigate } from "react-router";
20
+ import { toast } from "sonner";
18
21
 
19
22
  import { ChartFillHeight, SqlChart } from "@/components/dashboard/SqlChart";
20
23
  import {
@@ -68,6 +71,8 @@ interface SqlChartCardProps {
68
71
  selectedForChat?: boolean;
69
72
  onSelectForChat?: (options?: SelectDashboardPanelOptions) => void;
70
73
  extensionContext?: Record<string, unknown> | null;
74
+ dashboardId?: string;
75
+ filters?: Record<string, string>;
71
76
  }
72
77
 
73
78
  const PanelDragHandle = memo(function PanelDragHandle({
@@ -124,9 +129,14 @@ export function SqlChartCard({
124
129
  selectedForChat = false,
125
130
  onSelectForChat,
126
131
  extensionContext,
132
+ dashboardId,
133
+ filters,
127
134
  }: SqlChartCardProps) {
128
135
  const t = useT();
129
136
  const queryClient = useQueryClient();
137
+ const exportToGoogleSheets = useActionMutation(
138
+ "export-dashboard-panel-to-google-sheet",
139
+ );
130
140
 
131
141
  const [confirmOpen, setConfirmOpen] = useState(false);
132
142
  const [expanded, setExpanded] = useState(false);
@@ -175,6 +185,40 @@ export function SqlChartCard({
175
185
  });
176
186
  }, [chartQueryKey, queryClient]);
177
187
 
188
+ const handleExportToGoogleSheets = useCallback(async () => {
189
+ if (!dashboardId || panel.chartType !== "table") return;
190
+
191
+ try {
192
+ const result = (await exportToGoogleSheets.mutateAsync({
193
+ dashboardId,
194
+ panelId: panel.id,
195
+ filters: filters ?? {},
196
+ })) as { spreadsheetUrl?: string };
197
+ if (result.spreadsheetUrl) {
198
+ toast.success(t("sqlDashboard.googleSheetsExported"), {
199
+ action: {
200
+ label: t("sqlDashboard.openGoogleSheet"),
201
+ onClick: () => {
202
+ window.open(
203
+ result.spreadsheetUrl,
204
+ "_blank",
205
+ "noopener,noreferrer",
206
+ );
207
+ },
208
+ },
209
+ });
210
+ } else {
211
+ toast.success(t("sqlDashboard.googleSheetsExported"));
212
+ }
213
+ } catch (error) {
214
+ toast.error(
215
+ t("sqlDashboard.googleSheetsExportFailed", {
216
+ message: error instanceof Error ? error.message : String(error),
217
+ }),
218
+ );
219
+ }
220
+ }, [dashboardId, exportToGoogleSheets, filters, panel, t]);
221
+
178
222
  const handleCardClick = useCallback(
179
223
  (event: React.MouseEvent<HTMLDivElement>) => {
180
224
  const target = event.target;
@@ -337,6 +381,8 @@ export function SqlChartCard({
337
381
  style={isDragSource ? { zIndex: 50 } : undefined}
338
382
  data-dragging={isDragSource ? "true" : undefined}
339
383
  data-chat-selected={selectedForChat ? "true" : undefined}
384
+ data-dashboard-report-panel-id={panel.id}
385
+ data-dashboard-report-panel-title={panel.title}
340
386
  className={cn(
341
387
  "dashboard-extension-card group relative h-full rounded-lg border border-transparent transition-colors",
342
388
  selectedForChat && "border-foreground/35 ring-1 ring-foreground/10",
@@ -492,6 +538,8 @@ export function SqlChartCard({
492
538
  style={isDragSource ? { zIndex: 50 } : undefined}
493
539
  data-dragging={isDragSource ? "true" : undefined}
494
540
  data-chat-selected={selectedForChat ? "true" : undefined}
541
+ data-dashboard-report-panel-id={panel.id}
542
+ data-dashboard-report-panel-title={panel.title}
495
543
  className="dashboard-chart-card group relative h-full hover:z-20 focus-within:z-20"
496
544
  >
497
545
  <Card
@@ -582,6 +630,17 @@ export function SqlChartCard({
582
630
  {t("sqlDashboard.downloadCsv")}
583
631
  </DropdownMenuItem>
584
632
  )}
633
+ {panel.chartType === "table" && dashboardId ? (
634
+ <DropdownMenuItem
635
+ disabled={exportToGoogleSheets.isPending}
636
+ onSelect={() => void handleExportToGoogleSheets()}
637
+ >
638
+ <IconBrandGoogle className="h-4 w-4 mr-2" />
639
+ {exportToGoogleSheets.isPending
640
+ ? t("sqlDashboard.exportingToGoogleSheets")
641
+ : t("sqlDashboard.exportToGoogleSheets")}
642
+ </DropdownMenuItem>
643
+ ) : null}
585
644
  {editable && panel.chartType === "table" ? (
586
645
  <DropdownMenuSeparator />
587
646
  ) : null}
@@ -351,6 +351,8 @@ const PanelCell = memo(function PanelCell({
351
351
  isDragSource={isDragSource}
352
352
  selectedForChat={selectedForChat}
353
353
  onSelectForChat={handleSelectForChat}
354
+ dashboardId={String(dashboardExtensionContext.dashboardId ?? "")}
355
+ filters={vars}
354
356
  extensionContext={
355
357
  panel.chartType === "extension"
356
358
  ? {
@@ -1,6 +1,8 @@
1
+ import { MAX_CONCURRENT_SQL_QUERIES } from "@shared/sql-query-limits";
2
+
1
3
  import type { SqlPanel } from "./types";
2
4
 
3
- export const REPORT_PANEL_CHUNK_SIZE = 8;
5
+ export const REPORT_PANEL_CHUNK_SIZE = MAX_CONCURRENT_SQL_QUERIES;
4
6
 
5
7
  export function listReportablePanelIds(panels: SqlPanel[]): string[] {
6
8
  return panels
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-22
4
+ ---
5
+
6
+ Ask stays current in background tabs and keeps its latest tool visibly active without covering the first message.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-22
4
+ ---
5
+
6
+ Daily dashboard emails now give each chart-query batch its full render window, preventing slow charts from forcing a text-only report.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: added
3
+ date: 2026-07-22
4
+ ---
5
+
6
+ Export table panels directly to Google Sheets
@@ -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 can now expand from five to fifteen items directly in the sidebar.