@agent-native/core 0.120.2 → 0.120.4

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 (278) hide show
  1. package/corpus/README.md +3 -3
  2. package/corpus/core/CHANGELOG.md +28 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/cli/context-xray-local.ts +1 -1
  5. package/corpus/core/src/cli/index.ts +63 -18
  6. package/corpus/core/src/cli/skills.ts +5 -0
  7. package/corpus/core/src/cli/telemetry.ts +118 -1
  8. package/corpus/core/src/client/AgentPanel.tsx +10 -0
  9. package/corpus/core/src/client/CommandMenu.tsx +13 -1
  10. package/corpus/core/src/client/agent-page/AgentTabsPage.tsx +39 -4
  11. package/corpus/core/src/client/analytics.ts +13 -0
  12. package/corpus/core/src/client/error-capture.ts +6 -1
  13. package/corpus/core/src/client/extensions/ExtensionsListPage.tsx +12 -5
  14. package/corpus/core/src/client/extensions/agent-native-extension-runtime.ts +1 -1
  15. package/corpus/core/src/client/navigation/index.ts +2 -0
  16. package/corpus/core/src/client/org/OrgSwitcher.tsx +14 -32
  17. package/corpus/core/src/client/settings/ExtensionsSettingsContent.tsx +1 -1
  18. package/corpus/core/src/extensions/theme.ts +1 -1
  19. package/corpus/core/src/localization/default-messages.ts +2 -0
  20. package/corpus/core/src/server/core-routes-plugin.ts +10 -1
  21. package/corpus/core/src/server/framework-request-handler.ts +17 -26
  22. package/corpus/core/src/styles/agent-native.css +13 -0
  23. package/corpus/core/src/templates/chat/app/components/layout/Layout.tsx +3 -0
  24. package/corpus/core/src/templates/chat/app/components/layout/Sidebar.tsx +78 -45
  25. package/corpus/core/src/templates/chat/app/global.css +1 -1
  26. package/corpus/core/src/templates/default/app/global.css +1 -1
  27. package/corpus/core/src/tracking/error-capture.ts +151 -0
  28. package/corpus/core/src/tracking/index.ts +5 -0
  29. package/corpus/templates/analytics/app/components/dashboard/CumulativeNetChart.tsx +1 -1
  30. package/corpus/templates/analytics/app/components/dashboard/DashboardHistoryPanel.tsx +1 -4
  31. package/corpus/templates/analytics/app/components/dashboard/DashboardPanelSkeleton.tsx +1 -1
  32. package/corpus/templates/analytics/app/components/dashboard/DataTable.tsx +1 -1
  33. package/corpus/templates/analytics/app/components/dashboard/DateRangePicker.tsx +2 -2
  34. package/corpus/templates/analytics/app/components/dashboard/MetricCard.tsx +1 -1
  35. package/corpus/templates/analytics/app/components/dashboard/RecentActivity.tsx +1 -1
  36. package/corpus/templates/analytics/app/components/dashboard/RevenueChart.tsx +1 -1
  37. package/corpus/templates/analytics/app/components/dashboard/RevenueComparisonChart.tsx +1 -1
  38. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +41 -9
  39. package/corpus/templates/analytics/app/components/dashboard/StatsCard.tsx +1 -1
  40. package/corpus/templates/analytics/app/components/dashboard/TimeSeriesChart.tsx +1 -1
  41. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +2 -0
  42. package/corpus/templates/analytics/app/components/layout/Layout.tsx +28 -14
  43. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +152 -124
  44. package/corpus/templates/analytics/app/global.css +5 -5
  45. package/corpus/templates/analytics/app/lib/dashboard-report-capture.ts +42 -0
  46. package/corpus/templates/analytics/app/pages/adhoc/_shared/KpiChart.tsx +1 -1
  47. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/ChartTypePicker.tsx +1 -1
  48. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/DateRangePicker.tsx +1 -1
  49. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/EventRow.tsx +1 -1
  50. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/SqlPreview.tsx +2 -2
  51. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +3 -3
  52. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/EmailReportDialog.tsx +2 -2
  53. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +1 -1
  54. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +1 -1
  55. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +162 -51
  56. package/corpus/templates/analytics/app/root.tsx +28 -0
  57. package/corpus/templates/analytics/changelog/2026-07-24-analytics-charts-now-explain-slow-loads-and-offer-a-direct-r.md +6 -0
  58. package/corpus/templates/analytics/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  59. package/corpus/templates/analytics/changelog/2026-07-24-daily-dashboard-emails-now-load-signed-reports-more-reliably.md +6 -0
  60. package/corpus/templates/analytics/changelog/2026-07-24-manage-agent-is-clearly-marked-as-a-link-to-its-dedicated-pa.md +6 -0
  61. package/corpus/templates/analytics/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  62. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +1 -1
  63. package/corpus/templates/analytics/server/db/schema.ts +5 -0
  64. package/corpus/templates/analytics/server/jobs/dashboard-report.ts +21 -0
  65. package/corpus/templates/analytics/server/lib/canonical-first-party-dashboard-repair.ts +11 -0
  66. package/corpus/templates/analytics/server/lib/dashboard-report-subscriptions.ts +54 -0
  67. package/corpus/templates/analytics/server/lib/dashboard-report.ts +235 -26
  68. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +4 -1
  69. package/corpus/templates/analytics/server/plugins/db.ts +9 -0
  70. package/corpus/templates/analytics/shared/dashboard-report-timeouts.ts +1 -1
  71. package/corpus/templates/assets/app/components/asset/AssetPreviewDialog.tsx +376 -0
  72. package/corpus/templates/assets/app/components/create/RecentDraftsSection.tsx +14 -4
  73. package/corpus/templates/assets/app/components/layout/Layout.tsx +5 -0
  74. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +118 -74
  75. package/corpus/templates/assets/app/global.css +1 -1
  76. package/corpus/templates/assets/app/i18n-data.ts +10 -0
  77. package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +99 -10
  78. package/corpus/templates/assets/app/routes/library.tsx +21 -198
  79. package/corpus/templates/assets/changelog/2026-07-21-unified-asset-preview-click-any-asset-to-open-one-preview-wi.md +6 -0
  80. package/corpus/templates/assets/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  81. package/corpus/templates/assets/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  82. package/corpus/templates/brain/app/components/layout/Layout.tsx +3 -0
  83. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +76 -43
  84. package/corpus/templates/brain/app/global.css +1 -1
  85. package/corpus/templates/brain/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  86. package/corpus/templates/brain/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  87. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +67 -52
  88. package/corpus/templates/calendar/app/global.css +1 -1
  89. package/corpus/templates/calendar/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  90. package/corpus/templates/calendar/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  91. package/corpus/templates/chat/app/components/layout/Layout.tsx +3 -0
  92. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +78 -45
  93. package/corpus/templates/chat/app/global.css +1 -1
  94. package/corpus/templates/chat/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  95. package/corpus/templates/chat/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  96. package/corpus/templates/clips/app/components/library/library-layout.tsx +65 -31
  97. package/corpus/templates/clips/app/components/library/organization-switcher.tsx +2 -2
  98. package/corpus/templates/clips/app/components/player/video-player.tsx +16 -1
  99. package/corpus/templates/clips/app/global.css +1 -1
  100. package/corpus/templates/clips/app/hooks/use-view-tracking.ts +55 -12
  101. package/corpus/templates/clips/app/routes/embed.$shareId.tsx +6 -5
  102. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +7 -7
  103. package/corpus/templates/clips/app/routes/share.$shareId.tsx +6 -5
  104. package/corpus/templates/clips/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  105. package/corpus/templates/clips/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  106. package/corpus/templates/clips/server/plugins/db.ts +113 -68
  107. package/corpus/templates/content/actions/update-document.ts +145 -91
  108. package/corpus/templates/content/app/components/editor/CommentComposer.tsx +4 -1
  109. package/corpus/templates/content/app/components/editor/CommentsSidebar.tsx +366 -164
  110. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +51 -28
  111. package/corpus/templates/content/app/components/editor/database/sidebar.tsx +19 -8
  112. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +66 -42
  113. package/corpus/templates/content/app/global.css +1 -1
  114. package/corpus/templates/content/app/i18n-data.ts +15 -0
  115. package/corpus/templates/content/changelog/2026-07-23-shared-pages-now-keep-durable-content-visible-and-comment-th.md +6 -0
  116. package/corpus/templates/content/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  117. package/corpus/templates/content/changelog/2026-07-24-comment-drafts-now-stay-open-when-saving-fails-and-long-live.md +6 -0
  118. package/corpus/templates/content/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  119. package/corpus/templates/design/actions/update-file.ts +85 -18
  120. package/corpus/templates/design/app/components/layout/Sidebar.tsx +65 -30
  121. package/corpus/templates/design/app/entry.client.tsx +14 -1
  122. package/corpus/templates/design/app/global.css +1 -1
  123. package/corpus/templates/design/app/lib/design-save-outbox.ts +39 -0
  124. package/corpus/templates/design/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  125. package/corpus/templates/design/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  126. package/corpus/templates/dispatch/app/global.css +1 -1
  127. package/corpus/templates/dispatch/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  128. package/corpus/templates/dispatch/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  129. package/corpus/templates/forms/app/components/layout/Layout.tsx +3 -0
  130. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +72 -37
  131. package/corpus/templates/forms/app/global.css +1 -1
  132. package/corpus/templates/forms/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  133. package/corpus/templates/forms/changelog/2026-07-24-forms-sidebar-actions-now-keep-search-language-feedback-and-.md +6 -0
  134. package/corpus/templates/forms/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  135. package/corpus/templates/macros/app/components/DailyProgress.tsx +5 -5
  136. package/corpus/templates/macros/app/components/ExerciseCard.tsx +2 -2
  137. package/corpus/templates/macros/app/components/MealCard.tsx +2 -2
  138. package/corpus/templates/macros/app/components/WeightCard.tsx +2 -2
  139. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +56 -29
  140. package/corpus/templates/macros/app/components/ui/button.tsx +1 -2
  141. package/corpus/templates/macros/app/components/ui/card.tsx +1 -1
  142. package/corpus/templates/macros/app/global.css +1 -1
  143. package/corpus/templates/macros/app/routes/_index.tsx +1 -1
  144. package/corpus/templates/macros/app/routes/analytics.tsx +4 -7
  145. package/corpus/templates/macros/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  146. package/corpus/templates/macros/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  147. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +125 -37
  148. package/corpus/templates/mail/app/global.css +1 -1
  149. package/corpus/templates/mail/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  150. package/corpus/templates/mail/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  151. package/corpus/templates/plan/app/components/layout/Layout.tsx +3 -0
  152. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +90 -60
  153. package/corpus/templates/plan/app/global.css +1 -1
  154. package/corpus/templates/plan/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  155. package/corpus/templates/plan/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  156. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +69 -32
  157. package/corpus/templates/slides/app/global.css +1 -1
  158. package/corpus/templates/slides/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  159. package/corpus/templates/slides/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  160. package/corpus/templates/tasks/app/global.css +1 -1
  161. package/corpus/templates/tasks/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  162. package/corpus/toolkit/CHANGELOG.md +14 -0
  163. package/corpus/toolkit/README.md +8 -1
  164. package/corpus/toolkit/agent-native.eject.json +1 -1
  165. package/corpus/toolkit/package.json +1 -1
  166. package/corpus/toolkit/src/app-shell/index.ts +1 -0
  167. package/corpus/toolkit/src/app-shell/sidebar-footer-actions.tsx +48 -0
  168. package/corpus/toolkit/src/chat-history.css +52 -1
  169. package/corpus/toolkit/src/design-system/default-adapter.tsx +1 -1
  170. package/corpus/toolkit/src/editor/useCollabReconcile.ts +83 -15
  171. package/corpus/toolkit/src/ui/button.tsx +1 -2
  172. package/corpus/toolkit/src/ui/card.tsx +1 -1
  173. package/corpus/toolkit/src/ui/table.tsx +4 -11
  174. package/dist/cli/context-xray-local.js +1 -1
  175. package/dist/cli/context-xray-local.js.map +1 -1
  176. package/dist/cli/index.js +56 -17
  177. package/dist/cli/index.js.map +1 -1
  178. package/dist/cli/skills.d.ts.map +1 -1
  179. package/dist/cli/skills.js +5 -0
  180. package/dist/cli/skills.js.map +1 -1
  181. package/dist/cli/telemetry.d.ts +7 -0
  182. package/dist/cli/telemetry.d.ts.map +1 -1
  183. package/dist/cli/telemetry.js +91 -1
  184. package/dist/cli/telemetry.js.map +1 -1
  185. package/dist/client/AgentPanel.d.ts +7 -1
  186. package/dist/client/AgentPanel.d.ts.map +1 -1
  187. package/dist/client/AgentPanel.js +2 -2
  188. package/dist/client/AgentPanel.js.map +1 -1
  189. package/dist/client/CommandMenu.d.ts +2 -0
  190. package/dist/client/CommandMenu.d.ts.map +1 -1
  191. package/dist/client/CommandMenu.js +12 -1
  192. package/dist/client/CommandMenu.js.map +1 -1
  193. package/dist/client/agent-page/AgentTabsPage.d.ts +4 -0
  194. package/dist/client/agent-page/AgentTabsPage.d.ts.map +1 -1
  195. package/dist/client/agent-page/AgentTabsPage.js +8 -4
  196. package/dist/client/agent-page/AgentTabsPage.js.map +1 -1
  197. package/dist/client/analytics.d.ts.map +1 -1
  198. package/dist/client/analytics.js +7 -0
  199. package/dist/client/analytics.js.map +1 -1
  200. package/dist/client/error-capture.d.ts.map +1 -1
  201. package/dist/client/error-capture.js +8 -1
  202. package/dist/client/error-capture.js.map +1 -1
  203. package/dist/client/extensions/ExtensionsListPage.d.ts.map +1 -1
  204. package/dist/client/extensions/ExtensionsListPage.js +2 -2
  205. package/dist/client/extensions/ExtensionsListPage.js.map +1 -1
  206. package/dist/client/extensions/agent-native-extension-runtime.js +1 -1
  207. package/dist/client/extensions/agent-native-extension-runtime.js.map +1 -1
  208. package/dist/client/navigation/index.d.ts +1 -1
  209. package/dist/client/navigation/index.d.ts.map +1 -1
  210. package/dist/client/navigation/index.js +1 -1
  211. package/dist/client/navigation/index.js.map +1 -1
  212. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  213. package/dist/client/org/OrgSwitcher.js +9 -13
  214. package/dist/client/org/OrgSwitcher.js.map +1 -1
  215. package/dist/client/settings/ExtensionsSettingsContent.js +1 -1
  216. package/dist/client/settings/ExtensionsSettingsContent.js.map +1 -1
  217. package/dist/collab/awareness.d.ts +2 -2
  218. package/dist/collab/awareness.d.ts.map +1 -1
  219. package/dist/collab/struct-routes.d.ts +1 -1
  220. package/dist/extensions/theme.js +1 -1
  221. package/dist/extensions/theme.js.map +1 -1
  222. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  223. package/dist/localization/default-messages.d.ts +2 -0
  224. package/dist/localization/default-messages.d.ts.map +1 -1
  225. package/dist/localization/default-messages.js +2 -0
  226. package/dist/localization/default-messages.js.map +1 -1
  227. package/dist/provider-api/actions/provider-api.d.ts +2 -2
  228. package/dist/secrets/routes.d.ts +9 -9
  229. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  230. package/dist/server/core-routes-plugin.js +8 -1
  231. package/dist/server/core-routes-plugin.js.map +1 -1
  232. package/dist/server/framework-request-handler.d.ts.map +1 -1
  233. package/dist/server/framework-request-handler.js +17 -27
  234. package/dist/server/framework-request-handler.js.map +1 -1
  235. package/dist/server/realtime-token.d.ts +1 -1
  236. package/dist/styles/agent-native.css +13 -0
  237. package/dist/templates/chat/app/components/layout/Layout.tsx +3 -0
  238. package/dist/templates/chat/app/components/layout/Sidebar.tsx +78 -45
  239. package/dist/templates/chat/app/global.css +1 -1
  240. package/dist/templates/chat/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  241. package/dist/templates/chat/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  242. package/dist/templates/default/app/global.css +1 -1
  243. package/dist/tracking/error-capture.d.ts +14 -0
  244. package/dist/tracking/error-capture.d.ts.map +1 -0
  245. package/dist/tracking/error-capture.js +113 -0
  246. package/dist/tracking/error-capture.js.map +1 -0
  247. package/dist/tracking/index.d.ts +1 -0
  248. package/dist/tracking/index.d.ts.map +1 -1
  249. package/dist/tracking/index.js +1 -0
  250. package/dist/tracking/index.js.map +1 -1
  251. package/package.json +2 -2
  252. package/src/cli/context-xray-local.ts +1 -1
  253. package/src/cli/index.ts +63 -18
  254. package/src/cli/skills.ts +5 -0
  255. package/src/cli/telemetry.ts +118 -1
  256. package/src/client/AgentPanel.tsx +10 -0
  257. package/src/client/CommandMenu.tsx +13 -1
  258. package/src/client/agent-page/AgentTabsPage.tsx +39 -4
  259. package/src/client/analytics.ts +13 -0
  260. package/src/client/error-capture.ts +6 -1
  261. package/src/client/extensions/ExtensionsListPage.tsx +12 -5
  262. package/src/client/extensions/agent-native-extension-runtime.ts +1 -1
  263. package/src/client/navigation/index.ts +2 -0
  264. package/src/client/org/OrgSwitcher.tsx +14 -32
  265. package/src/client/settings/ExtensionsSettingsContent.tsx +1 -1
  266. package/src/extensions/theme.ts +1 -1
  267. package/src/localization/default-messages.ts +2 -0
  268. package/src/server/core-routes-plugin.ts +10 -1
  269. package/src/server/framework-request-handler.ts +17 -26
  270. package/src/styles/agent-native.css +13 -0
  271. package/src/templates/chat/app/components/layout/Layout.tsx +3 -0
  272. package/src/templates/chat/app/components/layout/Sidebar.tsx +78 -45
  273. package/src/templates/chat/app/global.css +1 -1
  274. package/src/templates/chat/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  275. package/src/templates/chat/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  276. package/src/templates/default/app/global.css +1 -1
  277. package/src/tracking/error-capture.ts +151 -0
  278. package/src/tracking/index.ts +5 -0
