@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.
- package/blueprints/action/crud.md +1 -1
- package/blueprints/channel/discord.md +1 -1
- package/blueprints/provider/stripe.md +1 -1
- package/blueprints/sandbox/docker.md +1 -1
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +31 -0
- package/corpus/core/blueprints/action/crud.md +1 -1
- package/corpus/core/blueprints/channel/discord.md +1 -1
- package/corpus/core/blueprints/provider/stripe.md +1 -1
- package/corpus/core/blueprints/sandbox/docker.md +1 -1
- package/corpus/core/docs/content/faq.mdx +17 -0
- package/corpus/core/docs/content/notifications.mdx +12 -6
- package/corpus/core/package.json +6 -5
- package/corpus/core/src/agent/production-agent.ts +140 -46
- package/corpus/core/src/agent/run-manager.ts +23 -2
- package/corpus/core/src/agent/run-store.ts +2 -2
- package/corpus/core/src/agent/tool-search.ts +71 -4
- package/corpus/core/src/cli/add.ts +1 -1
- package/corpus/core/src/cli/create.ts +8 -3
- package/corpus/core/src/cli/index.ts +25 -4
- package/corpus/core/src/cli/upgrade.ts +798 -0
- package/corpus/core/src/client/AssistantChat.tsx +1 -1
- package/corpus/core/src/client/HighlightedCodeBlock.tsx +20 -3
- package/corpus/core/src/client/agent-chat-adapter.ts +31 -6
- package/corpus/core/src/client/chat/message-components.tsx +85 -8
- package/corpus/core/src/client/chat/tool-call-display.tsx +355 -144
- package/corpus/core/src/client/code-agent-chat-adapter.ts +2 -9
- package/corpus/core/src/client/extensions/ExtensionSlot.tsx +7 -0
- package/corpus/core/src/client/settings/SettingsPanel.tsx +533 -389
- package/corpus/core/src/client/settings/SettingsSection.tsx +154 -17
- package/corpus/core/src/client/sse-event-processor.ts +29 -2
- package/corpus/core/src/extensions/actions.ts +113 -5
- package/corpus/core/src/jobs/scheduler.ts +30 -1
- package/corpus/core/src/localization/default-messages.ts +21 -0
- package/corpus/core/src/notifications/channels.ts +88 -25
- package/corpus/core/src/notifications/registry.ts +17 -3
- package/corpus/core/src/notifications/types.ts +4 -1
- package/corpus/core/src/server/agent-chat-plugin.ts +7 -3
- package/corpus/core/src/server/request-context.ts +7 -0
- package/corpus/core/src/styles/agent-conversation.css +1 -1
- package/corpus/core/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/core/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/core/src/templates/default/AGENTS.md +10 -3
- package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +21 -0
- package/corpus/core/src/templates/default/app/i18n/de-DE.ts +21 -0
- package/corpus/core/src/templates/default/app/i18n/en-US.ts +21 -0
- package/corpus/core/src/templates/default/app/i18n/es-ES.ts +21 -0
- package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +21 -0
- package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +20 -0
- package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +21 -0
- package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +20 -0
- package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +21 -0
- package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +20 -0
- package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +19 -0
- package/corpus/core/src/templates/default/package.json +4 -3
- package/corpus/core/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/core/src/templates/headless/AGENTS.md +9 -3
- package/corpus/core/src/templates/headless/package.json +4 -3
- package/corpus/core/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/core/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/core/src/templates/workspace-core/package.json +6 -6
- package/corpus/core/src/templates/workspace-root/AGENTS.md +10 -4
- package/corpus/core/src/templates/workspace-root/package.json +3 -2
- package/corpus/core/src/triggers/dispatcher.ts +30 -2
- package/corpus/core/src/vite/client.ts +96 -1
- package/corpus/templates/analytics/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +20 -2
- package/corpus/templates/analytics/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/analytics/AGENTS.md +7 -5
- package/corpus/templates/analytics/actions/save-monitor.ts +14 -0
- package/corpus/templates/analytics/app/components/dashboard/DataTable.tsx +41 -6
- package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +122 -11
- package/corpus/templates/analytics/app/global.css +26 -10
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +2 -0
- package/corpus/templates/analytics/app/i18n-data.ts +25 -0
- package/corpus/templates/analytics/app/pages/monitoring/MonitoringPage.tsx +8 -2
- package/corpus/templates/analytics/app/pages/monitoring/uptime/MonitorFormPage.tsx +151 -32
- package/corpus/templates/analytics/app/pages/monitoring/uptime/i18n.ts +17 -2
- package/corpus/templates/analytics/app/pages/monitoring/uptime/types.ts +4 -0
- package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +461 -286
- package/corpus/templates/analytics/app/pages/sessions/SessionDevToolsPanel.tsx +285 -294
- package/corpus/templates/analytics/changelog/2026-07-08-console-details-expand-inline-under-each-row-and-the-event-t.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-dashboard-tables-keep-their-size-while-loading.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-monitoring-uptime-and-errors-tabs-now-clearly-show-which-view-is-active.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-session-replay-keeps-a-usable-stage-when-dev-tools-is-open-a.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-session-replay-resumes-after-scrubbing-and-expands-console-r.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-session-replay-uses-stock-rrweb-sizing-again-so-recorded.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-session-replays-wait-for-full-load-keep-a-normal-viewport-an.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-sidebar-dashboard-menus-now-open-above-the-dashboard-canvas.md +6 -0
- 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
- package/corpus/templates/analytics/docs/uptime-monitoring.md +13 -11
- package/corpus/templates/analytics/package.json +2 -2
- package/corpus/templates/analytics/server/db/schema-monitoring.ts +4 -0
- package/corpus/templates/analytics/server/lib/uptime-monitors.ts +60 -12
- package/corpus/templates/analytics/server/plugins/db.ts +10 -0
- package/corpus/templates/assets/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/assets/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/assets/package.json +2 -2
- package/corpus/templates/brain/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/brain/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/brain/package.json +2 -2
- package/corpus/templates/calendar/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/calendar/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/calendar/AGENTS.md +10 -0
- package/corpus/templates/calendar/actions/create-event.ts +5 -1
- package/corpus/templates/calendar/actions/event-action-helpers.ts +41 -0
- package/corpus/templates/calendar/actions/get-attendee-timezones.ts +28 -0
- package/corpus/templates/calendar/actions/set-attendee-timezone.ts +68 -0
- package/corpus/templates/calendar/app/components/calendar/EventAttendeesSection.tsx +150 -11
- package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +36 -1
- package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +32 -0
- package/corpus/templates/calendar/app/hooks/use-attendee-timezones.ts +24 -0
- package/corpus/templates/calendar/app/i18n/zh-TW.ts +2 -0
- package/corpus/templates/calendar/app/i18n-data.ts +20 -0
- package/corpus/templates/calendar/app/lib/attendee-local-time.ts +122 -0
- package/corpus/templates/calendar/changelog/2026-07-08-event-details-now-support-extension-widgets-and-you-can-see-.md +6 -0
- package/corpus/templates/calendar/changelog/2026-07-08-when-you-invite-guests-to-a-new-event-you-now-appear-in.md +6 -0
- package/corpus/templates/calendar/package.json +2 -2
- package/corpus/templates/calendar/server/handlers/events.ts +5 -1
- package/corpus/templates/calendar/shared/api.ts +6 -0
- package/corpus/templates/chat/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/chat/package.json +2 -2
- package/corpus/templates/clips/.agents/skills/meetings/SKILL.md +6 -2
- package/corpus/templates/clips/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/clips/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/clips/actions/create-meeting.ts +8 -3
- package/corpus/templates/clips/actions/list-meetings.ts +31 -3
- package/corpus/templates/clips/changelog/2026-07-08-after-finishing-a-desktop-recording-reopening-clips-restor.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-08-clips-now-pops-up-to-take-notes-when-you-join-an-adhoc-zoom-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-08-desktop-clip-recordings-are-louder-after-capture-mic-only.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-08-desktop-meeting-notes-stay-active-from-tray-and-shortcut-controls.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-08-desktop-meeting-popovers-can-start-notes-and-join-the-meetin.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-08-meeting-notes-keep-their-recording-state-when-the-desktop.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-08-meeting-reminder-dropdowns-now-expand-fully-instead-of-being.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-08-meeting-reminders-now-appear-1-minute-before-start-stay-unti.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-08-the-desktop-meetings-panel-has-room-for-its-drop-shadow-and-.md +6 -0
- package/corpus/templates/clips/chrome-extension/package.json +2 -2
- package/corpus/templates/clips/desktop/package.json +2 -2
- package/corpus/templates/clips/desktop/src/app.tsx +214 -37
- package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +30 -6
- package/corpus/templates/clips/desktop/src/lib/meeting-notification-timing.ts +83 -0
- package/corpus/templates/clips/desktop/src/lib/native-recording-warm.ts +21 -0
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +98 -20
- package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +197 -50
- package/corpus/templates/clips/desktop/src/styles.css +150 -53
- package/corpus/templates/clips/desktop/src-tauri/src/adhoc_meetings_watcher.rs +362 -0
- package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +41 -7
- package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +9 -2
- package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +89 -11
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +71 -17
- package/corpus/templates/clips/desktop/src-tauri/src/native_speech.rs +36 -1
- package/corpus/templates/clips/desktop/src-tauri/src/notifications.rs +62 -10
- package/corpus/templates/clips/desktop/src-tauri/src/shortcuts.rs +3 -3
- package/corpus/templates/clips/desktop/src-tauri/src/silence_detector.rs +1 -25
- package/corpus/templates/clips/desktop/src-tauri/src/state.rs +5 -0
- package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +18 -6
- package/corpus/templates/clips/desktop/src-tauri/src/util.rs +36 -1
- package/corpus/templates/clips/package.json +2 -2
- package/corpus/templates/content/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/content/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/content/actions/_batch-utils.ts +8 -0
- package/corpus/templates/content/actions/_builder-cms-read-client.ts +7 -5
- package/corpus/templates/content/actions/_content-database-personal-view.ts +80 -0
- package/corpus/templates/content/actions/_database-source-utils.ts +776 -319
- package/corpus/templates/content/actions/_database-utils.ts +6 -1
- package/corpus/templates/content/actions/_property-utils.ts +168 -0
- package/corpus/templates/content/actions/add-content-database-source-field-property.ts +19 -12
- package/corpus/templates/content/actions/bind-content-database-source-field.ts +19 -12
- package/corpus/templates/content/actions/delete-document.ts +9 -13
- package/corpus/templates/content/actions/get-content-database-personal-view.ts +27 -0
- package/corpus/templates/content/actions/refresh-content-database-source.ts +5 -5
- package/corpus/templates/content/actions/update-content-database-personal-view.ts +31 -0
- package/corpus/templates/content/actions/update-content-database-view.ts +3 -0
- package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +1 -1
- package/corpus/templates/content/app/components/editor/body-hydration.ts +35 -11
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +2631 -551
- package/corpus/templates/content/app/components/editor/database/filter-sort.ts +220 -18
- package/corpus/templates/content/app/hooks/use-content-database.ts +32 -0
- package/corpus/templates/content/app/hooks/use-documents.ts +8 -2
- package/corpus/templates/content/app/i18n/zh-TW.ts +16 -0
- package/corpus/templates/content/app/i18n-data.ts +154 -0
- package/corpus/templates/content/changelog/2026-07-08-builder-source-sync-now-completes-reliably-on-hosted-databases.md +6 -0
- package/corpus/templates/content/changelog/2026-07-08-database-filters-now-support-notion-style-reset-save-for-eve.md +6 -0
- package/corpus/templates/content/changelog/2026-07-08-date-filters-can-now-target-a-between-range.md +6 -0
- package/corpus/templates/content/changelog/2026-07-08-fixed-builder-database-sync-so-large-sources-continue-past-t.md +6 -0
- package/corpus/templates/content/package.json +2 -2
- package/corpus/templates/content/parity/matrix.md +1 -1
- package/corpus/templates/content/parity/matrix.ts +2 -0
- package/corpus/templates/content/server/plugins/db.ts +19 -0
- package/corpus/templates/content/shared/api.ts +24 -0
- package/corpus/templates/design/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/design/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/design/package.json +2 -2
- package/corpus/templates/dispatch/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/dispatch/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/dispatch/app/i18n/zh-TW.ts +34 -1
- package/corpus/templates/dispatch/app/i18n-data.ts +387 -10
- package/corpus/templates/dispatch/app/routes/automations.tsx +1 -0
- package/corpus/templates/dispatch/changelog/2026-07-08-added-an-automations-page-to-review-pause-and-create.md +6 -0
- package/corpus/templates/dispatch/changelog/2026-07-08-destinations-now-shows-outbound-delivery-queue-health.md +6 -0
- package/corpus/templates/dispatch/package.json +2 -2
- package/corpus/templates/forms/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/forms/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/forms/package.json +2 -2
- package/corpus/templates/macros/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/macros/package.json +2 -2
- package/corpus/templates/mail/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/mail/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/mail/app/hooks/use-emails.ts +56 -44
- package/corpus/templates/mail/app/lib/gmail-mutation-queue.ts +325 -0
- package/corpus/templates/mail/changelog/2026-07-08-rapid-archive-and-mark-read-now-batch-gmail-updates-so-the-i.md +6 -0
- package/corpus/templates/mail/package.json +2 -2
- package/corpus/templates/plan/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/plan/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/plan/package.json +2 -2
- package/corpus/templates/slides/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/slides/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/slides/app/components/editor/ImageDropPromptPopover.tsx +46 -29
- package/corpus/templates/slides/app/context/DeckContext.tsx +45 -18
- package/corpus/templates/slides/app/i18n/ar-SA.ts +4 -0
- package/corpus/templates/slides/app/i18n/de-DE.ts +4 -0
- package/corpus/templates/slides/app/i18n/en-US.ts +4 -0
- package/corpus/templates/slides/app/i18n/es-ES.ts +4 -0
- package/corpus/templates/slides/app/i18n/fr-FR.ts +4 -0
- package/corpus/templates/slides/app/i18n/hi-IN.ts +4 -0
- package/corpus/templates/slides/app/i18n/ja-JP.ts +4 -0
- package/corpus/templates/slides/app/i18n/ko-KR.ts +4 -0
- package/corpus/templates/slides/app/i18n/pt-BR.ts +4 -0
- package/corpus/templates/slides/app/i18n/zh-CN.ts +4 -0
- package/corpus/templates/slides/app/i18n/zh-TW.ts +4 -0
- package/corpus/templates/slides/app/lib/image-drop-to-agent.ts +115 -0
- package/corpus/templates/slides/app/pages/DeckEditor.tsx +22 -13
- package/corpus/templates/slides/changelog/2026-07-08-dropping-an-image-onto-a-slide-and-sending-it-to-the-agent-w.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-08-undo-works-after-the-agent-edits-a-slide-so-you-can-reverse.md +6 -0
- package/corpus/templates/slides/package.json +2 -2
- package/corpus/templates/videos/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/voice/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/dist/agent/production-agent.d.ts +5 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +112 -42
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-manager.d.ts.map +1 -1
- package/dist/agent/run-manager.js +23 -2
- package/dist/agent/run-manager.js.map +1 -1
- package/dist/agent/run-store.js +2 -2
- package/dist/agent/run-store.js.map +1 -1
- package/dist/agent/tool-search.d.ts +2 -0
- package/dist/agent/tool-search.d.ts.map +1 -1
- package/dist/agent/tool-search.js +60 -4
- package/dist/agent/tool-search.js.map +1 -1
- package/dist/catalog.json +2 -2
- package/dist/cli/add.js +1 -1
- package/dist/cli/add.js.map +1 -1
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +8 -3
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/index.js +24 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/upgrade.d.ts +100 -0
- package/dist/cli/upgrade.d.ts.map +1 -0
- package/dist/cli/upgrade.js +678 -0
- package/dist/cli/upgrade.js.map +1 -0
- package/dist/client/AssistantChat.js +1 -1
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/HighlightedCodeBlock.d.ts +2 -0
- package/dist/client/HighlightedCodeBlock.d.ts.map +1 -1
- package/dist/client/HighlightedCodeBlock.js +10 -1
- package/dist/client/HighlightedCodeBlock.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +32 -4
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/chat/message-components.d.ts.map +1 -1
- package/dist/client/chat/message-components.js +61 -8
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/chat/tool-call-display.d.ts +12 -0
- package/dist/client/chat/tool-call-display.d.ts.map +1 -1
- package/dist/client/chat/tool-call-display.js +136 -42
- package/dist/client/chat/tool-call-display.js.map +1 -1
- package/dist/client/code-agent-chat-adapter.js +2 -9
- package/dist/client/code-agent-chat-adapter.js.map +1 -1
- package/dist/client/extensions/ExtensionSlot.js +6 -0
- package/dist/client/extensions/ExtensionSlot.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +52 -19
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/settings/SettingsSection.d.ts +19 -4
- package/dist/client/settings/SettingsSection.d.ts.map +1 -1
- package/dist/client/settings/SettingsSection.js +33 -4
- package/dist/client/settings/SettingsSection.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts +9 -0
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +20 -2
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/extensions/actions.d.ts.map +1 -1
- package/dist/extensions/actions.js +85 -5
- package/dist/extensions/actions.js.map +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +1 -1
- package/dist/jobs/scheduler.js +26 -1
- package/dist/jobs/scheduler.js.map +1 -1
- package/dist/localization/default-messages.d.ts +19 -0
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +19 -0
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/notifications/channels.d.ts +8 -3
- package/dist/notifications/channels.d.ts.map +1 -1
- package/dist/notifications/channels.js +61 -22
- package/dist/notifications/channels.js.map +1 -1
- package/dist/notifications/registry.d.ts.map +1 -1
- package/dist/notifications/registry.js +14 -3
- package/dist/notifications/registry.js.map +1 -1
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/notifications/types.d.ts +4 -1
- package/dist/notifications/types.d.ts.map +1 -1
- package/dist/notifications/types.js.map +1 -1
- package/dist/observability/routes.d.ts +1 -1
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/dist/resources/handlers.d.ts +3 -3
- package/dist/server/agent-chat-plugin.d.ts +5 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +2 -2
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/request-context.d.ts +7 -0
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/request-context.js.map +1 -1
- package/dist/styles/agent-conversation.css +1 -1
- package/dist/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/dist/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/dist/templates/default/AGENTS.md +10 -3
- package/dist/templates/default/app/i18n/ar-SA.ts +21 -0
- package/dist/templates/default/app/i18n/de-DE.ts +21 -0
- package/dist/templates/default/app/i18n/en-US.ts +21 -0
- package/dist/templates/default/app/i18n/es-ES.ts +21 -0
- package/dist/templates/default/app/i18n/fr-FR.ts +21 -0
- package/dist/templates/default/app/i18n/hi-IN.ts +20 -0
- package/dist/templates/default/app/i18n/ja-JP.ts +21 -0
- package/dist/templates/default/app/i18n/ko-KR.ts +20 -0
- package/dist/templates/default/app/i18n/pt-BR.ts +21 -0
- package/dist/templates/default/app/i18n/zh-CN.ts +20 -0
- package/dist/templates/default/app/i18n/zh-TW.ts +19 -0
- package/dist/templates/default/package.json +4 -3
- package/dist/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/dist/templates/headless/AGENTS.md +9 -3
- package/dist/templates/headless/package.json +4 -3
- package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/dist/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/dist/templates/workspace-core/package.json +6 -6
- package/dist/templates/workspace-root/AGENTS.md +10 -4
- package/dist/templates/workspace-root/package.json +3 -2
- package/dist/triggers/dispatcher.js +27 -2
- package/dist/triggers/dispatcher.js.map +1 -1
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +70 -1
- package/dist/vite/client.js.map +1 -1
- package/docs/content/faq.mdx +17 -0
- package/docs/content/notifications.mdx +12 -6
- package/package.json +7 -6
- package/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/src/templates/default/AGENTS.md +10 -3
- package/src/templates/default/app/i18n/ar-SA.ts +21 -0
- package/src/templates/default/app/i18n/de-DE.ts +21 -0
- package/src/templates/default/app/i18n/en-US.ts +21 -0
- package/src/templates/default/app/i18n/es-ES.ts +21 -0
- package/src/templates/default/app/i18n/fr-FR.ts +21 -0
- package/src/templates/default/app/i18n/hi-IN.ts +20 -0
- package/src/templates/default/app/i18n/ja-JP.ts +21 -0
- package/src/templates/default/app/i18n/ko-KR.ts +20 -0
- package/src/templates/default/app/i18n/pt-BR.ts +21 -0
- package/src/templates/default/app/i18n/zh-CN.ts +20 -0
- package/src/templates/default/app/i18n/zh-TW.ts +19 -0
- package/src/templates/default/package.json +4 -3
- package/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/src/templates/headless/AGENTS.md +9 -3
- package/src/templates/headless/package.json +4 -3
- package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/src/templates/workspace-core/package.json +6 -6
- package/src/templates/workspace-root/AGENTS.md +10 -4
- 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
|
-
|
|
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
|
|
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
|
|
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
|
|
93
|
-
|
|
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.
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
`
|
|
147
|
-
|
|
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
|
-
<
|
|
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=
|
|
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
|
|
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=
|
|
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
|
|
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=
|
|
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">
|