@agent-native/core 0.91.2 → 0.92.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +31 -0
- package/corpus/core/docs/content/faq.mdx +17 -0
- package/corpus/core/docs/content/notifications.mdx +12 -6
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/agent/production-agent.ts +140 -46
- package/corpus/core/src/agent/tool-search.ts +71 -4
- package/corpus/core/src/application-state/store.ts +12 -1
- package/corpus/core/src/cli/index.ts +20 -0
- package/corpus/core/src/cli/upgrade.ts +798 -0
- package/corpus/core/src/client/AssistantChat.tsx +28 -15
- package/corpus/core/src/client/HighlightedCodeBlock.tsx +20 -3
- package/corpus/core/src/client/PoweredByBadge.tsx +1 -8
- package/corpus/core/src/client/agent-chat-adapter.ts +68 -16
- 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/chat/widgets/DataTableWidget.tsx +52 -1
- package/corpus/core/src/client/code-agent-chat-adapter.ts +2 -9
- package/corpus/core/src/client/db-admin/TableEditor.tsx +49 -0
- package/corpus/core/src/client/db-admin/export-utils.ts +13 -4
- package/corpus/core/src/client/db-admin/useAgentSync.ts +72 -0
- package/corpus/core/src/client/error-capture.ts +69 -7
- package/corpus/core/src/client/extensions/EmbeddedExtension.tsx +5 -1
- package/corpus/core/src/client/extensions/ExtensionViewer.tsx +53 -8
- package/corpus/core/src/client/extensions/InlineExtensionFrame.tsx +5 -1
- package/corpus/core/src/client/extensions/portable-extension.ts +1 -0
- package/corpus/core/src/client/org/OrgSwitcher.tsx +12 -9
- package/corpus/core/src/client/org/TeamPage.tsx +77 -71
- package/corpus/core/src/client/session-replay.ts +3 -97
- package/corpus/core/src/client/settings/SettingsPanel.tsx +738 -441
- package/corpus/core/src/client/settings/SettingsSection.tsx +161 -17
- package/corpus/core/src/client/settings/SettingsTabsPage.tsx +25 -9
- package/corpus/core/src/client/sse-event-processor.ts +29 -2
- package/corpus/core/src/db-admin/agent-tools.ts +8 -2
- package/corpus/core/src/db-admin/operations.ts +116 -4
- package/corpus/core/src/db-admin/routes.ts +1 -0
- package/corpus/core/src/db-admin/types.ts +4 -0
- package/corpus/core/src/extensions/actions.ts +113 -5
- package/corpus/core/src/extensions/html-shell.ts +5 -4
- package/corpus/core/src/extensions/routes.ts +10 -0
- package/corpus/core/src/navigation/index.ts +1 -1
- 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/resources/handlers.ts +10 -8
- package/corpus/core/src/server/agent-chat-plugin.ts +7 -3
- package/corpus/core/src/server/poll.ts +293 -8
- package/corpus/core/src/server/request-context.ts +7 -0
- package/corpus/core/src/styles/agent-conversation.css +1 -1
- package/corpus/core/src/styles/agent-native.css +27 -0
- package/corpus/core/src/templates/default/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/core/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/corpus/core/src/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/core/src/templates/default/.agents/skills/security/SKILL.md +7 -0
- package/corpus/core/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/core/src/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
- package/corpus/core/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/core/src/templates/default/AGENTS.md +14 -5
- package/corpus/core/src/templates/default/package.json +2 -1
- package/corpus/core/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/core/src/templates/headless/AGENTS.md +13 -3
- package/corpus/core/src/templates/headless/package.json +1 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/core/src/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
- 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/storing-data/SKILL.md +5 -1
- package/corpus/core/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/core/src/templates/workspace-core/AGENTS.md +7 -1
- package/corpus/core/src/templates/workspace-root/AGENTS.md +17 -5
- package/corpus/core/src/templates/workspace-root/package.json +1 -0
- package/corpus/templates/analytics/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +10 -0
- package/corpus/templates/analytics/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/analytics/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/analytics/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +5 -6
- package/corpus/templates/analytics/.agents/skills/storing-data/SKILL.md +5 -1
- package/corpus/templates/analytics/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/analytics/AGENTS.md +39 -18
- package/corpus/templates/analytics/actions/capture-test-error.ts +4 -0
- package/corpus/templates/analytics/actions/get-analytics-alert-rule-defaults.ts +23 -0
- package/corpus/templates/analytics/actions/get-error-issue.ts +1 -1
- package/corpus/templates/analytics/actions/list-analysis-revisions.ts +40 -0
- package/corpus/templates/analytics/actions/list-dashboard-revisions.ts +40 -0
- package/corpus/templates/analytics/actions/list-dashboard-usage-stats.ts +299 -0
- package/corpus/templates/analytics/actions/navigate.ts +4 -2
- package/corpus/templates/analytics/actions/restore-analysis-revision.ts +43 -0
- package/corpus/templates/analytics/actions/restore-dashboard-revision.ts +68 -0
- package/corpus/templates/analytics/actions/save-analytics-alert-rule.ts +14 -0
- package/corpus/templates/analytics/actions/save-monitor.ts +15 -1
- package/corpus/templates/analytics/actions/view-screen.ts +24 -0
- package/corpus/templates/analytics/app/components/analysis/AnalysisHistoryPanel.tsx +181 -0
- package/corpus/templates/analytics/app/components/dashboard/DashboardHistoryPanel.tsx +184 -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/components/layout/CommandPalette.tsx +22 -16
- package/corpus/templates/analytics/app/components/layout/Header.tsx +1 -1
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +27 -21
- package/corpus/templates/analytics/app/hooks/use-analysis-revisions.ts +43 -0
- package/corpus/templates/analytics/app/hooks/use-dashboard-chat-context.ts +110 -0
- package/corpus/templates/analytics/app/hooks/use-dashboard-revisions.ts +43 -0
- package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +8 -3
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +64 -2
- package/corpus/templates/analytics/app/i18n-data.ts +783 -3
- package/corpus/templates/analytics/app/pages/Agents.tsx +359 -19
- package/corpus/templates/analytics/app/pages/Settings.tsx +3 -2
- package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +34 -1
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +28 -0
- package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +18 -1
- package/corpus/templates/analytics/app/pages/monitoring/ErrorsPanel.tsx +7 -10
- package/corpus/templates/analytics/app/pages/monitoring/MonitoringPage.tsx +8 -2
- package/corpus/templates/analytics/app/pages/monitoring/errors/IssueDetail.tsx +479 -23
- package/corpus/templates/analytics/app/pages/monitoring/errors/IssueList.tsx +0 -9
- package/corpus/templates/analytics/app/pages/monitoring/errors/i18n.ts +11 -0
- package/corpus/templates/analytics/app/pages/monitoring/errors/types.ts +9 -1
- package/corpus/templates/analytics/app/pages/monitoring/uptime/MonitorFormPage.tsx +157 -35
- 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 +80 -220
- package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +9 -99
- package/corpus/templates/analytics/app/pages/settings/AlertRulesSettingsCard.tsx +262 -104
- package/corpus/templates/analytics/app/routes/team.tsx +1 -1
- package/corpus/templates/analytics/changelog/2026-07-08-admins-can-audit-dashboard-usage-ownership-and-cleanup-signa.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-agent-monitoring-stays-available-to-non-admins.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-alert-rules-are-easier-to-scan-expand-and-edit-from-settings.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-analytics-alert-forms-remember-last-email-recipients.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-analytics-alert-rules-can-now-use-per-rule-slack-and-webhook.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-dashboard-history-and-chat-context.md +5 -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-dashboard-usage-now-counts-explorer-dashboard-traffic.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-demo-mode-session-emails-are-filtered-and-anonymized.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-error-issue-detail-adds-stack-traces-and-frequency-bars.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-error-issue-detail-now-shows-the-latest-occurrence-message-a.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-monitoring-errors-only-show-test-action-when-empty.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-production-session-replay-now-requires-private-blob-storage-.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-shared-extension-links-now-show-a-clear-message-when-you-do-.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-team-settings-show-access-controls-next-to-member-lists.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/changelog/2026-07-08-uptime-monitors-now-use-a-10-second-request-timeout-by-defau.md +6 -0
- package/corpus/templates/analytics/docs/uptime-monitoring.md +13 -11
- package/corpus/templates/analytics/server/db/schema-monitoring.ts +5 -1
- package/corpus/templates/analytics/server/db/schema.ts +56 -0
- package/corpus/templates/analytics/server/lib/analytics-alerts.ts +92 -0
- package/corpus/templates/analytics/server/lib/dashboards-store.ts +334 -5
- package/corpus/templates/analytics/server/lib/error-capture.ts +231 -36
- package/corpus/templates/analytics/server/lib/session-replay.ts +114 -8
- package/corpus/templates/analytics/server/lib/uptime-monitors.ts +65 -16
- package/corpus/templates/analytics/server/plugins/db.ts +122 -2
- package/corpus/templates/analytics/server/routes/api/dashboard-agent-context.json.get.ts +1 -0
- package/corpus/templates/assets/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/assets/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/assets/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/assets/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/assets/.agents/skills/storing-data/SKILL.md +5 -1
- package/corpus/templates/assets/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/assets/AGENTS.md +4 -0
- package/corpus/templates/assets/app/routes/settings.tsx +1 -1
- package/corpus/templates/assets/app/routes/team.tsx +1 -1
- package/corpus/templates/brain/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/brain/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/corpus/templates/brain/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/brain/.agents/skills/security/SKILL.md +7 -0
- 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/AGENTS.md +4 -0
- package/corpus/templates/brain/app/routes/team.tsx +1 -1
- package/corpus/templates/calendar/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/calendar/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/calendar/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/calendar/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/calendar/.agents/skills/storing-data/SKILL.md +5 -1
- package/corpus/templates/calendar/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/calendar/AGENTS.md +4 -0
- package/corpus/templates/calendar/app/components/calendar/DayView.tsx +11 -2
- package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +21 -8
- package/corpus/templates/calendar/app/components/calendar/MonthView.tsx +7 -1
- package/corpus/templates/calendar/app/components/calendar/WeekView.tsx +11 -2
- package/corpus/templates/calendar/app/lib/popover-click-guard.ts +48 -4
- package/corpus/templates/calendar/app/pages/Settings.tsx +1 -1
- package/corpus/templates/calendar/app/routes/_app.team.tsx +1 -1
- package/corpus/templates/calendar/changelog/2026-07-08-clicking-empty-calendar-space-closes-an-open-event-popover-b.md +6 -0
- package/corpus/templates/chat/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/chat/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/corpus/templates/chat/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/chat/.agents/skills/security/SKILL.md +7 -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/AGENTS.md +4 -0
- package/corpus/templates/chat/app/hooks/use-navigation-state.ts +1 -1
- package/corpus/templates/chat/app/routes/settings.tsx +2 -2
- package/corpus/templates/chat/app/routes/team.tsx +1 -1
- package/corpus/templates/clips/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/clips/.agents/skills/security/SKILL.md +7 -0
- 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/AGENTS.md +4 -0
- package/corpus/templates/clips/actions/finalize-recording.ts +9 -3
- package/corpus/templates/clips/actions/set-thumbnail.ts +11 -2
- package/corpus/templates/clips/app/components/meetings/canvas-editor.tsx +1 -7
- package/corpus/templates/clips/app/components/player/player-controls.tsx +21 -13
- package/corpus/templates/clips/app/components/player/video-player.tsx +30 -75
- package/corpus/templates/clips/app/i18n/ar-SA.ts +6 -5
- package/corpus/templates/clips/app/i18n/de-DE.ts +6 -6
- package/corpus/templates/clips/app/i18n/en-US.ts +6 -5
- package/corpus/templates/clips/app/i18n/es-ES.ts +6 -5
- package/corpus/templates/clips/app/i18n/fr-FR.ts +6 -6
- package/corpus/templates/clips/app/i18n/hi-IN.ts +6 -5
- package/corpus/templates/clips/app/i18n/ja-JP.ts +6 -5
- package/corpus/templates/clips/app/i18n/ko-KR.ts +6 -5
- package/corpus/templates/clips/app/i18n/pt-BR.ts +6 -5
- package/corpus/templates/clips/app/i18n/zh-CN.ts +6 -5
- package/corpus/templates/clips/app/i18n/zh-TW.ts +6 -5
- package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +51 -118
- 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-hosted-clip-uploads-now-clear-failed-buffered-chunks.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-08-hosted-recording-uploads-now-avoid-sql-chunk-storage.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-recaps-now-keep-summaries-action-items-and-transcrip.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-video-playback-controls-now-match-loom-style-5-second-skips-.md +6 -0
- package/corpus/templates/clips/desktop/src/app.tsx +123 -3
- package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +15 -1
- package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +23 -0
- package/corpus/templates/clips/desktop/src/styles.css +23 -1
- package/corpus/templates/clips/desktop/src-tauri/src/adhoc_meetings_watcher.rs +1 -3
- package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +40 -6
- package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +4 -2
- package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +3 -5
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +23 -19
- package/corpus/templates/clips/desktop/src-tauri/src/shortcuts.rs +3 -3
- package/corpus/templates/clips/desktop/src-tauri/src/silence_detector.rs +0 -1
- 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/server/lib/recording-upload-state.ts +63 -0
- package/corpus/templates/clips/server/lib/video-storage.ts +4 -0
- package/corpus/templates/clips/server/routes/api/recordings/[recordingId]/thumbnail.post.ts +19 -13
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +40 -1
- package/corpus/templates/content/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/content/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/content/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/content/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/content/.agents/skills/storing-data/SKILL.md +5 -1
- package/corpus/templates/content/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/content/AGENTS.md +4 -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/_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/refresh-content-database-source.ts +5 -5
- package/corpus/templates/content/app/components/editor/body-hydration.ts +35 -11
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +47 -5
- package/corpus/templates/content/app/hooks/use-documents.ts +8 -2
- package/corpus/templates/content/app/routes/_app.settings.tsx +2 -2
- package/corpus/templates/content/app/routes/_app.team.tsx +1 -1
- 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-fixed-builder-database-sync-so-large-sources-continue-past-t.md +6 -0
- package/corpus/templates/content/server/plugins/db.ts +19 -0
- package/corpus/templates/design/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/design/.agents/skills/security/SKILL.md +7 -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/AGENTS.md +4 -0
- package/corpus/templates/design/actions/take-design-screenshot.ts +12 -9
- package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +57 -13
- package/corpus/templates/design/app/routes/team.tsx +1 -1
- package/corpus/templates/design/changelog/2026-07-08-local-images-added-to-designs-now-upload-to-file-storage-ins.md +6 -0
- package/corpus/templates/dispatch/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/dispatch/.agents/skills/security/SKILL.md +7 -0
- 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/AGENTS.md +4 -0
- package/corpus/templates/dispatch/app/hooks/use-navigation-state.ts +1 -1
- package/corpus/templates/dispatch/app/routes/settings.tsx +2 -2
- package/corpus/templates/dispatch/app/routes/team.tsx +1 -1
- package/corpus/templates/forms/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/forms/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/forms/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/forms/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/forms/.agents/skills/storing-data/SKILL.md +5 -1
- package/corpus/templates/forms/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/forms/AGENTS.md +4 -0
- package/corpus/templates/forms/app/routes/_app.settings.tsx +2 -2
- package/corpus/templates/forms/app/routes/_app.team.tsx +1 -1
- package/corpus/templates/forms/shared/navigation.ts +1 -1
- package/corpus/templates/macros/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/macros/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/macros/AGENTS.md +4 -0
- package/corpus/templates/macros/app/routes/settings.tsx +2 -2
- package/corpus/templates/macros/app/routes/team.tsx +1 -1
- package/corpus/templates/mail/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/mail/.agents/skills/email-drafts/SKILL.md +1 -1
- package/corpus/templates/mail/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/mail/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/mail/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/mail/.agents/skills/storing-data/SKILL.md +5 -1
- package/corpus/templates/mail/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/mail/AGENTS.md +4 -0
- package/corpus/templates/mail/changelog/2026-07-08-mail-attachments-in-hosted-environments-now-require-file-sto.md +6 -0
- package/corpus/templates/mail/server/handlers/media.ts +26 -1
- package/corpus/templates/mail/server/lib/outgoing-email.ts +24 -1
- package/corpus/templates/mail/server/lib/upload-store.ts +2 -1
- package/corpus/templates/plan/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/plan/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/corpus/templates/plan/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/plan/.agents/skills/security/SKILL.md +7 -0
- 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/AGENTS.md +4 -0
- package/corpus/templates/plan/app/hooks/use-navigation-state.ts +1 -1
- package/corpus/templates/plan/app/routes/settings.tsx +2 -2
- package/corpus/templates/plan/app/routes/team.tsx +1 -1
- package/corpus/templates/plan/changelog/2026-07-08-hosted-plan-images-now-require-connected-storage.md +6 -0
- package/corpus/templates/plan/server/lib/plan-assets.ts +33 -4
- package/corpus/templates/slides/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/slides/.agents/skills/security/SKILL.md +7 -0
- 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/AGENTS.md +4 -0
- package/corpus/templates/slides/actions/generate-image-api.ts +15 -3
- package/corpus/templates/slides/app/routes/settings.tsx +2 -2
- package/corpus/templates/slides/app/routes/team.tsx +1 -1
- package/corpus/templates/slides/changelog/2026-07-08-generated-slide-images-now-return-hosted-file-storage-urls-i.md +6 -0
- package/corpus/templates/slides/shared/api.ts +1 -1
- 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/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/application-state/store.d.ts.map +1 -1
- package/dist/application-state/store.js +8 -2
- package/dist/application-state/store.js.map +1 -1
- package/dist/cli/index.js +19 -0
- 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.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +25 -14
- 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/PoweredByBadge.d.ts +1 -1
- package/dist/client/PoweredByBadge.d.ts.map +1 -1
- package/dist/client/PoweredByBadge.js +3 -9
- package/dist/client/PoweredByBadge.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +60 -13
- 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/chat/widgets/DataTableWidget.d.ts.map +1 -1
- package/dist/client/chat/widgets/DataTableWidget.js +19 -2
- package/dist/client/chat/widgets/DataTableWidget.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/db-admin/TableEditor.d.ts.map +1 -1
- package/dist/client/db-admin/TableEditor.js +19 -2
- package/dist/client/db-admin/TableEditor.js.map +1 -1
- package/dist/client/db-admin/export-utils.d.ts +2 -0
- package/dist/client/db-admin/export-utils.d.ts.map +1 -1
- package/dist/client/db-admin/export-utils.js +11 -3
- package/dist/client/db-admin/export-utils.js.map +1 -1
- package/dist/client/db-admin/useAgentSync.d.ts.map +1 -1
- package/dist/client/db-admin/useAgentSync.js +63 -0
- package/dist/client/db-admin/useAgentSync.js.map +1 -1
- package/dist/client/error-capture.d.ts.map +1 -1
- package/dist/client/error-capture.js +41 -7
- package/dist/client/error-capture.js.map +1 -1
- package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -1
- package/dist/client/extensions/EmbeddedExtension.js +3 -1
- package/dist/client/extensions/EmbeddedExtension.js.map +1 -1
- package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionViewer.js +32 -5
- package/dist/client/extensions/ExtensionViewer.js.map +1 -1
- package/dist/client/extensions/InlineExtensionFrame.d.ts.map +1 -1
- package/dist/client/extensions/InlineExtensionFrame.js +3 -1
- package/dist/client/extensions/InlineExtensionFrame.js.map +1 -1
- package/dist/client/extensions/portable-extension.d.ts.map +1 -1
- package/dist/client/extensions/portable-extension.js +1 -0
- package/dist/client/extensions/portable-extension.js.map +1 -1
- package/dist/client/org/OrgSwitcher.d.ts +1 -1
- package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
- package/dist/client/org/OrgSwitcher.js +11 -6
- package/dist/client/org/OrgSwitcher.js.map +1 -1
- package/dist/client/org/TeamPage.d.ts.map +1 -1
- package/dist/client/org/TeamPage.js +5 -5
- package/dist/client/org/TeamPage.js.map +1 -1
- package/dist/client/session-replay.d.ts +0 -8
- package/dist/client/session-replay.d.ts.map +1 -1
- package/dist/client/session-replay.js +3 -80
- package/dist/client/session-replay.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +89 -33
- 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/settings/SettingsTabsPage.d.ts.map +1 -1
- package/dist/client/settings/SettingsTabsPage.js +21 -10
- package/dist/client/settings/SettingsTabsPage.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/db-admin/agent-tools.d.ts.map +1 -1
- package/dist/db-admin/agent-tools.js +7 -2
- package/dist/db-admin/agent-tools.js.map +1 -1
- package/dist/db-admin/operations.d.ts.map +1 -1
- package/dist/db-admin/operations.js +90 -4
- package/dist/db-admin/operations.js.map +1 -1
- package/dist/db-admin/routes.d.ts.map +1 -1
- package/dist/db-admin/routes.js +1 -0
- package/dist/db-admin/routes.js.map +1 -1
- package/dist/db-admin/types.d.ts +4 -0
- package/dist/db-admin/types.d.ts.map +1 -1
- package/dist/db-admin/types.js.map +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/extensions/html-shell.d.ts +5 -4
- package/dist/extensions/html-shell.d.ts.map +1 -1
- package/dist/extensions/html-shell.js.map +1 -1
- package/dist/extensions/routes.d.ts.map +1 -1
- package/dist/extensions/routes.js +8 -0
- package/dist/extensions/routes.js.map +1 -1
- package/dist/navigation/index.d.ts +1 -1
- package/dist/navigation/index.d.ts.map +1 -1
- package/dist/navigation/index.js +1 -1
- package/dist/navigation/index.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/types.d.ts +4 -1
- package/dist/notifications/types.d.ts.map +1 -1
- package/dist/notifications/types.js.map +1 -1
- package/dist/resources/handlers.d.ts +5 -0
- package/dist/resources/handlers.d.ts.map +1 -1
- package/dist/resources/handlers.js +9 -8
- package/dist/resources/handlers.js.map +1 -1
- 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/poll.d.ts +12 -4
- package/dist/server/poll.d.ts.map +1 -1
- package/dist/server/poll.js +236 -9
- package/dist/server/poll.js.map +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/styles/agent-native.css +27 -0
- package/dist/templates/default/.agents/skills/actions/SKILL.md +5 -0
- package/dist/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/dist/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/dist/templates/default/.agents/skills/security/SKILL.md +7 -0
- package/dist/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/dist/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
- package/dist/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/dist/templates/default/AGENTS.md +14 -5
- package/dist/templates/default/package.json +2 -1
- package/dist/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/dist/templates/headless/AGENTS.md +13 -3
- package/dist/templates/headless/package.json +1 -0
- package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
- package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/dist/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
- package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
- package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
- package/dist/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
- package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/dist/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
- package/dist/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/dist/templates/workspace-core/AGENTS.md +7 -1
- package/dist/templates/workspace-root/AGENTS.md +17 -5
- package/dist/templates/workspace-root/package.json +1 -0
- package/docs/content/faq.mdx +17 -0
- package/docs/content/notifications.mdx +12 -6
- package/package.json +2 -2
- package/src/templates/default/.agents/skills/actions/SKILL.md +5 -0
- package/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/src/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/src/templates/default/.agents/skills/security/SKILL.md +7 -0
- package/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/src/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
- package/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/src/templates/default/AGENTS.md +14 -5
- package/src/templates/default/package.json +2 -1
- package/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/src/templates/headless/AGENTS.md +13 -3
- package/src/templates/headless/package.json +1 -0
- package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
- package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
- package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
- package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
- package/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/src/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
- package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
- package/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/src/templates/workspace-core/AGENTS.md +7 -1
- package/src/templates/workspace-root/AGENTS.md +17 -5
- package/src/templates/workspace-root/package.json +1 -0
- package/corpus/templates/analytics/changelog/2026-07-08-session-replay-clamps-ultra-wide-viewports-while-keeping-the.md +0 -6
|
@@ -29,9 +29,11 @@ export default defineAction({
|
|
|
29
29
|
.optional()
|
|
30
30
|
.describe("Session recording id to open (used with view=sessions)"),
|
|
31
31
|
agentsView: z
|
|
32
|
-
.enum(["monitoring", "database"])
|
|
32
|
+
.enum(["monitoring", "dashboards", "database"])
|
|
33
33
|
.optional()
|
|
34
|
-
.describe(
|
|
34
|
+
.describe(
|
|
35
|
+
"Admin subview to open (monitoring, dashboard usage, or app databases)",
|
|
36
|
+
),
|
|
35
37
|
dbAdminConnectionId: z
|
|
36
38
|
.string()
|
|
37
39
|
.optional()
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { defineAction } from "@agent-native/core";
|
|
2
|
+
import {
|
|
3
|
+
getRequestOrgId,
|
|
4
|
+
getRequestUserEmail,
|
|
5
|
+
} from "@agent-native/core/server";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
|
|
8
|
+
import { restoreAnalysisRevision } from "../server/lib/dashboards-store";
|
|
9
|
+
|
|
10
|
+
function resolveScope() {
|
|
11
|
+
const orgId = getRequestOrgId() || null;
|
|
12
|
+
const email = getRequestUserEmail();
|
|
13
|
+
if (!email) throw new Error("no authenticated user");
|
|
14
|
+
return { orgId, email };
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export default defineAction({
|
|
18
|
+
description:
|
|
19
|
+
"Restore an ad-hoc analysis to a saved history revision, snapshotting the current analysis first.",
|
|
20
|
+
schema: z.object({
|
|
21
|
+
analysisId: z.string().describe("Analysis id to restore"),
|
|
22
|
+
revisionId: z.string().describe("Revision id to restore"),
|
|
23
|
+
}),
|
|
24
|
+
http: { method: "POST" },
|
|
25
|
+
run: async (args) => {
|
|
26
|
+
const analysis = await restoreAnalysisRevision(
|
|
27
|
+
args.analysisId,
|
|
28
|
+
args.revisionId,
|
|
29
|
+
resolveScope(),
|
|
30
|
+
);
|
|
31
|
+
if (!analysis) {
|
|
32
|
+
throw new Error(
|
|
33
|
+
`Analysis revision "${args.revisionId}" was not found for analysis "${args.analysisId}".`,
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
id: analysis.id,
|
|
38
|
+
name: analysis.name,
|
|
39
|
+
updatedAt: analysis.updatedAt,
|
|
40
|
+
message: `Restored analysis "${analysis.name}" from history.`,
|
|
41
|
+
};
|
|
42
|
+
},
|
|
43
|
+
});
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { defineAction } from "@agent-native/core";
|
|
2
|
+
import {
|
|
3
|
+
applyText,
|
|
4
|
+
hasCollabState,
|
|
5
|
+
seedFromText,
|
|
6
|
+
} from "@agent-native/core/collab";
|
|
7
|
+
import {
|
|
8
|
+
getRequestOrgId,
|
|
9
|
+
getRequestUserEmail,
|
|
10
|
+
} from "@agent-native/core/server";
|
|
11
|
+
import { z } from "zod";
|
|
12
|
+
|
|
13
|
+
import { restoreDashboardRevision } from "../server/lib/dashboards-store";
|
|
14
|
+
|
|
15
|
+
function resolveScope() {
|
|
16
|
+
const orgId = getRequestOrgId() || null;
|
|
17
|
+
const email = getRequestUserEmail();
|
|
18
|
+
if (!email) throw new Error("no authenticated user");
|
|
19
|
+
return { orgId, email };
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
async function syncToCollab(
|
|
23
|
+
dashboardId: string,
|
|
24
|
+
config: Record<string, unknown>,
|
|
25
|
+
): Promise<void> {
|
|
26
|
+
const docId = `dash-${dashboardId}`;
|
|
27
|
+
const configStr = JSON.stringify(config);
|
|
28
|
+
try {
|
|
29
|
+
const exists = await hasCollabState(docId);
|
|
30
|
+
if (exists) {
|
|
31
|
+
await applyText(docId, configStr, "content", "agent");
|
|
32
|
+
} else {
|
|
33
|
+
await seedFromText(docId, configStr);
|
|
34
|
+
}
|
|
35
|
+
} catch {
|
|
36
|
+
// SQL is the source of truth; open editors also refetch on the dashboards signal.
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export default defineAction({
|
|
41
|
+
description:
|
|
42
|
+
"Restore a dashboard to a saved history revision, snapshotting the current dashboard first.",
|
|
43
|
+
schema: z.object({
|
|
44
|
+
dashboardId: z.string().describe("Dashboard id to restore"),
|
|
45
|
+
revisionId: z.string().describe("Revision id to restore"),
|
|
46
|
+
}),
|
|
47
|
+
http: { method: "POST" },
|
|
48
|
+
run: async (args) => {
|
|
49
|
+
const dashboard = await restoreDashboardRevision(
|
|
50
|
+
args.dashboardId,
|
|
51
|
+
args.revisionId,
|
|
52
|
+
resolveScope(),
|
|
53
|
+
);
|
|
54
|
+
if (!dashboard) {
|
|
55
|
+
throw new Error(
|
|
56
|
+
`Dashboard revision "${args.revisionId}" was not found for dashboard "${args.dashboardId}".`,
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
await syncToCollab(dashboard.id, dashboard.config);
|
|
60
|
+
return {
|
|
61
|
+
id: dashboard.id,
|
|
62
|
+
kind: dashboard.kind,
|
|
63
|
+
name: dashboard.title,
|
|
64
|
+
updatedAt: dashboard.updatedAt,
|
|
65
|
+
message: `Restored dashboard "${dashboard.title}" from history.`,
|
|
66
|
+
};
|
|
67
|
+
},
|
|
68
|
+
});
|
|
@@ -57,6 +57,20 @@ export default defineAction({
|
|
|
57
57
|
.array(z.string().email())
|
|
58
58
|
.optional()
|
|
59
59
|
.describe("Email recipients passed to the generic email channel."),
|
|
60
|
+
slackWebhookUrl: z
|
|
61
|
+
.string()
|
|
62
|
+
.optional()
|
|
63
|
+
.nullable()
|
|
64
|
+
.describe(
|
|
65
|
+
"Optional Slack incoming webhook URL for this alert rule. Overrides NOTIFICATIONS_SLACK_WEBHOOK_URL when set.",
|
|
66
|
+
),
|
|
67
|
+
webhookUrl: z
|
|
68
|
+
.string()
|
|
69
|
+
.optional()
|
|
70
|
+
.nullable()
|
|
71
|
+
.describe(
|
|
72
|
+
"Optional generic webhook URL for this alert rule. Overrides NOTIFICATIONS_WEBHOOK_URL when set.",
|
|
73
|
+
),
|
|
60
74
|
enabled: z.boolean().optional(),
|
|
61
75
|
}),
|
|
62
76
|
http: { method: "POST" },
|
|
@@ -101,7 +101,7 @@ export default defineAction({
|
|
|
101
101
|
.min(1000)
|
|
102
102
|
.max(120000)
|
|
103
103
|
.optional()
|
|
104
|
-
.describe("Request timeout in milliseconds (default
|
|
104
|
+
.describe("Request timeout in milliseconds (default 10000)."),
|
|
105
105
|
expectedStatus: statusMatcherSchema.optional(),
|
|
106
106
|
assertions: z
|
|
107
107
|
.array(assertionSchema)
|
|
@@ -123,6 +123,20 @@ export default defineAction({
|
|
|
123
123
|
.array(z.string().email())
|
|
124
124
|
.optional()
|
|
125
125
|
.describe("Email recipients used by the email channel."),
|
|
126
|
+
slackWebhookUrl: z
|
|
127
|
+
.string()
|
|
128
|
+
.nullable()
|
|
129
|
+
.optional()
|
|
130
|
+
.describe(
|
|
131
|
+
"Optional Slack incoming webhook URL for this monitor. Overrides NOTIFICATIONS_SLACK_WEBHOOK_URL when set.",
|
|
132
|
+
),
|
|
133
|
+
webhookUrl: z
|
|
134
|
+
.string()
|
|
135
|
+
.nullable()
|
|
136
|
+
.optional()
|
|
137
|
+
.describe(
|
|
138
|
+
"Optional generic webhook URL for this monitor. Overrides NOTIFICATIONS_WEBHOOK_URL when set.",
|
|
139
|
+
),
|
|
126
140
|
cooldownMinutes: z
|
|
127
141
|
.number()
|
|
128
142
|
.int()
|
|
@@ -42,10 +42,12 @@ export default defineAction({
|
|
|
42
42
|
search?: string;
|
|
43
43
|
searchParams?: Record<string, string>;
|
|
44
44
|
} | null;
|
|
45
|
+
const selectedObject = await readAppState("selected-object");
|
|
45
46
|
|
|
46
47
|
const screen: Record<string, unknown> = {};
|
|
47
48
|
if (navigation) screen.navigation = navigation;
|
|
48
49
|
if (url?.pathname) screen.pathname = url.pathname;
|
|
50
|
+
if (selectedObject) screen.selectedObject = selectedObject;
|
|
49
51
|
|
|
50
52
|
// Surface the active URL filter params (f_*) so the agent doesn't have
|
|
51
53
|
// to reason about the URL string or go hunting in settings for them.
|
|
@@ -219,6 +221,7 @@ export default defineAction({
|
|
|
219
221
|
lastSeenAt: issue.lastSeenAt,
|
|
220
222
|
eventCount: issue.eventCount,
|
|
221
223
|
usersAffected: issue.usersAffected,
|
|
224
|
+
recentFrequency: issue.sparkline,
|
|
222
225
|
assignee: issue.assignee,
|
|
223
226
|
app: issue.app,
|
|
224
227
|
template: issue.template,
|
|
@@ -231,6 +234,10 @@ export default defineAction({
|
|
|
231
234
|
url: sample.url,
|
|
232
235
|
occurredAt: sample.occurredAt,
|
|
233
236
|
sessionRecordingPath: sample.sessionRecordingPath,
|
|
237
|
+
stack: sample.stack.slice(0, 8),
|
|
238
|
+
rawStackPreview: sample.rawStack
|
|
239
|
+
? sample.rawStack.split("\n").slice(0, 8).join("\n")
|
|
240
|
+
: null,
|
|
234
241
|
}
|
|
235
242
|
: null,
|
|
236
243
|
linkedSessions: detail.sessions.slice(0, 5),
|
|
@@ -425,6 +432,20 @@ export default defineAction({
|
|
|
425
432
|
"feedback",
|
|
426
433
|
],
|
|
427
434
|
},
|
|
435
|
+
{
|
|
436
|
+
id: "dashboards",
|
|
437
|
+
label: "Dashboard Usage",
|
|
438
|
+
path: "/agents?view=dashboards",
|
|
439
|
+
adminOnly: true,
|
|
440
|
+
action: "list-dashboard-usage-stats",
|
|
441
|
+
includes: [
|
|
442
|
+
"dashboard created and modified dates",
|
|
443
|
+
"last tracked modifier",
|
|
444
|
+
"view and engagement counts",
|
|
445
|
+
"saved view counts",
|
|
446
|
+
"hidden and archived state",
|
|
447
|
+
],
|
|
448
|
+
},
|
|
428
449
|
{
|
|
429
450
|
id: "database",
|
|
430
451
|
label: "App Databases",
|
|
@@ -439,6 +460,9 @@ export default defineAction({
|
|
|
439
460
|
],
|
|
440
461
|
},
|
|
441
462
|
];
|
|
463
|
+
if (screen.agentsView === "dashboards") {
|
|
464
|
+
screen.dashboardUsageStatsAction = "list-dashboard-usage-stats";
|
|
465
|
+
}
|
|
442
466
|
const email = getRequestUserEmail();
|
|
443
467
|
if (email) {
|
|
444
468
|
const orgId = getRequestOrgId() || null;
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { useT } from "@agent-native/core/client";
|
|
2
|
+
import { IconHistory, IconLoader2, IconRotate } from "@tabler/icons-react";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { toast } from "sonner";
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
AlertDialog,
|
|
8
|
+
AlertDialogAction,
|
|
9
|
+
AlertDialogCancel,
|
|
10
|
+
AlertDialogContent,
|
|
11
|
+
AlertDialogDescription,
|
|
12
|
+
AlertDialogFooter,
|
|
13
|
+
AlertDialogHeader,
|
|
14
|
+
AlertDialogTitle,
|
|
15
|
+
} from "@/components/ui/alert-dialog";
|
|
16
|
+
import { Button } from "@/components/ui/button";
|
|
17
|
+
import {
|
|
18
|
+
Sheet,
|
|
19
|
+
SheetContent,
|
|
20
|
+
SheetDescription,
|
|
21
|
+
SheetHeader,
|
|
22
|
+
SheetTitle,
|
|
23
|
+
} from "@/components/ui/sheet";
|
|
24
|
+
import {
|
|
25
|
+
type AnalysisRevision,
|
|
26
|
+
useAnalysisRevisions,
|
|
27
|
+
useRestoreAnalysisRevision,
|
|
28
|
+
} from "@/hooks/use-analysis-revisions";
|
|
29
|
+
|
|
30
|
+
function formatRelativeTime(dateStr: string): string {
|
|
31
|
+
const then = new Date(dateStr).getTime();
|
|
32
|
+
if (!Number.isFinite(then)) return dateStr;
|
|
33
|
+
const diffMs = Date.now() - then;
|
|
34
|
+
const diffMin = Math.floor(diffMs / 60_000);
|
|
35
|
+
const diffHr = Math.floor(diffMs / 3_600_000);
|
|
36
|
+
const diffDay = Math.floor(diffMs / 86_400_000);
|
|
37
|
+
|
|
38
|
+
if (diffMin < 1) return "Just now";
|
|
39
|
+
if (diffMin < 60) return `${diffMin}m ago`;
|
|
40
|
+
if (diffHr < 24) return `${diffHr}h ago`;
|
|
41
|
+
if (diffDay < 7) return `${diffDay}d ago`;
|
|
42
|
+
return new Date(dateStr).toLocaleDateString();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function AnalysisHistoryPanel({
|
|
46
|
+
analysisId,
|
|
47
|
+
open,
|
|
48
|
+
onOpenChange,
|
|
49
|
+
canRestore = true,
|
|
50
|
+
}: {
|
|
51
|
+
analysisId: string;
|
|
52
|
+
open: boolean;
|
|
53
|
+
onOpenChange: (open: boolean) => void;
|
|
54
|
+
canRestore?: boolean;
|
|
55
|
+
}) {
|
|
56
|
+
const t = useT();
|
|
57
|
+
const { data: revisions, isLoading } = useAnalysisRevisions(
|
|
58
|
+
open ? analysisId : null,
|
|
59
|
+
);
|
|
60
|
+
const restoreRevision = useRestoreAnalysisRevision(analysisId);
|
|
61
|
+
const [pendingRestore, setPendingRestore] = useState<AnalysisRevision | null>(
|
|
62
|
+
null,
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
const doRestore = async (revision: AnalysisRevision) => {
|
|
66
|
+
try {
|
|
67
|
+
await restoreRevision.mutateAsync({
|
|
68
|
+
analysisId,
|
|
69
|
+
revisionId: revision.id,
|
|
70
|
+
});
|
|
71
|
+
toast.success(t("analyses.historyRestored"));
|
|
72
|
+
setPendingRestore(null);
|
|
73
|
+
onOpenChange(false);
|
|
74
|
+
} catch {
|
|
75
|
+
toast.error(t("analyses.historyRestoreFailed"));
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
return (
|
|
80
|
+
<>
|
|
81
|
+
<Sheet open={open} onOpenChange={onOpenChange}>
|
|
82
|
+
<SheetContent side="right" className="w-[85vw] max-w-[420px] p-0">
|
|
83
|
+
<SheetHeader className="px-4 pb-0 pt-4">
|
|
84
|
+
<SheetTitle className="flex items-center gap-2 text-sm font-medium">
|
|
85
|
+
<IconHistory size={16} />
|
|
86
|
+
{t("analyses.historyTitle")}
|
|
87
|
+
</SheetTitle>
|
|
88
|
+
<SheetDescription>
|
|
89
|
+
{t("analyses.historyDescription")}
|
|
90
|
+
</SheetDescription>
|
|
91
|
+
</SheetHeader>
|
|
92
|
+
<div className="mt-3 border-t border-border" />
|
|
93
|
+
<div className="h-[calc(100%-96px)] overflow-y-auto p-2">
|
|
94
|
+
{isLoading ? (
|
|
95
|
+
<div className="flex items-center justify-center py-12">
|
|
96
|
+
<IconLoader2
|
|
97
|
+
size={16}
|
|
98
|
+
className="animate-spin text-muted-foreground"
|
|
99
|
+
/>
|
|
100
|
+
</div>
|
|
101
|
+
) : !revisions?.length ? (
|
|
102
|
+
<div className="px-6 py-12 text-center text-xs text-muted-foreground">
|
|
103
|
+
{t("analyses.historyEmpty")}
|
|
104
|
+
</div>
|
|
105
|
+
) : (
|
|
106
|
+
<div className="space-y-1">
|
|
107
|
+
{revisions.map((revision) => (
|
|
108
|
+
<div
|
|
109
|
+
key={revision.id}
|
|
110
|
+
className="rounded-lg border border-border bg-card p-3"
|
|
111
|
+
>
|
|
112
|
+
<div className="flex items-start justify-between gap-3">
|
|
113
|
+
<div className="min-w-0">
|
|
114
|
+
<p className="truncate text-xs font-medium">
|
|
115
|
+
{revision.name || t("common.untitledAnalysis")}
|
|
116
|
+
</p>
|
|
117
|
+
<p className="mt-0.5 text-[10px] text-muted-foreground">
|
|
118
|
+
{formatRelativeTime(revision.createdAt)}
|
|
119
|
+
{revision.createdBy
|
|
120
|
+
? ` by ${revision.createdBy}`
|
|
121
|
+
: ""}
|
|
122
|
+
</p>
|
|
123
|
+
</div>
|
|
124
|
+
{canRestore ? (
|
|
125
|
+
<Button
|
|
126
|
+
type="button"
|
|
127
|
+
size="sm"
|
|
128
|
+
variant="outline"
|
|
129
|
+
className="h-7 shrink-0 px-2 text-[11px]"
|
|
130
|
+
onClick={() => setPendingRestore(revision)}
|
|
131
|
+
disabled={restoreRevision.isPending}
|
|
132
|
+
>
|
|
133
|
+
{restoreRevision.isPending ? (
|
|
134
|
+
<IconLoader2 size={13} className="animate-spin" />
|
|
135
|
+
) : (
|
|
136
|
+
<IconRotate size={13} />
|
|
137
|
+
)}
|
|
138
|
+
<span className="ml-1">
|
|
139
|
+
{t("analyses.historyRestore")}
|
|
140
|
+
</span>
|
|
141
|
+
</Button>
|
|
142
|
+
) : null}
|
|
143
|
+
</div>
|
|
144
|
+
</div>
|
|
145
|
+
))}
|
|
146
|
+
</div>
|
|
147
|
+
)}
|
|
148
|
+
</div>
|
|
149
|
+
</SheetContent>
|
|
150
|
+
</Sheet>
|
|
151
|
+
|
|
152
|
+
<AlertDialog
|
|
153
|
+
open={pendingRestore !== null}
|
|
154
|
+
onOpenChange={(nextOpen) => {
|
|
155
|
+
if (!nextOpen) setPendingRestore(null);
|
|
156
|
+
}}
|
|
157
|
+
>
|
|
158
|
+
<AlertDialogContent>
|
|
159
|
+
<AlertDialogHeader>
|
|
160
|
+
<AlertDialogTitle>
|
|
161
|
+
{t("analyses.historyRestoreQuestion")}
|
|
162
|
+
</AlertDialogTitle>
|
|
163
|
+
<AlertDialogDescription>
|
|
164
|
+
{t("analyses.historyRestoreWarning")}
|
|
165
|
+
</AlertDialogDescription>
|
|
166
|
+
</AlertDialogHeader>
|
|
167
|
+
<AlertDialogFooter>
|
|
168
|
+
<AlertDialogCancel>{t("common.cancel")}</AlertDialogCancel>
|
|
169
|
+
<AlertDialogAction
|
|
170
|
+
onClick={() => {
|
|
171
|
+
if (pendingRestore) void doRestore(pendingRestore);
|
|
172
|
+
}}
|
|
173
|
+
>
|
|
174
|
+
{t("analyses.historyRestore")}
|
|
175
|
+
</AlertDialogAction>
|
|
176
|
+
</AlertDialogFooter>
|
|
177
|
+
</AlertDialogContent>
|
|
178
|
+
</AlertDialog>
|
|
179
|
+
</>
|
|
180
|
+
);
|
|
181
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { useT } from "@agent-native/core/client";
|
|
2
|
+
import { IconHistory, IconLoader2, IconRotate } from "@tabler/icons-react";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { toast } from "sonner";
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
AlertDialog,
|
|
8
|
+
AlertDialogAction,
|
|
9
|
+
AlertDialogCancel,
|
|
10
|
+
AlertDialogContent,
|
|
11
|
+
AlertDialogDescription,
|
|
12
|
+
AlertDialogFooter,
|
|
13
|
+
AlertDialogHeader,
|
|
14
|
+
AlertDialogTitle,
|
|
15
|
+
} from "@/components/ui/alert-dialog";
|
|
16
|
+
import { Button } from "@/components/ui/button";
|
|
17
|
+
import {
|
|
18
|
+
Sheet,
|
|
19
|
+
SheetContent,
|
|
20
|
+
SheetDescription,
|
|
21
|
+
SheetHeader,
|
|
22
|
+
SheetTitle,
|
|
23
|
+
} from "@/components/ui/sheet";
|
|
24
|
+
import {
|
|
25
|
+
type DashboardRevision,
|
|
26
|
+
useDashboardRevisions,
|
|
27
|
+
useRestoreDashboardRevision,
|
|
28
|
+
} from "@/hooks/use-dashboard-revisions";
|
|
29
|
+
|
|
30
|
+
function formatRelativeTime(dateStr: string): string {
|
|
31
|
+
const then = new Date(dateStr).getTime();
|
|
32
|
+
if (!Number.isFinite(then)) return dateStr;
|
|
33
|
+
const diffMs = Date.now() - then;
|
|
34
|
+
const diffMin = Math.floor(diffMs / 60_000);
|
|
35
|
+
const diffHr = Math.floor(diffMs / 3_600_000);
|
|
36
|
+
const diffDay = Math.floor(diffMs / 86_400_000);
|
|
37
|
+
|
|
38
|
+
if (diffMin < 1) return "Just now";
|
|
39
|
+
if (diffMin < 60) return `${diffMin}m ago`;
|
|
40
|
+
if (diffHr < 24) return `${diffHr}h ago`;
|
|
41
|
+
if (diffDay < 7) return `${diffDay}d ago`;
|
|
42
|
+
return new Date(dateStr).toLocaleDateString();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
interface DashboardHistoryPanelProps {
|
|
46
|
+
dashboardId: string;
|
|
47
|
+
open: boolean;
|
|
48
|
+
onOpenChange: (open: boolean) => void;
|
|
49
|
+
canRestore?: boolean;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function DashboardHistoryPanel({
|
|
53
|
+
dashboardId,
|
|
54
|
+
open,
|
|
55
|
+
onOpenChange,
|
|
56
|
+
canRestore = true,
|
|
57
|
+
}: DashboardHistoryPanelProps) {
|
|
58
|
+
const t = useT();
|
|
59
|
+
const { data: revisions, isLoading } = useDashboardRevisions(
|
|
60
|
+
open ? dashboardId : null,
|
|
61
|
+
);
|
|
62
|
+
const restoreRevision = useRestoreDashboardRevision(dashboardId);
|
|
63
|
+
const [pendingRestore, setPendingRestore] =
|
|
64
|
+
useState<DashboardRevision | null>(null);
|
|
65
|
+
|
|
66
|
+
const doRestore = async (revision: DashboardRevision) => {
|
|
67
|
+
try {
|
|
68
|
+
await restoreRevision.mutateAsync({
|
|
69
|
+
dashboardId,
|
|
70
|
+
revisionId: revision.id,
|
|
71
|
+
});
|
|
72
|
+
toast.success(t("dashboard.historyRestored"));
|
|
73
|
+
setPendingRestore(null);
|
|
74
|
+
onOpenChange(false);
|
|
75
|
+
} catch {
|
|
76
|
+
toast.error(t("dashboard.historyRestoreFailed"));
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
return (
|
|
81
|
+
<>
|
|
82
|
+
<Sheet open={open} onOpenChange={onOpenChange}>
|
|
83
|
+
<SheetContent side="right" className="w-[85vw] max-w-[420px] p-0">
|
|
84
|
+
<SheetHeader className="px-4 pb-0 pt-4">
|
|
85
|
+
<SheetTitle className="flex items-center gap-2 text-sm font-medium">
|
|
86
|
+
<IconHistory size={16} />
|
|
87
|
+
{t("dashboard.historyTitle")}
|
|
88
|
+
</SheetTitle>
|
|
89
|
+
<SheetDescription>
|
|
90
|
+
{t("dashboard.historyDescription")}
|
|
91
|
+
</SheetDescription>
|
|
92
|
+
</SheetHeader>
|
|
93
|
+
|
|
94
|
+
<div className="mt-3 border-t border-border" />
|
|
95
|
+
|
|
96
|
+
<div className="h-[calc(100%-96px)] overflow-y-auto p-2">
|
|
97
|
+
{isLoading ? (
|
|
98
|
+
<div className="flex items-center justify-center py-12">
|
|
99
|
+
<IconLoader2
|
|
100
|
+
size={16}
|
|
101
|
+
className="animate-spin text-muted-foreground"
|
|
102
|
+
/>
|
|
103
|
+
</div>
|
|
104
|
+
) : !revisions?.length ? (
|
|
105
|
+
<div className="px-6 py-12 text-center text-xs text-muted-foreground">
|
|
106
|
+
{t("dashboard.historyEmpty")}
|
|
107
|
+
</div>
|
|
108
|
+
) : (
|
|
109
|
+
<div className="space-y-1">
|
|
110
|
+
{revisions.map((revision) => (
|
|
111
|
+
<div
|
|
112
|
+
key={revision.id}
|
|
113
|
+
className="rounded-lg border border-border bg-card p-3"
|
|
114
|
+
>
|
|
115
|
+
<div className="flex items-start justify-between gap-3">
|
|
116
|
+
<div className="min-w-0">
|
|
117
|
+
<p className="truncate text-xs font-medium">
|
|
118
|
+
{revision.title || t("common.untitledDashboard")}
|
|
119
|
+
</p>
|
|
120
|
+
<p className="mt-0.5 text-[10px] text-muted-foreground">
|
|
121
|
+
{formatRelativeTime(revision.createdAt)}
|
|
122
|
+
{revision.createdBy
|
|
123
|
+
? ` by ${revision.createdBy}`
|
|
124
|
+
: ""}
|
|
125
|
+
</p>
|
|
126
|
+
</div>
|
|
127
|
+
{canRestore ? (
|
|
128
|
+
<Button
|
|
129
|
+
type="button"
|
|
130
|
+
size="sm"
|
|
131
|
+
variant="outline"
|
|
132
|
+
className="h-7 shrink-0 px-2 text-[11px]"
|
|
133
|
+
onClick={() => setPendingRestore(revision)}
|
|
134
|
+
disabled={restoreRevision.isPending}
|
|
135
|
+
>
|
|
136
|
+
{restoreRevision.isPending ? (
|
|
137
|
+
<IconLoader2 size={13} className="animate-spin" />
|
|
138
|
+
) : (
|
|
139
|
+
<IconRotate size={13} />
|
|
140
|
+
)}
|
|
141
|
+
<span className="ml-1">
|
|
142
|
+
{t("dashboard.historyRestore")}
|
|
143
|
+
</span>
|
|
144
|
+
</Button>
|
|
145
|
+
) : null}
|
|
146
|
+
</div>
|
|
147
|
+
</div>
|
|
148
|
+
))}
|
|
149
|
+
</div>
|
|
150
|
+
)}
|
|
151
|
+
</div>
|
|
152
|
+
</SheetContent>
|
|
153
|
+
</Sheet>
|
|
154
|
+
|
|
155
|
+
<AlertDialog
|
|
156
|
+
open={pendingRestore !== null}
|
|
157
|
+
onOpenChange={(nextOpen) => {
|
|
158
|
+
if (!nextOpen) setPendingRestore(null);
|
|
159
|
+
}}
|
|
160
|
+
>
|
|
161
|
+
<AlertDialogContent>
|
|
162
|
+
<AlertDialogHeader>
|
|
163
|
+
<AlertDialogTitle>
|
|
164
|
+
{t("dashboard.historyRestoreQuestion")}
|
|
165
|
+
</AlertDialogTitle>
|
|
166
|
+
<AlertDialogDescription>
|
|
167
|
+
{t("dashboard.historyRestoreWarning")}
|
|
168
|
+
</AlertDialogDescription>
|
|
169
|
+
</AlertDialogHeader>
|
|
170
|
+
<AlertDialogFooter>
|
|
171
|
+
<AlertDialogCancel>{t("common.cancel")}</AlertDialogCancel>
|
|
172
|
+
<AlertDialogAction
|
|
173
|
+
onClick={() => {
|
|
174
|
+
if (pendingRestore) void doRestore(pendingRestore);
|
|
175
|
+
}}
|
|
176
|
+
>
|
|
177
|
+
{t("dashboard.historyRestore")}
|
|
178
|
+
</AlertDialogAction>
|
|
179
|
+
</AlertDialogFooter>
|
|
180
|
+
</AlertDialogContent>
|
|
181
|
+
</AlertDialog>
|
|
182
|
+
</>
|
|
183
|
+
);
|
|
184
|
+
}
|
|
@@ -27,6 +27,8 @@ import {
|
|
|
27
27
|
import { cn } from "@/lib/utils";
|
|
28
28
|
|
|
29
29
|
const PAGE_SIZE_OPTIONS = [10, 25, 50, 100];
|
|
30
|
+
const TABLE_MIN_HEIGHT_CLASS = "min-h-[386px]";
|
|
31
|
+
const TABLE_SKELETON_ROWS = 10;
|
|
30
32
|
|
|
31
33
|
interface DataTableProps {
|
|
32
34
|
title?: string;
|
|
@@ -109,11 +111,7 @@ export function DataTable({
|
|
|
109
111
|
const content = (
|
|
110
112
|
<>
|
|
111
113
|
{isLoading ? (
|
|
112
|
-
<
|
|
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
|
+
}
|