@@ -1,8 +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 { 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";
4
5
  import { OrgSwitcher } from "@agent-native/core/client/org";
5
6
  import { FeedbackButton } from "@agent-native/core/client/ui";
7
+ import { SidebarFooterActions } from "@agent-native/toolkit/app-shell";
6
8
  import {
7
9
  IconPencil,
8
10
  IconTemplate,
@@ -11,6 +13,7 @@ import {
11
13
  IconSettings,
12
14
  IconLayoutSidebarLeftCollapse,
13
15
  IconLayoutSidebarLeftExpand,
16
+ IconSearch,
14
17
  } from "@tabler/icons-react";
15
18
  import { useEffect, useState } from "react";
16
19
  import { Link, useLocation } from "react-router";
@@ -61,6 +64,59 @@ export function Sidebar() {
61
64
  }
62
65
  }, [collapsed]);
63
66
 
67
+ const collapseButton = (
68
+ <Tooltip delayDuration={0}>
69
+ <TooltipTrigger asChild>
70
+ <button
71
+ type="button"
72
+ onClick={() => setCollapsed((value) => !value)}
73
+ className="flex size-8 items-center justify-center rounded-md text-muted-foreground hover:bg-sidebar-accent/50 hover:text-foreground"
74
+ aria-label={
75
+ collapsed
76
+ ? t("navigation.expandSidebar")
77
+ : t("navigation.collapseSidebar")
78
+ }
79
+ >
80
+ {collapsed ? (
81
+ <IconLayoutSidebarLeftExpand className="h-4 w-4 rtl:-scale-x-100" />
82
+ ) : (
83
+ <IconLayoutSidebarLeftCollapse className="h-4 w-4 rtl:-scale-x-100" />
84
+ )}
85
+ </button>
86
+ </TooltipTrigger>
87
+ <TooltipContent side="right">
88
+ {collapsed
89
+ ? t("navigation.expandSidebar")
90
+ : t("navigation.collapseSidebar")}
91
+ </TooltipContent>
92
+ </Tooltip>
93
+ );
94
+ const searchButton = (
95
+ <Tooltip delayDuration={0}>
96
+ <TooltipTrigger asChild>
97
+ <button
98
+ type="button"
99
+ onClick={openCommandMenu}
100
+ className="flex size-8 items-center justify-center rounded-md text-muted-foreground hover:bg-sidebar-accent/50 hover:text-foreground"
101
+ aria-label={t("root.commandSearch")}
102
+ >
103
+ <IconSearch className="h-4 w-4" />
104
+ </button>
105
+ </TooltipTrigger>
106
+ <TooltipContent side="right">{t("root.commandSearch")}</TooltipContent>
107
+ </Tooltip>
108
+ );
109
+ const translateButton = (
110
+ <LanguagePicker variant="ghost-icon" label={t("settings.languageLabel")} />
111
+ );
112
+ const feedbackButton = (
113
+ <FeedbackButton
114
+ variant={collapsed ? "icon" : "sidebar"}
115
+ side="right"
116
+ className={collapsed ? "h-8 w-8" : "min-w-0"}
117
+ />
118
+ );
119
+
64
120
  return (
65
121
  <aside
66
122
  className={cn(
@@ -93,30 +149,6 @@ export function Sidebar() {
93
149
  </span>
94
150
  </div>
95
151
  )}
96
- <Tooltip delayDuration={0}>
97
- <TooltipTrigger asChild>
98
- <button
99
- onClick={() => setCollapsed((c) => !c)}
100
- className="flex h-7 w-7 cursor-pointer items-center justify-center rounded-md text-muted-foreground hover:bg-sidebar-accent/50 hover:text-foreground"
101
- aria-label={
102
- collapsed
103
- ? t("navigation.expandSidebar")
104
- : t("navigation.collapseSidebar")
105
- }
106
- >
107
- {collapsed ? (
108
- <IconLayoutSidebarLeftExpand className="h-4 w-4 rtl:-scale-x-100" />
109
- ) : (
110
- <IconLayoutSidebarLeftCollapse className="h-4 w-4 rtl:-scale-x-100" />
111
- )}
112
- </button>
113
- </TooltipTrigger>
114
- <TooltipContent side="right">
115
- {collapsed
116
- ? t("navigation.expandSidebar")
117
- : t("navigation.collapseSidebar")}
118
- </TooltipContent>
119
- </Tooltip>
120
152
  </div>
121
153
 
122
154
  <div className="flex min-h-0 flex-1 flex-col overflow-y-auto">
@@ -202,17 +234,20 @@ export function Sidebar() {
202
234
  <div className="px-3 py-2">
203
235
  <OrgSwitcher reserveSpace />
204
236
  </div>
205
-
206
237
  <div className="px-3 py-2">
207
238
  <DevDatabaseLink />
208
- <div className="flex items-center justify-end gap-1">
209
- <FeedbackButton className="min-w-0 flex-1" />
210
- <ThemeToggle className="h-8 w-8 shrink-0" />
211
- </div>
239
+ <ThemeToggle className="h-8 w-8 shrink-0" />
212
240
  </div>
213
241
  </div>
214
242
  )}
215
243
  </div>
244
+ <SidebarFooterActions
245
+ collapsed={collapsed}
246
+ feedback={feedbackButton}
247
+ translate={translateButton}
248
+ search={searchButton}
249
+ collapse={collapseButton}
250
+ />
216
251
  </div>
217
252
  </aside>
218
253
  );
