@agent-native/core 0.121.2 → 0.122.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/README.md +4 -12
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +148 -0
- package/corpus/core/docs/content/actions.mdx +2 -2
- package/corpus/core/docs/content/agent-surfaces.mdx +1 -1
- package/corpus/core/docs/content/authentication.mdx +2 -0
- package/corpus/core/docs/content/deployment.mdx +36 -0
- package/corpus/core/docs/content/http-api.mdx +266 -0
- package/corpus/core/docs/content/syncing-template-changes.mdx +159 -0
- package/corpus/core/package.json +2 -1
- package/corpus/core/src/a2a/activity.ts +38 -27
- package/corpus/core/src/a2a/client.ts +57 -4
- package/corpus/core/src/agent/engine/builder-engine.ts +35 -4
- package/corpus/core/src/agent/run-manager.ts +20 -1
- package/corpus/core/src/agent/run-store.ts +4 -1
- package/corpus/core/src/agent/types.ts +28 -8
- package/corpus/core/src/chat-threads/store.ts +45 -0
- package/corpus/core/src/checkpoints/index.ts +2 -0
- package/corpus/core/src/checkpoints/route-match.ts +13 -0
- package/corpus/core/src/cli/create.ts +105 -17
- package/corpus/core/src/cli/index.ts +20 -0
- package/corpus/core/src/cli/template-baseline.ts +410 -0
- package/corpus/core/src/cli/template-sync.ts +1004 -0
- package/corpus/core/src/cli/templates-meta.ts +1 -0
- package/corpus/core/src/client/AssistantChat.tsx +38 -12
- package/corpus/core/src/client/NewWorkspaceAppFlow.tsx +75 -10
- package/corpus/core/src/client/chat/message-components.tsx +127 -66
- package/corpus/core/src/client/chat/tool-call-display.tsx +29 -5
- package/corpus/core/src/client/error-format.ts +18 -0
- package/corpus/core/src/client/org/OrgSwitcher.tsx +30 -8
- package/corpus/core/src/client/org/TeamPage.tsx +7 -6
- package/corpus/core/src/client/settings/SettingsPanel.tsx +9 -9
- package/corpus/core/src/client/settings/SettingsTabsPage.tsx +12 -2
- package/corpus/core/src/client/sse-event-processor.ts +3 -0
- package/corpus/core/src/data-widgets/index.ts +41 -0
- package/corpus/core/src/deploy/build.ts +11 -9
- package/corpus/core/src/extensions/url-safety.ts +67 -4
- package/corpus/core/src/integrations/webhook-handler.ts +63 -9
- package/corpus/core/src/org/auto-join-domain.ts +4 -3
- package/corpus/core/src/org/context.ts +108 -39
- package/corpus/core/src/org/index.ts +5 -0
- package/corpus/core/src/org/service-identity.ts +60 -0
- package/corpus/core/src/provider-api/index.ts +22 -1
- package/corpus/core/src/scripts/docs/search.ts +12 -1
- package/corpus/core/src/server/agent-chat/context-tools.ts +9 -4
- package/corpus/core/src/server/agent-chat/framework-prompts.ts +38 -66
- package/corpus/core/src/server/agent-chat-plugin.ts +17 -10
- package/corpus/core/src/server/agents-bundle.ts +84 -5
- package/corpus/core/src/server/auth.ts +4 -3
- package/corpus/core/src/server/builder-browser.ts +47 -19
- package/corpus/core/src/server/core-routes-plugin.ts +2 -2
- package/corpus/core/src/server/credential-provider.ts +209 -68
- package/corpus/core/src/server/index.ts +3 -0
- package/corpus/core/src/server/prompts/framework-core-compact.ts +6 -13
- package/corpus/core/src/server/prompts/framework-core.ts +9 -21
- package/corpus/core/src/server/prompts/index.ts +0 -1
- package/corpus/core/src/server/prompts/shared-rules.ts +19 -11
- package/corpus/core/src/server/ssr-handler.ts +13 -2
- package/corpus/core/src/settings/user-settings.ts +13 -1
- package/corpus/core/src/shared/cache-control.ts +141 -0
- package/corpus/core/src/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/core/src/templates/chat/_gitignore +1 -0
- package/corpus/core/src/templates/chat/app/components/layout/Sidebar.tsx +0 -7
- package/corpus/core/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/core/src/templates/default/app/root.tsx +1 -1
- package/corpus/core/src/templates/default/public/manifest.json +2 -2
- package/corpus/core/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +19 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/core/src/templates/workspace-core/.agents/skills/visual-answer/SKILL.md +1 -0
- package/corpus/core/src/vite/agents-bundle-plugin.ts +7 -6
- package/corpus/core/src/vite/client.ts +69 -3
- package/corpus/templates/analytics/.agents/skills/adhoc-analysis/SKILL.md +4 -5
- package/corpus/templates/analytics/.agents/skills/admin-surfaces/SKILL.md +55 -0
- package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +10 -0
- package/corpus/templates/analytics/.agents/skills/dashboard-management/references/template-catalog-and-demo.md +62 -0
- package/corpus/templates/analytics/.agents/skills/dashboard-ops/SKILL.md +85 -0
- package/corpus/templates/analytics/.agents/skills/data-querying/SKILL.md +27 -2
- package/corpus/templates/analytics/.agents/skills/data-querying/references/inline-chart-embeds.md +139 -0
- package/corpus/templates/analytics/.agents/skills/monitoring/SKILL.md +77 -0
- package/corpus/templates/analytics/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/templates/analytics/AGENTS.md +91 -563
- package/corpus/templates/analytics/_gitignore +1 -0
- package/corpus/templates/analytics/actions/bigquery.ts +12 -4
- package/corpus/templates/analytics/actions/generate-chart.ts +5 -5
- package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +30 -1
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +1 -23
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +3 -0
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +1 -1
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +1 -0
- package/corpus/templates/analytics/app/routes/_index.tsx +1 -1
- package/corpus/templates/analytics/changelog/2026-07-24-analytics-finds-saved-dashboards-and-queries-far-more-reliab.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-24-notion-access-errors-now-explain-that-a-page-needs-sharing-w.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-25-app-branding-now-uses-the-product-name-without-the-agent-nat.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
- package/corpus/templates/analytics/package.json +1 -1
- package/corpus/templates/analytics/public/manifest.json +1 -1
- package/corpus/templates/analytics/server/lib/agent-chat-plan-mode.ts +7 -0
- package/corpus/templates/analytics/server/lib/analytics-query-catalog.ts +191 -30
- package/corpus/templates/analytics/server/lib/bigquery.ts +11 -1
- package/corpus/templates/analytics/server/lib/notion.ts +15 -4
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +10 -0
- package/corpus/templates/analytics/server/plugins/auth.ts +1 -1
- package/corpus/templates/assets/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/templates/assets/app/components/layout/Sidebar.tsx +0 -2
- package/corpus/templates/assets/app/routes/_index.tsx +1 -1
- package/corpus/templates/assets/changelog/2026-07-25-app-branding-now-uses-the-product-name-without-the-agent-nat.md +6 -0
- package/corpus/templates/assets/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
- package/corpus/templates/assets/server/plugins/auth.ts +1 -1
- package/corpus/templates/brain/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/templates/brain/_gitignore +1 -0
- package/corpus/templates/brain/app/lib/brain.ts +0 -7
- package/corpus/templates/brain/app/routes/_index.tsx +1 -2
- package/corpus/templates/brain/changelog/2026-07-25-app-branding-now-uses-the-product-name-without-the-agent-nat.md +6 -0
- package/corpus/templates/brain/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
- package/corpus/templates/brain/package.json +1 -1
- package/corpus/templates/brain/public/manifest.json +1 -1
- package/corpus/templates/brain/server/plugins/auth.ts +1 -1
- package/corpus/templates/calendar/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/templates/calendar/_gitignore +1 -0
- package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +0 -6
- package/corpus/templates/calendar/app/routes/_app._index.tsx +1 -1
- package/corpus/templates/calendar/changelog/2026-07-25-app-branding-now-uses-the-product-name-without-the-agent-nat.md +6 -0
- package/corpus/templates/calendar/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
- package/corpus/templates/calendar/package.json +1 -1
- package/corpus/templates/calendar/public/manifest.json +1 -1
- package/corpus/templates/calendar/server/plugins/auth.ts +1 -1
- package/corpus/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/templates/chat/_gitignore +1 -0
- package/corpus/templates/chat/app/components/layout/Sidebar.tsx +0 -7
- package/corpus/templates/chat/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
- package/corpus/templates/clips/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/templates/clips/.agents/skills/video-sharing/SKILL.md +34 -0
- package/corpus/templates/clips/AGENTS.md +5 -4
- package/corpus/templates/clips/_gitignore +1 -0
- package/corpus/templates/clips/actions/cleanup-transcript.ts +5 -0
- package/corpus/templates/clips/actions/get-recording-insights.ts +44 -8
- package/corpus/templates/clips/actions/get-recording-player-data.ts +39 -70
- package/corpus/templates/clips/actions/import-loom-recording.ts +53 -98
- package/corpus/templates/clips/actions/lib/loom-import-job.ts +260 -0
- package/corpus/templates/clips/actions/list-clip-views.ts +2 -4
- package/corpus/templates/clips/actions/list-recordings.ts +69 -19
- package/corpus/templates/clips/actions/list-viewers.ts +5 -2
- package/corpus/templates/clips/actions/regenerate-summary.ts +5 -1
- package/corpus/templates/clips/actions/request-transcript.ts +28 -1
- package/corpus/templates/clips/app/components/editor/stitch-manager.tsx +21 -1
- package/corpus/templates/clips/app/components/library/library-layout.tsx +0 -7
- package/corpus/templates/clips/app/components/meetings/quick-ask-sidebar.tsx +14 -1
- package/corpus/templates/clips/app/components/player/insights-panel.tsx +8 -20
- package/corpus/templates/clips/app/components/player/recording-views-badge.tsx +335 -0
- package/corpus/templates/clips/app/components/player/video-player.tsx +13 -8
- package/corpus/templates/clips/app/components/sharing/share-ui.tsx +2 -1
- package/corpus/templates/clips/app/i18n/en-US.ts +13 -2
- package/corpus/templates/clips/app/lib/capture-permissions.ts +110 -0
- package/corpus/templates/clips/app/lib/recording-link.ts +32 -0
- package/corpus/templates/clips/app/routes/_app.library._index.tsx +1 -1
- package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +27 -0
- package/corpus/templates/clips/app/routes/_index.tsx +1 -1
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +52 -15
- package/corpus/templates/clips/app/routes/record.tsx +82 -31
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +42 -31
- package/corpus/templates/clips/changelog/2026-07-24-clip-pages-now-show-a-view-count-with-viewer-avatars-next-to.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-24-clip-summaries-read-like-a-description-you-d-write-yourself-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-24-clip-view-counts-now-separate-human-views-from-agent-views-s.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-24-clips-actions-can-now-be-called-by-org-service-tokens-so-ext.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-24-clips-no-longer-briefly-shows-a-dock-icon-while-launching.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-24-fixed-owner-and-editor-share-links-redirecting-to-the-record.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-24-meeting-and-note-recordings-now-start-as-a-compact-pill-on-t.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-24-new-clips-now-copy-a-shareable-link-instead-of-the-owner-onl.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-24-opening-a-share-link-as-the-clip-s-owner-now-goes-straight-t.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-24-permissions-and-rewind-controls-now-use-compact-consistent-h.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-24-quitting-the-desktop-app-no-longer-shows-a-false-macos-crash.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-24-screen-recording-permission-errors-now-name-the-exact-app-to.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-24-the-desktop-app-now-copies-a-new-clip-s-share-link-to-your-c.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-24-the-recording-toolbar-now-stays-above-other-apps-including-o.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-24-transcript-captions-now-use-real-speech-timings-instead-of-a.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-24-video-playback-no-longer-stutters-and-replays-the-last-momen.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-25-app-branding-now-uses-the-product-name-without-the-agent-nat.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
- package/corpus/templates/clips/chrome-extension/src/background.ts +17 -1
- package/corpus/templates/clips/desktop/package.json +2 -0
- package/corpus/templates/clips/desktop/src/app.tsx +89 -0
- package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +9 -3
- package/corpus/templates/clips/desktop/src/lib/audio-meter.ts +51 -0
- package/corpus/templates/clips/desktop/src/lib/native-notification.ts +44 -0
- package/corpus/templates/clips/desktop/src/lib/recording-link.ts +67 -0
- package/corpus/templates/clips/desktop/src/overlays/live-audio-bars.tsx +35 -35
- package/corpus/templates/clips/desktop/src/overlays/live-transcript.tsx +3 -2
- package/corpus/templates/clips/desktop/src/overlays/recording-pill.tsx +47 -46
- package/corpus/templates/clips/desktop/src/styles.css +127 -78
- package/corpus/templates/clips/desktop/src-tauri/Cargo.toml +7 -0
- package/corpus/templates/clips/desktop/src-tauri/Info.plist +6 -0
- package/corpus/templates/clips/desktop/src-tauri/capabilities/default.json +1 -0
- package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +7 -3
- package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +4 -1
- package/corpus/templates/clips/desktop/src-tauri/src/main.rs +8 -0
- package/corpus/templates/clips/desktop/src-tauri/src/recording_indicator.rs +21 -10
- package/corpus/templates/clips/desktop/src-tauri/src/util.rs +40 -0
- package/corpus/templates/clips/server/db/schema.ts +27 -0
- package/corpus/templates/clips/server/lib/agent-views.ts +145 -0
- package/corpus/templates/clips/server/lib/post-finalize-dispatch.ts +2 -1
- package/corpus/templates/clips/server/lib/public-agent-context.ts +7 -0
- package/corpus/templates/clips/server/lib/recording-share-grant.ts +79 -0
- package/corpus/templates/clips/server/lib/recordings.ts +51 -3
- package/corpus/templates/clips/server/plugins/auth.ts +1 -1
- package/corpus/templates/clips/server/plugins/db.ts +31 -0
- package/corpus/templates/clips/server/routes/api/_agent-native-background/post-finalize-worker.post.ts +56 -3
- package/corpus/templates/clips/server/routes/api/public-recording.get.ts +49 -17
- package/corpus/templates/clips/shared/recording-link.ts +43 -0
- package/corpus/templates/clips/shared/share-attribution.ts +4 -0
- package/corpus/templates/clips/shared/share-dashboard-redirect.ts +42 -0
- package/corpus/templates/clips/shared/view-analytics.ts +26 -0
- package/corpus/templates/content/.agents/skills/content/SKILL.md +5 -0
- package/corpus/templates/content/.agents/skills/content/references/local-file-mode.md +135 -0
- package/corpus/templates/content/.agents/skills/document-editing/SKILL.md +12 -0
- package/corpus/templates/content/.agents/skills/document-editing/references/databases.md +238 -0
- package/corpus/templates/content/.agents/skills/document-editing/references/document-behavior.md +91 -0
- package/corpus/templates/content/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/templates/content/AGENTS.md +62 -583
- package/corpus/templates/content/_gitignore +1 -0
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +1 -39
- package/corpus/templates/content/app/routes/_app._index.tsx +1 -2
- package/corpus/templates/content/changelog/2026-07-25-app-branding-now-uses-the-product-name-without-the-agent-nat.md +6 -0
- package/corpus/templates/content/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
- package/corpus/templates/content/package.json +1 -1
- package/corpus/templates/content/public/manifest.json +1 -1
- package/corpus/templates/content/server/plugins/auth.ts +1 -1
- package/corpus/templates/design/.agents/skills/creative-context/SKILL.md +11 -0
- package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +50 -8
- package/corpus/templates/design/.agents/skills/design-generation/references/code-layers.md +81 -0
- package/corpus/templates/design/.agents/skills/design-generation/references/code-workspace.md +42 -0
- package/corpus/templates/design/.agents/skills/design-generation/references/editor-extensions.md +34 -0
- package/corpus/templates/design/.agents/skills/responsive-breakpoints/SKILL.md +4 -1
- package/corpus/templates/design/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +17 -0
- package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +8196 -0
- package/corpus/templates/design/.generated/bridge/embedded-wheel.generated.ts +265 -0
- package/corpus/templates/design/.generated/bridge/hit-test.generated.ts +642 -0
- package/corpus/templates/design/.generated/bridge/motion-preview.generated.ts +571 -0
- package/corpus/templates/design/.generated/bridge/nav.generated.ts +91 -0
- package/corpus/templates/design/.generated/bridge/sample.generated.ts +23 -0
- package/corpus/templates/design/.generated/bridge/shader-fill-preview.generated.ts +263 -0
- package/corpus/templates/design/.generated/bridge/shader-runtime.generated.ts +518 -0
- package/corpus/templates/design/.generated/bridge/tweak.generated.ts +20 -0
- package/corpus/templates/design/.generated/bridge/zoom.generated.ts +32 -0
- package/corpus/templates/design/AGENTS.md +88 -503
- package/corpus/templates/design/_gitignore +1 -0
- package/corpus/templates/design/app/components/layout/Sidebar.tsx +0 -2
- package/corpus/templates/design/app/routes/_index.tsx +1 -1
- package/corpus/templates/design/changelog/2026-07-25-app-branding-now-uses-the-product-name-without-the-agent-nat.md +6 -0
- package/corpus/templates/design/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
- package/corpus/templates/design/server/plugins/auth.ts +1 -1
- package/corpus/templates/dispatch/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/templates/dispatch/_gitignore +1 -0
- package/corpus/templates/dispatch/app/dispatch-extensions.tsx +1 -10
- package/corpus/templates/dispatch/app/routes/overview.tsx +1 -1
- package/corpus/templates/dispatch/changelog/2026-07-24-signing-in-now-puts-you-in-your-companys-workspace.md +6 -0
- package/corpus/templates/dispatch/changelog/2026-07-25-app-branding-now-uses-the-product-name-without-the-agent-nat.md +6 -0
- package/corpus/templates/dispatch/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
- package/corpus/templates/dispatch/package.json +1 -1
- package/corpus/templates/dispatch/public/manifest.json +1 -1
- package/corpus/templates/forms/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/templates/forms/_gitignore +1 -0
- package/corpus/templates/forms/app/components/layout/Sidebar.tsx +0 -35
- package/corpus/templates/forms/changelog/2026-07-25-app-branding-now-uses-the-product-name-without-the-agent-nat.md +6 -0
- package/corpus/templates/forms/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
- package/corpus/templates/forms/package.json +1 -1
- package/corpus/templates/forms/public/manifest.json +1 -1
- package/corpus/templates/forms/server/lib/public-form-ssr.ts +2 -2
- package/corpus/templates/forms/server/plugins/auth.ts +1 -1
- package/corpus/templates/macros/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/templates/macros/_gitignore +1 -0
- package/corpus/templates/macros/app/components/layout/AppLayout.tsx +0 -2
- package/corpus/templates/macros/changelog/2026-07-25-app-branding-now-uses-the-product-name-without-the-agent-nat.md +6 -0
- package/corpus/templates/macros/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
- package/corpus/templates/macros/package.json +1 -1
- package/corpus/templates/macros/server/plugins/auth.ts +2 -2
- package/corpus/templates/mail/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/templates/mail/_gitignore +1 -0
- package/corpus/templates/mail/app/components/layout/AppLayout.tsx +0 -39
- package/corpus/templates/mail/app/routes/$view.$threadId.tsx +1 -1
- package/corpus/templates/mail/app/routes/$view.tsx +1 -1
- package/corpus/templates/mail/app/routes/_index.tsx +1 -1
- package/corpus/templates/mail/changelog/2026-07-25-app-branding-now-uses-the-product-name-without-the-agent-nat.md +6 -0
- package/corpus/templates/mail/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
- package/corpus/templates/mail/package.json +1 -1
- package/corpus/templates/mail/public/manifest.json +1 -1
- package/corpus/templates/mail/server/plugins/auth.ts +1 -1
- package/corpus/templates/plan/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/templates/plan/_gitignore +1 -0
- package/corpus/templates/plan/agent-native.app-skill.json +1 -1
- package/corpus/templates/plan/app/components/layout/Sidebar.tsx +4 -9
- package/corpus/templates/plan/app/lib/app-config.ts +1 -1
- package/corpus/templates/plan/changelog/2026-07-25-app-branding-now-uses-the-product-name-without-the-agent-nat.md +6 -0
- package/corpus/templates/plan/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
- package/corpus/templates/plan/package.json +1 -1
- package/corpus/templates/plan/public/manifest.json +1 -1
- package/corpus/templates/plan/server/plugins/auth.ts +1 -1
- package/corpus/templates/slides/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/templates/slides/_gitignore +1 -0
- package/corpus/templates/slides/app/components/layout/Sidebar.tsx +0 -2
- package/corpus/templates/slides/app/routes/_index.tsx +1 -1
- package/corpus/templates/slides/changelog/2026-07-25-app-branding-now-uses-the-product-name-without-the-agent-nat.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
- package/corpus/templates/slides/package.json +1 -1
- package/corpus/templates/slides/public/manifest.json +1 -1
- package/corpus/templates/slides/server/plugins/auth.ts +1 -1
- package/corpus/templates/slides/server/plugins/db.ts +4 -0
- package/corpus/templates/tasks/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/templates/tasks/AGENTS.md +1 -1
- package/corpus/templates/tasks/_gitignore +1 -0
- package/dist/a2a/activity.d.ts +4 -1
- package/dist/a2a/activity.d.ts.map +1 -1
- package/dist/a2a/activity.js +27 -16
- package/dist/a2a/activity.js.map +1 -1
- package/dist/a2a/client.d.ts.map +1 -1
- package/dist/a2a/client.js +58 -4
- package/dist/a2a/client.js.map +1 -1
- package/dist/agent/engine/builder-engine.d.ts +1 -0
- package/dist/agent/engine/builder-engine.d.ts.map +1 -1
- package/dist/agent/engine/builder-engine.js +31 -4
- package/dist/agent/engine/builder-engine.js.map +1 -1
- package/dist/agent/run-manager.d.ts.map +1 -1
- package/dist/agent/run-manager.js +18 -1
- package/dist/agent/run-manager.js.map +1 -1
- package/dist/agent/run-store.d.ts +1 -0
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +2 -1
- package/dist/agent/run-store.js.map +1 -1
- package/dist/agent/types.d.ts +12 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js +21 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/chat-threads/store.d.ts +10 -0
- package/dist/chat-threads/store.d.ts.map +1 -1
- package/dist/chat-threads/store.js +41 -0
- package/dist/chat-threads/store.js.map +1 -1
- package/dist/checkpoints/index.d.ts +1 -0
- package/dist/checkpoints/index.d.ts.map +1 -1
- package/dist/checkpoints/index.js +1 -0
- package/dist/checkpoints/index.js.map +1 -1
- package/dist/checkpoints/route-match.d.ts +8 -0
- package/dist/checkpoints/route-match.d.ts.map +1 -0
- package/dist/checkpoints/route-match.js +13 -0
- package/dist/checkpoints/route-match.js.map +1 -0
- package/dist/cli/create.d.ts +35 -4
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +69 -19
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/index.js +19 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/template-baseline.d.ts +54 -0
- package/dist/cli/template-baseline.d.ts.map +1 -0
- package/dist/cli/template-baseline.js +334 -0
- package/dist/cli/template-baseline.js.map +1 -0
- package/dist/cli/template-sync.d.ts +57 -0
- package/dist/cli/template-sync.d.ts.map +1 -0
- package/dist/cli/template-sync.js +787 -0
- package/dist/cli/template-sync.js.map +1 -0
- package/dist/cli/templates-meta.d.ts.map +1 -1
- package/dist/cli/templates-meta.js +1 -0
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/client/AssistantChat.d.ts +2 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +38 -10
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/NewWorkspaceAppFlow.d.ts.map +1 -1
- package/dist/client/NewWorkspaceAppFlow.js +32 -2
- package/dist/client/NewWorkspaceAppFlow.js.map +1 -1
- package/dist/client/chat/message-components.d.ts +20 -0
- package/dist/client/chat/message-components.d.ts.map +1 -1
- package/dist/client/chat/message-components.js +81 -46
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/chat/tool-call-display.d.ts.map +1 -1
- package/dist/client/chat/tool-call-display.js +14 -6
- package/dist/client/chat/tool-call-display.js.map +1 -1
- package/dist/client/error-format.d.ts.map +1 -1
- package/dist/client/error-format.js +13 -0
- package/dist/client/error-format.js.map +1 -1
- package/dist/client/org/OrgSwitcher.d.ts +8 -1
- package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
- package/dist/client/org/OrgSwitcher.js +3 -2
- 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 +1 -1
- package/dist/client/org/TeamPage.js.map +1 -1
- package/dist/client/settings/SettingsPanel.js +9 -9
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
- package/dist/client/settings/SettingsTabsPage.js +7 -4
- package/dist/client/settings/SettingsTabsPage.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +3 -0
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/data-widgets/index.d.ts +3 -0
- package/dist/data-widgets/index.d.ts.map +1 -1
- package/dist/data-widgets/index.js +33 -0
- package/dist/data-widgets/index.js.map +1 -1
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +11 -7
- package/dist/deploy/build.js.map +1 -1
- package/dist/eject/provider-api-definitions.d.ts +1 -0
- package/dist/eject/provider-api-definitions.d.ts.map +1 -1
- package/dist/extensions/url-safety.d.ts +9 -16
- package/dist/extensions/url-safety.d.ts.map +1 -1
- package/dist/extensions/url-safety.js +48 -4
- package/dist/extensions/url-safety.js.map +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +1 -1
- package/dist/integrations/webhook-handler.d.ts.map +1 -1
- package/dist/integrations/webhook-handler.js +46 -9
- package/dist/integrations/webhook-handler.js.map +1 -1
- package/dist/notifications/routes.d.ts +2 -2
- package/dist/observability/routes.d.ts +3 -3
- package/dist/org/auto-join-domain.d.ts +3 -2
- package/dist/org/auto-join-domain.d.ts.map +1 -1
- package/dist/org/auto-join-domain.js +1 -1
- package/dist/org/auto-join-domain.js.map +1 -1
- package/dist/org/context.d.ts.map +1 -1
- package/dist/org/context.js +84 -28
- package/dist/org/context.js.map +1 -1
- package/dist/org/index.d.ts +1 -0
- package/dist/org/index.d.ts.map +1 -1
- package/dist/org/index.js +1 -0
- package/dist/org/index.js.map +1 -1
- package/dist/org/service-identity.d.ts +43 -0
- package/dist/org/service-identity.d.ts.map +1 -0
- package/dist/org/service-identity.js +34 -0
- package/dist/org/service-identity.js.map +1 -0
- package/dist/provider-api/actions/custom-provider-registration.d.ts +14 -14
- package/dist/provider-api/actions/provider-api.d.ts +13 -11
- package/dist/provider-api/actions/provider-api.d.ts.map +1 -1
- package/dist/provider-api/index.d.ts +4 -0
- package/dist/provider-api/index.d.ts.map +1 -1
- package/dist/provider-api/index.js +17 -1
- package/dist/provider-api/index.js.map +1 -1
- package/dist/scripts/docs/search.d.ts.map +1 -1
- package/dist/scripts/docs/search.js +12 -1
- package/dist/scripts/docs/search.js.map +1 -1
- package/dist/server/agent-chat/context-tools.d.ts.map +1 -1
- package/dist/server/agent-chat/context-tools.js +3 -3
- package/dist/server/agent-chat/context-tools.js.map +1 -1
- package/dist/server/agent-chat/framework-prompts.d.ts +8 -3
- package/dist/server/agent-chat/framework-prompts.d.ts.map +1 -1
- package/dist/server/agent-chat/framework-prompts.js +33 -62
- package/dist/server/agent-chat/framework-prompts.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +16 -10
- 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/agents-bundle.d.ts +18 -0
- package/dist/server/agents-bundle.d.ts.map +1 -1
- package/dist/server/agents-bundle.js +70 -4
- package/dist/server/agents-bundle.js.map +1 -1
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +4 -3
- package/dist/server/auth.js.map +1 -1
- package/dist/server/builder-browser.d.ts.map +1 -1
- package/dist/server/builder-browser.js +43 -19
- package/dist/server/builder-browser.js.map +1 -1
- package/dist/server/core-routes-plugin.js +2 -2
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/credential-provider.d.ts +38 -2
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +142 -64
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/prompts/framework-core-compact.d.ts +1 -1
- package/dist/server/prompts/framework-core-compact.d.ts.map +1 -1
- package/dist/server/prompts/framework-core-compact.js +7 -13
- package/dist/server/prompts/framework-core-compact.js.map +1 -1
- package/dist/server/prompts/framework-core.d.ts +1 -1
- package/dist/server/prompts/framework-core.d.ts.map +1 -1
- package/dist/server/prompts/framework-core.js +10 -21
- package/dist/server/prompts/framework-core.js.map +1 -1
- package/dist/server/prompts/index.d.ts +1 -1
- package/dist/server/prompts/index.d.ts.map +1 -1
- package/dist/server/prompts/index.js +1 -1
- package/dist/server/prompts/index.js.map +1 -1
- package/dist/server/prompts/shared-rules.d.ts +16 -10
- package/dist/server/prompts/shared-rules.d.ts.map +1 -1
- package/dist/server/prompts/shared-rules.js +19 -10
- package/dist/server/prompts/shared-rules.js.map +1 -1
- package/dist/server/ssr-handler.d.ts +1 -1
- package/dist/server/ssr-handler.d.ts.map +1 -1
- package/dist/server/ssr-handler.js +10 -3
- package/dist/server/ssr-handler.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/settings/user-settings.d.ts.map +1 -1
- package/dist/settings/user-settings.js +13 -1
- package/dist/settings/user-settings.js.map +1 -1
- package/dist/shared/cache-control.d.ts +52 -0
- package/dist/shared/cache-control.d.ts.map +1 -1
- package/dist/shared/cache-control.js +107 -0
- package/dist/shared/cache-control.js.map +1 -1
- package/dist/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/dist/templates/chat/_gitignore +1 -0
- package/dist/templates/chat/app/components/layout/Sidebar.tsx +0 -7
- package/dist/templates/chat/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
- package/dist/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/dist/templates/default/app/root.tsx +1 -1
- package/dist/templates/default/public/manifest.json +2 -2
- package/dist/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +19 -0
- package/dist/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/dist/templates/workspace-core/.agents/skills/visual-answer/SKILL.md +1 -0
- package/dist/vite/agents-bundle-plugin.d.ts.map +1 -1
- package/dist/vite/agents-bundle-plugin.js +8 -7
- package/dist/vite/agents-bundle-plugin.js.map +1 -1
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +66 -1
- package/dist/vite/client.js.map +1 -1
- package/docs/content/actions.mdx +2 -2
- package/docs/content/agent-surfaces.mdx +1 -1
- package/docs/content/authentication.mdx +2 -0
- package/docs/content/deployment.mdx +36 -0
- package/docs/content/http-api.mdx +266 -0
- package/docs/content/syncing-template-changes.mdx +159 -0
- package/package.json +4 -3
- package/src/a2a/activity.ts +38 -27
- package/src/a2a/client.ts +57 -4
- package/src/agent/engine/builder-engine.ts +35 -4
- package/src/agent/run-manager.ts +20 -1
- package/src/agent/run-store.ts +4 -1
- package/src/agent/types.ts +28 -8
- package/src/chat-threads/store.ts +45 -0
- package/src/checkpoints/index.ts +2 -0
- package/src/checkpoints/route-match.ts +13 -0
- package/src/cli/create.ts +105 -17
- package/src/cli/index.ts +20 -0
- package/src/cli/template-baseline.ts +410 -0
- package/src/cli/template-sync.ts +1004 -0
- package/src/cli/templates-meta.ts +1 -0
- package/src/client/AssistantChat.tsx +38 -12
- package/src/client/NewWorkspaceAppFlow.tsx +75 -10
- package/src/client/chat/message-components.tsx +127 -66
- package/src/client/chat/tool-call-display.tsx +29 -5
- package/src/client/error-format.ts +18 -0
- package/src/client/org/OrgSwitcher.tsx +30 -8
- package/src/client/org/TeamPage.tsx +7 -6
- package/src/client/settings/SettingsPanel.tsx +9 -9
- package/src/client/settings/SettingsTabsPage.tsx +12 -2
- package/src/client/sse-event-processor.ts +3 -0
- package/src/data-widgets/index.ts +41 -0
- package/src/deploy/build.ts +11 -9
- package/src/extensions/url-safety.ts +67 -4
- package/src/integrations/webhook-handler.ts +63 -9
- package/src/org/auto-join-domain.ts +4 -3
- package/src/org/context.ts +108 -39
- package/src/org/index.ts +5 -0
- package/src/org/service-identity.ts +60 -0
- package/src/provider-api/index.ts +22 -1
- package/src/scripts/docs/search.ts +12 -1
- package/src/server/__snapshots__/agent-chat-plugin.surface.spec.ts.snap +25 -36
- package/src/server/agent-chat/context-tools.ts +9 -4
- package/src/server/agent-chat/framework-prompts.ts +38 -66
- package/src/server/agent-chat-plugin.ts +17 -10
- package/src/server/agents-bundle.ts +84 -5
- package/src/server/auth.ts +4 -3
- package/src/server/builder-browser.ts +47 -19
- package/src/server/core-routes-plugin.ts +2 -2
- package/src/server/credential-provider.ts +209 -68
- package/src/server/index.ts +3 -0
- package/src/server/prompts/framework-core-compact.ts +6 -13
- package/src/server/prompts/framework-core.ts +9 -21
- package/src/server/prompts/index.ts +0 -1
- package/src/server/prompts/shared-rules.ts +19 -11
- package/src/server/ssr-handler.ts +13 -2
- package/src/settings/user-settings.ts +13 -1
- package/src/shared/cache-control.ts +141 -0
- package/src/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/src/templates/chat/_gitignore +1 -0
- package/src/templates/chat/app/components/layout/Sidebar.tsx +0 -7
- package/src/templates/chat/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
- package/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/src/templates/default/app/root.tsx +1 -1
- package/src/templates/default/public/manifest.json +2 -2
- package/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +19 -0
- package/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/src/templates/workspace-core/.agents/skills/visual-answer/SKILL.md +1 -0
- package/src/vite/agents-bundle-plugin.ts +7 -6
- package/src/vite/client.ts +69 -3
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { AgentPanel } from "@agent-native/core/client/agent-chat";
|
|
2
2
|
import { appPath, agentNativePath } from "@agent-native/core/client/api-path";
|
|
3
|
+
import { writeClipboardText } from "@agent-native/core/client/clipboard";
|
|
3
4
|
import {
|
|
4
5
|
useActionMutation,
|
|
5
6
|
useActionQuery,
|
|
@@ -19,7 +20,12 @@ import {
|
|
|
19
20
|
isLoomEmbedBackedRecording,
|
|
20
21
|
isLoomRecordingSource,
|
|
21
22
|
} from "@shared/loom";
|
|
22
|
-
import {
|
|
23
|
+
import {
|
|
24
|
+
CLIP_SHARE_REF,
|
|
25
|
+
DASHBOARD_REDIRECT_PARAM,
|
|
26
|
+
DASHBOARD_REDIRECT_VALUE,
|
|
27
|
+
REF_PARAM,
|
|
28
|
+
} from "@shared/share-attribution";
|
|
23
29
|
import {
|
|
24
30
|
IconShare3,
|
|
25
31
|
IconArrowLeft,
|
|
@@ -50,6 +56,7 @@ import { CommentsPanel } from "@/components/player/comments-panel";
|
|
|
50
56
|
import { RecordingOptionsMenu } from "@/components/player/delete-recording-menu";
|
|
51
57
|
import { InsightsPanel } from "@/components/player/insights-panel";
|
|
52
58
|
import { ReactionsTray } from "@/components/player/reactions-tray";
|
|
59
|
+
import { RecordingViewsBadge } from "@/components/player/recording-views-badge";
|
|
53
60
|
import { SettingsPanel } from "@/components/player/settings-panel";
|
|
54
61
|
import { ShareRecordingPopover } from "@/components/player/share-dialog";
|
|
55
62
|
import {
|
|
@@ -85,6 +92,7 @@ import { usePlayerShortcuts } from "@/hooks/use-player-shortcuts";
|
|
|
85
92
|
import { useViewTracking } from "@/hooks/use-view-tracking";
|
|
86
93
|
import enMessages from "@/i18n/en-US";
|
|
87
94
|
import { parsePlaybackSpeed } from "@/lib/playback-speed";
|
|
95
|
+
import { recordingShareUrl } from "@/lib/recording-link";
|
|
88
96
|
import { isStorageSetupFailureReason } from "@/lib/storage-failures";
|
|
89
97
|
import { cn } from "@/lib/utils";
|
|
90
98
|
|
|
@@ -253,6 +261,18 @@ export default function RecordingPage() {
|
|
|
253
261
|
}
|
|
254
262
|
return currentMs;
|
|
255
263
|
}, [currentMs]);
|
|
264
|
+
// The compact layout stacks the panel below the video, so switching tabs
|
|
265
|
+
// alone leaves the user looking at the player. Desktop always renders the
|
|
266
|
+
// side aside, so nothing to scroll there.
|
|
267
|
+
const openInsightsPanel = useCallback(() => {
|
|
268
|
+
setPanel("insights");
|
|
269
|
+
if (!isCompactLayout) return;
|
|
270
|
+
requestAnimationFrame(() => {
|
|
271
|
+
document
|
|
272
|
+
.getElementById("clip-activity-panel")
|
|
273
|
+
?.scrollIntoView({ block: "start" });
|
|
274
|
+
});
|
|
275
|
+
}, [isCompactLayout]);
|
|
256
276
|
const transcriptKickedRef = useRef<string | null>(null);
|
|
257
277
|
// When the recording lands in the processing state but never flips to
|
|
258
278
|
// 'ready', stop spinning forever and surface an error banner so the user
|
|
@@ -366,8 +386,11 @@ export default function RecordingPage() {
|
|
|
366
386
|
// password.
|
|
367
387
|
useEffect(() => {
|
|
368
388
|
if (!recordingId || !playerDataForbidden) return;
|
|
389
|
+
const shareParams = new URLSearchParams();
|
|
390
|
+
shareParams.set(REF_PARAM, CLIP_SHARE_REF);
|
|
391
|
+
shareParams.set(DASHBOARD_REDIRECT_PARAM, DASHBOARD_REDIRECT_VALUE);
|
|
369
392
|
navigate(
|
|
370
|
-
`/share/${encodeURIComponent(recordingId)}?${
|
|
393
|
+
`/share/${encodeURIComponent(recordingId)}?${shareParams.toString()}`,
|
|
371
394
|
{
|
|
372
395
|
replace: true,
|
|
373
396
|
},
|
|
@@ -408,23 +431,21 @@ export default function RecordingPage() {
|
|
|
408
431
|
const visibleTitle = recording
|
|
409
432
|
? displayRecordingTitle(recording.title)
|
|
410
433
|
: "Untitled Clip";
|
|
434
|
+
// Attribution `via` must never point at someone who isn't the owner, so it
|
|
435
|
+
// is only tagged when the viewer is the owner (same rule as the share dialog).
|
|
436
|
+
const shareViaId =
|
|
437
|
+
role === "owner" ? (session?.userId ?? undefined) : undefined;
|
|
411
438
|
const pendingShareUrl = useMemo(() => {
|
|
412
439
|
if (!recordingId || typeof window === "undefined") return "";
|
|
413
|
-
return
|
|
414
|
-
|
|
415
|
-
window.location.origin,
|
|
416
|
-
).toString();
|
|
417
|
-
}, [recordingId]);
|
|
440
|
+
return recordingShareUrl(recordingId, shareViaId);
|
|
441
|
+
}, [recordingId, shareViaId]);
|
|
418
442
|
const copyPendingShareLink = useCallback(async () => {
|
|
419
443
|
if (!pendingShareUrl) return;
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
// The full Share popover remains available when clipboard permission is
|
|
426
|
-
// unavailable, so a denied clipboard write does not block the page.
|
|
427
|
-
}
|
|
444
|
+
// The full Share popover remains available when clipboard permission is
|
|
445
|
+
// unavailable, so a denied clipboard write does not block the page.
|
|
446
|
+
if (!(await writeClipboardText(pendingShareUrl))) return;
|
|
447
|
+
setPendingLinkCopied(true);
|
|
448
|
+
window.setTimeout(() => setPendingLinkCopied(false), 1400);
|
|
428
449
|
}, [pendingShareUrl]);
|
|
429
450
|
useEffect(() => {
|
|
430
451
|
if (!recording?.id) return;
|
|
@@ -575,6 +596,12 @@ export default function RecordingPage() {
|
|
|
575
596
|
});
|
|
576
597
|
return;
|
|
577
598
|
}
|
|
599
|
+
if (retryingLoomImport && result?.status === "processing") {
|
|
600
|
+
// Download + reupload now run as a background job; this request only
|
|
601
|
+
// confirms the retry was accepted, not that the clip is ready yet.
|
|
602
|
+
toast.info(t("recordingPage.importingLoom"));
|
|
603
|
+
return;
|
|
604
|
+
}
|
|
578
605
|
toast.success(
|
|
579
606
|
retryingLoomImport
|
|
580
607
|
? t("recordingPage.loomImportResumed")
|
|
@@ -1336,6 +1363,16 @@ export default function RecordingPage() {
|
|
|
1336
1363
|
) : null}
|
|
1337
1364
|
</div>
|
|
1338
1365
|
|
|
1366
|
+
{!editing ? (
|
|
1367
|
+
<RecordingViewsBadge
|
|
1368
|
+
recordingId={recording.id}
|
|
1369
|
+
viewCount={playerDataQ.data?.viewCount ?? 0}
|
|
1370
|
+
canViewDetails={canEdit}
|
|
1371
|
+
onOpenInsights={openInsightsPanel}
|
|
1372
|
+
className="shrink-0"
|
|
1373
|
+
/>
|
|
1374
|
+
) : null}
|
|
1375
|
+
|
|
1339
1376
|
{canUseNativeEditor ? (
|
|
1340
1377
|
<Button
|
|
1341
1378
|
variant={editing ? "secondary" : "outline"}
|
|
@@ -46,6 +46,10 @@ import {
|
|
|
46
46
|
createBrowserDiagnosticsCapture,
|
|
47
47
|
type BrowserDiagnosticsCapture,
|
|
48
48
|
} from "@/lib/browser-diagnostics-capture";
|
|
49
|
+
import {
|
|
50
|
+
getCaptureHostApp,
|
|
51
|
+
macPermissionGuidanceFor,
|
|
52
|
+
} from "@/lib/capture-permissions";
|
|
49
53
|
import {
|
|
50
54
|
COMPRESS_THRESHOLD_BYTES,
|
|
51
55
|
COMPRESSION_ENABLED,
|
|
@@ -61,6 +65,7 @@ import {
|
|
|
61
65
|
loadRecorderPreferences,
|
|
62
66
|
saveRecorderPreferences,
|
|
63
67
|
} from "@/lib/recorder-preferences";
|
|
68
|
+
import { copyRecordingShareLink } from "@/lib/recording-link";
|
|
64
69
|
import {
|
|
65
70
|
buildCaptureTitle,
|
|
66
71
|
defaultRecordingTitle,
|
|
@@ -87,19 +92,6 @@ async function writeAppState(key: string, value: unknown): Promise<void> {
|
|
|
87
92
|
);
|
|
88
93
|
}
|
|
89
94
|
|
|
90
|
-
function recordingLink(recordingId: string): string {
|
|
91
|
-
const path = `${appBasePath()}/r/${encodeURIComponent(recordingId)}`;
|
|
92
|
-
if (typeof window === "undefined") return path;
|
|
93
|
-
return new URL(path, window.location.origin).toString();
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
async function copyRecordingLink(recordingId: string): Promise<void> {
|
|
97
|
-
if (typeof navigator === "undefined") return;
|
|
98
|
-
if (!navigator.clipboard?.writeText) return;
|
|
99
|
-
await navigator.clipboard
|
|
100
|
-
.writeText(recordingLink(recordingId))
|
|
101
|
-
.catch(() => undefined);
|
|
102
|
-
}
|
|
103
95
|
import {
|
|
104
96
|
bugReportTitle,
|
|
105
97
|
parseBugReportContext,
|
|
@@ -368,27 +360,30 @@ function permissionGuidance(
|
|
|
368
360
|
return "Browser site permissions are not the blocker here. Open Clips directly in a browser tab, or use an app frame that delegates the selected capture sources.";
|
|
369
361
|
}
|
|
370
362
|
if (isScreenPermissionError(message)) {
|
|
371
|
-
|
|
363
|
+
// The desktop shell hosts the recorder in its own webview, so "open it in a
|
|
364
|
+
// real tab" is not advice a desktop user can act on.
|
|
365
|
+
if (isEmbeddedWindow() && getCaptureHostApp().kind !== "desktop") {
|
|
372
366
|
return "The web client is running Clips inside a frame. Open the recorder in its own tab, then start recording; Chrome can block screen sharing in embedded pages even when macOS access is enabled.";
|
|
373
367
|
}
|
|
374
368
|
if (isMacPlatform()) {
|
|
375
|
-
return
|
|
369
|
+
return `Camera and Microphone can be allowed while macOS still blocks screen capture. ${macPermissionGuidanceFor("screen")}`;
|
|
376
370
|
}
|
|
377
371
|
return "Choose a source in the browser screen picker. If it still fails, check this site's browser permissions and reload Clips.";
|
|
378
372
|
}
|
|
379
373
|
if (isCameraPermissionError(message)) {
|
|
380
374
|
if (isMacPlatform()) {
|
|
381
|
-
return
|
|
375
|
+
return `Allow Camera for this site first. ${macPermissionGuidanceFor("camera")}`;
|
|
382
376
|
}
|
|
383
377
|
return "Open this site's browser settings, allow Camera, then reload Clips.";
|
|
384
378
|
}
|
|
385
379
|
if (isMicrophonePermissionError(message)) {
|
|
386
380
|
if (isMacPlatform()) {
|
|
387
|
-
return
|
|
381
|
+
return `Allow Microphone for this site first. ${macPermissionGuidanceFor("microphone")}`;
|
|
388
382
|
}
|
|
389
383
|
return "Open this site's browser settings, allow Microphone, then reload Clips.";
|
|
390
384
|
}
|
|
391
385
|
if (isMacPlatform()) {
|
|
386
|
+
const host = getCaptureHostApp();
|
|
392
387
|
const labels = getModePermissionLabels(opts?.mode, opts?.micDeviceId);
|
|
393
388
|
if (labels.length > 0) {
|
|
394
389
|
const readable = labels
|
|
@@ -400,9 +395,9 @@ function permissionGuidance(
|
|
|
400
395
|
: "Microphone",
|
|
401
396
|
)
|
|
402
397
|
.join(", ");
|
|
403
|
-
return `Check this site's
|
|
398
|
+
return `Check this site's permissions first. If it still fails, turn on ${host.name} under ${readable} in macOS System Settings > Privacy & Security, then quit and reopen it. Clips is never listed there — macOS grants access to ${host.name}.`;
|
|
404
399
|
}
|
|
405
|
-
return
|
|
400
|
+
return `Check this site's permissions first. If it still fails, turn on ${host.name} in macOS System Settings > Privacy & Security, then quit and reopen it.`;
|
|
406
401
|
}
|
|
407
402
|
return "Open this site's browser settings and allow the selected capture sources, then reload this page.";
|
|
408
403
|
}
|
|
@@ -511,7 +506,7 @@ function friendlyRecordingErrorMessage(error: string): string {
|
|
|
511
506
|
}
|
|
512
507
|
if (isScreenPermissionError(error)) {
|
|
513
508
|
if (isMacPlatform()) {
|
|
514
|
-
return
|
|
509
|
+
return `Clips could not start screen capture. macOS is blocking screen recording for ${getCaptureHostApp().name}.`;
|
|
515
510
|
}
|
|
516
511
|
return "Clips could not start screen capture. Allow screen sharing for this site, then try again.";
|
|
517
512
|
}
|
|
@@ -629,7 +624,10 @@ function RecordingErrorCard({
|
|
|
629
624
|
const permissionError = !uploadFailure && isPermissionError(error);
|
|
630
625
|
const policyError = !uploadFailure && isPolicyPermissionError(error);
|
|
631
626
|
const embeddedScreenError =
|
|
632
|
-
!uploadFailure &&
|
|
627
|
+
!uploadFailure &&
|
|
628
|
+
isEmbeddedWindow() &&
|
|
629
|
+
getCaptureHostApp().kind !== "desktop" &&
|
|
630
|
+
isScreenPermissionError(error);
|
|
633
631
|
const settings = permissionError
|
|
634
632
|
? getModePermissionLabels(mode, micDeviceId)
|
|
635
633
|
: [];
|
|
@@ -766,6 +764,27 @@ export default function RecordRoute() {
|
|
|
766
764
|
const t = useT();
|
|
767
765
|
const navigate = useNavigate();
|
|
768
766
|
const location = useLocation();
|
|
767
|
+
// A clipboard write can be refused (insecure origin, unfocused document, no
|
|
768
|
+
// transient activation). Never let the success toast imply the link was
|
|
769
|
+
// copied when it wasn't — offer a click instead, which restores the user
|
|
770
|
+
// gesture the browser is asking for.
|
|
771
|
+
const showSavedToast = useCallback(
|
|
772
|
+
(message: string, copied: boolean, recordingId: string) => {
|
|
773
|
+
if (copied) {
|
|
774
|
+
toast.success(message, { description: t("recordRoute.linkCopied") });
|
|
775
|
+
return;
|
|
776
|
+
}
|
|
777
|
+
toast.success(message, {
|
|
778
|
+
action: {
|
|
779
|
+
label: t("recordRoute.copyLinkAction"),
|
|
780
|
+
onClick: () => {
|
|
781
|
+
void copyRecordingShareLink(recordingId);
|
|
782
|
+
},
|
|
783
|
+
},
|
|
784
|
+
});
|
|
785
|
+
},
|
|
786
|
+
[t],
|
|
787
|
+
);
|
|
769
788
|
const [uiState, setUiState] = useState<UiState>("idle");
|
|
770
789
|
const [error, setError] = useState<string | null>(null);
|
|
771
790
|
const [isPaused, setIsPaused] = useState(false);
|
|
@@ -1723,8 +1742,13 @@ export default function RecordRoute() {
|
|
|
1723
1742
|
description: t("recordRoute.connectStorageToFinish"),
|
|
1724
1743
|
duration: 12_000,
|
|
1725
1744
|
});
|
|
1745
|
+
} else if (createdId && !reportContext) {
|
|
1746
|
+
showSavedToast(
|
|
1747
|
+
t("recordRoute.videoUploaded"),
|
|
1748
|
+
await copyRecordingShareLink(createdId),
|
|
1749
|
+
createdId,
|
|
1750
|
+
);
|
|
1726
1751
|
} else {
|
|
1727
|
-
if (createdId && !reportContext) await copyRecordingLink(createdId);
|
|
1728
1752
|
toast.success(t("recordRoute.videoUploaded"));
|
|
1729
1753
|
}
|
|
1730
1754
|
if (reportContext && createdId) {
|
|
@@ -1789,7 +1813,7 @@ export default function RecordRoute() {
|
|
|
1789
1813
|
setUploadProgress(null);
|
|
1790
1814
|
}
|
|
1791
1815
|
},
|
|
1792
|
-
[markStorageConfigured, navigate, probeVideoMetadata],
|
|
1816
|
+
[markStorageConfigured, navigate, probeVideoMetadata, showSavedToast],
|
|
1793
1817
|
);
|
|
1794
1818
|
|
|
1795
1819
|
const importLoom = useCallback(
|
|
@@ -1826,9 +1850,17 @@ export default function RecordRoute() {
|
|
|
1826
1850
|
description: t("recordRoute.connectStorageToRetryLoom"),
|
|
1827
1851
|
duration: 12_000,
|
|
1828
1852
|
});
|
|
1853
|
+
} else if (result?.status === "processing") {
|
|
1854
|
+
// The video download + reupload run as a background job (see
|
|
1855
|
+
// import-loom-recording.ts) so this request stays fast regardless of
|
|
1856
|
+
// Loom video length; the recording page polls until it is ready.
|
|
1857
|
+
toast.info(t("recordingPage.importingLoom"));
|
|
1829
1858
|
} else {
|
|
1830
|
-
|
|
1831
|
-
|
|
1859
|
+
showSavedToast(
|
|
1860
|
+
t("recordRoute.loomImported"),
|
|
1861
|
+
await copyRecordingShareLink(recordingId),
|
|
1862
|
+
recordingId,
|
|
1863
|
+
);
|
|
1832
1864
|
}
|
|
1833
1865
|
await writeAppState("navigate", {
|
|
1834
1866
|
view: "recording",
|
|
@@ -1845,7 +1877,7 @@ export default function RecordRoute() {
|
|
|
1845
1877
|
setLoomImporting(false);
|
|
1846
1878
|
}
|
|
1847
1879
|
},
|
|
1848
|
-
[folderIdFromUrl, navigate, spaceIdFromUrl],
|
|
1880
|
+
[folderIdFromUrl, navigate, spaceIdFromUrl, showSavedToast],
|
|
1849
1881
|
);
|
|
1850
1882
|
|
|
1851
1883
|
const saveBrowserDiagnostics = useCallback(
|
|
@@ -1944,7 +1976,14 @@ export default function RecordRoute() {
|
|
|
1944
1976
|
// Stop / upload / navigate.
|
|
1945
1977
|
// -------------------------------------------------------------------------
|
|
1946
1978
|
const finishSavedRecording = useCallback(
|
|
1947
|
-
async (
|
|
1979
|
+
async (
|
|
1980
|
+
recordingId: string,
|
|
1981
|
+
result: RecorderFinalizeResult,
|
|
1982
|
+
// Started by the caller the moment the recording became durable, so the
|
|
1983
|
+
// clipboard write happens closer to the user's stop gesture than to the
|
|
1984
|
+
// end of the post-save bookkeeping.
|
|
1985
|
+
pendingCopy?: Promise<boolean>,
|
|
1986
|
+
) => {
|
|
1948
1987
|
// Recording is fully saved — clear refs so that if anything below throws
|
|
1949
1988
|
// and the user clicks "Try again", doCancel() won't trash a good recording.
|
|
1950
1989
|
pendingRef.current = null;
|
|
@@ -1960,9 +1999,14 @@ export default function RecordRoute() {
|
|
|
1960
1999
|
description: t("recordRoute.connectStorageToFinish"),
|
|
1961
2000
|
duration: 12_000,
|
|
1962
2001
|
});
|
|
1963
|
-
} else {
|
|
1964
|
-
if (!reportContext) await copyRecordingLink(recordingId);
|
|
2002
|
+
} else if (reportContext) {
|
|
1965
2003
|
toast.success(t("recordRoute.recordingSaved"));
|
|
2004
|
+
} else {
|
|
2005
|
+
showSavedToast(
|
|
2006
|
+
t("recordRoute.recordingSaved"),
|
|
2007
|
+
await (pendingCopy ?? copyRecordingShareLink(recordingId)),
|
|
2008
|
+
recordingId,
|
|
2009
|
+
);
|
|
1966
2010
|
}
|
|
1967
2011
|
|
|
1968
2012
|
if (reportContext) {
|
|
@@ -1986,7 +2030,7 @@ export default function RecordRoute() {
|
|
|
1986
2030
|
navigate(`/r/${recordingId}`);
|
|
1987
2031
|
}, 50);
|
|
1988
2032
|
},
|
|
1989
|
-
[navigate],
|
|
2033
|
+
[navigate, showSavedToast],
|
|
1990
2034
|
);
|
|
1991
2035
|
|
|
1992
2036
|
const doStop = useCallback(async () => {
|
|
@@ -2056,8 +2100,15 @@ export default function RecordRoute() {
|
|
|
2056
2100
|
}
|
|
2057
2101
|
|
|
2058
2102
|
const stopResult = await engine.stop();
|
|
2103
|
+
// The recording is durable here; saveBrowserDiagnostics is one more
|
|
2104
|
+
// round trip. Start the clipboard write first so it isn't pushed even
|
|
2105
|
+
// further from the stop gesture that authorized it.
|
|
2106
|
+
const pendingCopy =
|
|
2107
|
+
stopResult.waitingForStorage || bugReportContextRef.current
|
|
2108
|
+
? undefined
|
|
2109
|
+
: copyRecordingShareLink(pending.id).catch(() => false);
|
|
2059
2110
|
await saveBrowserDiagnostics(pending.id);
|
|
2060
|
-
await finishSavedRecording(pending.id, stopResult);
|
|
2111
|
+
await finishSavedRecording(pending.id, stopResult, pendingCopy);
|
|
2061
2112
|
} catch (err) {
|
|
2062
2113
|
const message =
|
|
2063
2114
|
err instanceof Error ? err.message : t("recordRoute.uploadFailed");
|
|
@@ -32,7 +32,13 @@ import {
|
|
|
32
32
|
type LoaderFunctionArgs,
|
|
33
33
|
type MetaFunction,
|
|
34
34
|
} from "react-router";
|
|
35
|
-
import {
|
|
35
|
+
import {
|
|
36
|
+
Link,
|
|
37
|
+
useLoaderData,
|
|
38
|
+
useNavigate,
|
|
39
|
+
useParams,
|
|
40
|
+
useSearchParams,
|
|
41
|
+
} from "react-router";
|
|
36
42
|
import { toast } from "sonner";
|
|
37
43
|
|
|
38
44
|
import { CaptureInstallButton } from "@/components/capture-install-options";
|
|
@@ -41,6 +47,7 @@ import { CommentsPanel } from "@/components/player/comments-panel";
|
|
|
41
47
|
import { RecordingOptionsMenu } from "@/components/player/delete-recording-menu";
|
|
42
48
|
import { InsightsPanel } from "@/components/player/insights-panel";
|
|
43
49
|
import { ReactionsTray } from "@/components/player/reactions-tray";
|
|
50
|
+
import { RecordingViewsBadge } from "@/components/player/recording-views-badge";
|
|
44
51
|
import { ShareRecordingPopover } from "@/components/player/share-dialog";
|
|
45
52
|
import { SignInPromptDialog } from "@/components/player/sign-in-prompt-dialog";
|
|
46
53
|
import { TranscriptPanel } from "@/components/player/transcript-panel";
|
|
@@ -82,6 +89,7 @@ import {
|
|
|
82
89
|
buildSignupAttributionQuery,
|
|
83
90
|
readShareAttribution,
|
|
84
91
|
} from "../../shared/share-attribution";
|
|
92
|
+
import { resolveDashboardRedirect } from "../../shared/share-dashboard-redirect";
|
|
85
93
|
import { privateShareLoaderData } from "../../shared/share-loader-response";
|
|
86
94
|
import {
|
|
87
95
|
buildClipsShareMeta,
|
|
@@ -344,6 +352,7 @@ export default function ShareRoute() {
|
|
|
344
352
|
const loaderData = useLoaderData<typeof loader>() as SharePageLoaderData;
|
|
345
353
|
const { shareId } = useParams<{ shareId: string }>();
|
|
346
354
|
const navigate = useNavigate();
|
|
355
|
+
const [searchParams] = useSearchParams();
|
|
347
356
|
|
|
348
357
|
// Viral attribution: read the `ref`/`via` the visitor arrived on (the tagged
|
|
349
358
|
// share link) so we can fire funnel events and forward attribution into the
|
|
@@ -415,6 +424,7 @@ export default function ShareRoute() {
|
|
|
415
424
|
null,
|
|
416
425
|
);
|
|
417
426
|
const [processingTimeout, setProcessingTimeout] = useState(false);
|
|
427
|
+
const [panel, setPanel] = useState("comments");
|
|
418
428
|
const requireSignIn = useCallback(
|
|
419
429
|
(intent: "comment" | "react") => setSignInIntent(intent),
|
|
420
430
|
[],
|
|
@@ -499,6 +509,10 @@ export default function ShareRoute() {
|
|
|
499
509
|
viewerRole === "admin" ||
|
|
500
510
|
viewerRole === "editor";
|
|
501
511
|
const viewerIsOwner = Boolean(dataQ.data?.data?.viewer?.isOwner);
|
|
512
|
+
const viewerCanOpenDashboard = Boolean(
|
|
513
|
+
dataQ.data?.data?.viewer?.canOpenDashboard,
|
|
514
|
+
);
|
|
515
|
+
const viewCount = Number(dataQ.data?.data?.viewCount ?? 0);
|
|
502
516
|
const showTitleSkeleton = recording
|
|
503
517
|
? shouldShowGeneratedTitleSkeleton(recording, transcriptStatus)
|
|
504
518
|
: false;
|
|
@@ -522,6 +536,21 @@ export default function ShareRoute() {
|
|
|
522
536
|
document.title = clipsSharePageTitle(recording.title);
|
|
523
537
|
}, [recording?.title]);
|
|
524
538
|
|
|
539
|
+
// /share/:id and /r/:id render the same clip, so anyone who can open the
|
|
540
|
+
// authenticated page goes straight there rather than through a redundant
|
|
541
|
+
// "open dashboard" button. `canOpenDashboard` is the server's own
|
|
542
|
+
// `canOpenDirectRecordingPage` verdict; deriving it from the display role
|
|
543
|
+
// instead would bounce viewers between the two routes forever, since /r
|
|
544
|
+
// sends anyone it rejects back here.
|
|
545
|
+
useEffect(() => {
|
|
546
|
+
const target = resolveDashboardRedirect({
|
|
547
|
+
recordingId: recording?.id,
|
|
548
|
+
canOpenDashboard: viewerCanOpenDashboard,
|
|
549
|
+
search: searchParams.toString(),
|
|
550
|
+
});
|
|
551
|
+
if (target) navigate(target, { replace: true });
|
|
552
|
+
}, [viewerCanOpenDashboard, recording?.id, searchParams, navigate]);
|
|
553
|
+
|
|
525
554
|
// The /share/* shell skips DbSyncSetup (and thus useNavigationState), so the
|
|
526
555
|
// agent mounted in the side panel has no navigation context. Write it
|
|
527
556
|
// explicitly for signed-in viewers so view-screen grounds the chat to this
|
|
@@ -809,12 +838,6 @@ export default function ShareRoute() {
|
|
|
809
838
|
{t("sharePage.signInIfYours")}
|
|
810
839
|
</a>
|
|
811
840
|
</Button>
|
|
812
|
-
) : canManageStorage && isFailure ? (
|
|
813
|
-
<Button asChild size="sm">
|
|
814
|
-
<a href={appPath(`/r/${recording.id}`)}>
|
|
815
|
-
{t("sharePage.openDashboard")}
|
|
816
|
-
</a>
|
|
817
|
-
</Button>
|
|
818
841
|
) : null}
|
|
819
842
|
<Button
|
|
820
843
|
onClick={() => {
|
|
@@ -866,19 +889,13 @@ export default function ShareRoute() {
|
|
|
866
889
|
</div>
|
|
867
890
|
|
|
868
891
|
<div className="flex w-full min-w-0 flex-wrap items-center justify-between gap-2 sm:w-auto sm:justify-end">
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
{t("sharePage.openDashboard")}
|
|
877
|
-
</span>
|
|
878
|
-
<IconExternalLink className="h-3.5 w-3.5 shrink-0" />
|
|
879
|
-
</a>
|
|
880
|
-
</Button>
|
|
881
|
-
) : session ? null : (
|
|
892
|
+
<RecordingViewsBadge
|
|
893
|
+
recordingId={recording.id}
|
|
894
|
+
viewCount={viewCount}
|
|
895
|
+
canViewDetails={viewerCanEdit}
|
|
896
|
+
onOpenInsights={() => setPanel("insights")}
|
|
897
|
+
/>
|
|
898
|
+
{session ? null : (
|
|
882
899
|
<Button variant="ghost" size="sm" asChild>
|
|
883
900
|
<a
|
|
884
901
|
href={appPath("/")}
|
|
@@ -984,16 +1001,6 @@ export default function ShareRoute() {
|
|
|
984
1001
|
|
|
985
1002
|
<div className="flex shrink-0 flex-col gap-3 px-4 pb-4 sm:flex-row sm:items-start sm:px-0 sm:pb-0">
|
|
986
1003
|
<div className="min-w-0 flex-1">
|
|
987
|
-
{showTitleSkeleton ? (
|
|
988
|
-
<Skeleton
|
|
989
|
-
aria-label={t("sharePage.generatingTitle")}
|
|
990
|
-
className="h-5 w-72 max-w-full"
|
|
991
|
-
/>
|
|
992
|
-
) : (
|
|
993
|
-
<h2 className="break-words text-base font-semibold leading-tight">
|
|
994
|
-
{visibleTitle}
|
|
995
|
-
</h2>
|
|
996
|
-
)}
|
|
997
1004
|
{recording.description ? (
|
|
998
1005
|
<p className="whitespace-pre-wrap break-words text-sm text-muted-foreground">
|
|
999
1006
|
{recording.description}
|
|
@@ -1058,7 +1065,11 @@ export default function ShareRoute() {
|
|
|
1058
1065
|
</div>
|
|
1059
1066
|
|
|
1060
1067
|
<aside className="flex min-h-[420px] w-full min-w-0 shrink-0 flex-col border-t border-border bg-background lg:min-h-0 lg:w-[380px] lg:border-s lg:border-t-0">
|
|
1061
|
-
<Tabs
|
|
1068
|
+
<Tabs
|
|
1069
|
+
value={panel}
|
|
1070
|
+
onValueChange={setPanel}
|
|
1071
|
+
className="flex h-full flex-col"
|
|
1072
|
+
>
|
|
1062
1073
|
<TabsList className="mx-3 mt-3 grid w-auto grid-cols-4">
|
|
1063
1074
|
<TabsTrigger value="comments" className="text-xs gap-1">
|
|
1064
1075
|
{t("recordingPage.activity")}
|