@agent-native/core 0.120.1 → 0.120.3

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 (396) hide show
  1. package/corpus/README.md +3 -3
  2. package/corpus/core/CHANGELOG.md +29 -0
  3. package/corpus/core/docs/content/extensions.mdx +23 -4
  4. package/corpus/core/package.json +1 -1
  5. package/corpus/core/src/agent/production-agent.ts +4 -0
  6. package/corpus/core/src/agent/run-manager.ts +36 -10
  7. package/corpus/core/src/agent/types.ts +2 -0
  8. package/corpus/core/src/cli/context-xray-local.ts +1 -1
  9. package/corpus/core/src/cli/index.ts +63 -18
  10. package/corpus/core/src/cli/skills.ts +5 -0
  11. package/corpus/core/src/cli/telemetry.ts +118 -1
  12. package/corpus/core/src/client/AgentPanel.tsx +10 -0
  13. package/corpus/core/src/client/CommandMenu.tsx +13 -1
  14. package/corpus/core/src/client/agent-page/AgentTabsPage.tsx +39 -4
  15. package/corpus/core/src/client/analytics.ts +13 -0
  16. package/corpus/core/src/client/error-capture.ts +6 -1
  17. package/corpus/core/src/client/extensions/ExtensionsListPage.tsx +28 -8
  18. package/corpus/core/src/client/extensions/agent-native-extension-runtime.ts +1 -1
  19. package/corpus/core/src/client/navigation/index.ts +2 -0
  20. package/corpus/core/src/client/org/OrgSwitcher.tsx +14 -32
  21. package/corpus/core/src/client/settings/ExtensionsSettingsContent.tsx +24 -0
  22. package/corpus/core/src/client/settings/SettingsPanel.tsx +10 -0
  23. package/corpus/core/src/deploy/build.ts +3 -0
  24. package/corpus/core/src/extensions/theme.ts +1 -1
  25. package/corpus/core/src/localization/default-messages.ts +2 -0
  26. package/corpus/core/src/server/analytics.ts +154 -25
  27. package/corpus/core/src/server/core-routes-plugin.ts +10 -1
  28. package/corpus/core/src/server/framework-request-handler.ts +17 -26
  29. package/corpus/core/src/styles/agent-native.css +13 -0
  30. package/corpus/core/src/templates/chat/app/components/layout/Layout.tsx +3 -0
  31. package/corpus/core/src/templates/chat/app/components/layout/Sidebar.tsx +113 -51
  32. package/corpus/core/src/templates/chat/app/global.css +1 -1
  33. package/corpus/core/src/templates/chat/app/routes/extensions._index.tsx +2 -2
  34. package/corpus/core/src/templates/chat/netlify.toml +1 -0
  35. package/corpus/core/src/templates/default/app/global.css +1 -1
  36. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +16 -0
  37. package/corpus/core/src/tracking/error-capture.ts +151 -0
  38. package/corpus/core/src/tracking/index.ts +5 -0
  39. package/corpus/core/src/vite/client.ts +6 -0
  40. package/corpus/templates/analytics/.agents/skills/adhoc-analysis/SKILL.md +27 -43
  41. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +19 -8
  42. package/corpus/templates/analytics/.agents/skills/data-querying/SKILL.md +2 -2
  43. package/corpus/templates/analytics/AGENTS.md +20 -8
  44. package/corpus/templates/analytics/actions/get-explorer-dashboard.ts +3 -0
  45. package/corpus/templates/analytics/actions/list-dashboard-usage-stats.ts +140 -46
  46. package/corpus/templates/analytics/actions/migrate-analytics-artifacts.ts +48 -0
  47. package/corpus/templates/analytics/actions/save-analysis.ts +2 -3
  48. package/corpus/templates/analytics/actions/view-screen.ts +1 -1
  49. package/corpus/templates/analytics/app/components/dashboard/CumulativeNetChart.tsx +1 -1
  50. package/corpus/templates/analytics/app/components/dashboard/DashboardHistoryPanel.tsx +1 -4
  51. package/corpus/templates/analytics/app/components/dashboard/DashboardMetadata.tsx +77 -0
  52. package/corpus/templates/analytics/app/components/dashboard/DashboardPanelSkeleton.tsx +7 -1
  53. package/corpus/templates/analytics/app/components/dashboard/DataTable.tsx +1 -1
  54. package/corpus/templates/analytics/app/components/dashboard/DateRangePicker.tsx +2 -2
  55. package/corpus/templates/analytics/app/components/dashboard/MetricCard.tsx +1 -1
  56. package/corpus/templates/analytics/app/components/dashboard/RecentActivity.tsx +1 -1
  57. package/corpus/templates/analytics/app/components/dashboard/RevenueChart.tsx +1 -1
  58. package/corpus/templates/analytics/app/components/dashboard/RevenueComparisonChart.tsx +1 -1
  59. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +41 -9
  60. package/corpus/templates/analytics/app/components/dashboard/StatsCard.tsx +1 -1
  61. package/corpus/templates/analytics/app/components/dashboard/TimeSeriesChart.tsx +1 -1
  62. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +2 -0
  63. package/corpus/templates/analytics/app/components/layout/Layout.tsx +28 -14
  64. package/corpus/templates/analytics/app/components/layout/NewDashboardDialog.tsx +1 -0
  65. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +255 -626
  66. package/corpus/templates/analytics/app/global.css +31 -1
  67. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +2 -2
  68. package/corpus/templates/analytics/app/i18n-data.ts +80 -0
  69. package/corpus/templates/analytics/app/lib/dashboard-report-capture.ts +42 -0
  70. package/corpus/templates/analytics/app/pages/Agents.tsx +49 -2
  71. package/corpus/templates/analytics/app/pages/adhoc/_shared/KpiChart.tsx +1 -1
  72. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/ChartTypePicker.tsx +1 -1
  73. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/DateRangePicker.tsx +1 -1
  74. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/EventRow.tsx +1 -1
  75. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/SqlPreview.tsx +2 -2
  76. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +54 -11
  77. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +3 -3
  78. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/EmailReportDialog.tsx +2 -2
  79. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +1 -1
  80. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +4 -54
  81. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +178 -69
  82. package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +2 -2
  83. package/corpus/templates/analytics/app/root.tsx +28 -0
  84. package/corpus/templates/analytics/app/routes/analyses._index.tsx +3 -2
  85. package/corpus/templates/analytics/app/routes/extensions._index.tsx +2 -2
  86. package/corpus/templates/analytics/changelog/2026-07-23-analytics-now-groups-saved-analyses-and-embedded-extensions-.md +6 -0
  87. package/corpus/templates/analytics/changelog/2026-07-23-dashboard-menus-show-who-created-and-last-updated-each-dashb.md +6 -0
  88. package/corpus/templates/analytics/changelog/2026-07-23-dashboard-usage-now-loads-reliably-for-organizations-with-ma.md +6 -0
  89. package/corpus/templates/analytics/changelog/2026-07-23-long-dashboard-building-requests-now-continue-without-stoppi.md +6 -0
  90. package/corpus/templates/analytics/changelog/2026-07-24-analytics-charts-now-explain-slow-loads-and-offer-a-direct-r.md +6 -0
  91. package/corpus/templates/analytics/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  92. package/corpus/templates/analytics/changelog/2026-07-24-daily-dashboard-emails-now-load-signed-reports-more-reliably.md +6 -0
  93. package/corpus/templates/analytics/changelog/2026-07-24-manage-agent-is-clearly-marked-as-a-link-to-its-dedicated-pa.md +6 -0
  94. package/corpus/templates/analytics/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  95. package/corpus/templates/analytics/netlify.toml +4 -0
  96. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +1 -1
  97. package/corpus/templates/analytics/server/db/schema.ts +9 -0
  98. package/corpus/templates/analytics/server/jobs/dashboard-report.ts +21 -0
  99. package/corpus/templates/analytics/server/lib/agent-chat-plan-mode.ts +0 -1
  100. package/corpus/templates/analytics/server/lib/agent-readable-resource-context.ts +1 -0
  101. package/corpus/templates/analytics/server/lib/canonical-first-party-dashboard-repair.ts +11 -0
  102. package/corpus/templates/analytics/server/lib/dashboard-report-subscriptions.ts +54 -0
  103. package/corpus/templates/analytics/server/lib/dashboard-report.ts +235 -26
  104. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +4 -1
  105. package/corpus/templates/analytics/server/lib/migrate-analytics-artifacts.ts +1062 -0
  106. package/corpus/templates/analytics/server/plugins/agent-chat.ts +6 -52
  107. package/corpus/templates/analytics/server/plugins/core-routes.ts +1 -1
  108. package/corpus/templates/analytics/server/plugins/db.ts +19 -0
  109. package/corpus/templates/analytics/shared/dashboard-report-timeouts.ts +1 -1
  110. package/corpus/templates/assets/actions/generate-image-batch.ts +36 -1
  111. package/corpus/templates/assets/actions/generate-image.ts +28 -1
  112. package/corpus/templates/assets/app/components/asset/AssetPreviewDialog.tsx +376 -0
  113. package/corpus/templates/assets/app/components/create/RecentDraftsSection.tsx +14 -4
  114. package/corpus/templates/assets/app/components/layout/Layout.tsx +5 -0
  115. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +164 -82
  116. package/corpus/templates/assets/app/global.css +1 -1
  117. package/corpus/templates/assets/app/i18n-data.ts +10 -0
  118. package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +99 -10
  119. package/corpus/templates/assets/app/routes/extensions._index.tsx +2 -2
  120. package/corpus/templates/assets/app/routes/library.tsx +21 -198
  121. package/corpus/templates/assets/changelog/2026-07-21-unified-asset-preview-click-any-asset-to-open-one-preview-wi.md +6 -0
  122. package/corpus/templates/assets/changelog/2026-07-23-assets-image-generation-now-recovers-after-a-completed-tool-.md +6 -0
  123. package/corpus/templates/assets/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  124. package/corpus/templates/assets/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  125. package/corpus/templates/assets/netlify.toml +1 -0
  126. package/corpus/templates/brain/app/components/layout/Layout.tsx +3 -0
  127. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +114 -51
  128. package/corpus/templates/brain/app/global.css +1 -1
  129. package/corpus/templates/brain/app/routes/extensions._index.tsx +2 -2
  130. package/corpus/templates/brain/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  131. package/corpus/templates/brain/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  132. package/corpus/templates/brain/netlify.toml +1 -0
  133. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +110 -57
  134. package/corpus/templates/calendar/app/global.css +1 -1
  135. package/corpus/templates/calendar/app/routes/_app.extensions._index.tsx +2 -16
  136. package/corpus/templates/calendar/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  137. package/corpus/templates/calendar/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  138. package/corpus/templates/calendar/netlify.toml +1 -0
  139. package/corpus/templates/chat/app/components/layout/Layout.tsx +3 -0
  140. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +113 -51
  141. package/corpus/templates/chat/app/global.css +1 -1
  142. package/corpus/templates/chat/app/routes/extensions._index.tsx +2 -2
  143. package/corpus/templates/chat/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  144. package/corpus/templates/chat/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  145. package/corpus/templates/chat/netlify.toml +1 -0
  146. package/corpus/templates/clips/app/components/library/library-layout.tsx +117 -37
  147. package/corpus/templates/clips/app/components/library/organization-switcher.tsx +2 -2
  148. package/corpus/templates/clips/app/components/player/video-player.tsx +16 -1
  149. package/corpus/templates/clips/app/global.css +1 -1
  150. package/corpus/templates/clips/app/hooks/use-view-tracking.ts +55 -12
  151. package/corpus/templates/clips/app/routes/_app.extensions._index.tsx +2 -16
  152. package/corpus/templates/clips/app/routes/embed.$shareId.tsx +6 -5
  153. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +7 -7
  154. package/corpus/templates/clips/app/routes/share.$shareId.tsx +6 -5
  155. package/corpus/templates/clips/changelog/2026-07-23-agent-settings-are-clearly-labeled-manage-agent-in-the-sideb.md +6 -0
  156. package/corpus/templates/clips/changelog/2026-07-23-meeting-recording-meters-and-dismissed-prompts.md +6 -0
  157. package/corpus/templates/clips/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  158. package/corpus/templates/clips/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  159. package/corpus/templates/clips/desktop/src/hooks/useMicMeter.ts +1 -1
  160. package/corpus/templates/clips/desktop/src/lib/meeting-notification-dismissal.ts +2 -0
  161. package/corpus/templates/clips/desktop/src/lib/voice-dictation.ts +1 -3
  162. package/corpus/templates/clips/desktop/src/overlays/live-audio-bars.tsx +86 -0
  163. package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +24 -0
  164. package/corpus/templates/clips/desktop/src/overlays/recording-pill.tsx +5 -69
  165. package/corpus/templates/clips/desktop/src/styles.css +35 -3
  166. package/corpus/templates/clips/desktop/src-tauri/src/adhoc_meetings_watcher.rs +13 -44
  167. package/corpus/templates/clips/desktop/src-tauri/src/notifications.rs +119 -17
  168. package/corpus/templates/clips/netlify.toml +1 -0
  169. package/corpus/templates/clips/server/plugins/db.ts +113 -68
  170. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +69 -49
  171. package/corpus/templates/content/app/global.css +1 -1
  172. package/corpus/templates/content/app/routes/_app.extensions._index.tsx +2 -2
  173. package/corpus/templates/content/changelog/2026-07-23-agent-settings-are-clearly-labeled-manage-agent-in-the-sideb.md +6 -0
  174. package/corpus/templates/content/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  175. package/corpus/templates/content/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  176. package/corpus/templates/content/netlify.toml +1 -0
  177. package/corpus/templates/design/app/components/layout/Sidebar.tsx +115 -42
  178. package/corpus/templates/design/app/entry.client.tsx +14 -1
  179. package/corpus/templates/design/app/global.css +1 -1
  180. package/corpus/templates/design/app/routes/extensions._index.tsx +2 -2
  181. package/corpus/templates/design/changelog/2026-07-23-agent-settings-are-clearly-labeled-manage-agent-in-the-sideb.md +6 -0
  182. package/corpus/templates/design/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  183. package/corpus/templates/design/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  184. package/corpus/templates/design/netlify.toml +1 -0
  185. package/corpus/templates/dispatch/app/dispatch-extensions.tsx +1 -1
  186. package/corpus/templates/dispatch/app/global.css +1 -1
  187. package/corpus/templates/dispatch/changelog/2026-07-23-agent-settings-are-clearly-labeled-manage-agent-in-the-sideb.md +6 -0
  188. package/corpus/templates/dispatch/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  189. package/corpus/templates/dispatch/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  190. package/corpus/templates/dispatch/netlify.toml +1 -0
  191. package/corpus/templates/forms/app/components/layout/Layout.tsx +3 -0
  192. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +113 -82
  193. package/corpus/templates/forms/app/global.css +1 -1
  194. package/corpus/templates/forms/app/routes/_app.extensions._index.tsx +2 -2
  195. package/corpus/templates/forms/changelog/2026-07-23-agent-settings-are-clearly-labeled-manage-agent-in-the-sideb.md +6 -0
  196. package/corpus/templates/forms/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  197. package/corpus/templates/forms/changelog/2026-07-24-forms-sidebar-actions-now-keep-search-language-feedback-and-.md +6 -0
  198. package/corpus/templates/forms/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  199. package/corpus/templates/forms/netlify.toml +1 -0
  200. package/corpus/templates/macros/app/components/DailyProgress.tsx +5 -5
  201. package/corpus/templates/macros/app/components/ExerciseCard.tsx +2 -2
  202. package/corpus/templates/macros/app/components/MealCard.tsx +2 -2
  203. package/corpus/templates/macros/app/components/WeightCard.tsx +2 -2
  204. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +92 -34
  205. package/corpus/templates/macros/app/components/ui/button.tsx +1 -2
  206. package/corpus/templates/macros/app/components/ui/card.tsx +1 -1
  207. package/corpus/templates/macros/app/global.css +1 -1
  208. package/corpus/templates/macros/app/routes/_index.tsx +1 -1
  209. package/corpus/templates/macros/app/routes/analytics.tsx +4 -7
  210. package/corpus/templates/macros/app/routes/extensions._index.tsx +2 -2
  211. package/corpus/templates/macros/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  212. package/corpus/templates/macros/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  213. package/corpus/templates/macros/netlify.toml +1 -0
  214. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +125 -46
  215. package/corpus/templates/mail/app/global.css +1 -1
  216. package/corpus/templates/mail/app/routes/extensions._index.tsx +2 -2
  217. package/corpus/templates/mail/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  218. package/corpus/templates/mail/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  219. package/corpus/templates/mail/netlify.toml +1 -0
  220. package/corpus/templates/plan/app/components/layout/Layout.tsx +3 -0
  221. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +128 -65
  222. package/corpus/templates/plan/app/global.css +1 -1
  223. package/corpus/templates/plan/app/routes/extensions._index.tsx +2 -2
  224. package/corpus/templates/plan/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  225. package/corpus/templates/plan/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  226. package/corpus/templates/plan/netlify.toml +1 -0
  227. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +116 -36
  228. package/corpus/templates/slides/app/global.css +1 -1
  229. package/corpus/templates/slides/app/routes/extensions._index.tsx +2 -2
  230. package/corpus/templates/slides/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  231. package/corpus/templates/slides/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  232. package/corpus/templates/slides/netlify.toml +1 -0
  233. package/corpus/templates/tasks/app/components/layout/Sidebar.tsx +37 -6
  234. package/corpus/templates/tasks/app/global.css +1 -1
  235. package/corpus/templates/tasks/app/routes/extensions._index.tsx +2 -2
  236. package/corpus/templates/tasks/app/routes/settings.tsx +31 -0
  237. package/corpus/templates/tasks/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  238. package/corpus/templates/tasks/netlify.toml +1 -0
  239. package/corpus/toolkit/CHANGELOG.md +8 -0
  240. package/corpus/toolkit/README.md +8 -1
  241. package/corpus/toolkit/agent-native.eject.json +1 -1
  242. package/corpus/toolkit/package.json +1 -1
  243. package/corpus/toolkit/src/app-shell/index.ts +1 -0
  244. package/corpus/toolkit/src/app-shell/sidebar-footer-actions.tsx +48 -0
  245. package/corpus/toolkit/src/chat-history.css +52 -1
  246. package/corpus/toolkit/src/design-system/default-adapter.tsx +1 -1
  247. package/corpus/toolkit/src/ui/button.tsx +1 -2
  248. package/corpus/toolkit/src/ui/card.tsx +1 -1
  249. package/corpus/toolkit/src/ui/table.tsx +4 -11
  250. package/dist/agent/production-agent.d.ts.map +1 -1
  251. package/dist/agent/production-agent.js +4 -0
  252. package/dist/agent/production-agent.js.map +1 -1
  253. package/dist/agent/run-manager.d.ts +9 -0
  254. package/dist/agent/run-manager.d.ts.map +1 -1
  255. package/dist/agent/run-manager.js +25 -10
  256. package/dist/agent/run-manager.js.map +1 -1
  257. package/dist/agent/types.d.ts +2 -2
  258. package/dist/agent/types.d.ts.map +1 -1
  259. package/dist/agent/types.js.map +1 -1
  260. package/dist/cli/context-xray-local.js +1 -1
  261. package/dist/cli/context-xray-local.js.map +1 -1
  262. package/dist/cli/index.js +56 -17
  263. package/dist/cli/index.js.map +1 -1
  264. package/dist/cli/skills.d.ts.map +1 -1
  265. package/dist/cli/skills.js +5 -0
  266. package/dist/cli/skills.js.map +1 -1
  267. package/dist/cli/telemetry.d.ts +7 -0
  268. package/dist/cli/telemetry.d.ts.map +1 -1
  269. package/dist/cli/telemetry.js +91 -1
  270. package/dist/cli/telemetry.js.map +1 -1
  271. package/dist/client/AgentPanel.d.ts +7 -1
  272. package/dist/client/AgentPanel.d.ts.map +1 -1
  273. package/dist/client/AgentPanel.js +2 -2
  274. package/dist/client/AgentPanel.js.map +1 -1
  275. package/dist/client/CommandMenu.d.ts +2 -0
  276. package/dist/client/CommandMenu.d.ts.map +1 -1
  277. package/dist/client/CommandMenu.js +12 -1
  278. package/dist/client/CommandMenu.js.map +1 -1
  279. package/dist/client/agent-page/AgentTabsPage.d.ts +4 -0
  280. package/dist/client/agent-page/AgentTabsPage.d.ts.map +1 -1
  281. package/dist/client/agent-page/AgentTabsPage.js +8 -4
  282. package/dist/client/agent-page/AgentTabsPage.js.map +1 -1
  283. package/dist/client/analytics.d.ts.map +1 -1
  284. package/dist/client/analytics.js +7 -0
  285. package/dist/client/analytics.js.map +1 -1
  286. package/dist/client/error-capture.d.ts.map +1 -1
  287. package/dist/client/error-capture.js +8 -1
  288. package/dist/client/error-capture.js.map +1 -1
  289. package/dist/client/extensions/ExtensionsListPage.d.ts +5 -1
  290. package/dist/client/extensions/ExtensionsListPage.d.ts.map +1 -1
  291. package/dist/client/extensions/ExtensionsListPage.js +6 -4
  292. package/dist/client/extensions/ExtensionsListPage.js.map +1 -1
  293. package/dist/client/extensions/agent-native-extension-runtime.js +1 -1
  294. package/dist/client/extensions/agent-native-extension-runtime.js.map +1 -1
  295. package/dist/client/navigation/index.d.ts +1 -1
  296. package/dist/client/navigation/index.d.ts.map +1 -1
  297. package/dist/client/navigation/index.js +1 -1
  298. package/dist/client/navigation/index.js.map +1 -1
  299. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  300. package/dist/client/org/OrgSwitcher.js +9 -13
  301. package/dist/client/org/OrgSwitcher.js.map +1 -1
  302. package/dist/client/settings/ExtensionsSettingsContent.d.ts +2 -0
  303. package/dist/client/settings/ExtensionsSettingsContent.d.ts.map +1 -0
  304. package/dist/client/settings/ExtensionsSettingsContent.js +10 -0
  305. package/dist/client/settings/ExtensionsSettingsContent.js.map +1 -0
  306. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  307. package/dist/client/settings/SettingsPanel.js +10 -1
  308. package/dist/client/settings/SettingsPanel.js.map +1 -1
  309. package/dist/deploy/build.js +1 -0
  310. package/dist/deploy/build.js.map +1 -1
  311. package/dist/extensions/theme.js +1 -1
  312. package/dist/extensions/theme.js.map +1 -1
  313. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  314. package/dist/localization/default-messages.d.ts +2 -0
  315. package/dist/localization/default-messages.d.ts.map +1 -1
  316. package/dist/localization/default-messages.js +2 -0
  317. package/dist/localization/default-messages.js.map +1 -1
  318. package/dist/observability/routes.d.ts +3 -3
  319. package/dist/progress/routes.d.ts +1 -1
  320. package/dist/provider-api/actions/custom-provider-registration.d.ts +7 -7
  321. package/dist/provider-api/actions/provider-api.d.ts +9 -9
  322. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  323. package/dist/resources/handlers.d.ts +1 -1
  324. package/dist/server/analytics.d.ts +9 -4
  325. package/dist/server/analytics.d.ts.map +1 -1
  326. package/dist/server/analytics.js +111 -22
  327. package/dist/server/analytics.js.map +1 -1
  328. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  329. package/dist/server/core-routes-plugin.js +8 -1
  330. package/dist/server/core-routes-plugin.js.map +1 -1
  331. package/dist/server/framework-request-handler.d.ts.map +1 -1
  332. package/dist/server/framework-request-handler.js +17 -27
  333. package/dist/server/framework-request-handler.js.map +1 -1
  334. package/dist/server/realtime-token.d.ts +1 -1
  335. package/dist/styles/agent-native.css +13 -0
  336. package/dist/templates/chat/app/components/layout/Layout.tsx +3 -0
  337. package/dist/templates/chat/app/components/layout/Sidebar.tsx +113 -51
  338. package/dist/templates/chat/app/global.css +1 -1
  339. package/dist/templates/chat/app/routes/extensions._index.tsx +2 -2
  340. package/dist/templates/chat/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  341. package/dist/templates/chat/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  342. package/dist/templates/chat/netlify.toml +1 -0
  343. package/dist/templates/default/app/global.css +1 -1
  344. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +16 -0
  345. package/dist/tracking/error-capture.d.ts +14 -0
  346. package/dist/tracking/error-capture.d.ts.map +1 -0
  347. package/dist/tracking/error-capture.js +113 -0
  348. package/dist/tracking/error-capture.js.map +1 -0
  349. package/dist/tracking/index.d.ts +1 -0
  350. package/dist/tracking/index.d.ts.map +1 -1
  351. package/dist/tracking/index.js +1 -0
  352. package/dist/tracking/index.js.map +1 -1
  353. package/dist/vite/client.d.ts.map +1 -1
  354. package/dist/vite/client.js +2 -0
  355. package/dist/vite/client.js.map +1 -1
  356. package/docs/content/extensions.mdx +23 -4
  357. package/package.json +2 -2
  358. package/src/agent/production-agent.ts +4 -0
  359. package/src/agent/run-manager.ts +36 -10
  360. package/src/agent/types.ts +2 -0
  361. package/src/cli/context-xray-local.ts +1 -1
  362. package/src/cli/index.ts +63 -18
  363. package/src/cli/skills.ts +5 -0
  364. package/src/cli/telemetry.ts +118 -1
  365. package/src/client/AgentPanel.tsx +10 -0
  366. package/src/client/CommandMenu.tsx +13 -1
  367. package/src/client/agent-page/AgentTabsPage.tsx +39 -4
  368. package/src/client/analytics.ts +13 -0
  369. package/src/client/error-capture.ts +6 -1
  370. package/src/client/extensions/ExtensionsListPage.tsx +28 -8
  371. package/src/client/extensions/agent-native-extension-runtime.ts +1 -1
  372. package/src/client/navigation/index.ts +2 -0
  373. package/src/client/org/OrgSwitcher.tsx +14 -32
  374. package/src/client/settings/ExtensionsSettingsContent.tsx +24 -0
  375. package/src/client/settings/SettingsPanel.tsx +10 -0
  376. package/src/deploy/build.ts +3 -0
  377. package/src/extensions/theme.ts +1 -1
  378. package/src/localization/default-messages.ts +2 -0
  379. package/src/server/analytics.ts +154 -25
  380. package/src/server/core-routes-plugin.ts +10 -1
  381. package/src/server/framework-request-handler.ts +17 -26
  382. package/src/styles/agent-native.css +13 -0
  383. package/src/templates/chat/app/components/layout/Layout.tsx +3 -0
  384. package/src/templates/chat/app/components/layout/Sidebar.tsx +113 -51
  385. package/src/templates/chat/app/global.css +1 -1
  386. package/src/templates/chat/app/routes/extensions._index.tsx +2 -2
  387. package/src/templates/chat/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  388. package/src/templates/chat/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  389. package/src/templates/chat/netlify.toml +1 -0
  390. package/src/templates/default/app/global.css +1 -1
  391. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +16 -0
  392. package/src/tracking/error-capture.ts +151 -0
  393. package/src/tracking/index.ts +5 -0
  394. package/src/vite/client.ts +6 -0
  395. package/corpus/templates/analytics/app/components/layout/NewAnalysisDialog.tsx +0 -165
  396. package/corpus/templates/analytics/app/pages/analyses/AnalysesList.tsx +0 -175
