@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
@@ -337,23 +337,33 @@
337
337
  opacity: 0.55;
338
338
  }
339
339
 
340
+ /* Keep the playhead visually distinct from red console-error marker dots on
341
+ the scrubber track — those markers used to look like a second thumb. */
340
342
  .an-replay-scrub::-webkit-slider-thumb {
341
- width: 0.75rem;
342
- height: 0.75rem;
343
+ width: 0.875rem;
344
+ height: 0.875rem;
343
345
  appearance: none;
344
346
  border: 2px solid hsl(var(--background));
345
347
  border-radius: 9999px;
346
- background: hsl(var(--primary));
347
- box-shadow: 0 0 0 1px hsl(var(--border));
348
+ background: hsl(217 91% 60%);
349
+ box-shadow:
350
+ 0 0 0 1px hsl(217 91% 60% / 0.55),
351
+ 0 1px 2px hsl(0 0% 0% / 0.35);
352
+ position: relative;
353
+ z-index: 40;
348
354
  }
349
355
 
350
356
  .an-replay-scrub::-moz-range-thumb {
351
- width: 0.75rem;
352
- height: 0.75rem;
357
+ width: 0.875rem;
358
+ height: 0.875rem;
353
359
  border: 2px solid hsl(var(--background));
354
360
  border-radius: 9999px;
355
- background: hsl(var(--primary));
356
- box-shadow: 0 0 0 1px hsl(var(--border));
361
+ background: hsl(217 91% 60%);
362
+ box-shadow:
363
+ 0 0 0 1px hsl(217 91% 60% / 0.55),
364
+ 0 1px 2px hsl(0 0% 0% / 0.35);
365
+ position: relative;
366
+ z-index: 40;
357
367
  }
358
368
 
359
369
  .dark
@@ -570,9 +580,9 @@
570
580
  }
571
581
  }
572
582
 
