@agent-native/core 0.98.17 → 0.99.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +15 -0
- package/corpus/core/docs/content/actions.mdx +1 -1
- package/corpus/core/docs/content/authentication.mdx +1 -1
- package/corpus/core/docs/content/dispatch.mdx +3 -3
- package/corpus/core/docs/content/external-agents.mdx +30 -19
- package/corpus/core/docs/content/locales/ar-SA/actions.mdx +1 -1
- package/corpus/core/docs/content/locales/ar-SA/authentication.mdx +1 -1
- package/corpus/core/docs/content/locales/ar-SA/dispatch.mdx +3 -3
- package/corpus/core/docs/content/locales/ar-SA/external-agents.mdx +23 -19
- package/corpus/core/docs/content/locales/ar-SA/mcp-clients.mdx +31 -3
- package/corpus/core/docs/content/locales/ar-SA/mcp-protocol.mdx +29 -15
- package/corpus/core/docs/content/locales/ar-SA/plan-plugin.mdx +3 -3
- package/corpus/core/docs/content/locales/ar-SA/server.mdx +2 -2
- package/corpus/core/docs/content/locales/ar-SA/skills-guide.mdx +1 -1
- package/corpus/core/docs/content/locales/ar-SA/template-assets.mdx +1 -1
- package/corpus/core/docs/content/locales/ar-SA/template-dispatch.mdx +2 -2
- package/corpus/core/docs/content/locales/ar-SA/template-plan.mdx +3 -3
- package/corpus/core/docs/content/locales/de-DE/actions.mdx +1 -1
- package/corpus/core/docs/content/locales/de-DE/authentication.mdx +1 -1
- package/corpus/core/docs/content/locales/de-DE/dispatch.mdx +3 -3
- package/corpus/core/docs/content/locales/de-DE/external-agents.mdx +23 -19
- package/corpus/core/docs/content/locales/de-DE/mcp-clients.mdx +37 -3
- package/corpus/core/docs/content/locales/de-DE/mcp-protocol.mdx +29 -15
- package/corpus/core/docs/content/locales/de-DE/plan-plugin.mdx +3 -3
- package/corpus/core/docs/content/locales/de-DE/server.mdx +2 -2
- package/corpus/core/docs/content/locales/de-DE/skills-guide.mdx +1 -1
- package/corpus/core/docs/content/locales/de-DE/template-assets.mdx +1 -1
- package/corpus/core/docs/content/locales/de-DE/template-dispatch.mdx +2 -2
- package/corpus/core/docs/content/locales/de-DE/template-plan.mdx +3 -3
- package/corpus/core/docs/content/locales/es-ES/actions.mdx +1 -1
- package/corpus/core/docs/content/locales/es-ES/authentication.mdx +1 -1
- package/corpus/core/docs/content/locales/es-ES/dispatch.mdx +3 -3
- package/corpus/core/docs/content/locales/es-ES/external-agents.mdx +32 -19
- package/corpus/core/docs/content/locales/es-ES/mcp-clients.mdx +17 -3
- package/corpus/core/docs/content/locales/es-ES/mcp-protocol.mdx +38 -15
- package/corpus/core/docs/content/locales/es-ES/plan-plugin.mdx +3 -3
- package/corpus/core/docs/content/locales/es-ES/server.mdx +2 -2
- package/corpus/core/docs/content/locales/es-ES/skills-guide.mdx +1 -1
- package/corpus/core/docs/content/locales/es-ES/template-assets.mdx +1 -1
- package/corpus/core/docs/content/locales/es-ES/template-dispatch.mdx +2 -2
- package/corpus/core/docs/content/locales/es-ES/template-plan.mdx +3 -3
- package/corpus/core/docs/content/locales/fr-FR/actions.mdx +1 -1
- package/corpus/core/docs/content/locales/fr-FR/authentication.mdx +1 -1
- package/corpus/core/docs/content/locales/fr-FR/dispatch.mdx +3 -3
- package/corpus/core/docs/content/locales/fr-FR/external-agents.mdx +23 -19
- package/corpus/core/docs/content/locales/fr-FR/mcp-clients.mdx +17 -3
- package/corpus/core/docs/content/locales/fr-FR/mcp-protocol.mdx +29 -15
- package/corpus/core/docs/content/locales/fr-FR/plan-plugin.mdx +3 -3
- package/corpus/core/docs/content/locales/fr-FR/server.mdx +2 -2
- package/corpus/core/docs/content/locales/fr-FR/skills-guide.mdx +1 -1
- package/corpus/core/docs/content/locales/fr-FR/template-assets.mdx +1 -1
- package/corpus/core/docs/content/locales/fr-FR/template-dispatch.mdx +2 -2
- package/corpus/core/docs/content/locales/fr-FR/template-plan.mdx +3 -3
- package/corpus/core/docs/content/locales/hi-IN/actions.mdx +1 -1
- package/corpus/core/docs/content/locales/hi-IN/authentication.mdx +1 -1
- package/corpus/core/docs/content/locales/hi-IN/dispatch.mdx +3 -3
- package/corpus/core/docs/content/locales/hi-IN/external-agents.mdx +31 -19
- package/corpus/core/docs/content/locales/hi-IN/mcp-clients.mdx +17 -3
- package/corpus/core/docs/content/locales/hi-IN/mcp-protocol.mdx +36 -15
- package/corpus/core/docs/content/locales/hi-IN/plan-plugin.mdx +3 -3
- package/corpus/core/docs/content/locales/hi-IN/server.mdx +2 -2
- package/corpus/core/docs/content/locales/hi-IN/skills-guide.mdx +1 -1
- package/corpus/core/docs/content/locales/hi-IN/template-assets.mdx +1 -1
- package/corpus/core/docs/content/locales/hi-IN/template-dispatch.mdx +2 -2
- package/corpus/core/docs/content/locales/hi-IN/template-plan.mdx +3 -3
- package/corpus/core/docs/content/locales/ja-JP/actions.mdx +1 -1
- package/corpus/core/docs/content/locales/ja-JP/authentication.mdx +1 -1
- package/corpus/core/docs/content/locales/ja-JP/dispatch.mdx +3 -3
- package/corpus/core/docs/content/locales/ja-JP/external-agents.mdx +23 -19
- package/corpus/core/docs/content/locales/ja-JP/mcp-clients.mdx +34 -3
- package/corpus/core/docs/content/locales/ja-JP/mcp-protocol.mdx +29 -15
- package/corpus/core/docs/content/locales/ja-JP/plan-plugin.mdx +3 -3
- package/corpus/core/docs/content/locales/ja-JP/server.mdx +2 -2
- package/corpus/core/docs/content/locales/ja-JP/skills-guide.mdx +1 -1
- package/corpus/core/docs/content/locales/ja-JP/template-assets.mdx +1 -1
- package/corpus/core/docs/content/locales/ja-JP/template-dispatch.mdx +2 -2
- package/corpus/core/docs/content/locales/ja-JP/template-plan.mdx +3 -3
- package/corpus/core/docs/content/locales/ko-KR/actions.mdx +1 -1
- package/corpus/core/docs/content/locales/ko-KR/authentication.mdx +1 -1
- package/corpus/core/docs/content/locales/ko-KR/dispatch.mdx +3 -3
- package/corpus/core/docs/content/locales/ko-KR/external-agents.mdx +30 -19
- package/corpus/core/docs/content/locales/ko-KR/mcp-clients.mdx +33 -3
- package/corpus/core/docs/content/locales/ko-KR/mcp-protocol.mdx +36 -15
- package/corpus/core/docs/content/locales/ko-KR/plan-plugin.mdx +3 -3
- package/corpus/core/docs/content/locales/ko-KR/server.mdx +2 -2
- package/corpus/core/docs/content/locales/ko-KR/skills-guide.mdx +1 -1
- package/corpus/core/docs/content/locales/ko-KR/template-assets.mdx +1 -1
- package/corpus/core/docs/content/locales/ko-KR/template-dispatch.mdx +2 -2
- package/corpus/core/docs/content/locales/ko-KR/template-plan.mdx +3 -3
- package/corpus/core/docs/content/locales/pt-BR/actions.mdx +1 -1
- package/corpus/core/docs/content/locales/pt-BR/authentication.mdx +1 -1
- package/corpus/core/docs/content/locales/pt-BR/dispatch.mdx +3 -3
- package/corpus/core/docs/content/locales/pt-BR/external-agents.mdx +32 -19
- package/corpus/core/docs/content/locales/pt-BR/mcp-clients.mdx +34 -3
- package/corpus/core/docs/content/locales/pt-BR/mcp-protocol.mdx +32 -15
- package/corpus/core/docs/content/locales/pt-BR/plan-plugin.mdx +3 -3
- package/corpus/core/docs/content/locales/pt-BR/server.mdx +2 -2
- package/corpus/core/docs/content/locales/pt-BR/skills-guide.mdx +1 -1
- package/corpus/core/docs/content/locales/pt-BR/template-assets.mdx +1 -1
- package/corpus/core/docs/content/locales/pt-BR/template-dispatch.mdx +2 -2
- package/corpus/core/docs/content/locales/pt-BR/template-plan.mdx +3 -3
- package/corpus/core/docs/content/locales/zh-CN/actions.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-CN/authentication.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-CN/dispatch.mdx +3 -3
- package/corpus/core/docs/content/locales/zh-CN/external-agents.mdx +23 -19
- package/corpus/core/docs/content/locales/zh-CN/mcp-clients.mdx +28 -3
- package/corpus/core/docs/content/locales/zh-CN/mcp-protocol.mdx +29 -15
- package/corpus/core/docs/content/locales/zh-CN/plan-plugin.mdx +3 -3
- package/corpus/core/docs/content/locales/zh-CN/server.mdx +2 -2
- package/corpus/core/docs/content/locales/zh-CN/skills-guide.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-CN/template-assets.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-CN/template-dispatch.mdx +2 -2
- package/corpus/core/docs/content/locales/zh-CN/template-plan.mdx +3 -3
- package/corpus/core/docs/content/locales/zh-TW/actions.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-TW/authentication.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-TW/dispatch.mdx +3 -3
- package/corpus/core/docs/content/locales/zh-TW/external-agents.mdx +23 -19
- package/corpus/core/docs/content/locales/zh-TW/mcp-clients.mdx +28 -3
- package/corpus/core/docs/content/locales/zh-TW/mcp-protocol.mdx +30 -15
- package/corpus/core/docs/content/locales/zh-TW/plan-plugin.mdx +3 -3
- package/corpus/core/docs/content/locales/zh-TW/server.mdx +2 -2
- package/corpus/core/docs/content/locales/zh-TW/skills-guide.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-TW/template-assets.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-TW/template-dispatch.mdx +2 -2
- package/corpus/core/docs/content/locales/zh-TW/template-plan.mdx +3 -3
- package/corpus/core/docs/content/mcp-clients.mdx +31 -4
- package/corpus/core/docs/content/mcp-protocol.mdx +35 -15
- package/corpus/core/docs/content/plan-plugin.mdx +3 -3
- package/corpus/core/docs/content/server.mdx +2 -2
- package/corpus/core/docs/content/skills-guide.mdx +1 -1
- package/corpus/core/docs/content/template-assets.mdx +1 -1
- package/corpus/core/docs/content/template-dispatch.mdx +2 -2
- package/corpus/core/docs/content/template-plan.mdx +3 -3
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/a2a/client.ts +3 -0
- package/corpus/core/src/a2a/handlers.ts +95 -7
- package/corpus/core/src/cli/connect.ts +50 -24
- package/corpus/core/src/cli/mcp-config-writers.ts +10 -0
- package/corpus/core/src/cli/mcp.ts +5 -5
- package/corpus/core/src/cli/skills-content/assets-skill.ts +1 -1
- package/corpus/core/src/cli/skills-content/design-exploration-skill.ts +1 -1
- package/corpus/core/src/cli/skills-content/help.ts +1 -1
- package/corpus/core/src/cli/skills-content/plan-setup-auth.ts +1 -1
- package/corpus/core/src/cli/skills-content/visual-plan-skill.ts +1 -1
- package/corpus/core/src/cli/skills-content/visual-recap-skill.ts +2 -2
- package/corpus/core/src/cli/skills.ts +23 -12
- package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +5 -0
- package/corpus/core/src/client/resources/mcp-integration-catalog.ts +17 -0
- package/corpus/core/src/embedding/agent.ts +8 -6
- package/corpus/core/src/localization/default-messages.ts +7 -0
- package/corpus/core/src/mcp/ask-app-inline-tasks.ts +125 -0
- package/corpus/core/src/mcp/build-server.ts +65 -3
- package/corpus/core/src/mcp/builtin-tools.ts +186 -22
- package/corpus/core/src/mcp/connect-route.ts +17 -14
- package/corpus/core/src/mcp/oauth-route.ts +38 -13
- package/corpus/core/src/mcp/route-paths.ts +34 -0
- package/corpus/core/src/mcp/server.ts +21 -10
- package/corpus/core/src/mcp/stdio.ts +34 -16
- package/corpus/core/src/mcp/workspace-resolve.ts +2 -1
- package/corpus/core/src/mcp-client/manager.ts +5 -3
- package/corpus/core/src/mcp-client/remote-store.ts +10 -10
- package/corpus/core/src/server/agent-chat-plugin.ts +42 -9
- package/corpus/core/src/server/auth.ts +22 -6
- package/corpus/core/src/server/core-routes-plugin.ts +30 -24
- package/corpus/core/src/server/csrf.ts +17 -0
- package/corpus/core/src/server/framework-request-handler.ts +8 -2
- package/corpus/core/src/server/google-oauth.ts +6 -0
- package/corpus/core/src/server/http-response-telemetry.ts +6 -1
- package/corpus/core/src/server/recap-image-route.ts +3 -3
- package/corpus/core/src/server/security-headers.ts +7 -1
- package/corpus/core/src/server/ssr-handler.ts +2 -0
- package/corpus/core/src/shared/cache-control.ts +6 -4
- package/corpus/core/src/templates/default/.agents/skills/security/SKILL.md +10 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +15 -6
- package/corpus/core/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +16 -10
- package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +20 -1
- package/corpus/core/src/templates/workspace-core/.agents/skills/security/SKILL.md +10 -0
- package/corpus/templates/analytics/.agents/skills/security/SKILL.md +10 -0
- package/corpus/templates/analytics/app/global.css +63 -4
- package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +8 -5
- package/corpus/templates/analytics/changelog/2026-07-13-daily-dashboard-emails-recover-more-reliably-from-serverless.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-13-session-replays-keep-a-visible-mac-style-cursor-over-the-vis.md +6 -0
- package/corpus/templates/analytics/server/jobs/dashboard-report.ts +21 -2
- package/corpus/templates/analytics/server/lib/dashboard-report-subscriptions.ts +57 -1
- package/corpus/templates/analytics/server/lib/dashboard-report.ts +266 -28
- package/corpus/templates/analytics/server/routes/[...page].get.ts +0 -2
- package/corpus/templates/assets/.agents/skills/security/SKILL.md +10 -0
- package/corpus/templates/assets/agent-native.app-skill.json +1 -1
- package/corpus/templates/brain/.agents/skills/security/SKILL.md +10 -0
- package/corpus/templates/calendar/.agents/skills/security/SKILL.md +10 -0
- package/corpus/templates/calendar/AGENTS.md +2 -1
- package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +0 -19
- package/corpus/templates/calendar/app/lib/attendee-local-time.ts +14 -5
- package/corpus/templates/calendar/changelog/2026-07-13-your-local-time-now-follows-your-browser-timezone-and-event-.md +6 -0
- package/corpus/templates/chat/.agents/skills/security/SKILL.md +10 -0
- package/corpus/templates/clips/.agents/skills/recording/SKILL.md +7 -2
- package/corpus/templates/clips/.agents/skills/security/SKILL.md +10 -0
- package/corpus/templates/clips/AGENTS.md +7 -0
- package/corpus/templates/clips/actions/list-meetings.ts +19 -4
- package/corpus/templates/clips/actions/start-meeting-recording.ts +7 -1
- package/corpus/templates/clips/app/components/meetings/transcript-bubbles.tsx +75 -78
- package/corpus/templates/clips/app/components/recorder/confetti-canvas.tsx +18 -1
- package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +6 -12
- package/corpus/templates/clips/app/components/recorder/recording-toolbar.tsx +19 -2
- package/corpus/templates/clips/app/lib/camera-composite.ts +70 -10
- package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +1 -1
- package/corpus/templates/clips/app/routes/record.tsx +5 -25
- package/corpus/templates/clips/changelog/2026-07-13-clips-desktop-now-requires-macos-13-for-native-capture.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-13-clips-hide-solo-meeting-reminders.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-13-clips-now-removes-duplicate-mic-and-system-transcript-turns-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-13-desktop-recordings-run-cooler-and-quieter-live-transcription.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-13-meeting-recordings-now-stop-after-a-calendar-meeting-ends-an.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-13-meeting-transcripts-now-use-a-clean-agent-chat-style-reading.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-13-screen-recordings-use-less-processing-power-during-longer-ca.md +6 -0
- package/corpus/templates/clips/chrome-extension/src/background.ts +5 -3
- package/corpus/templates/clips/chrome-extension/src/offscreen.ts +17 -14
- package/corpus/templates/clips/chrome-extension/src/overlay.ts +8 -2
- package/corpus/templates/clips/desktop/README.md +3 -0
- package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +9 -0
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +8 -2
- package/corpus/templates/clips/desktop/src/lib/silence-events.ts +1 -0
- package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +5 -0
- package/corpus/templates/clips/desktop/src/lib/transcription-engine.ts +134 -5
- package/corpus/templates/clips/desktop/src/lib/upload-video-stream.ts +28 -0
- package/corpus/templates/clips/desktop/src/overlays/flow-bar.tsx +10 -3
- package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +42 -9
- package/corpus/templates/clips/desktop/src/overlays/recording-pill.tsx +10 -2
- package/corpus/templates/clips/desktop/src-tauri/Cargo.toml +6 -1
- package/corpus/templates/clips/desktop/src-tauri/src/notifications.rs +77 -1
- package/corpus/templates/clips/desktop/src-tauri/src/silence_detector.rs +104 -25
- package/corpus/templates/clips/desktop/src-tauri/src/system_audio.rs +4 -0
- package/corpus/templates/clips/desktop/src-tauri/src/whisper_speech.rs +287 -32
- package/corpus/templates/clips/desktop/src-tauri/tauri.conf.json +1 -1
- package/corpus/templates/clips/server/lib/calendar-event-classification.ts +28 -0
- package/corpus/templates/clips/server/routes/[...page].get.ts +1 -59
- package/corpus/templates/clips/shared/recording-capture.ts +37 -0
- package/corpus/templates/content/.agents/skills/security/SKILL.md +10 -0
- package/corpus/templates/content/agent-native.app-skill.json +1 -1
- package/corpus/templates/content/server/routes/[...page].get.ts +1 -15
- package/corpus/templates/design/.agents/skills/security/SKILL.md +10 -0
- package/corpus/templates/design/actions/connect-assets-mcp.ts +1 -1
- package/corpus/templates/design/agent-native.app-skill.json +1 -1
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +88 -12
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +1 -0
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +4 -1
- package/corpus/templates/design/changelog/2026-07-13-adding-shapes-preserves-canvas-background.md +6 -0
- package/corpus/templates/design/changelog/2026-07-13-clicking-quickly-between-overlapping-elements-no-longer-bounc.md +6 -0
- package/corpus/templates/design/server/plugins/assets-mcp.ts +1 -1
- package/corpus/templates/design/server/routes/[...page].get.ts +0 -2
- package/corpus/templates/dispatch/.agents/skills/security/SKILL.md +10 -0
- package/corpus/templates/forms/.agents/skills/security/SKILL.md +10 -0
- package/corpus/templates/macros/.agents/skills/security/SKILL.md +10 -0
- package/corpus/templates/mail/.agents/skills/security/SKILL.md +10 -0
- package/corpus/templates/plan/.agents/skills/security/SKILL.md +10 -0
- package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +1 -1
- package/corpus/templates/plan/.agents/skills/visual-recap/SKILL.md +2 -2
- package/corpus/templates/plan/agent-native.app-skill.json +1 -1
- package/corpus/templates/plan/app/lib/plan-local-bridge.ts +6 -1
- package/corpus/templates/plan/app/pages/PlansPage.tsx +15 -6
- package/corpus/templates/plan/changelog/2026-07-13-fixed-local-plan-previews-continuously-flickering-while-revi.md +6 -0
- package/corpus/templates/plan/server/routes/[...page].get.ts +0 -2
- package/corpus/templates/slides/.agents/skills/security/SKILL.md +10 -0
- package/dist/a2a/client.d.ts +2 -0
- package/dist/a2a/client.d.ts.map +1 -1
- package/dist/a2a/client.js +2 -0
- package/dist/a2a/client.js.map +1 -1
- package/dist/a2a/handlers.d.ts.map +1 -1
- package/dist/a2a/handlers.js +84 -7
- package/dist/a2a/handlers.js.map +1 -1
- package/dist/cli/connect.d.ts +2 -2
- package/dist/cli/connect.d.ts.map +1 -1
- package/dist/cli/connect.js +45 -23
- package/dist/cli/connect.js.map +1 -1
- package/dist/cli/mcp-config-writers.d.ts.map +1 -1
- package/dist/cli/mcp-config-writers.js +7 -0
- package/dist/cli/mcp-config-writers.js.map +1 -1
- package/dist/cli/mcp.js +5 -3
- package/dist/cli/mcp.js.map +1 -1
- package/dist/cli/skills-content/assets-skill.d.ts +1 -1
- package/dist/cli/skills-content/assets-skill.d.ts.map +1 -1
- package/dist/cli/skills-content/assets-skill.js +1 -1
- package/dist/cli/skills-content/assets-skill.js.map +1 -1
- package/dist/cli/skills-content/design-exploration-skill.d.ts +1 -1
- package/dist/cli/skills-content/design-exploration-skill.d.ts.map +1 -1
- package/dist/cli/skills-content/design-exploration-skill.js +1 -1
- package/dist/cli/skills-content/design-exploration-skill.js.map +1 -1
- package/dist/cli/skills-content/help.d.ts +1 -1
- package/dist/cli/skills-content/help.d.ts.map +1 -1
- package/dist/cli/skills-content/help.js +1 -1
- package/dist/cli/skills-content/help.js.map +1 -1
- package/dist/cli/skills-content/plan-setup-auth.d.ts +1 -1
- package/dist/cli/skills-content/plan-setup-auth.d.ts.map +1 -1
- package/dist/cli/skills-content/plan-setup-auth.js +1 -1
- package/dist/cli/skills-content/plan-setup-auth.js.map +1 -1
- package/dist/cli/skills-content/visual-plan-skill.d.ts +1 -1
- package/dist/cli/skills-content/visual-plan-skill.d.ts.map +1 -1
- package/dist/cli/skills-content/visual-plan-skill.js +1 -1
- package/dist/cli/skills-content/visual-plan-skill.js.map +1 -1
- package/dist/cli/skills-content/visual-recap-skill.d.ts +1 -1
- package/dist/cli/skills-content/visual-recap-skill.d.ts.map +1 -1
- package/dist/cli/skills-content/visual-recap-skill.js +2 -2
- package/dist/cli/skills-content/visual-recap-skill.js.map +1 -1
- package/dist/cli/skills.d.ts.map +1 -1
- package/dist/cli/skills.js +16 -12
- package/dist/cli/skills.js.map +1 -1
- package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
- package/dist/client/resources/McpIntegrationDialog.js +1 -1
- package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
- package/dist/client/resources/mcp-integration-catalog.d.ts +1 -0
- package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
- package/dist/client/resources/mcp-integration-catalog.js +14 -0
- package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
- package/dist/collab/routes.d.ts +2 -2
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/embedding/agent.d.ts.map +1 -1
- package/dist/embedding/agent.js +6 -7
- package/dist/embedding/agent.js.map +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +1 -1
- package/dist/localization/default-messages.d.ts +5 -0
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +5 -0
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/mcp/ask-app-inline-tasks.d.ts +47 -0
- package/dist/mcp/ask-app-inline-tasks.d.ts.map +1 -0
- package/dist/mcp/ask-app-inline-tasks.js +87 -0
- package/dist/mcp/ask-app-inline-tasks.js.map +1 -0
- package/dist/mcp/build-server.d.ts.map +1 -1
- package/dist/mcp/build-server.js +56 -3
- package/dist/mcp/build-server.js.map +1 -1
- package/dist/mcp/builtin-tools.d.ts.map +1 -1
- package/dist/mcp/builtin-tools.js +141 -21
- package/dist/mcp/builtin-tools.js.map +1 -1
- package/dist/mcp/connect-route.d.ts +12 -10
- package/dist/mcp/connect-route.d.ts.map +1 -1
- package/dist/mcp/connect-route.js +17 -14
- package/dist/mcp/connect-route.js.map +1 -1
- package/dist/mcp/oauth-route.d.ts +1 -1
- package/dist/mcp/oauth-route.d.ts.map +1 -1
- package/dist/mcp/oauth-route.js +30 -13
- package/dist/mcp/oauth-route.js.map +1 -1
- package/dist/mcp/route-paths.d.ts +13 -0
- package/dist/mcp/route-paths.d.ts.map +1 -0
- package/dist/mcp/route-paths.js +27 -0
- package/dist/mcp/route-paths.js.map +1 -0
- package/dist/mcp/server.d.ts +2 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +14 -6
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/stdio.d.ts +7 -6
- package/dist/mcp/stdio.d.ts.map +1 -1
- package/dist/mcp/stdio.js +27 -15
- package/dist/mcp/stdio.js.map +1 -1
- package/dist/mcp/workspace-resolve.d.ts +2 -1
- package/dist/mcp/workspace-resolve.d.ts.map +1 -1
- package/dist/mcp/workspace-resolve.js +2 -1
- package/dist/mcp/workspace-resolve.js.map +1 -1
- package/dist/mcp-client/manager.js +6 -3
- package/dist/mcp-client/manager.js.map +1 -1
- package/dist/mcp-client/remote-store.js +5 -7
- package/dist/mcp-client/remote-store.js.map +1 -1
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/observability/routes.d.ts +5 -5
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/dist/resources/handlers.d.ts +2 -2
- package/dist/secrets/routes.d.ts +9 -9
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +43 -11
- 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/auth.d.ts.map +1 -1
- package/dist/server/auth.js +16 -6
- package/dist/server/auth.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts +4 -3
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +20 -15
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/csrf.d.ts.map +1 -1
- package/dist/server/csrf.js +11 -0
- package/dist/server/csrf.js.map +1 -1
- package/dist/server/framework-request-handler.d.ts.map +1 -1
- package/dist/server/framework-request-handler.js +8 -2
- package/dist/server/framework-request-handler.js.map +1 -1
- package/dist/server/google-oauth.d.ts +2 -0
- package/dist/server/google-oauth.d.ts.map +1 -1
- package/dist/server/google-oauth.js +5 -0
- package/dist/server/google-oauth.js.map +1 -1
- package/dist/server/http-response-telemetry.d.ts.map +1 -1
- package/dist/server/http-response-telemetry.js +4 -1
- package/dist/server/http-response-telemetry.js.map +1 -1
- package/dist/server/recap-image-route.js +3 -3
- package/dist/server/recap-image-route.js.map +1 -1
- package/dist/server/security-headers.d.ts.map +1 -1
- package/dist/server/security-headers.js +4 -1
- package/dist/server/security-headers.js.map +1 -1
- package/dist/server/ssr-handler.d.ts.map +1 -1
- package/dist/server/ssr-handler.js +3 -1
- package/dist/server/ssr-handler.js.map +1 -1
- package/dist/shared/cache-control.d.ts +7 -6
- package/dist/shared/cache-control.d.ts.map +1 -1
- package/dist/shared/cache-control.js +4 -3
- package/dist/shared/cache-control.js.map +1 -1
- package/dist/templates/default/.agents/skills/security/SKILL.md +10 -0
- package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +15 -6
- package/dist/templates/workspace-core/.agents/skills/external-agents/SKILL.md +16 -10
- package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +20 -1
- package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +10 -0
- package/docs/content/actions.mdx +1 -1
- package/docs/content/authentication.mdx +1 -1
- package/docs/content/dispatch.mdx +3 -3
- package/docs/content/external-agents.mdx +30 -19
- package/docs/content/locales/ar-SA/actions.mdx +1 -1
- package/docs/content/locales/ar-SA/authentication.mdx +1 -1
- package/docs/content/locales/ar-SA/dispatch.mdx +3 -3
- package/docs/content/locales/ar-SA/external-agents.mdx +23 -19
- package/docs/content/locales/ar-SA/mcp-clients.mdx +31 -3
- package/docs/content/locales/ar-SA/mcp-protocol.mdx +29 -15
- package/docs/content/locales/ar-SA/plan-plugin.mdx +3 -3
- package/docs/content/locales/ar-SA/server.mdx +2 -2
- package/docs/content/locales/ar-SA/skills-guide.mdx +1 -1
- package/docs/content/locales/ar-SA/template-assets.mdx +1 -1
- package/docs/content/locales/ar-SA/template-dispatch.mdx +2 -2
- package/docs/content/locales/ar-SA/template-plan.mdx +3 -3
- package/docs/content/locales/de-DE/actions.mdx +1 -1
- package/docs/content/locales/de-DE/authentication.mdx +1 -1
- package/docs/content/locales/de-DE/dispatch.mdx +3 -3
- package/docs/content/locales/de-DE/external-agents.mdx +23 -19
- package/docs/content/locales/de-DE/mcp-clients.mdx +37 -3
- package/docs/content/locales/de-DE/mcp-protocol.mdx +29 -15
- package/docs/content/locales/de-DE/plan-plugin.mdx +3 -3
- package/docs/content/locales/de-DE/server.mdx +2 -2
- package/docs/content/locales/de-DE/skills-guide.mdx +1 -1
- package/docs/content/locales/de-DE/template-assets.mdx +1 -1
- package/docs/content/locales/de-DE/template-dispatch.mdx +2 -2
- package/docs/content/locales/de-DE/template-plan.mdx +3 -3
- package/docs/content/locales/es-ES/actions.mdx +1 -1
- package/docs/content/locales/es-ES/authentication.mdx +1 -1
- package/docs/content/locales/es-ES/dispatch.mdx +3 -3
- package/docs/content/locales/es-ES/external-agents.mdx +32 -19
- package/docs/content/locales/es-ES/mcp-clients.mdx +17 -3
- package/docs/content/locales/es-ES/mcp-protocol.mdx +38 -15
- package/docs/content/locales/es-ES/plan-plugin.mdx +3 -3
- package/docs/content/locales/es-ES/server.mdx +2 -2
- package/docs/content/locales/es-ES/skills-guide.mdx +1 -1
- package/docs/content/locales/es-ES/template-assets.mdx +1 -1
- package/docs/content/locales/es-ES/template-dispatch.mdx +2 -2
- package/docs/content/locales/es-ES/template-plan.mdx +3 -3
- package/docs/content/locales/fr-FR/actions.mdx +1 -1
- package/docs/content/locales/fr-FR/authentication.mdx +1 -1
- package/docs/content/locales/fr-FR/dispatch.mdx +3 -3
- package/docs/content/locales/fr-FR/external-agents.mdx +23 -19
- package/docs/content/locales/fr-FR/mcp-clients.mdx +17 -3
- package/docs/content/locales/fr-FR/mcp-protocol.mdx +29 -15
- package/docs/content/locales/fr-FR/plan-plugin.mdx +3 -3
- package/docs/content/locales/fr-FR/server.mdx +2 -2
- package/docs/content/locales/fr-FR/skills-guide.mdx +1 -1
- package/docs/content/locales/fr-FR/template-assets.mdx +1 -1
- package/docs/content/locales/fr-FR/template-dispatch.mdx +2 -2
- package/docs/content/locales/fr-FR/template-plan.mdx +3 -3
- package/docs/content/locales/hi-IN/actions.mdx +1 -1
- package/docs/content/locales/hi-IN/authentication.mdx +1 -1
- package/docs/content/locales/hi-IN/dispatch.mdx +3 -3
- package/docs/content/locales/hi-IN/external-agents.mdx +31 -19
- package/docs/content/locales/hi-IN/mcp-clients.mdx +17 -3
- package/docs/content/locales/hi-IN/mcp-protocol.mdx +36 -15
- package/docs/content/locales/hi-IN/plan-plugin.mdx +3 -3
- package/docs/content/locales/hi-IN/server.mdx +2 -2
- package/docs/content/locales/hi-IN/skills-guide.mdx +1 -1
- package/docs/content/locales/hi-IN/template-assets.mdx +1 -1
- package/docs/content/locales/hi-IN/template-dispatch.mdx +2 -2
- package/docs/content/locales/hi-IN/template-plan.mdx +3 -3
- package/docs/content/locales/ja-JP/actions.mdx +1 -1
- package/docs/content/locales/ja-JP/authentication.mdx +1 -1
- package/docs/content/locales/ja-JP/dispatch.mdx +3 -3
- package/docs/content/locales/ja-JP/external-agents.mdx +23 -19
- package/docs/content/locales/ja-JP/mcp-clients.mdx +34 -3
- package/docs/content/locales/ja-JP/mcp-protocol.mdx +29 -15
- package/docs/content/locales/ja-JP/plan-plugin.mdx +3 -3
- package/docs/content/locales/ja-JP/server.mdx +2 -2
- package/docs/content/locales/ja-JP/skills-guide.mdx +1 -1
- package/docs/content/locales/ja-JP/template-assets.mdx +1 -1
- package/docs/content/locales/ja-JP/template-dispatch.mdx +2 -2
- package/docs/content/locales/ja-JP/template-plan.mdx +3 -3
- package/docs/content/locales/ko-KR/actions.mdx +1 -1
- package/docs/content/locales/ko-KR/authentication.mdx +1 -1
- package/docs/content/locales/ko-KR/dispatch.mdx +3 -3
- package/docs/content/locales/ko-KR/external-agents.mdx +30 -19
- package/docs/content/locales/ko-KR/mcp-clients.mdx +33 -3
- package/docs/content/locales/ko-KR/mcp-protocol.mdx +36 -15
- package/docs/content/locales/ko-KR/plan-plugin.mdx +3 -3
- package/docs/content/locales/ko-KR/server.mdx +2 -2
- package/docs/content/locales/ko-KR/skills-guide.mdx +1 -1
- package/docs/content/locales/ko-KR/template-assets.mdx +1 -1
- package/docs/content/locales/ko-KR/template-dispatch.mdx +2 -2
- package/docs/content/locales/ko-KR/template-plan.mdx +3 -3
- package/docs/content/locales/pt-BR/actions.mdx +1 -1
- package/docs/content/locales/pt-BR/authentication.mdx +1 -1
- package/docs/content/locales/pt-BR/dispatch.mdx +3 -3
- package/docs/content/locales/pt-BR/external-agents.mdx +32 -19
- package/docs/content/locales/pt-BR/mcp-clients.mdx +34 -3
- package/docs/content/locales/pt-BR/mcp-protocol.mdx +32 -15
- package/docs/content/locales/pt-BR/plan-plugin.mdx +3 -3
- package/docs/content/locales/pt-BR/server.mdx +2 -2
- package/docs/content/locales/pt-BR/skills-guide.mdx +1 -1
- package/docs/content/locales/pt-BR/template-assets.mdx +1 -1
- package/docs/content/locales/pt-BR/template-dispatch.mdx +2 -2
- package/docs/content/locales/pt-BR/template-plan.mdx +3 -3
- package/docs/content/locales/zh-CN/actions.mdx +1 -1
- package/docs/content/locales/zh-CN/authentication.mdx +1 -1
- package/docs/content/locales/zh-CN/dispatch.mdx +3 -3
- package/docs/content/locales/zh-CN/external-agents.mdx +23 -19
- package/docs/content/locales/zh-CN/mcp-clients.mdx +28 -3
- package/docs/content/locales/zh-CN/mcp-protocol.mdx +29 -15
- package/docs/content/locales/zh-CN/plan-plugin.mdx +3 -3
- package/docs/content/locales/zh-CN/server.mdx +2 -2
- package/docs/content/locales/zh-CN/skills-guide.mdx +1 -1
- package/docs/content/locales/zh-CN/template-assets.mdx +1 -1
- package/docs/content/locales/zh-CN/template-dispatch.mdx +2 -2
- package/docs/content/locales/zh-CN/template-plan.mdx +3 -3
- package/docs/content/locales/zh-TW/actions.mdx +1 -1
- package/docs/content/locales/zh-TW/authentication.mdx +1 -1
- package/docs/content/locales/zh-TW/dispatch.mdx +3 -3
- package/docs/content/locales/zh-TW/external-agents.mdx +23 -19
- package/docs/content/locales/zh-TW/mcp-clients.mdx +28 -3
- package/docs/content/locales/zh-TW/mcp-protocol.mdx +30 -15
- package/docs/content/locales/zh-TW/plan-plugin.mdx +3 -3
- package/docs/content/locales/zh-TW/server.mdx +2 -2
- package/docs/content/locales/zh-TW/skills-guide.mdx +1 -1
- package/docs/content/locales/zh-TW/template-assets.mdx +1 -1
- package/docs/content/locales/zh-TW/template-dispatch.mdx +2 -2
- package/docs/content/locales/zh-TW/template-plan.mdx +3 -3
- package/docs/content/mcp-clients.mdx +31 -4
- package/docs/content/mcp-protocol.mdx +35 -15
- package/docs/content/plan-plugin.mdx +3 -3
- package/docs/content/server.mdx +2 -2
- package/docs/content/skills-guide.mdx +1 -1
- package/docs/content/template-assets.mdx +1 -1
- package/docs/content/template-dispatch.mdx +2 -2
- package/docs/content/template-plan.mdx +3 -3
- package/package.json +1 -1
- package/src/templates/default/.agents/skills/security/SKILL.md +10 -0
- package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +15 -6
- package/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +16 -10
- package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +20 -1
- package/src/templates/workspace-core/.agents/skills/security/SKILL.md +10 -0
|
@@ -352,9 +352,18 @@ export function RecordingPill() {
|
|
|
352
352
|
);
|
|
353
353
|
|
|
354
354
|
const startMs = Date.now();
|
|
355
|
+
let lastDrawMs = 0;
|
|
356
|
+
// A bar meter reads the same to the eye well below display refresh rate
|
|
357
|
+
// (60-120Hz); cap the actual draw work to ~20fps while still scheduling
|
|
358
|
+
// via rAF every frame so the loop still pauses when the pill is hidden.
|
|
359
|
+
const FRAME_INTERVAL_MS = 1000 / 20;
|
|
355
360
|
const tick = () => {
|
|
361
|
+
rafRef.current = requestAnimationFrame(tick);
|
|
362
|
+
const nowMs = Date.now();
|
|
363
|
+
if (nowMs - lastDrawMs < FRAME_INTERVAL_MS) return;
|
|
364
|
+
lastDrawMs = nowMs;
|
|
356
365
|
// Modulo prevents float precision loss on long recordings.
|
|
357
|
-
const t = (
|
|
366
|
+
const t = (nowMs - startMs) % 1_000_000;
|
|
358
367
|
for (const s of setups) {
|
|
359
368
|
const target = Math.min(1, s.levelRef.current * s.gain);
|
|
360
369
|
|
|
@@ -385,7 +394,6 @@ export function RecordingPill() {
|
|
|
385
394
|
}
|
|
386
395
|
s.ctx2d.shadowBlur = 0;
|
|
387
396
|
}
|
|
388
|
-
rafRef.current = requestAnimationFrame(tick);
|
|
389
397
|
};
|
|
390
398
|
tick();
|
|
391
399
|
return () => {
|
|
@@ -124,7 +124,12 @@ screencapturekit = { version = "2.0.0", features = ["macos_15_0"] }
|
|
|
124
124
|
# AudioBufferList type so we can hand SCK's CMSampleBuffer audio bytes to
|
|
125
125
|
# AVAudioPCMBuffer for the speech recognizer.
|
|
126
126
|
objc2-core-audio-types = "0.3"
|
|
127
|
-
whisper-
|
|
127
|
+
# `metal` builds whisper.cpp's ggml-metal backend and links it in (the sys
|
|
128
|
+
# crate's build script embeds the compiled metallib, so no app-bundle/runtime
|
|
129
|
+
# asset changes are needed). Without it, whisper.cpp decode runs CPU-only.
|
|
130
|
+
# `use_gpu` is still set explicitly per-arch in whisper_speech.rs so Intel
|
|
131
|
+
# Macs don't exercise Metal even though the feature is compiled in.
|
|
132
|
+
whisper-rs = { version = "0.16.0", features = ["metal"] }
|
|
128
133
|
# NOTE: We hand-roll the few EventKit selectors we need via raw `objc2`
|
|
129
134
|
# msg_send! in `eventkit.rs` rather than depending on the `objc2-event-kit`
|
|
130
135
|
# crate. Its API surface drifts between minor 0.3.x releases (and not
|
|
@@ -6,8 +6,13 @@
|
|
|
6
6
|
|
|
7
7
|
use serde::{Deserialize, Serialize};
|
|
8
8
|
use serde_json::Value;
|
|
9
|
+
use std::sync::atomic::{AtomicBool, Ordering};
|
|
9
10
|
use std::sync::Mutex;
|
|
10
|
-
use
|
|
11
|
+
use std::time::Duration;
|
|
12
|
+
use tauri::{
|
|
13
|
+
AppHandle, Emitter, Manager, PhysicalPosition, PhysicalSize, WebviewWindow,
|
|
14
|
+
WebviewWindowBuilder,
|
|
15
|
+
};
|
|
11
16
|
|
|
12
17
|
use crate::dlog;
|
|
13
18
|
use crate::util::{
|
|
@@ -54,6 +59,75 @@ fn notification_rect(app: &AppHandle) -> (u32, u32, i32, i32) {
|
|
|
54
59
|
(w, h, x, top.max(0))
|
|
55
60
|
}
|
|
56
61
|
|
|
62
|
+
static MEETING_NOTIF_HOVER_TRACKING: AtomicBool = AtomicBool::new(false);
|
|
63
|
+
|
|
64
|
+
/// True when the global cursor sits inside the notification window's frame.
|
|
65
|
+
/// Mirrors `cursor_inside_pill_frame` in `recording_indicator.rs`: cursor and
|
|
66
|
+
/// frame both come from Tauri (physical px, desktop top-left origin), so the
|
|
67
|
+
/// test is a plain point-in-rect with no AppKit hop.
|
|
68
|
+
fn cursor_inside_notification_frame(window: &WebviewWindow) -> bool {
|
|
69
|
+
let (Ok(c), Ok(p), Ok(s)) = (
|
|
70
|
+
window.cursor_position(),
|
|
71
|
+
window.outer_position(),
|
|
72
|
+
window.outer_size(),
|
|
73
|
+
) else {
|
|
74
|
+
return false;
|
|
75
|
+
};
|
|
76
|
+
c.x >= p.x as f64
|
|
77
|
+
&& c.x <= (p.x + s.width as i32) as f64
|
|
78
|
+
&& c.y >= p.y as f64
|
|
79
|
+
&& c.y <= (p.y + s.height as i32) as f64
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/// Poll the cursor against the notification frame and emit
|
|
83
|
+
/// `meetings:notification-hover` on transitions. The window never becomes key
|
|
84
|
+
/// (`show_without_activation` uses `orderFrontRegardless`, not
|
|
85
|
+
/// `makeKeyAndOrderFront:`), so CSS `:hover`/`onMouseEnter` only fires once
|
|
86
|
+
/// the user's first click makes it key — this poll is the fallback that
|
|
87
|
+
/// reveals the close button on real hover before that click, same pattern as
|
|
88
|
+
/// `start_pill_hover_tracking`. Idempotent — a second call is a no-op while a
|
|
89
|
+
/// loop is already running.
|
|
90
|
+
fn start_meeting_notification_hover_tracking(app: &AppHandle) {
|
|
91
|
+
if MEETING_NOTIF_HOVER_TRACKING.swap(true, Ordering::SeqCst) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
let app = app.clone();
|
|
95
|
+
tauri::async_runtime::spawn(async move {
|
|
96
|
+
let mut prev = false;
|
|
97
|
+
while MEETING_NOTIF_HOVER_TRACKING.load(Ordering::Relaxed) {
|
|
98
|
+
let Some(win) = app.get_webview_window(MEETING_NOTIFICATION_LABEL) else {
|
|
99
|
+
break;
|
|
100
|
+
};
|
|
101
|
+
// The window is reused across notifications (hidden/shown from
|
|
102
|
+
// the frontend, never destroyed), so this loop runs for the rest
|
|
103
|
+
// of the app session. Skip the cursor/frame queries entirely
|
|
104
|
+
// while hidden — no notification is on screen to hover — and
|
|
105
|
+
// back off to a slower idle tick until it's shown again.
|
|
106
|
+
if !win.is_visible().unwrap_or(false) {
|
|
107
|
+
if prev {
|
|
108
|
+
prev = false;
|
|
109
|
+
let _ = win.emit(
|
|
110
|
+
"meetings:notification-hover",
|
|
111
|
+
serde_json::json!({ "hovered": false }),
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
tokio::time::sleep(Duration::from_millis(250)).await;
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
let inside = cursor_inside_notification_frame(&win);
|
|
118
|
+
if inside != prev {
|
|
119
|
+
prev = inside;
|
|
120
|
+
let _ = win.emit(
|
|
121
|
+
"meetings:notification-hover",
|
|
122
|
+
serde_json::json!({ "hovered": inside }),
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
tokio::time::sleep(Duration::from_millis(80)).await;
|
|
126
|
+
}
|
|
127
|
+
MEETING_NOTIF_HOVER_TRACKING.store(false, Ordering::SeqCst);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
|
|
57
131
|
pub fn show_meeting_notification_window(app: &AppHandle) -> Result<(), String> {
|
|
58
132
|
let (w, h, x, y) = notification_rect(app);
|
|
59
133
|
if let Some(existing) = app.get_webview_window(MEETING_NOTIFICATION_LABEL) {
|
|
@@ -61,6 +135,7 @@ pub fn show_meeting_notification_window(app: &AppHandle) -> Result<(), String> {
|
|
|
61
135
|
let _ = existing.set_position(PhysicalPosition::new(x, y));
|
|
62
136
|
configure_overlay_behavior(&existing);
|
|
63
137
|
show_without_activation(&existing);
|
|
138
|
+
start_meeting_notification_hover_tracking(&app);
|
|
64
139
|
return Ok(());
|
|
65
140
|
}
|
|
66
141
|
|
|
@@ -97,6 +172,7 @@ pub fn show_meeting_notification_window(app: &AppHandle) -> Result<(), String> {
|
|
|
97
172
|
// own recording chrome is still excluded elsewhere so it won't leak.)
|
|
98
173
|
configure_overlay_behavior(&win);
|
|
99
174
|
show_without_activation(&win);
|
|
175
|
+
start_meeting_notification_hover_tracking(&app);
|
|
100
176
|
Ok(())
|
|
101
177
|
}
|
|
102
178
|
|
|
@@ -14,6 +14,9 @@
|
|
|
14
14
|
//! * **Call-end heuristic** — best-effort: if a known video-conferencing
|
|
15
15
|
//! bundle id (Zoom, Google Meet wrapper, MS Teams) goes from frontmost
|
|
16
16
|
//! to background for >2 minutes, emit `meetings:call-ended`.
|
|
17
|
+
//! * **Calendar end** — when the scheduled meeting end has passed and both
|
|
18
|
+
//! audio sources have been quiet for the call-end window, emit the same
|
|
19
|
+
//! event even if the conferencing app remains frontmost.
|
|
17
20
|
//!
|
|
18
21
|
//! Renderer-side responsibility: subscribe via `silence-events.ts`, dispatch
|
|
19
22
|
//! the `stop-meeting-recording` action when any of the events fire.
|
|
@@ -40,7 +43,7 @@
|
|
|
40
43
|
//! trick is equivalent and uses constant memory.
|
|
41
44
|
|
|
42
45
|
use std::sync::{Arc, Mutex, OnceLock};
|
|
43
|
-
use std::time::{Duration, Instant};
|
|
46
|
+
use std::time::{Duration, Instant, SystemTime, UNIX_EPOCH};
|
|
44
47
|
|
|
45
48
|
use serde::Deserialize;
|
|
46
49
|
use tauri::{AppHandle, Emitter, Listener, Manager};
|
|
@@ -66,6 +69,10 @@ pub struct SilenceConfig {
|
|
|
66
69
|
/// Whether to enable the call-ended heuristic.
|
|
67
70
|
#[serde(default = "default_true")]
|
|
68
71
|
pub watch_call_ended: bool,
|
|
72
|
+
/// Unix epoch milliseconds for the calendar event's scheduled end.
|
|
73
|
+
/// Calendar-end stopping still requires quiet audio as confirmation.
|
|
74
|
+
#[serde(default)]
|
|
75
|
+
pub scheduled_end_ms: Option<u64>,
|
|
69
76
|
}
|
|
70
77
|
|
|
71
78
|
fn default_threshold() -> f32 {
|
|
@@ -108,6 +115,8 @@ struct DetectorInner {
|
|
|
108
115
|
system: Option<SourceState>,
|
|
109
116
|
/// Already fired the silence-stop event in this session?
|
|
110
117
|
silence_fired: bool,
|
|
118
|
+
/// Calendar event end for the active session, if one is known.
|
|
119
|
+
scheduled_end_ms: Option<u64>,
|
|
111
120
|
}
|
|
112
121
|
|
|
113
122
|
pub struct DetectorState {
|
|
@@ -142,6 +151,7 @@ pub fn silence_detector_start(app: AppHandle, config: Option<SilenceConfig>) ->
|
|
|
142
151
|
call_ended_ms: default_call_ended_ms(),
|
|
143
152
|
watch_sleep: true,
|
|
144
153
|
watch_call_ended: true,
|
|
154
|
+
scheduled_end_ms: None,
|
|
145
155
|
});
|
|
146
156
|
|
|
147
157
|
// Install the audio-level listener exactly once for the process.
|
|
@@ -185,6 +195,7 @@ pub fn silence_detector_start(app: AppHandle, config: Option<SilenceConfig>) ->
|
|
|
185
195
|
g.active = true;
|
|
186
196
|
g.silence_fired = false;
|
|
187
197
|
g.config = Some(cfg.clone());
|
|
198
|
+
g.scheduled_end_ms = cfg.scheduled_end_ms;
|
|
188
199
|
// Seed both buckets with `now()` so we don't insta-fire on start
|
|
189
200
|
// before any audio has streamed in yet.
|
|
190
201
|
g.mic = Some(SourceState::fresh());
|
|
@@ -198,9 +209,10 @@ pub fn silence_detector_start(app: AppHandle, config: Option<SilenceConfig>) ->
|
|
|
198
209
|
let inner_for_supervisor = state.inner.clone();
|
|
199
210
|
let app_for_supervisor = app.clone();
|
|
200
211
|
let silence_window = Duration::from_millis(cfg.silence_ms);
|
|
212
|
+
let calendar_end_quiet_window = Duration::from_millis(cfg.call_ended_ms);
|
|
201
213
|
std::thread::spawn(move || loop {
|
|
202
214
|
std::thread::sleep(Duration::from_secs(5));
|
|
203
|
-
let
|
|
215
|
+
let stop_reason = {
|
|
204
216
|
let g = match inner_for_supervisor.lock() {
|
|
205
217
|
Ok(g) => g,
|
|
206
218
|
Err(_) => return,
|
|
@@ -209,7 +221,7 @@ pub fn silence_detector_start(app: AppHandle, config: Option<SilenceConfig>) ->
|
|
|
209
221
|
return; // session ended or replaced — exit
|
|
210
222
|
}
|
|
211
223
|
if g.silence_fired {
|
|
212
|
-
|
|
224
|
+
None
|
|
213
225
|
} else {
|
|
214
226
|
let now = Instant::now();
|
|
215
227
|
let mic_silent = g
|
|
@@ -222,14 +234,39 @@ pub fn silence_detector_start(app: AppHandle, config: Option<SilenceConfig>) ->
|
|
|
222
234
|
.as_ref()
|
|
223
235
|
.map(|s| now.duration_since(s.last_loud_at) >= silence_window)
|
|
224
236
|
.unwrap_or(false);
|
|
225
|
-
|
|
237
|
+
let mic_quiet_for_calendar_end = g
|
|
238
|
+
.mic
|
|
239
|
+
.as_ref()
|
|
240
|
+
.map(|s| now.duration_since(s.last_loud_at) >= calendar_end_quiet_window)
|
|
241
|
+
.unwrap_or(false);
|
|
242
|
+
let system_quiet_for_calendar_end = g
|
|
243
|
+
.system
|
|
244
|
+
.as_ref()
|
|
245
|
+
.map(|s| now.duration_since(s.last_loud_at) >= calendar_end_quiet_window)
|
|
246
|
+
.unwrap_or(false);
|
|
247
|
+
if calendar_end_stop_ready(
|
|
248
|
+
g.scheduled_end_ms,
|
|
249
|
+
unix_now_ms(),
|
|
250
|
+
mic_quiet_for_calendar_end && system_quiet_for_calendar_end,
|
|
251
|
+
) {
|
|
252
|
+
Some("calendar")
|
|
253
|
+
} else if mic_silent && system_silent {
|
|
254
|
+
Some("silence")
|
|
255
|
+
} else {
|
|
256
|
+
None
|
|
257
|
+
}
|
|
226
258
|
}
|
|
227
259
|
};
|
|
228
|
-
if
|
|
260
|
+
if let Some(reason) = stop_reason {
|
|
229
261
|
if let Ok(mut g) = inner_for_supervisor.lock() {
|
|
230
262
|
g.silence_fired = true;
|
|
231
263
|
}
|
|
232
|
-
let
|
|
264
|
+
let event = if reason == "calendar" {
|
|
265
|
+
"meetings:call-ended"
|
|
266
|
+
} else {
|
|
267
|
+
"meetings:silence-stop"
|
|
268
|
+
};
|
|
269
|
+
let _ = app_for_supervisor.emit(event, ());
|
|
233
270
|
}
|
|
234
271
|
});
|
|
235
272
|
|
|
@@ -255,6 +292,7 @@ pub fn silence_detector_stop(app: AppHandle) -> Result<(), String> {
|
|
|
255
292
|
g.silence_fired = false;
|
|
256
293
|
g.mic = None;
|
|
257
294
|
g.system = None;
|
|
295
|
+
g.scheduled_end_ms = None;
|
|
258
296
|
Ok(())
|
|
259
297
|
}
|
|
260
298
|
|
|
@@ -331,6 +369,7 @@ fn install_call_ended_watcher(app: &AppHandle, threshold_ms: u64) {
|
|
|
331
369
|
let mut ever_seen_front = false;
|
|
332
370
|
let mut last_front_at: Option<Instant> = None;
|
|
333
371
|
let mut fired = false;
|
|
372
|
+
let mut last_front_was_generic_browser = false;
|
|
334
373
|
loop {
|
|
335
374
|
std::thread::sleep(Duration::from_secs(10));
|
|
336
375
|
let state = app.state::<DetectorState>();
|
|
@@ -339,6 +378,7 @@ fn install_call_ended_watcher(app: &AppHandle, threshold_ms: u64) {
|
|
|
339
378
|
ever_seen_front = false;
|
|
340
379
|
last_front_at = None;
|
|
341
380
|
fired = false;
|
|
381
|
+
last_front_was_generic_browser = false;
|
|
342
382
|
continue;
|
|
343
383
|
}
|
|
344
384
|
let front = crate::util::frontmost_bundle_id();
|
|
@@ -353,26 +393,28 @@ fn install_call_ended_watcher(app: &AppHandle, threshold_ms: u64) {
|
|
|
353
393
|
if is_strong_vc || is_generic_browser {
|
|
354
394
|
ever_seen_front = true;
|
|
355
395
|
last_front_at = Some(Instant::now());
|
|
396
|
+
last_front_was_generic_browser = is_generic_browser;
|
|
356
397
|
}
|
|
357
|
-
if
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
398
|
+
if fired {
|
|
399
|
+
continue;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
let frontmost_call_ended = ever_seen_front
|
|
403
|
+
&& last_front_at
|
|
404
|
+
.map(|t| {
|
|
405
|
+
Instant::now().duration_since(t).as_millis() as u64 >= threshold_ms
|
|
406
|
+
})
|
|
407
|
+
.unwrap_or(false)
|
|
408
|
+
// Require audio corroboration for browser-hosted calls:
|
|
409
|
+
// backgrounding Chrome/Arc alone does not prove that the
|
|
410
|
+
// Meet tab ended. Use the last known conference app, not
|
|
411
|
+
// the unrelated app now in front.
|
|
412
|
+
&& (!last_front_was_generic_browser
|
|
413
|
+
|| audio_recently_silent(&state, threshold_ms));
|
|
414
|
+
|
|
415
|
+
if frontmost_call_ended {
|
|
416
|
+
let _ = app.emit("meetings:call-ended", ());
|
|
417
|
+
fired = true;
|
|
376
418
|
}
|
|
377
419
|
}
|
|
378
420
|
});
|
|
@@ -382,6 +424,23 @@ fn install_call_ended_watcher(app: &AppHandle, threshold_ms: u64) {
|
|
|
382
424
|
#[cfg(not(target_os = "macos"))]
|
|
383
425
|
fn install_call_ended_watcher(_app: &AppHandle, _threshold_ms: u64) {}
|
|
384
426
|
|
|
427
|
+
fn scheduled_end_reached(scheduled_end_ms: Option<u64>, now_ms: u64) -> bool {
|
|
428
|
+
scheduled_end_ms
|
|
429
|
+
.map(|end_ms| now_ms >= end_ms)
|
|
430
|
+
.unwrap_or(false)
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
fn calendar_end_stop_ready(scheduled_end_ms: Option<u64>, now_ms: u64, audio_quiet: bool) -> bool {
|
|
434
|
+
scheduled_end_reached(scheduled_end_ms, now_ms) && audio_quiet
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
fn unix_now_ms() -> u64 {
|
|
438
|
+
SystemTime::now()
|
|
439
|
+
.duration_since(UNIX_EPOCH)
|
|
440
|
+
.unwrap_or_default()
|
|
441
|
+
.as_millis() as u64
|
|
442
|
+
}
|
|
443
|
+
|
|
385
444
|
/// Corroboration check for the generic-browser call-ended signal: true only
|
|
386
445
|
/// if BOTH mic and system audio have been quiet for at least `threshold_ms`.
|
|
387
446
|
/// Reuses the same per-source `last_loud_at` tracking the silence-stop
|
|
@@ -408,3 +467,23 @@ fn audio_recently_silent(state: &tauri::State<'_, DetectorState>, threshold_ms:
|
|
|
408
467
|
.unwrap_or(false);
|
|
409
468
|
mic_silent && system_silent
|
|
410
469
|
}
|
|
470
|
+
|
|
471
|
+
#[cfg(test)]
|
|
472
|
+
mod tests {
|
|
473
|
+
use super::{calendar_end_stop_ready, scheduled_end_reached};
|
|
474
|
+
|
|
475
|
+
#[test]
|
|
476
|
+
fn calendar_end_requires_a_known_end_and_allows_the_exact_boundary() {
|
|
477
|
+
assert!(!scheduled_end_reached(None, 10_000));
|
|
478
|
+
assert!(!scheduled_end_reached(Some(10_001), 10_000));
|
|
479
|
+
assert!(scheduled_end_reached(Some(10_000), 10_000));
|
|
480
|
+
assert!(scheduled_end_reached(Some(9_999), 10_000));
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
#[test]
|
|
484
|
+
fn calendar_end_stop_also_requires_quiet_audio() {
|
|
485
|
+
assert!(!calendar_end_stop_ready(Some(9_999), 10_000, false));
|
|
486
|
+
assert!(calendar_end_stop_ready(Some(9_999), 10_000, true));
|
|
487
|
+
assert!(!calendar_end_stop_ready(Some(10_001), 10_000, true));
|
|
488
|
+
}
|
|
489
|
+
}
|
|
@@ -115,6 +115,7 @@ pub async fn audio_transcription_start(
|
|
|
115
115
|
mic_device_label: Option<String>,
|
|
116
116
|
capture_system: Option<bool>,
|
|
117
117
|
voice_processing: Option<bool>,
|
|
118
|
+
emit_partials: Option<bool>,
|
|
118
119
|
owner: Option<String>,
|
|
119
120
|
) -> Result<(), String> {
|
|
120
121
|
let _ = meeting_id;
|
|
@@ -128,6 +129,9 @@ pub async fn audio_transcription_start(
|
|
|
128
129
|
// create a second VoiceProcessingIO stack beside a live call app.
|
|
129
130
|
// Short dictation sessions opt in explicitly from the renderer.
|
|
130
131
|
voice_processing.unwrap_or(false),
|
|
132
|
+
// Existing meeting callers depend on live partials. Recording capture
|
|
133
|
+
// explicitly opts out because it only persists final segments.
|
|
134
|
+
emit_partials.unwrap_or(true),
|
|
131
135
|
owner,
|
|
132
136
|
)
|
|
133
137
|
.await
|