@agent-native/core 0.91.1 → 0.92.0

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 (383) hide show
  1. package/blueprints/action/crud.md +1 -1
  2. package/blueprints/channel/discord.md +1 -1
  3. package/blueprints/provider/stripe.md +1 -1
  4. package/blueprints/sandbox/docker.md +1 -1
  5. package/corpus/README.md +2 -2
  6. package/corpus/core/CHANGELOG.md +31 -0
  7. package/corpus/core/blueprints/action/crud.md +1 -1
  8. package/corpus/core/blueprints/channel/discord.md +1 -1
  9. package/corpus/core/blueprints/provider/stripe.md +1 -1
  10. package/corpus/core/blueprints/sandbox/docker.md +1 -1
  11. package/corpus/core/docs/content/faq.mdx +17 -0
  12. package/corpus/core/docs/content/notifications.mdx +12 -6
  13. package/corpus/core/package.json +6 -5
  14. package/corpus/core/src/agent/production-agent.ts +140 -46
  15. package/corpus/core/src/agent/run-manager.ts +23 -2
  16. package/corpus/core/src/agent/run-store.ts +2 -2
  17. package/corpus/core/src/agent/tool-search.ts +71 -4
  18. package/corpus/core/src/cli/add.ts +1 -1
  19. package/corpus/core/src/cli/create.ts +8 -3
  20. package/corpus/core/src/cli/index.ts +25 -4
  21. package/corpus/core/src/cli/upgrade.ts +798 -0
  22. package/corpus/core/src/client/AssistantChat.tsx +1 -1
  23. package/corpus/core/src/client/HighlightedCodeBlock.tsx +20 -3
  24. package/corpus/core/src/client/agent-chat-adapter.ts +31 -6
  25. package/corpus/core/src/client/chat/message-components.tsx +85 -8
  26. package/corpus/core/src/client/chat/tool-call-display.tsx +355 -144
  27. package/corpus/core/src/client/code-agent-chat-adapter.ts +2 -9
  28. package/corpus/core/src/client/extensions/ExtensionSlot.tsx +7 -0
  29. package/corpus/core/src/client/settings/SettingsPanel.tsx +533 -389
  30. package/corpus/core/src/client/settings/SettingsSection.tsx +154 -17
  31. package/corpus/core/src/client/sse-event-processor.ts +29 -2
  32. package/corpus/core/src/extensions/actions.ts +113 -5
  33. package/corpus/core/src/jobs/scheduler.ts +30 -1
  34. package/corpus/core/src/localization/default-messages.ts +21 -0
  35. package/corpus/core/src/notifications/channels.ts +88 -25
  36. package/corpus/core/src/notifications/registry.ts +17 -3
  37. package/corpus/core/src/notifications/types.ts +4 -1
  38. package/corpus/core/src/server/agent-chat-plugin.ts +7 -3
  39. package/corpus/core/src/server/request-context.ts +7 -0
  40. package/corpus/core/src/styles/agent-conversation.css +1 -1
  41. package/corpus/core/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
  42. package/corpus/core/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  43. package/corpus/core/src/templates/default/AGENTS.md +10 -3
  44. package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +21 -0
  45. package/corpus/core/src/templates/default/app/i18n/de-DE.ts +21 -0
  46. package/corpus/core/src/templates/default/app/i18n/en-US.ts +21 -0
  47. package/corpus/core/src/templates/default/app/i18n/es-ES.ts +21 -0
  48. package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +21 -0
  49. package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +20 -0
  50. package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +21 -0
  51. package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +20 -0
  52. package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +21 -0
  53. package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +20 -0
  54. package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +19 -0
  55. package/corpus/core/src/templates/default/package.json +4 -3
  56. package/corpus/core/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  57. package/corpus/core/src/templates/headless/AGENTS.md +9 -3
  58. package/corpus/core/src/templates/headless/package.json +4 -3
  59. package/corpus/core/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
  60. package/corpus/core/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  61. package/corpus/core/src/templates/workspace-core/package.json +6 -6
  62. package/corpus/core/src/templates/workspace-root/AGENTS.md +10 -4
  63. package/corpus/core/src/templates/workspace-root/package.json +3 -2
  64. package/corpus/core/src/triggers/dispatcher.ts +30 -2
  65. package/corpus/core/src/vite/client.ts +96 -1
  66. package/corpus/templates/analytics/.agents/skills/self-modifying-code/SKILL.md +20 -2
  67. package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +20 -2
  68. package/corpus/templates/analytics/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  69. package/corpus/templates/analytics/AGENTS.md +7 -5
  70. package/corpus/templates/analytics/actions/save-monitor.ts +14 -0
  71. package/corpus/templates/analytics/app/components/dashboard/DataTable.tsx +41 -6
  72. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +122 -11
  73. package/corpus/templates/analytics/app/global.css +26 -10
  74. package/corpus/templates/analytics/app/i18n/zh-TW.ts +2 -0
  75. package/corpus/templates/analytics/app/i18n-data.ts +25 -0
  76. package/corpus/templates/analytics/app/pages/monitoring/MonitoringPage.tsx +8 -2
  77. package/corpus/templates/analytics/app/pages/monitoring/uptime/MonitorFormPage.tsx +151 -32
  78. package/corpus/templates/analytics/app/pages/monitoring/uptime/i18n.ts +17 -2
  79. package/corpus/templates/analytics/app/pages/monitoring/uptime/types.ts +4 -0
  80. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +461 -286
  81. package/corpus/templates/analytics/app/pages/sessions/SessionDevToolsPanel.tsx +285 -294
  82. package/corpus/templates/analytics/changelog/2026-07-08-console-details-expand-inline-under-each-row-and-the-event-t.md +6 -0
  83. package/corpus/templates/analytics/changelog/2026-07-08-dashboard-tables-keep-their-size-while-loading.md +6 -0
  84. package/corpus/templates/analytics/changelog/2026-07-08-monitoring-uptime-and-errors-tabs-now-clearly-show-which-view-is-active.md +6 -0
  85. package/corpus/templates/analytics/changelog/2026-07-08-session-replay-keeps-a-usable-stage-when-dev-tools-is-open-a.md +6 -0
  86. package/corpus/templates/analytics/changelog/2026-07-08-session-replay-resumes-after-scrubbing-and-expands-console-r.md +6 -0
  87. package/corpus/templates/analytics/changelog/2026-07-08-session-replay-uses-stock-rrweb-sizing-again-so-recorded.md +6 -0
  88. package/corpus/templates/analytics/changelog/2026-07-08-session-replays-wait-for-full-load-keep-a-normal-viewport-an.md +6 -0
  89. package/corpus/templates/analytics/changelog/2026-07-08-sidebar-dashboard-menus-now-open-above-the-dashboard-canvas.md +6 -0
  90. 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
  91. package/corpus/templates/analytics/docs/uptime-monitoring.md +13 -11
  92. package/corpus/templates/analytics/package.json +2 -2
  93. package/corpus/templates/analytics/server/db/schema-monitoring.ts +4 -0
  94. package/corpus/templates/analytics/server/lib/uptime-monitors.ts +60 -12
  95. package/corpus/templates/analytics/server/plugins/db.ts +10 -0
  96. package/corpus/templates/assets/.agents/skills/self-modifying-code/SKILL.md +20 -2
  97. package/corpus/templates/assets/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  98. package/corpus/templates/assets/package.json +2 -2
  99. package/corpus/templates/brain/.agents/skills/self-modifying-code/SKILL.md +20 -2
  100. package/corpus/templates/brain/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  101. package/corpus/templates/brain/package.json +2 -2
  102. package/corpus/templates/calendar/.agents/skills/self-modifying-code/SKILL.md +20 -2
  103. package/corpus/templates/calendar/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  104. package/corpus/templates/calendar/AGENTS.md +10 -0
  105. package/corpus/templates/calendar/actions/create-event.ts +5 -1
  106. package/corpus/templates/calendar/actions/event-action-helpers.ts +41 -0
  107. package/corpus/templates/calendar/actions/get-attendee-timezones.ts +28 -0
  108. package/corpus/templates/calendar/actions/set-attendee-timezone.ts +68 -0
  109. package/corpus/templates/calendar/app/components/calendar/EventAttendeesSection.tsx +150 -11
  110. package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +36 -1
  111. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +32 -0
  112. package/corpus/templates/calendar/app/hooks/use-attendee-timezones.ts +24 -0
  113. package/corpus/templates/calendar/app/i18n/zh-TW.ts +2 -0
  114. package/corpus/templates/calendar/app/i18n-data.ts +20 -0
  115. package/corpus/templates/calendar/app/lib/attendee-local-time.ts +122 -0
  116. package/corpus/templates/calendar/changelog/2026-07-08-event-details-now-support-extension-widgets-and-you-can-see-.md +6 -0
  117. package/corpus/templates/calendar/changelog/2026-07-08-when-you-invite-guests-to-a-new-event-you-now-appear-in.md +6 -0
  118. package/corpus/templates/calendar/package.json +2 -2
  119. package/corpus/templates/calendar/server/handlers/events.ts +5 -1
  120. package/corpus/templates/calendar/shared/api.ts +6 -0
  121. package/corpus/templates/chat/.agents/skills/self-modifying-code/SKILL.md +20 -2
  122. package/corpus/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  123. package/corpus/templates/chat/package.json +2 -2
  124. package/corpus/templates/clips/.agents/skills/meetings/SKILL.md +6 -2
  125. package/corpus/templates/clips/.agents/skills/self-modifying-code/SKILL.md +20 -2
  126. package/corpus/templates/clips/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  127. package/corpus/templates/clips/actions/create-meeting.ts +8 -3
  128. package/corpus/templates/clips/actions/list-meetings.ts +31 -3
  129. package/corpus/templates/clips/changelog/2026-07-08-after-finishing-a-desktop-recording-reopening-clips-restor.md +6 -0
  130. package/corpus/templates/clips/changelog/2026-07-08-clips-now-pops-up-to-take-notes-when-you-join-an-adhoc-zoom-.md +6 -0
  131. package/corpus/templates/clips/changelog/2026-07-08-desktop-clip-recordings-are-louder-after-capture-mic-only.md +6 -0
  132. package/corpus/templates/clips/changelog/2026-07-08-desktop-meeting-notes-stay-active-from-tray-and-shortcut-controls.md +6 -0
  133. package/corpus/templates/clips/changelog/2026-07-08-desktop-meeting-popovers-can-start-notes-and-join-the-meetin.md +6 -0
  134. package/corpus/templates/clips/changelog/2026-07-08-meeting-notes-keep-their-recording-state-when-the-desktop.md +6 -0
  135. package/corpus/templates/clips/changelog/2026-07-08-meeting-reminder-dropdowns-now-expand-fully-instead-of-being.md +6 -0
  136. package/corpus/templates/clips/changelog/2026-07-08-meeting-reminders-now-appear-1-minute-before-start-stay-unti.md +6 -0
  137. package/corpus/templates/clips/changelog/2026-07-08-the-desktop-meetings-panel-has-room-for-its-drop-shadow-and-.md +6 -0
  138. package/corpus/templates/clips/chrome-extension/package.json +2 -2
  139. package/corpus/templates/clips/desktop/package.json +2 -2
  140. package/corpus/templates/clips/desktop/src/app.tsx +214 -37
  141. package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +30 -6
  142. package/corpus/templates/clips/desktop/src/lib/meeting-notification-timing.ts +83 -0
  143. package/corpus/templates/clips/desktop/src/lib/native-recording-warm.ts +21 -0
  144. package/corpus/templates/clips/desktop/src/lib/recorder.ts +98 -20
  145. package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +197 -50
  146. package/corpus/templates/clips/desktop/src/styles.css +150 -53
  147. package/corpus/templates/clips/desktop/src-tauri/src/adhoc_meetings_watcher.rs +362 -0
  148. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +41 -7
  149. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +9 -2
  150. package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +89 -11
  151. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +71 -17
  152. package/corpus/templates/clips/desktop/src-tauri/src/native_speech.rs +36 -1
  153. package/corpus/templates/clips/desktop/src-tauri/src/notifications.rs +62 -10
  154. package/corpus/templates/clips/desktop/src-tauri/src/shortcuts.rs +3 -3
  155. package/corpus/templates/clips/desktop/src-tauri/src/silence_detector.rs +1 -25
  156. package/corpus/templates/clips/desktop/src-tauri/src/state.rs +5 -0
  157. package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +18 -6
  158. package/corpus/templates/clips/desktop/src-tauri/src/util.rs +36 -1
  159. package/corpus/templates/clips/package.json +2 -2
  160. package/corpus/templates/content/.agents/skills/self-modifying-code/SKILL.md +20 -2
  161. package/corpus/templates/content/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  162. package/corpus/templates/content/actions/_batch-utils.ts +8 -0
  163. package/corpus/templates/content/actions/_builder-cms-read-client.ts +7 -5
  164. package/corpus/templates/content/actions/_content-database-personal-view.ts +80 -0
  165. package/corpus/templates/content/actions/_database-source-utils.ts +776 -319
  166. package/corpus/templates/content/actions/_database-utils.ts +6 -1
  167. package/corpus/templates/content/actions/_property-utils.ts +168 -0
  168. package/corpus/templates/content/actions/add-content-database-source-field-property.ts +19 -12
  169. package/corpus/templates/content/actions/bind-content-database-source-field.ts +19 -12
  170. package/corpus/templates/content/actions/delete-document.ts +9 -13
  171. package/corpus/templates/content/actions/get-content-database-personal-view.ts +27 -0
  172. package/corpus/templates/content/actions/refresh-content-database-source.ts +5 -5
  173. package/corpus/templates/content/actions/update-content-database-personal-view.ts +31 -0
  174. package/corpus/templates/content/actions/update-content-database-view.ts +3 -0
  175. package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +1 -1
  176. package/corpus/templates/content/app/components/editor/body-hydration.ts +35 -11
  177. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +2631 -551
  178. package/corpus/templates/content/app/components/editor/database/filter-sort.ts +220 -18
  179. package/corpus/templates/content/app/hooks/use-content-database.ts +32 -0
  180. package/corpus/templates/content/app/hooks/use-documents.ts +8 -2
  181. package/corpus/templates/content/app/i18n/zh-TW.ts +16 -0
  182. package/corpus/templates/content/app/i18n-data.ts +154 -0
  183. package/corpus/templates/content/changelog/2026-07-08-builder-source-sync-now-completes-reliably-on-hosted-databases.md +6 -0
  184. package/corpus/templates/content/changelog/2026-07-08-database-filters-now-support-notion-style-reset-save-for-eve.md +6 -0
  185. package/corpus/templates/content/changelog/2026-07-08-date-filters-can-now-target-a-between-range.md +6 -0
  186. package/corpus/templates/content/changelog/2026-07-08-fixed-builder-database-sync-so-large-sources-continue-past-t.md +6 -0
  187. package/corpus/templates/content/package.json +2 -2
  188. package/corpus/templates/content/parity/matrix.md +1 -1
  189. package/corpus/templates/content/parity/matrix.ts +2 -0
  190. package/corpus/templates/content/server/plugins/db.ts +19 -0
  191. package/corpus/templates/content/shared/api.ts +24 -0
  192. package/corpus/templates/design/.agents/skills/self-modifying-code/SKILL.md +20 -2
  193. package/corpus/templates/design/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  194. package/corpus/templates/design/package.json +2 -2
  195. package/corpus/templates/dispatch/.agents/skills/self-modifying-code/SKILL.md +20 -2
  196. package/corpus/templates/dispatch/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  197. package/corpus/templates/dispatch/app/i18n/zh-TW.ts +34 -1
  198. package/corpus/templates/dispatch/app/i18n-data.ts +387 -10
  199. package/corpus/templates/dispatch/app/routes/automations.tsx +1 -0
  200. package/corpus/templates/dispatch/changelog/2026-07-08-added-an-automations-page-to-review-pause-and-create.md +6 -0
  201. package/corpus/templates/dispatch/changelog/2026-07-08-destinations-now-shows-outbound-delivery-queue-health.md +6 -0
  202. package/corpus/templates/dispatch/package.json +2 -2
  203. package/corpus/templates/forms/.agents/skills/self-modifying-code/SKILL.md +20 -2
  204. package/corpus/templates/forms/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  205. package/corpus/templates/forms/package.json +2 -2
  206. package/corpus/templates/macros/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  207. package/corpus/templates/macros/package.json +2 -2
  208. package/corpus/templates/mail/.agents/skills/self-modifying-code/SKILL.md +20 -2
  209. package/corpus/templates/mail/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  210. package/corpus/templates/mail/app/hooks/use-emails.ts +56 -44
  211. package/corpus/templates/mail/app/lib/gmail-mutation-queue.ts +325 -0
  212. package/corpus/templates/mail/changelog/2026-07-08-rapid-archive-and-mark-read-now-batch-gmail-updates-so-the-i.md +6 -0
  213. package/corpus/templates/mail/package.json +2 -2
  214. package/corpus/templates/plan/.agents/skills/self-modifying-code/SKILL.md +20 -2
  215. package/corpus/templates/plan/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  216. package/corpus/templates/plan/package.json +2 -2
  217. package/corpus/templates/slides/.agents/skills/self-modifying-code/SKILL.md +20 -2
  218. package/corpus/templates/slides/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  219. package/corpus/templates/slides/app/components/editor/ImageDropPromptPopover.tsx +46 -29
  220. package/corpus/templates/slides/app/context/DeckContext.tsx +45 -18
  221. package/corpus/templates/slides/app/i18n/ar-SA.ts +4 -0
  222. package/corpus/templates/slides/app/i18n/de-DE.ts +4 -0
  223. package/corpus/templates/slides/app/i18n/en-US.ts +4 -0
  224. package/corpus/templates/slides/app/i18n/es-ES.ts +4 -0
  225. package/corpus/templates/slides/app/i18n/fr-FR.ts +4 -0
  226. package/corpus/templates/slides/app/i18n/hi-IN.ts +4 -0
  227. package/corpus/templates/slides/app/i18n/ja-JP.ts +4 -0
  228. package/corpus/templates/slides/app/i18n/ko-KR.ts +4 -0
  229. package/corpus/templates/slides/app/i18n/pt-BR.ts +4 -0
  230. package/corpus/templates/slides/app/i18n/zh-CN.ts +4 -0
  231. package/corpus/templates/slides/app/i18n/zh-TW.ts +4 -0
  232. package/corpus/templates/slides/app/lib/image-drop-to-agent.ts +115 -0
  233. package/corpus/templates/slides/app/pages/DeckEditor.tsx +22 -13
  234. package/corpus/templates/slides/changelog/2026-07-08-dropping-an-image-onto-a-slide-and-sending-it-to-the-agent-w.md +6 -0
  235. package/corpus/templates/slides/changelog/2026-07-08-undo-works-after-the-agent-edits-a-slide-so-you-can-reverse.md +6 -0
  236. package/corpus/templates/slides/package.json +2 -2
  237. package/corpus/templates/videos/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  238. package/corpus/templates/voice/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  239. package/dist/agent/production-agent.d.ts +5 -1
  240. package/dist/agent/production-agent.d.ts.map +1 -1
  241. package/dist/agent/production-agent.js +112 -42
  242. package/dist/agent/production-agent.js.map +1 -1
  243. package/dist/agent/run-manager.d.ts.map +1 -1
  244. package/dist/agent/run-manager.js +23 -2
  245. package/dist/agent/run-manager.js.map +1 -1
  246. package/dist/agent/run-store.js +2 -2
  247. package/dist/agent/run-store.js.map +1 -1
  248. package/dist/agent/tool-search.d.ts +2 -0
  249. package/dist/agent/tool-search.d.ts.map +1 -1
  250. package/dist/agent/tool-search.js +60 -4
  251. package/dist/agent/tool-search.js.map +1 -1
  252. package/dist/catalog.json +2 -2
  253. package/dist/cli/add.js +1 -1
  254. package/dist/cli/add.js.map +1 -1
  255. package/dist/cli/create.d.ts.map +1 -1
  256. package/dist/cli/create.js +8 -3
  257. package/dist/cli/create.js.map +1 -1
  258. package/dist/cli/index.js +24 -4
  259. package/dist/cli/index.js.map +1 -1
  260. package/dist/cli/upgrade.d.ts +100 -0
  261. package/dist/cli/upgrade.d.ts.map +1 -0
  262. package/dist/cli/upgrade.js +678 -0
  263. package/dist/cli/upgrade.js.map +1 -0
  264. package/dist/client/AssistantChat.js +1 -1
  265. package/dist/client/AssistantChat.js.map +1 -1
  266. package/dist/client/HighlightedCodeBlock.d.ts +2 -0
  267. package/dist/client/HighlightedCodeBlock.d.ts.map +1 -1
  268. package/dist/client/HighlightedCodeBlock.js +10 -1
  269. package/dist/client/HighlightedCodeBlock.js.map +1 -1
  270. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  271. package/dist/client/agent-chat-adapter.js +32 -4
  272. package/dist/client/agent-chat-adapter.js.map +1 -1
  273. package/dist/client/chat/message-components.d.ts.map +1 -1
  274. package/dist/client/chat/message-components.js +61 -8
  275. package/dist/client/chat/message-components.js.map +1 -1
  276. package/dist/client/chat/tool-call-display.d.ts +12 -0
  277. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  278. package/dist/client/chat/tool-call-display.js +136 -42
  279. package/dist/client/chat/tool-call-display.js.map +1 -1
  280. package/dist/client/code-agent-chat-adapter.js +2 -9
  281. package/dist/client/code-agent-chat-adapter.js.map +1 -1
  282. package/dist/client/extensions/ExtensionSlot.js +6 -0
  283. package/dist/client/extensions/ExtensionSlot.js.map +1 -1
  284. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  285. package/dist/client/settings/SettingsPanel.js +52 -19
  286. package/dist/client/settings/SettingsPanel.js.map +1 -1
  287. package/dist/client/settings/SettingsSection.d.ts +19 -4
  288. package/dist/client/settings/SettingsSection.d.ts.map +1 -1
  289. package/dist/client/settings/SettingsSection.js +33 -4
  290. package/dist/client/settings/SettingsSection.js.map +1 -1
  291. package/dist/client/sse-event-processor.d.ts +9 -0
  292. package/dist/client/sse-event-processor.d.ts.map +1 -1
  293. package/dist/client/sse-event-processor.js +20 -2
  294. package/dist/client/sse-event-processor.js.map +1 -1
  295. package/dist/collab/routes.d.ts +1 -1
  296. package/dist/collab/struct-routes.d.ts +1 -1
  297. package/dist/extensions/actions.d.ts.map +1 -1
  298. package/dist/extensions/actions.js +85 -5
  299. package/dist/extensions/actions.js.map +1 -1
  300. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  301. package/dist/jobs/scheduler.js +26 -1
  302. package/dist/jobs/scheduler.js.map +1 -1
  303. package/dist/localization/default-messages.d.ts +19 -0
  304. package/dist/localization/default-messages.d.ts.map +1 -1
  305. package/dist/localization/default-messages.js +19 -0
  306. package/dist/localization/default-messages.js.map +1 -1
  307. package/dist/notifications/channels.d.ts +8 -3
  308. package/dist/notifications/channels.d.ts.map +1 -1
  309. package/dist/notifications/channels.js +61 -22
  310. package/dist/notifications/channels.js.map +1 -1
  311. package/dist/notifications/registry.d.ts.map +1 -1
  312. package/dist/notifications/registry.js +14 -3
  313. package/dist/notifications/registry.js.map +1 -1
  314. package/dist/notifications/routes.d.ts +1 -1
  315. package/dist/notifications/types.d.ts +4 -1
  316. package/dist/notifications/types.d.ts.map +1 -1
  317. package/dist/notifications/types.js.map +1 -1
  318. package/dist/observability/routes.d.ts +1 -1
  319. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  320. package/dist/resources/handlers.d.ts +3 -3
  321. package/dist/server/agent-chat-plugin.d.ts +5 -1
  322. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  323. package/dist/server/agent-chat-plugin.js +2 -2
  324. package/dist/server/agent-chat-plugin.js.map +1 -1
  325. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  326. package/dist/server/request-context.d.ts +7 -0
  327. package/dist/server/request-context.d.ts.map +1 -1
  328. package/dist/server/request-context.js.map +1 -1
  329. package/dist/styles/agent-conversation.css +1 -1
  330. package/dist/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
  331. package/dist/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  332. package/dist/templates/default/AGENTS.md +10 -3
  333. package/dist/templates/default/app/i18n/ar-SA.ts +21 -0
  334. package/dist/templates/default/app/i18n/de-DE.ts +21 -0
  335. package/dist/templates/default/app/i18n/en-US.ts +21 -0
  336. package/dist/templates/default/app/i18n/es-ES.ts +21 -0
  337. package/dist/templates/default/app/i18n/fr-FR.ts +21 -0
  338. package/dist/templates/default/app/i18n/hi-IN.ts +20 -0
  339. package/dist/templates/default/app/i18n/ja-JP.ts +21 -0
  340. package/dist/templates/default/app/i18n/ko-KR.ts +20 -0
  341. package/dist/templates/default/app/i18n/pt-BR.ts +21 -0
  342. package/dist/templates/default/app/i18n/zh-CN.ts +20 -0
  343. package/dist/templates/default/app/i18n/zh-TW.ts +19 -0
  344. package/dist/templates/default/package.json +4 -3
  345. package/dist/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  346. package/dist/templates/headless/AGENTS.md +9 -3
  347. package/dist/templates/headless/package.json +4 -3
  348. package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
  349. package/dist/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  350. package/dist/templates/workspace-core/package.json +6 -6
  351. package/dist/templates/workspace-root/AGENTS.md +10 -4
  352. package/dist/templates/workspace-root/package.json +3 -2
  353. package/dist/triggers/dispatcher.js +27 -2
  354. package/dist/triggers/dispatcher.js.map +1 -1
  355. package/dist/vite/client.d.ts.map +1 -1
  356. package/dist/vite/client.js +70 -1
  357. package/dist/vite/client.js.map +1 -1
  358. package/docs/content/faq.mdx +17 -0
  359. package/docs/content/notifications.mdx +12 -6
  360. package/package.json +7 -6
  361. package/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
  362. package/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  363. package/src/templates/default/AGENTS.md +10 -3
  364. package/src/templates/default/app/i18n/ar-SA.ts +21 -0
  365. package/src/templates/default/app/i18n/de-DE.ts +21 -0
  366. package/src/templates/default/app/i18n/en-US.ts +21 -0
  367. package/src/templates/default/app/i18n/es-ES.ts +21 -0
  368. package/src/templates/default/app/i18n/fr-FR.ts +21 -0
  369. package/src/templates/default/app/i18n/hi-IN.ts +20 -0
  370. package/src/templates/default/app/i18n/ja-JP.ts +21 -0
  371. package/src/templates/default/app/i18n/ko-KR.ts +20 -0
  372. package/src/templates/default/app/i18n/pt-BR.ts +21 -0
  373. package/src/templates/default/app/i18n/zh-CN.ts +20 -0
  374. package/src/templates/default/app/i18n/zh-TW.ts +19 -0
  375. package/src/templates/default/package.json +4 -3
  376. package/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  377. package/src/templates/headless/AGENTS.md +9 -3
  378. package/src/templates/headless/package.json +4 -3
  379. package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
  380. package/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  381. package/src/templates/workspace-core/package.json +6 -6
  382. package/src/templates/workspace-root/AGENTS.md +10 -4
  383. package/src/templates/workspace-root/package.json +3 -2