573
- @container analytics-session-detail (min-width: 1040px) {
583
+ @container analytics-session-detail (min-width: 880px) {
574
584
  .analytics-session-detail-workbench {
575
- grid-template-columns: minmax(0, 1fr) 330px;
585
+ grid-template-columns: minmax(0, 1fr) minmax(260px, 300px);
576
586
  }
577
587
 
578
588
  .analytics-session-detail-timeline {
@@ -580,6 +590,12 @@
580
590
  }
581
591
  }
582
592
 
593
+ @container analytics-session-detail (min-width: 1200px) {
594
+ .analytics-session-detail-workbench {
595
+ grid-template-columns: minmax(0, 1fr) 330px;
596
+ }
597
+ }
598
+
583
599
  /* The dashboard grid responds to the available content width — which shrinks
584
600
  when the agent sidebar is open — not the viewport. Rows are rendered
585
601
  explicitly so deleting a card only expands the remaining cards in that row. */
@@ -964,6 +964,8 @@ const messages = {
964
964
  timeline: "事件時間線",
965
965
  replayTimeline: "回放時間線",
966
966
  timelineDescription: "顯示 {{count}} / {{total}} 個有用事件。",
967
+ timelineSearch: "搜尋事件...",
968
+ timelineNoMatches: "沒有符合目前搜尋的時間線事件。",
967
969
  noTimelineEvents: "未找到時間線標記",
968
970
  sequence: "Sequence",
969
971
  size: "Size",
@@ -1006,6 +1006,8 @@ const enUS = {
1006
1006
  timeline: "Event timeline",
1007
1007
  replayTimeline: "Replay timeline",
1008
1008
  timelineDescription: "Showing {{count}} of {{total}} useful events.",
1009
+ timelineSearch: "Search events...",
1010
+ timelineNoMatches: "No timeline events match the current search.",
1009
1011
  noTimelineEvents: "No timeline markers found",
1010
1012
  sequence: "Sequence",
1011
1013
  size: "Size",
@@ -8164,6 +8166,8 @@ const translatedSessionReplayTranslations = {
8164
8166
  "用于重建此回放的受控分块。提供商 URL 保持私有。",
8165
8167
  timeline: "事件时间线",
8166
8168
  timelineDescription: "显示 {{count}} / {{total}} 个有用事件。",
8169
+ timelineSearch: "搜索事件...",
8170
+ timelineNoMatches: "没有符合当前搜索的时间线事件。",
8167
8171
  started: "开始",
8168
8172
  signedIn: "已登录",
8169
8173
  anonymous: "匿名",
@@ -8287,6 +8291,9 @@ const translatedSessionReplayTranslations = {
8287
8291
  "Fragmentos con acceso controlado usados para reconstruir esta reproducción. Las URL del proveedor permanecen privadas.",
8288
8292
  timeline: "Línea de tiempo de eventos",
8289
8293
  timelineDescription: "Mostrando {{count}} de {{total}} eventos útiles.",
8294
+ timelineSearch: "Buscar eventos...",
8295
+ timelineNoMatches:
8296
+ "Ningún evento de la línea de tiempo coincide con la búsqueda actual.",
8290
8297
  started: "Inicio",
8291
8298
  signedIn: "Con sesión iniciada",
8292
8299
  anonymous: "Anónimo",
@@ -8412,6 +8419,9 @@ const translatedSessionReplayTranslations = {
8412
8419
  timeline: "Chronologie des événements",
8413
8420
  timelineDescription:
8414
8421
  "Affichage de {{count}} événements utiles sur {{total}}.",
8422
+ timelineSearch: "Rechercher des événements...",
8423
+ timelineNoMatches:
8424
+ "Aucun événement de la chronologie ne correspond à la recherche actuelle.",
8415
8425
  started: "Début",
8416
8426
  signedIn: "Connecté",
8417
8427
  anonymous: "Anonyme",
@@ -8536,6 +8546,9 @@ const translatedSessionReplayTranslations = {
8536
8546
  timeline: "Ereignis-Timeline",
8537
8547
  timelineDescription:
8538
8548
  "{{count}} von {{total}} nützlichen Ereignissen werden angezeigt.",
8549
+ timelineSearch: "Ereignisse suchen...",
8550
+ timelineNoMatches:
8551
+ "Keine Timeline-Ereignisse entsprechen der aktuellen Suche.",
8539
8552
  started: "Gestartet",
8540
8553
  signedIn: "Angemeldet",
8541
8554
  anonymous: "Anonym",
@@ -8659,6 +8672,9 @@ const translatedSessionReplayTranslations = {
8659
8672
  timeline: "イベントタイムライン",
8660
8673
  timelineDescription:
8661
8674
  "有用なイベント {{count}} / {{total}} 件を表示しています。",
8675
+ timelineSearch: "イベントを検索...",
8676
+ timelineNoMatches:
8677
+ "現在の検索に一致するタイムラインイベントはありません。",
8662
8678
  started: "開始",
8663
8679
  signedIn: "サインイン済み",
8664
8680
  anonymous: "匿名",
@@ -8781,6 +8797,8 @@ const translatedSessionReplayTranslations = {
8781
8797
  timeline: "이벤트 타임라인",
8782
8798
  timelineDescription:
8783
8799
  "유용한 이벤트 {{count}} / {{total}}개를 표시합니다.",
8800
+ timelineSearch: "이벤트 검색...",
8801
+ timelineNoMatches: "현재 검색과 일치하는 타임라인 이벤트가 없습니다.",
8784
8802
  started: "시작",
8785
8803
  signedIn: "로그인됨",
8786
8804
  anonymous: "익명",
@@ -8903,6 +8921,9 @@ const translatedSessionReplayTranslations = {
8903
8921
  "Blocos com escopo usados para reconstruir este replay. As URLs do provedor permanecem privadas.",
8904
8922
  timeline: "Linha do tempo de eventos",
8905
8923
  timelineDescription: "Mostrando {{count}} de {{total}} eventos úteis.",
8924
+ timelineSearch: "Pesquisar eventos...",
8925
+ timelineNoMatches:
8926
+ "Nenhum evento da linha do tempo corresponde à pesquisa atual.",
8906
8927
  started: "Início",
8907
8928
  signedIn: "Logado",
8908
8929
  anonymous: "Anônimo",
@@ -9023,6 +9044,8 @@ const translatedSessionReplayTranslations = {
9023
9044
  "इस रीप्ले को फिर से बनाने के लिए उपयोग किए गए स्कोप्ड चंक। प्रदाता URL निजी रहते हैं।",
9024
9045
  timeline: "इवेंट टाइमलाइन",
9025
9046
  timelineDescription: "{{total}} में से {{count}} उपयोगी इवेंट दिखाए जा रहे हैं।",
9047
+ timelineSearch: "इवेंट खोजें...",
9048
+ timelineNoMatches: "वर्तमान खोज से कोई टाइमलाइन इवेंट मेल नहीं खाता।",
9026
9049
  started: "शुरू हुआ",
9027
9050
  signedIn: "साइन इन",
9028
9051
  anonymous: "अनाम",
@@ -9143,6 +9166,8 @@ const translatedSessionReplayTranslations = {
9143
9166
  "مقاطع محددة النطاق تُستخدم لإعادة بناء هذا التسجيل. تبقى عناوين URL الخاصة بالمزوّد خاصة.",
9144
9167
  timeline: "الخط الزمني للأحداث",
9145
9168
  timelineDescription: "عرض {{count}} من {{total}} أحداث مفيدة.",
9169
+ timelineSearch: "البحث عن الأحداث...",
9170
+ timelineNoMatches: "لا توجد أحداث في الخط الزمني تطابق البحث الحالي.",
9146
9171
  started: "بدأت",
9147
9172
  signedIn: "تم تسجيل الدخول",
9148
9173
  anonymous: "مجهول",
@@ -69,11 +69,17 @@ export default function MonitoringPage() {
69
69
  {inSubView ? null : (
70
70
  <div className="flex items-center justify-between gap-2">
71
71
  <TabsList>
72
- <TabsTrigger value="uptime" className="gap-2">
72
+ <TabsTrigger
73
+ value="uptime"
74
+ className="gap-2 data-[state=active]:bg-primary data-[state=active]:text-primary-foreground data-[state=active]:shadow-sm"
75
+ >
73
76
  <IconHeartbeat className="h-4 w-4" />
74
77
  {t("navigation.monitoringUptime")}
75
78
  </TabsTrigger>
76
- <TabsTrigger value="errors" className="gap-2">
79
+ <TabsTrigger
80
+ value="errors"
81
+ className="gap-2 data-[state=active]:bg-primary data-[state=active]:text-primary-foreground data-[state=active]:shadow-sm"
82
+ >
77
83
  <IconAlertTriangle className="h-4 w-4" />
78
84
  {t("navigation.monitoringErrors")}
79
85
  </TabsTrigger>
@@ -101,6 +101,8 @@ interface MonitorFormValues {
101
101
  severity: MonitorSeverity;
102
102
  channels: Record<(typeof KNOWN_CHANNELS)[number], boolean>;
103
103
  emailRecipients: string;
104
+ slackWebhookUrl: string;
105
+ webhookUrl: string;
104
106
  cooldownMinutes: number;
105
107
  enabled: boolean;
106
108
  }
@@ -160,6 +162,8 @@ function defaultValues(monitor: MonitorSummary | null): MonitorFormValues {
160
162
  webhook: channelSet.has("webhook"),
161
163
  },
162
164
  emailRecipients: (monitor?.emailRecipients ?? []).join(", "),
165
+ slackWebhookUrl: monitor?.slackWebhookUrl ?? "",
166
+ webhookUrl: monitor?.webhookUrl ?? "",
163
167
  cooldownMinutes: monitor?.cooldownMinutes ?? 15,
164
168
  enabled: monitor?.enabled ?? true,
165
169
  };
@@ -206,6 +210,8 @@ function initialSections(monitor: MonitorSummary | null): SectionState {
206
210
  alerting:
207
211
  !isDefaultChannels ||
208
212
  monitor.emailRecipients.length > 0 ||
213
+ Boolean(monitor.slackWebhookUrl) ||
214
+ Boolean(monitor.webhookUrl) ||
209
215
  monitor.severity !== "critical",
210
216
  advanced:
211
217
  monitor.method !== "GET" ||
@@ -362,6 +368,30 @@ export function MonitorFormPage({
362
368
  setError("channels", { message: t.channelRequired });
363
369
  return;
364
370
  }
371
+ if (
372
+ formValues.channels.email &&
373
+ !splitList(formValues.emailRecipients).length
374
+ ) {
375
+ setSections((prev) => ({ ...prev, alerting: true }));
376
+ setError("emailRecipients", { message: t.emailRecipientsRequired });
377
+ return;
378
+ }
379
+ if (formValues.channels.slack) {
380
+ const slackUrl = formValues.slackWebhookUrl.trim();
381
+ if (slackUrl && !isHttpUrl(slackUrl)) {
382
+ setSections((prev) => ({ ...prev, alerting: true }));
383
+ setError("slackWebhookUrl", { message: t.slackWebhookUrlInvalid });
384
+ return;
385
+ }
386
+ }
387
+ if (formValues.channels.webhook) {
388
+ const hookUrl = formValues.webhookUrl.trim();
389
+ if (hookUrl && !isHttpUrl(hookUrl)) {
390
+ setSections((prev) => ({ ...prev, alerting: true }));
391
+ setError("webhookUrl", { message: t.webhookUrlInvalid });
392
+ return;
393
+ }
394
+ }
365
395
 
366
396
  const assertions = formValues.assertions
367
397
  .map((assertion) => {
@@ -399,7 +429,15 @@ export function MonitorFormPage({
399
429
  followRedirects: formValues.followRedirects,
400
430
  severity: formValues.severity,
401
431
  channels,
402
- emailRecipients: splitList(formValues.emailRecipients),
432
+ emailRecipients: formValues.channels.email
433
+ ? splitList(formValues.emailRecipients)
434
+ : [],
435
+ slackWebhookUrl: formValues.channels.slack
436
+ ? formValues.slackWebhookUrl.trim()
437
+ : null,
438
+ webhookUrl: formValues.channels.webhook
439
+ ? formValues.webhookUrl.trim()
440
+ : null,
403
441
  cooldownMinutes: formValues.cooldownMinutes,
404
442
  enabled: formValues.enabled,
405
443
  };
@@ -736,8 +774,8 @@ export function MonitorFormPage({
736
774
  setSections((prev) => ({ ...prev, alerting: open }))
737
775
  }
738
776
  >
739
- <div className="grid gap-4 sm:grid-cols-2">
740
- <div className="space-y-1.5">
777
+ <div className="space-y-4">
778
+ <div className="space-y-1.5 sm:max-w-xs">
741
779
  <Label htmlFor="monitor-severity">{t.fieldSeverity}</Label>
742
780
  <Controller
743
781
  control={control}
@@ -765,43 +803,108 @@ export function MonitorFormPage({
765
803
  />
766
804
  </div>
767
805
 
768
- <div className="space-y-1.5">
806
+ <div className="space-y-2">
769
807
  <Label>{t.fieldChannels}</Label>
770
808
  <Controller
771
809
  control={control}
772
810
  name="channels"
773
811
  render={({ field }) => (
774
- <div className="grid grid-cols-2 gap-2">
775
- {KNOWN_CHANNELS.map((channel) => (
776
- <label
777
- key={channel}
778
- className="flex items-center gap-2 rounded-md border px-2.5 py-1.5 text-xs"
779
- >
780
- <Checkbox
781
- checked={field.value[channel]}
782
- onCheckedChange={(checked) =>
783
- field.onChange({
784
- ...field.value,
785
- [channel]: checked === true,
786
- })
787
- }
788
- />
789
- {channelLabel(channel, t)}
790
- </label>
791
- ))}
812
+ <div className="space-y-2">
813
+ {KNOWN_CHANNELS.map((channel) => {
814
+ const checked = field.value[channel];
815
+ return (
816
+ <div
817
+ key={channel}
818
+ className="rounded-md border border-border/60"
819
+ >
820
+ <label className="flex cursor-pointer items-start gap-2.5 px-3 py-2.5">
821
+ <Checkbox
822
+ className="mt-0.5"
823
+ checked={checked}
824
+ onCheckedChange={(next) =>
825
+ field.onChange({
826
+ ...field.value,
827
+ [channel]: next === true,
828
+ })
829
+ }
830
+ />
831
+ <span className="min-w-0">
832
+ <span className="block text-sm">
833
+ {channelLabel(channel, t)}
834
+ </span>
835
+ <span className="block text-xs text-muted-foreground">
836
+ {channelHint(channel, t)}
837
+ </span>
838
+ </span>
839
+ </label>
840
+ {channel === "email" && checked ? (
841
+ <div className="space-y-1.5 border-t border-border/60 px-3 py-2.5">
842
+ <Label htmlFor="monitor-emails">
843
+ {t.fieldEmailRecipients}
844
+ </Label>
845
+ <Textarea
846
+ id="monitor-emails"
847
+ className="min-h-[64px]"
848
+ placeholder={t.fieldEmailRecipientsPlaceholder}
849
+ {...register("emailRecipients")}
850
+ />
851
+ {errors.emailRecipients ? (
852
+ <p className="text-xs text-destructive">
853
+ {errors.emailRecipients.message}
854
+ </p>
855
+ ) : null}
856
+ </div>
857
+ ) : null}
858
+ {channel === "slack" && checked ? (
859
+ <div className="space-y-1.5 border-t border-border/60 px-3 py-2.5">
860
+ <Label htmlFor="monitor-slack-url">
861
+ {t.fieldSlackWebhookUrl}
862
+ </Label>
863
+ <Input
864
+ id="monitor-slack-url"
865
+ type="url"
866
+ placeholder={t.fieldSlackWebhookUrlPlaceholder}
867
+ {...register("slackWebhookUrl")}
868
+ />
869
+ {errors.slackWebhookUrl ? (
870
+ <p className="text-xs text-destructive">
871
+ {errors.slackWebhookUrl.message}
872
+ </p>
873
+ ) : (
874
+ <p className="text-xs text-muted-foreground">
875
+ {t.fieldSlackWebhookUrlHint}
876
+ </p>
877
+ )}
878
+ </div>
879
+ ) : null}
880
+ {channel === "webhook" && checked ? (
881
+ <div className="space-y-1.5 border-t border-border/60 px-3 py-2.5">
882
+ <Label htmlFor="monitor-webhook-url">
883
+ {t.fieldWebhookUrl}
884
+ </Label>
885
+ <Input
886
+ id="monitor-webhook-url"
887
+ type="url"
888
+ placeholder={t.fieldWebhookUrlPlaceholder}
889
+ {...register("webhookUrl")}
890
+ />
891
+ {errors.webhookUrl ? (
892
+ <p className="text-xs text-destructive">
893
+ {errors.webhookUrl.message}
894
+ </p>
895
+ ) : (
896
+ <p className="text-xs text-muted-foreground">
897
+ {t.fieldWebhookUrlHint}
898
+ </p>
899
+ )}
900
+ </div>
901
+ ) : null}
902
+ </div>
903
+ );
904
+ })}
792
905
  </div>
793
906
  )}
794
907
  />
795
- </div>
796
-
797
- <div className="space-y-1.5 sm:col-span-2">
798
- <Label htmlFor="monitor-emails">{t.fieldEmailRecipients}</Label>
799
- <Textarea
800
- id="monitor-emails"
801
- className="min-h-[64px]"
802
- placeholder={t.fieldEmailRecipientsPlaceholder}
803
- {...register("emailRecipients")}
804
- />
805
908
  {errors.channels ? (
806
909
  <p className="text-xs text-destructive">
807
910
  {errors.channels.message}
@@ -1024,3 +1127,19 @@ function channelLabel(
1024
1127
  return t.channelWebhook;
1025
1128
  }
1026
1129
  }
1130
+
1131
+ function channelHint(
1132
+ channel: (typeof KNOWN_CHANNELS)[number],
1133
+ t: ReturnType<typeof useUptimeT>,
1134
+ ): string {
1135
+ switch (channel) {
1136
+ case "inbox":
1137
+ return t.channelInboxHint;
1138
+ case "email":
1139
+ return t.channelEmailHint;
1140
+ case "slack":
1141
+ return t.channelSlackHint;
1142
+ case "webhook":
1143
+ return t.channelWebhookHint;
1144
+ }
1145
+ }
@@ -117,7 +117,7 @@ const MESSAGES = {
117
117
  sectionResponseChecksHint:
118
118
  "Choose which responses count as healthy and add body, header, or latency assertions.",
119
119
  sectionAlerting: "Alerting",
120
- sectionAlertingHint: "Pick the severity and where alerts are delivered.",
120
+ sectionAlertingHint: "Choose severity and where alerts go.",
121
121
  sectionAdvanced: "Advanced",
122
122
  sectionAdvancedHint:
123
123
  "Request method, timeout, cooldown, redirects, and pause.",
@@ -165,12 +165,24 @@ const MESSAGES = {
165
165
  severityWarning: "Warning",
166
166
  severityCritical: "Critical",
167
167
  fieldChannels: "Notify via",
168
- channelInbox: "Inbox",
168
+ channelInbox: "In-app inbox",
169
+ channelInboxHint: "Bell notifications inside Analytics.",
169
170
  channelEmail: "Email",
171
+ channelEmailHint: "Send to specific addresses.",
170
172
  channelSlack: "Slack",
173
+ channelSlackHint: "Post to a Slack incoming webhook.",
171
174
  channelWebhook: "Webhook",
175
+ channelWebhookHint: "POST JSON to any HTTPS endpoint.",
172
176
  fieldEmailRecipients: "Email recipients",
173
177
  fieldEmailRecipientsPlaceholder: "alerts@example.com, oncall@example.com",
178
+ fieldSlackWebhookUrl: "Slack webhook URL",
179
+ fieldSlackWebhookUrlPlaceholder: "https://hooks.slack.com/services/T…/B…/…",
180
+ fieldSlackWebhookUrlHint:
181
+ "Paste a Slack Incoming Webhook URL. Leave blank to use the workspace default, if configured.",
182
+ fieldWebhookUrl: "Webhook URL",
183
+ fieldWebhookUrlPlaceholder: "https://example.com/hooks/uptime",
184
+ fieldWebhookUrlHint:
185
+ "Receives a JSON POST with severity, title, and body. Leave blank to use the workspace default, if configured.",
174
186
  fieldCooldown: "Alert cooldown (minutes)",
175
187
  fieldEnabled: "Enabled",
176
188
  fieldEnabledHint: "Run this monitor on its schedule.",
@@ -188,6 +200,9 @@ const MESSAGES = {
188
200
  urlRequired: "Enter an absolute http(s) URL.",
189
201
  urlInvalid: "Enter a valid http(s) URL (e.g. https://example.com).",
190
202
  channelRequired: "Select at least one alert channel.",
203
+ emailRecipientsRequired: "Add at least one email recipient.",
204
+ slackWebhookUrlInvalid: "Enter a valid Slack webhook http(s) URL.",
205
+ webhookUrlInvalid: "Enter a valid webhook http(s) URL.",
191
206
  classRequired: "Select at least one status class.",
192
207
  codesRequired: "Enter at least one status code.",
193
208
  saved: "Monitor saved.",
@@ -61,6 +61,8 @@ export interface MonitorSummary {
61
61
  severity: MonitorSeverity;
62
62
  channels: string[];
63
63
  emailRecipients: string[];
64
+ slackWebhookUrl: string | null;
65
+ webhookUrl: string | null;
64
66
  cooldownMinutes: number;
65
67
  enabled: boolean;
66
68
  lastStatus: MonitorStatus | null;
@@ -156,6 +158,8 @@ export interface SaveMonitorInput {
156
158
  severity?: MonitorSeverity;
157
159
  channels?: string[];
158
160
  emailRecipients?: string[];
161
+ slackWebhookUrl?: string | null;
162
+ webhookUrl?: string | null;
159
163
  cooldownMinutes?: number;
160
164
  enabled?: boolean;
161
165
  }