@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
|
@@ -8,7 +8,11 @@ import {
|
|
|
8
8
|
LOOM_START_MS_QUERY_PARAM,
|
|
9
9
|
loomEmbedUrlWithTimestamp,
|
|
10
10
|
} from "@shared/loom";
|
|
11
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
IconBolt,
|
|
13
|
+
IconPlayerPlay,
|
|
14
|
+
IconPlayerSkipForward,
|
|
15
|
+
} from "@tabler/icons-react";
|
|
12
16
|
import {
|
|
13
17
|
forwardRef,
|
|
14
18
|
useCallback,
|
|
@@ -47,7 +51,11 @@ import { cn } from "@/lib/utils";
|
|
|
47
51
|
|
|
48
52
|
import { CaptionsOverlay } from "./captions-overlay";
|
|
49
53
|
import { CtaButton } from "./cta-button";
|
|
50
|
-
import {
|
|
54
|
+
import {
|
|
55
|
+
PLAYER_SEEK_STEP_MS,
|
|
56
|
+
PlayerControls,
|
|
57
|
+
SPEED_OPTIONS,
|
|
58
|
+
} from "./player-controls";
|
|
51
59
|
|
|
52
60
|
function resolveLocalUrl(url: string | null | undefined): string | undefined {
|
|
53
61
|
if (!url) return undefined;
|
|
@@ -126,6 +134,14 @@ function applyLoomStartToVideoSrc(src: string, ms: number): string {
|
|
|
126
134
|
return setUrlSearchParam(src, LOOM_START_MS_QUERY_PARAM, String(ms));
|
|
127
135
|
}
|
|
128
136
|
|
|
137
|
+
function isPlayerUiTarget(target: EventTarget | null): boolean {
|
|
138
|
+
return (
|
|
139
|
+
typeof Element !== "undefined" &&
|
|
140
|
+
target instanceof Element &&
|
|
141
|
+
Boolean(target.closest("[data-player-ui]"))
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
|
|
129
145
|
export interface VideoPlayerHandle {
|
|
130
146
|
video: HTMLVideoElement | null;
|
|
131
147
|
play: () => Promise<void> | void;
|
|
@@ -242,6 +258,12 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
|
|
|
242
258
|
const videoRef = useRef<HTMLVideoElement | null>(null);
|
|
243
259
|
const containerRef = useRef<HTMLDivElement | null>(null);
|
|
244
260
|
const idleTimer = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
261
|
+
const touchTapCandidateRef = useRef<{
|
|
262
|
+
pointerId: number;
|
|
263
|
+
x: number;
|
|
264
|
+
y: number;
|
|
265
|
+
} | null>(null);
|
|
266
|
+
const suppressNextClickRef = useRef(false);
|
|
245
267
|
const playAttemptPendingRef = useRef(false);
|
|
246
268
|
const playAttemptIdRef = useRef(0);
|
|
247
269
|
// Position to restore after `v.load()` resets `currentTime` to 0 while
|
|
@@ -465,10 +487,12 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
|
|
|
465
487
|
setPlayError(null);
|
|
466
488
|
|
|
467
489
|
if (
|
|
468
|
-
initialVisibleFrameSeekedRef.current &&
|
|
469
490
|
!hasPlaybackStarted &&
|
|
470
491
|
(!startMs || startMs <= 0) &&
|
|
471
|
-
v.currentTime > 0.05
|
|
492
|
+
((initialVisibleFrameSeekedRef.current && v.currentTime > 0.05) ||
|
|
493
|
+
// The WebM duration probe seeks to 1e10. If Chrome never resolves the
|
|
494
|
+
// durationchange, first play must rewind instead of starting there.
|
|
495
|
+
v.currentTime > 1e7)
|
|
472
496
|
) {
|
|
473
497
|
try {
|
|
474
498
|
v.currentTime = 0;
|
|
@@ -547,6 +571,57 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
|
|
|
547
571
|
requestPlay();
|
|
548
572
|
}, [isPlaying, pauseVideo, requestPlay]);
|
|
549
573
|
|
|
574
|
+
const handlePlayerPointerDown = useCallback(
|
|
575
|
+
(e: React.PointerEvent<HTMLDivElement>) => {
|
|
576
|
+
if (
|
|
577
|
+
e.pointerType === "mouse" ||
|
|
578
|
+
e.button !== 0 ||
|
|
579
|
+
isLoomEmbed ||
|
|
580
|
+
isPlayerUiTarget(e.target)
|
|
581
|
+
) {
|
|
582
|
+
return;
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
touchTapCandidateRef.current = {
|
|
586
|
+
pointerId: e.pointerId,
|
|
587
|
+
x: e.clientX,
|
|
588
|
+
y: e.clientY,
|
|
589
|
+
};
|
|
590
|
+
},
|
|
591
|
+
[isLoomEmbed],
|
|
592
|
+
);
|
|
593
|
+
|
|
594
|
+
const handlePlayerPointerUp = useCallback(
|
|
595
|
+
(e: React.PointerEvent<HTMLDivElement>) => {
|
|
596
|
+
const candidate = touchTapCandidateRef.current;
|
|
597
|
+
if (!candidate || candidate.pointerId !== e.pointerId) return;
|
|
598
|
+
touchTapCandidateRef.current = null;
|
|
599
|
+
|
|
600
|
+
if (isLoomEmbed || isPlayerUiTarget(e.target)) return;
|
|
601
|
+
|
|
602
|
+
const moved = Math.max(
|
|
603
|
+
Math.abs(e.clientX - candidate.x),
|
|
604
|
+
Math.abs(e.clientY - candidate.y),
|
|
605
|
+
);
|
|
606
|
+
if (moved > 12) return;
|
|
607
|
+
|
|
608
|
+
e.preventDefault();
|
|
609
|
+
suppressNextClickRef.current = true;
|
|
610
|
+
togglePlayback();
|
|
611
|
+
bumpControls();
|
|
612
|
+
},
|
|
613
|
+
[bumpControls, isLoomEmbed, togglePlayback],
|
|
614
|
+
);
|
|
615
|
+
|
|
616
|
+
const handlePlayerPointerCancel = useCallback(
|
|
617
|
+
(e: React.PointerEvent<HTMLDivElement>) => {
|
|
618
|
+
if (touchTapCandidateRef.current?.pointerId === e.pointerId) {
|
|
619
|
+
touchTapCandidateRef.current = null;
|
|
620
|
+
}
|
|
621
|
+
},
|
|
622
|
+
[],
|
|
623
|
+
);
|
|
624
|
+
|
|
550
625
|
const applySpeed = useCallback(
|
|
551
626
|
(rate: number) => {
|
|
552
627
|
const nextSpeed = parsePlaybackSpeed(rate) ?? defaultSpeed;
|
|
@@ -612,6 +687,21 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
|
|
|
612
687
|
],
|
|
613
688
|
);
|
|
614
689
|
|
|
690
|
+
const seekByMs = useCallback(
|
|
691
|
+
(deltaMs: number) => {
|
|
692
|
+
const v = videoRef.current;
|
|
693
|
+
const liveMs =
|
|
694
|
+
v &&
|
|
695
|
+
Number.isFinite(v.currentTime) &&
|
|
696
|
+
v.currentTime >= 0 &&
|
|
697
|
+
v.currentTime < 1e7
|
|
698
|
+
? Math.floor(v.currentTime * 1000)
|
|
699
|
+
: currentMs;
|
|
700
|
+
seekToVisibleMs(liveMs + deltaMs);
|
|
701
|
+
},
|
|
702
|
+
[currentMs, seekToVisibleMs],
|
|
703
|
+
);
|
|
704
|
+
|
|
615
705
|
// Imperative handle for parent
|
|
616
706
|
useImperativeHandle(
|
|
617
707
|
ref,
|
|
@@ -1011,10 +1101,16 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
|
|
|
1011
1101
|
)}
|
|
1012
1102
|
onMouseMove={bumpControls}
|
|
1013
1103
|
onMouseLeave={() => !alwaysShowControls && setShowControls(false)}
|
|
1104
|
+
onPointerDown={handlePlayerPointerDown}
|
|
1105
|
+
onPointerUp={handlePlayerPointerUp}
|
|
1106
|
+
onPointerCancel={handlePlayerPointerCancel}
|
|
1014
1107
|
onClick={(e) => {
|
|
1108
|
+
if (suppressNextClickRef.current) {
|
|
1109
|
+
suppressNextClickRef.current = false;
|
|
1110
|
+
return;
|
|
1111
|
+
}
|
|
1015
1112
|
// Clicking the video toggles play — but not when clicking controls.
|
|
1016
|
-
|
|
1017
|
-
if (target.closest("[data-player-ui]")) return;
|
|
1113
|
+
if (isPlayerUiTarget(e.target)) return;
|
|
1018
1114
|
if (isLoomEmbed) return;
|
|
1019
1115
|
togglePlayback();
|
|
1020
1116
|
}}
|
|
@@ -1301,6 +1397,7 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
|
|
|
1301
1397
|
requestPlay();
|
|
1302
1398
|
}}
|
|
1303
1399
|
onSpeedChange={applySpeed}
|
|
1400
|
+
onSeekRelative={seekByMs}
|
|
1304
1401
|
menuPortalContainer={fullscreenMenuContainer}
|
|
1305
1402
|
/>
|
|
1306
1403
|
) : null}
|
|
@@ -1373,6 +1470,7 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
|
|
|
1373
1470
|
onSeek={(ms) => {
|
|
1374
1471
|
seekToVisibleMs(ms);
|
|
1375
1472
|
}}
|
|
1473
|
+
onSeekRelative={seekByMs}
|
|
1376
1474
|
onVolumeChange={(vol) => {
|
|
1377
1475
|
const v = videoRef.current;
|
|
1378
1476
|
if (v) {
|
|
@@ -1413,6 +1511,7 @@ function CenterPlaybackOverlay({
|
|
|
1413
1511
|
playError,
|
|
1414
1512
|
onPlay,
|
|
1415
1513
|
onSpeedChange,
|
|
1514
|
+
onSeekRelative,
|
|
1416
1515
|
menuPortalContainer,
|
|
1417
1516
|
}: {
|
|
1418
1517
|
mode: "loading" | "ready";
|
|
@@ -1422,6 +1521,7 @@ function CenterPlaybackOverlay({
|
|
|
1422
1521
|
playError: string | null;
|
|
1423
1522
|
onPlay: () => void;
|
|
1424
1523
|
onSpeedChange: (rate: number) => void;
|
|
1524
|
+
onSeekRelative: (deltaMs: number) => void;
|
|
1425
1525
|
menuPortalContainer?: HTMLElement | null;
|
|
1426
1526
|
}) {
|
|
1427
1527
|
const t = useT();
|
|
@@ -1446,18 +1546,30 @@ function CenterPlaybackOverlay({
|
|
|
1446
1546
|
</div>
|
|
1447
1547
|
) : (
|
|
1448
1548
|
<>
|
|
1449
|
-
<
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1549
|
+
<div className="flex items-center gap-[clamp(0.75rem,4cqw,1.5rem)]">
|
|
1550
|
+
<CenterSeekButton
|
|
1551
|
+
direction="back"
|
|
1552
|
+
ariaLabel="Back 15 seconds"
|
|
1553
|
+
onClick={() => onSeekRelative(-PLAYER_SEEK_STEP_MS)}
|
|
1554
|
+
/>
|
|
1555
|
+
<button
|
|
1556
|
+
data-player-ui
|
|
1557
|
+
type="button"
|
|
1558
|
+
aria-label={t("videoPlayer.playClip")}
|
|
1559
|
+
onClick={(e) => {
|
|
1560
|
+
e.stopPropagation();
|
|
1561
|
+
onPlay();
|
|
1562
|
+
}}
|
|
1563
|
+
className="pointer-events-auto flex h-[clamp(3rem,13cqw,6rem)] w-[clamp(3rem,13cqw,6rem)] items-center justify-center rounded-full bg-white text-black shadow-2xl ring-1 ring-white/35 transition-transform duration-150 hover:scale-105 hover:bg-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white focus-visible:ring-offset-2 focus-visible:ring-offset-black"
|
|
1564
|
+
>
|
|
1565
|
+
<IconPlayerPlay className="ml-[6%] h-[clamp(1.5rem,6.5cqw,3rem)] w-[clamp(1.5rem,6.5cqw,3rem)] fill-current" />
|
|
1566
|
+
</button>
|
|
1567
|
+
<CenterSeekButton
|
|
1568
|
+
direction="forward"
|
|
1569
|
+
ariaLabel="Forward 15 seconds"
|
|
1570
|
+
onClick={() => onSeekRelative(PLAYER_SEEK_STEP_MS)}
|
|
1571
|
+
/>
|
|
1572
|
+
</div>
|
|
1461
1573
|
|
|
1462
1574
|
<div
|
|
1463
1575
|
data-player-ui
|
|
@@ -1522,6 +1634,38 @@ function CenterPlaybackOverlay({
|
|
|
1522
1634
|
);
|
|
1523
1635
|
}
|
|
1524
1636
|
|
|
1637
|
+
function CenterSeekButton({
|
|
1638
|
+
direction,
|
|
1639
|
+
ariaLabel,
|
|
1640
|
+
onClick,
|
|
1641
|
+
}: {
|
|
1642
|
+
direction: "back" | "forward";
|
|
1643
|
+
ariaLabel: string;
|
|
1644
|
+
onClick: () => void;
|
|
1645
|
+
}) {
|
|
1646
|
+
return (
|
|
1647
|
+
<button
|
|
1648
|
+
data-player-ui
|
|
1649
|
+
type="button"
|
|
1650
|
+
aria-label={ariaLabel}
|
|
1651
|
+
onClick={(e) => {
|
|
1652
|
+
e.stopPropagation();
|
|
1653
|
+
onClick();
|
|
1654
|
+
}}
|
|
1655
|
+
className="pointer-events-auto flex h-[clamp(2.5rem,9cqw,4rem)] w-[clamp(2.5rem,9cqw,4rem)] items-center justify-center rounded-full bg-black/70 text-white shadow-xl ring-1 ring-white/20 backdrop-blur-md transition-transform duration-150 hover:scale-105 hover:bg-black/80 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white focus-visible:ring-offset-2 focus-visible:ring-offset-black"
|
|
1656
|
+
>
|
|
1657
|
+
<span className="relative flex h-[clamp(1.25rem,4.5cqw,2rem)] w-[clamp(1.25rem,4.5cqw,2rem)] items-center justify-center">
|
|
1658
|
+
<IconPlayerSkipForward
|
|
1659
|
+
className={cn("h-full w-full", direction === "back" && "rotate-180")}
|
|
1660
|
+
/>
|
|
1661
|
+
<span className="absolute text-[clamp(0.45rem,1.8cqw,0.7rem)] font-bold leading-none">
|
|
1662
|
+
15
|
|
1663
|
+
</span>
|
|
1664
|
+
</span>
|
|
1665
|
+
</button>
|
|
1666
|
+
);
|
|
1667
|
+
}
|
|
1668
|
+
|
|
1525
1669
|
/**
|
|
1526
1670
|
* Clamp a millisecond seek target to a value the browser will actually accept.
|
|
1527
1671
|
*
|
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
agentNativePath,
|
|
16
16
|
callAction,
|
|
17
17
|
sendToAgentChat,
|
|
18
|
+
type AgentChatMessage,
|
|
18
19
|
} from "@agent-native/core/client";
|
|
19
20
|
import { fullVideoAiModelSelection } from "@shared/clips-ai-prefs";
|
|
20
21
|
import { useEffect, useRef } from "react";
|
|
@@ -55,6 +56,7 @@ interface AiRequest {
|
|
|
55
56
|
thresholdMs?: number;
|
|
56
57
|
message?: string;
|
|
57
58
|
includeFullVideoInAi?: boolean;
|
|
59
|
+
openInChat?: boolean;
|
|
58
60
|
}
|
|
59
61
|
|
|
60
62
|
const DISPATCHABLE_REQUESTS = new Set([
|
|
@@ -201,25 +203,33 @@ function buildRequestContext(rec: RecordingSummary, request: AiRequest) {
|
|
|
201
203
|
};
|
|
202
204
|
}
|
|
203
205
|
|
|
204
|
-
function
|
|
206
|
+
export function buildAiRequestChatOptions(
|
|
207
|
+
rec: RecordingSummary,
|
|
208
|
+
request: AiRequest,
|
|
209
|
+
): AgentChatMessage {
|
|
205
210
|
const includeFullVideo = request.includeFullVideoInAi === true;
|
|
206
211
|
const gemini = includeFullVideo ? fullVideoAiModelSelection() : null;
|
|
207
|
-
|
|
212
|
+
const openInChat = request.openInChat === true;
|
|
213
|
+
return {
|
|
208
214
|
message:
|
|
209
215
|
request.message ??
|
|
210
216
|
`Handle queued ${request.kind} work for recording ${rec.id}.`,
|
|
211
217
|
context: JSON.stringify(buildRequestContext(rec, request)),
|
|
212
218
|
submit: true,
|
|
213
|
-
openSidebar: false,
|
|
219
|
+
openSidebar: openInChat ? true : false,
|
|
214
220
|
newTab: true,
|
|
215
|
-
background:
|
|
221
|
+
background: !openInChat,
|
|
216
222
|
...(gemini
|
|
217
223
|
? {
|
|
218
224
|
engine: gemini.engine,
|
|
219
225
|
model: gemini.model,
|
|
220
226
|
}
|
|
221
227
|
: {}),
|
|
222
|
-
}
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function dispatchAiRequest(rec: RecordingSummary, request: AiRequest) {
|
|
232
|
+
sendToAgentChat(buildAiRequestChatOptions(rec, request));
|
|
223
233
|
}
|
|
224
234
|
|
|
225
235
|
function parseJsonArray(raw: string | undefined): unknown[] {
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
SettingsTabsPage,
|
|
11
11
|
useAgentSettingsTabs,
|
|
12
12
|
useT,
|
|
13
|
+
type SettingsSearchEntry,
|
|
13
14
|
} from "@agent-native/core/client";
|
|
14
15
|
import { TeamPage } from "@agent-native/core/client/org";
|
|
15
16
|
import {
|
|
@@ -30,7 +31,7 @@ import {
|
|
|
30
31
|
IconTrash,
|
|
31
32
|
IconUser,
|
|
32
33
|
} from "@tabler/icons-react";
|
|
33
|
-
import { useCallback, useEffect, useState } from "react";
|
|
34
|
+
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
34
35
|
import { toast } from "sonner";
|
|
35
36
|
|
|
36
37
|
import { PageHeader } from "@/components/library/page-header";
|
|
@@ -746,6 +747,61 @@ export default function SettingsIndexRoute() {
|
|
|
746
747
|
const builderCreditsUpgradeUrl =
|
|
747
748
|
builderCreditStatus.data?.upgradeUrl ?? BUILDER_CREDITS_UPGRADE_URL;
|
|
748
749
|
|
|
750
|
+
const generalSearchEntries = useMemo<SettingsSearchEntry[]>(
|
|
751
|
+
() => [
|
|
752
|
+
{
|
|
753
|
+
id: "clips-language",
|
|
754
|
+
label: t("settings.languageTitle"),
|
|
755
|
+
keywords: "language locale translation i18n",
|
|
756
|
+
hash: "language",
|
|
757
|
+
},
|
|
758
|
+
{
|
|
759
|
+
id: "clips-video-storage",
|
|
760
|
+
label: t("settings.videoStorage"),
|
|
761
|
+
keywords: "storage s3 builder bucket cloud video",
|
|
762
|
+
hash: "video-storage",
|
|
763
|
+
},
|
|
764
|
+
{
|
|
765
|
+
id: "clips-slack",
|
|
766
|
+
label: t("settings.slackTitle"),
|
|
767
|
+
keywords: "slack integration notifications workspace",
|
|
768
|
+
hash: "slack",
|
|
769
|
+
},
|
|
770
|
+
{
|
|
771
|
+
id: "clips-ai-providers",
|
|
772
|
+
label: t("settings.apiSetup"),
|
|
773
|
+
keywords:
|
|
774
|
+
"ai provider api key anthropic openai gemini groq openrouter builder",
|
|
775
|
+
hash: "ai-providers",
|
|
776
|
+
},
|
|
777
|
+
{
|
|
778
|
+
id: "clips-profile",
|
|
779
|
+
label: t("settings.profile"),
|
|
780
|
+
keywords: "profile email display name",
|
|
781
|
+
hash: "profile",
|
|
782
|
+
},
|
|
783
|
+
{
|
|
784
|
+
id: "clips-playback",
|
|
785
|
+
label: t("settings.playback"),
|
|
786
|
+
keywords: "playback speed video default",
|
|
787
|
+
hash: "playback",
|
|
788
|
+
},
|
|
789
|
+
{
|
|
790
|
+
id: "clips-transcript",
|
|
791
|
+
label: t("settings.transcript"),
|
|
792
|
+
keywords: "transcript cleanup captions",
|
|
793
|
+
hash: "transcript",
|
|
794
|
+
},
|
|
795
|
+
{
|
|
796
|
+
id: "clips-notifications",
|
|
797
|
+
label: t("settings.notifications"),
|
|
798
|
+
keywords: "email notifications alerts",
|
|
799
|
+
hash: "notifications",
|
|
800
|
+
},
|
|
801
|
+
],
|
|
802
|
+
[t],
|
|
803
|
+
);
|
|
804
|
+
|
|
749
805
|
return (
|
|
750
806
|
<>
|
|
751
807
|
<PageHeader>
|
|
@@ -756,6 +812,7 @@ export default function SettingsIndexRoute() {
|
|
|
756
812
|
<SettingsTabsPage
|
|
757
813
|
whatsNewLabel={t("settings.whatsNew")}
|
|
758
814
|
extraTabs={agentSettingsTabs}
|
|
815
|
+
generalSearchEntries={generalSearchEntries}
|
|
759
816
|
general={
|
|
760
817
|
<div className="mx-auto w-full max-w-4xl space-y-6">
|
|
761
818
|
<div className="min-w-0 space-y-6">
|
|
@@ -763,7 +820,7 @@ export default function SettingsIndexRoute() {
|
|
|
763
820
|
{t("settings.intro")}
|
|
764
821
|
</p>
|
|
765
822
|
|
|
766
|
-
<Card>
|
|
823
|
+
<Card id="language" className="scroll-mt-16">
|
|
767
824
|
<CardHeader>
|
|
768
825
|
<CardTitle className="text-base">
|
|
769
826
|
{t("settings.languageTitle")}
|
|
@@ -1353,7 +1410,7 @@ export default function SettingsIndexRoute() {
|
|
|
1353
1410
|
</CardContent>
|
|
1354
1411
|
</Card>
|
|
1355
1412
|
|
|
1356
|
-
<Card>
|
|
1413
|
+
<Card id="profile" className="scroll-mt-16">
|
|
1357
1414
|
<CardHeader>
|
|
1358
1415
|
<CardTitle className="text-base flex items-center gap-2">
|
|
1359
1416
|
<IconUser className="size-4 text-primary" />
|
|
@@ -1380,7 +1437,7 @@ export default function SettingsIndexRoute() {
|
|
|
1380
1437
|
</CardContent>
|
|
1381
1438
|
</Card>
|
|
1382
1439
|
|
|
1383
|
-
<Card>
|
|
1440
|
+
<Card id="playback" className="scroll-mt-16">
|
|
1384
1441
|
<CardHeader>
|
|
1385
1442
|
<CardTitle className="text-base">
|
|
1386
1443
|
{t("settings.playback")}
|
|
@@ -1414,7 +1471,7 @@ export default function SettingsIndexRoute() {
|
|
|
1414
1471
|
</CardContent>
|
|
1415
1472
|
</Card>
|
|
1416
1473
|
|
|
1417
|
-
<Card>
|
|
1474
|
+
<Card id="transcript" className="scroll-mt-16">
|
|
1418
1475
|
<CardHeader>
|
|
1419
1476
|
<CardTitle className="text-base">
|
|
1420
1477
|
{t("settings.transcript")}
|
|
@@ -1443,7 +1500,7 @@ export default function SettingsIndexRoute() {
|
|
|
1443
1500
|
</CardContent>
|
|
1444
1501
|
</Card>
|
|
1445
1502
|
|
|
1446
|
-
<Card>
|
|
1503
|
+
<Card id="notifications" className="scroll-mt-16">
|
|
1447
1504
|
<CardHeader>
|
|
1448
1505
|
<CardTitle className="text-base">
|
|
1449
1506
|
{t("settings.notifications")}
|
|
@@ -4,7 +4,6 @@ import {
|
|
|
4
4
|
IconBrandApple,
|
|
5
5
|
IconBrandWindows,
|
|
6
6
|
IconExternalLink,
|
|
7
|
-
IconPlayerRecord,
|
|
8
7
|
} from "@tabler/icons-react";
|
|
9
8
|
import { useEffect, useState } from "react";
|
|
10
9
|
|
|
@@ -201,9 +200,18 @@ export default function DownloadPage() {
|
|
|
201
200
|
href={appPath("/")}
|
|
202
201
|
className="flex items-center gap-2 font-semibold"
|
|
203
202
|
>
|
|
204
|
-
<
|
|
205
|
-
|
|
206
|
-
|
|
203
|
+
<img
|
|
204
|
+
src={appPath("/agent-native-icon-light.svg")}
|
|
205
|
+
alt=""
|
|
206
|
+
aria-hidden="true"
|
|
207
|
+
className="block h-4 w-auto shrink-0 dark:hidden"
|
|
208
|
+
/>
|
|
209
|
+
<img
|
|
210
|
+
src={appPath("/agent-native-icon-dark.svg")}
|
|
211
|
+
alt=""
|
|
212
|
+
aria-hidden="true"
|
|
213
|
+
className="hidden h-4 w-auto shrink-0 dark:block"
|
|
214
|
+
/>
|
|
207
215
|
<span>Clips</span>
|
|
208
216
|
</a>
|
|
209
217
|
<a
|
|
@@ -85,6 +85,20 @@ async function writeAppState(key: string, value: unknown): Promise<void> {
|
|
|
85
85
|
},
|
|
86
86
|
);
|
|
87
87
|
}
|
|
88
|
+
|
|
89
|
+
function recordingLink(recordingId: string): string {
|
|
90
|
+
const path = `${appBasePath()}/r/${encodeURIComponent(recordingId)}`;
|
|
91
|
+
if (typeof window === "undefined") return path;
|
|
92
|
+
return new URL(path, window.location.origin).toString();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
async function copyRecordingLink(recordingId: string): Promise<void> {
|
|
96
|
+
if (typeof navigator === "undefined") return;
|
|
97
|
+
if (!navigator.clipboard?.writeText) return;
|
|
98
|
+
await navigator.clipboard
|
|
99
|
+
.writeText(recordingLink(recordingId))
|
|
100
|
+
.catch(() => undefined);
|
|
101
|
+
}
|
|
88
102
|
import {
|
|
89
103
|
bugReportTitle,
|
|
90
104
|
parseBugReportContext,
|
|
@@ -1786,6 +1800,7 @@ export default function RecordRoute() {
|
|
|
1786
1800
|
duration: 12_000,
|
|
1787
1801
|
});
|
|
1788
1802
|
} else {
|
|
1803
|
+
if (createdId && !reportContext) await copyRecordingLink(createdId);
|
|
1789
1804
|
toast.success(t("recordRoute.videoUploaded"));
|
|
1790
1805
|
}
|
|
1791
1806
|
if (reportContext && createdId) {
|
|
@@ -1888,6 +1903,7 @@ export default function RecordRoute() {
|
|
|
1888
1903
|
duration: 12_000,
|
|
1889
1904
|
});
|
|
1890
1905
|
} else {
|
|
1906
|
+
await copyRecordingLink(recordingId);
|
|
1891
1907
|
toast.success(t("recordRoute.loomImported"));
|
|
1892
1908
|
}
|
|
1893
1909
|
await writeAppState("navigate", {
|
|
@@ -2014,16 +2030,17 @@ export default function RecordRoute() {
|
|
|
2014
2030
|
setCompressionProgress(null);
|
|
2015
2031
|
setUploadProgress(null);
|
|
2016
2032
|
setUiState("complete");
|
|
2033
|
+
const reportContext = bugReportContextRef.current;
|
|
2017
2034
|
if (result.waitingForStorage) {
|
|
2018
2035
|
toast.info(t("recordRoute.recordingReadyToUpload"), {
|
|
2019
2036
|
description: t("recordRoute.connectStorageToFinish"),
|
|
2020
2037
|
duration: 12_000,
|
|
2021
2038
|
});
|
|
2022
2039
|
} else {
|
|
2040
|
+
if (!reportContext) await copyRecordingLink(recordingId);
|
|
2023
2041
|
toast.success(t("recordRoute.recordingSaved"));
|
|
2024
2042
|
}
|
|
2025
2043
|
|
|
2026
|
-
const reportContext = bugReportContextRef.current;
|
|
2027
2044
|
if (reportContext) {
|
|
2028
2045
|
const path = bugReportDonePath(recordingId, reportContext);
|
|
2029
2046
|
await writeAppState("navigate", {
|