@agent-native/core 0.90.10 → 0.91.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/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +30 -0
- package/corpus/core/docs/content/toolkit-settings.mdx +56 -3
- package/corpus/core/package.json +2 -1
- package/corpus/core/src/agent/durable-background.ts +5 -5
- package/corpus/core/src/agent/engine/ai-sdk-engine.ts +40 -8
- package/corpus/core/src/agent/engine/anthropic-engine.ts +25 -7
- package/corpus/core/src/agent/engine/output-tokens.ts +94 -0
- package/corpus/core/src/agent/production-agent.ts +34 -6
- package/corpus/core/src/agent/run-ownership.ts +29 -1
- package/corpus/core/src/agent/types.ts +3 -2
- package/corpus/core/src/changelog/parse.ts +78 -0
- package/corpus/core/src/chat-threads/schema.ts +43 -0
- package/corpus/core/src/chat-threads/store.ts +144 -12
- package/corpus/core/src/cli/workspace-dev.ts +25 -5
- package/corpus/core/src/client/AgentPanel.tsx +79 -14
- package/corpus/core/src/client/AssistantChat.tsx +359 -425
- package/corpus/core/src/client/analytics-session.ts +70 -0
- package/corpus/core/src/client/analytics.ts +175 -49
- package/corpus/core/src/client/chat/message-components.tsx +22 -2
- package/corpus/core/src/client/components/ui/message-scroller.tsx +131 -0
- package/corpus/core/src/client/conversation/AgentConversation.tsx +63 -41
- package/corpus/core/src/client/error-capture.ts +616 -0
- package/corpus/core/src/client/index.ts +12 -0
- package/corpus/core/src/client/session-replay.ts +57 -7
- package/corpus/core/src/client/settings/SettingsPanel.tsx +123 -1
- package/corpus/core/src/client/settings/SettingsTabsPage.tsx +292 -45
- package/corpus/core/src/client/settings/index.ts +1 -0
- package/corpus/core/src/client/sharing/ShareButton.tsx +14 -11
- package/corpus/core/src/client/sharing/ShareDialog.tsx +13 -10
- package/corpus/core/src/db/client.ts +12 -9
- package/corpus/core/src/mcp/builtin-tools.ts +29 -2
- package/corpus/core/src/server/agent-chat-plugin.ts +174 -79
- package/corpus/core/src/server/onboarding-html.ts +28 -16
- package/corpus/core/src/shared/reasoning-effort.ts +23 -0
- package/corpus/core/src/sharing/actions/list-resource-shares.ts +45 -1
- package/corpus/core/src/sharing/actions/share-resource.ts +9 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +4 -2
- package/corpus/core/src/templates/workspace-core/.agents/skills/changelog/SKILL.md +9 -6
- package/corpus/core/src/vite/client.ts +217 -35
- package/corpus/templates/analytics/.agents/skills/adhoc-analysis/SKILL.md +8 -7
- package/corpus/templates/analytics/.agents/skills/analysis-workspace/SKILL.md +14 -10
- package/corpus/templates/analytics/.agents/skills/bigquery/SKILL.md +15 -15
- package/corpus/templates/analytics/.agents/skills/cross-source-analysis/SKILL.md +1 -0
- package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +38 -22
- package/corpus/templates/analytics/.agents/skills/data-programs/SKILL.md +114 -61
- package/corpus/templates/analytics/.agents/skills/data-querying/SKILL.md +1 -0
- package/corpus/templates/analytics/.agents/skills/gong/SKILL.md +7 -7
- package/corpus/templates/analytics/.agents/skills/hubspot/SKILL.md +1 -0
- package/corpus/templates/analytics/.agents/skills/prometheus/SKILL.md +1 -1
- package/corpus/templates/analytics/.builder/skills/bigquery/SKILL.md +17 -17
- package/corpus/templates/analytics/.builder/skills/gcloud/SKILL.md +5 -5
- package/corpus/templates/analytics/.builder/skills/github/SKILL.md +7 -7
- package/corpus/templates/analytics/.builder/skills/gong/SKILL.md +12 -12
- package/corpus/templates/analytics/.builder/skills/grafana/SKILL.md +7 -7
- package/corpus/templates/analytics/.builder/skills/sentry/SKILL.md +7 -7
- package/corpus/templates/analytics/.builder/skills/slack/SKILL.md +6 -6
- package/corpus/templates/analytics/.builder/skills/stripe/SKILL.md +7 -7
- package/corpus/templates/analytics/AGENTS.md +47 -2
- package/corpus/templates/analytics/actions/add-status-page-monitor.ts +36 -0
- package/corpus/templates/analytics/actions/capture-test-error.ts +33 -0
- package/corpus/templates/analytics/actions/delete-monitor.ts +24 -0
- package/corpus/templates/analytics/actions/delete-status-page.ts +23 -0
- package/corpus/templates/analytics/actions/get-error-issue.ts +36 -0
- package/corpus/templates/analytics/actions/get-monitor-stats.ts +55 -0
- package/corpus/templates/analytics/actions/get-monitor.ts +27 -0
- package/corpus/templates/analytics/actions/get-public-status-page.ts +41 -0
- package/corpus/templates/analytics/actions/get-status-page.ts +29 -0
- package/corpus/templates/analytics/actions/list-error-issues.ts +40 -0
- package/corpus/templates/analytics/actions/list-monitors.ts +21 -0
- package/corpus/templates/analytics/actions/list-status-pages.ts +21 -0
- package/corpus/templates/analytics/actions/match-error-issues.ts +51 -0
- package/corpus/templates/analytics/actions/navigate.ts +58 -4
- package/corpus/templates/analytics/actions/remove-status-page-monitor.ts +22 -0
- package/corpus/templates/analytics/actions/reorder-status-page-monitors.ts +25 -0
- package/corpus/templates/analytics/actions/resolve-error-issue.ts +38 -0
- package/corpus/templates/analytics/actions/run-monitor-check.ts +23 -0
- package/corpus/templates/analytics/actions/save-analysis.ts +1 -0
- package/corpus/templates/analytics/actions/save-monitor.ts +145 -0
- package/corpus/templates/analytics/actions/save-status-page.ts +47 -0
- package/corpus/templates/analytics/actions/view-screen.ts +212 -0
- package/corpus/templates/analytics/app/components/layout/Header.tsx +1 -0
- package/corpus/templates/analytics/app/components/layout/Layout.tsx +10 -1
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +134 -39
- package/corpus/templates/analytics/app/components/monitoring/PublicStatusView.tsx +351 -0
- package/corpus/templates/analytics/app/components/monitoring/ResponseTimeChart.tsx +174 -0
- package/corpus/templates/analytics/app/components/monitoring/UptimeStatCards.tsx +85 -0
- package/corpus/templates/analytics/app/components/monitoring/UptimeTimelineBars.tsx +106 -0
- package/corpus/templates/analytics/app/components/monitoring/chart-utils.ts +101 -0
- package/corpus/templates/analytics/app/components/monitoring/index.ts +28 -0
- package/corpus/templates/analytics/app/components/monitoring/types.ts +42 -0
- package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +34 -0
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +6 -0
- package/corpus/templates/analytics/app/i18n-data.ts +33 -0
- package/corpus/templates/analytics/app/pages/DataSources.tsx +28 -0
- package/corpus/templates/analytics/app/pages/Settings.tsx +77 -9
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +3 -3
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/dashboard-layout.ts +7 -0
- package/corpus/templates/analytics/app/pages/monitoring/ErrorsPanel.tsx +205 -0
- package/corpus/templates/analytics/app/pages/monitoring/MonitoringPage.tsx +100 -0
- package/corpus/templates/analytics/app/pages/monitoring/UptimePanel.tsx +475 -0
- package/corpus/templates/analytics/app/pages/monitoring/errors/IssueDetail.tsx +372 -0
- package/corpus/templates/analytics/app/pages/monitoring/errors/IssueList.tsx +360 -0
- package/corpus/templates/analytics/app/pages/monitoring/errors/Sparkline.tsx +55 -0
- package/corpus/templates/analytics/app/pages/monitoring/errors/i18n.ts +106 -0
- package/corpus/templates/analytics/app/pages/monitoring/errors/types.ts +75 -0
- package/corpus/templates/analytics/app/pages/monitoring/errors/utils.ts +132 -0
- package/corpus/templates/analytics/app/pages/monitoring/uptime/MonitorDetail.tsx +535 -0
- package/corpus/templates/analytics/app/pages/monitoring/uptime/MonitorFormPage.tsx +1026 -0
- package/corpus/templates/analytics/app/pages/monitoring/uptime/MonitorList.tsx +311 -0
- package/corpus/templates/analytics/app/pages/monitoring/uptime/i18n.ts +235 -0
- package/corpus/templates/analytics/app/pages/monitoring/uptime/status-pages/StatusPageEditor.tsx +661 -0
- package/corpus/templates/analytics/app/pages/monitoring/uptime/status-pages/StatusPagesView.tsx +355 -0
- package/corpus/templates/analytics/app/pages/monitoring/uptime/status-pages/i18n.ts +106 -0
- package/corpus/templates/analytics/app/pages/monitoring/uptime/status-pages/slug.ts +24 -0
- package/corpus/templates/analytics/app/pages/monitoring/uptime/status-pages/types.ts +20 -0
- package/corpus/templates/analytics/app/pages/monitoring/uptime/status-summary.ts +87 -0
- package/corpus/templates/analytics/app/pages/monitoring/uptime/types.ts +161 -0
- package/corpus/templates/analytics/app/pages/monitoring/uptime/utils.ts +210 -0
- package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +76 -1
- package/corpus/templates/analytics/app/pages/sessions/SessionDevToolsPanel.tsx +74 -9
- package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +197 -20
- package/corpus/templates/analytics/app/root.tsx +33 -1
- package/corpus/templates/analytics/app/routes/monitoring._index.tsx +10 -0
- package/corpus/templates/analytics/app/routes/status.$slug.tsx +118 -0
- package/corpus/templates/analytics/changelog/2026-07-08-add-uptime-monitors-that-ping-your-urls-and-alert-you-when-t.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-analytics-chats-keep-large-data-dictionaries-compact-so-prov.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-create-public-status-pages-that-share-the-live-health-of-cho.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-dashboard-extension-panels-use-clearer-open-copy.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-error-capture.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-fixed-single-panel-dashboard-drags-so-they-no-longer-rewrite.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-jump-straight-from-an-error-in-a-session-recording-to-its-fu.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-monitor-detail-and-list-now-show-colorful-uptime-timelines-r.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-pinned-ask-chats-now-show-a-pin-icon-in-the-sidebar.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-publish-a-public-uptime-status-page-with-colorful-uptime-tim.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-sessions-now-hide-visitor-emails-in-demo-mode-and-show-clean.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-settings-are-cleaner-searchable-and-alerts-have-their-own-tab.md +5 -0
- package/corpus/templates/analytics/changelog/2026-07-08-sidebar-sections-stay-collapsed-until-opened.md +5 -0
- package/corpus/templates/analytics/changelog/2026-07-08-the-uptime-monitor-list-now-has-a-current-status-overview-wi.md +6 -0
- package/corpus/templates/analytics/docs/error-capture.md +172 -0
- package/corpus/templates/analytics/docs/uptime-monitoring.md +150 -0
- package/corpus/templates/analytics/server/db/schema-errors.ts +150 -0
- package/corpus/templates/analytics/server/db/schema-monitoring.ts +177 -0
- package/corpus/templates/analytics/server/db/schema.ts +6 -0
- package/corpus/templates/analytics/server/jobs/uptime-monitors.ts +123 -0
- package/corpus/templates/analytics/server/lib/agent-chat-plan-mode.ts +41 -0
- package/corpus/templates/analytics/server/lib/data-dictionary-context.ts +55 -12
- package/corpus/templates/analytics/server/lib/error-capture.ts +1331 -0
- package/corpus/templates/analytics/server/lib/first-party-analytics.ts +47 -1
- package/corpus/templates/analytics/server/lib/monitor-stats.ts +494 -0
- package/corpus/templates/analytics/server/lib/status-pages.ts +798 -0
- package/corpus/templates/analytics/server/lib/uptime-monitors.ts +1665 -0
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +7 -37
- package/corpus/templates/analytics/server/plugins/auth.ts +11 -1
- package/corpus/templates/analytics/server/plugins/db.ts +408 -0
- package/corpus/templates/analytics/server/plugins/uptime-monitor-jobs.ts +63 -0
- package/corpus/templates/assets/app/routes/_index.tsx +1 -1
- package/corpus/templates/assets/app/routes/settings.tsx +22 -1
- package/corpus/templates/assets/changelog/2026-07-08-recent-drafts-keep-comfortable-side-padding.md +6 -0
- package/corpus/templates/assets/changelog/2026-07-08-settings-are-cleaner-and-searchable.md +5 -0
- package/corpus/templates/brain/app/routes/settings.tsx +43 -5
- package/corpus/templates/brain/changelog/2026-07-08-settings-are-cleaner-and-searchable.md +5 -0
- package/corpus/templates/calendar/app/pages/Settings.tsx +44 -6
- package/corpus/templates/calendar/changelog/2026-07-08-settings-are-cleaner-and-searchable.md +5 -0
- package/corpus/templates/chat/app/routes/settings.tsx +16 -1
- package/corpus/templates/chat/changelog/2026-07-08-settings-are-cleaner-and-searchable.md +5 -0
- package/corpus/templates/clips/actions/lib/audio-only-transcription.ts +79 -37
- package/corpus/templates/clips/actions/regenerate-chapters.ts +7 -0
- package/corpus/templates/clips/app/components/player/player-controls.tsx +35 -0
- package/corpus/templates/clips/app/components/player/video-player.tsx +162 -18
- package/corpus/templates/clips/app/hooks/use-auto-title.ts +15 -5
- package/corpus/templates/clips/app/routes/_app.settings._index.tsx +63 -6
- package/corpus/templates/clips/app/routes/download.tsx +12 -4
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +1 -0
- package/corpus/templates/clips/app/routes/record.tsx +18 -1
- package/corpus/templates/clips/changelog/2026-07-07-auto-generated-chapter-requests-now-open-the-matching-agent-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-shared-clips-start-playback-reliably-from-the-first-play-click.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-the-clips-desktop-download-page-now-uses-the-agent-native-ap.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-08-chrome-extension-camera-and-microphone-menus-now-show-which-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-08-chrome-extension-copies-new-clip-links-after-saving.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-08-chrome-extension-recordings-now-continue-after-granting-came.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-08-mobile-shared-clips-now-have-loom-style-tap-and-skip-controls.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-08-recordings-and-uploads-copy-links-after-saving.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-08-settings-are-cleaner-searchable-and-collapse-s3-with-builder.md +5 -0
- package/corpus/templates/clips/changelog/2026-07-08-transcripts-are-more-reliable-for-longer-desktop-recordings-.md +6 -0
- package/corpus/templates/clips/chrome-extension/public/manifest.json +1 -0
- package/corpus/templates/clips/chrome-extension/src/background.ts +162 -13
- package/corpus/templates/clips/chrome-extension/src/content-script.ts +14 -0
- package/corpus/templates/clips/chrome-extension/src/offscreen.ts +36 -0
- package/corpus/templates/clips/chrome-extension/src/overlay.ts +99 -25
- package/corpus/templates/clips/chrome-extension/src/permission.ts +63 -14
- package/corpus/templates/clips/chrome-extension/src/popup.ts +123 -23
- package/corpus/templates/content/actions/_builder-cms-read-client.ts +47 -0
- package/corpus/templates/content/actions/_database-source-utils.ts +33 -4
- package/corpus/templates/content/actions/add-content-database-source-field-property.ts +214 -29
- package/corpus/templates/content/actions/attach-content-database-source.ts +3 -0
- package/corpus/templates/content/actions/change-content-database-source-role.ts +1 -0
- package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +42 -32
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +352 -81
- package/corpus/templates/content/app/components/editor/database/settings.tsx +49 -24
- package/corpus/templates/content/app/routes/_app.settings.tsx +19 -1
- package/corpus/templates/content/changelog/2026-07-07-builder-source-tag-fields-now-import-as-multi-select.md +6 -0
- package/corpus/templates/content/changelog/2026-07-08-settings-are-cleaner-and-searchable.md +5 -0
- package/corpus/templates/content/shared/api.ts +3 -0
- package/corpus/templates/content/shared/properties.ts +42 -0
- package/corpus/templates/design/actions/generate-design.ts +3 -0
- package/corpus/templates/design/actions/get-design-system.ts +147 -1
- package/corpus/templates/design/app/routes/settings.tsx +16 -1
- package/corpus/templates/design/changelog/2026-07-08-design-generation-now-follows-hydrated-builder-design-system.md +6 -0
- package/corpus/templates/design/changelog/2026-07-08-settings-are-cleaner-and-searchable.md +5 -0
- package/corpus/templates/dispatch/app/routes/settings.tsx +23 -2
- package/corpus/templates/dispatch/changelog/2026-07-08-settings-are-cleaner-and-searchable.md +5 -0
- package/corpus/templates/forms/app/routes/_app.settings.tsx +16 -1
- package/corpus/templates/forms/changelog/2026-07-08-settings-are-cleaner-and-searchable.md +5 -0
- package/corpus/templates/macros/app/routes/settings.tsx +16 -1
- package/corpus/templates/macros/changelog/2026-07-08-settings-are-cleaner-and-searchable.md +5 -0
- package/corpus/templates/mail/app/components/settings/GmailFiltersSection.tsx +1 -1
- package/corpus/templates/mail/app/components/settings/SnippetsSection.tsx +1 -1
- package/corpus/templates/mail/app/pages/SettingsPage.tsx +123 -105
- package/corpus/templates/mail/changelog/2026-07-08-settings-redesigned-with-a-consistent-searchable-layout.md +5 -0
- package/corpus/templates/plan/app/routes/settings.tsx +23 -2
- package/corpus/templates/plan/changelog/2026-07-08-settings-are-cleaner-and-searchable.md +5 -0
- package/corpus/templates/slides/actions/add-slide.ts +1 -0
- package/corpus/templates/slides/actions/get-design-system.ts +147 -1
- package/corpus/templates/slides/app/pages/Index.tsx +46 -1
- package/corpus/templates/slides/app/routes/settings.tsx +16 -1
- package/corpus/templates/slides/changelog/2026-07-08-deck-generation-now-follows-hydrated-builder-design-system-g.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-08-settings-are-cleaner-and-searchable.md +5 -0
- package/dist/agent/durable-background.d.ts +1 -1
- package/dist/agent/durable-background.d.ts.map +1 -1
- package/dist/agent/durable-background.js +5 -3
- package/dist/agent/durable-background.js.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.js +24 -4
- package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
- package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
- package/dist/agent/engine/anthropic-engine.js +13 -3
- package/dist/agent/engine/anthropic-engine.js.map +1 -1
- package/dist/agent/engine/output-tokens.d.ts +27 -0
- package/dist/agent/engine/output-tokens.d.ts.map +1 -1
- package/dist/agent/engine/output-tokens.js +70 -0
- package/dist/agent/engine/output-tokens.js.map +1 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +28 -7
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-ownership.d.ts +6 -0
- package/dist/agent/run-ownership.d.ts.map +1 -1
- package/dist/agent/run-ownership.js +11 -1
- package/dist/agent/run-ownership.js.map +1 -1
- package/dist/agent/types.d.ts +3 -2
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/changelog/parse.d.ts +7 -0
- package/dist/changelog/parse.d.ts.map +1 -1
- package/dist/changelog/parse.js +64 -0
- package/dist/changelog/parse.js.map +1 -1
- package/dist/chat-threads/schema.d.ts +445 -0
- package/dist/chat-threads/schema.d.ts.map +1 -0
- package/dist/chat-threads/schema.js +39 -0
- package/dist/chat-threads/schema.js.map +1 -0
- package/dist/chat-threads/store.d.ts +12 -0
- package/dist/chat-threads/store.d.ts.map +1 -1
- package/dist/chat-threads/store.js +99 -10
- package/dist/chat-threads/store.js.map +1 -1
- package/dist/cli/workspace-dev.d.ts.map +1 -1
- package/dist/cli/workspace-dev.js +20 -5
- package/dist/cli/workspace-dev.js.map +1 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +35 -7
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +105 -183
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/analytics-session.d.ts +3 -0
- package/dist/client/analytics-session.d.ts.map +1 -0
- package/dist/client/analytics-session.js +66 -0
- package/dist/client/analytics-session.js.map +1 -0
- package/dist/client/analytics.d.ts +32 -0
- package/dist/client/analytics.d.ts.map +1 -1
- package/dist/client/analytics.js +116 -46
- package/dist/client/analytics.js.map +1 -1
- package/dist/client/chat/message-components.d.ts +2 -1
- package/dist/client/chat/message-components.d.ts.map +1 -1
- package/dist/client/chat/message-components.js +16 -6
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/components/ui/message-scroller.d.ts +16 -0
- package/dist/client/components/ui/message-scroller.d.ts.map +1 -0
- package/dist/client/components/ui/message-scroller.js +25 -0
- package/dist/client/components/ui/message-scroller.js.map +1 -0
- package/dist/client/conversation/AgentConversation.d.ts +1 -1
- package/dist/client/conversation/AgentConversation.d.ts.map +1 -1
- package/dist/client/conversation/AgentConversation.js +3 -8
- package/dist/client/conversation/AgentConversation.js.map +1 -1
- package/dist/client/error-capture.d.ts +99 -0
- package/dist/client/error-capture.d.ts.map +1 -0
- package/dist/client/error-capture.js +437 -0
- package/dist/client/error-capture.js.map +1 -0
- package/dist/client/index.d.ts +2 -2
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +3 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/session-replay.d.ts +22 -0
- package/dist/client/session-replay.d.ts.map +1 -1
- package/dist/client/session-replay.js +45 -4
- 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 +100 -5
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/settings/SettingsTabsPage.d.ts +49 -1
- package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
- package/dist/client/settings/SettingsTabsPage.js +131 -19
- package/dist/client/settings/SettingsTabsPage.js.map +1 -1
- package/dist/client/settings/index.d.ts +1 -1
- package/dist/client/settings/index.d.ts.map +1 -1
- package/dist/client/settings/index.js.map +1 -1
- package/dist/client/sharing/ShareButton.d.ts.map +1 -1
- package/dist/client/sharing/ShareButton.js +13 -8
- package/dist/client/sharing/ShareButton.js.map +1 -1
- package/dist/client/sharing/ShareDialog.d.ts.map +1 -1
- package/dist/client/sharing/ShareDialog.js +12 -7
- package/dist/client/sharing/ShareDialog.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +12 -7
- package/dist/db/client.js.map +1 -1
- package/dist/mcp/builtin-tools.d.ts.map +1 -1
- package/dist/mcp/builtin-tools.js +21 -2
- package/dist/mcp/builtin-tools.js.map +1 -1
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/observability/routes.d.ts +5 -5
- package/dist/org/schema.d.ts +15 -15
- package/dist/progress/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/secrets/routes.d.ts +9 -9
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +109 -73
- 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/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +28 -16
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/shared/reasoning-effort.d.ts +1 -0
- package/dist/shared/reasoning-effort.d.ts.map +1 -1
- package/dist/shared/reasoning-effort.js +18 -0
- package/dist/shared/reasoning-effort.js.map +1 -1
- package/dist/sharing/actions/list-resource-shares.js +30 -1
- package/dist/sharing/actions/list-resource-shares.js.map +1 -1
- package/dist/sharing/actions/share-resource.js +6 -0
- package/dist/sharing/actions/share-resource.js.map +1 -1
- package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +4 -2
- package/dist/templates/workspace-core/.agents/skills/changelog/SKILL.md +9 -6
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +192 -30
- package/dist/vite/client.js.map +1 -1
- package/docs/content/toolkit-settings.mdx +56 -3
- package/package.json +2 -1
- package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +4 -2
- package/src/templates/workspace-core/.agents/skills/changelog/SKILL.md +9 -6
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Monitor list: a "current status" overview summary on top, then one row per
|
|
3
|
+
* monitor with status, a compact colorful 90-day uptime bar, latency, uptime,
|
|
4
|
+
* last-checked, an enable/disable switch, and a run-now action. Rows select into
|
|
5
|
+
* the detail view. Includes loading + empty states.
|
|
6
|
+
*/
|
|
7
|
+
import {
|
|
8
|
+
IconChevronRight,
|
|
9
|
+
IconLoader2,
|
|
10
|
+
IconPlayerPlay,
|
|
11
|
+
IconPlus,
|
|
12
|
+
IconWorldPin,
|
|
13
|
+
} from "@tabler/icons-react";
|
|
14
|
+
|
|
15
|
+
import { UptimeTimelineBars } from "@/components/monitoring";
|
|
16
|
+
import { Button } from "@/components/ui/button";
|
|
17
|
+
import { Skeleton } from "@/components/ui/skeleton";
|
|
18
|
+
import { Switch } from "@/components/ui/switch";
|
|
19
|
+
import {
|
|
20
|
+
Tooltip,
|
|
21
|
+
TooltipContent,
|
|
22
|
+
TooltipTrigger,
|
|
23
|
+
} from "@/components/ui/tooltip";
|
|
24
|
+
import { cn } from "@/lib/utils";
|
|
25
|
+
|
|
26
|
+
import { fmt, useUptimeT } from "./i18n";
|
|
27
|
+
import {
|
|
28
|
+
summarizeMonitors,
|
|
29
|
+
type MonitorHealthTone,
|
|
30
|
+
type MonitorStatusSummary,
|
|
31
|
+
} from "./status-summary";
|
|
32
|
+
import type { MonitorStats, MonitorSummary } from "./types";
|
|
33
|
+
import {
|
|
34
|
+
formatLatency,
|
|
35
|
+
formatRelativeTime,
|
|
36
|
+
formatUptime,
|
|
37
|
+
hostFromUrl,
|
|
38
|
+
statusLabel,
|
|
39
|
+
statusTone,
|
|
40
|
+
toneDotClass,
|
|
41
|
+
toneTextClass,
|
|
42
|
+
} from "./utils";
|
|
43
|
+
|
|
44
|
+
export function MonitorList({
|
|
45
|
+
monitors,
|
|
46
|
+
statsById,
|
|
47
|
+
isLoading,
|
|
48
|
+
hasSearch,
|
|
49
|
+
runningId,
|
|
50
|
+
onSelect,
|
|
51
|
+
onToggle,
|
|
52
|
+
onRunCheck,
|
|
53
|
+
onCreate,
|
|
54
|
+
}: {
|
|
55
|
+
monitors: MonitorSummary[];
|
|
56
|
+
statsById?: Map<string, MonitorStats>;
|
|
57
|
+
isLoading: boolean;
|
|
58
|
+
hasSearch: boolean;
|
|
59
|
+
runningId: string | null;
|
|
60
|
+
onSelect: (monitor: MonitorSummary) => void;
|
|
61
|
+
onToggle: (monitor: MonitorSummary, enabled: boolean) => void;
|
|
62
|
+
onRunCheck: (monitor: MonitorSummary) => void;
|
|
63
|
+
onCreate: () => void;
|
|
64
|
+
}) {
|
|
65
|
+
const t = useUptimeT();
|
|
66
|
+
|
|
67
|
+
if (isLoading) {
|
|
68
|
+
return (
|
|
69
|
+
<div className="space-y-2">
|
|
70
|
+
{[0, 1, 2].map((i) => (
|
|
71
|
+
<Skeleton key={i} className="h-16 w-full rounded-lg" />
|
|
72
|
+
))}
|
|
73
|
+
</div>
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (monitors.length === 0) {
|
|
78
|
+
if (hasSearch) {
|
|
79
|
+
return (
|
|
80
|
+
<div className="rounded-lg border border-dashed px-4 py-10 text-center text-sm text-muted-foreground">
|
|
81
|
+
{t.noSearchResults}
|
|
82
|
+
</div>
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
return (
|
|
86
|
+
<div className="flex flex-col items-center justify-center rounded-lg border border-dashed px-6 py-16 text-center">
|
|
87
|
+
<div className="mb-4 flex size-14 items-center justify-center rounded-2xl bg-primary/10">
|
|
88
|
+
<IconWorldPin className="size-7 text-primary" />
|
|
89
|
+
</div>
|
|
90
|
+
<h3 className="text-lg font-semibold">{t.emptyTitle}</h3>
|
|
91
|
+
<p className="mx-auto mt-1.5 max-w-md text-sm text-muted-foreground">
|
|
92
|
+
{t.emptyDescription}
|
|
93
|
+
</p>
|
|
94
|
+
<Button className="mt-5" size="sm" onClick={onCreate}>
|
|
95
|
+
<IconPlus className="size-3.5" />
|
|
96
|
+
{t.emptyCta}
|
|
97
|
+
</Button>
|
|
98
|
+
</div>
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const summary = summarizeMonitors(monitors, statsById);
|
|
103
|
+
|
|
104
|
+
return (
|
|
105
|
+
<div className="space-y-3">
|
|
106
|
+
<StatusOverview summary={summary} />
|
|
107
|
+
|
|
108
|
+
<div className="space-y-2">
|
|
109
|
+
{monitors.map((monitor) => {
|
|
110
|
+
const tone = statusTone(monitor.lastStatus);
|
|
111
|
+
const lastChecked = formatRelativeTime(monitor.lastCheckedAt);
|
|
112
|
+
const isRunning =
|
|
113
|
+
runningId === monitor.id || monitor.lastStatus === "running";
|
|
114
|
+
const timeline = statsById?.get(monitor.id)?.timeline ?? [];
|
|
115
|
+
return (
|
|
116
|
+
<div
|
|
117
|
+
key={monitor.id}
|
|
118
|
+
role="button"
|
|
119
|
+
tabIndex={0}
|
|
120
|
+
onClick={() => onSelect(monitor)}
|
|
121
|
+
onKeyDown={(e) => {
|
|
122
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
123
|
+
e.preventDefault();
|
|
124
|
+
onSelect(monitor);
|
|
125
|
+
}
|
|
126
|
+
}}
|
|
127
|
+
className={cn(
|
|
128
|
+
"group flex cursor-pointer items-center gap-4 rounded-lg border border-border/50 bg-card px-4 py-3 transition-colors hover:border-border hover:bg-muted/30",
|
|
129
|
+
!monitor.enabled && "opacity-60",
|
|
130
|
+
)}
|
|
131
|
+
>
|
|
132
|
+
{/* Status + identity */}
|
|
133
|
+
<div className="flex min-w-0 flex-1 items-center gap-3">
|
|
134
|
+
<span
|
|
135
|
+
className={cn(
|
|
136
|
+
"size-2.5 shrink-0 rounded-full",
|
|
137
|
+
toneDotClass(tone),
|
|
138
|
+
isRunning && "animate-pulse",
|
|
139
|
+
)}
|
|
140
|
+
/>
|
|
141
|
+
<div className="min-w-0">
|
|
142
|
+
<div className="flex items-center gap-2">
|
|
143
|
+
<span className="truncate text-sm font-medium">
|
|
144
|
+
{monitor.name}
|
|
145
|
+
</span>
|
|
146
|
+
<span
|
|
147
|
+
className={cn(
|
|
148
|
+
"shrink-0 text-[11px] font-medium",
|
|
149
|
+
toneTextClass(tone),
|
|
150
|
+
)}
|
|
151
|
+
>
|
|
152
|
+
{statusLabel(monitor.lastStatus, t)}
|
|
153
|
+
</span>
|
|
154
|
+
</div>
|
|
155
|
+
<div className="truncate text-xs text-muted-foreground">
|
|
156
|
+
{hostFromUrl(monitor.url)}
|
|
157
|
+
{lastChecked ? (
|
|
158
|
+
<span className="text-muted-foreground/70">
|
|
159
|
+
{" · "}
|
|
160
|
+
{fmt(t.lastChecked, { time: lastChecked })}
|
|
161
|
+
</span>
|
|
162
|
+
) : null}
|
|
163
|
+
</div>
|
|
164
|
+
</div>
|
|
165
|
+
</div>
|
|
166
|
+
|
|
167
|
+
{/* Compact 90-day uptime bar */}
|
|
168
|
+
<div className="hidden w-40 shrink-0 lg:block">
|
|
169
|
+
<UptimeTimelineBars
|
|
170
|
+
buckets={timeline}
|
|
171
|
+
heightClassName="h-5"
|
|
172
|
+
barRadiusClassName="rounded-[1px]"
|
|
173
|
+
hideWhenEmpty
|
|
174
|
+
ariaLabel={fmt(t.uptimeTimelineAria, { name: monitor.name })}
|
|
175
|
+
/>
|
|
176
|
+
</div>
|
|
177
|
+
|
|
178
|
+
{/* Metrics */}
|
|
179
|
+
<div className="hidden shrink-0 items-center gap-6 sm:flex">
|
|
180
|
+
<Metric
|
|
181
|
+
label={t.latency}
|
|
182
|
+
value={formatLatency(monitor.lastLatencyMs)}
|
|
183
|
+
/>
|
|
184
|
+
<Metric
|
|
185
|
+
label={t.uptime24h}
|
|
186
|
+
value={formatUptime(monitor.uptime24h)}
|
|
187
|
+
/>
|
|
188
|
+
<Metric
|
|
189
|
+
label={t.uptime7d}
|
|
190
|
+
value={formatUptime(monitor.uptime7d)}
|
|
191
|
+
/>
|
|
192
|
+
</div>
|
|
193
|
+
|
|
194
|
+
{/* Actions */}
|
|
195
|
+
<div
|
|
196
|
+
className="flex shrink-0 items-center gap-1.5"
|
|
197
|
+
onClick={(e) => e.stopPropagation()}
|
|
198
|
+
>
|
|
199
|
+
<Tooltip>
|
|
200
|
+
<TooltipTrigger asChild>
|
|
201
|
+
<Button
|
|
202
|
+
variant="ghost"
|
|
203
|
+
size="icon"
|
|
204
|
+
className="size-8 text-muted-foreground"
|
|
205
|
+
onClick={() => onRunCheck(monitor)}
|
|
206
|
+
disabled={isRunning}
|
|
207
|
+
aria-label={t.checkNow}
|
|
208
|
+
>
|
|
209
|
+
{isRunning ? (
|
|
210
|
+
<IconLoader2 className="size-3.5 animate-spin" />
|
|
211
|
+
) : (
|
|
212
|
+
<IconPlayerPlay className="size-3.5" />
|
|
213
|
+
)}
|
|
214
|
+
</Button>
|
|
215
|
+
</TooltipTrigger>
|
|
216
|
+
<TooltipContent>{t.checkNow}</TooltipContent>
|
|
217
|
+
</Tooltip>
|
|
218
|
+
<Switch
|
|
219
|
+
checked={monitor.enabled}
|
|
220
|
+
onCheckedChange={(enabled) => onToggle(monitor, enabled)}
|
|
221
|
+
aria-label={fmt(t.enableLabel, { name: monitor.name })}
|
|
222
|
+
/>
|
|
223
|
+
<IconChevronRight className="size-4 text-muted-foreground/40 group-hover:text-muted-foreground" />
|
|
224
|
+
</div>
|
|
225
|
+
</div>
|
|
226
|
+
);
|
|
227
|
+
})}
|
|
228
|
+
</div>
|
|
229
|
+
</div>
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
const OVERVIEW_DOT: Record<MonitorHealthTone, string> = {
|
|
234
|
+
up: "bg-emerald-500",
|
|
235
|
+
down: "bg-red-500",
|
|
236
|
+
degraded: "bg-amber-500",
|
|
237
|
+
neutral: "bg-muted-foreground/40",
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
function StatusOverview({ summary }: { summary: MonitorStatusSummary }) {
|
|
241
|
+
const t = useUptimeT();
|
|
242
|
+
const headline =
|
|
243
|
+
summary.total === 0
|
|
244
|
+
? t.overviewNone
|
|
245
|
+
: summary.overall === "up"
|
|
246
|
+
? t.overviewOperational
|
|
247
|
+
: summary.overall === "degraded"
|
|
248
|
+
? t.overviewDegraded
|
|
249
|
+
: summary.overall === "down"
|
|
250
|
+
? t.overviewDown
|
|
251
|
+
: t.overviewPending;
|
|
252
|
+
|
|
253
|
+
return (
|
|
254
|
+
<div className="flex flex-wrap items-center gap-x-4 gap-y-2 rounded-lg border border-border/50 bg-card px-4 py-3">
|
|
255
|
+
<div className="flex min-w-0 items-center gap-2">
|
|
256
|
+
<span
|
|
257
|
+
className={cn(
|
|
258
|
+
"size-2.5 shrink-0 rounded-full",
|
|
259
|
+
OVERVIEW_DOT[summary.overall],
|
|
260
|
+
summary.overall === "down" && "animate-pulse",
|
|
261
|
+
)}
|
|
262
|
+
/>
|
|
263
|
+
<span className="truncate text-sm font-medium">{headline}</span>
|
|
264
|
+
<span className="shrink-0 text-xs text-muted-foreground">
|
|
265
|
+
{fmt(
|
|
266
|
+
summary.total === 1 ? t.overviewOneMonitor : t.overviewMonitors,
|
|
267
|
+
{ count: summary.total },
|
|
268
|
+
)}
|
|
269
|
+
</span>
|
|
270
|
+
</div>
|
|
271
|
+
|
|
272
|
+
<div className="ml-auto flex flex-wrap items-center gap-x-3 gap-y-1 text-xs">
|
|
273
|
+
<span className="inline-flex items-center gap-1.5 text-muted-foreground">
|
|
274
|
+
<span className="size-2 rounded-full bg-emerald-500" />
|
|
275
|
+
{fmt(t.upCount, { count: summary.up })}
|
|
276
|
+
</span>
|
|
277
|
+
<span className="inline-flex items-center gap-1.5 text-muted-foreground">
|
|
278
|
+
<span className="size-2 rounded-full bg-amber-500" />
|
|
279
|
+
{fmt(t.degradedCount, { count: summary.degraded })}
|
|
280
|
+
</span>
|
|
281
|
+
<span className="inline-flex items-center gap-1.5 text-muted-foreground">
|
|
282
|
+
<span className="size-2 rounded-full bg-red-500" />
|
|
283
|
+
{fmt(t.downCount, { count: summary.down })}
|
|
284
|
+
</span>
|
|
285
|
+
{summary.overallUptimePct != null ? (
|
|
286
|
+
<span className="tabular-nums text-muted-foreground">
|
|
287
|
+
{fmt(t.overviewUptime24h, {
|
|
288
|
+
pct: formatUptime(summary.overallUptimePct),
|
|
289
|
+
})}
|
|
290
|
+
</span>
|
|
291
|
+
) : null}
|
|
292
|
+
{summary.openIncidents > 0 ? (
|
|
293
|
+
<span className="inline-flex items-center gap-1 font-medium text-red-500">
|
|
294
|
+
{fmt(t.overviewOpenIncidents, { count: summary.openIncidents })}
|
|
295
|
+
</span>
|
|
296
|
+
) : null}
|
|
297
|
+
</div>
|
|
298
|
+
</div>
|
|
299
|
+
);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
function Metric({ label, value }: { label: string; value: string }) {
|
|
303
|
+
return (
|
|
304
|
+
<div className="flex flex-col items-end">
|
|
305
|
+
<span className="text-sm font-medium tabular-nums">{value}</span>
|
|
306
|
+
<span className="text-[10px] uppercase tracking-wide text-muted-foreground">
|
|
307
|
+
{label}
|
|
308
|
+
</span>
|
|
309
|
+
</div>
|
|
310
|
+
);
|
|
311
|
+
}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Self-contained i18n for the uptime monitoring feature. English is the source
|
|
3
|
+
* of truth; other locales fall back to English per key. Do NOT move these into
|
|
4
|
+
* the shared app i18n — this feature owns its copy.
|
|
5
|
+
*/
|
|
6
|
+
import { useLocale } from "@agent-native/core/client";
|
|
7
|
+
|
|
8
|
+
const MESSAGES = {
|
|
9
|
+
"en-US": {
|
|
10
|
+
// Toolbar / list
|
|
11
|
+
searchPlaceholder: "Search monitors…", // i18n-ignore feature-local i18n source
|
|
12
|
+
addMonitor: "Add monitor",
|
|
13
|
+
refresh: "Refresh",
|
|
14
|
+
emptyTitle: "No monitors yet", // i18n-ignore feature-local i18n source
|
|
15
|
+
emptyDescription: // i18n-ignore feature-local i18n source
|
|
16
|
+
"Create a monitor to ping a URL on a schedule and get alerted when it goes down, is too slow, or returns the wrong content.", // i18n-ignore feature-local i18n source
|
|
17
|
+
emptyCta: "Create your first monitor",
|
|
18
|
+
noSearchResults: "No monitors match your search.",
|
|
19
|
+
upCount: "{count} up",
|
|
20
|
+
downCount: "{count} down",
|
|
21
|
+
degradedCount: "{count} degraded",
|
|
22
|
+
checkNow: "Check now",
|
|
23
|
+
lastChecked: "Checked {time}",
|
|
24
|
+
neverChecked: "Never checked",
|
|
25
|
+
latency: "Latency",
|
|
26
|
+
uptime24h: "24h",
|
|
27
|
+
uptime7d: "7d",
|
|
28
|
+
uptime30d: "30d",
|
|
29
|
+
uptime90d: "90d",
|
|
30
|
+
enableLabel: "Toggle {name}",
|
|
31
|
+
ms: "{value} ms",
|
|
32
|
+
// List "current status" overview
|
|
33
|
+
overviewOperational: "All systems operational",
|
|
34
|
+
overviewDegraded: "Some systems degraded",
|
|
35
|
+
overviewDown: "System issues detected",
|
|
36
|
+
overviewPending: "Awaiting first checks",
|
|
37
|
+
overviewNone: "No monitors yet",
|
|
38
|
+
overviewMonitors: "{count} monitors",
|
|
39
|
+
overviewOneMonitor: "1 monitor",
|
|
40
|
+
overviewUptime24h: "{pct} uptime · 24h",
|
|
41
|
+
overviewOpenIncidents: "{count} open",
|
|
42
|
+
statusPagesButton: "Status pages",
|
|
43
|
+
// Status labels
|
|
44
|
+
statusUp: "Up",
|
|
45
|
+
statusDown: "Down",
|
|
46
|
+
statusDegraded: "Degraded",
|
|
47
|
+
statusError: "Error",
|
|
48
|
+
statusRunning: "Checking",
|
|
49
|
+
statusUnknown: "Pending",
|
|
50
|
+
// Detail
|
|
51
|
+
back: "Back to monitors",
|
|
52
|
+
edit: "Edit",
|
|
53
|
+
delete: "Delete",
|
|
54
|
+
open: "Open URL",
|
|
55
|
+
runningCheck: "Running check…",
|
|
56
|
+
detailOverview: "Overview",
|
|
57
|
+
currentStatus: "Current status",
|
|
58
|
+
responseTime: "Response time",
|
|
59
|
+
responseTimeSubtitle: "Average latency with min/max band",
|
|
60
|
+
uptimeTimeline: "Uptime",
|
|
61
|
+
uptimeTimelineSubtitle: "Most recent checks (newest on the right)",
|
|
62
|
+
uptimeTimeline90d: "90-day uptime",
|
|
63
|
+
uptimeTimelineDaily: "One bar per day",
|
|
64
|
+
uptimeTimelineAria: "{name} uptime over the last 90 days",
|
|
65
|
+
timelineNinetyDaysAgo: "90 days ago",
|
|
66
|
+
timelineToday: "Today",
|
|
67
|
+
statIncidents: "Incidents",
|
|
68
|
+
statLast90d: "Last 90 days",
|
|
69
|
+
statMtbf: "MTBF",
|
|
70
|
+
statMtbfHint: "Mean time between failures",
|
|
71
|
+
recentChecks: "Recent checks",
|
|
72
|
+
incidents: "Incidents",
|
|
73
|
+
noIncidents: "No incidents recorded. ",
|
|
74
|
+
noChecks: "No checks recorded yet. Run a check to get started.",
|
|
75
|
+
ongoing: "Ongoing",
|
|
76
|
+
resolved: "Resolved",
|
|
77
|
+
duration: "Duration",
|
|
78
|
+
cause: "Cause",
|
|
79
|
+
started: "Started",
|
|
80
|
+
checksFailedLabel: "{count} failed checks",
|
|
81
|
+
configTitle: "Check configuration",
|
|
82
|
+
configInterval: "Interval",
|
|
83
|
+
configTimeout: "Timeout",
|
|
84
|
+
configMethod: "Method",
|
|
85
|
+
configExpected: "Expected status",
|
|
86
|
+
configAssertions: "Assertions",
|
|
87
|
+
configRedirects: "Follow redirects",
|
|
88
|
+
configChannels: "Alert channels",
|
|
89
|
+
configSeverity: "Severity",
|
|
90
|
+
configCooldown: "Cooldown",
|
|
91
|
+
yes: "Yes",
|
|
92
|
+
no: "No",
|
|
93
|
+
noAssertions: "None",
|
|
94
|
+
// Result table
|
|
95
|
+
colTime: "Time",
|
|
96
|
+
colStatus: "Status",
|
|
97
|
+
colCode: "Code",
|
|
98
|
+
colLatency: "Latency",
|
|
99
|
+
colDetails: "Details",
|
|
100
|
+
ok: "OK",
|
|
101
|
+
// Assertion / matcher summaries
|
|
102
|
+
matcherClass: "{classes} responses",
|
|
103
|
+
matcherList: "Status in {codes}",
|
|
104
|
+
matcherRange: "Status {min}–{max}",
|
|
105
|
+
assertBodyContains: "Body contains “{value}”",
|
|
106
|
+
assertBodyAbsent: "Body must not contain “{value}”",
|
|
107
|
+
assertHeaderContains: "Header {header} contains “{value}”",
|
|
108
|
+
assertHeaderEquals: "Header {header} equals “{value}”",
|
|
109
|
+
assertMaxLatency: "Response under {value} ms",
|
|
110
|
+
// Form page
|
|
111
|
+
formCreateTitle: "New monitor",
|
|
112
|
+
formEditTitle: "Edit monitor",
|
|
113
|
+
formCreateSubtitle:
|
|
114
|
+
"Paste a URL to get started — everything else has smart defaults you can tweak.",
|
|
115
|
+
formEditSubtitle: "Adjust how this monitor checks and who it alerts.",
|
|
116
|
+
sectionResponseChecks: "Response checks",
|
|
117
|
+
sectionResponseChecksHint:
|
|
118
|
+
"Choose which responses count as healthy and add body, header, or latency assertions.",
|
|
119
|
+
sectionAlerting: "Alerting",
|
|
120
|
+
sectionAlertingHint: "Pick the severity and where alerts are delivered.",
|
|
121
|
+
sectionAdvanced: "Advanced",
|
|
122
|
+
sectionAdvancedHint:
|
|
123
|
+
"Request method, timeout, cooldown, redirects, and pause.",
|
|
124
|
+
assertionsCountSummary: "{count} assertions",
|
|
125
|
+
oneAssertionSummary: "1 assertion",
|
|
126
|
+
noAssertionsSummary: "No assertions",
|
|
127
|
+
channelsNoneSummary: "No channels",
|
|
128
|
+
pausedBadge: "Paused",
|
|
129
|
+
fieldName: "Name",
|
|
130
|
+
fieldNamePlaceholder: "Marketing site",
|
|
131
|
+
fieldNameHint: "Optional — defaults to the site's domain.",
|
|
132
|
+
fieldUrl: "URL",
|
|
133
|
+
fieldUrlPlaceholder: "https://example.com/health",
|
|
134
|
+
fieldMethod: "Method",
|
|
135
|
+
fieldInterval: "Check interval",
|
|
136
|
+
fieldTimeout: "Timeout (seconds)",
|
|
137
|
+
fieldExpectedStatus: "Expected status",
|
|
138
|
+
matcherModeClass: "Status class",
|
|
139
|
+
matcherModeList: "Exact codes",
|
|
140
|
+
matcherModeRange: "Range",
|
|
141
|
+
classLabel2xx: "2xx Success",
|
|
142
|
+
classLabel3xx: "3xx Redirect",
|
|
143
|
+
classLabel4xx: "4xx Client error",
|
|
144
|
+
classLabel5xx: "5xx Server error",
|
|
145
|
+
fieldCodes: "Accepted codes",
|
|
146
|
+
fieldCodesPlaceholder: "200, 204",
|
|
147
|
+
fieldRangeMin: "Min",
|
|
148
|
+
fieldRangeMax: "Max",
|
|
149
|
+
fieldAssertions: "Assertions",
|
|
150
|
+
addAssertion: "Add assertion",
|
|
151
|
+
assertionType: "Type",
|
|
152
|
+
assertionValue: "Value",
|
|
153
|
+
assertionHeader: "Header",
|
|
154
|
+
removeAssertion: "Remove assertion",
|
|
155
|
+
assertionsHint:
|
|
156
|
+
"All assertions must pass. Text checks read up to the first 512 KB of the response body.",
|
|
157
|
+
typeBodyContains: "Body contains",
|
|
158
|
+
typeBodyAbsent: "Body absent",
|
|
159
|
+
typeHeaderContains: "Header contains",
|
|
160
|
+
typeHeaderEquals: "Header equals",
|
|
161
|
+
typeMaxLatency: "Max latency (ms)",
|
|
162
|
+
fieldFollowRedirects: "Follow redirects",
|
|
163
|
+
fieldFollowRedirectsHint: "Follow 3xx redirects to allowed hosts.",
|
|
164
|
+
fieldSeverity: "Alert severity",
|
|
165
|
+
severityWarning: "Warning",
|
|
166
|
+
severityCritical: "Critical",
|
|
167
|
+
fieldChannels: "Notify via",
|
|
168
|
+
channelInbox: "Inbox",
|
|
169
|
+
channelEmail: "Email",
|
|
170
|
+
channelSlack: "Slack",
|
|
171
|
+
channelWebhook: "Webhook",
|
|
172
|
+
fieldEmailRecipients: "Email recipients",
|
|
173
|
+
fieldEmailRecipientsPlaceholder: "alerts@example.com, oncall@example.com",
|
|
174
|
+
fieldCooldown: "Alert cooldown (minutes)",
|
|
175
|
+
fieldEnabled: "Enabled",
|
|
176
|
+
fieldEnabledHint: "Run this monitor on its schedule.",
|
|
177
|
+
cancel: "Cancel",
|
|
178
|
+
save: "Save monitor",
|
|
179
|
+
create: "Create monitor",
|
|
180
|
+
saving: "Saving…",
|
|
181
|
+
// Delete dialog
|
|
182
|
+
deleteTitle: "Delete monitor?",
|
|
183
|
+
deleteDescription:
|
|
184
|
+
"This permanently removes “{name}”, its check history, and incident records.",
|
|
185
|
+
deleteConfirm: "Delete",
|
|
186
|
+
// Toasts / validation
|
|
187
|
+
nameRequired: "Give the monitor a name.",
|
|
188
|
+
urlRequired: "Enter an absolute http(s) URL.",
|
|
189
|
+
urlInvalid: "Enter a valid http(s) URL (e.g. https://example.com).",
|
|
190
|
+
channelRequired: "Select at least one alert channel.",
|
|
191
|
+
classRequired: "Select at least one status class.",
|
|
192
|
+
codesRequired: "Enter at least one status code.",
|
|
193
|
+
saved: "Monitor saved.",
|
|
194
|
+
saveFailed: "Could not save monitor: {message}",
|
|
195
|
+
deleted: "Monitor deleted.",
|
|
196
|
+
deleteFailed: "Could not delete monitor: {message}",
|
|
197
|
+
checkStarted: "Running check…",
|
|
198
|
+
checkOk: "{name} is up ({latency} ms).",
|
|
199
|
+
checkDown: "{name} is {status}.",
|
|
200
|
+
checkFailed: "Check failed: {message}",
|
|
201
|
+
enabledToast: "Monitor enabled.",
|
|
202
|
+
disabledToast: "Monitor paused.",
|
|
203
|
+
intervals: {
|
|
204
|
+
"30": "Every 30 seconds",
|
|
205
|
+
"60": "Every minute",
|
|
206
|
+
"300": "Every 5 minutes",
|
|
207
|
+
"600": "Every 10 minutes",
|
|
208
|
+
"900": "Every 15 minutes",
|
|
209
|
+
"1800": "Every 30 minutes",
|
|
210
|
+
"3600": "Every hour",
|
|
211
|
+
"21600": "Every 6 hours",
|
|
212
|
+
"86400": "Daily",
|
|
213
|
+
} as Record<string, string>,
|
|
214
|
+
},
|
|
215
|
+
} as const;
|
|
216
|
+
|
|
217
|
+
type UptimeMessages = (typeof MESSAGES)["en-US"];
|
|
218
|
+
|
|
219
|
+
export function useUptimeT(): UptimeMessages {
|
|
220
|
+
const { locale } = useLocale();
|
|
221
|
+
return {
|
|
222
|
+
...MESSAGES["en-US"],
|
|
223
|
+
...((MESSAGES as Record<string, Partial<UptimeMessages>>)[locale] ?? {}),
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/** Interpolate {placeholders} in a message template. */
|
|
228
|
+
export function fmt(
|
|
229
|
+
template: string,
|
|
230
|
+
vars: Record<string, string | number> = {},
|
|
231
|
+
): string {
|
|
232
|
+
return template.replace(/\{(\w+)\}/g, (match, key) =>
|
|
233
|
+
key in vars ? String(vars[key]) : match,
|
|
234
|
+
);
|
|
235
|
+
}
|