@@ -1,3 +1,4 @@
1
+ import { captureException } from "@agent-native/core/client/analytics";
1
2
  import { appBasePath } from "@agent-native/core/client/api-path";
2
3
  import { hydrateRoot } from "react-dom/client";
3
4
  import { HydratedRouter } from "react-router/dom";
@@ -16,4 +17,16 @@ if (context) {
16
17
  context.basename = routerBasePath;
17
18
  }
18
19
 
19
- hydrateRoot(document, <HydratedRouter />);
20
+ hydrateRoot(document, <HydratedRouter />, {
21
+ onRecoverableError(error, info) {
22
+ captureException(error, {
23
+ tags: {
24
+ source: "react-recoverable-error",
25
+ kind: "hydration",
26
+ },
27
+ extra: {
28
+ componentStack: info.componentStack?.slice(0, 2_000),
29
+ },
30
+ });
31
+ },
32
+ });
@@ -113,7 +113,7 @@
113
113
  --muted-foreground: 0 0% 60%;
114
114
  --accent: 0 0% 18%;
115
115
  --accent-foreground: 0 0% 96%;
116
- --destructive: 0 84% 60%;
116
+ --destructive: 0 91% 71%;
117
117
  --destructive-foreground: 0 0% 98%;
118
118
  --border: 0 0% 24%;
