@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
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  AgentSidebar,
3
3
  focusAgentChat,
4
+ isAgentChatHomeHandoffActive,
4
5
  navigateWithAgentChatViewTransition,
5
6
  useAgentChatHomeHandoff,
6
7
  useAgentChatHomeHandoffLinks,
@@ -65,6 +66,9 @@ export function Layout({ children }: LayoutProps) {
65
66
  activePath: location.pathname,
66
67
  enabled: !isCreateRoute,
67
68
  });
69
+ const chatHomeHandoffPending = isAgentChatHomeHandoffActive(
70
+ ASSETS_CHAT_STORAGE_KEY,
71
+ );
68
72
  useAgentChatHomeHandoffLinks({
69
73
  storageKey: ASSETS_CHAT_STORAGE_KEY,
70
74
  isChatPath: (pathname) => pathname === "/" || pathname.startsWith("/chat/"),
@@ -155,6 +159,7 @@ export function Layout({ children }: LayoutProps) {
155
159
  <AgentSidebar
156
160
  position="right"
157
161
  chatViewTransition
162
+ chatViewTransitionHandoff={chatHomeHandoffPending}
158
163
  storageKey={ASSETS_CHAT_STORAGE_KEY}
159
164
  browserTabId={getBrowserTabId()}
160
165
  openOnChatRunning={chatHomeHandoffActive}
@@ -6,11 +6,12 @@ import {
6
6
  } from "@agent-native/core/client/agent-chat";
7
7
  import { appPath } from "@agent-native/core/client/api-path";
8
8
  import { DevDatabaseLink } from "@agent-native/core/client/db-admin";
9
- import { ExtensionsSidebarSection } from "@agent-native/core/client/extensions";
10
9
  import { useActionQuery } from "@agent-native/core/client/hooks";
11
- import { useT } from "@agent-native/core/client/i18n";
10
+ import { LanguagePicker, useT } from "@agent-native/core/client/i18n";
11
+ import { openCommandMenu } from "@agent-native/core/client/navigation";
12
12
  import { OrgSwitcher } from "@agent-native/core/client/org";
13
13
  import { FeedbackButton } from "@agent-native/core/client/ui";
14
+ import { SidebarFooterActions } from "@agent-native/toolkit/app-shell";
14
15
  import {
15
16
  ChatHistoryRail,
16
17
  type ChatHistoryItem,
@@ -22,6 +23,7 @@ import {
22
23
  IconLayoutSidebarLeftExpand,
23
24
  IconLayoutGrid,
24
25
  IconPhotoPlus,
26
+ IconSearch,
25
27
  IconSettings,
26
28
  IconShare3,
27
29
  } from "@tabler/icons-react";
@@ -40,6 +42,9 @@ import { cn } from "@/lib/utils";
40
42
  const baseNavItems = [
41
43
  { icon: IconPhotoPlus, labelKey: "navigation.create", href: "/" },
42
44
  { icon: IconLayoutGrid, labelKey: "navigation.library", href: "/library" },
45
+ ];
46
+
47
+ const bottomNavItems = [
43
48
  { icon: IconHierarchy2, labelKey: "settings.agentTitle", href: "/agent" },
44
49
  { icon: IconSettings, labelKey: "navigation.settings", href: "/settings" },
45
50
  ];
@@ -116,7 +121,7 @@ function chatThreadPath(threadId: string) {
116
121
  return `/chat/${encodeURIComponent(threadId)}`;
117
122
  }
118
123
 
119
- function AssetsChatsSection() {
124
+ function AssetsChatsSection({ open }: { open: boolean }) {
120
125
  const navigate = useNavigate();
121
126
  const location = useLocation();
122
127
  const t = useT();
@@ -240,51 +245,57 @@ function AssetsChatsSection() {
240
245
  }
241
246
 
242
247
  return (
243
- <div className="mt-2 ms-4">
244
- <ChatHistoryRail
245
- items={chatItems}
246
- activeId={displayedActiveThreadId}
247
- onSelect={openThread}
248
- onNewChat={() => void handleNewChat()}
249
- railLabels={{
250
- newChat: t("chat.newChat"),
251
- showMore: t("chat.chats"),
252
- showLess: t("chat.chats"),
253
- }}
254
- previewCount={5}
255
- expandedCount={15}
256
- onTogglePin={(threadId) => {
257
- const thread = visibleThreads.find((item) => item.id === threadId);
258
- if (thread) void pinThread(threadId, !thread.pinnedAt);
259
- }}
260
- onRename={handleRenameThread}
261
- renameMaxLength={160}
262
- onDelete={(threadId) => void handleArchiveThread(threadId)}
263
- renderAdditionalRowActions={(item, closeMenu) => (
264
- <button
265
- type="button"
266
- role="menuitem"
267
- className="an-chat-history-row__menu-item"
268
- onClick={() => {
269
- closeMenu();
270
- void handleCopyShareLink(item.id);
271
- }}
272
- >
273
- <IconShare3 size={13} strokeWidth={1.8} />
274
- <span>{t("chat.copyShareLink")}</span>
275
- </button>
276
- )}
277
- labels={{
278
- options: (item) =>
279
- t("chat.optionsFor", { title: item.titleText ?? "" }),
280
- renameInput: (item) => `Rename ${item.titleText ?? ""}`,
281
- rename: t("chat.renameChat"),
282
- pin: t("chat.pinChat"),
283
- unpin: t("chat.unpinChat"),
284
- delete: t("chat.archiveChat"),
285
- }}
286
- className="min-w-0 [&_.an-chat-history-rail__new-chat]:justify-start"
287
- />
248
+ <div
249
+ className="an-chat-history-rail__collapse"
250
+ data-state={open ? "open" : "closed"}
251
+ aria-hidden={!open}
252
+ >
253
+ <div className="ms-4">
254
+ <ChatHistoryRail
255
+ items={chatItems}
256
+ activeId={displayedActiveThreadId}
257
+ onSelect={openThread}
258
+ onNewChat={() => void handleNewChat()}
259
+ railLabels={{
260
+ newChat: t("chat.newChat"),
261
+ showMore: t("chat.chats"),
262
+ showLess: t("chat.chats"),
263
+ }}
264
+ previewCount={5}
265
+ expandedCount={15}
266
+ onTogglePin={(threadId) => {
267
+ const thread = visibleThreads.find((item) => item.id === threadId);
268
+ if (thread) void pinThread(threadId, !thread.pinnedAt);
269
+ }}
270
+ onRename={handleRenameThread}
271
+ renameMaxLength={160}
272
+ onDelete={(threadId) => void handleArchiveThread(threadId)}
273
+ renderAdditionalRowActions={(item, closeMenu) => (
274
+ <button
275
+ type="button"
276
+ role="menuitem"
277
+ className="an-chat-history-row__menu-item"
278
+ onClick={() => {
279
+ closeMenu();
280
+ void handleCopyShareLink(item.id);
281
+ }}
282
+ >
283
+ <IconShare3 size={13} strokeWidth={1.8} />
284
+ <span>{t("chat.copyShareLink")}</span>
285
+ </button>
286
+ )}
287
+ labels={{
288
+ options: (item) =>
289
+ t("chat.optionsFor", { title: item.titleText ?? "" }),
290
+ renameInput: (item) => `Rename ${item.titleText ?? ""}`,
291
+ rename: t("chat.renameChat"),
292
+ pin: t("chat.pinChat"),
293
+ unpin: t("chat.unpinChat"),
294
+ delete: t("chat.archiveChat"),
295
+ }}
296
+ className="min-w-0 [&_.an-chat-history-rail__new-chat]:justify-start"
297
+ />
298
+ </div>
288
299
  </div>
289
300
  );
290
301
  }
@@ -319,6 +330,59 @@ export function Sidebar() {
319
330
  }
320
331
  }, [collapsed]);
321
332
 
333
+ const collapseButton = (
334
+ <Tooltip delayDuration={0}>
335
+ <TooltipTrigger asChild>
336
+ <button
337
+ type="button"
338
+ onClick={() => setCollapsed((value) => !value)}
339
+ className="flex size-8 items-center justify-center rounded-md text-muted-foreground hover:bg-sidebar-accent/50 hover:text-foreground"
340
+ aria-label={
341
+ collapsed
342
+ ? t("navigation.expandSidebar")
343
+ : t("navigation.collapseSidebar")
344
+ }
345
+ >
346
+ {collapsed ? (
347
+ <IconLayoutSidebarLeftExpand className="h-4 w-4 rtl:-scale-x-100" />
348
+ ) : (
349
+ <IconLayoutSidebarLeftCollapse className="h-4 w-4 rtl:-scale-x-100" />
350
+ )}
351
+ </button>
352
+ </TooltipTrigger>
353
+ <TooltipContent side="right">
354
+ {collapsed
355
+ ? t("navigation.expandSidebar")
356
+ : t("navigation.collapseSidebar")}
357
+ </TooltipContent>
358
+ </Tooltip>
359
+ );
360
+ const searchButton = (
361
+ <Tooltip delayDuration={0}>
362
+ <TooltipTrigger asChild>
363
+ <button
364
+ type="button"
365
+ onClick={openCommandMenu}
366
+ className="flex size-8 items-center justify-center rounded-md text-muted-foreground hover:bg-sidebar-accent/50 hover:text-foreground"
367
+ aria-label={t("root.commandSearch")}
368
+ >
369
+ <IconSearch className="h-4 w-4" />
370
+ </button>
371
+ </TooltipTrigger>
372
+ <TooltipContent side="right">{t("root.commandSearch")}</TooltipContent>
373
+ </Tooltip>
374
+ );
375
+ const translateButton = (
376
+ <LanguagePicker variant="ghost-icon" label={t("settings.languageLabel")} />
377
+ );
378
+ const feedbackButton = (
379
+ <FeedbackButton
380
+ variant={collapsed ? "icon" : "sidebar"}
381
+ side="right"
382
+ className={collapsed ? "h-8 w-8" : "min-w-0"}
383
+ />
384
+ );
385
+
322
386
  return (
323
387
  <aside
324
388
  className={cn(
@@ -351,30 +415,6 @@ export function Sidebar() {
351
415
  </span>
352
416
  </div>
353
417
  )}
354
- <Tooltip delayDuration={0}>
355
- <TooltipTrigger asChild>
356
- <button
357
- onClick={() => setCollapsed((c) => !c)}
358
- 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"
359
- aria-label={
360
- collapsed
361
- ? t("navigation.expandSidebar")
362
- : t("navigation.collapseSidebar")
363
- }
364
- >
365
- {collapsed ? (
366
- <IconLayoutSidebarLeftExpand className="h-4 w-4 rtl:-scale-x-100" />
367
- ) : (
368
- <IconLayoutSidebarLeftCollapse className="h-4 w-4 rtl:-scale-x-100" />
369
- )}
370
- </button>
371
- </TooltipTrigger>
372
- <TooltipContent side="right">
373
- {collapsed
374
- ? t("navigation.expandSidebar")
375
- : t("navigation.collapseSidebar")}
376
- </TooltipContent>
377
- </Tooltip>
378
418
  </div>
379
419
 
380
420
  <div className="flex min-h-0 flex-1 flex-col overflow-y-auto">
@@ -441,30 +481,72 @@ export function Sidebar() {
441
481
  <div key={item.href}>
442
482
  {link}
443
483
  {item.href === "/" && isCreateRoute ? (
444
- <AssetsChatsSection />
484
+ <AssetsChatsSection open />
445
485
  ) : null}
446
486
  </div>
447
487
  );
448
488
  })}
449
489
  </nav>
450
490
 
451
- {!collapsed && (
452
- <div className="mt-auto shrink-0">
453
- <div className="px-2 py-1">
454
- <ExtensionsSidebarSection />
455
- </div>
491
+ <div className="mt-auto shrink-0">
492
+ <nav
493
+ className={cn(
494
+ "grid gap-1",
495
+ collapsed ? "justify-items-center px-1.5 py-1" : "px-2 py-1",
496
+ )}
497
+ >
498
+ {bottomNavItems.map((item) => {
499
+ const Icon = item.icon;
500
+ const isActive = location.pathname.startsWith(item.href);
501
+ const link = (
502
+ <Link
503
+ to={item.href}
504
+ className={cn(
505
+ "flex items-center rounded-lg text-sm",
506
+ collapsed ? "h-9 w-9 justify-center" : "gap-3 px-3 py-2",
507
+ isActive
508
+ ? "bg-sidebar-accent text-sidebar-accent-foreground"
509
+ : "text-muted-foreground hover:bg-sidebar-accent/50 hover:text-foreground",
510
+ )}
511
+ aria-label={collapsed ? t(item.labelKey) : undefined}
512
+ >
513
+ <Icon className="h-4 w-4 shrink-0" />
514
+ {!collapsed && t(item.labelKey)}
515
+ </Link>
516
+ );
517
+ return collapsed ? (
518
+ <Tooltip key={item.href} delayDuration={0}>
519
+ <TooltipTrigger asChild>{link}</TooltipTrigger>
520
+ <TooltipContent side="right">
521
+ {t(item.labelKey)}
522
+ </TooltipContent>
523
+ </Tooltip>
524
+ ) : (
525
+ <div key={item.href}>{link}</div>
526
+ );
527
+ })}
528
+ </nav>
456
529
 
530
+ {!collapsed && (
457
531
  <div className="px-3 py-2">
458
532
  <OrgSwitcher />
459
533
  </div>
534
+ )}
460
535
 
461
- <div className="px-3 py-2 empty:hidden">
536
+ {!collapsed && (
537
+ <div className="px-3 py-2">
462
538
  <DevDatabaseLink />
463
- <FeedbackButton />
464
539
  </div>
465
- </div>
466
- )}
540
+ )}
541
+ </div>
467
542
  </div>
543
+ <SidebarFooterActions
544
+ collapsed={collapsed}
545
+ feedback={feedbackButton}
546
+ translate={translateButton}
547
+ search={searchButton}
548
+ collapse={collapseButton}
549
+ />
468
550
  </aside>
469
551
  );
470
552
  }