@@ -34,8 +34,6 @@ import {
34
34
  IconArrowUpRight,
35
35
  IconCheck,
36
36
  IconChevronDown,
37
- IconChevronLeft,
38
- IconChevronRight,
39
37
  IconClipboard,
40
38
  IconLibraryPhoto,
41
39
  IconPhotoPlus,
@@ -60,16 +58,10 @@ import {
60
58
  } from "react-router";
61
59
  import { toast } from "sonner";
62
60
 
61
+ import { AssetPreviewDialog as SharedAssetPreviewDialog } from "@/components/asset/AssetPreviewDialog";
63
62
  import { LibraryPresetGrid } from "@/components/library/LibraryPresetGrid";
64
63
  import { Badge } from "@/components/ui/badge";
65
64
  import { Button } from "@/components/ui/button";
66
- import {
67
- Dialog,
68
- DialogContent,
69
- DialogDescription,
70
- DialogTitle,
71
- DialogClose,
72
- } from "@/components/ui/dialog";
73
65
  import { Input } from "@/components/ui/input";
74
66
  import {
75
67
  Popover,
@@ -165,6 +157,12 @@ type Asset = {
165
157
  downloadUrl?: string;
166
158
  embedUrl?: string;
167
159
  embedPath?: string;
160
+ folderId?: string | null;
161
+ category?: string | null;
162
+ model?: string | null;
163
+ aspectRatio?: string | null;
164
+ durationSeconds?: number | null;
165
+ metadata?: Record<string, unknown> | null;
168
166
  libraryTitle?: string | null;
169
167
  lineage?: {
170
168
  label?: string | null;
@@ -829,7 +827,7 @@ function AssetOverlayImage({ asset }: { asset: Asset }) {
829
827
  src={source}
830
828
  crossOrigin={isCrossOriginPreview(source) ? "anonymous" : undefined}
831
829
  alt={asset.altText ?? asset.title ?? ""}
832
- className="max-h-[85vh] w-full rounded-lg object-contain"
830
+ className="max-h-[72vh] max-w-full rounded-lg object-contain"
833
831
  onError={() =>
834
832
  setSourceIndex((index) =>
835
833
  index + 1 < sources.length ? index + 1 : index,
@@ -1542,98 +1540,15 @@ function AssetPreviewDialog({
1542
1540
  assets: Asset[];
1543
1541
  onAssetChange: (asset: Asset | null) => void;
1544
1542
  }) {
1545
- const t = useT();
1546
1543
  return (
1547
- <Dialog
1548
- open={Boolean(asset)}
1549
- onOpenChange={(open) => {
1550
- if (!open) onAssetChange(null);
1551
- }}
1552
- >
1553
- {asset &&
1554
- (() => {
1555
- const previewIndex = assets.findIndex(
1556
- (candidate) => candidate.id === asset.id,
1557
- );
1558
- const hasPrev = previewIndex > 0;
1559
- const hasNext = previewIndex >= 0 && previewIndex < assets.length - 1;
1560
- const showPreviousAsset = () => {
1561
- if (hasPrev) onAssetChange(assets[previewIndex - 1]);
1562
- };
1563
- const showNextAsset = () => {
1564
- if (hasNext) onAssetChange(assets[previewIndex + 1]);
1565
- };
1566
- return (
1567
- <DialogContent
1568
- hideClose
1569
- onKeyDown={(event) => {
1570
- if (event.key === "ArrowLeft") showPreviousAsset();
1571
- if (event.key === "ArrowRight") showNextAsset();
1572
- }}
1573
- className="max-w-4xl border-0 bg-transparent p-0 shadow-none"
1574
- >
1575
- <DialogTitle className="sr-only">
1576
- {assetDisplayTitle(asset)}
1577
- </DialogTitle>
1578
- <DialogDescription className="sr-only">
1579
- {t("library.fullSizePreview", {
1580
- title: assetDisplayTitle(asset),
1581
- })}
1582
- </DialogDescription>
1583
- <div className="relative">
1584
- <div className="absolute right-2 top-2 z-10 flex items-center gap-2">
1585
- <Button asChild variant="outline" size="sm">
1586
- <Link to={`/asset/${encodeURIComponent(asset.id)}`}>
1587
- {t("library.viewDetails")}
1588
- </Link>
1589
- </Button>
1590
- <DialogClose
1591
- aria-label={t("library.closePreview")}
1592
- className="inline-flex h-9 w-9 items-center justify-center rounded-full bg-black/60 text-white transition hover:bg-black/80 focus:outline-none focus-visible:ring-2 focus-visible:ring-white"
1593
- >
1594
- <IconX className="h-5 w-5" />
1595
- </DialogClose>
1596
- </div>
1597
- {asset.mediaType === "video" ||
1598
- asset.mimeType?.startsWith("video/") ? (
1599
- <video
1600
- src={asset.previewUrl ?? asset.downloadUrl ?? asset.url}
1601
- poster={asset.thumbnailUrl}
1602
- controls
1603
- autoPlay
1604
- playsInline
1605
- className="max-h-[85vh] w-full rounded-lg bg-black object-contain"
1606
- />
1607
- ) : (
1608
- <AssetOverlayImage asset={asset} />
1609
- )}
1610
- </div>
1611
- {(hasPrev || hasNext) && (
1612
- <div className="mt-5 flex justify-center gap-2">
1613
- <button
1614
- type="button"
1615
- aria-label={t("library.previousImage")}
1616
- onClick={showPreviousAsset}
1617
- disabled={!hasPrev}
1618
- className="inline-flex h-9 w-9 items-center justify-center rounded-full bg-black/60 text-white transition hover:bg-black/80 focus:outline-none focus-visible:ring-2 focus-visible:ring-white disabled:cursor-not-allowed disabled:opacity-40"
1619
- >
1620
- <IconChevronLeft className="h-5 w-5" />
1621
- </button>
1622
- <button
1623
- type="button"
1624
- aria-label={t("library.nextImage")}
1625
- onClick={showNextAsset}
1626
- disabled={!hasNext}
1627
- className="inline-flex h-9 w-9 items-center justify-center rounded-full bg-black/60 text-white transition hover:bg-black/80 focus:outline-none focus-visible:ring-2 focus-visible:ring-white disabled:cursor-not-allowed disabled:opacity-40"
1628
- >
1629
- <IconChevronRight className="h-5 w-5" />
1630
- </button>
1631
- </div>
1632
- )}
1633
- </DialogContent>
1634
- );
1635
- })()}
1636
- </Dialog>
1544
+ <SharedAssetPreviewDialog
1545
+ asset={asset}
1546
+ assets={assets}
1547
+ onAssetChange={(next) => onAssetChange(next as Asset | null)}
1548
+ renderImage={(previewAsset) => (
1549
+ <AssetOverlayImage asset={previewAsset as Asset} />
1550
+ )}
1551
+ />
1637
1552
  );
1638
1553
  }
1639
1554
 
@@ -3487,103 +3402,11 @@ export function AssetPickerSurface() {
3487
3402
  )}
3488
3403
  </main>
3489
3404
 
3490
- <Dialog
3491
- open={Boolean(previewAsset)}
3492
- onOpenChange={(open) => {
3493
- if (!open) setPreviewAsset(null);
3494
- }}
3495
- >
3496
- {previewAsset &&
3497
- (() => {
3498
- const previewIndex = assets.findIndex(
3499
- (asset) => asset.id === previewAsset.id,
3500
- );
3501
- const hasPrev = previewIndex > 0;
3502
- const hasNext =
3503
- previewIndex >= 0 && previewIndex < assets.length - 1;
3504
- const showPreviousAsset = () => {
3505
- if (hasPrev) setPreviewAsset(assets[previewIndex - 1]);
3506
- };
3507
- const showNextAsset = () => {
3508
- if (hasNext) setPreviewAsset(assets[previewIndex + 1]);
3509
- };
3510
- return (
3511
- <DialogContent
3512
- hideClose
3513
- onKeyDown={(event) => {
3514
- if (event.key === "ArrowLeft") showPreviousAsset();
3515
- if (event.key === "ArrowRight") showNextAsset();
3516
- }}
3517
- className="max-w-4xl border-0 bg-transparent p-0 shadow-none"
3518
- >
3519
- <DialogTitle className="sr-only">
3520
- {assetDisplayTitle(previewAsset)}
3521
- </DialogTitle>
3522
- <DialogDescription className="sr-only">
3523
- {t("library.fullSizePreview", {
3524
- title: assetDisplayTitle(previewAsset),
3525
- })}
3526
- </DialogDescription>
3527
- <div className="relative">
3528
- <div className="absolute right-2 top-2 z-10 flex items-center gap-2">
3529
- <Button asChild variant="outline" size="sm">
3530
- <Link
3531
- to={`/asset/${encodeURIComponent(previewAsset.id)}`}
3532
- >
3533
- {t("library.viewDetails")}
3534
- </Link>
3535
- </Button>
3536
- <DialogClose
3537
- aria-label={t("library.closePreview")}
3538
- className="inline-flex h-9 w-9 items-center justify-center rounded-full bg-black/60 text-white transition hover:bg-black/80 focus:outline-none focus-visible:ring-2 focus-visible:ring-white"
3539
- >
3540
- <IconX className="h-5 w-5" />
3541
- </DialogClose>
3542
- </div>
3543
- {previewAsset.mediaType === "video" ||
3544
- previewAsset.mimeType?.startsWith("video/") ? (
3545
- <video
3546
- src={
3547
- previewAsset.previewUrl ??
3548
- previewAsset.downloadUrl ??
3549
- previewAsset.url
3550
- }
3551
- poster={previewAsset.thumbnailUrl}
3552
- controls
3553
- autoPlay
3554
- playsInline
3555
- className="max-h-[85vh] w-full rounded-lg bg-black object-contain"
3556
- />
3557
- ) : (
3558
- <AssetOverlayImage asset={previewAsset} />
3559
- )}
3560
- </div>
3561
- {(hasPrev || hasNext) && (
3562
- <div className="mt-5 flex justify-center gap-2">
3563
- <button
3564
- type="button"
3565
- aria-label={t("library.previousImage")}
3566
- onClick={showPreviousAsset}
3567
- disabled={!hasPrev}
3568
- className="inline-flex h-9 w-9 items-center justify-center rounded-full bg-black/60 text-white transition hover:bg-black/80 focus:outline-none focus-visible:ring-2 focus-visible:ring-white disabled:cursor-not-allowed disabled:opacity-40"
3569
- >
3570
- <IconChevronLeft className="h-5 w-5" />
3571
- </button>
3572
- <button
3573
- type="button"
3574
- aria-label={t("library.nextImage")}
3575
- onClick={showNextAsset}
3576
- disabled={!hasNext}
3577
- className="inline-flex h-9 w-9 items-center justify-center rounded-full bg-black/60 text-white transition hover:bg-black/80 focus:outline-none focus-visible:ring-2 focus-visible:ring-white disabled:cursor-not-allowed disabled:opacity-40"
3578
- >
3579
- <IconChevronRight className="h-5 w-5" />
3580
- </button>
3581
- </div>
3582
- )}
3583
- </DialogContent>
3584
- );
3585
- })()}
3586
- </Dialog>
3405
+ <AssetPreviewDialog
3406
+ asset={previewAsset}
3407
+ assets={assets}
3408
+ onAssetChange={setPreviewAsset}
3409
+ />
3587
3410
  </div>
3588
3411
  );
3589
3412
  }
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-21
4
+ ---
5
+
6
+ Unified asset preview: clicking an asset anywhere (create drafts, library, brand kits, generated candidates) now opens one side-panel preview with the image, a details panel, and next/previous navigation instead of a separate page
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-23
4
+ ---
5
+
6
+ Assets image generation now recovers after a completed tool run.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-24
4
+ ---
5
+
6
+ Secondary controls and dashboard surfaces now use quieter borderless styling.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-24
4
+ ---
5
+
6
+ Sidebar utility controls now follow a consistent footer order.
@@ -6,6 +6,7 @@ functions = "templates/assets/.netlify/functions-internal"
6
6
 
7
7
  [build.environment]
8
8
  GA_MEASUREMENT_ID = "G-ESF7FYXGN9"
9
+ GTM_CONTAINER_ID = "GTM-N3WSTXZ"
9
10
  NITRO_PRESET = "netlify"
10
11
  NPM_CONFIG_PRODUCTION = "false"
11
12
  AGENT_CHAT_DURABLE_BACKGROUND = "true"
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  AgentSidebar,
3
3
  focusAgentChat,
4
+ isAgentChatHomeHandoffActive,
4
5
  navigateWithAgentChatViewTransition,
5
6
  useAgentChatHomeHandoff,
6
7
  useAgentChatHomeHandoffLinks,
@@ -44,6 +45,7 @@ export function Layout({ children }: { children: React.ReactNode }) {
44
45
  activePath: location.pathname,
45
46
  enabled: !isAskRoute,
46
47
  });
48
+ const chatHomeHandoffPending = isAgentChatHomeHandoffActive("brain");
47
49
  useAgentChatHomeHandoffLinks({
48
50
  storageKey: "brain",
49
51
  chatPath: "/",
@@ -129,6 +131,7 @@ export function Layout({ children }: { children: React.ReactNode }) {
129
131
  <AgentSidebar
130
132
  position="right"
131
133
  chatViewTransition
134
+ chatViewTransitionHandoff={chatHomeHandoffPending}
132
135
  storageKey="brain"
133
136
  browserTabId={TAB_ID}
134
137
  openOnChatRunning={chatHomeHandoffActive}
@@ -5,10 +5,11 @@ import {
5
5
  } from "@agent-native/core/client/agent-chat";
6
6
  import { appPath } from "@agent-native/core/client/api-path";
7
7
  import { DevDatabaseLink } from "@agent-native/core/client/db-admin";
8
- import { ExtensionsSidebarSection } from "@agent-native/core/client/extensions";
9
- import { useT } from "@agent-native/core/client/i18n";
8
+ import { LanguagePicker, useT } from "@agent-native/core/client/i18n";
9
+ import { openCommandMenu } from "@agent-native/core/client/navigation";
10
10
  import { OrgSwitcher } from "@agent-native/core/client/org";
11
11
  import { FeedbackButton } from "@agent-native/core/client/ui";
12
+ import { SidebarFooterActions } from "@agent-native/toolkit/app-shell";
12
13
  import {
13
14
  ChatHistoryRail,
14
15
  type ChatHistoryItem,
@@ -16,6 +17,7 @@ import {
16
17
  import {
17
18
  IconLayoutSidebarLeftCollapse,
18
19
  IconLayoutSidebarLeftExpand,
20
+ IconSearch,
19
21
  } from "@tabler/icons-react";
20
22
  import { useEffect, useMemo } from "react";
21
23
  import { Link, NavLink, useLocation, useNavigate } from "react-router";
@@ -29,6 +31,13 @@ import {
29
31
  import { navItems } from "@/lib/brain";
30
32
  import { cn } from "@/lib/utils";
31
33
 
34
+ const primaryNavItems = navItems.filter(
35
+ (item) => item.view !== "agent" && item.view !== "settings",
36
+ );
37
+ const bottomNavItems = navItems.filter(
38
+ (item) => item.view === "agent" || item.view === "settings",
39
+ );
40
+
32
41
  const BRAIN_CHAT_STORAGE_KEY = "brain";
33
42
  const BRAIN_ACTIVE_THREAD_KEY = `agent-chat-active-thread:${BRAIN_CHAT_STORAGE_KEY}`;
34
43
 
@@ -80,7 +89,7 @@ function persistedActiveThreadId() {
80
89
  }
81
90
  }
82
91
 
83
- function BrainChatsSection() {
92
+ function BrainChatsSection({ open }: { open: boolean }) {
84
93
  const navigate = useNavigate();
85
94
  const t = useT();
86
95
  const {
@@ -175,38 +184,44 @@ function BrainChatsSection() {
175
184
  }
176
185
 
177
186
  return (
178
- <div className="mt-2 ms-4">
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
- />
187
+ <div
188
+ className="an-chat-history-rail__collapse"
189
+ data-state={open ? "open" : "closed"}
190
+ aria-hidden={!open}
191
+ >
192
+ <div className="ms-4">
193
+ <ChatHistoryRail
194
+ items={chatItems}
195
+ activeId={activeThreadId}
196
+ onSelect={openThread}
197
+ onNewChat={() => void handleNewChat()}
198
+ railLabels={{
199
+ newChat: t("chat.newChat"),
200
+ showMore: t("chat.chats"),
201
+ showLess: t("chat.chats"),
202
+ }}
203
+ previewCount={5}
204
+ expandedCount={15}
205
+ onTogglePin={(threadId) => {
206
+ const thread = visibleThreads.find((item) => item.id === threadId);
207
+ if (thread) void pinThread(threadId, !thread.pinnedAt);
208
+ }}
209
+ onRename={handleRenameThread}
210
+ renameMaxLength={160}
211
+ onDelete={(threadId) => void handleArchiveThread(threadId)}
212
+ labels={{
213
+ options: (item) =>
214
+ t("chat.optionsFor", { title: item.titleText ?? "" }),
215
+ renameInput: (item) =>
216
+ t("chat.renameThread", { title: item.titleText ?? "" }),
217
+ rename: t("chat.renameChat"),
218
+ pin: t("chat.pinChat"),
219
+ unpin: t("chat.unpinChat"),
220
+ delete: t("chat.archiveChat"),
221
+ }}
222
+ className="min-w-0"
223
+ />
224
+ </div>
210
225
  </div>
211
226
  );
212
227
  }
@@ -256,6 +271,31 @@ export function Sidebar({
256
271
  </TooltipContent>
257
272
  </Tooltip>
258
273
  ) : null;
274
+ const searchButton = (
275
+ <Tooltip>
276
+ <TooltipTrigger asChild>
277
+ <button
278
+ type="button"
279
+ onClick={openCommandMenu}
280
+ aria-label={t("navigation.search")}
281
+ className="flex size-8 items-center justify-center rounded-md text-sidebar-foreground/65 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
282
+ >
283
+ <IconSearch className="size-4" />
284
+ </button>
285
+ </TooltipTrigger>
286
+ <TooltipContent side="right">{t("navigation.search")}</TooltipContent>
287
+ </Tooltip>
288
+ );
289
+ const translateButton = (
290
+ <LanguagePicker variant="ghost-icon" label={t("settings.languageLabel")} />
291
+ );
292
+ const feedbackButton = (
293
+ <FeedbackButton
294
+ variant={collapsed ? "icon" : "sidebar"}
295
+ side="right"
296
+ className={collapsed ? "h-8 w-8" : "min-w-0"}
297
+ />
298
+ );
259
299
 
260
300
  return (
261
301
  <aside
@@ -311,7 +351,7 @@ export function Sidebar({
311
351
  collapsed ? "justify-items-center gap-1" : "gap-1",
312
352
  )}
313
353
  >
314
- {navItems.map((item) => {
354
+ {primaryNavItems.map((item) => {
315
355
  const Icon = item.icon;
316
356
  const label =
317
357
  item.view === "agent"
@@ -354,7 +394,7 @@ export function Sidebar({
354
394
  link
355
395
  )}
356
396
  {!collapsed && item.view === "ask" && isAskRoute ? (
357
- <BrainChatsSection />
397
+ <BrainChatsSection open />
358
398
  ) : null}
359
399
  </div>
360
400
  );
@@ -362,13 +402,37 @@ export function Sidebar({
362
402
  </div>
363
403
  </nav>
364
404
 
365
- <div className="mt-auto shrink-0">
366
- {!collapsed ? (
367
- <div className="px-2 py-1">
368
- <ExtensionsSidebarSection />
369
- </div>
370
- ) : null}
405
+ <nav className="grid shrink-0 gap-1 px-2 py-1">
406
+ {bottomNavItems.map((item) => {
407
+ const Icon = item.icon;
408
+ const label =
409
+ item.view === "agent"
410
+ ? t("settings.agentTitle")
411
+ : t(`navigation.${item.view}`);
412
+ const link = (
413
+ <NavLink
414
+ to={item.href}
415
+ className={navClass}
416
+ aria-label={collapsed ? label : undefined}
417
+ >
418
+ <Icon className="size-4 shrink-0" />
419
+ <span className={collapsed ? "sr-only" : "truncate"}>
420
+ {label}
421
+ </span>
422
+ </NavLink>
423
+ );
424
+ return collapsed ? (
425
+ <Tooltip key={item.href}>
426
+ <TooltipTrigger asChild>{link}</TooltipTrigger>
427
+ <TooltipContent side="right">{label}</TooltipContent>
428
+ </Tooltip>
429
+ ) : (
430
+ <div key={item.href}>{link}</div>
431
+ );
432
+ })}
433
+ </nav>
371
434
 
435
+ <div className="mt-auto shrink-0">
372
436
  {!collapsed ? (
373
437
  <div className="px-3 py-2">
374
438
  <OrgSwitcher reserveSpace />
@@ -378,16 +442,15 @@ export function Sidebar({
378
442
  {!collapsed ? (
379
443
  <div className="px-3 py-2">
380
444
  <DevDatabaseLink />
381
- <div className="flex items-center justify-end gap-1">
382
- <FeedbackButton className="min-w-0 flex-1" side="right" />
383
- {collapseButton}
384
- </div>
385
445
  </div>
386
446
  ) : null}
387
-
388
- {collapsed && collapseButton ? (
389
- <div className="flex justify-center px-2 py-2">{collapseButton}</div>
390
- ) : null}
447
+ <SidebarFooterActions
448
+ collapsed={collapsed}
449
+ feedback={feedbackButton}
450
+ translate={translateButton}
451
+ search={searchButton}
452
+ collapse={collapseButton}
453
+ />
391
454
  </div>
392
455
  </aside>
393
456
  );
@@ -22,7 +22,7 @@
22
22
  --muted-foreground: 0 0% 45%;
23
23
  --accent: 0 0% 95%;
24
24
  --accent-foreground: 0 0% 15%;
25
- --destructive: 0 84% 60%;
25
+ --destructive: 0 91% 71%;
26
26
  --destructive-foreground: 0 0% 98%;
27
27
  --border: 0 0% 90%;
28
28
  --input: 0 0% 90%;
@@ -1,4 +1,4 @@
1
- import { ExtensionsListPage } from "@agent-native/core/client/extensions";
1
+ import { Navigate } from "react-router";
2
2
 
3
3
  import { messagesByLocale } from "@/i18n-data";
4
4
 
@@ -7,5 +7,5 @@ export function meta() {
7
7
  }
8
8
 
9
9
  export default function ExtensionsRoute() {
10
- return <ExtensionsListPage />;
10
+ return <Navigate to="/settings#extensions" replace />;
11
11
  }
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-24
4
+ ---
5
+
6
+ Secondary controls and dashboard surfaces now use quieter borderless styling.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-24
4
+ ---
5
+
6
+ Sidebar utility controls now follow a consistent footer order.
@@ -6,6 +6,7 @@ functions = "templates/brain/.netlify/functions-internal"
6
6
 
7
7
  [build.environment]
8
8
  GA_MEASUREMENT_ID = "G-ESF7FYXGN9"
9
+ GTM_CONTAINER_ID = "GTM-N3WSTXZ"
9
10
  NITRO_PRESET = "netlify"
10
11
  NPM_CONFIG_PRODUCTION = "false"
11
12