119
119
  --input: 0 0% 24%;
@@ -37,6 +37,14 @@ export interface DrainDesignSaveOutboxResult {
37
37
  * transient/conflict errors that SHOULD be retried.
38
38
  */
39
39
  dropped: Array<{ entry: DesignSaveOutboxEntry; error: unknown }>;
40
+ /**
41
+ * Entries dropped because the server moved past their base version (a 409
42
+ * conflict). Distinct from `dropped`: the file still exists and nothing was
43
+ * lost to deletion, so the editor should rebase from the server rather than
44
+ * warn "changes discarded". Kept separate so a normal concurrent edit is
45
+ * never presented as a deleted file.
46
+ */
47
+ rebased: Array<{ entry: DesignSaveOutboxEntry; error: unknown }>;
40
48
  }
41
49
 
42
50
  /**
@@ -58,6 +66,24 @@ export function isTerminalSaveError(error: unknown): boolean {
58
66
  );
59
67
  }
60
68
 
69
+ /**
70
+ * The server's update-file version conflict ("File changed since it was read…").
71
+ * Its frozen expectedVersionHash can never match on retry, so drop-and-rebase
72
+ * rather than loop forever. Matched by MESSAGE, not bare status 409, on purpose:
73
+ * the client-side "no known base version" / "changed elsewhere" 409 synthetics
74
+ * are intentionally retained by drainEntries, and the client-build-mismatch 409
75
+ * is a reload-then-retry.
76
+ */
77
+ export function isConflictSaveError(error: unknown): boolean {
78
+ if (!error || typeof error !== "object") return false;
79
+ const candidate = error as { code?: unknown; message?: unknown };
80
+ if (candidate.code === "client_build_mismatch") return false;
81
+ return (
82
+ typeof candidate.message === "string" &&
83
+ /changed since it was read|re-read the file/i.test(candidate.message)
84
+ );
85
+ }
86
+
61
87
  const DATABASE_NAME = "agent-native-design-save-outbox";
