@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
@@ -113,6 +113,8 @@ const CHART_LEGEND_PROPS = {
113
113
  const PARTIAL_DAY_TIME_ZONE = "America/Los_Angeles";
114
114
  const PARTIAL_DAY_DASH = "3 5";
115
115
  const PARTIAL_DAY_KEY_PREFIX = "__sql_chart_partial_day";
116
+ const TABLE_PANEL_MIN_HEIGHT_CLASS = "min-h-[386px]";
117
+ const TABLE_PANEL_SKELETON_ROWS = 10;
116
118
 
117
119
  function formatYValue(
118
120
  value: number,
@@ -488,7 +490,7 @@ function SeriesLegend({
488
490
  if (!shouldShowLegend(panel, keys.length)) return null;
489
491
 
490
492
  return (
491
- <div className="mt-2 max-h-16 overflow-y-auto overflow-x-hidden pr-1 text-[11px] leading-4 text-muted-foreground">
493
+ <div className="mt-2 min-h-16 max-h-16 overflow-y-auto overflow-x-hidden pr-1 text-[11px] leading-4 text-muted-foreground">
492
494
  <div className="flex flex-wrap gap-x-3 gap-y-1">
493
495
  {keys.map((key, i) => {
494
496
  const hidden = hiddenKeys?.has(key) ?? false;
@@ -586,6 +588,113 @@ function ChartFrame({
586
588
  );
587
589
  }
588
590
 
591
+ function isTableLikeChartType(type: ChartType): boolean {
592
+ return type === "table" || type === "heatmap";
593
+ }
594
+
595
+ function chartTypeReservesLegend(panel: SqlPanel): boolean {
596
+ if (panel.config?.legend === false) return false;
597
+ const chartUsesFrame =
598
+ panel.chartType === "line" ||
599
+ panel.chartType === "area" ||
600
+ panel.chartType === "bar" ||
601
+ panel.chartType === "pie";
602
+ if (!chartUsesFrame) return false;
603
+ return (
604
+ panel.chartType === "line" ||
605
+ panel.chartType === "area" ||
606
+ panel.chartType === "bar" ||
607
+ usesPrometheusPresentation(panel)
608
+ );
609
+ }
610
+
611
+ function TableLoadingSkeleton() {
612
+ const columnWidths = ["w-24", "w-32", "w-20", "w-28"];
613
+
614
+ return (
615
+ <div
616
+ data-dashboard-report-loading="true"
617
+ className={`w-full flex-1 space-y-1 ${TABLE_PANEL_MIN_HEIGHT_CLASS}`}
618
+ >
619
+ <div className="relative overflow-x-auto">
620
+ <div className="min-w-[480px]">
621
+ <div className="grid h-8 grid-cols-4 items-center border-b border-border px-2">
622
+ {columnWidths.map((width, index) => (
623
+ <Skeleton key={index} className={`h-3 ${width}`} />
624
+ ))}
625
+ </div>
626
+ {Array.from({ length: TABLE_PANEL_SKELETON_ROWS }).map((_, row) => (
627
+ <div
628
+ key={row}
629
+ className="grid h-8 grid-cols-4 items-center border-b border-border/50 px-2"
630
+ >
631
+ {columnWidths.map((width, col) => (
632
+ <Skeleton
633
+ key={col}
634
+ className={`h-3 ${
635
+ col === 0 ? "w-36" : col === 2 ? "ml-auto w-16" : width
636
+ }`}
637
+ />
638
+ ))}
639
+ </div>
640
+ ))}
641
+ </div>
642
+ </div>
643
+ <div className="flex h-8 items-center justify-between border-t border-border px-1 text-xs">
644
+ <Skeleton className="h-3 w-28" />
645
+ <Skeleton className="h-3 w-24" />
646
+ </div>
647
+ </div>
648
+ );
649
+ }
650
+
651
+ function SqlChartLoadingSkeleton({ panel }: { panel: SqlPanel }) {
652
+ const fill = useContext(ChartFillHeightContext);
653
+
654
+ if (panel.chartType === "metric") {
655
+ return (
656
+ <Skeleton
657
+ data-dashboard-report-loading="true"
658
+ className="w-full flex-1 min-h-12"
659
+ />
660
+ );
661
+ }
662
+
663
+ if (isTableLikeChartType(panel.chartType)) {
664
+ return <TableLoadingSkeleton />;
665
+ }
666
+
667
+ const reserveLegend = chartTypeReservesLegend(panel);
668
+
669
+ if (!reserveLegend) {
670
+ return (
671
+ <Skeleton
672
+ data-dashboard-report-loading="true"
673
+ className={`w-full flex-1 ${fill ? "h-full min-h-[250px]" : "min-h-[250px]"}`}
674
+ />
675
+ );
676
+ }
677
+
678
+ return (
679
+ <div
680
+ data-dashboard-report-loading="true"
681
+ className={`flex w-full flex-1 flex-col overflow-hidden ${fill ? "h-full" : ""}`}
682
+ >
683
+ <Skeleton
684
+ className={`w-full ${fill ? "h-full min-h-[250px] flex-1" : "h-[250px]"}`}
685
+ />
686
+ <div className="mt-2 grid min-h-16 grid-cols-2 gap-x-3 gap-y-1 overflow-hidden pr-1 sm:grid-cols-3">
687
+ {Array.from({ length: 6 }).map((_, index) => (
688
+ <div key={index} className="flex items-center gap-1.5">
689
+ <Skeleton className="h-2.5 w-3 shrink-0 rounded-sm" />
690
+ <Skeleton className="h-3 w-20 min-w-0" />
691
+ </div>
692
+ ))}
693
+ </div>
694
+ </div>
695
+ );
696
+ }
697
+
589
698
  function ChartTooltip({
590
699
  active,
591
700
  payload,
@@ -962,16 +1071,16 @@ export function SqlChart({
962
1071
  const yFormatter = panel.config?.yFormatter;
963
1072
 
964
1073
  const isMetric = panel.chartType === "metric";
965
- const placeholderMinH = isMetric ? "min-h-12" : "min-h-[250px]";
1074
+ const isTableLike = isTableLikeChartType(panel.chartType);
1075
+ const placeholderMinH = isMetric
1076
+ ? "min-h-12"
1077
+ : isTableLike
1078
+ ? TABLE_PANEL_MIN_HEIGHT_CLASS
1079
+ : "min-h-[250px]";
966
1080
  const placeholderPadY = isMetric ? "py-2" : "py-8";
967
1081
 
968
1082
  if (!loadData || isLoading) {
969
- return (
970
- <Skeleton
971
- data-dashboard-report-loading="true"
972
- className={`w-full flex-1 ${placeholderMinH}`}
973
- />
974
- );
1083
+ return <SqlChartLoadingSkeleton panel={panel} />;
975
1084
  }
976
1085
 
977
1086
  if (error) {
@@ -1366,7 +1475,7 @@ function TableRenderer({
1366
1475
  }, [handleExportCsv, onExportCsvChange]);
1367
1476
 
1368
1477
  return (
1369
- <div className="space-y-1">
1478
+ <div className={`space-y-1 ${TABLE_PANEL_MIN_HEIGHT_CLASS}`}>
1370
1479
  <div className="relative overflow-x-auto">
1371
1480
  <table className="w-full text-sm">
1372
1481
  <thead>
@@ -1989,7 +2098,9 @@ function HeatmapRenderer({
1989
2098
 
1990
2099
  if (rows.length === 0 || !valueKey) {
1991
2100
  return (
1992
- <div className="flex min-h-[250px] items-center justify-center py-8">
2101
+ <div
2102
+ className={`flex items-center justify-center py-8 ${TABLE_PANEL_MIN_HEIGHT_CLASS}`}
2103
+ >
1993
2104
  <p className="text-sm text-muted-foreground text-center">
1994
2105
  {t("common.noData")}
1995
2106
  </p>
@@ -2010,7 +2121,7 @@ function HeatmapRenderer({
2010
2121
  };
2011
2122
 
2012
2123
  return (
2013
- <div className="overflow-x-auto">
2124
+ <div className={`${TABLE_PANEL_MIN_HEIGHT_CLASS} overflow-x-auto`}>
2014
2125
  <table className="w-full border-collapse text-sm">
2015
2126
  <thead>
2016
2127
  <tr className="border-b border-border">
@@ -8,6 +8,7 @@ import {
8
8
  useT,
9
9
  } from "@agent-native/core/client";
10
10
  import { extensionPath } from "@agent-native/core/client/extensions";
11
+ import { useOrgRole } from "@agent-native/core/client/org";
11
12
  import {
12
13
  IconFlask,
13
14
  IconTool,
@@ -64,8 +65,8 @@ interface ExtensionSearchItem {
64
65
  const defaultTools = [
65
66
  {
66
67
  id: "agents",
67
- nameKey: "navigation.agents",
68
- href: "/agents",
68
+ nameKey: "navigation.admin",
69
+ href: "/agents?view=dashboards",
69
70
  keywords: [
70
71
  "agent monitoring",
71
72
  "observability",
@@ -74,6 +75,8 @@ const defaultTools = [
74
75
  "feedback",
75
76
  "database",
76
77
  "db admin",
78
+ "dashboard usage",
79
+ "dashboard audit",
77
80
  "ab testing",
78
81
  "llm",
79
82
  ],
@@ -218,6 +221,7 @@ function persistThemePreference(theme: "light" | "dark") {
218
221
 
219
222
  export function CommandPalette() {
220
223
  const t = useT();
224
+ const { canManageOrg } = useOrgRole();
221
225
  const [open, setOpen] = useState(false);
222
226
  const [changelogOpen, setChangelogOpen] = useState(false);
223
227
  const [languageOpen, setLanguageOpen] = useState(false);
@@ -428,20 +432,22 @@ export function CommandPalette() {
428
432
  </CommandGroup>
429
433
 
430
434
  <CommandGroup heading={t("commandPalette.groupTools")}>
431
- {defaultTools.map((tool) => (
432
- <CommandItem
433
- key={`tool-${tool.id}`}
434
- onSelect={() => go(tool.href)}
435
- keywords={commandPaletteKeywords(
436
- t(tool.nameKey),
437
- "tool",
438
- ...tool.keywords,
439
- )}
440
- >
441
- <IconTool className="me-2 h-4 w-4 text-muted-foreground" />
442
- {t(tool.nameKey)}
443
- </CommandItem>
444
- ))}
435
+ {defaultTools
436
+ .filter((tool) => tool.id !== "agents" || canManageOrg)
437
+ .map((tool) => (
438
+ <CommandItem
439
+ key={`tool-${tool.id}`}
440
+ onSelect={() => go(tool.href)}
441
+ keywords={commandPaletteKeywords(
442
+ t(tool.nameKey),
443
+ "tool",
444
+ ...tool.keywords,
445
+ )}
446
+ >
447
+ <IconTool className="me-2 h-4 w-4 text-muted-foreground" />
448
+ {t(tool.nameKey)}
449
+ </CommandItem>
450
+ ))}
445
451
  </CommandGroup>
446
452
 
447
453
  <CommandGroup heading={t("commandPalette.groupAppearance")}>
@@ -21,7 +21,7 @@ const pageTitleKeys: Record<string, string> = {
21
21
  "/analyses": "navigation.analyses",
22
22
  "/sessions": "navigation.sessions",
23
23
  "/monitoring": "navigation.monitoring",
24
- "/agents": "navigation.agents",
24
+ "/agents": "navigation.admin",
25
25
  "/dashboards/explorer": "navigation.explorer",
26
26
  "/settings": "navigation.settings",
27
27
  };
@@ -14,7 +14,6 @@ import {
14
14
  IconReportAnalytics,
15
15
  IconSearch,
16
16
  IconArchive,
17
- IconActivity,
18
17
  IconHeartbeat,
19
18
  IconPin,
20
19
  IconPlus,
@@ -27,6 +26,7 @@ import {
27
26
  IconPlayerPlay,
28
27
  IconLayoutSidebarLeftCollapse,
29
28
  IconLayoutSidebarLeftExpand,
29
+ IconShieldCheck,
30
30
  } from "@tabler/icons-react";
31
31
  import {
32
32
  useQuery,
@@ -83,7 +83,7 @@ import {
83
83
  type ChatThreadSummary,
84
84
  } from "@agent-native/core/client";
85
85
  import { ExtensionsSidebarSection } from "@agent-native/core/client/extensions";
86
- import { OrgSwitcher } from "@agent-native/core/client/org";
86
+ import { OrgSwitcher, useOrgRole } from "@agent-native/core/client/org";
87
87
 
88
88
  import {
89
89
  AlertDialog,
@@ -1585,6 +1585,7 @@ export function Sidebar({ mobile }: { mobile?: boolean } = {}) {
1585
1585
  const navigate = useNavigate();
1586
1586
  const t = useT();
1587
1587
  const queryClient = useQueryClient();
1588
+ const { canManageOrg } = useOrgRole();
1588
1589
  const { setTheme } = useTheme();
1589
1590
 
1590
1591
  const isAskRoute = location.pathname === "/ask";
@@ -2397,12 +2398,16 @@ export function Sidebar({ mobile }: { mobile?: boolean } = {}) {
2397
2398
  href: "/monitoring",
2398
2399
  active: location.pathname.startsWith("/monitoring"),
2399
2400
  },
2400
- {
2401
- icon: IconActivity,
2402
- label: t("navigation.agents"),
2403
- href: "/agents",
2404
- active: location.pathname.startsWith("/agents"),
2405
- },
2401
+ ...(canManageOrg
2402
+ ? [
2403
+ {
2404
+ icon: IconShieldCheck,
2405
+ label: t("navigation.admin"),
2406
+ href: "/agents?view=dashboards",
2407
+ active: location.pathname.startsWith("/agents"),
2408
+ },
2409
+ ]
2410
+ : []),
2406
2411
  {
2407
2412
  icon: IconDatabase,
2408
2413
  label: t("navigation.dataSources"),
@@ -2618,19 +2623,20 @@ export function Sidebar({ mobile }: { mobile?: boolean } = {}) {
2618
2623
  {t("navigation.monitoring")}
2619
2624
  </Link>
2620
2625
 
2621
- {/* Agents link */}
2622
- <Link
2623
- to="/agents"
2624
- className={cn(
2625
- "flex items-center gap-3 rounded-lg px-3 py-2 transition-all hover:text-primary",
2626
- location.pathname.startsWith("/agents")
2627
- ? "bg-sidebar-accent text-sidebar-accent-foreground"
2628
- : "text-muted-foreground hover:bg-sidebar-accent/50",
2629
- )}
2630
- >
2631
- <IconActivity className="h-4 w-4" />
2632
- {t("navigation.agents")}
2633
- </Link>
2626
+ {canManageOrg ? (
2627
+ <Link
2628
+ to="/agents?view=dashboards"
2629
+ className={cn(
2630
+ "flex items-center gap-3 rounded-lg px-3 py-2 transition-all hover:text-primary",
2631
+ location.pathname.startsWith("/agents")
2632
+ ? "bg-sidebar-accent text-sidebar-accent-foreground"
2633
+ : "text-muted-foreground hover:bg-sidebar-accent/50",
2634
+ )}
2635
+ >
2636
+ <IconShieldCheck className="h-4 w-4" />
2637
+ {t("navigation.admin")}
2638
+ </Link>
2639
+ ) : null}
2634
2640
 
2635
2641
  {/* Data Sources link */}
2636
2642
  <Link
@@ -0,0 +1,43 @@
1
+ import { useActionMutation, useActionQuery } from "@agent-native/core/client";
2
+ import { useQueryClient } from "@tanstack/react-query";
3
+
4
+ export interface AnalysisRevision {
5
+ id: string;
6
+ analysisId: string;
7
+ name: string;
8
+ description: string;
9
+ createdAt: string;
10
+ createdBy: string | null;
11
+ }
12
+
13
+ export function useAnalysisRevisions(analysisId: string | null) {
14
+ return useActionQuery<AnalysisRevision[]>(
15
+ "list-analysis-revisions",
16
+ analysisId ? { analysisId } : undefined,
17
+ {
18
+ enabled: !!analysisId,
19
+ select: (data: any) => {
20
+ const revisions = data?.revisions ?? data;
21
+ return Array.isArray(revisions) ? revisions : [];
22
+ },
23
+ placeholderData: (prev: any) => prev,
24
+ } as any,
25
+ );
26
+ }
27
+
28
+ export function useRestoreAnalysisRevision(analysisId: string) {
29
+ const queryClient = useQueryClient();
30
+ return useActionMutation<
31
+ { id: string; name: string; updatedAt: string },
32
+ { analysisId: string; revisionId: string }
33
+ >("restore-analysis-revision", {
34
+ onSuccess: () => {
35
+ queryClient.invalidateQueries({
36
+ queryKey: ["action", "list-analysis-revisions", { analysisId }],
37
+ });
38
+ queryClient.invalidateQueries({
39
+ queryKey: ["analysis-detail", analysisId],
40
+ });
41
+ },
42
+ });
43
+ }
@@ -0,0 +1,110 @@
1
+ import {
2
+ deleteClientAppState,
3
+ readClientAppState,
4
+ removeAgentChatContextItem,
5
+ setAgentChatContextItem,
6
+ setClientAppState,
7
+ } from "@agent-native/core/client";
8
+ import { useEffect } from "react";
9
+
10
+ import { TAB_ID } from "@/lib/tab-id";
11
+
12
+ const DASHBOARD_CONTEXT_KEY = "analytics-selected-dashboard";
13
+ const SELECTED_OBJECT_STATE_KEY = "selected-object";
14
+ const SELECTED_OBJECT_SOURCE_FIELD = "__agentNativeSelectedObjectSource";
15
+
16
+ export interface DashboardChatContextArgs {
17
+ id: string | null | undefined;
18
+ kind: "explorer" | "sql";
19
+ title?: string | null;
20
+ panelCount?: number;
21
+ canEdit?: boolean;
22
+ }
23
+
24
+ function dashboardContext(
25
+ args: Required<Pick<DashboardChatContextArgs, "id" | "kind">> & {
26
+ title: string;
27
+ panelCount?: number;
28
+ canEdit?: boolean;
29
+ },
30
+ ): string {
31
+ const lines = [
32
+ `The user currently has this Analytics dashboard selected: ${args.title}.`,
33
+ `Dashboard id: ${args.id}`,
34
+ `Dashboard kind: ${args.kind}`,
35
+ ];
36
+ if (typeof args.panelCount === "number") {
37
+ lines.push(`Panel count: ${args.panelCount}`);
38
+ }
39
+ if (typeof args.canEdit === "boolean") {
40
+ lines.push(`User can edit: ${args.canEdit ? "yes" : "no"}`);
41
+ }
42
+ if (typeof window !== "undefined") {
43
+ lines.push(
44
+ `Current URL: ${window.location.pathname}${window.location.search}`,
45
+ );
46
+ }
47
+ lines.push(
48
+ "Use the Analytics dashboard actions to inspect, edit, or restore this dashboard.",
49
+ );
50
+ return lines.join("\n");
51
+ }
52
+
53
+ async function deleteSelectedObjectIfOwned() {
54
+ try {
55
+ const current = await readClientAppState<Record<string, unknown>>(
56
+ SELECTED_OBJECT_STATE_KEY,
57
+ );
58
+ if (current?.[SELECTED_OBJECT_SOURCE_FIELD] !== TAB_ID) return;
59
+ await deleteClientAppState(SELECTED_OBJECT_STATE_KEY, {
60
+ keepalive: true,
61
+ requestSource: TAB_ID,
62
+ });
63
+ } catch {
64
+ // Best effort only; avoid clearing another tab's selected object on errors.
65
+ }
66
+ }
67
+
68
+ export function useDashboardChatContext(args: DashboardChatContextArgs): void {
69
+ const { id, kind, title, panelCount, canEdit } = args;
70
+
71
+ useEffect(() => {
72
+ if (!id) return;
73
+ const displayTitle = title?.trim() || id;
74
+ const selection = {
75
+ type: "dashboard",
76
+ id,
77
+ kind,
78
+ title: displayTitle,
79
+ panelCount,
80
+ canEdit,
81
+ [SELECTED_OBJECT_SOURCE_FIELD]: TAB_ID,
82
+ };
83
+
84
+ setAgentChatContextItem({
85
+ key: DASHBOARD_CONTEXT_KEY,
86
+ title: `Dashboard: ${displayTitle}`,
87
+ context: dashboardContext({
88
+ id,
89
+ kind,
90
+ title: displayTitle,
91
+ panelCount,
92
+ canEdit,
93
+ }),
94
+ openSidebar: false,
95
+ focus: false,
96
+ });
97
+ setClientAppState(SELECTED_OBJECT_STATE_KEY, selection, {
98
+ keepalive: true,
99
+ requestSource: TAB_ID,
100
+ }).catch(() => {});
101
+
102
+ return () => {
103
+ removeAgentChatContextItem({
104
+ key: DASHBOARD_CONTEXT_KEY,
105
+ openSidebar: false,
106
+ });
107
+ deleteSelectedObjectIfOwned();
108
+ };
109
+ }, [canEdit, id, kind, panelCount, title]);
110
+ }
@@ -0,0 +1,43 @@
1
+ import { useActionMutation, useActionQuery } from "@agent-native/core/client";
2
+ import { useQueryClient } from "@tanstack/react-query";
3
+
4
+ export interface DashboardRevision {
5
+ id: string;
6
+ dashboardId: string;
7
+ kind: "explorer" | "sql";
8
+ title: string;
9
+ createdAt: string;
10
+ createdBy: string | null;
11
+ }
12
+
13
+ export function useDashboardRevisions(dashboardId: string | null) {
14
+ return useActionQuery<DashboardRevision[]>(
15
+ "list-dashboard-revisions",
16
+ dashboardId ? { dashboardId } : undefined,
17
+ {
18
+ enabled: !!dashboardId,
19
+ select: (data: any) => {
20
+ const revisions = data?.revisions ?? data;
21
+ return Array.isArray(revisions) ? revisions : [];
22
+ },
23
+ placeholderData: (prev: any) => prev,
24
+ } as any,
25
+ );
26
+ }
27
+
28
+ export function useRestoreDashboardRevision(dashboardId: string) {
29
+ const queryClient = useQueryClient();
30
+ return useActionMutation<
31
+ { id: string; name: string; updatedAt: string },
32
+ { dashboardId: string; revisionId: string }
33
+ >("restore-dashboard-revision", {
34
+ onSuccess: () => {
35
+ queryClient.invalidateQueries({
36
+ queryKey: ["action", "list-dashboard-revisions", { dashboardId }],
37
+ });
38
+ queryClient.invalidateQueries({
39
+ queryKey: ["dashboard", dashboardId],
40
+ });
41
+ },
42
+ });
43
+ }
@@ -127,9 +127,14 @@ export function useNavigationState() {
127
127
  if (cmd.view === "sessions" && cmd.recordingId)
128
128
  return `/sessions/${encodeURIComponent(cmd.recordingId)}`;
129
129
  if (cmd.view === "sessions") return "/sessions";
130
- if (cmd.view === "agents" && cmd.agentsView === "database") {
131
- const params = new URLSearchParams({ view: "database" });
132
- if (cmd.dbAdminConnectionId) params.set("db", cmd.dbAdminConnectionId);
130
+ if (
131
+ cmd.view === "agents" &&
132
+ (cmd.agentsView === "database" || cmd.agentsView === "dashboards")
133
+ ) {
134
+ const params = new URLSearchParams({ view: cmd.agentsView });
135
+ if (cmd.agentsView === "database" && cmd.dbAdminConnectionId) {
136
+ params.set("db", cmd.dbAdminConnectionId);
137
+ }
133
138
  return `/agents?${params.toString()}`;
134
139
  }
135
140
  if (cmd.view === "agents") return "/agents";