@agent-native/core 0.90.2 → 0.90.3
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 +12 -0
- package/corpus/core/docs/content/agent-native-toolkit.mdx +87 -80
- package/corpus/core/docs/content/locales/ar-SA/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/de-DE/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/es-ES/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/fr-FR/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/hi-IN/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/ja-JP/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/ko-KR/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/pt-BR/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/zh-CN/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/zh-TW/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/toolkit-agent-ux.mdx +43 -0
- package/corpus/core/docs/content/toolkit-app-adapters.mdx +9 -0
- package/corpus/core/docs/content/toolkit-collaboration-ui.mdx +12 -0
- package/corpus/core/docs/content/toolkit-collaboration.mdx +74 -0
- package/corpus/core/docs/content/toolkit-command-navigation.mdx +106 -0
- package/corpus/core/docs/content/toolkit-comments-review.mdx +98 -0
- package/corpus/core/docs/content/toolkit-history.mdx +95 -0
- package/corpus/core/docs/content/toolkit-observability.mdx +41 -0
- package/corpus/core/docs/content/toolkit-org-team.mdx +80 -0
- package/corpus/core/docs/content/toolkit-resources.mdx +57 -0
- package/corpus/core/docs/content/toolkit-settings.mdx +65 -0
- package/corpus/core/docs/content/toolkit-setup-connections.mdx +109 -0
- package/corpus/core/docs/content/toolkit-sharing-ui.mdx +18 -6
- package/corpus/core/docs/content/toolkit-sharing.mdx +81 -0
- package/corpus/core/docs/content/toolkit-shell-hooks.mdx +9 -0
- package/corpus/core/docs/content/toolkit-ui.mdx +9 -0
- package/corpus/core/package.json +35 -1
- package/corpus/core/src/agent/engine/ai-sdk-engine.ts +19 -1
- package/corpus/core/src/agent/engine/anthropic-engine.ts +25 -1
- package/corpus/core/src/agent/engine/registry.ts +23 -16
- package/corpus/core/src/agent/production-agent.ts +37 -6
- package/corpus/core/src/client/command-navigation/index.ts +15 -0
- package/corpus/core/src/client/comments-review/index.ts +1 -0
- package/corpus/core/src/client/history/VersionHistoryPanel.tsx +145 -0
- package/corpus/core/src/client/history/index.ts +18 -0
- package/corpus/core/src/client/history/use-history.ts +86 -0
- package/corpus/core/src/client/index.ts +76 -9
- package/corpus/core/src/client/org/OrgSwitcher.tsx +6 -6
- package/corpus/core/src/client/org/RequireActiveOrg.tsx +2 -2
- package/corpus/core/src/client/org/TeamPage.tsx +3 -3
- package/corpus/core/src/client/org/hooks.ts +32 -0
- package/corpus/core/src/client/org/index.ts +30 -1
- package/corpus/core/src/client/org-team/index.ts +1 -0
- package/corpus/core/src/client/review/ReviewStatusBadge.tsx +39 -0
- package/corpus/core/src/client/review/ReviewThreadPanel.tsx +278 -0
- package/corpus/core/src/client/review/index.ts +25 -0
- package/corpus/core/src/client/review/use-review.ts +114 -0
- package/corpus/core/src/client/settings/index.ts +11 -1
- package/corpus/core/src/client/setup-connections/BuilderConnectCard.tsx +94 -0
- package/corpus/core/src/client/setup-connections/ProviderReadinessBadge.tsx +73 -0
- package/corpus/core/src/client/setup-connections/SetupConnectionsPage.tsx +94 -0
- package/corpus/core/src/client/setup-connections/index.ts +46 -0
- package/corpus/core/src/client/sharing/ShareButton.tsx +20 -14
- package/corpus/core/src/client/sharing/ShareDialog.tsx +3 -3
- package/corpus/core/src/command-navigation/actions.ts +100 -0
- package/corpus/core/src/command-navigation/index.ts +12 -0
- package/corpus/core/src/comments-review/index.ts +1 -0
- package/corpus/core/src/file-upload/builder.ts +24 -3
- package/corpus/core/src/file-upload/types.ts +3 -1
- package/corpus/core/src/history/actions/create-resource-version.ts +89 -0
- package/corpus/core/src/history/actions/get-resource-version.ts +60 -0
- package/corpus/core/src/history/actions/list-resource-history.ts +53 -0
- package/corpus/core/src/history/actions/list-resource-versions.ts +43 -0
- package/corpus/core/src/history/actions/restore-resource-version.ts +96 -0
- package/corpus/core/src/history/index.ts +27 -0
- package/corpus/core/src/history/registry.ts +99 -0
- package/corpus/core/src/history/store.ts +348 -0
- package/corpus/core/src/history/types.ts +69 -0
- package/corpus/core/src/index.ts +10 -0
- package/corpus/core/src/navigation/index.ts +170 -0
- package/corpus/core/src/org/index.ts +8 -0
- package/corpus/core/src/org/permissions.ts +30 -0
- package/corpus/core/src/org-team/index.ts +1 -0
- package/corpus/core/src/private-blob/registry.ts +1 -0
- package/corpus/core/src/review/actions/consume-review-feedback.ts +38 -0
- package/corpus/core/src/review/actions/create-review-comment.ts +107 -0
- package/corpus/core/src/review/actions/delete-review-comment.ts +55 -0
- package/corpus/core/src/review/actions/get-review-feedback.ts +54 -0
- package/corpus/core/src/review/actions/list-review-comments.ts +53 -0
- package/corpus/core/src/review/actions/reply-review-comment.ts +107 -0
- package/corpus/core/src/review/actions/resolve-review-thread.ts +60 -0
- package/corpus/core/src/review/actions/set-review-status.ts +58 -0
- package/corpus/core/src/review/index.ts +36 -0
- package/corpus/core/src/review/mentions.ts +44 -0
- package/corpus/core/src/review/registry.ts +99 -0
- package/corpus/core/src/review/store.ts +687 -0
- package/corpus/core/src/review/types.ts +97 -0
- package/corpus/core/src/server/action-discovery.ts +54 -0
- package/corpus/core/src/server/agent-engine-api-key-route.ts +5 -0
- package/corpus/core/src/server/credential-provider.ts +108 -0
- package/corpus/core/src/setup-connections/index.ts +89 -0
- package/corpus/core/src/setup-connections/onboarding.ts +47 -0
- package/corpus/core/src/transcription/builder-transcription.ts +9 -2
- package/corpus/core/src/vite/action-types-plugin.ts +52 -0
- package/corpus/templates/analytics/app/components/layout/Layout.tsx +2 -1
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +2 -2
- package/corpus/templates/analytics/app/global.css +22 -10
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +6 -1
- package/corpus/templates/analytics/app/i18n-data.ts +81 -13
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +2 -2
- package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +2 -2
- package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +528 -108
- package/corpus/templates/analytics/app/pages/sessions/SessionDevToolsPanel.tsx +466 -183
- package/corpus/templates/analytics/changelog/2026-07-07-session-replays-load-sooner-show-clearer-activity-timelines-.md +6 -0
- package/corpus/templates/brain/app/routes/settings.tsx +2 -2
- package/corpus/templates/calendar/app/components/calendar/AttendeeAutocomplete.tsx +32 -6
- package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +120 -40
- package/corpus/templates/calendar/app/hooks/use-people.ts +55 -0
- package/corpus/templates/calendar/changelog/2026-07-07-guest-suggestions-now-find-coworkers-from-your-google-worksp.md +6 -0
- package/corpus/templates/calendar/changelog/2026-07-07-zoom-stays-selected-after-connecting-it-from-a-draft-event.md +6 -0
- package/corpus/templates/clips/actions/create-recording.ts +5 -1
- package/corpus/templates/clips/actions/finalize-recording.ts +140 -1
- package/corpus/templates/clips/actions/import-loom-recording.ts +1 -0
- package/corpus/templates/clips/actions/lib/ensure-seekable-video.ts +1 -0
- package/corpus/templates/clips/actions/request-transcript.ts +31 -0
- package/corpus/templates/clips/actions/set-thumbnail.ts +2 -0
- package/corpus/templates/clips/app/components/library/organization-switcher.tsx +2 -2
- package/corpus/templates/clips/app/components/player/scrubber-position.ts +9 -0
- package/corpus/templates/clips/app/components/player/scrubber.tsx +5 -2
- package/corpus/templates/clips/app/components/player/share-dialog.tsx +69 -41
- package/corpus/templates/clips/app/components/player/video-player.tsx +38 -1
- package/corpus/templates/clips/app/components/sharing/share-ui.tsx +3 -3
- package/corpus/templates/clips/app/components/sharing/slack-share-hint.tsx +9 -19
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +9 -3
- package/corpus/templates/clips/app/routes/record.tsx +21 -12
- package/corpus/templates/clips/changelog/2026-07-02-recordings-now-wait-for-storage-media-to-serve-before-finishing.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-a-pending-app-update-no-longer-blocks-screen-recording-updat.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-chrome-extension-recordings-keep-audio-after-refreshing-tab.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-clip-playback-progress-now-starts-and-finishes-at-the-right-times.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-sharing-public-clips-now-stays-focused-on-the-normal-link-wi.md +6 -0
- package/corpus/templates/clips/chrome-extension/src/background.ts +18 -0
- package/corpus/templates/clips/chrome-extension/src/offscreen.ts +23 -8
- package/corpus/templates/clips/desktop/src/app.tsx +40 -3
- package/corpus/templates/clips/desktop/src/hooks/useMediaDevices.ts +19 -7
- package/corpus/templates/clips/desktop/src/lib/permissions.ts +2 -0
- package/corpus/templates/clips/desktop/src/lib/updater.ts +25 -2
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +7 -0
- package/corpus/templates/clips/server/routes/api/recordings/[recordingId]/thumbnail.post.ts +1 -0
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/abort.post.ts +22 -5
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +8 -0
- package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +13 -6
- package/corpus/templates/clips/shared/finalize-recovery.ts +12 -0
- package/corpus/templates/content/actions/delete-document.ts +337 -52
- package/corpus/templates/content/changelog/2026-07-07-permanently-deleting-trashed-databases-now-finishes-reliably.md +6 -0
- package/corpus/templates/slides/app/pages/DeckEditor.tsx +2 -2
- package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.js +15 -1
- 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 +20 -1
- package/dist/agent/engine/anthropic-engine.js.map +1 -1
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js +22 -14
- package/dist/agent/engine/registry.js.map +1 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +27 -7
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/client/command-navigation/index.d.ts +4 -0
- package/dist/client/command-navigation/index.d.ts.map +1 -0
- package/dist/client/command-navigation/index.js +4 -0
- package/dist/client/command-navigation/index.js.map +1 -0
- package/dist/client/comments-review/index.d.ts +2 -0
- package/dist/client/comments-review/index.d.ts.map +1 -0
- package/dist/client/comments-review/index.js +2 -0
- package/dist/client/comments-review/index.js.map +1 -0
- package/dist/client/history/VersionHistoryPanel.d.ts +18 -0
- package/dist/client/history/VersionHistoryPanel.d.ts.map +1 -0
- package/dist/client/history/VersionHistoryPanel.js +24 -0
- package/dist/client/history/VersionHistoryPanel.js.map +1 -0
- package/dist/client/history/index.d.ts +3 -0
- package/dist/client/history/index.d.ts.map +1 -0
- package/dist/client/history/index.js +3 -0
- package/dist/client/history/index.js.map +1 -0
- package/dist/client/history/use-history.d.ts +46 -0
- package/dist/client/history/use-history.d.ts.map +1 -0
- package/dist/client/history/use-history.js +18 -0
- package/dist/client/history/use-history.js.map +1 -0
- package/dist/client/index.d.ts +6 -4
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +6 -4
- package/dist/client/index.js.map +1 -1
- package/dist/client/org/OrgSwitcher.js +5 -5
- package/dist/client/org/OrgSwitcher.js.map +1 -1
- package/dist/client/org/RequireActiveOrg.js +2 -2
- package/dist/client/org/RequireActiveOrg.js.map +1 -1
- package/dist/client/org/TeamPage.js +3 -3
- package/dist/client/org/TeamPage.js.map +1 -1
- package/dist/client/org/hooks.d.ts +12 -1
- package/dist/client/org/hooks.d.ts.map +1 -1
- package/dist/client/org/hooks.js +15 -0
- package/dist/client/org/hooks.js.map +1 -1
- package/dist/client/org/index.d.ts +4 -2
- package/dist/client/org/index.d.ts.map +1 -1
- package/dist/client/org/index.js +3 -1
- package/dist/client/org/index.js.map +1 -1
- package/dist/client/org-team/index.d.ts +2 -0
- package/dist/client/org-team/index.d.ts.map +1 -0
- package/dist/client/org-team/index.js +2 -0
- package/dist/client/org-team/index.js.map +1 -0
- package/dist/client/review/ReviewStatusBadge.d.ts +7 -0
- package/dist/client/review/ReviewStatusBadge.d.ts.map +1 -0
- package/dist/client/review/ReviewStatusBadge.js +19 -0
- package/dist/client/review/ReviewStatusBadge.js.map +1 -0
- package/dist/client/review/ReviewThreadPanel.d.ts +20 -0
- package/dist/client/review/ReviewThreadPanel.d.ts.map +1 -0
- package/dist/client/review/ReviewThreadPanel.js +84 -0
- package/dist/client/review/ReviewThreadPanel.js.map +1 -0
- package/dist/client/review/index.d.ts +4 -0
- package/dist/client/review/index.d.ts.map +1 -0
- package/dist/client/review/index.js +4 -0
- package/dist/client/review/index.js.map +1 -0
- package/dist/client/review/use-review.d.ts +68 -0
- package/dist/client/review/use-review.d.ts.map +1 -0
- package/dist/client/review/use-review.js +22 -0
- package/dist/client/review/use-review.js.map +1 -0
- 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 +1 -1
- package/dist/client/settings/index.js.map +1 -1
- package/dist/client/setup-connections/BuilderConnectCard.d.ts +9 -0
- package/dist/client/setup-connections/BuilderConnectCard.d.ts.map +1 -0
- package/dist/client/setup-connections/BuilderConnectCard.js +25 -0
- package/dist/client/setup-connections/BuilderConnectCard.js.map +1 -0
- package/dist/client/setup-connections/ProviderReadinessBadge.d.ts +8 -0
- package/dist/client/setup-connections/ProviderReadinessBadge.d.ts.map +1 -0
- package/dist/client/setup-connections/ProviderReadinessBadge.js +32 -0
- package/dist/client/setup-connections/ProviderReadinessBadge.js.map +1 -0
- package/dist/client/setup-connections/SetupConnectionsPage.d.ts +17 -0
- package/dist/client/setup-connections/SetupConnectionsPage.d.ts.map +1 -0
- package/dist/client/setup-connections/SetupConnectionsPage.js +10 -0
- package/dist/client/setup-connections/SetupConnectionsPage.js.map +1 -0
- package/dist/client/setup-connections/index.d.ts +7 -0
- package/dist/client/setup-connections/index.d.ts.map +1 -0
- package/dist/client/setup-connections/index.js +7 -0
- package/dist/client/setup-connections/index.js.map +1 -0
- package/dist/client/sharing/ShareButton.d.ts +4 -4
- package/dist/client/sharing/ShareButton.d.ts.map +1 -1
- package/dist/client/sharing/ShareButton.js +13 -7
- package/dist/client/sharing/ShareButton.js.map +1 -1
- package/dist/client/sharing/ShareDialog.js +3 -3
- package/dist/client/sharing/ShareDialog.js.map +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/command-navigation/actions.d.ts +25 -0
- package/dist/command-navigation/actions.d.ts.map +1 -0
- package/dist/command-navigation/actions.js +64 -0
- package/dist/command-navigation/actions.js.map +1 -0
- package/dist/command-navigation/index.d.ts +4 -0
- package/dist/command-navigation/index.d.ts.map +1 -0
- package/dist/command-navigation/index.js +4 -0
- package/dist/command-navigation/index.js.map +1 -0
- package/dist/comments-review/index.d.ts +2 -0
- package/dist/comments-review/index.d.ts.map +1 -0
- package/dist/comments-review/index.js +2 -0
- package/dist/comments-review/index.js.map +1 -0
- package/dist/file-upload/builder.d.ts.map +1 -1
- package/dist/file-upload/builder.js +18 -2
- package/dist/file-upload/builder.js.map +1 -1
- package/dist/file-upload/types.d.ts +3 -0
- package/dist/file-upload/types.d.ts.map +1 -1
- package/dist/file-upload/types.js.map +1 -1
- package/dist/history/actions/create-resource-version.d.ts +10 -0
- package/dist/history/actions/create-resource-version.d.ts.map +1 -0
- package/dist/history/actions/create-resource-version.js +65 -0
- package/dist/history/actions/create-resource-version.js.map +1 -0
- package/dist/history/actions/get-resource-version.d.ts +10 -0
- package/dist/history/actions/get-resource-version.d.ts.map +1 -0
- package/dist/history/actions/get-resource-version.js +38 -0
- package/dist/history/actions/get-resource-version.js.map +1 -0
- package/dist/history/actions/list-resource-history.d.ts +10 -0
- package/dist/history/actions/list-resource-history.d.ts.map +1 -0
- package/dist/history/actions/list-resource-history.js +45 -0
- package/dist/history/actions/list-resource-history.js.map +1 -0
- package/dist/history/actions/list-resource-versions.d.ts +10 -0
- package/dist/history/actions/list-resource-versions.d.ts.map +1 -0
- package/dist/history/actions/list-resource-versions.js +35 -0
- package/dist/history/actions/list-resource-versions.js.map +1 -0
- package/dist/history/actions/restore-resource-version.d.ts +11 -0
- package/dist/history/actions/restore-resource-version.d.ts.map +1 -0
- package/dist/history/actions/restore-resource-version.js +59 -0
- package/dist/history/actions/restore-resource-version.js.map +1 -0
- package/dist/history/index.d.ts +4 -0
- package/dist/history/index.d.ts.map +1 -0
- package/dist/history/index.js +3 -0
- package/dist/history/index.js.map +1 -0
- package/dist/history/registry.d.ts +10 -0
- package/dist/history/registry.d.ts.map +1 -0
- package/dist/history/registry.js +61 -0
- package/dist/history/registry.js.map +1 -0
- package/dist/history/store.d.ts +34 -0
- package/dist/history/store.d.ts.map +1 -0
- package/dist/history/store.js +265 -0
- package/dist/history/store.js.map +1 -0
- package/dist/history/types.d.ts +55 -0
- package/dist/history/types.d.ts.map +1 -0
- package/dist/history/types.js +2 -0
- package/dist/history/types.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/navigation/index.d.ts +53 -0
- package/dist/navigation/index.d.ts.map +1 -0
- package/dist/navigation/index.js +105 -0
- package/dist/navigation/index.js.map +1 -0
- 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/permissions.d.ts +7 -0
- package/dist/org/permissions.d.ts.map +1 -0
- package/dist/org/permissions.js +21 -0
- package/dist/org/permissions.js.map +1 -0
- package/dist/org-team/index.d.ts +2 -0
- package/dist/org-team/index.d.ts.map +1 -0
- package/dist/org-team/index.js +2 -0
- package/dist/org-team/index.js.map +1 -0
- package/dist/private-blob/registry.d.ts.map +1 -1
- package/dist/private-blob/registry.js +1 -0
- package/dist/private-blob/registry.js.map +1 -1
- package/dist/resources/handlers.d.ts +2 -2
- package/dist/review/actions/consume-review-feedback.d.ts +9 -0
- package/dist/review/actions/consume-review-feedback.d.ts.map +1 -0
- package/dist/review/actions/consume-review-feedback.js +29 -0
- package/dist/review/actions/consume-review-feedback.js.map +1 -0
- package/dist/review/actions/create-review-comment.d.ts +18 -0
- package/dist/review/actions/create-review-comment.d.ts.map +1 -0
- package/dist/review/actions/create-review-comment.js +81 -0
- package/dist/review/actions/create-review-comment.js.map +1 -0
- package/dist/review/actions/delete-review-comment.d.ts +10 -0
- package/dist/review/actions/delete-review-comment.d.ts.map +1 -0
- package/dist/review/actions/delete-review-comment.js +45 -0
- package/dist/review/actions/delete-review-comment.js.map +1 -0
- package/dist/review/actions/get-review-feedback.d.ts +10 -0
- package/dist/review/actions/get-review-feedback.d.ts.map +1 -0
- package/dist/review/actions/get-review-feedback.js +45 -0
- package/dist/review/actions/get-review-feedback.js.map +1 -0
- package/dist/review/actions/list-review-comments.d.ts +13 -0
- package/dist/review/actions/list-review-comments.d.ts.map +1 -0
- package/dist/review/actions/list-review-comments.js +44 -0
- package/dist/review/actions/list-review-comments.js.map +1 -0
- package/dist/review/actions/reply-review-comment.d.ts +16 -0
- package/dist/review/actions/reply-review-comment.d.ts.map +1 -0
- package/dist/review/actions/reply-review-comment.js +84 -0
- package/dist/review/actions/reply-review-comment.js.map +1 -0
- package/dist/review/actions/resolve-review-thread.d.ts +11 -0
- package/dist/review/actions/resolve-review-thread.d.ts.map +1 -0
- package/dist/review/actions/resolve-review-thread.js +46 -0
- package/dist/review/actions/resolve-review-thread.js.map +1 -0
- package/dist/review/actions/set-review-status.d.ts +9 -0
- package/dist/review/actions/set-review-status.d.ts.map +1 -0
- package/dist/review/actions/set-review-status.js +43 -0
- package/dist/review/actions/set-review-status.js.map +1 -0
- package/dist/review/index.d.ts +5 -0
- package/dist/review/index.d.ts.map +1 -0
- package/dist/review/index.js +4 -0
- package/dist/review/index.js.map +1 -0
- package/dist/review/mentions.d.ts +4 -0
- package/dist/review/mentions.d.ts.map +1 -0
- package/dist/review/mentions.js +39 -0
- package/dist/review/mentions.js.map +1 -0
- package/dist/review/registry.d.ts +10 -0
- package/dist/review/registry.d.ts.map +1 -0
- package/dist/review/registry.js +61 -0
- package/dist/review/registry.js.map +1 -0
- package/dist/review/store.d.ts +63 -0
- package/dist/review/store.d.ts.map +1 -0
- package/dist/review/store.js +558 -0
- package/dist/review/store.js.map +1 -0
- package/dist/review/types.d.ts +77 -0
- package/dist/review/types.d.ts.map +1 -0
- package/dist/review/types.js +2 -0
- package/dist/review/types.js.map +1 -0
- package/dist/server/action-discovery.d.ts.map +1 -1
- package/dist/server/action-discovery.js +54 -0
- package/dist/server/action-discovery.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts.map +1 -1
- package/dist/server/agent-engine-api-key-route.js +5 -0
- package/dist/server/agent-engine-api-key-route.js.map +1 -1
- package/dist/server/credential-provider.d.ts +26 -0
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +82 -0
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/setup-connections/index.d.ts +6 -0
- package/dist/setup-connections/index.d.ts.map +1 -0
- package/dist/setup-connections/index.js +6 -0
- package/dist/setup-connections/index.js.map +1 -0
- package/dist/setup-connections/onboarding.d.ts +14 -0
- package/dist/setup-connections/onboarding.d.ts.map +1 -0
- package/dist/setup-connections/onboarding.js +23 -0
- package/dist/setup-connections/onboarding.js.map +1 -0
- package/dist/transcription/builder-transcription.d.ts +1 -0
- package/dist/transcription/builder-transcription.d.ts.map +1 -1
- package/dist/transcription/builder-transcription.js +5 -2
- package/dist/transcription/builder-transcription.js.map +1 -1
- package/dist/vite/action-types-plugin.d.ts.map +1 -1
- package/dist/vite/action-types-plugin.js +52 -0
- package/dist/vite/action-types-plugin.js.map +1 -1
- package/docs/content/agent-native-toolkit.mdx +87 -80
- package/docs/content/locales/ar-SA/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/de-DE/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/es-ES/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/fr-FR/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/hi-IN/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/ja-JP/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/ko-KR/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/pt-BR/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/zh-CN/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/zh-TW/agent-native-toolkit.mdx +89 -80
- package/docs/content/toolkit-agent-ux.mdx +43 -0
- package/docs/content/toolkit-app-adapters.mdx +9 -0
- package/docs/content/toolkit-collaboration-ui.mdx +12 -0
- package/docs/content/toolkit-collaboration.mdx +74 -0
- package/docs/content/toolkit-command-navigation.mdx +106 -0
- package/docs/content/toolkit-comments-review.mdx +98 -0
- package/docs/content/toolkit-history.mdx +95 -0
- package/docs/content/toolkit-observability.mdx +41 -0
- package/docs/content/toolkit-org-team.mdx +80 -0
- package/docs/content/toolkit-resources.mdx +57 -0
- package/docs/content/toolkit-settings.mdx +65 -0
- package/docs/content/toolkit-setup-connections.mdx +109 -0
- package/docs/content/toolkit-sharing-ui.mdx +18 -6
- package/docs/content/toolkit-sharing.mdx +81 -0
- package/docs/content/toolkit-shell-hooks.mdx +9 -0
- package/docs/content/toolkit-ui.mdx +9 -0
- package/package.json +36 -2
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
IconChevronDown,
|
|
9
9
|
IconCheck,
|
|
10
10
|
IconPlus,
|
|
11
|
-
|
|
11
|
+
IconUsersGroup,
|
|
12
12
|
} from "@tabler/icons-react";
|
|
13
13
|
import { useState } from "react";
|
|
14
14
|
import { toast } from "sonner";
|
|
@@ -86,7 +86,7 @@ export function OrganizationSwitcher({ className }: OrganizationSwitcherProps) {
|
|
|
86
86
|
</DropdownMenuLabel>
|
|
87
87
|
{orgs.length === 0 && (
|
|
88
88
|
<DropdownMenuItem disabled>
|
|
89
|
-
<
|
|
89
|
+
<IconUsersGroup className="h-3.5 w-3.5 me-2" />
|
|
90
90
|
<span className="text-xs">
|
|
91
91
|
{t("organizationSwitcher.noOrganizations")}
|
|
92
92
|
</span>
|
|
@@ -12,3 +12,12 @@ export function scrubberPositionFromClientX(
|
|
|
12
12
|
const ratio = rect.width > 0 ? x / rect.width : 0;
|
|
13
13
|
return { ms: Math.floor(ratio * durationMs), x };
|
|
14
14
|
}
|
|
15
|
+
|
|
16
|
+
export function scrubberFillPercent(
|
|
17
|
+
currentMs: number,
|
|
18
|
+
durationMs: number,
|
|
19
|
+
): number {
|
|
20
|
+
if (!Number.isFinite(currentMs) || !Number.isFinite(durationMs)) return 0;
|
|
21
|
+
if (durationMs <= 0) return 0;
|
|
22
|
+
return Math.max(0, Math.min(100, (currentMs / durationMs) * 100));
|
|
23
|
+
}
|
|
@@ -2,7 +2,10 @@ import { useMemo, useRef, useState } from "react";
|
|
|
2
2
|
|
|
3
3
|
import { cn } from "@/lib/utils";
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
scrubberFillPercent,
|
|
7
|
+
scrubberPositionFromClientX,
|
|
8
|
+
} from "./scrubber-position";
|
|
6
9
|
|
|
7
10
|
export interface ScrubberProps {
|
|
8
11
|
currentMs: number;
|
|
@@ -35,7 +38,7 @@ export function Scrubber(props: ScrubberProps) {
|
|
|
35
38
|
| null
|
|
36
39
|
>(null);
|
|
37
40
|
|
|
38
|
-
const pct =
|
|
41
|
+
const pct = scrubberFillPercent(currentMs, durationMs);
|
|
39
42
|
|
|
40
43
|
const recentReactions = useMemo(
|
|
41
44
|
() => (reactions ? reactions.slice(-50) : []),
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
} from "@agent-native/core/client";
|
|
8
8
|
import {
|
|
9
9
|
IconCode,
|
|
10
|
+
IconChevronDown,
|
|
10
11
|
IconExternalLink,
|
|
11
12
|
IconLink,
|
|
12
13
|
IconMail,
|
|
@@ -34,6 +35,11 @@ import {
|
|
|
34
35
|
} from "@/components/sharing/share-ui";
|
|
35
36
|
import { SlackShareHint } from "@/components/sharing/slack-share-hint";
|
|
36
37
|
import { Button } from "@/components/ui/button";
|
|
38
|
+
import {
|
|
39
|
+
Collapsible,
|
|
40
|
+
CollapsibleContent,
|
|
41
|
+
CollapsibleTrigger,
|
|
42
|
+
} from "@/components/ui/collapsible";
|
|
37
43
|
import { Dialog, DialogContent, DialogTitle } from "@/components/ui/dialog";
|
|
38
44
|
import { Input } from "@/components/ui/input";
|
|
39
45
|
import { Label } from "@/components/ui/label";
|
|
@@ -87,7 +93,6 @@ export function ShareRecordingPopover({
|
|
|
87
93
|
videoUrl,
|
|
88
94
|
animatedThumbnailUrl,
|
|
89
95
|
isLoomRecording = false,
|
|
90
|
-
hasPassword = false,
|
|
91
96
|
children,
|
|
92
97
|
open,
|
|
93
98
|
onOpenChange,
|
|
@@ -106,7 +111,6 @@ export function ShareRecordingPopover({
|
|
|
106
111
|
videoUrl={videoUrl}
|
|
107
112
|
animatedThumbnailUrl={animatedThumbnailUrl}
|
|
108
113
|
isLoomRecording={isLoomRecording}
|
|
109
|
-
hasPassword={hasPassword}
|
|
110
114
|
/>
|
|
111
115
|
</PopoverContent>
|
|
112
116
|
</Popover>
|
|
@@ -124,7 +128,6 @@ export function ShareRecordingDialog({
|
|
|
124
128
|
videoUrl,
|
|
125
129
|
animatedThumbnailUrl,
|
|
126
130
|
isLoomRecording = false,
|
|
127
|
-
hasPassword = false,
|
|
128
131
|
open,
|
|
129
132
|
onOpenChange,
|
|
130
133
|
}: ShareRecordingDialogProps) {
|
|
@@ -143,7 +146,6 @@ export function ShareRecordingDialog({
|
|
|
143
146
|
videoUrl={videoUrl}
|
|
144
147
|
animatedThumbnailUrl={animatedThumbnailUrl}
|
|
145
148
|
isLoomRecording={isLoomRecording}
|
|
146
|
-
hasPassword={hasPassword}
|
|
147
149
|
reserveCloseButton
|
|
148
150
|
/>
|
|
149
151
|
</DialogContent>
|
|
@@ -157,7 +159,6 @@ function ShareRecordingContent({
|
|
|
157
159
|
videoUrl,
|
|
158
160
|
animatedThumbnailUrl,
|
|
159
161
|
isLoomRecording = false,
|
|
160
|
-
hasPassword = false,
|
|
161
162
|
reserveCloseButton = false,
|
|
162
163
|
}: {
|
|
163
164
|
recordingId: string;
|
|
@@ -165,7 +166,6 @@ function ShareRecordingContent({
|
|
|
165
166
|
videoUrl?: string | null;
|
|
166
167
|
animatedThumbnailUrl?: string | null;
|
|
167
168
|
isLoomRecording?: boolean;
|
|
168
|
-
hasPassword?: boolean;
|
|
169
169
|
reserveCloseButton?: boolean;
|
|
170
170
|
}) {
|
|
171
171
|
const t = useT();
|
|
@@ -230,7 +230,6 @@ function ShareRecordingContent({
|
|
|
230
230
|
videoUrl={videoUrl}
|
|
231
231
|
animatedThumbnailUrl={animatedThumbnailUrl}
|
|
232
232
|
isLoomRecording={isLoomRecording}
|
|
233
|
-
hasPassword={hasPassword}
|
|
234
233
|
/>
|
|
235
234
|
</TabsContent>
|
|
236
235
|
|
|
@@ -269,7 +268,6 @@ function LinkTab({
|
|
|
269
268
|
videoUrl,
|
|
270
269
|
animatedThumbnailUrl,
|
|
271
270
|
isLoomRecording: isLoomRecordingProp,
|
|
272
|
-
hasPassword,
|
|
273
271
|
}: {
|
|
274
272
|
recordingId: string;
|
|
275
273
|
shareUrl: string;
|
|
@@ -278,7 +276,6 @@ function LinkTab({
|
|
|
278
276
|
videoUrl?: string | null;
|
|
279
277
|
animatedThumbnailUrl?: string | null;
|
|
280
278
|
isLoomRecording?: boolean;
|
|
281
|
-
hasPassword: boolean;
|
|
282
279
|
}) {
|
|
283
280
|
const t = useT();
|
|
284
281
|
const { setResourceVisibility, isPending } = useResourceVisibilityMutation(
|
|
@@ -299,6 +296,7 @@ function LinkTab({
|
|
|
299
296
|
const agentLinkRequestIdRef = useRef(0);
|
|
300
297
|
const [agentContextUrl, setAgentContextUrl] = useState("");
|
|
301
298
|
const [agentLinkError, setAgentLinkError] = useState(false);
|
|
299
|
+
const [agentShareOpen, setAgentShareOpen] = useState(false);
|
|
302
300
|
|
|
303
301
|
useEffect(() => {
|
|
304
302
|
createAgentLinkAsyncRef.current = createAgentLink.mutateAsync;
|
|
@@ -333,12 +331,21 @@ function LinkTab({
|
|
|
333
331
|
setAgentLinkError(false);
|
|
334
332
|
if (!sharesLoaded) return;
|
|
335
333
|
|
|
336
|
-
|
|
334
|
+
if (!isPublic && agentShareOpen) {
|
|
335
|
+
void loadAgentContextUrl();
|
|
336
|
+
}
|
|
337
337
|
|
|
338
338
|
return () => {
|
|
339
339
|
agentLinkRequestIdRef.current += 1;
|
|
340
340
|
};
|
|
341
|
-
}, [
|
|
341
|
+
}, [
|
|
342
|
+
agentShareOpen,
|
|
343
|
+
isPublic,
|
|
344
|
+
loadAgentContextUrl,
|
|
345
|
+
recordingId,
|
|
346
|
+
sharesLoaded,
|
|
347
|
+
visibility,
|
|
348
|
+
]);
|
|
342
349
|
|
|
343
350
|
const agentShareDisabled =
|
|
344
351
|
isPending || createAgentLink.isPending || !agentContextUrl;
|
|
@@ -366,41 +373,62 @@ function LinkTab({
|
|
|
366
373
|
(and a connect link) instead of leaving it buried in Settings. */}
|
|
367
374
|
{isPublic ? <SlackShareHint canManage={canManage} /> : null}
|
|
368
375
|
|
|
369
|
-
|
|
370
|
-
<
|
|
371
|
-
|
|
372
|
-
value={agentContextUrl}
|
|
373
|
-
disabled={agentShareDisabled}
|
|
374
|
-
/>
|
|
375
|
-
{agentLinkError ? (
|
|
376
|
-
<div className="flex items-center justify-between gap-2 rounded-md border border-border bg-muted/40 px-3 py-2">
|
|
377
|
-
<p className="text-xs text-muted-foreground">
|
|
378
|
-
{t("shareDialog.agentLinkUnavailable")}
|
|
379
|
-
</p>
|
|
376
|
+
{!isPublic ? (
|
|
377
|
+
<Collapsible open={agentShareOpen} onOpenChange={setAgentShareOpen}>
|
|
378
|
+
<CollapsibleTrigger asChild>
|
|
380
379
|
<Button
|
|
381
380
|
type="button"
|
|
382
381
|
variant="ghost"
|
|
383
|
-
|
|
384
|
-
className="h-7"
|
|
385
|
-
onClick={() => void loadAgentContextUrl()}
|
|
386
|
-
disabled={createAgentLink.isPending}
|
|
382
|
+
className="h-auto w-full justify-between px-0 py-1 text-left hover:bg-transparent"
|
|
387
383
|
>
|
|
388
|
-
|
|
384
|
+
<span className="min-w-0">
|
|
385
|
+
<span className="block text-xs font-medium text-foreground">
|
|
386
|
+
{t("shareDialog.shareWithAgents")}
|
|
387
|
+
</span>
|
|
388
|
+
<span className="mt-0.5 block text-xs font-normal text-muted-foreground">
|
|
389
|
+
{t("shareDialog.agentTokenDescription")}
|
|
390
|
+
</span>
|
|
391
|
+
</span>
|
|
392
|
+
<IconChevronDown
|
|
393
|
+
className={`h-4 w-4 shrink-0 text-muted-foreground transition-transform ${
|
|
394
|
+
agentShareOpen ? "rotate-180" : ""
|
|
395
|
+
}`}
|
|
396
|
+
aria-hidden
|
|
397
|
+
/>
|
|
389
398
|
</Button>
|
|
390
|
-
</
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
399
|
+
</CollapsibleTrigger>
|
|
400
|
+
<CollapsibleContent className="pt-2">
|
|
401
|
+
<div className="space-y-3 rounded-md border border-border bg-muted/30 p-3">
|
|
402
|
+
<CopyField
|
|
403
|
+
label={t("shareDialog.shareWithAgents")}
|
|
404
|
+
value={agentContextUrl}
|
|
405
|
+
disabled={agentShareDisabled}
|
|
406
|
+
/>
|
|
407
|
+
{agentLinkError ? (
|
|
408
|
+
<div className="flex items-center justify-between gap-2 rounded-md border border-border bg-background px-3 py-2">
|
|
409
|
+
<p className="text-xs text-muted-foreground">
|
|
410
|
+
{t("shareDialog.agentLinkUnavailable")}
|
|
411
|
+
</p>
|
|
412
|
+
<Button
|
|
413
|
+
type="button"
|
|
414
|
+
variant="ghost"
|
|
415
|
+
size="sm"
|
|
416
|
+
className="h-7"
|
|
417
|
+
onClick={() => void loadAgentContextUrl()}
|
|
418
|
+
disabled={createAgentLink.isPending}
|
|
419
|
+
>
|
|
420
|
+
{t("shareDialog.retryAgentLink")}
|
|
421
|
+
</Button>
|
|
422
|
+
</div>
|
|
423
|
+
) : null}
|
|
424
|
+
<CopyField
|
|
425
|
+
label={t("shareDialog.copyAgentPrompt")}
|
|
426
|
+
value={agentPrompt}
|
|
427
|
+
disabled={agentShareDisabled}
|
|
428
|
+
/>
|
|
429
|
+
</div>
|
|
430
|
+
</CollapsibleContent>
|
|
431
|
+
</Collapsible>
|
|
404
432
|
) : null}
|
|
405
433
|
|
|
406
434
|
{!isPublic && canManage ? (
|
|
@@ -464,6 +464,21 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
|
|
|
464
464
|
bumpControls();
|
|
465
465
|
setPlayError(null);
|
|
466
466
|
|
|
467
|
+
if (
|
|
468
|
+
initialVisibleFrameSeekedRef.current &&
|
|
469
|
+
!hasPlaybackStarted &&
|
|
470
|
+
(!startMs || startMs <= 0) &&
|
|
471
|
+
v.currentTime > 0.05
|
|
472
|
+
) {
|
|
473
|
+
try {
|
|
474
|
+
v.currentTime = 0;
|
|
475
|
+
setCurrentMs(0);
|
|
476
|
+
} catch {
|
|
477
|
+
// If the browser refuses the rewind, continue with the normal play
|
|
478
|
+
// attempt; playback is still better than blocking on a cosmetic seek.
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
|
|
467
482
|
// A <video> element left in an error state (network/decode/unsupported
|
|
468
483
|
// format) will just re-reject on `.play()` forever — it needs `.load()`
|
|
469
484
|
// to reset `readyState`/`error` and re-fetch the source before playback
|
|
@@ -497,7 +512,9 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
|
|
|
497
512
|
attachPlayPromise,
|
|
498
513
|
bumpControls,
|
|
499
514
|
currentMs,
|
|
515
|
+
hasPlaybackStarted,
|
|
500
516
|
rejectPlayAttempt,
|
|
517
|
+
startMs,
|
|
501
518
|
]);
|
|
502
519
|
|
|
503
520
|
const retryPendingPlay = useCallback(
|
|
@@ -858,7 +875,6 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
|
|
|
858
875
|
initialVisibleFrameSeekedRef.current = true;
|
|
859
876
|
try {
|
|
860
877
|
v.currentTime = visibleMs / 1000;
|
|
861
|
-
setCurrentMs(visibleMs);
|
|
862
878
|
return true;
|
|
863
879
|
} catch {
|
|
864
880
|
return false;
|
|
@@ -1142,6 +1158,17 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
|
|
|
1142
1158
|
const ct =
|
|
1143
1159
|
Number.isFinite(raw) && raw >= 0 && raw < 1e7 ? raw : 0;
|
|
1144
1160
|
const ms = Math.floor(ct * 1000);
|
|
1161
|
+
if (
|
|
1162
|
+
initialVisibleFrameSeekedRef.current &&
|
|
1163
|
+
!hasPlaybackStarted &&
|
|
1164
|
+
!playAttemptPendingRef.current &&
|
|
1165
|
+
v.paused &&
|
|
1166
|
+
(!startMs || startMs <= 0)
|
|
1167
|
+
) {
|
|
1168
|
+
setCurrentMs(0);
|
|
1169
|
+
onTimeUpdate?.(0, resolvedDurationMs);
|
|
1170
|
+
return;
|
|
1171
|
+
}
|
|
1145
1172
|
const visibleMs = clampSeek(
|
|
1146
1173
|
skipExcludedRange(ms, excludedRanges, resolvedDurationMs),
|
|
1147
1174
|
v,
|
|
@@ -1169,10 +1196,20 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
|
|
|
1169
1196
|
onTimeUpdate?.(ms, resolvedDurationMs);
|
|
1170
1197
|
}}
|
|
1171
1198
|
onEnded={() => {
|
|
1199
|
+
const endedMs =
|
|
1200
|
+
resolvedDurationMs > 0
|
|
1201
|
+
? resolvedDurationMs
|
|
1202
|
+
: videoRef.current &&
|
|
1203
|
+
Number.isFinite(videoRef.current.duration) &&
|
|
1204
|
+
videoRef.current.duration > 0
|
|
1205
|
+
? Math.round(videoRef.current.duration * 1000)
|
|
1206
|
+
: currentMs;
|
|
1207
|
+
setCurrentMs(endedMs);
|
|
1172
1208
|
setIsPlaying(false);
|
|
1173
1209
|
setIsPlayPending(false);
|
|
1174
1210
|
setIsBuffering(false);
|
|
1175
1211
|
setIsPreparing(false);
|
|
1212
|
+
onTimeUpdate?.(endedMs, resolvedDurationMs);
|
|
1176
1213
|
onEnded?.();
|
|
1177
1214
|
}}
|
|
1178
1215
|
onError={(e) => {
|
|
@@ -4,11 +4,11 @@ import {
|
|
|
4
4
|
useT,
|
|
5
5
|
} from "@agent-native/core/client";
|
|
6
6
|
import {
|
|
7
|
-
IconBuilding,
|
|
8
7
|
IconCheck,
|
|
9
8
|
IconCopy,
|
|
10
9
|
IconLock,
|
|
11
10
|
IconTrash,
|
|
11
|
+
IconUsersGroup,
|
|
12
12
|
IconWorld,
|
|
13
13
|
} from "@tabler/icons-react";
|
|
14
14
|
import { useQueryClient } from "@tanstack/react-query";
|
|
@@ -55,7 +55,7 @@ export const VIS_META: Record<Visibility, { Icon: typeof IconLock }> = {
|
|
|
55
55
|
Icon: IconLock,
|
|
56
56
|
},
|
|
57
57
|
org: {
|
|
58
|
-
Icon:
|
|
58
|
+
Icon: IconUsersGroup,
|
|
59
59
|
},
|
|
60
60
|
public: {
|
|
61
61
|
Icon: IconWorld,
|
|
@@ -308,7 +308,7 @@ export function Avatar({ label, org }: { label: string; org?: boolean }) {
|
|
|
308
308
|
className="inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-muted text-[11px] font-semibold text-muted-foreground"
|
|
309
309
|
>
|
|
310
310
|
{org ? (
|
|
311
|
-
<
|
|
311
|
+
<IconUsersGroup size={14} strokeWidth={1.75} />
|
|
312
312
|
) : (
|
|
313
313
|
(label.split("@")[0]?.[0] ?? label[0] ?? "?").toUpperCase()
|
|
314
314
|
)}
|
|
@@ -35,16 +35,11 @@ export function SlackShareHint({ canManage }: { canManage: boolean }) {
|
|
|
35
35
|
|
|
36
36
|
if (connected) {
|
|
37
37
|
return (
|
|
38
|
-
<div className="flex items-center gap-2
|
|
38
|
+
<div className="flex items-center gap-2 rounded-md bg-muted/35 px-2.5 py-1.5 text-xs text-muted-foreground">
|
|
39
39
|
<IconBrandSlack className="h-4 w-4 shrink-0 text-muted-foreground" />
|
|
40
|
-
<
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
</div>
|
|
44
|
-
<p className="text-[11px] text-muted-foreground">
|
|
45
|
-
{t("slackShareHint.connectedDescription")}
|
|
46
|
-
</p>
|
|
47
|
-
</div>
|
|
40
|
+
<span className="min-w-0 truncate">
|
|
41
|
+
{t("slackShareHint.playsInline")}
|
|
42
|
+
</span>
|
|
48
43
|
</div>
|
|
49
44
|
);
|
|
50
45
|
}
|
|
@@ -59,18 +54,13 @@ export function SlackShareHint({ canManage }: { canManage: boolean }) {
|
|
|
59
54
|
return (
|
|
60
55
|
<a
|
|
61
56
|
href={appPath("/settings#slack")}
|
|
62
|
-
className="flex items-center gap-2
|
|
57
|
+
className="flex items-center gap-2 rounded-md bg-muted/35 px-2.5 py-1.5 text-xs text-muted-foreground transition-colors hover:bg-muted/55"
|
|
63
58
|
>
|
|
64
59
|
<IconBrandSlack className="h-4 w-4 shrink-0 text-muted-foreground" />
|
|
65
|
-
<
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
<p className="text-[11px] text-muted-foreground">
|
|
70
|
-
{t("slackShareHint.connectDescription")}
|
|
71
|
-
</p>
|
|
72
|
-
</div>
|
|
73
|
-
<span className="shrink-0 text-xs font-medium text-primary">
|
|
60
|
+
<span className="min-w-0 flex-1 truncate">
|
|
61
|
+
{t("slackShareHint.makeInline")}
|
|
62
|
+
</span>
|
|
63
|
+
<span className="shrink-0 font-medium text-primary">
|
|
74
64
|
{t("slackShareHint.connect")}
|
|
75
65
|
</span>
|
|
76
66
|
</a>
|
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
BUILDER_CREDITS_UPGRADE_URL,
|
|
15
15
|
type BuilderCreditsStatus,
|
|
16
16
|
} from "@shared/builder-credits";
|
|
17
|
+
import { isStoredButUnservableFinalizeError } from "@shared/finalize-recovery";
|
|
17
18
|
import {
|
|
18
19
|
isLoomEmbedBackedRecording,
|
|
19
20
|
isLoomRecordingSource,
|
|
@@ -635,6 +636,8 @@ export default function RecordingPage() {
|
|
|
635
636
|
const rawFailureReason =
|
|
636
637
|
((recording as any).failureReason as string | null | undefined) ?? null;
|
|
637
638
|
const waitingForStorage = isStorageSetupFailureReason(rawFailureReason);
|
|
639
|
+
const storedButUnservableFailure =
|
|
640
|
+
isStoredButUnservableFinalizeError(rawFailureReason);
|
|
638
641
|
const loomStorageSetupFailure = waitingForStorage && isLoomRecording;
|
|
639
642
|
const nativeSaveFailed =
|
|
640
643
|
searchParams.get("saveFailed") === "1" ||
|
|
@@ -646,13 +649,16 @@ export default function RecordingPage() {
|
|
|
646
649
|
const isFailure =
|
|
647
650
|
explicitFailure || stuckFailure || waitingForStorage || nativeSaveFailed;
|
|
648
651
|
const displayReason = explicitFailure
|
|
649
|
-
?
|
|
652
|
+
? storedButUnservableFailure
|
|
653
|
+
? t("recordingPage.clipDataPreserved")
|
|
654
|
+
: (rawFailureReason ?? t("recordingPage.retryLibrary"))
|
|
650
655
|
: nativeSaveFailed
|
|
651
656
|
? nativeSaveFailureMessage(rawFailureReason)
|
|
652
657
|
: stuckFailure
|
|
653
658
|
? t("recordingPage.processingStuck", { status: recording.status })
|
|
654
659
|
: t("recordingPage.uploadingAssembling");
|
|
655
660
|
const storageSetupFailure = waitingForStorage;
|
|
661
|
+
const canRetryFinalize = storageSetupFailure || storedButUnservableFailure;
|
|
656
662
|
const label = storageSetupFailure
|
|
657
663
|
? loomStorageSetupFailure
|
|
658
664
|
? t("recordingPage.connectStorageImportLoom")
|
|
@@ -744,7 +750,7 @@ export default function RecordingPage() {
|
|
|
744
750
|
<div className="flex items-center gap-2">
|
|
745
751
|
<Button
|
|
746
752
|
onClick={() => {
|
|
747
|
-
if (
|
|
753
|
+
if (canRetryFinalize) {
|
|
748
754
|
void retryFinalizeAfterStorage();
|
|
749
755
|
return;
|
|
750
756
|
}
|
|
@@ -755,7 +761,7 @@ export default function RecordingPage() {
|
|
|
755
761
|
size="sm"
|
|
756
762
|
disabled={retryingFinalize}
|
|
757
763
|
>
|
|
758
|
-
{
|
|
764
|
+
{canRetryFinalize
|
|
759
765
|
? loomStorageSetupFailure
|
|
760
766
|
? t("recordingPage.retryImport")
|
|
761
767
|
: t("recordingPage.retryUpload")
|
|
@@ -7,7 +7,10 @@ import {
|
|
|
7
7
|
} from "@agent-native/core/client";
|
|
8
8
|
import { useLiveTranscription } from "@agent-native/core/client/transcription/use-live-transcription";
|
|
9
9
|
import type { BrowserDiagnosticsData } from "@shared/browser-diagnostics";
|
|
10
|
-
import {
|
|
10
|
+
import {
|
|
11
|
+
isStoredButUnservableFinalizeError,
|
|
12
|
+
waitForReadyRecordingAfterFinalizeError,
|
|
13
|
+
} from "@shared/finalize-recovery";
|
|
11
14
|
import {
|
|
12
15
|
chunkUploadUrl,
|
|
13
16
|
pickMimeType,
|
|
@@ -1814,7 +1817,9 @@ export default function RecordRoute() {
|
|
|
1814
1817
|
: undefined;
|
|
1815
1818
|
const serverRejectedTooLarge =
|
|
1816
1819
|
status === 413 || isUploadSizeError(message);
|
|
1817
|
-
|
|
1820
|
+
const preserveBufferedChunks =
|
|
1821
|
+
isStoredButUnservableFinalizeError(message);
|
|
1822
|
+
if (createdId && !serverRejectedTooLarge && !preserveBufferedChunks) {
|
|
1818
1823
|
fetch(`${appBasePath()}/api/uploads/${createdId}/abort`, {
|
|
1819
1824
|
method: "POST",
|
|
1820
1825
|
headers: { "Content-Type": "application/json" },
|
|
@@ -2127,11 +2132,13 @@ export default function RecordRoute() {
|
|
|
2127
2132
|
return;
|
|
2128
2133
|
}
|
|
2129
2134
|
await saveBrowserDiagnostics(pending.id);
|
|
2130
|
-
|
|
2131
|
-
|
|
2132
|
-
|
|
2133
|
-
|
|
2134
|
-
|
|
2135
|
+
if (!isStoredButUnservableFinalizeError(message)) {
|
|
2136
|
+
fetch(pending.abortUrl, {
|
|
2137
|
+
method: "POST",
|
|
2138
|
+
headers: { "Content-Type": "application/json" },
|
|
2139
|
+
body: JSON.stringify({ reason: message }),
|
|
2140
|
+
}).catch(() => {});
|
|
2141
|
+
}
|
|
2135
2142
|
setError(message);
|
|
2136
2143
|
setUiState("error");
|
|
2137
2144
|
toast.error(t("recordRoute.uploadFailed"), {
|
|
@@ -2162,11 +2169,13 @@ export default function RecordRoute() {
|
|
|
2162
2169
|
}
|
|
2163
2170
|
const message =
|
|
2164
2171
|
err instanceof Error ? err.message : t("recordRoute.uploadFailed");
|
|
2165
|
-
|
|
2166
|
-
|
|
2167
|
-
|
|
2168
|
-
|
|
2169
|
-
|
|
2172
|
+
if (!isStoredButUnservableFinalizeError(message)) {
|
|
2173
|
+
fetch(pending.abortUrl, {
|
|
2174
|
+
method: "POST",
|
|
2175
|
+
headers: { "Content-Type": "application/json" },
|
|
2176
|
+
body: JSON.stringify({ reason: message }),
|
|
2177
|
+
}).catch(() => {});
|
|
2178
|
+
}
|
|
2170
2179
|
setCompressionProgress(null);
|
|
2171
2180
|
setUploadProgress(null);
|
|
2172
2181
|
setError(message);
|
|
@@ -2318,6 +2318,24 @@ chrome.tabs.onActivated.addListener((info) => {
|
|
|
2318
2318
|
})();
|
|
2319
2319
|
});
|
|
2320
2320
|
|
|
2321
|
+
// The overlay content script is injected on demand (activeTab), so reloading the
|
|
2322
|
+
// launch tab wipes it — the camera bubble and toolbar would vanish for the rest
|
|
2323
|
+
// of the recording even though capture keeps running in the offscreen document.
|
|
2324
|
+
// Re-inject and re-mount once the launch tab finishes reloading while a recording
|
|
2325
|
+
// is active. Scoped to the launch tab (the only tab activeTab lets us touch); a
|
|
2326
|
+
// same-URL reload keeps that grant.
|
|
2327
|
+
chrome.tabs.onUpdated.addListener((tabId, changeInfo) => {
|
|
2328
|
+
if (changeInfo.status !== "complete") return;
|
|
2329
|
+
void (async () => {
|
|
2330
|
+
await ensureRestored();
|
|
2331
|
+
if (overlayPhase === "idle" || !activeNativeRecording) return;
|
|
2332
|
+
if (tabId !== overlayTabId) return;
|
|
2333
|
+
await mountOverlayOnTab(tabId);
|
|
2334
|
+
broadcastOverlayState();
|
|
2335
|
+
if (overlayPhase === "countdown") await handleOverlaySkip();
|
|
2336
|
+
})();
|
|
2337
|
+
});
|
|
2338
|
+
|
|
2321
2339
|
// While recording, the popup is disabled (setActionPopup("")), so clicking the
|
|
2322
2340
|
// extension icon lands here: stop & save immediately (or discard if we're still
|
|
2323
2341
|
// in the pre-roll countdown). When idle, the popup opens and this never fires.
|
|
@@ -733,19 +733,34 @@ async function buildCompositor(
|
|
|
733
733
|
async function createMixedAudio(
|
|
734
734
|
streams: MediaStream[],
|
|
735
735
|
): Promise<{ audioContext: AudioContext | null; tracks: MediaStreamTrack[] }> {
|
|
736
|
-
const
|
|
737
|
-
|
|
738
|
-
)
|
|
739
|
-
|
|
740
|
-
if (streamsWithAudio.length === 1) {
|
|
741
|
-
return { audioContext: null, tracks: streamsWithAudio[0].getAudioTracks() };
|
|
736
|
+
const audioTracks = streams.flatMap((stream) => stream.getAudioTracks());
|
|
737
|
+
if (!audioTracks.length) return { audioContext: null, tracks: [] };
|
|
738
|
+
if (audioTracks.length === 1) {
|
|
739
|
+
return { audioContext: null, tracks: audioTracks };
|
|
742
740
|
}
|
|
743
741
|
|
|
744
742
|
const audioContext = new AudioContext();
|
|
745
743
|
await audioContext.resume().catch(() => undefined);
|
|
746
744
|
const destination = audioContext.createMediaStreamDestination();
|
|
747
|
-
for (const
|
|
748
|
-
|
|
745
|
+
for (const track of audioTracks) {
|
|
746
|
+
// One source per track (not per stream) so each input is isolated in the
|
|
747
|
+
// mix graph and can be detached independently.
|
|
748
|
+
const source = audioContext.createMediaStreamSource(
|
|
749
|
+
new MediaStream([track]),
|
|
750
|
+
);
|
|
751
|
+
source.connect(destination);
|
|
752
|
+
// A mixed input track can end mid-recording — most commonly the shared
|
|
753
|
+
// tab's audio track when the user refreshes the captured tab. Disconnect
|
|
754
|
+
// just that dead source so the mixed output keeps carrying the surviving
|
|
755
|
+
// inputs (the microphone). Without this the whole mixed destination can go
|
|
756
|
+
// silent, dropping both the tab audio and the mic for the rest of the clip.
|
|
757
|
+
track.addEventListener("ended", () => {
|
|
758
|
+
try {
|
|
759
|
+
source.disconnect();
|
|
760
|
+
} catch {
|
|
761
|
+
/* already disconnected */
|
|
762
|
+
}
|
|
763
|
+
});
|
|
749
764
|
}
|
|
750
765
|
return { audioContext, tracks: destination.stream.getAudioTracks() };
|
|
751
766
|
}
|