@@ -414,7 +414,7 @@ async function dispatchAgentic(
414
414
  (await getStoredModelForEngine(engine, { appId: _deps!.appId })) ??
415
415
  engine.defaultModel;
416
416
  const model = normalizeModelForEngine(engine, modelCandidate);
417
- await createThread(jobUserEmail, {
417
+ const thread = await createThread(jobUserEmail, {
418
418
  title: `Trigger: ${triggerName} — ${now.toLocaleDateString()}`,
419
419
  });
420
420
 
@@ -448,9 +448,11 @@ ${body}`;
448
448
  const timeout = setTimeout(() => controller.abort(), 5 * 60 * 1000);
449
449
 
450
450
  const events: AgentChatEvent[] = [];
451
+ let triggerUsage: Awaited<ReturnType<typeof runAgentLoop>> | null =
452
+ null;
451
453
 
452
454
  try {
453
- await runAgentLoop({
455
+ triggerUsage = await runAgentLoop({
454
456
  engine,
455
457
  model,
456
458
  systemPrompt,
@@ -459,11 +461,37 @@ ${body}`;
459
461
  actions,
460
462
  send: (event) => events.push(event),
461
463
  signal: controller.signal,
464
+ threadId: thread.id,
462
465
  });
463
466
  } finally {
464
467
  clearTimeout(timeout);
465
468
  }
