@agent-native/core 0.92.0 → 0.92.1

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 (363) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/core/CHANGELOG.md +14 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/application-state/store.ts +12 -1
  5. package/corpus/core/src/client/AssistantChat.tsx +27 -14
  6. package/corpus/core/src/client/PoweredByBadge.tsx +1 -8
  7. package/corpus/core/src/client/agent-chat-adapter.ts +37 -10
  8. package/corpus/core/src/client/chat/widgets/DataTableWidget.tsx +52 -1
  9. package/corpus/core/src/client/db-admin/TableEditor.tsx +49 -0
  10. package/corpus/core/src/client/db-admin/export-utils.ts +13 -4
  11. package/corpus/core/src/client/db-admin/useAgentSync.ts +72 -0
  12. package/corpus/core/src/client/error-capture.ts +69 -7
  13. package/corpus/core/src/client/extensions/EmbeddedExtension.tsx +5 -1
  14. package/corpus/core/src/client/extensions/ExtensionViewer.tsx +53 -8
  15. package/corpus/core/src/client/extensions/InlineExtensionFrame.tsx +5 -1
  16. package/corpus/core/src/client/extensions/portable-extension.ts +1 -0
  17. package/corpus/core/src/client/org/OrgSwitcher.tsx +12 -9
  18. package/corpus/core/src/client/org/TeamPage.tsx +77 -71
  19. package/corpus/core/src/client/settings/SettingsPanel.tsx +205 -52
  20. package/corpus/core/src/client/settings/SettingsSection.tsx +8 -1
  21. package/corpus/core/src/client/settings/SettingsTabsPage.tsx +25 -9
  22. package/corpus/core/src/db-admin/agent-tools.ts +8 -2
  23. package/corpus/core/src/db-admin/operations.ts +116 -4
  24. package/corpus/core/src/db-admin/routes.ts +1 -0
  25. package/corpus/core/src/db-admin/types.ts +4 -0
  26. package/corpus/core/src/extensions/html-shell.ts +5 -4
  27. package/corpus/core/src/extensions/routes.ts +10 -0
  28. package/corpus/core/src/navigation/index.ts +1 -1
  29. package/corpus/core/src/resources/handlers.ts +10 -8
  30. package/corpus/core/src/server/poll.ts +293 -8
  31. package/corpus/core/src/styles/agent-native.css +27 -0
  32. package/corpus/core/src/templates/default/.agents/skills/actions/SKILL.md +5 -0
  33. package/corpus/core/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  34. package/corpus/core/src/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
  35. package/corpus/core/src/templates/default/.agents/skills/security/SKILL.md +7 -0
  36. package/corpus/core/src/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
  37. package/corpus/core/src/templates/default/AGENTS.md +4 -2
  38. package/corpus/core/src/templates/headless/AGENTS.md +4 -0
  39. package/corpus/core/src/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
  40. package/corpus/core/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  41. package/corpus/core/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
  42. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
  43. package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
  44. package/corpus/core/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
  45. package/corpus/core/src/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
  46. package/corpus/core/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
  47. package/corpus/core/src/templates/workspace-core/AGENTS.md +7 -1
  48. package/corpus/core/src/templates/workspace-root/AGENTS.md +7 -1
  49. package/corpus/templates/analytics/.agents/skills/actions/SKILL.md +5 -0
  50. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +10 -0
  51. package/corpus/templates/analytics/.agents/skills/real-time-sync/SKILL.md +1 -1
  52. package/corpus/templates/analytics/.agents/skills/security/SKILL.md +7 -0
  53. package/corpus/templates/analytics/.agents/skills/storing-data/SKILL.md +5 -1
  54. package/corpus/templates/analytics/AGENTS.md +33 -14
  55. package/corpus/templates/analytics/actions/capture-test-error.ts +4 -0
  56. package/corpus/templates/analytics/actions/get-analytics-alert-rule-defaults.ts +23 -0
  57. package/corpus/templates/analytics/actions/get-error-issue.ts +1 -1
  58. package/corpus/templates/analytics/actions/list-analysis-revisions.ts +40 -0
  59. package/corpus/templates/analytics/actions/list-dashboard-revisions.ts +40 -0
  60. package/corpus/templates/analytics/actions/list-dashboard-usage-stats.ts +299 -0
  61. package/corpus/templates/analytics/actions/navigate.ts +4 -2
  62. package/corpus/templates/analytics/actions/restore-analysis-revision.ts +43 -0
  63. package/corpus/templates/analytics/actions/restore-dashboard-revision.ts +68 -0
  64. package/corpus/templates/analytics/actions/save-analytics-alert-rule.ts +14 -0
  65. package/corpus/templates/analytics/actions/save-monitor.ts +1 -1
  66. package/corpus/templates/analytics/actions/view-screen.ts +24 -0
  67. package/corpus/templates/analytics/app/components/analysis/AnalysisHistoryPanel.tsx +181 -0
  68. package/corpus/templates/analytics/app/components/dashboard/DashboardHistoryPanel.tsx +184 -0
  69. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +22 -16
  70. package/corpus/templates/analytics/app/components/layout/Header.tsx +1 -1
  71. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +27 -21
  72. package/corpus/templates/analytics/app/hooks/use-analysis-revisions.ts +43 -0
  73. package/corpus/templates/analytics/app/hooks/use-dashboard-chat-context.ts +110 -0
  74. package/corpus/templates/analytics/app/hooks/use-dashboard-revisions.ts +43 -0
  75. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +8 -3
  76. package/corpus/templates/analytics/app/i18n/zh-TW.ts +64 -2
  77. package/corpus/templates/analytics/app/i18n-data.ts +783 -3
  78. package/corpus/templates/analytics/app/pages/Agents.tsx +359 -19
  79. package/corpus/templates/analytics/app/pages/Settings.tsx +3 -2
  80. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +34 -1
  81. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +28 -0
  82. package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +18 -1
  83. package/corpus/templates/analytics/app/pages/monitoring/ErrorsPanel.tsx +7 -10
  84. package/corpus/templates/analytics/app/pages/monitoring/errors/IssueDetail.tsx +479 -23
  85. package/corpus/templates/analytics/app/pages/monitoring/errors/IssueList.tsx +0 -9
  86. package/corpus/templates/analytics/app/pages/monitoring/errors/i18n.ts +11 -0
  87. package/corpus/templates/analytics/app/pages/monitoring/errors/types.ts +9 -1
  88. package/corpus/templates/analytics/app/pages/monitoring/uptime/MonitorFormPage.tsx +6 -3
  89. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +26 -30
  90. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +9 -99
  91. package/corpus/templates/analytics/app/pages/settings/AlertRulesSettingsCard.tsx +262 -104
  92. package/corpus/templates/analytics/app/routes/team.tsx +1 -1
  93. package/corpus/templates/analytics/changelog/2026-07-08-admins-can-audit-dashboard-usage-ownership-and-cleanup-signa.md +6 -0
  94. package/corpus/templates/analytics/changelog/2026-07-08-agent-monitoring-stays-available-to-non-admins.md +6 -0
  95. package/corpus/templates/analytics/changelog/2026-07-08-alert-rules-are-easier-to-scan-expand-and-edit-from-settings.md +6 -0
  96. package/corpus/templates/analytics/changelog/2026-07-08-analytics-alert-forms-remember-last-email-recipients.md +6 -0
  97. package/corpus/templates/analytics/changelog/2026-07-08-analytics-alert-rules-can-now-use-per-rule-slack-and-webhook.md +6 -0
  98. package/corpus/templates/analytics/changelog/2026-07-08-dashboard-history-and-chat-context.md +5 -0
  99. package/corpus/templates/analytics/changelog/2026-07-08-dashboard-usage-now-counts-explorer-dashboard-traffic.md +6 -0
  100. package/corpus/templates/analytics/changelog/2026-07-08-demo-mode-session-emails-are-filtered-and-anonymized.md +6 -0
  101. package/corpus/templates/analytics/changelog/2026-07-08-error-issue-detail-adds-stack-traces-and-frequency-bars.md +6 -0
  102. package/corpus/templates/analytics/changelog/2026-07-08-error-issue-detail-now-shows-the-latest-occurrence-message-a.md +6 -0
  103. package/corpus/templates/analytics/changelog/2026-07-08-monitoring-errors-only-show-test-action-when-empty.md +6 -0
  104. package/corpus/templates/analytics/changelog/2026-07-08-production-session-replay-now-requires-private-blob-storage-.md +6 -0
  105. package/corpus/templates/analytics/changelog/2026-07-08-shared-extension-links-now-show-a-clear-message-when-you-do-.md +6 -0
  106. package/corpus/templates/analytics/changelog/2026-07-08-team-settings-show-access-controls-next-to-member-lists.md +6 -0
  107. package/corpus/templates/analytics/changelog/2026-07-08-uptime-monitors-now-use-a-10-second-request-timeout-by-defau.md +6 -0
  108. package/corpus/templates/analytics/server/db/schema-monitoring.ts +1 -1
  109. package/corpus/templates/analytics/server/db/schema.ts +56 -0
  110. package/corpus/templates/analytics/server/lib/analytics-alerts.ts +92 -0
  111. package/corpus/templates/analytics/server/lib/dashboards-store.ts +334 -5
  112. package/corpus/templates/analytics/server/lib/error-capture.ts +231 -36
  113. package/corpus/templates/analytics/server/lib/session-replay.ts +114 -8
  114. package/corpus/templates/analytics/server/lib/uptime-monitors.ts +5 -4
  115. package/corpus/templates/analytics/server/plugins/db.ts +112 -2
  116. package/corpus/templates/analytics/server/routes/api/dashboard-agent-context.json.get.ts +1 -0
  117. package/corpus/templates/assets/.agents/skills/actions/SKILL.md +5 -0
  118. package/corpus/templates/assets/.agents/skills/real-time-sync/SKILL.md +1 -1
  119. package/corpus/templates/assets/.agents/skills/security/SKILL.md +7 -0
  120. package/corpus/templates/assets/.agents/skills/storing-data/SKILL.md +5 -1
  121. package/corpus/templates/assets/AGENTS.md +4 -0
  122. package/corpus/templates/assets/app/routes/settings.tsx +1 -1
  123. package/corpus/templates/assets/app/routes/team.tsx +1 -1
  124. package/corpus/templates/brain/.agents/skills/actions/SKILL.md +5 -0
  125. package/corpus/templates/brain/.agents/skills/adding-a-feature/SKILL.md +5 -0
  126. package/corpus/templates/brain/.agents/skills/real-time-sync/SKILL.md +1 -1
  127. package/corpus/templates/brain/.agents/skills/security/SKILL.md +7 -0
  128. package/corpus/templates/brain/AGENTS.md +4 -0
  129. package/corpus/templates/brain/app/routes/team.tsx +1 -1
  130. package/corpus/templates/calendar/.agents/skills/actions/SKILL.md +5 -0
  131. package/corpus/templates/calendar/.agents/skills/real-time-sync/SKILL.md +1 -1
  132. package/corpus/templates/calendar/.agents/skills/security/SKILL.md +7 -0
  133. package/corpus/templates/calendar/.agents/skills/storing-data/SKILL.md +5 -1
  134. package/corpus/templates/calendar/AGENTS.md +4 -0
  135. package/corpus/templates/calendar/app/components/calendar/DayView.tsx +11 -2
  136. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +21 -8
  137. package/corpus/templates/calendar/app/components/calendar/MonthView.tsx +7 -1
  138. package/corpus/templates/calendar/app/components/calendar/WeekView.tsx +11 -2
  139. package/corpus/templates/calendar/app/lib/popover-click-guard.ts +48 -4
  140. package/corpus/templates/calendar/app/pages/Settings.tsx +1 -1
  141. package/corpus/templates/calendar/app/routes/_app.team.tsx +1 -1
  142. package/corpus/templates/calendar/changelog/2026-07-08-clicking-empty-calendar-space-closes-an-open-event-popover-b.md +6 -0
  143. package/corpus/templates/chat/.agents/skills/actions/SKILL.md +5 -0
  144. package/corpus/templates/chat/.agents/skills/adding-a-feature/SKILL.md +5 -0
  145. package/corpus/templates/chat/.agents/skills/real-time-sync/SKILL.md +1 -1
  146. package/corpus/templates/chat/.agents/skills/security/SKILL.md +7 -0
  147. package/corpus/templates/chat/AGENTS.md +4 -0
  148. package/corpus/templates/chat/app/hooks/use-navigation-state.ts +1 -1
  149. package/corpus/templates/chat/app/routes/settings.tsx +2 -2
  150. package/corpus/templates/chat/app/routes/team.tsx +1 -1
  151. package/corpus/templates/clips/.agents/skills/actions/SKILL.md +5 -0
  152. package/corpus/templates/clips/.agents/skills/security/SKILL.md +7 -0
  153. package/corpus/templates/clips/AGENTS.md +4 -0
  154. package/corpus/templates/clips/actions/finalize-recording.ts +9 -3
  155. package/corpus/templates/clips/actions/set-thumbnail.ts +11 -2
  156. package/corpus/templates/clips/app/components/meetings/canvas-editor.tsx +1 -7
  157. package/corpus/templates/clips/app/components/player/player-controls.tsx +21 -13
  158. package/corpus/templates/clips/app/components/player/video-player.tsx +30 -75
  159. package/corpus/templates/clips/app/i18n/ar-SA.ts +6 -5
  160. package/corpus/templates/clips/app/i18n/de-DE.ts +6 -6
  161. package/corpus/templates/clips/app/i18n/en-US.ts +6 -5
  162. package/corpus/templates/clips/app/i18n/es-ES.ts +6 -5
  163. package/corpus/templates/clips/app/i18n/fr-FR.ts +6 -6
  164. package/corpus/templates/clips/app/i18n/hi-IN.ts +6 -5
  165. package/corpus/templates/clips/app/i18n/ja-JP.ts +6 -5
  166. package/corpus/templates/clips/app/i18n/ko-KR.ts +6 -5
  167. package/corpus/templates/clips/app/i18n/pt-BR.ts +6 -5
  168. package/corpus/templates/clips/app/i18n/zh-CN.ts +6 -5
  169. package/corpus/templates/clips/app/i18n/zh-TW.ts +6 -5
  170. package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +51 -118
  171. package/corpus/templates/clips/changelog/2026-07-08-hosted-clip-uploads-now-clear-failed-buffered-chunks.md +6 -0
  172. package/corpus/templates/clips/changelog/2026-07-08-hosted-recording-uploads-now-avoid-sql-chunk-storage.md +6 -0
  173. package/corpus/templates/clips/changelog/2026-07-08-meeting-recaps-now-keep-summaries-action-items-and-transcrip.md +6 -0
  174. package/corpus/templates/clips/changelog/2026-07-08-video-playback-controls-now-match-loom-style-5-second-skips-.md +6 -0
  175. package/corpus/templates/clips/server/lib/recording-upload-state.ts +63 -0
  176. package/corpus/templates/clips/server/lib/video-storage.ts +4 -0
  177. package/corpus/templates/clips/server/routes/api/recordings/[recordingId]/thumbnail.post.ts +19 -13
  178. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +40 -1
  179. package/corpus/templates/content/.agents/skills/actions/SKILL.md +5 -0
  180. package/corpus/templates/content/.agents/skills/real-time-sync/SKILL.md +1 -1
  181. package/corpus/templates/content/.agents/skills/security/SKILL.md +7 -0
  182. package/corpus/templates/content/.agents/skills/storing-data/SKILL.md +5 -1
  183. package/corpus/templates/content/AGENTS.md +4 -0
  184. package/corpus/templates/content/app/routes/_app.settings.tsx +2 -2
  185. package/corpus/templates/content/app/routes/_app.team.tsx +1 -1
  186. package/corpus/templates/design/.agents/skills/actions/SKILL.md +5 -0
  187. package/corpus/templates/design/.agents/skills/security/SKILL.md +7 -0
  188. package/corpus/templates/design/AGENTS.md +4 -0
  189. package/corpus/templates/design/actions/take-design-screenshot.ts +12 -9
  190. package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +57 -13
  191. package/corpus/templates/design/app/routes/team.tsx +1 -1
  192. package/corpus/templates/design/changelog/2026-07-08-local-images-added-to-designs-now-upload-to-file-storage-ins.md +6 -0
  193. package/corpus/templates/dispatch/.agents/skills/actions/SKILL.md +5 -0
  194. package/corpus/templates/dispatch/.agents/skills/security/SKILL.md +7 -0
  195. package/corpus/templates/dispatch/AGENTS.md +4 -0
  196. package/corpus/templates/dispatch/app/hooks/use-navigation-state.ts +1 -1
  197. package/corpus/templates/dispatch/app/routes/settings.tsx +2 -2
  198. package/corpus/templates/dispatch/app/routes/team.tsx +1 -1
  199. package/corpus/templates/forms/.agents/skills/actions/SKILL.md +5 -0
  200. package/corpus/templates/forms/.agents/skills/real-time-sync/SKILL.md +1 -1
  201. package/corpus/templates/forms/.agents/skills/security/SKILL.md +7 -0
  202. package/corpus/templates/forms/.agents/skills/storing-data/SKILL.md +5 -1
  203. package/corpus/templates/forms/AGENTS.md +4 -0
  204. package/corpus/templates/forms/app/routes/_app.settings.tsx +2 -2
  205. package/corpus/templates/forms/app/routes/_app.team.tsx +1 -1
  206. package/corpus/templates/forms/shared/navigation.ts +1 -1
  207. package/corpus/templates/macros/.agents/skills/security/SKILL.md +7 -0
  208. package/corpus/templates/macros/AGENTS.md +4 -0
  209. package/corpus/templates/macros/app/routes/settings.tsx +2 -2
  210. package/corpus/templates/macros/app/routes/team.tsx +1 -1
  211. package/corpus/templates/mail/.agents/skills/actions/SKILL.md +5 -0
  212. package/corpus/templates/mail/.agents/skills/email-drafts/SKILL.md +1 -1
  213. package/corpus/templates/mail/.agents/skills/real-time-sync/SKILL.md +1 -1
  214. package/corpus/templates/mail/.agents/skills/security/SKILL.md +7 -0
  215. package/corpus/templates/mail/.agents/skills/storing-data/SKILL.md +5 -1
  216. package/corpus/templates/mail/AGENTS.md +4 -0
  217. package/corpus/templates/mail/changelog/2026-07-08-mail-attachments-in-hosted-environments-now-require-file-sto.md +6 -0
  218. package/corpus/templates/mail/server/handlers/media.ts +26 -1
  219. package/corpus/templates/mail/server/lib/outgoing-email.ts +24 -1
  220. package/corpus/templates/mail/server/lib/upload-store.ts +2 -1
  221. package/corpus/templates/plan/.agents/skills/actions/SKILL.md +5 -0
  222. package/corpus/templates/plan/.agents/skills/adding-a-feature/SKILL.md +5 -0
  223. package/corpus/templates/plan/.agents/skills/real-time-sync/SKILL.md +1 -1
  224. package/corpus/templates/plan/.agents/skills/security/SKILL.md +7 -0
  225. package/corpus/templates/plan/AGENTS.md +4 -0
  226. package/corpus/templates/plan/app/hooks/use-navigation-state.ts +1 -1
  227. package/corpus/templates/plan/app/routes/settings.tsx +2 -2
  228. package/corpus/templates/plan/app/routes/team.tsx +1 -1
  229. package/corpus/templates/plan/changelog/2026-07-08-hosted-plan-images-now-require-connected-storage.md +6 -0
  230. package/corpus/templates/plan/server/lib/plan-assets.ts +33 -4
  231. package/corpus/templates/slides/.agents/skills/actions/SKILL.md +5 -0
  232. package/corpus/templates/slides/.agents/skills/security/SKILL.md +7 -0
  233. package/corpus/templates/slides/AGENTS.md +4 -0
  234. package/corpus/templates/slides/actions/generate-image-api.ts +15 -3
  235. package/corpus/templates/slides/app/routes/settings.tsx +2 -2
  236. package/corpus/templates/slides/app/routes/team.tsx +1 -1
  237. package/corpus/templates/slides/changelog/2026-07-08-generated-slide-images-now-return-hosted-file-storage-urls-i.md +6 -0
  238. package/corpus/templates/slides/shared/api.ts +1 -1
  239. package/dist/application-state/store.d.ts.map +1 -1
  240. package/dist/application-state/store.js +8 -2
  241. package/dist/application-state/store.js.map +1 -1
  242. package/dist/client/AssistantChat.d.ts.map +1 -1
  243. package/dist/client/AssistantChat.js +24 -13
  244. package/dist/client/AssistantChat.js.map +1 -1
  245. package/dist/client/PoweredByBadge.d.ts +1 -1
  246. package/dist/client/PoweredByBadge.d.ts.map +1 -1
  247. package/dist/client/PoweredByBadge.js +3 -9
  248. package/dist/client/PoweredByBadge.js.map +1 -1
  249. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  250. package/dist/client/agent-chat-adapter.js +28 -9
  251. package/dist/client/agent-chat-adapter.js.map +1 -1
  252. package/dist/client/chat/widgets/DataTableWidget.d.ts.map +1 -1
  253. package/dist/client/chat/widgets/DataTableWidget.js +19 -2
  254. package/dist/client/chat/widgets/DataTableWidget.js.map +1 -1
  255. package/dist/client/db-admin/TableEditor.d.ts.map +1 -1
  256. package/dist/client/db-admin/TableEditor.js +19 -2
  257. package/dist/client/db-admin/TableEditor.js.map +1 -1
  258. package/dist/client/db-admin/export-utils.d.ts +2 -0
  259. package/dist/client/db-admin/export-utils.d.ts.map +1 -1
  260. package/dist/client/db-admin/export-utils.js +11 -3
  261. package/dist/client/db-admin/export-utils.js.map +1 -1
  262. package/dist/client/db-admin/useAgentSync.d.ts.map +1 -1
  263. package/dist/client/db-admin/useAgentSync.js +63 -0
  264. package/dist/client/db-admin/useAgentSync.js.map +1 -1
  265. package/dist/client/error-capture.d.ts.map +1 -1
  266. package/dist/client/error-capture.js +41 -7
  267. package/dist/client/error-capture.js.map +1 -1
  268. package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -1
  269. package/dist/client/extensions/EmbeddedExtension.js +3 -1
  270. package/dist/client/extensions/EmbeddedExtension.js.map +1 -1
  271. package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
  272. package/dist/client/extensions/ExtensionViewer.js +32 -5
  273. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  274. package/dist/client/extensions/InlineExtensionFrame.d.ts.map +1 -1
  275. package/dist/client/extensions/InlineExtensionFrame.js +3 -1
  276. package/dist/client/extensions/InlineExtensionFrame.js.map +1 -1
  277. package/dist/client/extensions/portable-extension.d.ts.map +1 -1
  278. package/dist/client/extensions/portable-extension.js +1 -0
  279. package/dist/client/extensions/portable-extension.js.map +1 -1
  280. package/dist/client/org/OrgSwitcher.d.ts +1 -1
  281. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  282. package/dist/client/org/OrgSwitcher.js +11 -6
  283. package/dist/client/org/OrgSwitcher.js.map +1 -1
  284. package/dist/client/org/TeamPage.d.ts.map +1 -1
  285. package/dist/client/org/TeamPage.js +5 -5
  286. package/dist/client/org/TeamPage.js.map +1 -1
  287. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  288. package/dist/client/settings/SettingsPanel.js +37 -14
  289. package/dist/client/settings/SettingsPanel.js.map +1 -1
  290. package/dist/client/settings/SettingsSection.js +1 -1
  291. package/dist/client/settings/SettingsSection.js.map +1 -1
  292. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  293. package/dist/client/settings/SettingsTabsPage.js +21 -10
  294. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  295. package/dist/collab/routes.d.ts +1 -1
  296. package/dist/db-admin/agent-tools.d.ts.map +1 -1
  297. package/dist/db-admin/agent-tools.js +7 -2
  298. package/dist/db-admin/agent-tools.js.map +1 -1
  299. package/dist/db-admin/operations.d.ts.map +1 -1
  300. package/dist/db-admin/operations.js +90 -4
  301. package/dist/db-admin/operations.js.map +1 -1
  302. package/dist/db-admin/routes.d.ts.map +1 -1
  303. package/dist/db-admin/routes.js +1 -0
  304. package/dist/db-admin/routes.js.map +1 -1
  305. package/dist/db-admin/types.d.ts +4 -0
  306. package/dist/db-admin/types.d.ts.map +1 -1
  307. package/dist/db-admin/types.js.map +1 -1
  308. package/dist/extensions/html-shell.d.ts +5 -4
  309. package/dist/extensions/html-shell.d.ts.map +1 -1
  310. package/dist/extensions/html-shell.js.map +1 -1
  311. package/dist/extensions/routes.d.ts.map +1 -1
  312. package/dist/extensions/routes.js +8 -0
  313. package/dist/extensions/routes.js.map +1 -1
  314. package/dist/navigation/index.d.ts +1 -1
  315. package/dist/navigation/index.d.ts.map +1 -1
  316. package/dist/navigation/index.js +1 -1
  317. package/dist/navigation/index.js.map +1 -1
  318. package/dist/notifications/routes.d.ts +1 -1
  319. package/dist/observability/routes.d.ts +1 -1
  320. package/dist/resources/handlers.d.ts +6 -1
  321. package/dist/resources/handlers.d.ts.map +1 -1
  322. package/dist/resources/handlers.js +9 -8
  323. package/dist/resources/handlers.js.map +1 -1
  324. package/dist/server/poll.d.ts +12 -4
  325. package/dist/server/poll.d.ts.map +1 -1
  326. package/dist/server/poll.js +236 -9
  327. package/dist/server/poll.js.map +1 -1
  328. package/dist/styles/agent-native.css +27 -0
  329. package/dist/templates/default/.agents/skills/actions/SKILL.md +5 -0
  330. package/dist/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  331. package/dist/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
  332. package/dist/templates/default/.agents/skills/security/SKILL.md +7 -0
  333. package/dist/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
  334. package/dist/templates/default/AGENTS.md +4 -2
  335. package/dist/templates/headless/AGENTS.md +4 -0
  336. package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
  337. package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  338. package/dist/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
  339. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
  340. package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
  341. package/dist/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
  342. package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
  343. package/dist/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
  344. package/dist/templates/workspace-core/AGENTS.md +7 -1
  345. package/dist/templates/workspace-root/AGENTS.md +7 -1
  346. package/package.json +1 -1
  347. package/src/templates/default/.agents/skills/actions/SKILL.md +5 -0
  348. package/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  349. package/src/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
  350. package/src/templates/default/.agents/skills/security/SKILL.md +7 -0
  351. package/src/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
  352. package/src/templates/default/AGENTS.md +4 -2
  353. package/src/templates/headless/AGENTS.md +4 -0
  354. package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
  355. package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  356. package/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
  357. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
  358. package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
  359. package/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
  360. package/src/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
  361. package/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
  362. package/src/templates/workspace-core/AGENTS.md +7 -1
  363. package/src/templates/workspace-root/AGENTS.md +7 -1