@@ -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%;
@@ -749,6 +749,7 @@ const enUS = {
749
749
  makeVariations: "Make variations",
750
750
  handoff: "Handoff",
751
751
  download: "Download",
752
+ downloadFailed: "Could not download asset.",
752
753
  copyUrl: "Copy URL",
753
754
  delete: "Delete",
754
755
  deleteTitle: "Delete asset?",
@@ -3229,6 +3230,7 @@ const assetDetailDeDE = {
3229
3230
  copiedUrl: "URL kopiert",
3230
3231
  copyFailed: "Konnte nicht in die Zwischenablage kopieren.",
3231
3232
  previewUnavailable: "Vorschau nicht verfügbar",
3233
+ downloadFailed: "Asset konnte nicht heruntergeladen werden.",
3232
3234
  } satisfies Partial<Messages["assetDetail"]>;
3233
3235
 
3234
3236
  const assetPickerDeDE = {
@@ -3339,6 +3341,7 @@ const assetDetailJaJP = {
3339
3341
  copiedUrl: "URL をコピーしました",
3340
3342
  copyFailed: "クリップボードにコピーできませんでした。",
3341
3343
  previewUnavailable: "プレビューを利用できません",
3344
+ downloadFailed: "アセットをダウンロードできませんでした。",
3342
3345
  } satisfies Partial<Messages["assetDetail"]>;
3343
3346
 
3344
3347
  const assetPickerJaJP = {
@@ -3444,6 +3447,7 @@ const assetDetailKoKR = {
3444
3447
  copiedUrl: "URL이 복사되었습니다",
3445
3448
  copyFailed: "클립보드에 복사할 수 없습니다.",
3446
3449
  previewUnavailable: "미리보기를 사용할 수 없습니다",
3450
+ downloadFailed: "자산을 다운로드할 수 없습니다.",
3447
3451
  } satisfies Partial<Messages["assetDetail"]>;
3448
3452
 
3449
3453
  const assetPickerKoKR = {
@@ -3548,6 +3552,7 @@ const assetDetailHiIN = {
3548
3552
  copiedUrl: "URL कॉपी हुआ",
3549
3553
  copyFailed: "Clipboard पर कॉपी नहीं कर सके।",
3550
3554
  previewUnavailable: "Preview उपलब्ध नहीं है",
3555
+ downloadFailed: "एसेट डाउनलोड नहीं किया जा सका।",
3551
3556
  } satisfies Partial<Messages["assetDetail"]>;
3552
3557
 
3553
3558
  const assetPickerHiIN = {
@@ -4041,6 +4046,7 @@ export const messagesByLocale = {
4041
4046
  deleteDescription:
4042
4047
  "这会从库中删除该资源。已使用此 URL 的现有导出可能会停止渲染。",
4043
4048
  deleteTitle: "删除资产?",
4049
+ downloadFailed: "无法下载资产。",
4044
4050
  loading: "正在加载资源...",
4045
4051
  makeVariations: "做出变化",
4046
4052
  makeVideoVariation: "制作视频变体",
@@ -4911,6 +4917,7 @@ export const messagesByLocale = {
4911
4917
  deleteDescription:
4912
4918
  "Esto elimina el activo de la biblioteca. Las exportaciones existentes que ya utilizan este URL pueden dejar de procesarse.",
4913
4919
  deleteTitle: "¿Eliminar activo?",
4920
+ downloadFailed: "No se pudo descargar el activo.",
4914
4921
  loading: "Cargando activo...",
4915
4922
  makeVariations: "hacer variaciones",
4916
4923
  makeVideoVariation: "Hacer variación de video",
@@ -5359,6 +5366,7 @@ export const messagesByLocale = {
5359
5366
  deleteDescription:
5360
5367
  "Cela supprime l'actif de la bibliothèque. Les exportations existantes qui utilisent déjà ce URL peuvent arrêter le rendu.",
5361
5368
  deleteTitle: "Supprimer l'élément ?",
5369
+ downloadFailed: "Impossible de télécharger l'élément.",
5362
5370
  loading: "Chargement de l'élément...",
5363
5371
  makeVariations: "Faire des variantes",
5364
5372
  makeVideoVariation: "Faire une variation vidéo",
@@ -6853,6 +6861,7 @@ export const messagesByLocale = {
6853
6861
  deleteDescription:
6854
6862
  "Isso remove o ativo da biblioteca. As exportações existentes que já usam este URL podem parar de renderizar.",
6855
6863
  deleteTitle: "Excluir recurso?",
6864
+ downloadFailed: "Não foi possível baixar o recurso.",
6856
6865
  loading: "Carregando recurso...",
6857
6866
  makeVariations: "Faça variações",
6858
6867
  makeVideoVariation: "Faça variação de vídeo",
@@ -7646,6 +7655,7 @@ export const messagesByLocale = {
7646
7655
  deleteDescription:
7647
7656
  "يؤدي هذا إلى إزالة الأصل من المكتبة. قد تتوقف عمليات التصدير الحالية التي تستخدم URL بالفعل عن العرض.",
7648
7657
  deleteTitle: "هل تريد حذف مادة العرض؟",
7658
+ downloadFailed: "تعذّر تنزيل الأصل.",
7649
7659
  loading: "جارٍ تحميل الأصل...",
7650
7660
  makeVariations: "قم بإجراء الاختلافات",
7651
7661
  makeVideoVariation: "جعل الاختلاف في الفيديو",
@@ -62,6 +62,10 @@ import {
62
62
  } from "react-router";
63
63
  import { toast } from "sonner";
64
64
 
65
+ import {
66
+ AssetPreviewDialog,
67
+ type PreviewAsset,
68
+ } from "@/components/asset/AssetPreviewDialog";
65
69
  import {
66
70
  AlertDialog,
67
71
  AlertDialogAction,
@@ -1508,6 +1512,7 @@ type LaneGalleryItem = {
1508
1512
  asset?: any;
1509
1513
  mediaType?: "image" | "video";
1510
1514
  href?: string;
1515
+ onOpen?: () => void;
1511
1516
  selected?: boolean;
1512
1517
  busy?: boolean;
1513
1518
  showBusyOverlay?: boolean;
@@ -2105,6 +2110,7 @@ function AssetSwimlaneBoard({
2105
2110
  }) {
2106
2111
  const t = useT();
2107
2112
  const [bulkContextOpen, setBulkContextOpen] = useState(false);
2113
+ const [previewAsset, setPreviewAsset] = useState<any | null>(null);
2108
2114
  const deleteAsset = useActionMutation("delete-asset");
2109
2115
  const deleteAssets = useActionMutation("delete-assets");
2110
2116
  const updateAsset = useActionMutation("update-asset");
@@ -2367,6 +2373,7 @@ function AssetSwimlaneBoard({
2367
2373
  status: isReference ? t("library.reference") : t("library.saved"),
2368
2374
  mediaType: asset.mediaType === "video" ? "video" : "image",
2369
2375
  href: `/asset/${asset.id}`,
2376
+ onOpen: () => setPreviewAsset(asset),
2370
2377
  selected: selectedIds.has(asset.id),
2371
2378
  deleting: deletingIds.has(asset.id),
2372
2379
  busy,
@@ -2382,6 +2389,7 @@ function AssetSwimlaneBoard({
2382
2389
  onDelete={() => confirmDelete([asset.id])}
2383
2390
  onMoveToReferences={onMoveToReferences}
2384
2391
  onRemoveFromReferences={onRemoveFromReferences}
2392
+ onOpenPreview={() => setPreviewAsset(asset)}
2385
2393
  />
2386
2394
  ),
2387
2395
  primaryActions:
@@ -2753,6 +2761,12 @@ function AssetSwimlaneBoard({
2753
2761
  }
2754
2762
  />
2755
2763
  )}
2764
+
2765
+ <AssetPreviewDialog
2766
+ asset={previewAsset}
2767
+ assets={boardAssets as PreviewAsset[]}
2768
+ onAssetChange={setPreviewAsset}
2769
+ />
2756
2770
  </>
2757
2771
  );
2758
2772
  }
@@ -2933,7 +2947,15 @@ function AssetCardsView({ items }: { items: LaneGalleryItem[] }) {
2933
2947
  aria-busy={item.busy}
2934
2948
  >
2935
2949
  <div className="relative aspect-4/3 bg-muted/30">
2936
- {item.href ? (
2950
+ {item.onOpen ? (
2951
+ <button
2952
+ type="button"
2953
+ onClick={item.onOpen}
2954
+ className="block h-full w-full text-left"
2955
+ >
2956
+ {item.thumbnail}
2957
+ </button>
2958
+ ) : item.href ? (
2937
2959
  <Link to={item.href} className="block h-full w-full">
2938
2960
  {item.thumbnail}
2939
2961
  </Link>
@@ -3075,7 +3097,15 @@ function SwimLane({
3075
3097
  aria-busy={activeItem?.busy}
3076
3098
  >
3077
3099
  <div className="aspect-16/10 bg-muted/30">
3078
- {activeItem?.href ? (
3100
+ {activeItem?.onOpen ? (
3101
+ <button
3102
+ type="button"
3103
+ onClick={activeItem.onOpen}
3104
+ className="block h-full w-full text-left"
3105
+ >
3106
+ {activeItem.preview}
3107
+ </button>
3108
+ ) : activeItem?.href ? (
3079
3109
  <Link
3080
3110
  to={activeItem.href}
3081
3111
  className="block h-full w-full"
@@ -3198,7 +3228,16 @@ function SwimLane({
3198
3228
  ) : null}
3199
3229
  </div>
3200
3230
  <div className="flex shrink-0 items-center gap-2">
3201
- {activeItem?.href ? (
3231
+ {activeItem?.onOpen ? (
3232
+ <Button
3233
+ variant="outline"
3234
+ size="sm"
3235
+ className="flex-1"
3236
+ onClick={activeItem.onOpen}
3237
+ >
3238
+ {t("brandKitDetail.open")}
3239
+ </Button>
3240
+ ) : activeItem?.href ? (
3202
3241
  <Button asChild variant="outline" size="sm" className="flex-1">
3203
3242
  <Link to={activeItem.href}>{t("brandKitDetail.open")}</Link>
3204
3243
  </Button>
@@ -3303,6 +3342,7 @@ function AssetActionsMenu({
3303
3342
  onDelete,
3304
3343
  onMoveToReferences,
3305
3344
  onRemoveFromReferences,
3345
+ onOpenPreview,
3306
3346
  }: {
3307
3347
  asset: any;
3308
3348
  folders: any[];
@@ -3311,6 +3351,7 @@ function AssetActionsMenu({
3311
3351
  onDelete: () => void;
3312
3352
  onMoveToReferences?: () => void;
3313
3353
  onRemoveFromReferences?: () => void;
3354
+ onOpenPreview?: () => void;
3314
3355
  }) {
3315
3356
  const t = useT();
3316
3357
  const [contextOpen, setContextOpen] = useState(false);
@@ -3330,12 +3371,24 @@ function AssetActionsMenu({
3330
3371
  </Button>
3331
3372
  </DropdownMenuTrigger>
3332
3373
  <DropdownMenuContent align="end">
3333
- <DropdownMenuItem asChild>
3334
- <Link to={`/asset/${asset.id}`}>
3374
+ {onOpenPreview ? (
3375
+ <DropdownMenuItem
3376
+ onSelect={(event) => {
3377
+ event.preventDefault();
3378
+ onOpenPreview();
3379
+ }}
3380
+ >
3335
3381
  <IconArrowUpRight className="mr-2 h-4 w-4 shrink-0" />
3336
3382
  {t("library.viewDetails")}
3337
- </Link>
3338
- </DropdownMenuItem>
3383
+ </DropdownMenuItem>
3384
+ ) : (
3385
+ <DropdownMenuItem asChild>
3386
+ <Link to={`/asset/${asset.id}`}>
3387
+ <IconArrowUpRight className="mr-2 h-4 w-4 shrink-0" />
3388
+ {t("library.viewDetails")}
3389
+ </Link>
3390
+ </DropdownMenuItem>
3391
+ )}
3339
3392
  <DropdownMenuItem
3340
3393
  onSelect={(event) => {
3341
3394
  event.preventDefault();
@@ -3925,6 +3978,7 @@ export function LiveCandidatesStage({
3925
3978
  status: "draft",
3926
3979
  mediaType: asset.mediaType === "video" ? "video" : "image",
3927
3980
  href: `/asset/${asset.id}`,
3981
+ onOpen: () => setPreviewAsset(asset),
3928
3982
  busy,
3929
3983
  preview: <AssetPreview asset={asset} fit="contain" />, // i18n-ignore structural preview slot name
3930
3984
  thumbnail: <AssetPreview asset={asset} />,
@@ -3946,6 +4000,7 @@ export function LiveCandidatesStage({
3946
4000
  };
3947
4001
  }
3948
4002
 
4003
+ const [previewAsset, setPreviewAsset] = useState(null as any);
3949
4004
  const items = [...slots.map(slotItem), ...draftAssets.map(draftItem)];
3950
4005
  const itemIds = items.map((item) => item.id).join("\n");
3951
4006
  const activeItem =
@@ -4032,7 +4087,15 @@ export function LiveCandidatesStage({
4032
4087
  aria-busy={activeItem?.busy}
4033
4088
  >
4034
4089
  <div className="h-36 bg-muted/30 sm:h-44 lg:h-56 2xl:h-64">
4035
- {activeItem?.href ? (
4090
+ {activeItem?.onOpen ? (
4091
+ <button
4092
+ type="button"
4093
+ onClick={activeItem.onOpen}
4094
+ className="block h-full w-full text-left"
4095
+ >
4096
+ {activeItem.preview}
4097
+ </button>
4098
+ ) : activeItem?.href ? (
4036
4099
  <Link to={activeItem.href} className="block h-full w-full">
4037
4100
  {activeItem.preview}
4038
4101
  </Link>
@@ -4045,7 +4108,17 @@ export function LiveCandidatesStage({
4045
4108
  <Spinner className="h-5 w-5" />
4046
4109
  </div>
4047
4110
  ) : null}
4048
- {activeItem?.href ? (
4111
+ {activeItem?.onOpen ? (
4112
+ <Button
4113
+ variant="secondary"
4114
+ size="sm"
4115
+ className="absolute right-2 top-2 h-8 gap-1.5 bg-background/85 px-2.5 text-xs opacity-0 shadow-sm backdrop-blur transition group-hover:opacity-100 focus-within:opacity-100"
4116
+ onClick={activeItem.onOpen}
4117
+ >
4118
+ <IconArrowUpRight className="h-3.5 w-3.5" />
4119
+ {t("library.details")}
4120
+ </Button>
4121
+ ) : activeItem?.href ? (
4049
4122
  <Button
4050
4123
  asChild
4051
4124
  variant="secondary"
@@ -4119,7 +4192,17 @@ export function LiveCandidatesStage({
4119
4192
  <div>{activeItem.primaryActions}</div>
4120
4193
  ) : null}
4121
4194
  </div>
4122
- {activeItem?.href ? (
4195
+ {activeItem?.onOpen ? (
4196
+ <Button
4197
+ variant="ghost"
4198
+ size="sm"
4199
+ className="gap-1.5"
4200
+ onClick={activeItem.onOpen}
4201
+ >
4202
+ <IconArrowUpRight className="h-3.5 w-3.5" />
4203
+ {t("library.openDetails")}
4204
+ </Button>
4205
+ ) : activeItem?.href ? (
4123
4206
  <Button asChild variant="ghost" size="sm" className="gap-1.5">
4124
4207
  <Link to={activeItem.href}>
4125
4208
  <IconArrowUpRight className="h-3.5 w-3.5" />
@@ -4130,6 +4213,12 @@ export function LiveCandidatesStage({
4130
4213
  </aside>
4131
4214
  </div>
4132
4215
  </section>
4216
+
4217
+ <AssetPreviewDialog
4218
+ asset={previewAsset}
4219
+ assets={draftAssets as PreviewAsset[]}
4220
+ onAssetChange={setPreviewAsset}
4221
+ />
4133
4222
  </>
4134
4223
  );
4135
4224
  }
@@ -1,4 +1,4 @@
1
- import { ExtensionsListPage } from "@agent-native/core/client/extensions";
1
+ import { Navigate } from "react-router";
2
2
 
3
3
  import { messagesByLocale } from "@/i18n-data";
4
4
 
@@ -7,5 +7,5 @@ export function meta() {
7
7
  }
8
8
 
9
9
  export default function ExtensionsRoute() {
10
- return <ExtensionsListPage />;
10
+ return <Navigate to="/settings#extensions" replace />;
11
11
  }