@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
@@ -9,11 +9,12 @@ import { useCodeMode } from "@agent-native/core/client/agent-chat";
9
9
  import { agentNativePath, appPath } from "@agent-native/core/client/api-path";
10
10
  import { PromptComposer } from "@agent-native/core/client/composer";
11
11
  import { DevDatabaseLink } from "@agent-native/core/client/db-admin";
12
- import { ExtensionsSidebarSection } from "@agent-native/core/client/extensions";
13
12
  import { useSession } from "@agent-native/core/client/hooks";
14
- import { useT } from "@agent-native/core/client/i18n";
13
+ import { LanguagePicker, useT } from "@agent-native/core/client/i18n";
14
+ import { openCommandMenu } from "@agent-native/core/client/navigation";
15
15
  import { OrgSwitcher } from "@agent-native/core/client/org";
16
16
  import { FeedbackButton } from "@agent-native/core/client/ui";
17
+ import { SidebarFooterActions } from "@agent-native/toolkit/app-shell";
17
18
  import {
18
19
  ChatHistoryRail,
19
20
  type ChatHistoryItem,
@@ -28,6 +29,7 @@ import {
28
29
  IconPlus,
29
30
  IconRefresh,
30
31
  IconSettings,
32
+ IconSearch,
31
33
  } from "@tabler/icons-react";
32
34
  import { useEffect, useMemo, useState, type MouseEvent } from "react";
33
35
  import { Link, useLocation, useNavigate } from "react-router";
@@ -73,6 +75,9 @@ function buildBrandingCustomizationMessage(request: string) {
73
75
  const navItems = [
74
76
  { icon: IconMessageCircle, labelKey: "navigation.ask", href: "/" },
75
77
  { icon: IconClipboardCheck, labelKey: "navigation.plan", href: "/plans" },
78
+ ];
79
+
80
+ const bottomNavItems = [
76
81
  { icon: IconHierarchy2, labelKey: "settings.agentTitle", href: "/agent" },
77
82
  { icon: IconSettings, labelKey: "navigation.settings", href: "/settings" },
78
83
  ];
@@ -144,7 +149,13 @@ function persistedActiveThreadId() {
144
149
  }
145
150
  }
146
151
 
147
- function PlanChatsSection({ collapsed }: { collapsed: boolean }) {
152
+ function PlanChatsSection({
153
+ collapsed,
154
+ open,
155
+ }: {
156
+ collapsed: boolean;
157
+ open: boolean;
158
+ }) {
148
159
  const navigate = useNavigate();
149
160
  const t = useT();
150
161
  const {
@@ -242,35 +253,41 @@ function PlanChatsSection({ collapsed }: { collapsed: boolean }) {
242
253
  }
243
254
 
244
255
  return (
245
- <div className="mt-2 ms-4">
246
- <ChatHistoryRail
247
- items={chatItems}
248
- activeId={activeThreadId}
249
- onSelect={(threadId) => openThread(threadId)}
250
- onNewChat={() => void handleNewChat()}
251
- railLabels={{
252
- newChat: t("sidebar.newChat"),
253
- showMore: t("sidebar.chats"),
254
- showLess: t("sidebar.chats"),
255
- }}
256
- renameMaxLength={160}
257
- onTogglePin={(threadId) => {
258
- const thread = visibleThreads.find((item) => item.id === threadId);
259
- if (thread) void pinThread(threadId, !thread.pinnedAt);
260
- }}
261
- onRename={handleRenameThread}
262
- onDelete={(threadId) => void handleArchiveThread(threadId)}
263
- labels={{
264
- options: (item) => `${t("sidebar.chats")}: ${item.titleText ?? ""}`,
265
- renameInput: (item) =>
266
- `${t("sidebar.renameChat")}: ${item.titleText ?? ""}`,
267
- rename: t("sidebar.renameChat"),
268
- pin: t("sidebar.pinChat"),
269
- unpin: t("sidebar.unpinChat"),
270
- delete: t("sidebar.archiveChat"),
271
- }}
272
- className="min-w-0"
273
- />
256
+ <div
257
+ className="an-chat-history-rail__collapse"
258
+ data-state={open ? "open" : "closed"}
259
+ aria-hidden={!open}
260
+ >
261
+ <div className="ms-4">
262
+ <ChatHistoryRail
263
+ items={chatItems}
264
+ activeId={activeThreadId}
265
+ onSelect={(threadId) => openThread(threadId)}
266
+ onNewChat={() => void handleNewChat()}
267
+ railLabels={{
268
+ newChat: t("sidebar.newChat"),
269
+ showMore: t("sidebar.chats"),
270
+ showLess: t("sidebar.chats"),
271
+ }}
272
+ renameMaxLength={160}
273
+ onTogglePin={(threadId) => {
274
+ const thread = visibleThreads.find((item) => item.id === threadId);
275
+ if (thread) void pinThread(threadId, !thread.pinnedAt);
276
+ }}
277
+ onRename={handleRenameThread}
278
+ onDelete={(threadId) => void handleArchiveThread(threadId)}
279
+ labels={{
280
+ options: (item) => `${t("sidebar.chats")}: ${item.titleText ?? ""}`,
281
+ renameInput: (item) =>
282
+ `${t("sidebar.renameChat")}: ${item.titleText ?? ""}`,
283
+ rename: t("sidebar.renameChat"),
284
+ pin: t("sidebar.pinChat"),
285
+ unpin: t("sidebar.unpinChat"),
286
+ delete: t("sidebar.archiveChat"),
287
+ }}
288
+ className="min-w-0"
289
+ />
290
+ </div>
274
291
  </div>
275
292
  );
276
293
  }
@@ -552,6 +569,35 @@ export function Sidebar({
552
569
  </TooltipContent>
553
570
  </Tooltip>
554
571
  ) : null;
572
+ const searchButton = (
573
+ <Tooltip>
574
+ <TooltipTrigger asChild>
575
+ <Button
576
+ type="button"
577
+ size="icon"
578
+ variant="ghost"
579
+ className="size-8 shrink-0 text-muted-foreground"
580
+ onClick={openCommandMenu}
581
+ aria-label={t("plansPage.overview.searchPlaceholder")}
582
+ >
583
+ <IconSearch className="size-4" />
584
+ </Button>
585
+ </TooltipTrigger>
586
+ <TooltipContent side="right">
587
+ {t("plansPage.overview.searchPlaceholder")}
588
+ </TooltipContent>
589
+ </Tooltip>
590
+ );
591
+ const translateButton = (
592
+ <LanguagePicker variant="ghost-icon" label={t("settings.languageLabel")} />
593
+ );
594
+ const feedbackButton = (
595
+ <FeedbackButton
596
+ variant={collapsed ? "icon" : "sidebar"}
597
+ side="right"
598
+ className={collapsed ? "size-8" : "min-w-0"}
599
+ />
600
+ );
555
601
 
556
602
  return (
557
603
  <aside
@@ -628,7 +674,7 @@ export function Sidebar({
628
674
  <div key={item.href}>
629
675
  {link}
630
676
  {item.href === "/" && isActive ? (
631
- <PlanChatsSection collapsed={collapsed} />
677
+ <PlanChatsSection collapsed={collapsed} open />
632
678
  ) : null}
633
679
  {item.href === "/plans" && isActive ? (
634
680
  <PlansSidebarSection collapsed={collapsed} />
@@ -638,30 +684,51 @@ export function Sidebar({
638
684
  })}
639
685
  </nav>
640
686
 
641
- {!collapsed && session ? (
642
- <>
643
- <div className="px-2 py-2">
644
- <ExtensionsSidebarSection />
645
- </div>
687
+ <nav className="grid shrink-0 gap-1 px-2 py-1">
688
+ {bottomNavItems.map((item) => {
689
+ const Icon = item.icon;
690
+ const isActive = location.pathname.startsWith(item.href);
691
+ const link = (
692
+ <Link
693
+ to={item.href}
694
+ className={cn(
695
+ "flex items-center gap-3 rounded-lg px-3 py-2 text-sm transition-colors",
696
+ isActive
697
+ ? "bg-sidebar-accent text-sidebar-accent-foreground"
698
+ : "text-muted-foreground hover:bg-sidebar-accent/50 hover:text-foreground",
699
+ collapsed && "justify-center gap-0 px-0",
700
+ )}
701
+ aria-label={collapsed ? t(item.labelKey) : undefined}
702
+ >
703
+ <Icon className="h-4 w-4 shrink-0" />
704
+ {collapsed ? (
705
+ <span className="sr-only">{t(item.labelKey)}</span>
706
+ ) : (
707
+ t(item.labelKey)
708
+ )}
709
+ </Link>
710
+ );
711
+ return collapsed ? (
712
+ <Tooltip key={item.href}>
713
+ <TooltipTrigger asChild>{link}</TooltipTrigger>
714
+ <TooltipContent side="right">{t(item.labelKey)}</TooltipContent>
715
+ </Tooltip>
716
+ ) : (
717
+ <div key={item.href}>{link}</div>
718
+ );
719
+ })}
720
+ </nav>
646
721
 
647
- <div className="space-y-2 px-3 py-2">
648
- <DevDatabaseLink />
649
- <div className="flex items-center justify-end gap-1">
650
- <FeedbackButton className="min-w-0 flex-1" side="right" />
651
- {collapseButton}
652
- </div>
653
- <OrgSwitcher />
654
- </div>
655
- </>
722
+ {!collapsed && session ? (
723
+ <div className="space-y-2 px-3 py-2">
724
+ <DevDatabaseLink />
725
+ <OrgSwitcher />
726
+ </div>
656
727
  ) : null}
657
728
 
658
729
  {!collapsed && !sessionLoading && !session ? (
659
730
  <div className="space-y-2 px-3 py-2">
660
731
  <DevDatabaseLink />
661
- <div className="flex items-center justify-end gap-1">
662
- <FeedbackButton className="min-w-0 flex-1" side="right" />
663
- {collapseButton}
664
- </div>
665
732
  <Button
666
733
  type="button"
667
734
  size="sm"
@@ -674,23 +741,19 @@ export function Sidebar({
674
741
  </div>
675
742
  ) : null}
676
743
 
677
- {collapsed && collapsible ? (
678
- <div
679
- className={cn(
680
- "px-2 py-2",
681
- collapsed ? "flex justify-center" : "flex justify-end",
682
- )}
683
- >
684
- {collapseButton}
744
+ {!collapsed && sessionLoading ? (
745
+ <div className="px-3 py-2">
746
+ <DevDatabaseLink />
685
747
  </div>
686
748
  ) : null}
687
749
 
688
- {!collapsed && sessionLoading && collapsible ? (
689
- <div className="flex items-center justify-end gap-1 px-3 py-2">
690
- <FeedbackButton className="min-w-0 flex-1" side="right" />
691
- {collapseButton}
692
- </div>
693
- ) : null}
750
+ <SidebarFooterActions
751
+ collapsed={collapsed}
752
+ feedback={feedbackButton}
753
+ translate={translateButton}
754
+ search={searchButton}
755
+ collapse={collapseButton}
756
+ />
694
757
  </aside>
695
758
  );
696
759
  }
@@ -88,7 +88,7 @@
88
88
  --muted-foreground: 0 0% 60%;
89
89
  --accent: 0 0% 18%;
90
90
  --accent-foreground: 0 0% 90%;
91
- --destructive: 0 84% 60%;
91
+ --destructive: 0 91% 71%;
92
92
  --destructive-foreground: 0 0% 98%;
93
93
  --border: 0 0% 24%;
94
94
  --input: 0 0% 24%;
@@ -1,4 +1,4 @@
1
- import { ExtensionsListPage } from "@agent-native/core/client/extensions";
1
+ import { Navigate } from "react-router";
2
2
 
3
3
  import { APP_TITLE } from "@/lib/app-config";
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/plan/.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,9 +1,10 @@
1
1
  import { appPath } from "@agent-native/core/client/api-path";
2
2
  import { DevDatabaseLink } from "@agent-native/core/client/db-admin";
3
- import { ExtensionsSidebarSection } from "@agent-native/core/client/extensions";
4
- import { useT } from "@agent-native/core/client/i18n";
3
+ import { LanguagePicker, useT } from "@agent-native/core/client/i18n";
4
+ import { openCommandMenu } from "@agent-native/core/client/navigation";
5
5
  import { OrgSwitcher } from "@agent-native/core/client/org";
6
6
  import { FeedbackButton } from "@agent-native/core/client/ui";
7
+ import { SidebarFooterActions } from "@agent-native/toolkit/app-shell";
7
8
  import {
8
9
  IconStack2,
9
10
  IconHierarchy2,
@@ -11,6 +12,7 @@ import {
11
12
  IconSettings,
12
13
  IconLayoutSidebarLeftCollapse,
13
14
  IconLayoutSidebarLeftExpand,
15
+ IconSearch,
14
16
  } from "@tabler/icons-react";
15
17
  import { Link, useLocation } from "react-router";
16
18
 
@@ -28,6 +30,9 @@ const navItems = [
28
30
  labelKey: "navigation.designSystems",
29
31
  href: "/design-systems",
30
32
  },
33
+ ];
34
+
35
+ const bottomNavItems = [
31
36
  { icon: IconHierarchy2, labelKey: "settings.agentTitle", href: "/agent" },
32
37
  { icon: IconSettings, labelKey: "navigation.settings", href: "/settings" },
33
38
  ];
@@ -48,25 +53,60 @@ export function Sidebar({ collapsed, onToggleCollapsed }: SidebarProps) {
48
53
  ? location.pathname === "/"
49
54
  : location.pathname.startsWith(href);
50
55
 
56
+ const collapseButton = onToggleCollapsed ? (
57
+ <Tooltip>
58
+ <TooltipTrigger asChild>
59
+ <button
60
+ type="button"
61
+ onClick={onToggleCollapsed}
62
+ aria-label={
63
+ collapsed
64
+ ? t("sidebar.expandSidebar")
65
+ : t("sidebar.collapseSidebar")
66
+ }
67
+ className="flex size-8 items-center justify-center rounded-md text-muted-foreground hover:bg-sidebar-accent/50 hover:text-foreground"
68
+ >
69
+ {collapsed ? (
70
+ <IconLayoutSidebarLeftExpand className="h-4 w-4 rtl:-scale-x-100" />
71
+ ) : (
72
+ <IconLayoutSidebarLeftCollapse className="h-4 w-4 rtl:-scale-x-100" />
73
+ )}
74
+ </button>
75
+ </TooltipTrigger>
76
+ <TooltipContent side="right">
77
+ {collapsed ? t("sidebar.expandSidebar") : t("sidebar.collapseSidebar")}
78
+ </TooltipContent>
79
+ </Tooltip>
80
+ ) : null;
81
+ const searchButton = (
82
+ <Tooltip>
83
+ <TooltipTrigger asChild>
84
+ <button
85
+ type="button"
86
+ onClick={openCommandMenu}
87
+ aria-label={t("root.searchDecks")}
88
+ className="flex size-8 items-center justify-center rounded-md text-muted-foreground hover:bg-sidebar-accent/50 hover:text-foreground"
89
+ >
90
+ <IconSearch className="h-4 w-4" />
91
+ </button>
92
+ </TooltipTrigger>
93
+ <TooltipContent side="right">{t("root.searchDecks")}</TooltipContent>
94
+ </Tooltip>
95
+ );
96
+ const translateButton = (
97
+ <LanguagePicker variant="ghost-icon" label={t("settings.languageLabel")} />
98
+ );
99
+ const feedbackButton = (
100
+ <FeedbackButton
101
+ variant={collapsed ? "icon" : "sidebar"}
102
+ side="right"
103
+ className={collapsed ? "size-8" : "min-w-0"}
104
+ />
105
+ );
106
+
51
107
  if (collapsed) {
52
108
  return (
53
109
  <aside className="flex h-full w-12 shrink-0 flex-col items-center gap-1 overflow-hidden border-e border-border bg-sidebar py-2 text-sidebar-foreground transition-[width] duration-200 ease-out">
54
- {onToggleCollapsed && (
55
- <Tooltip delayDuration={0}>
56
- <TooltipTrigger asChild>
57
- <button
58
- onClick={onToggleCollapsed}
59
- aria-label={t("sidebar.expandSidebar")}
60
- className="flex h-10 w-10 items-center justify-center rounded-md text-muted-foreground hover:bg-sidebar-accent/50 hover:text-foreground"
61
- >
62
- <IconLayoutSidebarLeftExpand className="h-4 w-4 rtl:-scale-x-100" />
63
- </button>
64
- </TooltipTrigger>
65
- <TooltipContent side="right">
66
- {t("sidebar.expandSidebar")}
67
- </TooltipContent>
68
- </Tooltip>
69
- )}
70
110
  <nav className="flex min-h-0 flex-1 flex-col items-center gap-1 overflow-y-auto pt-1">
71
111
  {navItems.map((item) => {
72
112
  const Icon = item.icon;
@@ -92,6 +132,36 @@ export function Sidebar({ collapsed, onToggleCollapsed }: SidebarProps) {
92
132
  );
93
133
  })}
94
134
  </nav>
135
+ <nav className="flex shrink-0 flex-col items-center gap-1 py-1">
136
+ {bottomNavItems.map((item) => {
137
+ const Icon = item.icon;
138
+ return (
139
+ <Tooltip key={item.href} delayDuration={0}>
140
+ <TooltipTrigger asChild>
141
+ <Link
142
+ to={item.href}
143
+ aria-label={t(item.labelKey)}
144
+ className={cn(
145
+ "flex h-9 w-9 items-center justify-center rounded-md text-muted-foreground hover:bg-sidebar-accent/50 hover:text-foreground",
146
+ isItemActive(item.href) &&
147
+ "bg-sidebar-accent text-sidebar-accent-foreground",
148
+ )}
149
+ >
150
+ <Icon className="h-4 w-4 shrink-0" />
151
+ </Link>
152
+ </TooltipTrigger>
153
+ <TooltipContent side="right">{t(item.labelKey)}</TooltipContent>
154
+ </Tooltip>
155
+ );
156
+ })}
157
+ </nav>
158
+ <SidebarFooterActions
159
+ collapsed
160
+ feedback={feedbackButton}
161
+ translate={translateButton}
162
+ search={searchButton}
163
+ collapse={collapseButton}
164
+ />
95
165
  </aside>
96
166
  );
97
167
  }
@@ -116,20 +186,6 @@ export function Sidebar({ collapsed, onToggleCollapsed }: SidebarProps) {
116
186
  {t("navigation.brand")}
117
187
  </span>
118
188
  </div>
119
- {onToggleCollapsed && (
120
- <Tooltip>
121
- <TooltipTrigger asChild>
122
- <button
123
- onClick={onToggleCollapsed}
124
- aria-label={t("sidebar.collapseSidebar")}
125
- className="flex h-7 w-7 items-center justify-center rounded-md text-muted-foreground hover:bg-sidebar-accent/50 hover:text-foreground"
126
- >
127
- <IconLayoutSidebarLeftCollapse className="h-4 w-4 rtl:-scale-x-100" />
128
- </button>
129
- </TooltipTrigger>
130
- <TooltipContent>{t("sidebar.collapseSidebar")}</TooltipContent>
131
- </Tooltip>
132
- )}
133
189
  </div>
134
190
 
135
191
  <div className="flex min-h-0 flex-1 flex-col overflow-y-auto">
@@ -156,9 +212,27 @@ export function Sidebar({ collapsed, onToggleCollapsed }: SidebarProps) {
156
212
  </nav>
157
213
 
158
214
  <div className="mt-auto shrink-0">
159
- <div className="px-2 py-1">
160
- <ExtensionsSidebarSection />
161
- </div>
215
+ <nav className="space-y-1 px-2 py-1">
216
+ {bottomNavItems.map((item) => {
217
+ const Icon = item.icon;
218
+ const isActive = isItemActive(item.href);
219
+ return (
220
+ <Link
221
+ key={item.href}
222
+ to={item.href}
223
+ className={cn(
224
+ "flex items-center gap-3 rounded-lg px-3 py-2 text-sm",
225
+ isActive
226
+ ? "bg-sidebar-accent text-sidebar-accent-foreground"
227
+ : "text-muted-foreground hover:bg-sidebar-accent/50 hover:text-foreground",
228
+ )}
229
+ >
230
+ <Icon className="h-4 w-4 shrink-0" />
231
+ {t(item.labelKey)}
232
+ </Link>
233
+ );
234
+ })}
235
+ </nav>
162
236
 
163
237
  <div className="px-3 py-2">
164
238
  <OrgSwitcher />
@@ -166,8 +240,14 @@ export function Sidebar({ collapsed, onToggleCollapsed }: SidebarProps) {
166
240
 
167
241
  <div className="px-3 py-2 empty:hidden">
168
242
  <DevDatabaseLink />
169
- <FeedbackButton />
170
243
  </div>
244
+ <SidebarFooterActions
245
+ feedback={feedbackButton}
246
+ translate={translateButton}
247
+ search={searchButton}
248
+ collapse={collapseButton}
249
+ className="px-0 py-0"
250
+ />
171
251
  </div>
172
252
  </div>
173
253
  </aside>
@@ -42,7 +42,7 @@ button[title="Open agent sidebar"] {
42
42
  --accent: 0 0% 18%;
43
43
  --accent-foreground: 0 0% 93%;
44
44
 
45
- --destructive: 0 72% 51%;
45
+ --destructive: 0 91% 71%;
46
46
  --destructive-foreground: 0 0% 100%;
47
47
 
48
48
  --border: 0 0% 24%;
@@ -1,5 +1,5 @@
1
- import { ExtensionsListPage } from "@agent-native/core/client/extensions";
1
+ import { Navigate } from "react-router";
2
2
 
3
3
  export default function ExtensionsRoute() {
4
- return <ExtensionsListPage />;
4
+ return <Navigate to="/settings#extensions" replace />;
5
5
  }
@@ -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/slides/.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,5 +1,4 @@
1
1
  import { appPath } from "@agent-native/core/client/api-path";
2
- import { ExtensionsSidebarSection } from "@agent-native/core/client/extensions";
3
2
  import { useT } from "@agent-native/core/client/i18n";
4
3
  import { OrgSwitcher } from "@agent-native/core/client/org";
5
4
  import { FeedbackButton } from "@agent-native/core/client/ui";
@@ -9,6 +8,7 @@ import {
9
8
  IconInbox,
10
9
  IconLayoutSidebarLeftCollapse,
11
10
  IconLayoutSidebarLeftExpand,
11
+ IconSettings,
12
12
  } from "@tabler/icons-react";
13
13
  import { Link, useLocation } from "react-router";
14
14
 
@@ -26,6 +26,10 @@ const NAV_ITEMS = [
26
26
  { icon: IconForms, labelKey: "sidebar.navFields", href: "/fields" },
27
27
  ];
28
28
 
29
+ const BOTTOM_NAV_ITEMS = [
30
+ { icon: IconSettings, labelKey: "header.pageSettings", href: "/settings" },
31
+ ];
32
+
29
33
  interface SidebarProps {
30
34
  collapsed?: boolean;
31
35
  collapsible?: boolean;
@@ -165,11 +169,38 @@ export function Sidebar({
165
169
  collapsed && "border-t border-sidebar-border py-2",
166
170
  )}
167
171
  >
168
- {!collapsed ? (
169
- <div className="border-t border-sidebar-border px-2 py-1">
170
- <ExtensionsSidebarSection />
171
- </div>
172
- ) : null}
172
+ <nav
173
+ className={cn(
174
+ "grid gap-1",
175
+ collapsed
176
+ ? "px-1 py-1"
177
+ : "border-t border-sidebar-border px-3 py-2",
178
+ )}
179
+ >
180
+ {BOTTOM_NAV_ITEMS.map((item) => {
181
+ const Icon = item.icon;
182
+ const isActive = location.pathname.startsWith(item.href);
183
+ return (
184
+ <Link
185
+ key={item.href}
186
+ to={item.href}
187
+ aria-label={collapsed ? t(item.labelKey) : undefined}
188
+ className={cn(
189
+ "flex items-center rounded-md text-sm",
190
+ collapsed ? "h-9 justify-center px-0" : "gap-3 px-3 py-2",
191
+ isActive
192
+ ? "bg-sidebar-accent text-sidebar-accent-foreground"
193
+ : "text-sidebar-foreground hover:bg-sidebar-accent/65 hover:text-sidebar-accent-foreground",
194
+ )}
195
+ >
196
+ <Icon className="size-4 shrink-0" />
197
+ <span className={collapsed ? "sr-only" : "truncate"}>
198
+ {t(item.labelKey)}
199
+ </span>
200
+ </Link>
201
+ );
202
+ })}
203
+ </nav>
173
204
 
174
205
  <div
175
206
  className={cn(
@@ -22,7 +22,7 @@
22
22
  --muted-foreground: 220 5% 45%;
23
23
  --accent: 220 10% 95%;
24
24
  --accent-foreground: 220 10% 15%;
25
- --destructive: 0 84% 60%;
25
+ --destructive: 0 91% 71%;
26
26
  --destructive-foreground: 0 0% 98%;
27
27
  --border: 220 10% 90%;
28
28
  --input: 220 10% 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 messages from "@/i18n/en-US";
4
4
  import { APP_TITLE } from "@/lib/app-config";
@@ -8,5 +8,5 @@ export function meta() {
8
8
  }
9
9
 
10
10
  export default function ExtensionsRoute() {
11
- return <ExtensionsListPage />;
11
+ return <Navigate to="/settings#extensions" replace />;
12
12
  }