@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
@@ -29,9 +29,11 @@ export default defineAction({
29
29
  .optional()
30
30
  .describe("Session recording id to open (used with view=sessions)"),
31
31
  agentsView: z
32
- .enum(["monitoring", "database"])
32
+ .enum(["monitoring", "dashboards", "database"])
33
33
  .optional()
34
- .describe("Agents subview to open (monitoring or app databases)"),
34
+ .describe(
35
+ "Admin subview to open (monitoring, dashboard usage, or app databases)",
36
+ ),
35
37
  dbAdminConnectionId: z
36
38
  .string()
37
39
  .optional()
@@ -0,0 +1,43 @@
1
+ import { defineAction } from "@agent-native/core";
2
+ import {
3
+ getRequestOrgId,
4
+ getRequestUserEmail,
5
+ } from "@agent-native/core/server";
6
+ import { z } from "zod";
7
+
8
+ import { restoreAnalysisRevision } from "../server/lib/dashboards-store";
9
+
10
+ function resolveScope() {
11
+ const orgId = getRequestOrgId() || null;
12
+ const email = getRequestUserEmail();
13
+ if (!email) throw new Error("no authenticated user");
14
+ return { orgId, email };
15
+ }
16
+
17
+ export default defineAction({
18
+ description:
19
+ "Restore an ad-hoc analysis to a saved history revision, snapshotting the current analysis first.",
20
+ schema: z.object({
21
+ analysisId: z.string().describe("Analysis id to restore"),
22
+ revisionId: z.string().describe("Revision id to restore"),
23
+ }),
24
+ http: { method: "POST" },
25
+ run: async (args) => {
26
+ const analysis = await restoreAnalysisRevision(
27
+ args.analysisId,
28
+ args.revisionId,
29
+ resolveScope(),
30
+ );
31
+ if (!analysis) {
32
+ throw new Error(
33
+ `Analysis revision "${args.revisionId}" was not found for analysis "${args.analysisId}".`,
34
+ );
35
+ }
36
+ return {
37
+ id: analysis.id,
38
+ name: analysis.name,
39
+ updatedAt: analysis.updatedAt,
40
+ message: `Restored analysis "${analysis.name}" from history.`,
41
+ };
42
+ },
43
+ });
@@ -0,0 +1,68 @@
1
+ import { defineAction } from "@agent-native/core";
2
+ import {
3
+ applyText,
4
+ hasCollabState,
5
+ seedFromText,
6
+ } from "@agent-native/core/collab";
7
+ import {
8
+ getRequestOrgId,
9
+ getRequestUserEmail,
10
+ } from "@agent-native/core/server";
11
+ import { z } from "zod";
12
+
13
+ import { restoreDashboardRevision } from "../server/lib/dashboards-store";
14
+
15
+ function resolveScope() {
16
+ const orgId = getRequestOrgId() || null;
17
+ const email = getRequestUserEmail();
18
+ if (!email) throw new Error("no authenticated user");
19
+ return { orgId, email };
20
+ }
21
+
22
+ async function syncToCollab(
23
+ dashboardId: string,
24
+ config: Record<string, unknown>,
25
+ ): Promise<void> {
26
+ const docId = `dash-${dashboardId}`;
27
+ const configStr = JSON.stringify(config);
28
+ try {
29
+ const exists = await hasCollabState(docId);
30
+ if (exists) {
31
+ await applyText(docId, configStr, "content", "agent");
32
+ } else {
33
+ await seedFromText(docId, configStr);
34
+ }
35
+ } catch {
36
+ // SQL is the source of truth; open editors also refetch on the dashboards signal.
37
+ }
38
+ }
39
+
40
+ export default defineAction({
41
+ description:
42
+ "Restore a dashboard to a saved history revision, snapshotting the current dashboard first.",
43
+ schema: z.object({
44
+ dashboardId: z.string().describe("Dashboard id to restore"),
45
+ revisionId: z.string().describe("Revision id to restore"),
46
+ }),
47
+ http: { method: "POST" },
48
+ run: async (args) => {
49
+ const dashboard = await restoreDashboardRevision(
50
+ args.dashboardId,
51
+ args.revisionId,
52
+ resolveScope(),
53
+ );
54
+ if (!dashboard) {
55
+ throw new Error(
56
+ `Dashboard revision "${args.revisionId}" was not found for dashboard "${args.dashboardId}".`,
57
+ );
58
+ }
59
+ await syncToCollab(dashboard.id, dashboard.config);
60
+ return {
61
+ id: dashboard.id,
62
+ kind: dashboard.kind,
63
+ name: dashboard.title,
64
+ updatedAt: dashboard.updatedAt,
65
+ message: `Restored dashboard "${dashboard.title}" from history.`,
66
+ };
67
+ },
68
+ });
@@ -57,6 +57,20 @@ export default defineAction({
57
57
  .array(z.string().email())
58
58
  .optional()
59
59
  .describe("Email recipients passed to the generic email channel."),
60
+ slackWebhookUrl: z
61
+ .string()
62
+ .optional()
63
+ .nullable()
64
+ .describe(
65
+ "Optional Slack incoming webhook URL for this alert rule. Overrides NOTIFICATIONS_SLACK_WEBHOOK_URL when set.",
66
+ ),
67
+ webhookUrl: z
68
+ .string()
69
+ .optional()
70
+ .nullable()
71
+ .describe(
72
+ "Optional generic webhook URL for this alert rule. Overrides NOTIFICATIONS_WEBHOOK_URL when set.",
73
+ ),
60
74
  enabled: z.boolean().optional(),
61
75
  }),
62
76
  http: { method: "POST" },
@@ -101,7 +101,7 @@ export default defineAction({
101
101
  .min(1000)
102
102
  .max(120000)
103
103
  .optional()
104
- .describe("Request timeout in milliseconds (default 15000)."),
104
+ .describe("Request timeout in milliseconds (default 10000)."),
105
105
  expectedStatus: statusMatcherSchema.optional(),
106
106
  assertions: z
107
107
  .array(assertionSchema)
@@ -123,6 +123,20 @@ export default defineAction({
123
123
  .array(z.string().email())
124
124
  .optional()
125
125
  .describe("Email recipients used by the email channel."),
126
+ slackWebhookUrl: z
127
+ .string()
128
+ .nullable()
129
+ .optional()
130
+ .describe(
131
+ "Optional Slack incoming webhook URL for this monitor. Overrides NOTIFICATIONS_SLACK_WEBHOOK_URL when set.",
132
+ ),
133
+ webhookUrl: z
134
+ .string()
135
+ .nullable()
136
+ .optional()
137
+ .describe(
138
+ "Optional generic webhook URL for this monitor. Overrides NOTIFICATIONS_WEBHOOK_URL when set.",
139
+ ),
126
140
  cooldownMinutes: z
127
141
  .number()
128
142
  .int()
@@ -42,10 +42,12 @@ export default defineAction({
42
42
  search?: string;
43
43
  searchParams?: Record<string, string>;
44
44
  } | null;
45
+ const selectedObject = await readAppState("selected-object");
45
46
 
46
47
  const screen: Record<string, unknown> = {};
47
48
  if (navigation) screen.navigation = navigation;
48
49
  if (url?.pathname) screen.pathname = url.pathname;
50
+ if (selectedObject) screen.selectedObject = selectedObject;
49
51
 
50
52
  // Surface the active URL filter params (f_*) so the agent doesn't have
51
53
  // to reason about the URL string or go hunting in settings for them.
@@ -219,6 +221,7 @@ export default defineAction({
219
221
  lastSeenAt: issue.lastSeenAt,
220
222
  eventCount: issue.eventCount,
221
223
  usersAffected: issue.usersAffected,
224
+ recentFrequency: issue.sparkline,
222
225
  assignee: issue.assignee,
223
226
  app: issue.app,
224
227
  template: issue.template,
@@ -231,6 +234,10 @@ export default defineAction({
231
234
  url: sample.url,
232
235
  occurredAt: sample.occurredAt,
233
236
  sessionRecordingPath: sample.sessionRecordingPath,
237
+ stack: sample.stack.slice(0, 8),
238
+ rawStackPreview: sample.rawStack
239
+ ? sample.rawStack.split("\n").slice(0, 8).join("\n")
240
+ : null,
234
241
  }
235
242
  : null,
236
243
  linkedSessions: detail.sessions.slice(0, 5),
@@ -425,6 +432,20 @@ export default defineAction({
425
432
  "feedback",
426
433
  ],
427
434
  },
435
+ {
436
+ id: "dashboards",
437
+ label: "Dashboard Usage",
438
+ path: "/agents?view=dashboards",
439
+ adminOnly: true,
440
+ action: "list-dashboard-usage-stats",
441
+ includes: [
442
+ "dashboard created and modified dates",
443
+ "last tracked modifier",
444
+ "view and engagement counts",
445
+ "saved view counts",
446
+ "hidden and archived state",
447
+ ],
448
+ },
428
449
  {
429
450
  id: "database",
430
451
  label: "App Databases",
@@ -439,6 +460,9 @@ export default defineAction({
439
460
  ],
440
461
  },
441
462
  ];
463
+ if (screen.agentsView === "dashboards") {
464
+ screen.dashboardUsageStatsAction = "list-dashboard-usage-stats";
465
+ }
442
466
  const email = getRequestUserEmail();
443
467
  if (email) {
444
468
  const orgId = getRequestOrgId() || null;
@@ -0,0 +1,181 @@
1
+ import { useT } from "@agent-native/core/client";
2
+ import { IconHistory, IconLoader2, IconRotate } from "@tabler/icons-react";
3
+ import { useState } from "react";
4
+ import { toast } from "sonner";
5
+
6
+ import {
7
+ AlertDialog,
8
+ AlertDialogAction,
9
+ AlertDialogCancel,
10
+ AlertDialogContent,
11
+ AlertDialogDescription,
12
+ AlertDialogFooter,
13
+ AlertDialogHeader,
14
+ AlertDialogTitle,
15
+ } from "@/components/ui/alert-dialog";
16
+ import { Button } from "@/components/ui/button";
17
+ import {
18
+ Sheet,
19
+ SheetContent,
20
+ SheetDescription,
21
+ SheetHeader,
22
+ SheetTitle,
23
+ } from "@/components/ui/sheet";
24
+ import {
25
+ type AnalysisRevision,
26
+ useAnalysisRevisions,
27
+ useRestoreAnalysisRevision,
28
+ } from "@/hooks/use-analysis-revisions";
29
+
30
+ function formatRelativeTime(dateStr: string): string {
31
+ const then = new Date(dateStr).getTime();
32
+ if (!Number.isFinite(then)) return dateStr;
33
+ const diffMs = Date.now() - then;
34
+ const diffMin = Math.floor(diffMs / 60_000);
35
+ const diffHr = Math.floor(diffMs / 3_600_000);
36
+ const diffDay = Math.floor(diffMs / 86_400_000);
37
+
38
+ if (diffMin < 1) return "Just now";
39
+ if (diffMin < 60) return `${diffMin}m ago`;
40
+ if (diffHr < 24) return `${diffHr}h ago`;
41
+ if (diffDay < 7) return `${diffDay}d ago`;
42
+ return new Date(dateStr).toLocaleDateString();
43
+ }
44
+
45
+ export function AnalysisHistoryPanel({
46
+ analysisId,
47
+ open,
48
+ onOpenChange,
49
+ canRestore = true,
50
+ }: {
51
+ analysisId: string;
52
+ open: boolean;
53
+ onOpenChange: (open: boolean) => void;
54
+ canRestore?: boolean;
55
+ }) {
56
+ const t = useT();
57
+ const { data: revisions, isLoading } = useAnalysisRevisions(
58
+ open ? analysisId : null,
59
+ );
60
+ const restoreRevision = useRestoreAnalysisRevision(analysisId);
61
+ const [pendingRestore, setPendingRestore] = useState<AnalysisRevision | null>(
62
+ null,
63
+ );
64
+
65
+ const doRestore = async (revision: AnalysisRevision) => {
66
+ try {
67
+ await restoreRevision.mutateAsync({
68
+ analysisId,
69
+ revisionId: revision.id,
70
+ });
71
+ toast.success(t("analyses.historyRestored"));
72
+ setPendingRestore(null);
73
+ onOpenChange(false);
74
+ } catch {
75
+ toast.error(t("analyses.historyRestoreFailed"));
76
+ }
77
+ };
78
+
79
+ return (
80
+ <>
81
+ <Sheet open={open} onOpenChange={onOpenChange}>
82
+ <SheetContent side="right" className="w-[85vw] max-w-[420px] p-0">
83
+ <SheetHeader className="px-4 pb-0 pt-4">
84
+ <SheetTitle className="flex items-center gap-2 text-sm font-medium">
85
+ <IconHistory size={16} />
86
+ {t("analyses.historyTitle")}
87
+ </SheetTitle>
88
+ <SheetDescription>
89
+ {t("analyses.historyDescription")}
90
+ </SheetDescription>
91
+ </SheetHeader>
92
+ <div className="mt-3 border-t border-border" />
93
+ <div className="h-[calc(100%-96px)] overflow-y-auto p-2">
94
+ {isLoading ? (
95
+ <div className="flex items-center justify-center py-12">
96
+ <IconLoader2
97
+ size={16}
98
+ className="animate-spin text-muted-foreground"
99
+ />
100
+ </div>
101
+ ) : !revisions?.length ? (
102
+ <div className="px-6 py-12 text-center text-xs text-muted-foreground">
103
+ {t("analyses.historyEmpty")}
104
+ </div>
105
+ ) : (
106
+ <div className="space-y-1">
107
+ {revisions.map((revision) => (
108
+ <div
109
+ key={revision.id}
110
+ className="rounded-lg border border-border bg-card p-3"
111
+ >
112
+ <div className="flex items-start justify-between gap-3">
113
+ <div className="min-w-0">
114
+ <p className="truncate text-xs font-medium">
115
+ {revision.name || t("common.untitledAnalysis")}
116
+ </p>
117
+ <p className="mt-0.5 text-[10px] text-muted-foreground">
118
+ {formatRelativeTime(revision.createdAt)}
119
+ {revision.createdBy
120
+ ? ` by ${revision.createdBy}`
121
+ : ""}
122
+ </p>
123
+ </div>
124
+ {canRestore ? (
125
+ <Button
126
+ type="button"
127
+ size="sm"
128
+ variant="outline"
129
+ className="h-7 shrink-0 px-2 text-[11px]"
130
+ onClick={() => setPendingRestore(revision)}
131
+ disabled={restoreRevision.isPending}
132
+ >
133
+ {restoreRevision.isPending ? (
134
+ <IconLoader2 size={13} className="animate-spin" />
135
+ ) : (
136
+ <IconRotate size={13} />
137
+ )}
138
+ <span className="ml-1">
139
+ {t("analyses.historyRestore")}
140
+ </span>
141
+ </Button>
142
+ ) : null}
143
+ </div>
144
+ </div>
145
+ ))}
146
+ </div>
147
+ )}
148
+ </div>
149
+ </SheetContent>
150
+ </Sheet>
151
+
152
+ <AlertDialog
153
+ open={pendingRestore !== null}
154
+ onOpenChange={(nextOpen) => {
155
+ if (!nextOpen) setPendingRestore(null);
156
+ }}
157
+ >
158
+ <AlertDialogContent>
159
+ <AlertDialogHeader>
160
+ <AlertDialogTitle>
161
+ {t("analyses.historyRestoreQuestion")}
162
+ </AlertDialogTitle>
163
+ <AlertDialogDescription>
164
+ {t("analyses.historyRestoreWarning")}
165
+ </AlertDialogDescription>
166
+ </AlertDialogHeader>
167
+ <AlertDialogFooter>
168
+ <AlertDialogCancel>{t("common.cancel")}</AlertDialogCancel>
169
+ <AlertDialogAction
170
+ onClick={() => {
171
+ if (pendingRestore) void doRestore(pendingRestore);
172
+ }}
173
+ >
174
+ {t("analyses.historyRestore")}
175
+ </AlertDialogAction>
176
+ </AlertDialogFooter>
177
+ </AlertDialogContent>
178
+ </AlertDialog>
179
+ </>
180
+ );
181
+ }
@@ -0,0 +1,184 @@
1
+ import { useT } from "@agent-native/core/client";
2
+ import { IconHistory, IconLoader2, IconRotate } from "@tabler/icons-react";
3
+ import { useState } from "react";
4
+ import { toast } from "sonner";
5
+
6
+ import {
7
+ AlertDialog,
8
+ AlertDialogAction,
9
+ AlertDialogCancel,
10
+ AlertDialogContent,
11
+ AlertDialogDescription,
12
+ AlertDialogFooter,
13
+ AlertDialogHeader,
14
+ AlertDialogTitle,
15
+ } from "@/components/ui/alert-dialog";
16
+ import { Button } from "@/components/ui/button";
17
+ import {
18
+ Sheet,
19
+ SheetContent,
20
+ SheetDescription,
21
+ SheetHeader,
22
+ SheetTitle,
23
+ } from "@/components/ui/sheet";
24
+ import {
25
+ type DashboardRevision,
26
+ useDashboardRevisions,
27
+ useRestoreDashboardRevision,
28
+ } from "@/hooks/use-dashboard-revisions";
29
+
30
+ function formatRelativeTime(dateStr: string): string {
31
+ const then = new Date(dateStr).getTime();
32
+ if (!Number.isFinite(then)) return dateStr;
33
+ const diffMs = Date.now() - then;
34
+ const diffMin = Math.floor(diffMs / 60_000);
35
+ const diffHr = Math.floor(diffMs / 3_600_000);
36
+ const diffDay = Math.floor(diffMs / 86_400_000);
37
+
38
+ if (diffMin < 1) return "Just now";
39
+ if (diffMin < 60) return `${diffMin}m ago`;
40
+ if (diffHr < 24) return `${diffHr}h ago`;
41
+ if (diffDay < 7) return `${diffDay}d ago`;
42
+ return new Date(dateStr).toLocaleDateString();
43
+ }
44
+
45
+ interface DashboardHistoryPanelProps {
46
+ dashboardId: string;
47
+ open: boolean;
48
+ onOpenChange: (open: boolean) => void;
49
+ canRestore?: boolean;
50
+ }
51
+
52
+ export function DashboardHistoryPanel({
53
+ dashboardId,
54
+ open,
55
+ onOpenChange,
56
+ canRestore = true,
57
+ }: DashboardHistoryPanelProps) {
58
+ const t = useT();
59
+ const { data: revisions, isLoading } = useDashboardRevisions(
60
+ open ? dashboardId : null,
61
+ );
62
+ const restoreRevision = useRestoreDashboardRevision(dashboardId);
63
+ const [pendingRestore, setPendingRestore] =
64
+ useState<DashboardRevision | null>(null);
65
+
66
+ const doRestore = async (revision: DashboardRevision) => {
67
+ try {
68
+ await restoreRevision.mutateAsync({
69
+ dashboardId,
70
+ revisionId: revision.id,
71
+ });
72
+ toast.success(t("dashboard.historyRestored"));
73
+ setPendingRestore(null);
74
+ onOpenChange(false);
75
+ } catch {
76
+ toast.error(t("dashboard.historyRestoreFailed"));
77
+ }
78
+ };
79
+
80
+ return (
81
+ <>
82
+ <Sheet open={open} onOpenChange={onOpenChange}>
83
+ <SheetContent side="right" className="w-[85vw] max-w-[420px] p-0">
84
+ <SheetHeader className="px-4 pb-0 pt-4">
85
+ <SheetTitle className="flex items-center gap-2 text-sm font-medium">
86
+ <IconHistory size={16} />
87
+ {t("dashboard.historyTitle")}
88
+ </SheetTitle>
89
+ <SheetDescription>
90
+ {t("dashboard.historyDescription")}
91
+ </SheetDescription>
92
+ </SheetHeader>
93
+
94
+ <div className="mt-3 border-t border-border" />
95
+
96
+ <div className="h-[calc(100%-96px)] overflow-y-auto p-2">
97
+ {isLoading ? (
98
+ <div className="flex items-center justify-center py-12">
99
+ <IconLoader2
100
+ size={16}
101
+ className="animate-spin text-muted-foreground"
102
+ />
103
+ </div>
104
+ ) : !revisions?.length ? (
105
+ <div className="px-6 py-12 text-center text-xs text-muted-foreground">
106
+ {t("dashboard.historyEmpty")}
107
+ </div>
108
+ ) : (
109
+ <div className="space-y-1">
110
+ {revisions.map((revision) => (
111
+ <div
112
+ key={revision.id}
113
+ className="rounded-lg border border-border bg-card p-3"
114
+ >
115
+ <div className="flex items-start justify-between gap-3">
116
+ <div className="min-w-0">
117
+ <p className="truncate text-xs font-medium">
118
+ {revision.title || t("common.untitledDashboard")}
119
+ </p>
120
+ <p className="mt-0.5 text-[10px] text-muted-foreground">
121
+ {formatRelativeTime(revision.createdAt)}
122
+ {revision.createdBy
123
+ ? ` by ${revision.createdBy}`
124
+ : ""}
125
+ </p>
126
+ </div>
127
+ {canRestore ? (
128
+ <Button
129
+ type="button"
130
+ size="sm"
131
+ variant="outline"
132
+ className="h-7 shrink-0 px-2 text-[11px]"
133
+ onClick={() => setPendingRestore(revision)}
134
+ disabled={restoreRevision.isPending}
135
+ >
136
+ {restoreRevision.isPending ? (
137
+ <IconLoader2 size={13} className="animate-spin" />
138
+ ) : (
139
+ <IconRotate size={13} />
140
+ )}
141
+ <span className="ml-1">
142
+ {t("dashboard.historyRestore")}
143
+ </span>
144
+ </Button>
145
+ ) : null}
146
+ </div>
147
+ </div>
148
+ ))}
149
+ </div>
150
+ )}
151
+ </div>
152
+ </SheetContent>
153
+ </Sheet>
154
+
155
+ <AlertDialog
156
+ open={pendingRestore !== null}
157
+ onOpenChange={(nextOpen) => {
158
+ if (!nextOpen) setPendingRestore(null);
159
+ }}
160
+ >
161
+ <AlertDialogContent>
162
+ <AlertDialogHeader>
163
+ <AlertDialogTitle>
164
+ {t("dashboard.historyRestoreQuestion")}
165
+ </AlertDialogTitle>
166
+ <AlertDialogDescription>
167
+ {t("dashboard.historyRestoreWarning")}
168
+ </AlertDialogDescription>
169
+ </AlertDialogHeader>
170
+ <AlertDialogFooter>
171
+ <AlertDialogCancel>{t("common.cancel")}</AlertDialogCancel>
172
+ <AlertDialogAction
173
+ onClick={() => {
174
+ if (pendingRestore) void doRestore(pendingRestore);
175
+ }}
176
+ >
177
+ {t("dashboard.historyRestore")}
178
+ </AlertDialogAction>
179
+ </AlertDialogFooter>
180
+ </AlertDialogContent>
181
+ </AlertDialog>
182
+ </>
183
+ );
184
+ }
@@ -27,6 +27,8 @@ import {
27
27
  import { cn } from "@/lib/utils";
28
28
 
29
29
  const PAGE_SIZE_OPTIONS = [10, 25, 50, 100];
30
+ const TABLE_MIN_HEIGHT_CLASS = "min-h-[386px]";
31
+ const TABLE_SKELETON_ROWS = 10;
30
32
 
31
33
  interface DataTableProps {
32
34
  title?: string;
@@ -109,11 +111,7 @@ export function DataTable({
109
111
  const content = (
110
112
  <>
111
113
  {isLoading ? (
112
- <div className="space-y-2">
113
- {Array.from({ length: 5 }).map((_, i) => (
114
- <Skeleton key={i} className="h-8 w-full" />
115
- ))}
116
- </div>
114
+ <DataTableLoadingSkeleton />
117
115
  ) : error ? (
118
116
  <p className="text-sm text-red-400 py-4">{error}</p>
119
117
  ) : data.length === 0 ? (
@@ -121,7 +119,7 @@ export function DataTable({
121
119
  {t("common.noData")}
122
120
  </p>
123
121
  ) : (
124
- <div className="overflow-x-auto">
122
+ <div className={`overflow-x-auto ${TABLE_MIN_HEIGHT_CLASS}`}>
125
123
  <Table>
126
124
  <TableHeader>
127
125
  <TableRow>
@@ -227,3 +225,40 @@ export function DataTable({
227
225
  </Card>
228
226
  );
229
227
  }
228
+
229
+ function DataTableLoadingSkeleton() {
230
+ const columnWidths = ["w-24", "w-32", "w-20", "w-28"];
231
+
232
+ return (
233
+ <div className={`space-y-1 ${TABLE_MIN_HEIGHT_CLASS}`}>
234
+ <div className="overflow-x-auto">
235
+ <div className="min-w-[480px]">
236
+ <div className="grid h-8 grid-cols-4 items-center border-b border-border px-2">
237
+ {columnWidths.map((width, index) => (
238
+ <Skeleton key={index} className={`h-3 ${width}`} />
239
+ ))}
240
+ </div>
241
+ {Array.from({ length: TABLE_SKELETON_ROWS }).map((_, row) => (
242
+ <div
243
+ key={row}
244
+ className="grid h-8 grid-cols-4 items-center border-b border-border/50 px-2"
245
+ >
246
+ {columnWidths.map((width, col) => (
247
+ <Skeleton
248
+ key={col}
249
+ className={`h-3 ${
250
+ col === 0 ? "w-36" : col === 2 ? "ml-auto w-16" : width
251
+ }`}
252
+ />
253
+ ))}
254
+ </div>
255
+ ))}
256
+ </div>
257
+ </div>
258
+ <div className="flex h-8 items-center justify-between border-t border-border px-2 text-xs">
259
+ <Skeleton className="h-3 w-28" />
260
+ <Skeleton className="h-3 w-24" />
261
+ </div>
262
+ </div>
263
+ );
264
+ }