@agent-native/core 0.91.2 → 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 (538) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +31 -0
  3. package/corpus/core/docs/content/faq.mdx +17 -0
  4. package/corpus/core/docs/content/notifications.mdx +12 -6
  5. package/corpus/core/package.json +1 -1
  6. package/corpus/core/src/agent/production-agent.ts +140 -46
  7. package/corpus/core/src/agent/tool-search.ts +71 -4
  8. package/corpus/core/src/application-state/store.ts +12 -1
  9. package/corpus/core/src/cli/index.ts +20 -0
  10. package/corpus/core/src/cli/upgrade.ts +798 -0
  11. package/corpus/core/src/client/AssistantChat.tsx +28 -15
  12. package/corpus/core/src/client/HighlightedCodeBlock.tsx +20 -3
  13. package/corpus/core/src/client/PoweredByBadge.tsx +1 -8
  14. package/corpus/core/src/client/agent-chat-adapter.ts +68 -16
  15. package/corpus/core/src/client/chat/message-components.tsx +85 -8
  16. package/corpus/core/src/client/chat/tool-call-display.tsx +355 -144
  17. package/corpus/core/src/client/chat/widgets/DataTableWidget.tsx +52 -1
  18. package/corpus/core/src/client/code-agent-chat-adapter.ts +2 -9
  19. package/corpus/core/src/client/db-admin/TableEditor.tsx +49 -0
  20. package/corpus/core/src/client/db-admin/export-utils.ts +13 -4
  21. package/corpus/core/src/client/db-admin/useAgentSync.ts +72 -0
  22. package/corpus/core/src/client/error-capture.ts +69 -7
  23. package/corpus/core/src/client/extensions/EmbeddedExtension.tsx +5 -1
  24. package/corpus/core/src/client/extensions/ExtensionViewer.tsx +53 -8
  25. package/corpus/core/src/client/extensions/InlineExtensionFrame.tsx +5 -1
  26. package/corpus/core/src/client/extensions/portable-extension.ts +1 -0
  27. package/corpus/core/src/client/org/OrgSwitcher.tsx +12 -9
  28. package/corpus/core/src/client/org/TeamPage.tsx +77 -71
  29. package/corpus/core/src/client/session-replay.ts +3 -97
  30. package/corpus/core/src/client/settings/SettingsPanel.tsx +738 -441
  31. package/corpus/core/src/client/settings/SettingsSection.tsx +161 -17
  32. package/corpus/core/src/client/settings/SettingsTabsPage.tsx +25 -9
  33. package/corpus/core/src/client/sse-event-processor.ts +29 -2
  34. package/corpus/core/src/db-admin/agent-tools.ts +8 -2
  35. package/corpus/core/src/db-admin/operations.ts +116 -4
  36. package/corpus/core/src/db-admin/routes.ts +1 -0
  37. package/corpus/core/src/db-admin/types.ts +4 -0
  38. package/corpus/core/src/extensions/actions.ts +113 -5
  39. package/corpus/core/src/extensions/html-shell.ts +5 -4
  40. package/corpus/core/src/extensions/routes.ts +10 -0
  41. package/corpus/core/src/navigation/index.ts +1 -1
  42. package/corpus/core/src/notifications/channels.ts +88 -25
  43. package/corpus/core/src/notifications/registry.ts +17 -3
  44. package/corpus/core/src/notifications/types.ts +4 -1
  45. package/corpus/core/src/resources/handlers.ts +10 -8
  46. package/corpus/core/src/server/agent-chat-plugin.ts +7 -3
  47. package/corpus/core/src/server/poll.ts +293 -8
  48. package/corpus/core/src/server/request-context.ts +7 -0
  49. package/corpus/core/src/styles/agent-conversation.css +1 -1
  50. package/corpus/core/src/styles/agent-native.css +27 -0
  51. package/corpus/core/src/templates/default/.agents/skills/actions/SKILL.md +5 -0
  52. package/corpus/core/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  53. package/corpus/core/src/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
  54. package/corpus/core/src/templates/default/.agents/skills/security/SKILL.md +7 -0
  55. package/corpus/core/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
  56. package/corpus/core/src/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
  57. package/corpus/core/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  58. package/corpus/core/src/templates/default/AGENTS.md +14 -5
  59. package/corpus/core/src/templates/default/package.json +2 -1
  60. package/corpus/core/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  61. package/corpus/core/src/templates/headless/AGENTS.md +13 -3
  62. package/corpus/core/src/templates/headless/package.json +1 -0
  63. package/corpus/core/src/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
  64. package/corpus/core/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  65. package/corpus/core/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
  66. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
  67. package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
  68. package/corpus/core/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
  69. package/corpus/core/src/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
  70. package/corpus/core/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
  71. package/corpus/core/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
  72. package/corpus/core/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  73. package/corpus/core/src/templates/workspace-core/AGENTS.md +7 -1
  74. package/corpus/core/src/templates/workspace-root/AGENTS.md +17 -5
  75. package/corpus/core/src/templates/workspace-root/package.json +1 -0
  76. package/corpus/templates/analytics/.agents/skills/actions/SKILL.md +5 -0
  77. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +10 -0
  78. package/corpus/templates/analytics/.agents/skills/real-time-sync/SKILL.md +1 -1
  79. package/corpus/templates/analytics/.agents/skills/security/SKILL.md +7 -0
  80. package/corpus/templates/analytics/.agents/skills/self-modifying-code/SKILL.md +20 -2
  81. package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +5 -6
  82. package/corpus/templates/analytics/.agents/skills/storing-data/SKILL.md +5 -1
  83. package/corpus/templates/analytics/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  84. package/corpus/templates/analytics/AGENTS.md +39 -18
  85. package/corpus/templates/analytics/actions/capture-test-error.ts +4 -0
  86. package/corpus/templates/analytics/actions/get-analytics-alert-rule-defaults.ts +23 -0
  87. package/corpus/templates/analytics/actions/get-error-issue.ts +1 -1
  88. package/corpus/templates/analytics/actions/list-analysis-revisions.ts +40 -0
  89. package/corpus/templates/analytics/actions/list-dashboard-revisions.ts +40 -0
  90. package/corpus/templates/analytics/actions/list-dashboard-usage-stats.ts +299 -0
  91. package/corpus/templates/analytics/actions/navigate.ts +4 -2
  92. package/corpus/templates/analytics/actions/restore-analysis-revision.ts +43 -0
  93. package/corpus/templates/analytics/actions/restore-dashboard-revision.ts +68 -0
  94. package/corpus/templates/analytics/actions/save-analytics-alert-rule.ts +14 -0
  95. package/corpus/templates/analytics/actions/save-monitor.ts +15 -1
  96. package/corpus/templates/analytics/actions/view-screen.ts +24 -0
  97. package/corpus/templates/analytics/app/components/analysis/AnalysisHistoryPanel.tsx +181 -0
  98. package/corpus/templates/analytics/app/components/dashboard/DashboardHistoryPanel.tsx +184 -0
  99. package/corpus/templates/analytics/app/components/dashboard/DataTable.tsx +41 -6
  100. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +122 -11
  101. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +22 -16
  102. package/corpus/templates/analytics/app/components/layout/Header.tsx +1 -1
  103. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +27 -21
  104. package/corpus/templates/analytics/app/hooks/use-analysis-revisions.ts +43 -0
  105. package/corpus/templates/analytics/app/hooks/use-dashboard-chat-context.ts +110 -0
  106. package/corpus/templates/analytics/app/hooks/use-dashboard-revisions.ts +43 -0
  107. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +8 -3
  108. package/corpus/templates/analytics/app/i18n/zh-TW.ts +64 -2
  109. package/corpus/templates/analytics/app/i18n-data.ts +783 -3
  110. package/corpus/templates/analytics/app/pages/Agents.tsx +359 -19
  111. package/corpus/templates/analytics/app/pages/Settings.tsx +3 -2
  112. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +34 -1
  113. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +28 -0
  114. package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +18 -1
  115. package/corpus/templates/analytics/app/pages/monitoring/ErrorsPanel.tsx +7 -10
  116. package/corpus/templates/analytics/app/pages/monitoring/MonitoringPage.tsx +8 -2
  117. package/corpus/templates/analytics/app/pages/monitoring/errors/IssueDetail.tsx +479 -23
  118. package/corpus/templates/analytics/app/pages/monitoring/errors/IssueList.tsx +0 -9
  119. package/corpus/templates/analytics/app/pages/monitoring/errors/i18n.ts +11 -0
  120. package/corpus/templates/analytics/app/pages/monitoring/errors/types.ts +9 -1
  121. package/corpus/templates/analytics/app/pages/monitoring/uptime/MonitorFormPage.tsx +157 -35
  122. package/corpus/templates/analytics/app/pages/monitoring/uptime/i18n.ts +17 -2
  123. package/corpus/templates/analytics/app/pages/monitoring/uptime/types.ts +4 -0
  124. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +80 -220
  125. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +9 -99
  126. package/corpus/templates/analytics/app/pages/settings/AlertRulesSettingsCard.tsx +262 -104
  127. package/corpus/templates/analytics/app/routes/team.tsx +1 -1
  128. package/corpus/templates/analytics/changelog/2026-07-08-admins-can-audit-dashboard-usage-ownership-and-cleanup-signa.md +6 -0
  129. package/corpus/templates/analytics/changelog/2026-07-08-agent-monitoring-stays-available-to-non-admins.md +6 -0
  130. package/corpus/templates/analytics/changelog/2026-07-08-alert-rules-are-easier-to-scan-expand-and-edit-from-settings.md +6 -0
  131. package/corpus/templates/analytics/changelog/2026-07-08-analytics-alert-forms-remember-last-email-recipients.md +6 -0
  132. package/corpus/templates/analytics/changelog/2026-07-08-analytics-alert-rules-can-now-use-per-rule-slack-and-webhook.md +6 -0
  133. package/corpus/templates/analytics/changelog/2026-07-08-dashboard-history-and-chat-context.md +5 -0
  134. package/corpus/templates/analytics/changelog/2026-07-08-dashboard-tables-keep-their-size-while-loading.md +6 -0
  135. package/corpus/templates/analytics/changelog/2026-07-08-dashboard-usage-now-counts-explorer-dashboard-traffic.md +6 -0
  136. package/corpus/templates/analytics/changelog/2026-07-08-demo-mode-session-emails-are-filtered-and-anonymized.md +6 -0
  137. package/corpus/templates/analytics/changelog/2026-07-08-error-issue-detail-adds-stack-traces-and-frequency-bars.md +6 -0
  138. package/corpus/templates/analytics/changelog/2026-07-08-error-issue-detail-now-shows-the-latest-occurrence-message-a.md +6 -0
  139. package/corpus/templates/analytics/changelog/2026-07-08-monitoring-errors-only-show-test-action-when-empty.md +6 -0
  140. package/corpus/templates/analytics/changelog/2026-07-08-monitoring-uptime-and-errors-tabs-now-clearly-show-which-view-is-active.md +6 -0
  141. package/corpus/templates/analytics/changelog/2026-07-08-production-session-replay-now-requires-private-blob-storage-.md +6 -0
  142. package/corpus/templates/analytics/changelog/2026-07-08-session-replay-uses-stock-rrweb-sizing-again-so-recorded.md +6 -0
  143. package/corpus/templates/analytics/changelog/2026-07-08-shared-extension-links-now-show-a-clear-message-when-you-do-.md +6 -0
  144. package/corpus/templates/analytics/changelog/2026-07-08-sidebar-dashboard-menus-now-open-above-the-dashboard-canvas.md +6 -0
  145. package/corpus/templates/analytics/changelog/2026-07-08-team-settings-show-access-controls-next-to-member-lists.md +6 -0
  146. package/corpus/templates/analytics/changelog/2026-07-08-uptime-alerting-clarifies-in-app-inbox-vs-email-and-lets-you-paste-slack-or-webhook-urls-per-monitor.md +6 -0
  147. package/corpus/templates/analytics/changelog/2026-07-08-uptime-monitors-now-use-a-10-second-request-timeout-by-defau.md +6 -0
  148. package/corpus/templates/analytics/docs/uptime-monitoring.md +13 -11
  149. package/corpus/templates/analytics/server/db/schema-monitoring.ts +5 -1
  150. package/corpus/templates/analytics/server/db/schema.ts +56 -0
  151. package/corpus/templates/analytics/server/lib/analytics-alerts.ts +92 -0
  152. package/corpus/templates/analytics/server/lib/dashboards-store.ts +334 -5
  153. package/corpus/templates/analytics/server/lib/error-capture.ts +231 -36
  154. package/corpus/templates/analytics/server/lib/session-replay.ts +114 -8
  155. package/corpus/templates/analytics/server/lib/uptime-monitors.ts +65 -16
  156. package/corpus/templates/analytics/server/plugins/db.ts +122 -2
  157. package/corpus/templates/analytics/server/routes/api/dashboard-agent-context.json.get.ts +1 -0
  158. package/corpus/templates/assets/.agents/skills/actions/SKILL.md +5 -0
  159. package/corpus/templates/assets/.agents/skills/real-time-sync/SKILL.md +1 -1
  160. package/corpus/templates/assets/.agents/skills/security/SKILL.md +7 -0
  161. package/corpus/templates/assets/.agents/skills/self-modifying-code/SKILL.md +20 -2
  162. package/corpus/templates/assets/.agents/skills/storing-data/SKILL.md +5 -1
  163. package/corpus/templates/assets/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  164. package/corpus/templates/assets/AGENTS.md +4 -0
  165. package/corpus/templates/assets/app/routes/settings.tsx +1 -1
  166. package/corpus/templates/assets/app/routes/team.tsx +1 -1
  167. package/corpus/templates/brain/.agents/skills/actions/SKILL.md +5 -0
  168. package/corpus/templates/brain/.agents/skills/adding-a-feature/SKILL.md +5 -0
  169. package/corpus/templates/brain/.agents/skills/real-time-sync/SKILL.md +1 -1
  170. package/corpus/templates/brain/.agents/skills/security/SKILL.md +7 -0
  171. package/corpus/templates/brain/.agents/skills/self-modifying-code/SKILL.md +20 -2
  172. package/corpus/templates/brain/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  173. package/corpus/templates/brain/AGENTS.md +4 -0
  174. package/corpus/templates/brain/app/routes/team.tsx +1 -1
  175. package/corpus/templates/calendar/.agents/skills/actions/SKILL.md +5 -0
  176. package/corpus/templates/calendar/.agents/skills/real-time-sync/SKILL.md +1 -1
  177. package/corpus/templates/calendar/.agents/skills/security/SKILL.md +7 -0
  178. package/corpus/templates/calendar/.agents/skills/self-modifying-code/SKILL.md +20 -2
  179. package/corpus/templates/calendar/.agents/skills/storing-data/SKILL.md +5 -1
  180. package/corpus/templates/calendar/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  181. package/corpus/templates/calendar/AGENTS.md +4 -0
  182. package/corpus/templates/calendar/app/components/calendar/DayView.tsx +11 -2
  183. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +21 -8
  184. package/corpus/templates/calendar/app/components/calendar/MonthView.tsx +7 -1
  185. package/corpus/templates/calendar/app/components/calendar/WeekView.tsx +11 -2
  186. package/corpus/templates/calendar/app/lib/popover-click-guard.ts +48 -4
  187. package/corpus/templates/calendar/app/pages/Settings.tsx +1 -1
  188. package/corpus/templates/calendar/app/routes/_app.team.tsx +1 -1
  189. package/corpus/templates/calendar/changelog/2026-07-08-clicking-empty-calendar-space-closes-an-open-event-popover-b.md +6 -0
  190. package/corpus/templates/chat/.agents/skills/actions/SKILL.md +5 -0
  191. package/corpus/templates/chat/.agents/skills/adding-a-feature/SKILL.md +5 -0
  192. package/corpus/templates/chat/.agents/skills/real-time-sync/SKILL.md +1 -1
  193. package/corpus/templates/chat/.agents/skills/security/SKILL.md +7 -0
  194. package/corpus/templates/chat/.agents/skills/self-modifying-code/SKILL.md +20 -2
  195. package/corpus/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  196. package/corpus/templates/chat/AGENTS.md +4 -0
  197. package/corpus/templates/chat/app/hooks/use-navigation-state.ts +1 -1
  198. package/corpus/templates/chat/app/routes/settings.tsx +2 -2
  199. package/corpus/templates/chat/app/routes/team.tsx +1 -1
  200. package/corpus/templates/clips/.agents/skills/actions/SKILL.md +5 -0
  201. package/corpus/templates/clips/.agents/skills/security/SKILL.md +7 -0
  202. package/corpus/templates/clips/.agents/skills/self-modifying-code/SKILL.md +20 -2
  203. package/corpus/templates/clips/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  204. package/corpus/templates/clips/AGENTS.md +4 -0
  205. package/corpus/templates/clips/actions/finalize-recording.ts +9 -3
  206. package/corpus/templates/clips/actions/set-thumbnail.ts +11 -2
  207. package/corpus/templates/clips/app/components/meetings/canvas-editor.tsx +1 -7
  208. package/corpus/templates/clips/app/components/player/player-controls.tsx +21 -13
  209. package/corpus/templates/clips/app/components/player/video-player.tsx +30 -75
  210. package/corpus/templates/clips/app/i18n/ar-SA.ts +6 -5
  211. package/corpus/templates/clips/app/i18n/de-DE.ts +6 -6
  212. package/corpus/templates/clips/app/i18n/en-US.ts +6 -5
  213. package/corpus/templates/clips/app/i18n/es-ES.ts +6 -5
  214. package/corpus/templates/clips/app/i18n/fr-FR.ts +6 -6
  215. package/corpus/templates/clips/app/i18n/hi-IN.ts +6 -5
  216. package/corpus/templates/clips/app/i18n/ja-JP.ts +6 -5
  217. package/corpus/templates/clips/app/i18n/ko-KR.ts +6 -5
  218. package/corpus/templates/clips/app/i18n/pt-BR.ts +6 -5
  219. package/corpus/templates/clips/app/i18n/zh-CN.ts +6 -5
  220. package/corpus/templates/clips/app/i18n/zh-TW.ts +6 -5
  221. package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +51 -118
  222. package/corpus/templates/clips/changelog/2026-07-08-desktop-meeting-notes-stay-active-from-tray-and-shortcut-controls.md +6 -0
  223. package/corpus/templates/clips/changelog/2026-07-08-desktop-meeting-popovers-can-start-notes-and-join-the-meetin.md +6 -0
  224. package/corpus/templates/clips/changelog/2026-07-08-hosted-clip-uploads-now-clear-failed-buffered-chunks.md +6 -0
  225. package/corpus/templates/clips/changelog/2026-07-08-hosted-recording-uploads-now-avoid-sql-chunk-storage.md +6 -0
  226. package/corpus/templates/clips/changelog/2026-07-08-meeting-notes-keep-their-recording-state-when-the-desktop.md +6 -0
  227. package/corpus/templates/clips/changelog/2026-07-08-meeting-recaps-now-keep-summaries-action-items-and-transcrip.md +6 -0
  228. package/corpus/templates/clips/changelog/2026-07-08-meeting-reminder-dropdowns-now-expand-fully-instead-of-being.md +6 -0
  229. package/corpus/templates/clips/changelog/2026-07-08-video-playback-controls-now-match-loom-style-5-second-skips-.md +6 -0
  230. package/corpus/templates/clips/desktop/src/app.tsx +123 -3
  231. package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +15 -1
  232. package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +23 -0
  233. package/corpus/templates/clips/desktop/src/styles.css +23 -1
  234. package/corpus/templates/clips/desktop/src-tauri/src/adhoc_meetings_watcher.rs +1 -3
  235. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +40 -6
  236. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +4 -2
  237. package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +3 -5
  238. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +23 -19
  239. package/corpus/templates/clips/desktop/src-tauri/src/shortcuts.rs +3 -3
  240. package/corpus/templates/clips/desktop/src-tauri/src/silence_detector.rs +0 -1
  241. package/corpus/templates/clips/desktop/src-tauri/src/state.rs +5 -0
  242. package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +18 -6
  243. package/corpus/templates/clips/server/lib/recording-upload-state.ts +63 -0
  244. package/corpus/templates/clips/server/lib/video-storage.ts +4 -0
  245. package/corpus/templates/clips/server/routes/api/recordings/[recordingId]/thumbnail.post.ts +19 -13
  246. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +40 -1
  247. package/corpus/templates/content/.agents/skills/actions/SKILL.md +5 -0
  248. package/corpus/templates/content/.agents/skills/real-time-sync/SKILL.md +1 -1
  249. package/corpus/templates/content/.agents/skills/security/SKILL.md +7 -0
  250. package/corpus/templates/content/.agents/skills/self-modifying-code/SKILL.md +20 -2
  251. package/corpus/templates/content/.agents/skills/storing-data/SKILL.md +5 -1
  252. package/corpus/templates/content/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  253. package/corpus/templates/content/AGENTS.md +4 -0
  254. package/corpus/templates/content/actions/_batch-utils.ts +8 -0
  255. package/corpus/templates/content/actions/_builder-cms-read-client.ts +7 -5
  256. package/corpus/templates/content/actions/_database-source-utils.ts +776 -319
  257. package/corpus/templates/content/actions/_database-utils.ts +6 -1
  258. package/corpus/templates/content/actions/_property-utils.ts +168 -0
  259. package/corpus/templates/content/actions/add-content-database-source-field-property.ts +19 -12
  260. package/corpus/templates/content/actions/bind-content-database-source-field.ts +19 -12
  261. package/corpus/templates/content/actions/delete-document.ts +9 -13
  262. package/corpus/templates/content/actions/refresh-content-database-source.ts +5 -5
  263. package/corpus/templates/content/app/components/editor/body-hydration.ts +35 -11
  264. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +47 -5
  265. package/corpus/templates/content/app/hooks/use-documents.ts +8 -2
  266. package/corpus/templates/content/app/routes/_app.settings.tsx +2 -2
  267. package/corpus/templates/content/app/routes/_app.team.tsx +1 -1
  268. package/corpus/templates/content/changelog/2026-07-08-builder-source-sync-now-completes-reliably-on-hosted-databases.md +6 -0
  269. package/corpus/templates/content/changelog/2026-07-08-fixed-builder-database-sync-so-large-sources-continue-past-t.md +6 -0
  270. package/corpus/templates/content/server/plugins/db.ts +19 -0
  271. package/corpus/templates/design/.agents/skills/actions/SKILL.md +5 -0
  272. package/corpus/templates/design/.agents/skills/security/SKILL.md +7 -0
  273. package/corpus/templates/design/.agents/skills/self-modifying-code/SKILL.md +20 -2
  274. package/corpus/templates/design/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  275. package/corpus/templates/design/AGENTS.md +4 -0
  276. package/corpus/templates/design/actions/take-design-screenshot.ts +12 -9
  277. package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +57 -13
  278. package/corpus/templates/design/app/routes/team.tsx +1 -1
  279. package/corpus/templates/design/changelog/2026-07-08-local-images-added-to-designs-now-upload-to-file-storage-ins.md +6 -0
  280. package/corpus/templates/dispatch/.agents/skills/actions/SKILL.md +5 -0
  281. package/corpus/templates/dispatch/.agents/skills/security/SKILL.md +7 -0
  282. package/corpus/templates/dispatch/.agents/skills/self-modifying-code/SKILL.md +20 -2
  283. package/corpus/templates/dispatch/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  284. package/corpus/templates/dispatch/AGENTS.md +4 -0
  285. package/corpus/templates/dispatch/app/hooks/use-navigation-state.ts +1 -1
  286. package/corpus/templates/dispatch/app/routes/settings.tsx +2 -2
  287. package/corpus/templates/dispatch/app/routes/team.tsx +1 -1
  288. package/corpus/templates/forms/.agents/skills/actions/SKILL.md +5 -0
  289. package/corpus/templates/forms/.agents/skills/real-time-sync/SKILL.md +1 -1
  290. package/corpus/templates/forms/.agents/skills/security/SKILL.md +7 -0
  291. package/corpus/templates/forms/.agents/skills/self-modifying-code/SKILL.md +20 -2
  292. package/corpus/templates/forms/.agents/skills/storing-data/SKILL.md +5 -1
  293. package/corpus/templates/forms/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  294. package/corpus/templates/forms/AGENTS.md +4 -0
  295. package/corpus/templates/forms/app/routes/_app.settings.tsx +2 -2
  296. package/corpus/templates/forms/app/routes/_app.team.tsx +1 -1
  297. package/corpus/templates/forms/shared/navigation.ts +1 -1
  298. package/corpus/templates/macros/.agents/skills/security/SKILL.md +7 -0
  299. package/corpus/templates/macros/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  300. package/corpus/templates/macros/AGENTS.md +4 -0
  301. package/corpus/templates/macros/app/routes/settings.tsx +2 -2
  302. package/corpus/templates/macros/app/routes/team.tsx +1 -1
  303. package/corpus/templates/mail/.agents/skills/actions/SKILL.md +5 -0
  304. package/corpus/templates/mail/.agents/skills/email-drafts/SKILL.md +1 -1
  305. package/corpus/templates/mail/.agents/skills/real-time-sync/SKILL.md +1 -1
  306. package/corpus/templates/mail/.agents/skills/security/SKILL.md +7 -0
  307. package/corpus/templates/mail/.agents/skills/self-modifying-code/SKILL.md +20 -2
  308. package/corpus/templates/mail/.agents/skills/storing-data/SKILL.md +5 -1
  309. package/corpus/templates/mail/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  310. package/corpus/templates/mail/AGENTS.md +4 -0
  311. package/corpus/templates/mail/changelog/2026-07-08-mail-attachments-in-hosted-environments-now-require-file-sto.md +6 -0
  312. package/corpus/templates/mail/server/handlers/media.ts +26 -1
  313. package/corpus/templates/mail/server/lib/outgoing-email.ts +24 -1
  314. package/corpus/templates/mail/server/lib/upload-store.ts +2 -1
  315. package/corpus/templates/plan/.agents/skills/actions/SKILL.md +5 -0
  316. package/corpus/templates/plan/.agents/skills/adding-a-feature/SKILL.md +5 -0
  317. package/corpus/templates/plan/.agents/skills/real-time-sync/SKILL.md +1 -1
  318. package/corpus/templates/plan/.agents/skills/security/SKILL.md +7 -0
  319. package/corpus/templates/plan/.agents/skills/self-modifying-code/SKILL.md +20 -2
  320. package/corpus/templates/plan/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  321. package/corpus/templates/plan/AGENTS.md +4 -0
  322. package/corpus/templates/plan/app/hooks/use-navigation-state.ts +1 -1
  323. package/corpus/templates/plan/app/routes/settings.tsx +2 -2
  324. package/corpus/templates/plan/app/routes/team.tsx +1 -1
  325. package/corpus/templates/plan/changelog/2026-07-08-hosted-plan-images-now-require-connected-storage.md +6 -0
  326. package/corpus/templates/plan/server/lib/plan-assets.ts +33 -4
  327. package/corpus/templates/slides/.agents/skills/actions/SKILL.md +5 -0
  328. package/corpus/templates/slides/.agents/skills/security/SKILL.md +7 -0
  329. package/corpus/templates/slides/.agents/skills/self-modifying-code/SKILL.md +20 -2
  330. package/corpus/templates/slides/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  331. package/corpus/templates/slides/AGENTS.md +4 -0
  332. package/corpus/templates/slides/actions/generate-image-api.ts +15 -3
  333. package/corpus/templates/slides/app/routes/settings.tsx +2 -2
  334. package/corpus/templates/slides/app/routes/team.tsx +1 -1
  335. package/corpus/templates/slides/changelog/2026-07-08-generated-slide-images-now-return-hosted-file-storage-urls-i.md +6 -0
  336. package/corpus/templates/slides/shared/api.ts +1 -1
  337. package/corpus/templates/videos/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  338. package/corpus/templates/voice/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  339. package/dist/agent/production-agent.d.ts +5 -1
  340. package/dist/agent/production-agent.d.ts.map +1 -1
  341. package/dist/agent/production-agent.js +112 -42
  342. package/dist/agent/production-agent.js.map +1 -1
  343. package/dist/agent/tool-search.d.ts +2 -0
  344. package/dist/agent/tool-search.d.ts.map +1 -1
  345. package/dist/agent/tool-search.js +60 -4
  346. package/dist/agent/tool-search.js.map +1 -1
  347. package/dist/application-state/store.d.ts.map +1 -1
  348. package/dist/application-state/store.js +8 -2
  349. package/dist/application-state/store.js.map +1 -1
  350. package/dist/cli/index.js +19 -0
  351. package/dist/cli/index.js.map +1 -1
  352. package/dist/cli/upgrade.d.ts +100 -0
  353. package/dist/cli/upgrade.d.ts.map +1 -0
  354. package/dist/cli/upgrade.js +678 -0
  355. package/dist/cli/upgrade.js.map +1 -0
  356. package/dist/client/AssistantChat.d.ts.map +1 -1
  357. package/dist/client/AssistantChat.js +25 -14
  358. package/dist/client/AssistantChat.js.map +1 -1
  359. package/dist/client/HighlightedCodeBlock.d.ts +2 -0
  360. package/dist/client/HighlightedCodeBlock.d.ts.map +1 -1
  361. package/dist/client/HighlightedCodeBlock.js +10 -1
  362. package/dist/client/HighlightedCodeBlock.js.map +1 -1
  363. package/dist/client/PoweredByBadge.d.ts +1 -1
  364. package/dist/client/PoweredByBadge.d.ts.map +1 -1
  365. package/dist/client/PoweredByBadge.js +3 -9
  366. package/dist/client/PoweredByBadge.js.map +1 -1
  367. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  368. package/dist/client/agent-chat-adapter.js +60 -13
  369. package/dist/client/agent-chat-adapter.js.map +1 -1
  370. package/dist/client/chat/message-components.d.ts.map +1 -1
  371. package/dist/client/chat/message-components.js +61 -8
  372. package/dist/client/chat/message-components.js.map +1 -1
  373. package/dist/client/chat/tool-call-display.d.ts +12 -0
  374. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  375. package/dist/client/chat/tool-call-display.js +136 -42
  376. package/dist/client/chat/tool-call-display.js.map +1 -1
  377. package/dist/client/chat/widgets/DataTableWidget.d.ts.map +1 -1
  378. package/dist/client/chat/widgets/DataTableWidget.js +19 -2
  379. package/dist/client/chat/widgets/DataTableWidget.js.map +1 -1
  380. package/dist/client/code-agent-chat-adapter.js +2 -9
  381. package/dist/client/code-agent-chat-adapter.js.map +1 -1
  382. package/dist/client/db-admin/TableEditor.d.ts.map +1 -1
  383. package/dist/client/db-admin/TableEditor.js +19 -2
  384. package/dist/client/db-admin/TableEditor.js.map +1 -1
  385. package/dist/client/db-admin/export-utils.d.ts +2 -0
  386. package/dist/client/db-admin/export-utils.d.ts.map +1 -1
  387. package/dist/client/db-admin/export-utils.js +11 -3
  388. package/dist/client/db-admin/export-utils.js.map +1 -1
  389. package/dist/client/db-admin/useAgentSync.d.ts.map +1 -1
  390. package/dist/client/db-admin/useAgentSync.js +63 -0
  391. package/dist/client/db-admin/useAgentSync.js.map +1 -1
  392. package/dist/client/error-capture.d.ts.map +1 -1
  393. package/dist/client/error-capture.js +41 -7
  394. package/dist/client/error-capture.js.map +1 -1
  395. package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -1
  396. package/dist/client/extensions/EmbeddedExtension.js +3 -1
  397. package/dist/client/extensions/EmbeddedExtension.js.map +1 -1
  398. package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
  399. package/dist/client/extensions/ExtensionViewer.js +32 -5
  400. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  401. package/dist/client/extensions/InlineExtensionFrame.d.ts.map +1 -1
  402. package/dist/client/extensions/InlineExtensionFrame.js +3 -1
  403. package/dist/client/extensions/InlineExtensionFrame.js.map +1 -1
  404. package/dist/client/extensions/portable-extension.d.ts.map +1 -1
  405. package/dist/client/extensions/portable-extension.js +1 -0
  406. package/dist/client/extensions/portable-extension.js.map +1 -1
  407. package/dist/client/org/OrgSwitcher.d.ts +1 -1
  408. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  409. package/dist/client/org/OrgSwitcher.js +11 -6
  410. package/dist/client/org/OrgSwitcher.js.map +1 -1
  411. package/dist/client/org/TeamPage.d.ts.map +1 -1
  412. package/dist/client/org/TeamPage.js +5 -5
  413. package/dist/client/org/TeamPage.js.map +1 -1
  414. package/dist/client/session-replay.d.ts +0 -8
  415. package/dist/client/session-replay.d.ts.map +1 -1
  416. package/dist/client/session-replay.js +3 -80
  417. package/dist/client/session-replay.js.map +1 -1
  418. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  419. package/dist/client/settings/SettingsPanel.js +89 -33
  420. package/dist/client/settings/SettingsPanel.js.map +1 -1
  421. package/dist/client/settings/SettingsSection.d.ts +19 -4
  422. package/dist/client/settings/SettingsSection.d.ts.map +1 -1
  423. package/dist/client/settings/SettingsSection.js +33 -4
  424. package/dist/client/settings/SettingsSection.js.map +1 -1
  425. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  426. package/dist/client/settings/SettingsTabsPage.js +21 -10
  427. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  428. package/dist/client/sse-event-processor.d.ts +9 -0
  429. package/dist/client/sse-event-processor.d.ts.map +1 -1
  430. package/dist/client/sse-event-processor.js +20 -2
  431. package/dist/client/sse-event-processor.js.map +1 -1
  432. package/dist/db-admin/agent-tools.d.ts.map +1 -1
  433. package/dist/db-admin/agent-tools.js +7 -2
  434. package/dist/db-admin/agent-tools.js.map +1 -1
  435. package/dist/db-admin/operations.d.ts.map +1 -1
  436. package/dist/db-admin/operations.js +90 -4
  437. package/dist/db-admin/operations.js.map +1 -1
  438. package/dist/db-admin/routes.d.ts.map +1 -1
  439. package/dist/db-admin/routes.js +1 -0
  440. package/dist/db-admin/routes.js.map +1 -1
  441. package/dist/db-admin/types.d.ts +4 -0
  442. package/dist/db-admin/types.d.ts.map +1 -1
  443. package/dist/db-admin/types.js.map +1 -1
  444. package/dist/extensions/actions.d.ts.map +1 -1
  445. package/dist/extensions/actions.js +85 -5
  446. package/dist/extensions/actions.js.map +1 -1
  447. package/dist/extensions/html-shell.d.ts +5 -4
  448. package/dist/extensions/html-shell.d.ts.map +1 -1
  449. package/dist/extensions/html-shell.js.map +1 -1
  450. package/dist/extensions/routes.d.ts.map +1 -1
  451. package/dist/extensions/routes.js +8 -0
  452. package/dist/extensions/routes.js.map +1 -1
  453. package/dist/navigation/index.d.ts +1 -1
  454. package/dist/navigation/index.d.ts.map +1 -1
  455. package/dist/navigation/index.js +1 -1
  456. package/dist/navigation/index.js.map +1 -1
  457. package/dist/notifications/channels.d.ts +8 -3
  458. package/dist/notifications/channels.d.ts.map +1 -1
  459. package/dist/notifications/channels.js +61 -22
  460. package/dist/notifications/channels.js.map +1 -1
  461. package/dist/notifications/registry.d.ts.map +1 -1
  462. package/dist/notifications/registry.js +14 -3
  463. package/dist/notifications/registry.js.map +1 -1
  464. package/dist/notifications/types.d.ts +4 -1
  465. package/dist/notifications/types.d.ts.map +1 -1
  466. package/dist/notifications/types.js.map +1 -1
  467. package/dist/resources/handlers.d.ts +5 -0
  468. package/dist/resources/handlers.d.ts.map +1 -1
  469. package/dist/resources/handlers.js +9 -8
  470. package/dist/resources/handlers.js.map +1 -1
  471. package/dist/server/agent-chat-plugin.d.ts +5 -1
  472. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  473. package/dist/server/agent-chat-plugin.js +2 -2
  474. package/dist/server/agent-chat-plugin.js.map +1 -1
  475. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  476. package/dist/server/poll.d.ts +12 -4
  477. package/dist/server/poll.d.ts.map +1 -1
  478. package/dist/server/poll.js +236 -9
  479. package/dist/server/poll.js.map +1 -1
  480. package/dist/server/request-context.d.ts +7 -0
  481. package/dist/server/request-context.d.ts.map +1 -1
  482. package/dist/server/request-context.js.map +1 -1
  483. package/dist/styles/agent-conversation.css +1 -1
  484. package/dist/styles/agent-native.css +27 -0
  485. package/dist/templates/default/.agents/skills/actions/SKILL.md +5 -0
  486. package/dist/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  487. package/dist/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
  488. package/dist/templates/default/.agents/skills/security/SKILL.md +7 -0
  489. package/dist/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
  490. package/dist/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
  491. package/dist/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  492. package/dist/templates/default/AGENTS.md +14 -5
  493. package/dist/templates/default/package.json +2 -1
  494. package/dist/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  495. package/dist/templates/headless/AGENTS.md +13 -3
  496. package/dist/templates/headless/package.json +1 -0
  497. package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
  498. package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  499. package/dist/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
  500. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
  501. package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
  502. package/dist/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
  503. package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
  504. package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
  505. package/dist/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
  506. package/dist/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  507. package/dist/templates/workspace-core/AGENTS.md +7 -1
  508. package/dist/templates/workspace-root/AGENTS.md +17 -5
  509. package/dist/templates/workspace-root/package.json +1 -0
  510. package/docs/content/faq.mdx +17 -0
  511. package/docs/content/notifications.mdx +12 -6
  512. package/package.json +2 -2
  513. package/src/templates/default/.agents/skills/actions/SKILL.md +5 -0
  514. package/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  515. package/src/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
  516. package/src/templates/default/.agents/skills/security/SKILL.md +7 -0
  517. package/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
  518. package/src/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
  519. package/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  520. package/src/templates/default/AGENTS.md +14 -5
  521. package/src/templates/default/package.json +2 -1
  522. package/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  523. package/src/templates/headless/AGENTS.md +13 -3
  524. package/src/templates/headless/package.json +1 -0
  525. package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
  526. package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  527. package/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
  528. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
  529. package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
  530. package/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
  531. package/src/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
  532. package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
  533. package/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
  534. package/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  535. package/src/templates/workspace-core/AGENTS.md +7 -1
  536. package/src/templates/workspace-root/AGENTS.md +17 -5
  537. package/src/templates/workspace-root/package.json +1 -0
  538. package/corpus/templates/analytics/changelog/2026-07-08-session-replay-clamps-ultra-wide-viewports-while-keeping-the.md +0 -6
@@ -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}