466
469
 
470
+ if (
471
+ triggerUsage &&
472
+ (triggerUsage.inputTokens > 0 ||
473
+ triggerUsage.outputTokens > 0 ||
474
+ triggerUsage.cacheReadTokens > 0 ||
475
+ triggerUsage.cacheWriteTokens > 0)
476
+ ) {
477
+ try {
478
+ const { recordUsage } = await import("../usage/store.js");
479
+ await recordUsage({
480
+ ownerEmail: jobUserEmail,
481
+ inputTokens: triggerUsage.inputTokens,
482
+ outputTokens: triggerUsage.outputTokens,
483
+ cacheReadTokens: triggerUsage.cacheReadTokens,
484
+ cacheWriteTokens: triggerUsage.cacheWriteTokens,
485
+ model: triggerUsage.model,
486
+ label: `automation:${triggerName}`,
487
+ app: _deps!.appId,
488
+ refId: eventMeta.eventId,
489
+ });
490
+ } catch {
491
+ // Usage attribution must not break automation dispatch.
492
+ }
493
+ }
494
+
467
495
  meta.lastStatus = "success";
468
496
  await resourcePut(
469
497
  resource.owner,
@@ -306,7 +306,7 @@ function findWorkspaceCoreSync(
306
306
 
307
307
  function findLocalWorkspacePackageDeps(
308
308
  startDir: string,
309
- _workspaceRoot: string | null,
309
+ workspaceRoot: string | null,
310
310
  ): Array<{ packageName: string; packageDir: string }> {
311
311
  const pkgPath = path.join(startDir, "package.json");
312
312
  if (!fs.existsSync(pkgPath)) return [];
@@ -329,6 +329,12 @@ function findLocalWorkspacePackageDeps(
329
329
  let packageJsonPath: string | null = null;
330
330
  if (range.startsWith("file:")) {
331
331
  packageJsonPath = findFilePackageJsonPath(pkgPath, range);
332
+ } else if (range.startsWith("workspace:")) {
333
+ packageJsonPath = findWorkspacePackageJsonPath(
334
+ pkgPath,
335
+ packageName,
336
+ workspaceRoot,
337
+ );
332
338
  } else {
333
339
  continue;
334
340
  }
@@ -350,6 +356,93 @@ function findLocalWorkspacePackageDeps(
350
356
  }
351
357
  }
352
358
 
359
+ function packagePathSegments(packageName: string): string[] {
360
+ return packageName.split("/");
361
+ }
362
+
363
+ function findWorkspacePackageJsonPath(
364
+ pkgPath: string,
365
+ packageName: string,
366
+ workspaceRoot: string | null,
367
+ ): string | null {
368
+ const packageSegments = packagePathSegments(packageName);
369
+ const candidates = [
370
+ path.join(path.dirname(pkgPath), "node_modules", ...packageSegments),
371
+ ...(workspaceRoot
372
+ ? [path.join(workspaceRoot, "node_modules", ...packageSegments)]
373
+ : []),
374
+ ];
375
+
376
+ for (const candidate of candidates) {
377
+ const packageJsonPath = path.join(candidate, "package.json");
378
+ if (!fs.existsSync(packageJsonPath)) continue;
379
+ const realPath = fs.realpathSync(packageJsonPath);
380
+ if (
381
+ workspaceRoot &&
382
+ !realPath.startsWith(`${fs.realpathSync(workspaceRoot)}${path.sep}`)
383
+ ) {
384
+ continue;
385
+ }
386
+ return realPath;
387
+ }
388
+
389
+ if (workspaceRoot) {
390
+ return findWorkspacePackageJsonByName(workspaceRoot, packageName);
391
+ }
392
+
393
+ return null;
394
+ }
395
+
396
+ function findWorkspacePackageJsonByName(
397
+ workspaceRoot: string,
398
+ packageName: string,
399
+ ): string | null {
400
+ const searchRoots = ["packages", "templates"].map((name) =>
401
+ path.join(workspaceRoot, name),
402
+ );
403
+
404
+ for (const searchRoot of searchRoots) {
405
+ const packageJsonPath = findPackageJsonInTree(searchRoot, packageName, 2);
406
+ if (packageJsonPath) return packageJsonPath;
407
+ }
408
+
409
+ return null;
410
+ }
411
+
412
+ function findPackageJsonInTree(
413
+ root: string,
414
+ packageName: string,
415
+ maxDepth: number,
416
+ ): string | null {
417
+ if (!fs.existsSync(root)) return null;
418
+
419
+ const packageJsonPath = path.join(root, "package.json");
420
+ if (fs.existsSync(packageJsonPath)) {
421
+ try {
422
+ const pkg = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
423
+ if (pkg?.name === packageName) return fs.realpathSync(packageJsonPath);
424
+ } catch {
425
+ // Ignore malformed workspace package metadata.
426
+ }
427
+ }
428
+
429
+ if (maxDepth <= 0) return null;
430
+
431
+ for (const entry of fs.readdirSync(root, { withFileTypes: true })) {
432
+ if (!entry.isDirectory()) continue;
433
+ if (entry.name === "node_modules" || entry.name.startsWith(".")) continue;
434
+
435
+ const found = findPackageJsonInTree(
436
+ path.join(root, entry.name),
437
+ packageName,
438
+ maxDepth - 1,
439
+ );
440
+ if (found) return found;
441
+ }
442
+
443
+ return null;
444
+ }
445
+
353
446
  function findFilePackageJsonPath(
354
447
  pkgPath: string,
355
448
  range: string,
@@ -2157,8 +2250,10 @@ function localWorkspacePackageAliases(
2157
2250
  packages: Array<{ packageName: string; packageDir: string }>,
2158
2251
  ): any[] {
2159
2252
  const aliases: any[] = [];
2253
+ const sourceAliasExcludes = new Set(["@agent-native/pinpoint"]);
2160
2254
 
2161
2255
  for (const { packageName, packageDir } of packages) {
2256
+ if (sourceAliasExcludes.has(packageName)) continue;
2162
2257
  const pkgPath = path.join(packageDir, "package.json");
2163
2258
  if (!fs.existsSync(pkgPath)) continue;
2164
2259
 
@@ -28,7 +28,19 @@ Not all modifications are equal. Use this to decide what level of care is needed
28
28
  | 1: Data | Files in `data/` | JSON state, generated content, markdown | Nothing — these are routine |
29
29
  | 2: Source | App code | Components, routes, styles, scripts | Run `pnpm typecheck && pnpm lint` |
30
30
  | 3: Config | Project config | `package.json`, `tsconfig.json`, `vite.config.*` | Ask for explicit approval first |
31
- | 4: Off limits | Secrets and framework | `.env`, `@agent-native/core` internals | Never modify these |
31
+ | 4: Off limits | Secrets and framework | `.env`, `@agent-native/*` packages & overrides | Never modify these |
32
+
33
+ Tier 4 includes **all** of the following — not only editing package source:
34
+
35
+ - Files under `node_modules/@agent-native/*` (core, dispatch, scheduling, …)
36
+ - `pnpm.overrides`, `overrides`, `resolutions`, or `patchedDependencies` that
37
+ target any `@agent-native/*` package
38
+ - Local patches, vendored copies, or invented "dispatch/core behavior"
39
+ shims meant to paper over a version skew or failed upgrade
40
+
41
+ When an older branch needs current packages, use **`agent-native upgrade`**
42
+ (see the `upgrade-agent-native` skill). If upgrade or typecheck fails, fix
43
+ **app** code or stop and ask — do not patch the framework.
32
44
 
33
45
  ## Git Checkpoint Pattern
34
46
 
@@ -74,13 +86,19 @@ inline strings in components.
74
86
  ## Don't
75
87
 
76
88
  - Don't modify `.env` files or files containing secrets
77
- - Don't modify `@agent-native/core` package internals
89
+ - Don't modify `@agent-native/core`, `@agent-native/dispatch`, or other
90
+ `@agent-native/*` package internals (including under `node_modules`)
91
+ - Don't add `pnpm.overrides` / `patchedDependencies` / `resolutions` for
92
+ `@agent-native/*` to "make the app run" after a version bump
93
+ - Don't invent local dispatch/core behavior overrides when upgrade fails —
94
+ run `npx @agent-native/core@latest upgrade`, then fix app-level errors only
78
95
  - Don't modify `.agents/skills/` or `AGENTS.md` unless explicitly requested
79
96
  - Don't skip the typecheck/lint step after editing source code
80
97
  - Don't make source changes without a git checkpoint to roll back to
81
98
 
82
99
  ## Related Skills
83
100
 
101
+ - **upgrade-agent-native** — supported path to bring an older app/workspace current
84
102
  - **storing-data** — Tier 1 modifications (data files) are the safest and most common
85
103
  - **actions** — The agent can create or modify actions to add new capabilities
86
104
  - **delegate-to-agent** — Self-modification requests come through the agent chat
@@ -89,8 +89,26 @@ agent answers about browser recordings in the Analytics template.
89
89
  - The `/sessions/:recordingId` replay player has a Dev Tools toggle that opens
90
90
  a panel with Console and Network tabs: filter chips, search, an error-count
91
91
  badge, and playback-time highlighting.
92
- - Rows are Jump-to-seek: clicking one seeks the player to that moment. Extend
93
- this panel instead of adding a separate debugging surface.
92
+ - Rows expand inline under the selected line (Chrome-style). Expanding a row
93
+ does not seek; use Jump to to move the playhead. Extend this panel instead of
94
+ adding a separate debugging surface.
95
+
96
+ ## Playback Viewer
97
+
98
+ - Wait for all replay chunks (`isComplete`) before constructing the rrweb
99
+ `Replayer`. Progressive chunk publishes should only update the loading bar;
100
+ rebuilding the player mid-load desyncs the scrubber and playhead.
101
+ - Pass events to `Replayer` untouched (aside from stylesheet/script sanitization
102
+ that prevents blank frames from live CSS loads). Let rrweb own iframe sizing
103
+ via Meta / ViewportResize; use those dimensions only for CSS fit-to-stage of
104
+ the outer wrapper. Never rewrite Meta widths or force iframe dimensions —
105
+ that desyncs the FullSnapshot DOM and blanks the stage.
106
+ - The event timeline soft-highlights the active marker, auto-scrolls it into
107
+ view (pausing briefly after manual scroll), and supports search. It appears
108
+ beside the player from ~880px content width upward.
109
+ - Dev Tools height is capped so the replay stage never collapses into a ribbon
110
+ on short viewports; the scrubber playhead stays visually distinct from red
111
+ error marker dots.
94
112
 
95
113
  ## Debugging A User-Reported Bug
96
114
 
@@ -0,0 +1,87 @@
1
+ ---
2
+ name: upgrade-agent-native
3
+ description: >-
4
+ Bring an older Agent Native app or workspace current. Use when updating
5
+ @agent-native/core, fixing a broken upgrade, or when tempted to patch or
6
+ override core/dispatch packages to make an old branch run.
7
+ scope: dev
8
+ metadata:
9
+ internal: true
10
+ ---
11
+
12
+ # Upgrade Agent Native
13
+
14
+ ## Rule
15
+
16
+ When an older Agent Native app/branch needs to run on current packages, use
17
+ `agent-native upgrade`. Never "fix" upgrade breakage with
18
+ `pnpm.overrides`, `patchedDependencies`, `resolutions`, local patches, or
19
+ edits under `node_modules/@agent-native/*` — especially not against
20
+ `@agent-native/core` or `@agent-native/dispatch`.
21
+
22
+ ## Why
23
+
24
+ Agents often respond to a failed core bump by inventing framework patches and
25
+ dispatch behavior overrides. That hides the real app-level break, drifts from
26
+ upstream, and makes the next upgrade worse. The supported path is bump →
27
+ install → refresh scaffold skills → verify, then fix **app** code only.
28
+
29
+ ## How
30
+
31
+ 1. **Doctor first (optional but recommended)**
32
+
33
+ ```bash
34
+ npx @agent-native/core@latest upgrade check
35
+ ```
36
+
37
+ This reports framework overrides/patches and pending `@agent-native/*`
38
+ bumps. If overrides/patches are present, remove them before continuing.
39
+
40
+ 2. **Run the upgrade**
41
+
42
+ ```bash
43
+ npx @agent-native/core@latest upgrade
44
+ ```
45
+
46
+ Or from an already-installed CLI: `pnpm exec agent-native upgrade` /
47
+ `agent-native upgrade`.
48
+
49
+ What it does:
50
+
51
+ - Blocks (unless `--force`) when `@agent-native/*` overrides/patches exist
52
+ - Rewrites non-local `@agent-native/*` dependency pins to `latest`
53
+ - Runs the package manager install
54
+ - Runs `skills update scaffold --project`
55
+ - Runs `typecheck` when the project has that script
56
+
57
+ 3. **If upgrade or typecheck fails**
58
+
59
+ - Read the concrete error
60
+ - Fix **app** source, actions, config, or env — not framework packages
61
+ - Re-run `agent-native upgrade` or `pnpm typecheck`
62
+ - Stop and ask the user if you cannot fix the app-level error
63
+
64
+ 4. **Dry-run / partial runs**
65
+
66
+ ```bash
67
+ agent-native upgrade --dry-run
68
+ agent-native upgrade --skip-verify
69
+ agent-native upgrade --skip-install # package.json bumps only
70
+ ```
71
+
72
+ ## Don't
73
+
74
+ - Don't add `pnpm.overrides`, `overrides`, `resolutions`, or
75
+ `patchedDependencies` for any `@agent-native/*` package
76
+ - Don't edit `node_modules/@agent-native/core` or
77
+ `node_modules/@agent-native/dispatch`
78
+ - Don't invent local "dispatch behavior" shims to paper over version skew
79
+ - Don't keep iterating with more framework patches after a failed install
80
+ - Don't skip `skills update scaffold --project` after a core bump (the
81
+ upgrade command does this for you)
82
+
83
+ ## Related Skills
84
+
85
+ - **self-modifying-code** — Tier 4: framework packages are off limits
86
+ - **agent-native-docs** — version-matched docs after the bump
87
+ - **portability** — keep app code provider-agnostic across upgrades
@@ -140,11 +140,13 @@ details live in `.agents/skills/`.
140
140
  `thresholdMode: "distinct_count"` counts unique values from `distinctBy`.
141
141
  Alert notifications use the shared notification channel registry, so
142
142
  `channels` can include `inbox`, `email`, `slack`, `webhook`, or any custom
143
- registered channel. Configure Slack with `NOTIFICATIONS_SLACK_WEBHOOK_URL`
144
- and optional `NOTIFICATIONS_SLACK_WEBHOOK_AUTH`; configure email with
145
- `NOTIFICATIONS_EMAIL_CHANNEL=1`, existing `RESEND_API_KEY` or
146
- `SENDGRID_API_KEY` plus `EMAIL_FROM`, and pass per-rule `emailRecipients` or
147
- the fallback `NOTIFICATIONS_EMAIL_RECIPIENTS`.
143
+ registered channel. Slack/webhook prefer delivery-only
144
+ `metadata.delivery.slackWebhookUrl` / `metadata.delivery.webhookUrl` (uptime
145
+ monitors store these on the monitor row), then fall back to
146
+ `NOTIFICATIONS_SLACK_WEBHOOK_URL` / `NOTIFICATIONS_WEBHOOK_URL`. Configure
147
+ optional `NOTIFICATIONS_SLACK_WEBHOOK_AUTH`; configure email with existing
148
+ `RESEND_API_KEY` or `SENDGRID_API_KEY` plus `EMAIL_FROM`, and pass per-rule
149
+ `emailRecipients` or the fallback `NOTIFICATIONS_EMAIL_RECIPIENTS`.
148
150
  Netlify builds emit an alert cron trigger plus background worker from
149
151
  `scripts/emit-netlify-dashboard-report-cron.ts` every five minutes; long-lived
150
152
  runtimes use the in-process scheduler unless `ANALYTICS_ALERT_JOBS=0` is set.
@@ -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()
@@ -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
+ }
@@ -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">