@agent-native/core 0.90.2 → 0.90.4
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/bin/agent-native.js +25 -3
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +21 -0
- package/corpus/core/bin/agent-native.js +25 -3
- 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/index.ts +1 -0
- package/corpus/core/src/agent/engine/registry.ts +86 -18
- package/corpus/core/src/agent/production-agent.ts +37 -6
- package/corpus/core/src/cli/create.ts +35 -0
- package/corpus/core/src/cli/design-connect.ts +248 -0
- package/corpus/core/src/cli/index.ts +84 -7
- package/corpus/core/src/cli/workspacify.ts +34 -0
- 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 +175 -0
- package/corpus/core/src/client/history/index.ts +21 -0
- package/corpus/core/src/client/history/use-history.ts +114 -0
- package/corpus/core/src/client/index.ts +84 -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 +30 -0
- package/corpus/core/src/client/review/use-review.ts +152 -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 +92 -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 +26 -0
- package/corpus/core/src/history/registry.ts +111 -0
- package/corpus/core/src/history/store.ts +379 -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 +48 -0
- package/corpus/core/src/review/actions/create-review-comment.ts +107 -0
- package/corpus/core/src/review/actions/delete-review-comment.ts +67 -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 +67 -0
- package/corpus/core/src/review/actions/set-review-status.ts +58 -0
- package/corpus/core/src/review/index.ts +31 -0
- package/corpus/core/src/review/mentions.ts +44 -0
- package/corpus/core/src/review/registry.ts +111 -0
- package/corpus/core/src/review/store.ts +690 -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-chat-plugin.ts +6 -0
- package/corpus/core/src/server/agent-engine-api-key-route.ts +5 -0
- package/corpus/core/src/server/credential-provider.ts +118 -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/assets/actions/_preset-skeleton-validation.ts +11 -11
- package/corpus/templates/assets/actions/generate-image.ts +64 -28
- package/corpus/templates/assets/app/components/generation/GenerationResults.tsx +1 -1
- package/corpus/templates/assets/app/routes/brand-kits.$id_.presets.$presetId.tsx +91 -74
- package/corpus/templates/assets/server/lib/generation.ts +29 -4
- package/corpus/templates/assets/server/lib/image-processing.ts +131 -0
- package/corpus/templates/brain/app/routes/settings.tsx +2 -2
- package/corpus/templates/calendar/.agents/skills/event-management/SKILL.md +24 -2
- package/corpus/templates/calendar/AGENTS.md +3 -0
- package/corpus/templates/calendar/actions/create-event.ts +8 -34
- package/corpus/templates/calendar/actions/event-action-helpers.ts +52 -0
- package/corpus/templates/calendar/actions/manage-event-draft.ts +7 -34
- package/corpus/templates/calendar/actions/update-event.ts +10 -23
- package/corpus/templates/calendar/app/components/calendar/AttendeeAutocomplete.tsx +79 -6
- package/corpus/templates/calendar/app/components/calendar/CreateEventDialog.tsx +23 -0
- package/corpus/templates/calendar/app/components/calendar/EventAttendeesSection.tsx +59 -2
- package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +40 -1
- package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +154 -41
- package/corpus/templates/calendar/app/hooks/use-events.ts +6 -0
- package/corpus/templates/calendar/app/hooks/use-people.ts +55 -0
- package/corpus/templates/calendar/app/i18n/zh-TW.ts +4 -0
- package/corpus/templates/calendar/app/i18n-data.ts +40 -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-you-can-mark-event-guests-as-optional-while-inviting-them-or.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/calendar/server/handlers/events.ts +1 -0
- package/corpus/templates/calendar/server/lib/google-calendar.ts +4 -0
- package/corpus/templates/calendar/server/plugins/agent-chat.ts +1 -1
- package/corpus/templates/calendar/shared/api.ts +2 -0
- package/corpus/templates/clips/.agents/skills/ai-video-tools/SKILL.md +29 -3
- 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/generate-workflow.ts +19 -8
- package/corpus/templates/clips/actions/get-clips-ai-prefs.ts +36 -0
- package/corpus/templates/clips/actions/import-loom-recording.ts +1 -0
- package/corpus/templates/clips/actions/lib/clips-ai-prefs.ts +28 -0
- package/corpus/templates/clips/actions/lib/ensure-seekable-video.ts +1 -0
- package/corpus/templates/clips/actions/regenerate-chapters.ts +21 -7
- package/corpus/templates/clips/actions/regenerate-summary.ts +26 -8
- package/corpus/templates/clips/actions/regenerate-title.ts +44 -7
- package/corpus/templates/clips/actions/request-transcript.ts +31 -0
- package/corpus/templates/clips/actions/set-thumbnail.ts +2 -0
- package/corpus/templates/clips/actions/update-clips-ai-prefs.ts +50 -0
- package/corpus/templates/clips/app/components/library/organization-switcher.tsx +2 -2
- package/corpus/templates/clips/app/components/meetings/meeting-card.tsx +7 -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/hooks/use-auto-title.ts +25 -10
- package/corpus/templates/clips/app/i18n/ar-SA.ts +28 -6
- package/corpus/templates/clips/app/i18n/de-DE.ts +28 -6
- package/corpus/templates/clips/app/i18n/en-US.ts +29 -6
- package/corpus/templates/clips/app/i18n/es-ES.ts +29 -6
- package/corpus/templates/clips/app/i18n/fr-FR.ts +30 -6
- package/corpus/templates/clips/app/i18n/hi-IN.ts +26 -6
- package/corpus/templates/clips/app/i18n/ja-JP.ts +27 -6
- package/corpus/templates/clips/app/i18n/ko-KR.ts +28 -6
- package/corpus/templates/clips/app/i18n/pt-BR.ts +28 -6
- package/corpus/templates/clips/app/i18n/zh-CN.ts +26 -6
- package/corpus/templates/clips/app/i18n/zh-TW.ts +25 -6
- package/corpus/templates/clips/app/routes/_app.meetings._index.tsx +73 -0
- package/corpus/templates/clips/app/routes/_app.settings._index.tsx +1 -0
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +79 -5
- 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-ai-tools-can-include-the-full-video-not-just-the-transcript-.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-clips-desktop-now-surfaces-meetings-and-dictate-directly-in-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-meeting-notes-now-explain-exactly-how-to-start-granola-style.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-meeting-start-alerts-now-include-separate-start-notes-and-jo.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-recordings-start-more-predictably-and-newly-saved-clips-refr.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/public/manifest.json +1 -1
- 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 +475 -108
- 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/recorder.ts +27 -21
- package/corpus/templates/clips/desktop/src/lib/updater.ts +25 -2
- package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +23 -22
- package/corpus/templates/clips/desktop/src/styles.css +167 -2
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +8 -1
- package/corpus/templates/clips/desktop/src-tauri/src/notifications.rs +3 -7
- package/corpus/templates/clips/desktop/src-tauri/src/tray_meetings.rs +5 -4
- package/corpus/templates/clips/server/routes/_agent-native/clips/user-prefs.put.ts +16 -8
- 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/clips-ai-prefs.ts +81 -0
- 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/design/.agents/skills/visual-edit/SKILL.md +16 -1
- package/corpus/templates/design/actions/add-localhost-screens.ts +1 -0
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +345 -11
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +89 -14
- package/corpus/templates/design/app/components/design/bridge-security.ts +7 -1
- package/corpus/templates/design/app/components/design/multi-screen/types.ts +1 -1
- package/corpus/templates/design/app/i18n/zh-TW.ts +3 -0
- package/corpus/templates/design/app/i18n-data.ts +41 -0
- package/corpus/templates/design/changelog/2026-07-07-local-visual-edit-uses-live-app-iframes-for-click-to-edit-pr.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/index.d.ts +1 -1
- package/dist/agent/engine/index.d.ts.map +1 -1
- package/dist/agent/engine/index.js +1 -1
- package/dist/agent/engine/index.js.map +1 -1
- package/dist/agent/engine/registry.d.ts +14 -0
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js +78 -16
- 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/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +31 -0
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/design-connect.d.ts.map +1 -1
- package/dist/cli/design-connect.js +186 -0
- package/dist/cli/design-connect.js.map +1 -1
- package/dist/cli/index.js +76 -9
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/workspacify.d.ts.map +1 -1
- package/dist/cli/workspacify.js +30 -0
- package/dist/cli/workspacify.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 +31 -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 +58 -0
- package/dist/client/history/use-history.d.ts.map +1 -0
- package/dist/client/history/use-history.js +24 -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 +91 -0
- package/dist/client/review/use-review.d.ts.map +1 -0
- package/dist/client/review/use-review.js +30 -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/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/routes.d.ts +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 +68 -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 +63 -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 +290 -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/observability/routes.d.ts +3 -3
- 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/progress/routes.d.ts +1 -1
- package/dist/resources/handlers.d.ts +2 -2
- package/dist/review/actions/consume-review-feedback.d.ts +10 -0
- package/dist/review/actions/consume-review-feedback.d.ts.map +1 -0
- package/dist/review/actions/consume-review-feedback.js +35 -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 +11 -0
- package/dist/review/actions/delete-review-comment.d.ts.map +1 -0
- package/dist/review/actions/delete-review-comment.js +53 -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 +12 -0
- package/dist/review/actions/resolve-review-thread.d.ts.map +1 -0
- package/dist/review/actions/resolve-review-thread.js +49 -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 +63 -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 +561 -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/secrets/routes.d.ts +9 -9
- 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-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +5 -0
- 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/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 +28 -0
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +92 -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
|
@@ -10,7 +10,6 @@ import {
|
|
|
10
10
|
|
|
11
11
|
import {
|
|
12
12
|
chooseFallbackAudioInput,
|
|
13
|
-
findAudioInputBySavedLabel,
|
|
14
13
|
isPseudoMediaDeviceId,
|
|
15
14
|
isSelectableAudioInputDevice,
|
|
16
15
|
normalizedMediaDeviceId,
|
|
@@ -272,17 +271,30 @@ export function useMediaDevices({
|
|
|
272
271
|
useEffect(() => {
|
|
273
272
|
if (isPseudoMediaDeviceId(micId) || !micId || mics.length === 0) return;
|
|
274
273
|
if (mics.some((d) => d.deviceId === micId)) return;
|
|
275
|
-
|
|
274
|
+
// The selected mic (e.g. Bluetooth headset unplugged mid-session) is gone.
|
|
275
|
+
// Prefer rematching by saved label, then fall back to the best available
|
|
276
|
+
// input so we don't stay pinned to a device that no longer exists.
|
|
277
|
+
const fallback = chooseFallbackAudioInput(mics, {
|
|
276
278
|
savedLabel: micLabel,
|
|
277
279
|
avoidDeviceIds: [micId],
|
|
278
280
|
});
|
|
279
|
-
if (!
|
|
281
|
+
if (!fallback) {
|
|
282
|
+
// Nothing concrete left; drop to the OS default rather than keeping the
|
|
283
|
+
// disconnected device selected.
|
|
284
|
+
setMicId("");
|
|
285
|
+
setMicLabel("");
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
280
288
|
console.warn(
|
|
281
|
-
"[clips-recorder] saved mic id was missing;
|
|
282
|
-
{
|
|
289
|
+
"[clips-recorder] saved mic id was missing; fell back to available input",
|
|
290
|
+
{
|
|
291
|
+
previousDeviceId: micId,
|
|
292
|
+
nextDeviceId: fallback.deviceId,
|
|
293
|
+
reason: fallback.reason,
|
|
294
|
+
},
|
|
283
295
|
);
|
|
284
|
-
setMicId(
|
|
285
|
-
setMicLabel(
|
|
296
|
+
setMicId(fallback.deviceId);
|
|
297
|
+
setMicLabel(fallback.label);
|
|
286
298
|
}, [micId, micLabel, mics]);
|
|
287
299
|
|
|
288
300
|
useEffect(() => saveString(CAM_KEY, cameraId), [cameraId]);
|
|
@@ -8,6 +8,8 @@ export const MACOS_SCREEN_PERMISSION_MESSAGE =
|
|
|
8
8
|
"Grant Screen Recording permission in macOS Settings, then restart Clips and try again.";
|
|
9
9
|
export const MACOS_SPEECH_PERMISSION_MESSAGE =
|
|
10
10
|
"Grant Speech Recognition and Microphone access, then try again. If you just changed access, restart Clips before retrying.";
|
|
11
|
+
export const MACOS_UPDATE_RESTART_MESSAGE =
|
|
12
|
+
"An update was downloaded and needs a restart to finish installing. Restart Clips, then record again.";
|
|
11
13
|
|
|
12
14
|
export function isHardCapturePermissionError(message: string): boolean {
|
|
13
15
|
return /permission denied by system|blocked by system|system settings|screen recording|privacy|sandbox/i.test(
|
|
@@ -999,7 +999,6 @@ async function captureTitleForRecording(params: {
|
|
|
999
999
|
}
|
|
1000
1000
|
|
|
1001
1001
|
const COUNTDOWN_EVENT_TIMEOUT_MS = 5000;
|
|
1002
|
-
const COUNTDOWN_OVERLAY_SETTLE_MS = 120;
|
|
1003
1002
|
|
|
1004
1003
|
function wait(ms: number): Promise<void> {
|
|
1005
1004
|
return new Promise((resolve) => window.setTimeout(resolve, ms));
|
|
@@ -1652,10 +1651,6 @@ async function runRecordingCountdown(wantsScreen: boolean) {
|
|
|
1652
1651
|
console.warn("[clips-recorder] countdown timed out — proceeding");
|
|
1653
1652
|
return;
|
|
1654
1653
|
}
|
|
1655
|
-
// The countdown webview emits before it finishes closing. Give macOS a
|
|
1656
|
-
// brief beat to remove the overlay and any shortcut handling before capture
|
|
1657
|
-
// starts, so the first frame/audio sample is the real recording.
|
|
1658
|
-
await wait(COUNTDOWN_OVERLAY_SETTLE_MS);
|
|
1659
1654
|
}
|
|
1660
1655
|
|
|
1661
1656
|
function showFinalizingFeedback() {
|
|
@@ -1852,29 +1847,35 @@ async function startNativeFullscreenRecording(
|
|
|
1852
1847
|
}).catch((err) => {
|
|
1853
1848
|
console.warn("[clips-recorder] mic warm failed:", err);
|
|
1854
1849
|
});
|
|
1855
|
-
const countdownPromise = runRecordingCountdown(true);
|
|
1856
1850
|
if (localOnly) {
|
|
1851
|
+
const countdownPromise = runRecordingCountdown(true);
|
|
1857
1852
|
id = localFolderName;
|
|
1858
1853
|
await Promise.all([countdownPromise, warmMic(id)]);
|
|
1859
1854
|
} else {
|
|
1860
|
-
const
|
|
1855
|
+
const captureTitlePromise = captureTitleForRecording({
|
|
1861
1856
|
mode: params.mode,
|
|
1862
1857
|
source: params.source,
|
|
1863
1858
|
});
|
|
1864
|
-
|
|
1865
|
-
const recordingPromise =
|
|
1866
|
-
|
|
1867
|
-
|
|
1868
|
-
|
|
1869
|
-
|
|
1870
|
-
|
|
1871
|
-
|
|
1872
|
-
|
|
1873
|
-
|
|
1874
|
-
|
|
1875
|
-
|
|
1876
|
-
|
|
1877
|
-
|
|
1859
|
+
const countdownPromise = runRecordingCountdown(true);
|
|
1860
|
+
const recordingPromise = (async () => {
|
|
1861
|
+
const captureTitle = await captureTitlePromise;
|
|
1862
|
+
console.time("[clips-recorder] createServerRecording duration");
|
|
1863
|
+
try {
|
|
1864
|
+
return await createServerRecording(
|
|
1865
|
+
params.serverUrl,
|
|
1866
|
+
wantsCamera,
|
|
1867
|
+
wantsRecordedAudio,
|
|
1868
|
+
captureTitle,
|
|
1869
|
+
{
|
|
1870
|
+
mimeType: NATIVE_FULLSCREEN_MIME_TYPE,
|
|
1871
|
+
requestStreaming: true,
|
|
1872
|
+
streamingUploadClient: "desktop-native",
|
|
1873
|
+
},
|
|
1874
|
+
);
|
|
1875
|
+
} finally {
|
|
1876
|
+
console.timeEnd("[clips-recorder] createServerRecording duration");
|
|
1877
|
+
}
|
|
1878
|
+
})();
|
|
1878
1879
|
// The recording id usually lands well before the countdown ends — warm
|
|
1879
1880
|
// native capture as soon as it does so setup overlaps the 3-2-1.
|
|
1880
1881
|
const warmAndId = (async () => {
|
|
@@ -1918,6 +1919,11 @@ async function startNativeFullscreenRecording(
|
|
|
1918
1919
|
// Capture is now live — after rebasing the transcript timeline, stamp the
|
|
1919
1920
|
// timer baseline so the toolbar clock lines up with the real start.
|
|
1920
1921
|
startedAt = Date.now();
|
|
1922
|
+
emit("clips:toolbar-enabled", true).catch(() => {});
|
|
1923
|
+
emit("clips:recorder-state", {
|
|
1924
|
+
paused: false,
|
|
1925
|
+
elapsedMs: 0,
|
|
1926
|
+
}).catch(() => {});
|
|
1921
1927
|
localCameraExport?.start(2_000);
|
|
1922
1928
|
} catch (err) {
|
|
1923
1929
|
await localCameraExport?.cancel().catch(() => {});
|
|
@@ -45,9 +45,15 @@ async function runCheck() {
|
|
|
45
45
|
const notes = update.body ?? undefined;
|
|
46
46
|
setStatus({ state: "available", version, notes });
|
|
47
47
|
|
|
48
|
+
// Download ONLY — do not install here. On macOS `install` swaps the .app
|
|
49
|
+
// bundle on disk while this process keeps running, which invalidates the
|
|
50
|
+
// running process's Screen Recording (TCC) grant and breaks capture until
|
|
51
|
+
// relaunch. We defer the swap to `installAndRestart()` so a downloaded-but-
|
|
52
|
+
// not-yet-installed update leaves the running app fully functional; the
|
|
53
|
+
// user records normally until they choose to restart.
|
|
48
54
|
let total = 0;
|
|
49
55
|
let downloaded = 0;
|
|
50
|
-
await update.
|
|
56
|
+
await update.download((event) => {
|
|
51
57
|
if (event.event === "Started") {
|
|
52
58
|
total = event.data.contentLength ?? 0;
|
|
53
59
|
downloaded = 0;
|
|
@@ -98,10 +104,27 @@ export function useUpdateStatus(): UpdateStatus {
|
|
|
98
104
|
}
|
|
99
105
|
|
|
100
106
|
export async function installAndRestart(): Promise<void> {
|
|
101
|
-
//
|
|
107
|
+
// Perform the deferred bundle swap now, then relaunch onto the new binary.
|
|
108
|
+
// Installing immediately before relaunch keeps the window where the on-disk
|
|
109
|
+
// bundle no longer matches the running process as short as possible — the
|
|
110
|
+
// process is torn down by `relaunch()` right after, so capture never runs
|
|
111
|
+
// against a swapped-out bundle.
|
|
112
|
+
if (pendingUpdate) {
|
|
113
|
+
await pendingUpdate.install();
|
|
114
|
+
}
|
|
102
115
|
await relaunch();
|
|
103
116
|
}
|
|
104
117
|
|
|
118
|
+
/**
|
|
119
|
+
* True once an update has been downloaded and is waiting for the user to
|
|
120
|
+
* restart. The recording flow uses this to explain a post-download capture
|
|
121
|
+
* failure as "restart to finish updating" instead of a misleading "grant
|
|
122
|
+
* permissions" message — see `app.tsx` recError routing.
|
|
123
|
+
*/
|
|
124
|
+
export function isUpdatePendingRestart(): boolean {
|
|
125
|
+
return cachedStatus.state === "downloaded";
|
|
126
|
+
}
|
|
127
|
+
|
|
105
128
|
/**
|
|
106
129
|
* Manual retry entry point. Used by the UpdateBanner's error state to let
|
|
107
130
|
* users re-attempt after a signature-verification / download / network
|
|
@@ -23,9 +23,8 @@ const DEFAULT_AUTO_HIDE_MS = 30_000;
|
|
|
23
23
|
const SNOOZE_MS = 5 * 60_000;
|
|
24
24
|
|
|
25
25
|
/**
|
|
26
|
-
* Open a meeting join URL via the Tauri shell plugin.
|
|
27
|
-
*
|
|
28
|
-
* `meetings:start-transcription` event use the same path.
|
|
26
|
+
* Open a meeting join URL via the Tauri shell plugin. Used by the
|
|
27
|
+
* notification's dedicated Join CTA (notes start is a separate action).
|
|
29
28
|
*/
|
|
30
29
|
async function openJoinUrl(url: string | null | undefined): Promise<void> {
|
|
31
30
|
if (!url) return;
|
|
@@ -41,7 +40,7 @@ async function openJoinUrl(url: string | null | undefined): Promise<void> {
|
|
|
41
40
|
* Variants:
|
|
42
41
|
*
|
|
43
42
|
* - Calendar event: solid left bar (green), meeting title, time,
|
|
44
|
-
* "Start notes" + "Snooze 5 min" buttons.
|
|
43
|
+
* "Start notes" + optional "Join" + "Snooze 5 min" buttons.
|
|
45
44
|
* - Ad-hoc call: dashed left bar (slate), "Call detected", app name,
|
|
46
45
|
* same controls.
|
|
47
46
|
*
|
|
@@ -170,11 +169,6 @@ export function MeetingNotification() {
|
|
|
170
169
|
if (!data || pending) return;
|
|
171
170
|
setPending(true);
|
|
172
171
|
setError(null);
|
|
173
|
-
// Open the join URL right away so the user feels the click — the
|
|
174
|
-
// recording action runs in parallel.
|
|
175
|
-
if (data.joinUrl) {
|
|
176
|
-
openJoinUrl(data.joinUrl);
|
|
177
|
-
}
|
|
178
172
|
emit("meetings:start-transcription", {
|
|
179
173
|
meetingId: data.meetingId,
|
|
180
174
|
joinUrl: data.joinUrl,
|
|
@@ -185,25 +179,20 @@ export function MeetingNotification() {
|
|
|
185
179
|
});
|
|
186
180
|
}
|
|
187
181
|
|
|
182
|
+
async function joinMeeting() {
|
|
183
|
+
if (!data?.joinUrl) return;
|
|
184
|
+
await openJoinUrl(data.joinUrl);
|
|
185
|
+
}
|
|
186
|
+
|
|
188
187
|
function snooze() {
|
|
189
188
|
if (!data) return;
|
|
190
189
|
// Hand the snooze to the Rust watcher so the reminder re-fires after the
|
|
191
190
|
// delay even though this overlay window closes right away. A setTimeout
|
|
192
|
-
// here would be torn down with the window and never fire
|
|
193
|
-
// immediately (as before) just re-showed the same banner instantly.
|
|
191
|
+
// here would be torn down with the window and never fire.
|
|
194
192
|
invoke("meetings_snooze", {
|
|
195
193
|
meetingId: data.meetingId,
|
|
196
194
|
minutes: Math.round(SNOOZE_MS / 60_000),
|
|
197
195
|
}).catch(() => {});
|
|
198
|
-
const payload = data;
|
|
199
|
-
// Hide the current banner and re-fire the same payload after the snooze
|
|
200
|
-
// delay. We re-emit through Tauri so the in-app banner overlay window
|
|
201
|
-
// (which is what hosts this React component) can rerender with a fresh
|
|
202
|
-
// auto-hide timer.
|
|
203
|
-
emit("meetings:show-notification", {
|
|
204
|
-
...payload,
|
|
205
|
-
subtitle: `${payload.subtitle} (snoozed)`,
|
|
206
|
-
} as NotificationData).catch(() => {});
|
|
207
196
|
hideNotification();
|
|
208
197
|
}
|
|
209
198
|
|
|
@@ -212,6 +201,7 @@ export function MeetingNotification() {
|
|
|
212
201
|
}
|
|
213
202
|
|
|
214
203
|
const isCalendar = data.type === "calendar";
|
|
204
|
+
const hasJoin = Boolean(data.joinUrl);
|
|
215
205
|
|
|
216
206
|
return (
|
|
217
207
|
<div
|
|
@@ -227,7 +217,9 @@ export function MeetingNotification() {
|
|
|
227
217
|
scheduleAutoHide(DEFAULT_AUTO_HIDE_MS);
|
|
228
218
|
}}
|
|
229
219
|
>
|
|
230
|
-
<div
|
|
220
|
+
<div
|
|
221
|
+
className={`meeting-notification${hasJoin ? " meeting-notification-with-join" : ""}`}
|
|
222
|
+
>
|
|
231
223
|
<div
|
|
232
224
|
className={`meeting-notification-bar ${isCalendar ? "meeting-notification-bar-calendar" : "meeting-notification-bar-adhoc"}`}
|
|
233
225
|
/>
|
|
@@ -243,13 +235,22 @@ export function MeetingNotification() {
|
|
|
243
235
|
</div>
|
|
244
236
|
<div className="meeting-notification-actions">
|
|
245
237
|
<button
|
|
246
|
-
className="meeting-notification-btn"
|
|
238
|
+
className="meeting-notification-btn meeting-notification-btn-primary"
|
|
247
239
|
onClick={takeNotes}
|
|
248
240
|
disabled={pending}
|
|
249
241
|
data-no-drag
|
|
250
242
|
>
|
|
251
243
|
{pending ? "Starting…" : "Start notes"}
|
|
252
244
|
</button>
|
|
245
|
+
{hasJoin ? (
|
|
246
|
+
<button
|
|
247
|
+
className="meeting-notification-btn meeting-notification-btn-secondary"
|
|
248
|
+
onClick={joinMeeting}
|
|
249
|
+
data-no-drag
|
|
250
|
+
>
|
|
251
|
+
Join
|
|
252
|
+
</button>
|
|
253
|
+
) : null}
|
|
253
254
|
<button
|
|
254
255
|
className="meeting-notification-btn meeting-notification-btn-secondary"
|
|
255
256
|
onClick={snooze}
|
|
@@ -1096,7 +1096,7 @@ body[data-clips-route="recording-pill"] #root {
|
|
|
1096
1096
|
|
|
1097
1097
|
.bottom-row {
|
|
1098
1098
|
display: grid;
|
|
1099
|
-
grid-template-columns: repeat(
|
|
1099
|
+
grid-template-columns: repeat(4, 1fr);
|
|
1100
1100
|
gap: 4px;
|
|
1101
1101
|
}
|
|
1102
1102
|
|
|
@@ -1138,6 +1138,145 @@ body[data-clips-route="recording-pill"] #root {
|
|
|
1138
1138
|
font-weight: 500;
|
|
1139
1139
|
}
|
|
1140
1140
|
|
|
1141
|
+
/* ------------------------------------------------------------------------- */
|
|
1142
|
+
/* Popover drill-in views */
|
|
1143
|
+
/* ------------------------------------------------------------------------- */
|
|
1144
|
+
|
|
1145
|
+
.app-popover-view {
|
|
1146
|
+
gap: 0;
|
|
1147
|
+
padding: 0;
|
|
1148
|
+
}
|
|
1149
|
+
|
|
1150
|
+
.popover-view {
|
|
1151
|
+
min-height: 260px;
|
|
1152
|
+
}
|
|
1153
|
+
|
|
1154
|
+
.popover-view-header {
|
|
1155
|
+
margin-bottom: 2px;
|
|
1156
|
+
}
|
|
1157
|
+
|
|
1158
|
+
.popover-view-header-spacer {
|
|
1159
|
+
flex: 1;
|
|
1160
|
+
}
|
|
1161
|
+
|
|
1162
|
+
.popover-view-link {
|
|
1163
|
+
font-size: 11px;
|
|
1164
|
+
}
|
|
1165
|
+
|
|
1166
|
+
.popover-empty-card {
|
|
1167
|
+
display: flex;
|
|
1168
|
+
flex-direction: column;
|
|
1169
|
+
gap: 8px;
|
|
1170
|
+
padding: 12px;
|
|
1171
|
+
border: 1px solid var(--border);
|
|
1172
|
+
border-radius: var(--radius);
|
|
1173
|
+
background: var(--surface);
|
|
1174
|
+
}
|
|
1175
|
+
|
|
1176
|
+
.popover-empty-card strong {
|
|
1177
|
+
font-size: 13px;
|
|
1178
|
+
color: var(--fg);
|
|
1179
|
+
}
|
|
1180
|
+
|
|
1181
|
+
.popover-card-heading {
|
|
1182
|
+
display: flex;
|
|
1183
|
+
align-items: center;
|
|
1184
|
+
gap: 8px;
|
|
1185
|
+
}
|
|
1186
|
+
|
|
1187
|
+
.popover-list {
|
|
1188
|
+
display: flex;
|
|
1189
|
+
flex-direction: column;
|
|
1190
|
+
gap: 6px;
|
|
1191
|
+
}
|
|
1192
|
+
|
|
1193
|
+
.popover-list-item {
|
|
1194
|
+
display: flex;
|
|
1195
|
+
align-items: center;
|
|
1196
|
+
gap: 9px;
|
|
1197
|
+
padding: 9px;
|
|
1198
|
+
border: 1px solid var(--border);
|
|
1199
|
+
border-radius: var(--radius);
|
|
1200
|
+
background: var(--surface);
|
|
1201
|
+
}
|
|
1202
|
+
|
|
1203
|
+
.popover-list-icon {
|
|
1204
|
+
display: inline-flex;
|
|
1205
|
+
align-items: center;
|
|
1206
|
+
justify-content: center;
|
|
1207
|
+
color: var(--fg-muted);
|
|
1208
|
+
flex-shrink: 0;
|
|
1209
|
+
}
|
|
1210
|
+
|
|
1211
|
+
.popover-list-main {
|
|
1212
|
+
flex: 1;
|
|
1213
|
+
min-width: 0;
|
|
1214
|
+
}
|
|
1215
|
+
|
|
1216
|
+
.popover-list-title {
|
|
1217
|
+
font-size: 12px;
|
|
1218
|
+
font-weight: 600;
|
|
1219
|
+
color: var(--fg);
|
|
1220
|
+
white-space: nowrap;
|
|
1221
|
+
overflow: hidden;
|
|
1222
|
+
text-overflow: ellipsis;
|
|
1223
|
+
}
|
|
1224
|
+
|
|
1225
|
+
.popover-list-sub {
|
|
1226
|
+
margin-top: 1px;
|
|
1227
|
+
font-size: 11px;
|
|
1228
|
+
color: var(--fg-subtle);
|
|
1229
|
+
white-space: nowrap;
|
|
1230
|
+
overflow: hidden;
|
|
1231
|
+
text-overflow: ellipsis;
|
|
1232
|
+
}
|
|
1233
|
+
|
|
1234
|
+
.popover-list-action {
|
|
1235
|
+
flex-shrink: 0;
|
|
1236
|
+
border: 1px solid var(--border-strong);
|
|
1237
|
+
border-radius: var(--radius-sm);
|
|
1238
|
+
background: var(--bg);
|
|
1239
|
+
color: var(--fg);
|
|
1240
|
+
padding: 6px 8px;
|
|
1241
|
+
font-size: 11px;
|
|
1242
|
+
font-weight: 600;
|
|
1243
|
+
cursor: pointer;
|
|
1244
|
+
}
|
|
1245
|
+
|
|
1246
|
+
.popover-list-action:hover {
|
|
1247
|
+
background: var(--surface-hover);
|
|
1248
|
+
}
|
|
1249
|
+
|
|
1250
|
+
.popover-list-action-primary {
|
|
1251
|
+
border-color: var(--brand);
|
|
1252
|
+
background: var(--brand);
|
|
1253
|
+
color: var(--bg);
|
|
1254
|
+
}
|
|
1255
|
+
|
|
1256
|
+
.popover-list-action-primary:hover {
|
|
1257
|
+
background: var(--brand-hover);
|
|
1258
|
+
}
|
|
1259
|
+
|
|
1260
|
+
.popover-kv {
|
|
1261
|
+
display: flex;
|
|
1262
|
+
align-items: center;
|
|
1263
|
+
justify-content: space-between;
|
|
1264
|
+
gap: 12px;
|
|
1265
|
+
padding-top: 6px;
|
|
1266
|
+
border-top: 1px solid var(--border);
|
|
1267
|
+
font-size: 11px;
|
|
1268
|
+
}
|
|
1269
|
+
|
|
1270
|
+
.popover-kv span {
|
|
1271
|
+
color: var(--fg-subtle);
|
|
1272
|
+
}
|
|
1273
|
+
|
|
1274
|
+
.popover-kv strong {
|
|
1275
|
+
min-width: 0;
|
|
1276
|
+
text-align: right;
|
|
1277
|
+
font-size: 11px;
|
|
1278
|
+
}
|
|
1279
|
+
|
|
1141
1280
|
.badge {
|
|
1142
1281
|
position: absolute;
|
|
1143
1282
|
top: -4px;
|
|
@@ -3468,7 +3607,19 @@ body[data-clips-route="recording-pill"] #root {
|
|
|
3468
3607
|
color: white;
|
|
3469
3608
|
pointer-events: auto;
|
|
3470
3609
|
min-width: 280px;
|
|
3471
|
-
max-width:
|
|
3610
|
+
max-width: 400px;
|
|
3611
|
+
}
|
|
3612
|
+
|
|
3613
|
+
.meeting-notification-with-join {
|
|
3614
|
+
flex-wrap: wrap;
|
|
3615
|
+
align-items: flex-start;
|
|
3616
|
+
row-gap: 10px;
|
|
3617
|
+
}
|
|
3618
|
+
|
|
3619
|
+
.meeting-notification-with-join .meeting-notification-actions {
|
|
3620
|
+
flex: 1 1 100%;
|
|
3621
|
+
justify-content: flex-end;
|
|
3622
|
+
padding-left: 13px; /* align under content past the bar */
|
|
3472
3623
|
}
|
|
3473
3624
|
|
|
3474
3625
|
.meeting-notification-bar {
|
|
@@ -3536,6 +3687,20 @@ body[data-clips-route="recording-pill"] #root {
|
|
|
3536
3687
|
cursor: progress;
|
|
3537
3688
|
}
|
|
3538
3689
|
|
|
3690
|
+
.meeting-notification-btn-primary {
|
|
3691
|
+
background: #ffffff;
|
|
3692
|
+
color: #111827;
|
|
3693
|
+
}
|
|
3694
|
+
|
|
3695
|
+
.meeting-notification-btn-primary:hover {
|
|
3696
|
+
background: #f3f4f6;
|
|
3697
|
+
}
|
|
3698
|
+
|
|
3699
|
+
.meeting-notification-btn-primary:disabled {
|
|
3700
|
+
background: rgba(255, 255, 255, 0.7);
|
|
3701
|
+
color: #374151;
|
|
3702
|
+
}
|
|
3703
|
+
|
|
3539
3704
|
.meeting-notification-actions {
|
|
3540
3705
|
display: inline-flex;
|
|
3541
3706
|
align-items: center;
|
|
@@ -648,7 +648,7 @@ pub async fn native_fullscreen_recording_available() -> Result<bool, String> {
|
|
|
648
648
|
/// the countdown by now; this is just a safety net so a slow/denied mic can't
|
|
649
649
|
/// stall the start.
|
|
650
650
|
#[cfg(target_os = "macos")]
|
|
651
|
-
const MIC_WARM_TIMEOUT_MS: u64 =
|
|
651
|
+
const MIC_WARM_TIMEOUT_MS: u64 = 250;
|
|
652
652
|
|
|
653
653
|
/// Acquire a backend (ScreenCaptureKit, or the screencapture fallback) and
|
|
654
654
|
/// store it as the active session. Shared by the immediate-start command and
|
|
@@ -1538,6 +1538,13 @@ fn take_and_finalize_active_session(
|
|
|
1538
1538
|
session.lost_segment_duration.as_secs()
|
|
1539
1539
|
);
|
|
1540
1540
|
}
|
|
1541
|
+
|
|
1542
|
+
if let Some(paused_at) = session.paused_at.take() {
|
|
1543
|
+
session.paused_total = session
|
|
1544
|
+
.paused_total
|
|
1545
|
+
.checked_add(paused_at.elapsed())
|
|
1546
|
+
.unwrap_or(session.paused_total);
|
|
1547
|
+
}
|
|
1541
1548
|
let duration_ms = session
|
|
1542
1549
|
.started_at
|
|
1543
1550
|
.elapsed()
|
|
@@ -16,8 +16,8 @@ use crate::util::{
|
|
|
16
16
|
};
|
|
17
17
|
|
|
18
18
|
const MEETING_NOTIFICATION_LABEL: &str = "meeting-notif";
|
|
19
|
-
const NOTIFICATION_W_LOGICAL: u32 =
|
|
20
|
-
const NOTIFICATION_H_LOGICAL: u32 =
|
|
19
|
+
const NOTIFICATION_W_LOGICAL: u32 = 420;
|
|
20
|
+
const NOTIFICATION_H_LOGICAL: u32 = 148;
|
|
21
21
|
const NOTIFICATION_TOP_MARGIN_LOGICAL: u32 = 44;
|
|
22
22
|
const NOTIFICATION_RIGHT_MARGIN_LOGICAL: u32 = 24;
|
|
23
23
|
|
|
@@ -125,11 +125,7 @@ pub async fn notify_meeting_starting(
|
|
|
125
125
|
} else {
|
|
126
126
|
format!("in {} min", (starts_in_secs / 60).max(1))
|
|
127
127
|
};
|
|
128
|
-
let body =
|
|
129
|
-
format!("{} — Start notes", pretty_in)
|
|
130
|
-
} else {
|
|
131
|
-
format!("Starts {}", pretty_in)
|
|
132
|
-
};
|
|
128
|
+
let body = format!("Starts {}", pretty_in);
|
|
133
129
|
dlog!(
|
|
134
130
|
"[clips-tray] notify_meeting_starting id={} title={} body={}",
|
|
135
131
|
meeting_id,
|
|
@@ -25,21 +25,22 @@ pub struct MeetingItem {
|
|
|
25
25
|
|
|
26
26
|
pub const MEETING_ID_PREFIX: &str = "meeting:";
|
|
27
27
|
|
|
28
|
-
/// Build the "
|
|
28
|
+
/// Build the "Start Meeting Notes" submenu populated with up to 3 events. If
|
|
29
29
|
/// the list is empty, returns a submenu containing a single disabled "No
|
|
30
|
-
///
|
|
30
|
+
/// meetings ready" item — keeps the menu structure stable. Selecting a real
|
|
31
|
+
/// meeting starts live notes immediately.
|
|
31
32
|
pub fn build_meetings_section(
|
|
32
33
|
app: &AppHandle,
|
|
33
34
|
upcoming: Vec<MeetingItem>,
|
|
34
35
|
) -> Result<Submenu<Wry>, Box<dyn std::error::Error>> {
|
|
35
36
|
let mut builder: SubmenuBuilder<'_, Wry, AppHandle> =
|
|
36
|
-
SubmenuBuilder::new(app, "
|
|
37
|
+
SubmenuBuilder::new(app, "Start Meeting Notes");
|
|
37
38
|
|
|
38
39
|
if upcoming.is_empty() {
|
|
39
40
|
let placeholder = MenuItem::with_id(
|
|
40
41
|
app,
|
|
41
42
|
"meeting:none",
|
|
42
|
-
"No
|
|
43
|
+
"No meetings ready",
|
|
43
44
|
false,
|
|
44
45
|
None::<&str>,
|
|
45
46
|
)?;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getSession } from "@agent-native/core/server";
|
|
2
|
-
import { putUserSetting } from "@agent-native/core/settings";
|
|
2
|
+
import { getUserSetting, putUserSetting } from "@agent-native/core/settings";
|
|
3
3
|
import { defineEventHandler, getHeader, readBody, setResponseStatus } from "h3";
|
|
4
4
|
|
|
5
5
|
const CLIPS_USER_PREFS_KEY = "clips-user-prefs";
|
|
@@ -17,11 +17,19 @@ export default defineEventHandler(async (event) => {
|
|
|
17
17
|
return { error: "Invalid settings payload" };
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
20
|
+
// Merge so partial Settings saves (playback, notifications, …) don't wipe
|
|
21
|
+
// AI-tool prefs written from the recording page popover.
|
|
22
|
+
const existing =
|
|
23
|
+
(await getUserSetting(session.email, CLIPS_USER_PREFS_KEY)) ?? {};
|
|
24
|
+
const next = {
|
|
25
|
+
...(typeof existing === "object" && existing && !Array.isArray(existing)
|
|
26
|
+
? existing
|
|
27
|
+
: {}),
|
|
28
|
+
...(body as Record<string, unknown>),
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
await putUserSetting(session.email, CLIPS_USER_PREFS_KEY, next, {
|
|
32
|
+
requestSource: getHeader(event, "x-request-source") || undefined,
|
|
33
|
+
});
|
|
34
|
+
return next;
|
|
27
35
|
});
|
|
@@ -6,10 +6,12 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import {
|
|
9
|
+
readAppState,
|
|
9
10
|
writeAppState,
|
|
10
11
|
deleteAppStateByPrefix,
|
|
11
12
|
} from "@agent-native/core/application-state";
|
|
12
13
|
import { runWithRequestContext } from "@agent-native/core/server";
|
|
14
|
+
import { isStoredButUnservableFinalizeError } from "@shared/finalize-recovery.js";
|
|
13
15
|
import { and, eq } from "drizzle-orm";
|
|
14
16
|
import {
|
|
15
17
|
defineEventHandler,
|
|
@@ -50,6 +52,7 @@ export default defineEventHandler(async (event: H3Event) => {
|
|
|
50
52
|
id: schema.recordings.id,
|
|
51
53
|
status: schema.recordings.status,
|
|
52
54
|
videoUrl: schema.recordings.videoUrl,
|
|
55
|
+
failureReason: schema.recordings.failureReason,
|
|
53
56
|
})
|
|
54
57
|
.from(schema.recordings)
|
|
55
58
|
.where(
|
|
@@ -68,10 +71,14 @@ export default defineEventHandler(async (event: H3Event) => {
|
|
|
68
71
|
return { ok: true, recordingId, alreadyReady: true, chunksCleared: 0 };
|
|
69
72
|
}
|
|
70
73
|
|
|
74
|
+
const preserveRecoveryState =
|
|
75
|
+
isStoredButUnservableFinalizeError(failureReason) ||
|
|
76
|
+
isStoredButUnservableFinalizeError(existing.failureReason);
|
|
77
|
+
|
|
71
78
|
// Already a terminal failure (e.g. a duplicate/retried abort call, or
|
|
72
79
|
// finalize's own failChunkAssembly already flipped it) — no-op instead of
|
|
73
80
|
// re-clearing chunk state and overwriting the original failureReason.
|
|
74
|
-
if (existing.status === "failed") {
|
|
81
|
+
if (existing.status === "failed" && !preserveRecoveryState) {
|
|
75
82
|
return { ok: true, recordingId, alreadyFailed: true, chunksCleared: 0 };
|
|
76
83
|
}
|
|
77
84
|
|
|
@@ -85,17 +92,27 @@ export default defineEventHandler(async (event: H3Event) => {
|
|
|
85
92
|
})
|
|
86
93
|
.where(eq(schema.recordings.id, recordingId));
|
|
87
94
|
|
|
95
|
+
const existingUploadStateRaw = await readAppState(
|
|
96
|
+
`recording-upload-${recordingId}`,
|
|
97
|
+
).catch(() => null);
|
|
98
|
+
const existingUploadState =
|
|
99
|
+
existingUploadStateRaw && typeof existingUploadStateRaw === "object"
|
|
100
|
+
? (existingUploadStateRaw as Record<string, unknown>)
|
|
101
|
+
: {};
|
|
88
102
|
await writeAppState(`recording-upload-${recordingId}`, {
|
|
103
|
+
...existingUploadState,
|
|
89
104
|
recordingId,
|
|
90
105
|
status: "failed",
|
|
91
106
|
failureReason,
|
|
92
107
|
updatedAt: now,
|
|
93
108
|
});
|
|
94
109
|
|
|
95
|
-
const cleared =
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
110
|
+
const cleared = preserveRecoveryState
|
|
111
|
+
? 0
|
|
112
|
+
: await deleteAppStateByPrefix(`recording-chunks-${recordingId}-`);
|
|
113
|
+
if (!preserveRecoveryState) {
|
|
114
|
+
await deleteResumableSession(recordingId).catch(() => {});
|
|
115
|
+
}
|
|
99
116
|
await writeAppState("refresh-signal", { ts: Date.now() });
|
|
100
117
|
|
|
101
118
|
return { ok: true, recordingId, chunksCleared: cleared };
|