@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
|
@@ -156,6 +156,8 @@ type ReplayViewportDimensions = {
|
|
|
156
156
|
|
|
157
157
|
const DEFAULT_PLAYER_WIDTH = 1024;
|
|
158
158
|
const DEFAULT_PLAYER_HEIGHT = 640;
|
|
159
|
+
const MIN_REPLAY_DISPLAY_ASPECT_RATIO = 0.45;
|
|
160
|
+
const MAX_REPLAY_DISPLAY_ASPECT_RATIO = 3;
|
|
159
161
|
const DEFAULT_SPEED = 2;
|
|
160
162
|
const SPEED_OPTIONS = [0.5, 1, 2, 4, 8];
|
|
161
163
|
const SKIP_STEP_MS = 5000;
|
|
@@ -166,15 +168,12 @@ const REPLAY_CHUNK_UNAVAILABLE_MESSAGE = "Session replay chunk is unavailable";
|
|
|
166
168
|
const DEFAULT_DEVTOOLS_HEIGHT = 220;
|
|
167
169
|
const MIN_STAGE_HEIGHT_PX = 240;
|
|
168
170
|
const SCRUBBER_MARKER_LIMIT = 500;
|
|
169
|
-
/** Reject Meta/resize frames that produce the ultra-wide ribbon letterbox.
|
|
170
|
-
* True 21:9 ultrawide is ~2.33; multi-monitor spans and corrupt frames are
|
|
171
|
-
* usually well above that and collapse the stage after fit-to-scale. */
|
|
172
|
-
const MIN_REPLAY_VIEWPORT_WIDTH = 320;
|
|
173
|
-
const MIN_REPLAY_VIEWPORT_HEIGHT = 240;
|
|
174
|
-
const MAX_REPLAY_ASPECT_RATIO = 2.45;
|
|
175
|
-
const MIN_REPLAY_ASPECT_RATIO = 0.5;
|
|
176
171
|
const TIMELINE_MARKER_LIMIT = 300;
|
|
177
172
|
const TIMELINE_FOLLOW_PAUSE_MS = 4000;
|
|
173
|
+
/** Toast/snackbar noise only — keep insertStyleRules minimal like builder-internal. */
|
|
174
|
+
const SUPPRESS_OVERLAYS_CSS = [
|
|
175
|
+
"[data-radix-popper-content-wrapper], .Toastify, [class*='toast'], [class*='Toast'], [class*='Snackbar'] { display: none !important; }",
|
|
176
|
+
];
|
|
178
177
|
const SESSION_REPLAY_CONSOLE_EVENT_TAG = "agent-native.console";
|
|
179
178
|
const SESSION_REPLAY_NETWORK_EVENT_TAG = "agent-native.network";
|
|
180
179
|
|
|
@@ -451,6 +450,7 @@ function ReplayWorkbench({
|
|
|
451
450
|
/>
|
|
452
451
|
<ReplayTimeline
|
|
453
452
|
markers={markers}
|
|
453
|
+
isLoading={!response.isComplete}
|
|
454
454
|
activeMarkerId={activeMarkerId}
|
|
455
455
|
onSeek={(ms) => seekRef.current(ms, true)}
|
|
456
456
|
/>
|
|
@@ -506,10 +506,9 @@ function ReplayPlayer({
|
|
|
506
506
|
const scrubbingRef = useRef(false);
|
|
507
507
|
const scrubResumePlayingRef = useRef(false);
|
|
508
508
|
|
|
509
|
-
const
|
|
510
|
-
|
|
511
|
-
const playerHeight =
|
|
512
|
-
streamedDims?.height ?? initialDims?.height ?? DEFAULT_PLAYER_HEIGHT;
|
|
509
|
+
const displayDims = clampReplayDisplayDimensions(streamedDims ?? initialDims);
|
|
510
|
+
const playerWidth = displayDims?.width ?? DEFAULT_PLAYER_WIDTH;
|
|
511
|
+
const playerHeight = displayDims?.height ?? DEFAULT_PLAYER_HEIGHT;
|
|
513
512
|
const skipRanges = useMemo(() => buildIdleSkipRanges(events), [events]);
|
|
514
513
|
const skipRangesRef = useLiveRef(skipRanges);
|
|
515
514
|
const skipInactiveRef = useLiveRef(skipInactive);
|
|
@@ -695,33 +694,21 @@ function ReplayPlayer({
|
|
|
695
694
|
if (cancelled || !stageRootRef.current) return;
|
|
696
695
|
|
|
697
696
|
stageRootRef.current.innerHTML = "";
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
);
|
|
706
|
-
setStreamedDims(frameDims);
|
|
707
|
-
localReplayer = new Replayer(playbackEvents as any[], {
|
|
697
|
+
// Match builder-internal: pass events through untouched and let rrweb own
|
|
698
|
+
// iframe sizing via Meta / ViewportResize. Only use dimensions for CSS
|
|
699
|
+
// fit-to-stage scaling of the outer wrapper — never rewrite Meta or force
|
|
700
|
+
// iframe width/height (that mismatches the FullSnapshot DOM and blanks
|
|
701
|
+
// the stage).
|
|
702
|
+
setStreamedDims(replayViewportDimensions(replayEvents));
|
|
703
|
+
localReplayer = new Replayer(replayEvents as any[], {
|
|
708
704
|
root: stageRootRef.current,
|
|
709
705
|
speed: speedRef.current,
|
|
710
706
|
skipInactive: false,
|
|
711
707
|
showWarning: false,
|
|
712
708
|
showDebug: false,
|
|
713
709
|
triggerFocus: false,
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
mouseTail: {
|
|
717
|
-
strokeStyle: "rgba(59, 130, 246, 0.35)",
|
|
718
|
-
lineWidth: 2,
|
|
719
|
-
duration: 600,
|
|
720
|
-
lineCap: "round",
|
|
721
|
-
},
|
|
722
|
-
insertStyleRules: [
|
|
723
|
-
"[data-radix-popper-content-wrapper], .Toastify, [class*='toast'], [class*='Toast'] { display: none !important; }",
|
|
724
|
-
],
|
|
710
|
+
mouseTail: false,
|
|
711
|
+
insertStyleRules: SUPPRESS_OVERLAYS_CSS,
|
|
725
712
|
});
|
|
726
713
|
replayerRef.current = localReplayer;
|
|
727
714
|
const meta = localReplayer.getMetaData?.();
|
|
@@ -732,7 +719,6 @@ function ReplayPlayer({
|
|
|
732
719
|
0,
|
|
733
720
|
Number.isFinite(total) ? total : 0,
|
|
734
721
|
);
|
|
735
|
-
applyReplayFrameDimensions(localReplayer, frameDims);
|
|
736
722
|
localReplayer.on?.("finish", () => {
|
|
737
723
|
setPlaying(false);
|
|
738
724
|
const finalTime = Number(localReplayer.getCurrentTime?.() ?? total);
|
|
@@ -740,21 +726,20 @@ function ReplayPlayer({
|
|
|
740
726
|
});
|
|
741
727
|
localReplayer.on?.("resize", (payload: unknown) => {
|
|
742
728
|
const dims = payload as { width?: unknown; height?: unknown };
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
729
|
+
if (
|
|
730
|
+
typeof dims.width === "number" &&
|
|
731
|
+
typeof dims.height === "number" &&
|
|
732
|
+
Number.isFinite(dims.width) &&
|
|
733
|
+
Number.isFinite(dims.height) &&
|
|
734
|
+
dims.width > 0 &&
|
|
735
|
+
dims.height > 0
|
|
736
|
+
) {
|
|
737
|
+
setStreamedDims({
|
|
738
|
+
width: Math.round(dims.width),
|
|
739
|
+
height: Math.round(dims.height),
|
|
740
|
+
});
|
|
748
741
|
}
|
|
749
742
|
});
|
|
750
|
-
localReplayer.on?.("fullsnapshot-rebuilded", () => {
|
|
751
|
-
applyReplayFrameDimensions(
|
|
752
|
-
localReplayer,
|
|
753
|
-
replayViewportAt(eventsRef.current, currentTimeRef.current) ??
|
|
754
|
-
frameDims,
|
|
755
|
-
);
|
|
756
|
-
revealReplayFrame(localReplayer);
|
|
757
|
-
});
|
|
758
743
|
updateTime(startAt);
|
|
759
744
|
setStatus("ready");
|
|
760
745
|
try {
|
|
@@ -769,14 +754,6 @@ function ReplayPlayer({
|
|
|
769
754
|
}
|
|
770
755
|
setPlaying(false);
|
|
771
756
|
}
|
|
772
|
-
window.requestAnimationFrame(() => {
|
|
773
|
-
applyReplayFrameDimensions(
|
|
774
|
-
localReplayer,
|
|
775
|
-
replayViewportAt(eventsRef.current, currentTimeRef.current) ??
|
|
776
|
-
frameDims,
|
|
777
|
-
);
|
|
778
|
-
revealReplayFrame(localReplayer);
|
|
779
|
-
});
|
|
780
757
|
}
|
|
781
758
|
|
|
782
759
|
void loadReplay().catch((loadError: any) => {
|
|
@@ -1250,10 +1227,12 @@ function ReplayIconButton({
|
|
|
1250
1227
|
|
|
1251
1228
|
function ReplayTimeline({
|
|
1252
1229
|
markers,
|
|
1230
|
+
isLoading,
|
|
1253
1231
|
activeMarkerId,
|
|
1254
1232
|
onSeek,
|
|
1255
1233
|
}: {
|
|
1256
1234
|
markers: ReplayMarker[];
|
|
1235
|
+
isLoading: boolean;
|
|
1257
1236
|
activeMarkerId: string | null;
|
|
1258
1237
|
onSeek: (ms: number) => void;
|
|
1259
1238
|
}) {
|
|
@@ -1292,35 +1271,28 @@ function ReplayTimeline({
|
|
|
1292
1271
|
}, [activeMarkerId, filteredMarkers]);
|
|
1293
1272
|
|
|
1294
1273
|
return (
|
|
1295
|
-
<Card className="analytics-session-detail-timeline min-h-0 overflow-hidden">
|
|
1296
|
-
<CardContent className="flex min-h-0 flex-1 flex-col p-0">
|
|
1297
|
-
<div className="shrink-0 space-y-2 border-b px-3 py-2">
|
|
1298
|
-
<div className="
|
|
1299
|
-
<IconTimelineEvent className="h-4 w-4" />
|
|
1274
|
+
<Card className="analytics-session-detail-timeline min-h-0 min-w-0 overflow-hidden">
|
|
1275
|
+
<CardContent className="flex min-h-0 min-w-0 flex-1 flex-col p-0">
|
|
1276
|
+
<div className="min-w-0 shrink-0 space-y-2 border-b px-3 py-2">
|
|
1277
|
+
<div className="truncate text-sm font-semibold">
|
|
1300
1278
|
{t("sessions.timeline")}
|
|
1301
1279
|
</div>
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
className="h-7 ps-7 text-xs"
|
|
1315
|
-
value={query}
|
|
1316
|
-
placeholder={t("sessions.timelineSearch")}
|
|
1317
|
-
onChange={(event) => setQuery(event.target.value)}
|
|
1318
|
-
/>
|
|
1319
|
-
</div>
|
|
1280
|
+
{!isLoading || markers.length ? (
|
|
1281
|
+
<div className="relative">
|
|
1282
|
+
<IconSearch className="pointer-events-none absolute start-2 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground" />
|
|
1283
|
+
<Input
|
|
1284
|
+
type="search"
|
|
1285
|
+
className="h-7 ps-7 text-xs"
|
|
1286
|
+
value={query}
|
|
1287
|
+
placeholder={t("sessions.timelineSearch")}
|
|
1288
|
+
onChange={(event) => setQuery(event.target.value)}
|
|
1289
|
+
/>
|
|
1290
|
+
</div>
|
|
1291
|
+
) : null}
|
|
1320
1292
|
</div>
|
|
1321
1293
|
<div
|
|
1322
1294
|
ref={listRef}
|
|
1323
|
-
className="min-h-0 flex-1 overflow-auto"
|
|
1295
|
+
className="min-h-0 min-w-0 flex-1 overflow-y-auto overflow-x-hidden"
|
|
1324
1296
|
onWheel={() => {
|
|
1325
1297
|
lastManualScrollAtRef.current = Date.now();
|
|
1326
1298
|
}}
|
|
@@ -1329,7 +1301,7 @@ function ReplayTimeline({
|
|
|
1329
1301
|
}}
|
|
1330
1302
|
>
|
|
1331
1303
|
{filteredMarkers.length ? (
|
|
1332
|
-
<div className="divide-y">
|
|
1304
|
+
<div className="min-w-0 divide-y">
|
|
1333
1305
|
{filteredMarkers.map((marker) => {
|
|
1334
1306
|
const expanded = marker.id === expandedMarkerId;
|
|
1335
1307
|
const active = marker.id === activeMarkerId;
|
|
@@ -1344,7 +1316,7 @@ function ReplayTimeline({
|
|
|
1344
1316
|
>
|
|
1345
1317
|
<button
|
|
1346
1318
|
type="button"
|
|
1347
|
-
className="flex w-full gap-2.5 px-3 py-2.5 text-left transition-colors hover:bg-muted/50"
|
|
1319
|
+
className="flex w-full min-w-0 gap-2.5 px-3 py-2.5 text-left transition-colors hover:bg-muted/50"
|
|
1348
1320
|
aria-expanded={expanded}
|
|
1349
1321
|
aria-current={active ? "true" : undefined}
|
|
1350
1322
|
onClick={() => {
|
|
@@ -1375,12 +1347,12 @@ function ReplayTimeline({
|
|
|
1375
1347
|
>
|
|
1376
1348
|
<MarkerIcon kind={marker.kind} />
|
|
1377
1349
|
</span>
|
|
1378
|
-
<span className="min-w-0 flex-1">
|
|
1379
|
-
<span className="flex items-center justify-between gap-3">
|
|
1350
|
+
<span className="min-w-0 flex-1 overflow-hidden">
|
|
1351
|
+
<span className="flex min-w-0 items-center justify-between gap-3">
|
|
1380
1352
|
<span className="truncate text-sm font-medium">
|
|
1381
1353
|
{marker.label}
|
|
1382
1354
|
</span>
|
|
1383
|
-
<span className="font-mono text-xs text-muted-foreground">
|
|
1355
|
+
<span className="shrink-0 font-mono text-xs text-muted-foreground">
|
|
1384
1356
|
{formatClock(marker.offsetMs)}
|
|
1385
1357
|
</span>
|
|
1386
1358
|
</span>
|
|
@@ -1402,7 +1374,7 @@ function ReplayTimeline({
|
|
|
1402
1374
|
);
|
|
1403
1375
|
})}
|
|
1404
1376
|
</div>
|
|
1405
|
-
) : (
|
|
1377
|
+
) : isLoading ? null : (
|
|
1406
1378
|
<div className="p-4 text-sm text-muted-foreground">
|
|
1407
1379
|
{query.trim()
|
|
1408
1380
|
? t("sessions.timelineNoMatches")
|
|
@@ -2177,9 +2149,8 @@ function hasPlayableReplayEvents(events: unknown[]): boolean {
|
|
|
2177
2149
|
export function replayViewportDimensions(
|
|
2178
2150
|
events: AnyReplayEvent[],
|
|
2179
2151
|
): ReplayViewportDimensions | null {
|
|
2180
|
-
//
|
|
2181
|
-
//
|
|
2182
|
-
// the stage into an ultra-wide ribbon after fit-to-stage scaling.
|
|
2152
|
+
// Latest Meta / ViewportResize for CSS fit-to-stage only. Never rewrite these
|
|
2153
|
+
// into the event stream — rrweb must keep Meta in sync with the FullSnapshot.
|
|
2183
2154
|
let best: ReplayViewportDimensions | null = null;
|
|
2184
2155
|
for (const event of events) {
|
|
2185
2156
|
const dims = dimensionsFromReplayEvent(event);
|
|
@@ -2188,22 +2159,6 @@ export function replayViewportDimensions(
|
|
|
2188
2159
|
return best;
|
|
2189
2160
|
}
|
|
2190
2161
|
|
|
2191
|
-
export function replayViewportAt(
|
|
2192
|
-
events: AnyReplayEvent[],
|
|
2193
|
-
currentTime: number,
|
|
2194
|
-
): ReplayViewportDimensions | null {
|
|
2195
|
-
const startedAt = replayStartedAt(events);
|
|
2196
|
-
let current: ReplayViewportDimensions | null = null;
|
|
2197
|
-
for (const event of events) {
|
|
2198
|
-
const dims = dimensionsFromReplayEvent(event);
|
|
2199
|
-
if (!dims) continue;
|
|
2200
|
-
const offset = Number(event.timestamp ?? 0) - startedAt;
|
|
2201
|
-
if (offset <= currentTime + 50) current = dims;
|
|
2202
|
-
else break;
|
|
2203
|
-
}
|
|
2204
|
-
return current ?? replayViewportDimensions(events);
|
|
2205
|
-
}
|
|
2206
|
-
|
|
2207
2162
|
function dimensionsFromReplayEvent(
|
|
2208
2163
|
event: AnyReplayEvent,
|
|
2209
2164
|
): ReplayViewportDimensions | null {
|
|
@@ -2219,12 +2174,7 @@ function dimensionsFromReplayEvent(
|
|
|
2219
2174
|
return null;
|
|
2220
2175
|
}
|
|
2221
2176
|
|
|
2222
|
-
/**
|
|
2223
|
-
* Prefer a sane viewport for the stage. Returns null only when width/height
|
|
2224
|
-
* are missing or non-positive. Out-of-range aspect ratios are clamped rather
|
|
2225
|
-
* than rejected so genuine wide windows keep their height (and most of their
|
|
2226
|
-
* width) instead of collapsing to the default 1024×640 fallback.
|
|
2227
|
-
*/
|
|
2177
|
+
/** Read raw positive finite dimensions; no aspect clamping. */
|
|
2228
2178
|
export function normalizeReplayDimensions(
|
|
2229
2179
|
width: unknown,
|
|
2230
2180
|
height: unknown,
|
|
@@ -2239,28 +2189,30 @@ export function normalizeReplayDimensions(
|
|
|
2239
2189
|
) {
|
|
2240
2190
|
return null;
|
|
2241
2191
|
}
|
|
2242
|
-
return
|
|
2192
|
+
return {
|
|
2193
|
+
width: Math.round(width),
|
|
2194
|
+
height: Math.round(height),
|
|
2195
|
+
};
|
|
2243
2196
|
}
|
|
2244
2197
|
|
|
2245
|
-
|
|
2246
|
-
|
|
2247
|
-
|
|
2248
|
-
|
|
2249
|
-
|
|
2250
|
-
|
|
2251
|
-
|
|
2252
|
-
|
|
2253
|
-
|
|
2254
|
-
|
|
2255
|
-
|
|
2256
|
-
|
|
2257
|
-
|
|
2258
|
-
|
|
2259
|
-
|
|
2260
|
-
|
|
2261
|
-
nextHeight = Math.round(nextWidth / MIN_REPLAY_ASPECT_RATIO);
|
|
2198
|
+
export function clampReplayDisplayDimensions(
|
|
2199
|
+
dims: ReplayViewportDimensions | null,
|
|
2200
|
+
): ReplayViewportDimensions | null {
|
|
2201
|
+
if (!dims) return null;
|
|
2202
|
+
const aspect = dims.width / dims.height;
|
|
2203
|
+
if (aspect > MAX_REPLAY_DISPLAY_ASPECT_RATIO) {
|
|
2204
|
+
return {
|
|
2205
|
+
width: Math.round(dims.height * MAX_REPLAY_DISPLAY_ASPECT_RATIO),
|
|
2206
|
+
height: dims.height,
|
|
2207
|
+
};
|
|
2208
|
+
}
|
|
2209
|
+
if (aspect < MIN_REPLAY_DISPLAY_ASPECT_RATIO) {
|
|
2210
|
+
return {
|
|
2211
|
+
width: dims.width,
|
|
2212
|
+
height: Math.round(dims.width / MIN_REPLAY_DISPLAY_ASPECT_RATIO),
|
|
2213
|
+
};
|
|
2262
2214
|
}
|
|
2263
|
-
return
|
|
2215
|
+
return dims;
|
|
2264
2216
|
}
|
|
2265
2217
|
|
|
2266
2218
|
export function filterReplayMarkers(
|
|
@@ -2284,98 +2236,6 @@ export function filterReplayMarkers(
|
|
|
2284
2236
|
});
|
|
2285
2237
|
}
|
|
2286
2238
|
|
|
2287
|
-
/**
|
|
2288
|
-
* Rewrite Meta / ViewportResize frames so rrweb never applies absurd aspect
|
|
2289
|
-
* ratios that collapse the stage into an ultra-wide ribbon. Prefer clamping
|
|
2290
|
-
* the captured dimensions (preserve height, shrink width) over replacing them
|
|
2291
|
-
* with the default fallback, which would misalign the recorded DOM.
|
|
2292
|
-
*/
|
|
2293
|
-
export function sanitizeReplayViewportEvents(
|
|
2294
|
-
events: AnyReplayEvent[],
|
|
2295
|
-
fallback: ReplayViewportDimensions,
|
|
2296
|
-
): AnyReplayEvent[] {
|
|
2297
|
-
return events.map((event) => {
|
|
2298
|
-
if (event.type === RRWEB_EVENT_TYPE.Meta && isRecord(event.data)) {
|
|
2299
|
-
return rewriteViewportEventData(event, event.data, fallback);
|
|
2300
|
-
}
|
|
2301
|
-
if (
|
|
2302
|
-
event.type === RRWEB_EVENT_TYPE.IncrementalSnapshot &&
|
|
2303
|
-
event.data?.source === INCREMENTAL_SOURCE.ViewportResize &&
|
|
2304
|
-
isRecord(event.data)
|
|
2305
|
-
) {
|
|
2306
|
-
return rewriteViewportEventData(event, event.data, fallback);
|
|
2307
|
-
}
|
|
2308
|
-
return event;
|
|
2309
|
-
});
|
|
2310
|
-
}
|
|
2311
|
-
|
|
2312
|
-
function rewriteViewportEventData(
|
|
2313
|
-
event: AnyReplayEvent,
|
|
2314
|
-
data: AnyRecord,
|
|
2315
|
-
fallback: ReplayViewportDimensions,
|
|
2316
|
-
): AnyReplayEvent {
|
|
2317
|
-
const width = data.width;
|
|
2318
|
-
const height = data.height;
|
|
2319
|
-
if (
|
|
2320
|
-
typeof width === "number" &&
|
|
2321
|
-
typeof height === "number" &&
|
|
2322
|
-
Number.isFinite(width) &&
|
|
2323
|
-
Number.isFinite(height) &&
|
|
2324
|
-
width > 0 &&
|
|
2325
|
-
height > 0
|
|
2326
|
-
) {
|
|
2327
|
-
const clamped = clampReplayViewport(width, height);
|
|
2328
|
-
if (
|
|
2329
|
-
clamped.width === Math.round(width) &&
|
|
2330
|
-
clamped.height === Math.round(height)
|
|
2331
|
-
) {
|
|
2332
|
-
return event;
|
|
2333
|
-
}
|
|
2334
|
-
return {
|
|
2335
|
-
...event,
|
|
2336
|
-
data: {
|
|
2337
|
-
...data,
|
|
2338
|
-
width: clamped.width,
|
|
2339
|
-
height: clamped.height,
|
|
2340
|
-
},
|
|
2341
|
-
};
|
|
2342
|
-
}
|
|
2343
|
-
return {
|
|
2344
|
-
...event,
|
|
2345
|
-
data: {
|
|
2346
|
-
...data,
|
|
2347
|
-
width: fallback.width,
|
|
2348
|
-
height: fallback.height,
|
|
2349
|
-
},
|
|
2350
|
-
};
|
|
2351
|
-
}
|
|
2352
|
-
|
|
2353
|
-
function applyReplayFrameDimensions(
|
|
2354
|
-
replayer: any,
|
|
2355
|
-
dims: ReplayViewportDimensions | null,
|
|
2356
|
-
) {
|
|
2357
|
-
const width = dims?.width ?? DEFAULT_PLAYER_WIDTH;
|
|
2358
|
-
const height = dims?.height ?? DEFAULT_PLAYER_HEIGHT;
|
|
2359
|
-
const wrapper = replayer?.wrapper as HTMLElement | undefined;
|
|
2360
|
-
const iframe = replayer?.iframe as HTMLIFrameElement | undefined;
|
|
2361
|
-
const mouseTail = replayer?.mouseTail as HTMLCanvasElement | undefined;
|
|
2362
|
-
for (const element of [wrapper, iframe]) {
|
|
2363
|
-
if (!element) continue;
|
|
2364
|
-
element.style.width = `${width}px`;
|
|
2365
|
-
element.style.height = `${height}px`;
|
|
2366
|
-
}
|
|
2367
|
-
for (const element of [iframe, mouseTail]) {
|
|
2368
|
-
if (!element) continue;
|
|
2369
|
-
element.setAttribute("width", String(width));
|
|
2370
|
-
element.setAttribute("height", String(height));
|
|
2371
|
-
}
|
|
2372
|
-
}
|
|
2373
|
-
|
|
2374
|
-
function revealReplayFrame(replayer: any) {
|
|
2375
|
-
const iframe = replayer?.iframe as HTMLIFrameElement | undefined;
|
|
2376
|
-
if (iframe) iframe.style.display = "inherit";
|
|
2377
|
-
}
|
|
2378
|
-
|
|
2379
2239
|
function replayStartedAt(events: AnyReplayEvent[]): number {
|
|
2380
2240
|
const first = events.find((event) =>
|
|
2381
2241
|
Number.isFinite(Number(event.timestamp)),
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { CodeSurface } from "@agent-native/core/blocks";
|
|
2
2
|
import {
|
|
3
|
-
agentNativePath,
|
|
4
3
|
useActionQuery,
|
|
5
4
|
useBuilderConnectFlow,
|
|
6
5
|
useBuilderStatus,
|
|
@@ -80,13 +79,7 @@ type SessionRecordingIdentity = Pick<
|
|
|
80
79
|
|
|
81
80
|
type SessionRecordingDevice = Pick<SessionRecordingSummary, "metadata">;
|
|
82
81
|
|
|
83
|
-
type DemoStatus = {
|
|
84
|
-
enabled?: boolean;
|
|
85
|
-
forced?: boolean;
|
|
86
|
-
};
|
|
87
|
-
|
|
88
82
|
const RANGE_OPTIONS: ReplayRange[] = ["24h", "7d", "30d", "90d", "all"];
|
|
89
|
-
const DEMO_STATUS_URL = agentNativePath("/_agent-native/demo/status");
|
|
90
83
|
|
|
91
84
|
export default function SessionsPage() {
|
|
92
85
|
const t = useT();
|
|
@@ -111,7 +104,6 @@ export default function SessionsPage() {
|
|
|
111
104
|
{ staleTime: 30_000 },
|
|
112
105
|
);
|
|
113
106
|
|
|
114
|
-
const demoModeEnabled = useDemoModeEnabled();
|
|
115
107
|
const recordings = data ?? [];
|
|
116
108
|
|
|
117
109
|
function updateFilter(key: string, value: string) {
|
|
@@ -256,7 +248,7 @@ export default function SessionsPage() {
|
|
|
256
248
|
</span>
|
|
257
249
|
<span className="min-w-0">
|
|
258
250
|
<span className="block truncate text-sm font-medium text-foreground">
|
|
259
|
-
{visitorLabel(recording, t
|
|
251
|
+
{visitorLabel(recording, t)}
|
|
260
252
|
</span>
|
|
261
253
|
<span className="mt-0.5 block truncate text-xs text-muted-foreground">
|
|
262
254
|
{formatDateTime(lastSeen)} ·{" "}
|
|
@@ -278,11 +270,7 @@ export default function SessionsPage() {
|
|
|
278
270
|
</span>
|
|
279
271
|
<span className="analytics-session-app-meta min-w-0 text-left">
|
|
280
272
|
<span className="analytics-session-badges flex flex-wrap gap-1.5 text-xs text-muted-foreground">
|
|
281
|
-
<span>
|
|
282
|
-
{t("sessions.pageCountCompact", {
|
|
283
|
-
count: formatNumber(recording.pageCount),
|
|
284
|
-
})}
|
|
285
|
-
</span>
|
|
273
|
+
<span>{formatPageCount(recording.pageCount, t)}</span>
|
|
286
274
|
{recording.errorCount > 0 ? (
|
|
287
275
|
<span className="font-medium text-destructive">
|
|
288
276
|
{t("sessions.errorCount", {
|
|
@@ -316,22 +304,6 @@ export default function SessionsPage() {
|
|
|
316
304
|
);
|
|
317
305
|
}
|
|
318
306
|
|
|
319
|
-
function useDemoModeEnabled(): boolean {
|
|
320
|
-
const { data } = useQuery({
|
|
321
|
-
queryKey: ["agent-native", "demo-mode"],
|
|
322
|
-
queryFn: async () => {
|
|
323
|
-
const res = await fetch(DEMO_STATUS_URL, {
|
|
324
|
-
credentials: "same-origin",
|
|
325
|
-
});
|
|
326
|
-
if (!res.ok) return null;
|
|
327
|
-
return (await res.json()) as DemoStatus | null;
|
|
328
|
-
},
|
|
329
|
-
refetchInterval: 4_000,
|
|
330
|
-
staleTime: 2_000,
|
|
331
|
-
});
|
|
332
|
-
return data?.enabled === true || data?.forced === true;
|
|
333
|
-
}
|
|
334
|
-
|
|
335
307
|
function EmptySessionsState() {
|
|
336
308
|
const t = useT();
|
|
337
309
|
const storageStatus = useReplayStorageStatus();
|
|
@@ -504,9 +476,7 @@ function rangeLabel(value: ReplayRange, t: ReturnType<typeof useT>): string {
|
|
|
504
476
|
function visitorLabel(
|
|
505
477
|
recording: SessionRecordingIdentity,
|
|
506
478
|
t: ReturnType<typeof useT>,
|
|
507
|
-
demoModeEnabled: boolean,
|
|
508
479
|
): string {
|
|
509
|
-
if (demoModeEnabled) return demoVisitorLabel(recording);
|
|
510
480
|
const email = emailLike(recording.userId) || emailLike(recording.userKey);
|
|
511
481
|
if (email) return email;
|
|
512
482
|
return (
|
|
@@ -517,29 +487,6 @@ function visitorLabel(
|
|
|
517
487
|
);
|
|
518
488
|
}
|
|
519
489
|
|
|
520
|
-
export function demoVisitorLabel(recording: SessionRecordingIdentity): string {
|
|
521
|
-
const source =
|
|
522
|
-
emailLike(recording.userId) ||
|
|
523
|
-
emailLike(recording.userKey) ||
|
|
524
|
-
recording.userId ||
|
|
525
|
-
recording.userKey ||
|
|
526
|
-
recording.anonymousId ||
|
|
527
|
-
recording.sessionId ||
|
|
528
|
-
recording.id;
|
|
529
|
-
const hash = stableHash(source);
|
|
530
|
-
const first = DEMO_FIRST_NAMES[hash % DEMO_FIRST_NAMES.length];
|
|
531
|
-
const last =
|
|
532
|
-
DEMO_LAST_NAMES[
|
|
533
|
-
Math.floor(hash / DEMO_FIRST_NAMES.length) % DEMO_LAST_NAMES.length
|
|
534
|
-
];
|
|
535
|
-
const domain =
|
|
536
|
-
DEMO_DOMAINS[
|
|
537
|
-
Math.floor(hash / (DEMO_FIRST_NAMES.length * DEMO_LAST_NAMES.length)) %
|
|
538
|
-
DEMO_DOMAINS.length
|
|
539
|
-
];
|
|
540
|
-
return `${first}.${last}@${domain}`.toLowerCase();
|
|
541
|
-
}
|
|
542
|
-
|
|
543
490
|
function emailLike(value: string | null): string | null {
|
|
544
491
|
if (!value?.includes("@")) return null;
|
|
545
492
|
return value;
|
|
@@ -667,53 +614,16 @@ function formatNumber(value: number): string {
|
|
|
667
614
|
return new Intl.NumberFormat().format(value);
|
|
668
615
|
}
|
|
669
616
|
|
|
670
|
-
function
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
617
|
+
function formatPageCount(value: number, t: ReturnType<typeof useT>): string {
|
|
618
|
+
const count = Math.max(0, Math.round(value || 0));
|
|
619
|
+
if (count === 1) {
|
|
620
|
+
return t("sessions.pageCountCompactSingular", {
|
|
621
|
+
count: formatNumber(count),
|
|
622
|
+
});
|
|
675
623
|
}
|
|
676
|
-
return
|
|
624
|
+
return t("sessions.pageCountCompact", { count: formatNumber(count) });
|
|
677
625
|
}
|
|
678
626
|
|
|
679
|
-
const DEMO_FIRST_NAMES = [
|
|
680
|
-
"Avery",
|
|
681
|
-
"Blake",
|
|
682
|
-
"Cameron",
|
|
683
|
-
"Devon",
|
|
684
|
-
"Emerson",
|
|
685
|
-
"Finley",
|
|
686
|
-
"Harper",
|
|
687
|
-
"Jordan",
|
|
688
|
-
"Morgan",
|
|
689
|
-
"Quinn",
|
|
690
|
-
"Riley",
|
|
691
|
-
"Taylor",
|
|
692
|
-
];
|
|
693
|
-
|
|
694
|
-
const DEMO_LAST_NAMES = [
|
|
695
|
-
"Bennett",
|
|
696
|
-
"Carter",
|
|
697
|
-
"Ellis",
|
|
698
|
-
"Hayes",
|
|
699
|
-
"Keller",
|
|
700
|
-
"Monroe",
|
|
701
|
-
"Parker",
|
|
702
|
-
"Reed",
|
|
703
|
-
"Sullivan",
|
|
704
|
-
"Walker",
|
|
705
|
-
"Young",
|
|
706
|
-
"Zimmer",
|
|
707
|
-
];
|
|
708
|
-
|
|
709
|
-
const DEMO_DOMAINS = [
|
|
710
|
-
"acme.test",
|
|
711
|
-
"northstar.test",
|
|
712
|
-
"orbit.test",
|
|
713
|
-
"riverbank.test",
|
|
714
|
-
"summit.test",
|
|
715
|
-
];
|
|
716
|
-
|
|
717
627
|
const SESSION_REPLAY_SNIPPET = `// Agent Native templates already call configureTracking().
|
|
718
628
|
import { configureTracking } from "@agent-native/core/client";
|
|
719
629
|
|