@@ -3,15 +3,20 @@ import {
3
3
  ObservabilityDashboard,
4
4
  useActionMutation,
5
5
  useActionQuery,
6
+ useFormatters,
6
7
  useT,
7
8
  } from "@agent-native/core/client";
8
9
  import { DbAdminPage } from "@agent-native/core/client/db-admin";
10
+ import { useOrgRole } from "@agent-native/core/client/org";
9
11
  import {
10
12
  IconActivity,
11
13
  IconAlertTriangle,
14
+ IconChartBar,
12
15
  IconChevronDown,
13
16
  IconDatabase,
17
+ IconEye,
14
18
  IconLoader2,
19
+ IconMouse,
15
20
  IconPlus,
16
21
  IconTrash,
17
22
  } from "@tabler/icons-react";
@@ -28,6 +33,7 @@ import {
28
33
  AlertDialogHeader,
29
34
  AlertDialogTitle,
30
35
  } from "@/components/ui/alert-dialog";
36
+ import { Badge } from "@/components/ui/badge";
31
37
  import { Button } from "@/components/ui/button";
32
38
  import {
33
39
  Dialog,
@@ -54,9 +60,17 @@ import {
54
60
  SelectTrigger,
55
61
  SelectValue,
56
62
  } from "@/components/ui/select";
63
+ import {
64
+ Table,
65
+ TableBody,
66
+ TableCell,
67
+ TableHead,
68
+ TableHeader,
69
+ TableRow,
70
+ } from "@/components/ui/table";
57
71
  import { cn } from "@/lib/utils";
58
72
 
59
- type AgentAdminView = "monitoring" | "database";
73
+ type AgentAdminView = "monitoring" | "dashboards" | "database";
60
74
 
61
75
  interface DbAdminConnection {
62
76
  id: string;
@@ -76,7 +90,34 @@ interface SaveDbAdminConnectionInput {
76
90
  databaseAuthToken?: string;
77
91
  }
78
92
 
79
- const AGENT_ADMIN_VIEWS: AgentAdminView[] = ["monitoring", "database"];
93
+ interface DashboardUsageStats {
94
+ id: string;
95
+ name: string;
96
+ kind: "explorer" | "sql";
97
+ ownerEmail: string | null;
98
+ visibility: "private" | "org" | "public";
99
+ createdAt: string;
100
+ updatedAt: string;
101
+ updatedBy: string | null;
102
+ archivedAt: string | null;
103
+ hiddenAt: string | null;
104
+ hiddenBy: string | null;
105
+ viewCount: number;
106
+ engagementCount: number;
107
+ eventEngagementCount: number;
108
+ savedViewCount: number;
109
+ uniqueUserCount: number;
110
+ lastViewedAt: string | null;
111
+ lastSavedViewAt: string | null;
112
+ panelCount: number | null;
113
+ url: string;
114
+ }
115
+
116
+ const AGENT_ADMIN_VIEWS: AgentAdminView[] = [
117
+ "monitoring",
118
+ "dashboards",
119
+ "database",
120
+ ];
80
121
 
81
122
  function parseView(value: string | null): AgentAdminView {
82
123
  return AGENT_ADMIN_VIEWS.includes(value as AgentAdminView)
@@ -84,11 +125,265 @@ function parseView(value: string | null): AgentAdminView {
84
125
  : "monitoring";
85
126
  }
86
127
 
128
+ function toCount(value: unknown): number {
129
+ return typeof value === "number" && Number.isFinite(value) ? value : 0;
130
+ }
131
+
132
+ function DashboardUsageAdminPanel() {
133
+ const t = useT();
134
+ const { formatDate } = useFormatters();
135
+ const numberFormat = useMemo(() => new Intl.NumberFormat(), []);
136
+ const {
137
+ data: dashboards = [],
138
+ isLoading,
139
+ error,
140
+ } = useActionQuery<DashboardUsageStats[]>(
141
+ "list-dashboard-usage-stats",
142
+ undefined,
143
+ { retry: false },
144
+ );
145
+
146
+ function formatCount(value: unknown) {
147
+ return numberFormat.format(toCount(value));
148
+ }
149
+
150
+ function formatMaybeDate(value: string | null) {
151
+ if (!value) return t("agents.notTracked");
152
+ try {
153
+ return formatDate(value, {
154
+ year: "numeric",
155
+ month: "short",
156
+ day: "numeric",
157
+ });
158
+ } catch {
159
+ return value;
160
+ }
161
+ }
162
+
163
+ const activeDashboards = dashboards.filter(
164
+ (dashboard) => !dashboard.archivedAt,
165
+ );
166
+ const totalViews = dashboards.reduce(
167
+ (sum, dashboard) => sum + toCount(dashboard.viewCount),
168
+ 0,
169
+ );
170
+ const staleDashboards = dashboards.filter(
171
+ (dashboard) => dashboard.viewCount === 0 && !dashboard.archivedAt,
172
+ );
173
+ const mostViewedDashboard = dashboards[0] ?? null;
174
+
175
+ return (
176
+ <div className="flex min-w-0 flex-1 flex-col gap-4">
177
+ <div className="flex flex-wrap items-start justify-between gap-3">
178
+ <div className="min-w-0">
179
+ <h2 className="text-sm font-semibold">
180
+ {t("agents.dashboardUsageTitle")}
181
+ </h2>
182
+ <p className="mt-1 max-w-3xl text-sm leading-6 text-muted-foreground">
183
+ {t("agents.dashboardUsageDescription")}
184
+ </p>
185
+ </div>
186
+ </div>
187
+
188
+ {error ? (
189
+ <div className="flex items-start gap-2 rounded-md border border-destructive/30 bg-destructive/10 p-3 text-sm text-destructive">
190
+ <IconAlertTriangle className="mt-0.5 h-4 w-4 shrink-0" />
191
+ <span>{error.message}</span>
192
+ </div>
193
+ ) : isLoading ? (
194
+ <div className="flex min-h-[460px] items-center justify-center rounded-lg border bg-background">
195
+ <IconLoader2 className="h-5 w-5 animate-spin text-muted-foreground" />
196
+ </div>
197
+ ) : dashboards.length === 0 ? (
198
+ <div className="flex min-h-[360px] items-center justify-center rounded-lg border bg-background p-8 text-center">
199
+ <div className="max-w-sm">
200
+ <div className="mx-auto mb-3 flex h-10 w-10 items-center justify-center rounded-full bg-muted">
201
+ <IconChartBar className="h-5 w-5 text-muted-foreground" />
202
+ </div>
203
+ <h2 className="text-sm font-semibold">
204
+ {t("agents.dashboardUsageEmpty")}
205
+ </h2>
206
+ <p className="mt-1.5 text-sm leading-6 text-muted-foreground">
207
+ {t("agents.dashboardUsageEmptyDescription")}
208
+ </p>
209
+ </div>
210
+ </div>
211
+ ) : (
212
+ <>
213
+ <div className="grid gap-3 sm:grid-cols-2 xl:grid-cols-4">
214
+ <UsageStatCard
215
+ icon={IconChartBar}
216
+ label={t("agents.dashboardUsageTotal")}
217
+ value={formatCount(dashboards.length)}
218
+ detail={t("agents.dashboardUsageActive", {
219
+ count: formatCount(activeDashboards.length),
220
+ })}
221
+ />
222
+ <UsageStatCard
223
+ icon={IconEye}
224
+ label={t("agents.dashboardUsageViews")}
225
+ value={formatCount(totalViews)}
226
+ detail={
227
+ mostViewedDashboard
228
+ ? t("agents.dashboardUsageTop", {
229
+ name: mostViewedDashboard.name,
230
+ })
231
+ : t("agents.notTracked")
232
+ }
233
+ />
234
+ <UsageStatCard
235
+ icon={IconMouse}
236
+ label={t("agents.dashboardUsageEngagements")}
237
+ value={formatCount(
238
+ dashboards.reduce(
239
+ (sum, dashboard) => sum + toCount(dashboard.engagementCount),
240
+ 0,
241
+ ),
242
+ )}
243
+ detail={t("agents.dashboardUsageEngagementsHint")}
244
+ />
245
+ <UsageStatCard
246
+ icon={IconAlertTriangle}
247
+ label={t("agents.dashboardUsageStale")}
248
+ value={formatCount(staleDashboards.length)}
249
+ detail={t("agents.dashboardUsageStaleHint")}
250
+ />
251
+ </div>
252
+
253
+ <div className="overflow-hidden rounded-lg border bg-background">
254
+ <div className="overflow-x-auto">
255
+ <Table>
256
+ <TableHeader>
257
+ <TableRow>
258
+ <TableHead>{t("agents.dashboardUsageDashboard")}</TableHead>
259
+ <TableHead>{t("agents.dashboardUsageOwner")}</TableHead>
260
+ <TableHead>{t("agents.dashboardUsageViews")}</TableHead>
261
+ <TableHead>
262
+ {t("agents.dashboardUsageEngagements")}
263
+ </TableHead>
264
+ <TableHead>{t("agents.dashboardUsageUsers")}</TableHead>
265
+ <TableHead>{t("agents.dashboardUsageModified")}</TableHead>
266
+ <TableHead>{t("agents.dashboardUsageCreated")}</TableHead>
267
+ <TableHead>{t("agents.dashboardUsageState")}</TableHead>
268
+ </TableRow>
269
+ </TableHeader>
270
+ <TableBody>
271
+ {dashboards.map((dashboard) => (
272
+ <TableRow key={dashboard.id}>
273
+ <TableCell className="min-w-[240px]">
274
+ <div className="flex min-w-0 flex-col gap-1">
275
+ <Link
276
+ to={dashboard.url}
277
+ className="truncate font-medium text-foreground underline-offset-4 hover:underline"
278
+ >
279
+ {dashboard.name}
280
+ </Link>
281
+ <div className="flex flex-wrap items-center gap-1.5 text-xs text-muted-foreground">
282
+ <span>{dashboard.kind.toUpperCase()}</span>
283
+ {typeof dashboard.panelCount === "number" ? (
284
+ <span>
285
+ {t("agents.dashboardUsagePanels", {
286
+ count: formatCount(dashboard.panelCount),
287
+ })}
288
+ </span>
289
+ ) : null}
290
+ </div>
291
+ </div>
292
+ </TableCell>
293
+ <TableCell className="min-w-[180px] text-sm text-muted-foreground">
294
+ {dashboard.ownerEmail ?? t("agents.notTracked")}
295
+ </TableCell>
296
+ <TableCell>
297
+ <div className="font-medium">
298
+ {formatCount(dashboard.viewCount)}
299
+ </div>
300
+ <div className="text-xs text-muted-foreground">
301
+ {formatMaybeDate(dashboard.lastViewedAt)}
302
+ </div>
303
+ </TableCell>
304
+ <TableCell>
305
+ <div className="font-medium">
306
+ {formatCount(dashboard.engagementCount)}
307
+ </div>
308
+ <div className="text-xs text-muted-foreground">
309
+ {t("agents.dashboardUsageSavedViews", {
310
+ count: formatCount(dashboard.savedViewCount),
311
+ })}
312
+ </div>
313
+ </TableCell>
314
+ <TableCell>
315
+ {formatCount(dashboard.uniqueUserCount)}
316
+ </TableCell>
317
+ <TableCell className="min-w-[180px]">
318
+ <div>{formatMaybeDate(dashboard.updatedAt)}</div>
319
+ <div className="text-xs text-muted-foreground">
320
+ {dashboard.updatedBy ?? t("agents.notTracked")}
321
+ </div>
322
+ </TableCell>
323
+ <TableCell>
324
+ {formatMaybeDate(dashboard.createdAt)}
325
+ </TableCell>
326
+ <TableCell>
327
+ <div className="flex flex-wrap gap-1.5">
328
+ <Badge variant="outline">
329
+ {t(`agents.visibility${dashboard.visibility}`)}
330
+ </Badge>
331
+ {dashboard.hiddenAt ? (
332
+ <Badge variant="secondary">
333
+ {t("agents.dashboardUsageHidden")}
334
+ </Badge>
335
+ ) : null}
336
+ {dashboard.archivedAt ? (
337
+ <Badge variant="secondary">
338
+ {t("agents.dashboardUsageArchived")}
339
+ </Badge>
340
+ ) : null}
341
+ </div>
342
+ </TableCell>
343
+ </TableRow>
344
+ ))}
345
+ </TableBody>
346
+ </Table>
347
+ </div>
348
+ </div>
349
+ </>
350
+ )}
351
+ </div>
352
+ );
353
+ }
354
+
355
+ function UsageStatCard({
356
+ icon: Icon,
357
+ label,
358
+ value,
359
+ detail,
360
+ }: {
361
+ icon: typeof IconChartBar;
362
+ label: string;
363
+ value: string;
364
+ detail: string;
365
+ }) {
366
+ return (
367
+ <div className="rounded-lg border bg-background p-4">
368
+ <div className="flex items-center gap-2 text-sm text-muted-foreground">
369
+ <Icon className="h-4 w-4" />
370
+ <span>{label}</span>
371
+ </div>
372
+ <div className="mt-3 text-2xl font-semibold tracking-tight">{value}</div>
373
+ <div className="mt-1 truncate text-xs text-muted-foreground">
374
+ {detail}
375
+ </div>
376
+ </div>
377
+ );
378
+ }
379
+
87
380
  export default function AgentsPage() {
88
381
  const t = useT();
382
+ const { canManageOrg, isLoading: orgRoleLoading } = useOrgRole();
89
383
  const [searchParams, setSearchParams] = useSearchParams();
90
384
  const view = parseView(searchParams.get("view"));
91
385
  const selectedConnectionId = searchParams.get("db");
386
+ const isAdminView = view === "dashboards" || view === "database";
92
387
 
93
388
  function setView(next: AgentAdminView) {
94
389
  const params = new URLSearchParams(searchParams);
@@ -109,6 +404,32 @@ export default function AgentsPage() {
109
404
  setSearchParams(params, { replace: true });
110
405
  }
111
406
 
407
+ if (orgRoleLoading) {
408
+ return (
409
+ <div className="mx-auto flex h-full w-full max-w-7xl items-center justify-center px-4 py-5 lg:px-6">
410
+ <IconLoader2 className="h-5 w-5 animate-spin text-muted-foreground" />
411
+ </div>
412
+ );
413
+ }
414
+
415
+ if (!canManageOrg && isAdminView) {
416
+ return (
417
+ <div className="mx-auto flex h-full w-full max-w-7xl items-center justify-center px-4 py-5 lg:px-6">
418
+ <div className="max-w-sm rounded-lg border bg-background p-6 text-center">
419
+ <div className="mx-auto mb-3 flex h-10 w-10 items-center justify-center rounded-full bg-muted">
420
+ <IconAlertTriangle className="h-5 w-5 text-muted-foreground" />
421
+ </div>
422
+ <h1 className="text-sm font-semibold">
423
+ {t("agents.adminOnlyTitle")}
424
+ </h1>
425
+ <p className="mt-1.5 text-sm leading-6 text-muted-foreground">
426
+ {t("agents.adminOnlyDescription")}
427
+ </p>
428
+ </div>
429
+ </div>
430
+ );
431
+ }
432
+
112
433
  return (
113
434
  <div className="mx-auto flex h-full w-full max-w-7xl flex-col gap-5 px-4 py-5 lg:px-6">
114
435
  <div className="flex flex-wrap items-start justify-between gap-3">
@@ -122,22 +443,24 @@ export default function AgentsPage() {
122
443
  <Button variant="outline" size="sm" asChild>
123
444
  <Link to="/catalog">{t("agents.openCatalog")}</Link>
124
445
  </Button>
125
- <DropdownMenu>
126
- <DropdownMenuTrigger asChild>
127
- <Button variant="secondary" size="sm">
128
- {t("agents.advanced")}
129
- <IconChevronDown className="ms-1 h-3.5 w-3.5" />
130
- </Button>
131
- </DropdownMenuTrigger>
132
- <DropdownMenuContent align="end" className="w-56">
133
- <DropdownMenuLabel>{t("agents.advanced")}</DropdownMenuLabel>
134
- <DropdownMenuSeparator />
135
- <DropdownMenuItem onSelect={() => setView("database")}>
136
- <IconDatabase className="me-2 h-4 w-4" />
137
- {t("agents.database")}
138
- </DropdownMenuItem>
139
- </DropdownMenuContent>
140
- </DropdownMenu>
446
+ {canManageOrg ? (
447
+ <DropdownMenu>
448
+ <DropdownMenuTrigger asChild>
449
+ <Button variant="secondary" size="sm">
450
+ {t("agents.advanced")}
451
+ <IconChevronDown className="ms-1 h-3.5 w-3.5" />
452
+ </Button>
453
+ </DropdownMenuTrigger>
454
+ <DropdownMenuContent align="end" className="w-56">
455
+ <DropdownMenuLabel>{t("agents.advanced")}</DropdownMenuLabel>
456
+ <DropdownMenuSeparator />
457
+ <DropdownMenuItem onSelect={() => setView("database")}>
458
+ <IconDatabase className="me-2 h-4 w-4" />
459
+ {t("agents.database")}
460
+ </DropdownMenuItem>
461
+ </DropdownMenuContent>
462
+ </DropdownMenu>
463
+ ) : null}
141
464
  </div>
142
465
  </div>
143
466
 
@@ -155,7 +478,22 @@ export default function AgentsPage() {
155
478
  <IconActivity className="h-4 w-4" />
156
479
  {t("agents.monitoring")}
157
480
  </button>
158
- {view === "database" && (
481
+ {canManageOrg ? (
482
+ <button
483
+ type="button"
484
+ onClick={() => setView("dashboards")}
485
+ className={cn(
486
+ "inline-flex h-8 items-center gap-2 rounded-md px-3 text-sm font-medium transition-colors",
487
+ view === "dashboards"
488
+ ? "bg-foreground text-background"
489
+ : "text-muted-foreground hover:bg-muted hover:text-foreground",
490
+ )}
491
+ >
492
+ <IconChartBar className="h-4 w-4" />
493
+ {t("agents.dashboardUsage")}
494
+ </button>
495
+ ) : null}
496
+ {canManageOrg && view === "database" && (
159
497
  <button
160
498
  type="button"
161
499
  onClick={() => setView("database")}
@@ -172,6 +510,8 @@ export default function AgentsPage() {
172
510
  selectedConnectionId={selectedConnectionId}
173
511
  onSelectConnection={setSelectedConnectionId}
174
512
  />
513
+ ) : view === "dashboards" ? (
514
+ <DashboardUsageAdminPanel />
175
515
  ) : (
176
516
  <div className="min-w-0">
177
517
  <div className="mb-4 max-w-3xl text-sm leading-6 text-muted-foreground">
@@ -199,7 +199,7 @@ export default function Settings() {
199
199
  icon: IconBell,
200
200
  keywords: "alerts rules notifications thresholds triggers monitoring",
201
201
  content: (
202
- <div className="mx-auto w-full max-w-3xl">
202
+ <div className="mx-auto w-full max-w-5xl">
203
203
  <AlertRulesSettingsCard />
204
204
  </div>
205
205
  ),
@@ -515,10 +515,11 @@ export default function Settings() {
515
515
  </div>
516
516
  }
517
517
  team={
518
- <div className="mx-auto w-full max-w-2xl">
518
+ <div className="mx-auto w-full max-w-5xl">
519
519
  <TeamPage
520
520
  showTitle={false}
521
521
  createOrgDescription="Set up a team to share dashboards and data sources with your colleagues."
522
+ className="max-w-5xl"
522
523
  />
523
524
  </div>
524
525
  }
@@ -38,12 +38,14 @@ import {
38
38
  IconEye,
39
39
  IconEyeOff,
40
40
  IconGripVertical,
41
+ IconHistory,
41
42
  } from "@tabler/icons-react";
42
43
  import { useQuery, useQueryClient } from "@tanstack/react-query";
43
44
  import { useState, useEffect, useCallback } from "react";
44
45
  import { useSearchParams, useNavigate } from "react-router";
45
46
  import { toast } from "sonner";
46
47
 
48
+ import { DashboardHistoryPanel } from "@/components/dashboard/DashboardHistoryPanel";
47
49
  import {
48
50
  DashboardTitleSkeleton,
49
51
  useSetPageTitle,
@@ -80,6 +82,7 @@ import {
80
82
  TooltipContent,
81
83
  TooltipTrigger,
82
84
  } from "@/components/ui/tooltip";
85
+ import { useDashboardChatContext } from "@/hooks/use-dashboard-chat-context";
83
86
  import {
84
87
  resourceCanEdit,
85
88
  resourceCanManage,
@@ -195,11 +198,19 @@ export default function ExplorerDashboardPage() {
195
198
  const [addChartOpen, setAddChartOpen] = useState(false);
196
199
  const [loaded, setLoaded] = useState(false);
197
200
  const [confirmDeleteOpen, setConfirmDeleteOpen] = useState(false);
201
+ const [historyOpen, setHistoryOpen] = useState(false);
198
202
  const [activeDragChartId, setActiveDragChartId] = useState<string | null>(
199
203
  null,
200
204
  );
201
205
  const canEdit = resourceCanEdit(resourceAccess);
202
206
  const canManage = resourceCanManage(resourceAccess);
207
+ useDashboardChatContext({
208
+ id: dashboardId,
209
+ kind: "explorer",
210
+ title: dashboard?.name,
211
+ panelCount: dashboard?.charts.length,
212
+ canEdit,
213
+ });
203
214
  const { mutateAsync: hideDashboardAction, isPending: unhidePending } =
204
215
  useActionMutation("hide-dashboard");
205
216
 
@@ -608,7 +619,7 @@ export default function ExplorerDashboardPage() {
608
619
  {t("explorerDashboard.addChart")}
609
620
  </Button>
610
621
  ) : null}
611
- {canEdit || canManage ? (
622
+ {dashboardId || canEdit || canManage ? (
612
623
  <DropdownMenu>
613
624
  <Tooltip>
614
625
  <TooltipTrigger asChild>
@@ -628,6 +639,20 @@ export default function ExplorerDashboardPage() {
628
639
  </TooltipContent>
629
640
  </Tooltip>
630
641
  <DropdownMenuContent align="end" className="w-44">
642
+ {dashboardId ? (
643
+ <DropdownMenuItem
644
+ onSelect={(event) => {
645
+ event.preventDefault();
646
+ setHistoryOpen(true);
647
+ }}
648
+ >
649
+ <IconHistory className="mr-2 h-3.5 w-3.5" />
650
+ {t("dashboard.historyTitle")}
651
+ </DropdownMenuItem>
652
+ ) : null}
653
+ {dashboardId && canEdit && !archivedAt ? (
654
+ <DropdownMenuSeparator />
655
+ ) : null}
631
656
  {canEdit && !archivedAt ? (
632
657
  <DropdownMenuItem
633
658
  onSelect={(event) => {
@@ -657,6 +682,14 @@ export default function ExplorerDashboardPage() {
657
682
  </DropdownMenuContent>
658
683
  </DropdownMenu>
659
684
  ) : null}
685
+ {dashboardId ? (
686
+ <DashboardHistoryPanel
687
+ dashboardId={dashboardId}
688
+ open={historyOpen}
689
+ onOpenChange={setHistoryOpen}
690
+ canRestore={canEdit && !archivedAt}
691
+ />
692
+ ) : null}
660
693
  {canManage ? (
661
694
  <AlertDialog
662
695
  open={confirmDeleteOpen}
@@ -32,6 +32,7 @@ import {
32
32
  IconEye,
33
33
  IconEyeOff,
34
34
  IconGripVertical,
35
+ IconHistory,
35
36
  IconInfoCircle,
36
37
  IconLock,
37
38
  IconMail,
@@ -56,6 +57,7 @@ import {
56
57
  import { useSearchParams, useParams, useNavigate } from "react-router";
57
58
  import { toast } from "sonner";
58
59
 
60
+ import { DashboardHistoryPanel } from "@/components/dashboard/DashboardHistoryPanel";
59
61
  import {
60
62
  DashboardTitleSkeleton,
61
63
  useSetPageTitle,
@@ -90,6 +92,7 @@ import {
90
92
  TooltipContent,
91
93
  TooltipTrigger,
92
94
  } from "@/components/ui/tooltip";
95
+ import { useDashboardChatContext } from "@/hooks/use-dashboard-chat-context";
93
96
  import { useDashboardViews } from "@/hooks/use-dashboard-views";
94
97
  import { useUserPref } from "@/hooks/use-user-pref";
95
98
  import { incrementItemView } from "@/lib/item-popularity";
@@ -460,6 +463,7 @@ export default function SqlDashboardPage() {
460
463
  const [loaded, setLoaded] = useState(false);
461
464
  const [confirmDeleteOpen, setConfirmDeleteOpen] = useState(false);
462
465
  const [emailReportOpen, setEmailReportOpen] = useState(false);
466
+ const [historyOpen, setHistoryOpen] = useState(false);
463
467
  const [activeDropSlot, setActiveDropSlot] =
464
468
  useState<DashboardDropSlot | null>(null);
465
469
  const [activeDragPanelId, setActiveDragPanelId] = useState<string | null>(
@@ -472,6 +476,13 @@ export default function SqlDashboardPage() {
472
476
  const dashboardColumns = clampDashboardColumns(
473
477
  dashboard?.columns ?? DEFAULT_DASHBOARD_COLUMNS,
474
478
  );
479
+ useDashboardChatContext({
480
+ id: reportScreenshot ? null : dashboardId,
481
+ kind: "sql",
482
+ title: dashboard?.name,
483
+ panelCount: dashboard?.panels.length,
484
+ canEdit,
485
+ });
475
486
  const isDemoDashboard = dashboard?.demo?.id === "demo-node-exporter";
476
487
  const showDemoIntro =
477
488
  isDemoDashboard && searchParams.get("demoIntro") === "1";
@@ -1463,6 +1474,15 @@ export default function SqlDashboardPage() {
1463
1474
  <IconMail className="mr-2 h-3.5 w-3.5" />
1464
1475
  {t("sqlDashboard.emailReports")}
1465
1476
  </DropdownMenuItem>
1477
+ <DropdownMenuItem
1478
+ onSelect={(event) => {
1479
+ event.preventDefault();
1480
+ setHistoryOpen(true);
1481
+ }}
1482
+ >
1483
+ <IconHistory className="mr-2 h-3.5 w-3.5" />
1484
+ {t("dashboard.historyTitle")}
1485
+ </DropdownMenuItem>
1466
1486
  </>
1467
1487
  ) : null}
1468
1488
  {canEdit && !archivedAt ? (
@@ -1502,6 +1522,14 @@ export default function SqlDashboardPage() {
1502
1522
  filters={currentReportFilters}
1503
1523
  />
1504
1524
  ) : null}
1525
+ {dashboardId ? (
1526
+ <DashboardHistoryPanel
1527
+ dashboardId={dashboardId}
1528
+ open={historyOpen}
1529
+ onOpenChange={setHistoryOpen}
1530
+ canRestore={canEdit && !archivedAt}
1531
+ />
1532
+ ) : null}
1505
1533
  {canManage ? (
1506
1534
  <AlertDialog
1507
1535
  open={confirmDeleteOpen}