62
88
  const DATABASE_VERSION = 2;
63
89
  const ENTRY_STORE = "entries";
@@ -324,6 +350,7 @@ async function drainEntries(
324
350
  saved: [],
325
351
  failed: [],
326
352
  dropped: [],
353
+ rebased: [],
327
354
  };
328
355
  for (const entry of await storage.list(designId, actorScope)) {
329
356
  try {
@@ -374,6 +401,18 @@ async function drainEntries(
374
401
  `[design-save-outbox] dropped unrecoverable save for ${entry.actionName} ${entry.resourceId} (file no longer exists)`,
375
402
  );
376
403
  }
404
+ } else if (isConflictSaveError(error)) {
405
+ // Base version superseded — retry is futile and replaying the stale
406
+ // snapshot would clobber newer content. Drop into `rebased` (NOT
407
+ // `dropped`) so the editor rebases from the server instead of warning
408
+ // that the file was discarded/deleted.
409
+ await storage.deleteIfRevision(entry);
410
+ result.rebased.push({ entry, error });
411
+ if (typeof console !== "undefined") {
412
+ console.warn(
413
+ `[design-save-outbox] rebased superseded save for ${entry.actionName} ${entry.resourceId} (server content moved on)`,
414
+ );
415
+ }
377
416
  } else {
378
417
  result.failed.push({ entry, error });
379
418
  }
@@ -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.
@@ -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%;
@@ -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.
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  AgentSidebar,
3
3
  focusAgentChat,
4
+ isAgentChatHomeHandoffActive,
4
5
  navigateWithAgentChatViewTransition,
5
6
  useAgentChatHomeHandoff,
6
7
  useAgentChatHomeHandoffLinks,
@@ -37,6 +38,7 @@ export function Layout({ children }: LayoutProps) {
37
38
  activePath: location.pathname,
38
39
  enabled: !isAskRoute,
39
40
  });
41
+ const chatHomeHandoffPending = isAgentChatHomeHandoffActive("forms");
40
42
  useAgentChatHomeHandoffLinks({
41
43
  storageKey: "forms",
42
44
  chatPath: "/ask",
@@ -90,6 +92,7 @@ export function Layout({ children }: LayoutProps) {
90
92
  agentPageHref="/agent"
91
93
  defaultOpen={false}
92
94
  chatViewTransition
95
+ chatViewTransitionHandoff={chatHomeHandoffPending}
93
96
  storageKey="forms"
94
97
  browserTabId={TAB_ID}
95
98
  openOnChatRunning={chatHomeHandoffActive}
@@ -5,9 +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 { 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";
9
10
  import { OrgSwitcher } from "@agent-native/core/client/org";
10
11
  import { FeedbackButton } from "@agent-native/core/client/ui";
12
+ import { SidebarFooterActions } from "@agent-native/toolkit/app-shell";
11
13
  import {
12
14
  IconArrowUp,
13
15
  IconPlus,
@@ -20,6 +22,7 @@ import {
20
22
  IconForms,
21
23
  IconLayoutSidebarLeftCollapse,
22
24
  IconLayoutSidebarLeftExpand,
25
+ IconSearch,
23
26
  } from "@tabler/icons-react";
24
27
  import { useState, useRef, useEffect, type MouseEvent } from "react";
25
28
  import { Link, useLocation, useNavigate } from "react-router";
@@ -70,6 +73,59 @@ export function Sidebar() {
70
73
  });
71
74
  const effectiveCollapsed = collapsed && !isMobile;
72
75
 
76
+ const collapseButton = (
77
+ <Tooltip>
78
+ <TooltipTrigger asChild>
79
+ <button
80
+ type="button"
81
+ onClick={() => setCollapsed((value) => !value)}
82
+ className="flex size-8 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground"
83
+ aria-label={
84
+ effectiveCollapsed
85
+ ? t("sidebar.expandSidebar")
86
+ : t("sidebar.collapseSidebar")
87
+ }
88
+ >
89
+ {effectiveCollapsed ? (
90
+ <IconLayoutSidebarLeftExpand className="h-4 w-4 rtl:-scale-x-100" />
91
+ ) : (
92
+ <IconLayoutSidebarLeftCollapse className="h-4 w-4 rtl:-scale-x-100" />
93
+ )}
94
+ </button>
95
+ </TooltipTrigger>
96
+ <TooltipContent side="right">
97
+ {effectiveCollapsed
98
+ ? t("sidebar.expandSidebar")
99
+ : t("sidebar.collapseSidebar")}
100
+ </TooltipContent>
101
+ </Tooltip>
102
+ );
103
+ const searchButton = (
104
+ <Tooltip>
105
+ <TooltipTrigger asChild>
106
+ <button
107
+ type="button"
108
+ onClick={openCommandMenu}
109
+ className="flex size-8 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground"
110
+ aria-label={t("root.searchForms")}
111
+ >
112
+ <IconSearch className="h-4 w-4" />
113
+ </button>
114
+ </TooltipTrigger>
115
+ <TooltipContent side="right">{t("root.searchForms")}</TooltipContent>
116
+ </Tooltip>
117
+ );
118
+ const translateButton = (
119
+ <LanguagePicker variant="ghost-icon" label={t("settings.languageLabel")} />
120
+ );
121
+ const feedbackButton = (
122
+ <FeedbackButton
123
+ variant={effectiveCollapsed ? "icon" : "sidebar"}
124
+ side="right"
125
+ className={effectiveCollapsed ? "size-8" : "min-w-0"}
126
+ />
127
+ );
128
+
73
129
  useEffect(() => {
74
130
  if (popoverOpen) {
75
131
  setPrompt("");
@@ -198,22 +254,6 @@ export function Sidebar() {
198
254
  const sidebarContent = effectiveCollapsed ? (
199
255
  <div className="agent-layout-left-drawer flex h-screen w-12 min-w-0 shrink-0 flex-col items-center overflow-hidden border-e border-border bg-sidebar py-2 transition-[width] duration-200 ease-out">
200
256
  <TooltipProvider delayDuration={0}>
201
- <Tooltip>
202
- <TooltipTrigger asChild>
203
- <button
204
- type="button"
205
- onClick={() => setCollapsed(false)}
206
- className="forms-sidebar-nav-item flex size-10 items-center justify-center rounded-lg text-muted-foreground/55 transition-[background-color,box-shadow,color,transform] duration-150 ease-out hover:bg-accent/50 hover:text-muted-foreground active:scale-[0.96] motion-reduce:active:scale-100"
207
- aria-label={t("sidebar.expandSidebar")}
208
- >
209
- <IconLayoutSidebarLeftExpand className="h-4 w-4 rtl:-scale-x-100" />
210
- </button>
211
- </TooltipTrigger>
212
- <TooltipContent side="right">
213
- {t("sidebar.expandSidebar")}
214
- </TooltipContent>
215
- </Tooltip>
216
-
217
257
  <nav className="mt-1 flex min-h-0 flex-1 flex-col items-center gap-1 overflow-y-auto">
218
258
  <Tooltip>
219
259
  <TooltipTrigger asChild>
@@ -318,6 +358,13 @@ export function Sidebar() {
318
358
  </Tooltip>
319
359
  </div>
320
360
  </nav>
361
+ <SidebarFooterActions
362
+ collapsed
363
+ feedback={feedbackButton}
364
+ translate={translateButton}
365
+ search={searchButton}
366
+ collapse={collapseButton}
367
+ />
321
368
  </TooltipProvider>
322
369
  </div>
323
370
  ) : (
@@ -368,24 +415,6 @@ export function Sidebar() {
368
415
  <IconX size={18} />
369
416
  </Button>
370
417
  )}
371
- {!isMobile && (
372
- <Tooltip>
373
- <TooltipTrigger asChild>
374
- <Button
375
- variant="ghost"
376
- size="icon"
377
- className="size-10 text-muted-foreground/55 transition-[background-color,box-shadow,color,transform] hover:bg-accent/50 hover:text-muted-foreground active:scale-[0.96] motion-reduce:active:scale-100"
378
- onClick={() => setCollapsed(true)}
379
- aria-label={t("sidebar.collapseSidebar")}
380
- >
381
- <IconLayoutSidebarLeftCollapse className="h-4 w-4 rtl:-scale-x-100" />
382
- </Button>
383
- </TooltipTrigger>
384
- <TooltipContent side="right">
385
- {t("sidebar.collapseSidebar")}
386
- </TooltipContent>
387
- </Tooltip>
388
- )}
389
418
  </div>
390
419
 
391
420
  <ScrollArea className="min-h-0 min-w-0 flex-1">
@@ -469,10 +498,16 @@ export function Sidebar() {
469
498
  <div className="shrink-0 space-y-2 px-3 py-2">
470
499
  <OrgSwitcher />
471
500
  <DevDatabaseLink />
472
- <div className="flex items-center justify-end gap-2">
473
- <FeedbackButton className="min-w-0 flex-1" />
501
+ <div className="flex justify-end">
474
502
  <ThemeToggle className="h-9 w-9 shrink-0" />
475
503
  </div>
504
+ <SidebarFooterActions
505
+ feedback={feedbackButton}
506
+ translate={translateButton}
507
+ search={searchButton}
508
+ collapse={collapseButton}
509
+ className="px-0 py-0"
510
+ />
476
511
  </div>
477
512
  </div>
478
513
  );
@@ -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%;
@@ -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
+ Forms sidebar actions now keep search, language, feedback, and collapse controls together.
@@ -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.
@@ -124,7 +124,7 @@ export function DailyProgress({
124
124
  };
125
125
 
126
126
  return (
127
- <div className="relative overflow-hidden rounded-2xl border border-border bg-card p-4 sm:p-5">
127
+ <div className="relative overflow-hidden rounded-2xl bg-card p-4 sm:p-5">
128
128
  <div className="macros-summary-grid">
129
129
  {/* Left Side */}
130
130
  <div className="space-y-8 flex flex-col justify-center">
@@ -134,7 +134,7 @@ export function DailyProgress({
134
134
  {t("daily.summary")}
135
135
  </p>
136
136
  </div>
137
- <div className="px-3 py-1.5 rounded-full bg-muted/40 border border-border flex items-center">
137
+ <div className="px-3 py-1.5 rounded-full bg-muted/40 flex items-center">
138
138
  <span className="text-[10px] font-medium text-muted-foreground uppercase tracking-widest leading-none">
139
139
  {t("daily.goalWithValue", { value: goalCalories })}
140
140
  </span>
@@ -215,7 +215,7 @@ export function DailyProgress({
215
215
  ].map((m) => (
216
216
  <div
217
217
  key={m.label}
218
- className="p-2.5 sm:p-3 rounded-xl bg-muted/30 border border-border"
218
+ className="p-2.5 sm:p-3 rounded-xl bg-muted/30"
219
219
  >
220
220
  <p className="text-[10px] uppercase tracking-wider text-muted-foreground mb-1">
221
221
  {m.label}
@@ -230,14 +230,14 @@ export function DailyProgress({
230
230
  </div>
231
231
 
232
232
  {/* Right Side: Charts */}
233
- <div className="macros-summary-chart border-l border-border pl-8 flex-col justify-center transition-all duration-300">
233
+ <div className="macros-summary-chart flex-col justify-center transition-all duration-300">
234
234
  <Tabs
235
235
  value={activeChart}
236
236
  onValueChange={setActiveChart}
237
237
  className="flex flex-col space-y-6"
238
238
  >
239
239
  <div className="flex items-center justify-between">
240
- <TabsList className="bg-muted/40 border border-border h-8">
240
+ <TabsList className="bg-muted/40 h-8">
241
241
  <TabsTrigger
242
242
  value="weight"
243
243
  className="gap-2 text-[10px] uppercase tracking-wider h-6 px-3"
@@ -26,8 +26,8 @@ export function ExerciseCard({
26
26
  }: ExerciseCardProps) {
27
27
  const t = useT();
28
28
  return (
29
- <div className="group relative flex items-center gap-3 overflow-hidden rounded-xl border border-border bg-card p-3 hover:bg-accent/40 sm:gap-4 sm:p-4">
30
- <div className="flex items-center justify-center w-9 h-9 shrink-0 rounded-lg bg-orange-500/10 border border-orange-500/20">
29
+ <div className="group relative flex items-center gap-3 overflow-hidden rounded-xl bg-card p-3 hover:bg-accent/40 sm:gap-4 sm:p-4">
30
+ <div className="flex items-center justify-center w-9 h-9 shrink-0 rounded-lg bg-orange-500/10">
31
31
  <IconFlame className="h-4 w-4 text-orange-400" />
32
32
  </div>
33
33
  <div className="flex-1 min-w-0">
@@ -26,8 +26,8 @@ export function MealCard({
26
26
  }: MealCardProps) {
27
27
  const t = useT();
28
28
  return (
29
- <div className="group relative flex items-center gap-3 overflow-hidden rounded-xl border border-border bg-card p-3 hover:bg-accent/40 sm:gap-4 sm:p-4">
30
- <div className="flex items-center justify-center w-9 h-9 shrink-0 rounded-lg bg-emerald-500/10 border border-emerald-500/20">
29
+ <div className="group relative flex items-center gap-3 overflow-hidden rounded-xl bg-card p-3 hover:bg-accent/40 sm:gap-4 sm:p-4">
30
+ <div className="flex items-center justify-center w-9 h-9 shrink-0 rounded-lg bg-emerald-500/10">
31
31
  <IconToolsKitchen2 className="h-4 w-4 text-emerald-400" />
32
32
  </div>
33
33
  <div className="flex-1 min-w-0">
@@ -40,8 +40,8 @@ export function WeightCard({
40
40
  const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);
41
41
 
42
42
  return (
43
- <div className="group relative flex items-center gap-3 rounded-xl border border-border bg-card p-3 hover:bg-accent/40 sm:gap-4 sm:p-4">
44
- <div className="flex items-center justify-center w-9 h-9 shrink-0 rounded-lg bg-blue-500/10 border border-blue-500/20">
43
+ <div className="group relative flex items-center gap-3 rounded-xl bg-card p-3 hover:bg-accent/40 sm:gap-4 sm:p-4">
44
+ <div className="flex items-center justify-center w-9 h-9 shrink-0 rounded-lg bg-blue-500/10">
45
45
  <IconScale className="h-4 w-4 text-blue-400" />
46
46
  </div>
47
47
  <div className="flex-1 min-w-0">