@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
|
@@ -64,6 +64,7 @@ import {
|
|
|
64
64
|
handleMcpOAuthAuthorizationServerMetadata,
|
|
65
65
|
handleMcpOAuthProtectedResourceMetadata,
|
|
66
66
|
} from "../mcp/oauth-route.js";
|
|
67
|
+
import { MCP_ROUTE_PREFIXES } from "../mcp/route-paths.js";
|
|
67
68
|
import { registerBuiltinNotificationChannels } from "../notifications/channels.js";
|
|
68
69
|
import { createNotificationsHandler } from "../notifications/routes.js";
|
|
69
70
|
import { getOrgContext } from "../org/context.js";
|
|
@@ -873,9 +874,10 @@ export interface CoreRoutesPluginOptions {
|
|
|
873
874
|
/** Disable the /_agent-native/embed/start iframe session launcher. */
|
|
874
875
|
disableEmbedRoute?: boolean;
|
|
875
876
|
/**
|
|
876
|
-
* Disable the /
|
|
877
|
-
*
|
|
878
|
-
*
|
|
877
|
+
* Disable the /mcp/connect routes (browser Connect page + CLI device-code
|
|
878
|
+
* flow that mints per-user, revocable MCP tokens) and the standard remote-MCP
|
|
879
|
+
* OAuth endpoints under /mcp/oauth. The legacy /_agent-native/mcp aliases
|
|
880
|
+
* are disabled at the same time.
|
|
879
881
|
* Enabled by default — the routes are session-gated where they approve user
|
|
880
882
|
* access; token endpoints are protected by single-use codes / refresh
|
|
881
883
|
* tokens.
|
|
@@ -939,7 +941,7 @@ export function createCoreRoutesPlugin(
|
|
|
939
941
|
rejectInit = reject;
|
|
940
942
|
});
|
|
941
943
|
trackPluginInit(nitroApp, initPromise, {
|
|
942
|
-
paths: [FRAMEWORK_ROUTE_PREFIX, "/.well-known"],
|
|
944
|
+
paths: [FRAMEWORK_ROUTE_PREFIX, "/mcp", "/.well-known"],
|
|
943
945
|
});
|
|
944
946
|
try {
|
|
945
947
|
await awaitBootstrap(nitroApp);
|
|
@@ -3497,16 +3499,18 @@ export function createCoreRoutesPlugin(
|
|
|
3497
3499
|
handleMcpOAuthAuthorizationServerMetadata(event),
|
|
3498
3500
|
),
|
|
3499
3501
|
);
|
|
3500
|
-
|
|
3501
|
-
|
|
3502
|
-
|
|
3503
|
-
|
|
3504
|
-
|
|
3505
|
-
|
|
3506
|
-
|
|
3507
|
-
|
|
3508
|
-
|
|
3509
|
-
|
|
3502
|
+
for (const mcpRoutePrefix of MCP_ROUTE_PREFIXES) {
|
|
3503
|
+
getH3App(nitroApp).use(
|
|
3504
|
+
`${mcpRoutePrefix}/oauth`,
|
|
3505
|
+
defineEventHandler(async (event: H3Event) => {
|
|
3506
|
+
const subpath = event.url?.pathname || "";
|
|
3507
|
+
return handleMcpOAuth(event, subpath, {
|
|
3508
|
+
appId: options.mcpConnectAppId,
|
|
3509
|
+
appName: options.mcpConnectAppName ?? getAppName(),
|
|
3510
|
+
});
|
|
3511
|
+
}),
|
|
3512
|
+
);
|
|
3513
|
+
}
|
|
3510
3514
|
|
|
3511
3515
|
// Frictionless external-agent connection. A logged-in user mints a
|
|
3512
3516
|
// per-user, scoped, revocable MCP bearer token here — via the browser
|
|
@@ -3522,16 +3526,18 @@ export function createCoreRoutesPlugin(
|
|
|
3522
3526
|
appName: options.mcpConnectAppName ?? getAppName(),
|
|
3523
3527
|
serverName: options.mcpConnectServerName,
|
|
3524
3528
|
};
|
|
3525
|
-
|
|
3526
|
-
|
|
3527
|
-
|
|
3528
|
-
|
|
3529
|
-
|
|
3530
|
-
|
|
3531
|
-
|
|
3532
|
-
|
|
3533
|
-
|
|
3534
|
-
|
|
3529
|
+
for (const mcpRoutePrefix of MCP_ROUTE_PREFIXES) {
|
|
3530
|
+
getH3App(nitroApp).use(
|
|
3531
|
+
`${mcpRoutePrefix}/connect`,
|
|
3532
|
+
defineEventHandler(async (event: H3Event) => {
|
|
3533
|
+
// The framework strips the mount prefix from event.url.pathname,
|
|
3534
|
+
// so what remains is the subpath after `/connect` (e.g. `/token`,
|
|
3535
|
+
// `/device/start`, or `` for the page itself).
|
|
3536
|
+
const subpath = event.url?.pathname || "";
|
|
3537
|
+
return handleMcpConnect(event, subpath, mcpConnectOpts);
|
|
3538
|
+
}),
|
|
3539
|
+
);
|
|
3540
|
+
}
|
|
3535
3541
|
}
|
|
3536
3542
|
|
|
3537
3543
|
// Cross-app SSO ("Sign in with Agent-Native") — CLIENT side. Mounted
|
|
@@ -50,6 +50,7 @@ import {
|
|
|
50
50
|
setResponseStatus,
|
|
51
51
|
} from "h3";
|
|
52
52
|
|
|
53
|
+
import { MCP_PUBLIC_ROUTE_PREFIX } from "../mcp/route-paths.js";
|
|
53
54
|
import { getConfiguredAppBasePath } from "./app-base-path.js";
|
|
54
55
|
|
|
55
56
|
/**
|
|
@@ -166,12 +167,28 @@ function matchingFrameworkPrefix(
|
|
|
166
167
|
): string | undefined {
|
|
167
168
|
if (pathname.startsWith(frameworkPrefix)) return frameworkPrefix;
|
|
168
169
|
|
|
170
|
+
if (
|
|
171
|
+
pathname === MCP_PUBLIC_ROUTE_PREFIX ||
|
|
172
|
+
pathname.startsWith(`${MCP_PUBLIC_ROUTE_PREFIX}/`)
|
|
173
|
+
) {
|
|
174
|
+
return MCP_PUBLIC_ROUTE_PREFIX;
|
|
175
|
+
}
|
|
176
|
+
|
|
169
177
|
const basePath = getConfiguredAppBasePath();
|
|
170
178
|
const basePathFrameworkPrefix = `${basePath}${frameworkPrefix}`;
|
|
171
179
|
if (basePath && pathname.startsWith(basePathFrameworkPrefix)) {
|
|
172
180
|
return basePathFrameworkPrefix;
|
|
173
181
|
}
|
|
174
182
|
|
|
183
|
+
const basePathMcpPrefix = `${basePath}${MCP_PUBLIC_ROUTE_PREFIX}`;
|
|
184
|
+
if (
|
|
185
|
+
basePath &&
|
|
186
|
+
(pathname === basePathMcpPrefix ||
|
|
187
|
+
pathname.startsWith(`${basePathMcpPrefix}/`))
|
|
188
|
+
) {
|
|
189
|
+
return basePathMcpPrefix;
|
|
190
|
+
}
|
|
191
|
+
|
|
175
192
|
return undefined;
|
|
176
193
|
}
|
|
177
194
|
|
|
@@ -15,6 +15,7 @@ import type { EventHandler, H3Event } from "h3";
|
|
|
15
15
|
import { setResponseHeader, setResponseStatus } from "h3";
|
|
16
16
|
|
|
17
17
|
import { getMissingDefaultPlugins } from "../deploy/route-discovery.js";
|
|
18
|
+
import { MCP_PUBLIC_ROUTE_PREFIX } from "../mcp/route-paths.js";
|
|
18
19
|
import { getConfiguredAppBasePath } from "./app-base-path.js";
|
|
19
20
|
import { captureError } from "./capture-error.js";
|
|
20
21
|
import { createCsrfMiddleware } from "./csrf.js";
|
|
@@ -48,7 +49,8 @@ function pathMatchesPrefix(reqPath: string, prefix: string): boolean {
|
|
|
48
49
|
function supportsAppBasePathMount(path: string): boolean {
|
|
49
50
|
return (
|
|
50
51
|
pathMatchesPrefix(path, FRAMEWORK_PREFIX) ||
|
|
51
|
-
pathMatchesPrefix(path, WELL_KNOWN_PREFIX)
|
|
52
|
+
pathMatchesPrefix(path, WELL_KNOWN_PREFIX) ||
|
|
53
|
+
pathMatchesPrefix(path, MCP_PUBLIC_ROUTE_PREFIX)
|
|
52
54
|
);
|
|
53
55
|
}
|
|
54
56
|
|
|
@@ -164,6 +166,9 @@ export function getH3App(nitroApp: any): H3AppShim {
|
|
|
164
166
|
registerMiddleware(nitroApp, WELL_KNOWN_PREFIX, readinessGate, {
|
|
165
167
|
prepend: true,
|
|
166
168
|
});
|
|
169
|
+
registerMiddleware(nitroApp, MCP_PUBLIC_ROUTE_PREFIX, readinessGate, {
|
|
170
|
+
prepend: true,
|
|
171
|
+
});
|
|
167
172
|
|
|
168
173
|
// CSRF (see csrf.ts): registered here — synchronously, on the very
|
|
169
174
|
// first `getH3App()` call for this nitroApp — rather than inside
|
|
@@ -196,7 +201,8 @@ export function getH3App(nitroApp: any): H3AppShim {
|
|
|
196
201
|
const reqPath = event.url?.pathname ?? "";
|
|
197
202
|
if (
|
|
198
203
|
resolveMountMatch(reqPath, FRAMEWORK_PREFIX) ||
|
|
199
|
-
resolveMountMatch(reqPath, WELL_KNOWN_PREFIX)
|
|
204
|
+
resolveMountMatch(reqPath, WELL_KNOWN_PREFIX) ||
|
|
205
|
+
resolveMountMatch(reqPath, MCP_PUBLIC_ROUTE_PREFIX)
|
|
200
206
|
) {
|
|
201
207
|
await awaitFrameworkRoutesReadyForRequest(nitroApp, reqPath);
|
|
202
208
|
}
|
|
@@ -170,6 +170,12 @@ function getConfiguredOriginAllowlist(): Set<string> {
|
|
|
170
170
|
return out;
|
|
171
171
|
}
|
|
172
172
|
|
|
173
|
+
/** Return whether a candidate is one of this deployment's configured origins. */
|
|
174
|
+
export function isConfiguredAppOrigin(value: string | undefined): boolean {
|
|
175
|
+
const origin = normalizeOrigin(value);
|
|
176
|
+
return !!origin && getConfiguredOriginAllowlist().has(origin);
|
|
177
|
+
}
|
|
178
|
+
|
|
173
179
|
function getWorkspaceCallbackOrigin(): string | undefined {
|
|
174
180
|
const publicAuthOrigin = firstOriginFromEnv(EXPLICIT_PUBLIC_ORIGIN_ENV_KEYS, {
|
|
175
181
|
allowLoopback: true,
|
|
@@ -2,6 +2,7 @@ import { defineEventHandler, getHeader, getMethod } from "h3";
|
|
|
2
2
|
import type { EventHandler, H3Event } from "h3";
|
|
3
3
|
|
|
4
4
|
import { getDatabaseRuntimeFingerprint } from "../db/runtime-diagnostics.js";
|
|
5
|
+
import { isMcpPublicPath } from "../mcp/route-paths.js";
|
|
5
6
|
import { track } from "../tracking/index.js";
|
|
6
7
|
import { getAppName } from "./app-name.js";
|
|
7
8
|
|
|
@@ -74,7 +75,11 @@ function statusClass(statusCode: number): string {
|
|
|
74
75
|
}
|
|
75
76
|
|
|
76
77
|
function routeKind(pathname: string): string {
|
|
77
|
-
if (
|
|
78
|
+
if (
|
|
79
|
+
isMcpPublicPath(pathname) ||
|
|
80
|
+
pathname === "/_agent-native" ||
|
|
81
|
+
pathname.startsWith("/_agent-native/")
|
|
82
|
+
) {
|
|
78
83
|
return "framework";
|
|
79
84
|
}
|
|
80
85
|
if (pathname === "/api" || pathname.startsWith("/api/")) return "api";
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Auth: `Authorization: Bearer <token>` — accepts the SAME tokens the MCP /
|
|
6
6
|
* action surface accepts: a legacy `sessions` bearer (desktop/native) OR a
|
|
7
7
|
* connect-minted MCP OAuth access token (the `agent-native connect` token,
|
|
8
|
-
* audience-bound to this app's `{origin}/
|
|
8
|
+
* audience-bound to this app's `{origin}/mcp` resource). A
|
|
9
9
|
* normal browser session cookie is also accepted. Rejects unauthenticated
|
|
10
10
|
* callers with 401.
|
|
11
11
|
* Body: raw `image/png` bytes, or JSON `{ "pngBase64": "..." }`. Capped at
|
|
@@ -74,13 +74,13 @@ async function resolveUploadSession(
|
|
|
74
74
|
if (!authHeader || !bearer) return null;
|
|
75
75
|
|
|
76
76
|
try {
|
|
77
|
-
const [{
|
|
77
|
+
const [{ getMcpOAuthAudiences }, { verifyAuth, resolveOrgIdFromDomain }] =
|
|
78
78
|
await Promise.all([
|
|
79
79
|
import("../mcp/oauth-route.js"),
|
|
80
80
|
import("../mcp/build-server.js"),
|
|
81
81
|
]);
|
|
82
82
|
const result = await verifyAuth(authHeader, undefined, {
|
|
83
|
-
resourceUrl:
|
|
83
|
+
resourceUrl: getMcpOAuthAudiences(event),
|
|
84
84
|
allowDevOpen: false,
|
|
85
85
|
});
|
|
86
86
|
const identity = result.authed ? result.identity : undefined;
|
|
@@ -56,6 +56,10 @@ import { createHash } from "node:crypto";
|
|
|
56
56
|
|
|
57
57
|
import { defineEventHandler, getHeader, setResponseHeader } from "h3";
|
|
58
58
|
|
|
59
|
+
import {
|
|
60
|
+
isMcpProtocolPath,
|
|
61
|
+
MCP_PUBLIC_ROUTE_PREFIX,
|
|
62
|
+
} from "../mcp/route-paths.js";
|
|
59
63
|
import {
|
|
60
64
|
isMcpEmbedCorsOrigin,
|
|
61
65
|
MCP_EMBED_CORS_ALLOW_HEADERS,
|
|
@@ -101,8 +105,10 @@ function isMcpEndpointRequest(event: any): boolean {
|
|
|
101
105
|
const pathname =
|
|
102
106
|
event?.url?.pathname ??
|
|
103
107
|
String(event?.node?.req?.url ?? event?.path ?? "/").split("?")[0];
|
|
108
|
+
const normalizedPathname = pathname.replace(/\/+$/, "");
|
|
104
109
|
return (
|
|
105
|
-
|
|
110
|
+
isMcpProtocolPath(normalizedPathname) ||
|
|
111
|
+
normalizedPathname.endsWith(MCP_PUBLIC_ROUTE_PREFIX)
|
|
106
112
|
);
|
|
107
113
|
}
|
|
108
114
|
|
|
@@ -18,6 +18,7 @@ import { defineEventHandler } from "h3";
|
|
|
18
18
|
*/
|
|
19
19
|
import { createRequestHandler } from "react-router";
|
|
20
20
|
|
|
21
|
+
import { isMcpPublicPath } from "../mcp/route-paths.js";
|
|
21
22
|
import {
|
|
22
23
|
DEFAULT_SSR_CACHE_HEADERS,
|
|
23
24
|
DEFAULT_SPECULATION_RULES_PATH,
|
|
@@ -318,6 +319,7 @@ function removeDocumentCsp(headers: Headers): void {
|
|
|
318
319
|
|
|
319
320
|
function isFrameworkOrAssetPath(pathname: string): boolean {
|
|
320
321
|
return (
|
|
322
|
+
isMcpPublicPath(pathname) ||
|
|
321
323
|
pathname.startsWith("/.well-known/") ||
|
|
322
324
|
pathname.startsWith("/_agent_native/") ||
|
|
323
325
|
pathname.startsWith("/_agent-native/") ||
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
export const
|
|
1
|
+
export const DEFAULT_PUBLIC_CACHE_CONTROL =
|
|
2
|
+
"public, max-age=600, stale-while-revalidate=604800, stale-if-error=3600";
|
|
2
3
|
|
|
3
|
-
export const
|
|
4
|
-
|
|
4
|
+
export const DEFAULT_SSR_CACHE_CONTROL = DEFAULT_PUBLIC_CACHE_CONTROL;
|
|
5
|
+
|
|
6
|
+
export const DEFAULT_SSR_CDN_CACHE_CONTROL = DEFAULT_SSR_CACHE_CONTROL;
|
|
5
7
|
|
|
6
8
|
export const DEFAULT_SSR_NETLIFY_CDN_CACHE_CONTROL =
|
|
7
|
-
|
|
9
|
+
DEFAULT_PUBLIC_CACHE_CONTROL;
|
|
8
10
|
|
|
9
11
|
export const DEFAULT_SSR_CACHE_HEADERS = {
|
|
10
12
|
"cache-control": DEFAULT_SSR_CACHE_CONTROL,
|
|
@@ -147,6 +147,16 @@ export default defineEventHandler(async (event) => {
|
|
|
147
147
|
|
|
148
148
|
- Never create unprotected routes that modify data.
|
|
149
149
|
|
|
150
|
+
**Exception — the SSR HTML/`.data` catch-all is deliberately session-blind.**
|
|
151
|
+
The rule above is for routes that read or mutate user data. The SSR page
|
|
152
|
+
render and React Router `.data` route are different: they serve one
|
|
153
|
+
impersonal, public-cacheable shell to every visitor by design, and loaders on
|
|
154
|
+
that path render no user data. Do not "fix" this by adding `getSession`,
|
|
155
|
+
`private`, or `no-store` to it — that regresses the CDN cache contract for the
|
|
156
|
+
whole site. Data scoping lives in actions and API routes; the client gates
|
|
157
|
+
private UI after the shell loads. See the `authentication` skill and
|
|
158
|
+
`guard:ssr-cache-shell` / `ssr-handler.spec.ts`.
|
|
159
|
+
|
|
150
160
|
## Human-in-the-Loop Approval for High-Consequence Actions
|
|
151
161
|
|
|
152
162
|
For a small set of outward-facing, hard-to-undo operations — sending an email, charging a card, deleting an account, posting publicly — auth and access control are necessary but not sufficient: you also do not want the **agent** to perform them autonomously. Set `needsApproval` on the `defineAction` so the agent cannot run the action without a human approving the specific call.
|
|
@@ -36,12 +36,12 @@ Auth is powered by **Better Auth** with account-first design. Every new user cre
|
|
|
36
36
|
|
|
37
37
|
## Remote MCP OAuth
|
|
38
38
|
|
|
39
|
-
Every app's `/
|
|
39
|
+
Every app's `/mcp` endpoint is also a standard protected MCP
|
|
40
40
|
resource. OAuth-capable hosts connect with the remote MCP URL only, receive a
|
|
41
41
|
`WWW-Authenticate` challenge, discover `/.well-known/oauth-protected-resource`
|
|
42
42
|
and `/.well-known/oauth-authorization-server`, dynamically register a public
|
|
43
43
|
client, and complete authorization-code + PKCE at
|
|
44
|
-
`/
|
|
44
|
+
`/mcp/oauth/authorize` / `/mcp/oauth/token`.
|
|
45
45
|
Access tokens are audience-bound to the exact MCP URL and carry user/org
|
|
46
46
|
identity plus `mcp:read`, `mcp:write`, `mcp:apps`, and/or `offline_access`;
|
|
47
47
|
advertising `offline_access` lets hosts such as ChatGPT retain refresh access.
|
|
@@ -137,10 +137,19 @@ Bookmarked private paths work through the client session gate: the shared shell
|
|
|
137
137
|
## Gating the App Shell (avoid the logged-out infinite spinner)
|
|
138
138
|
|
|
139
139
|
Normal app HTML and React Router page-data responses deliberately bypass the
|
|
140
|
-
server session guard. They are rendered impersonally and cached as one shared
|
|
141
|
-
shell; APIs, actions, and framework data routes
|
|
142
|
-
client session gate is therefore the
|
|
143
|
-
private app UI renders.
|
|
140
|
+
server session guard. They are rendered impersonally and cached as one shared,
|
|
141
|
+
public, hard-cached-at-the-CDN shell; APIs, actions, and framework data routes
|
|
142
|
+
remain server-protected. The client session gate is therefore the
|
|
143
|
+
authoritative decision point for whether private app UI renders.
|
|
144
|
+
|
|
145
|
+
**Never**, on the SSR HTML/`.data` path: set `private`, `no-store`, or
|
|
146
|
+
`Vary: Cookie`; call `getSession` or read cookies in the SSR route or the
|
|
147
|
+
login HTML path; or embed tokens/secrets into the rendered HTML — a
|
|
148
|
+
token-bearing page still returns the same anonymous shell and resolves access
|
|
149
|
+
client-side. This has regressed repeatedly (agents "fixing" it back to
|
|
150
|
+
per-user SSR); it is enforced by `guard:ssr-cache-shell` and
|
|
151
|
+
`ssr-handler.spec.ts` (`packages/core/src/server/ssr-handler.ts`), and reverts
|
|
152
|
+
will be rejected.
|
|
144
153
|
|
|
145
154
|
`AppProviders` applies `RequireSession` automatically on its private branch. It
|
|
146
155
|
resolves the session on the client and redirects signed-out visitors to
|
|
@@ -21,12 +21,12 @@ An agent-native app is reachable by any MCP-compatible host (Claude, Claude
|
|
|
21
21
|
Desktop, Claude Code, ChatGPT custom MCP apps, Codex, Cursor, Cowork, VS Code
|
|
22
22
|
GitHub Copilot, Goose, Postman, MCPJam, and future standard clients). Keep
|
|
23
23
|
setup simple: for workspace or cross-app access, add one remote MCP connector:
|
|
24
|
-
`https://dispatch.agent-native.com/
|
|
24
|
+
`https://dispatch.agent-native.com/mcp`. Dispatch's Agents page
|
|
25
25
|
controls whether that single connector reaches all apps or only selected apps,
|
|
26
26
|
and Dispatch filters `list_apps`, `ask_app`, and `open_app` to the granted set.
|
|
27
27
|
For a deliberately isolated app, add that app directly at
|
|
28
|
-
`https://<app>.agent-native.com/
|
|
29
|
-
`https://<your-host>/
|
|
28
|
+
`https://<app>.agent-native.com/mcp` or
|
|
29
|
+
`https://<your-host>/mcp`.
|
|
30
30
|
|
|
31
31
|
OAuth-capable hosts should use the standard remote MCP OAuth flow. Claude
|
|
32
32
|
connectors and Claude Code `/mcp` authentication discover the protected
|
|
@@ -68,7 +68,7 @@ the real app focused on exactly what was produced. It reuses the existing
|
|
|
68
68
|
Use one connector for normal workspace access:
|
|
69
69
|
|
|
70
70
|
```text
|
|
71
|
-
https://dispatch.agent-native.com/
|
|
71
|
+
https://dispatch.agent-native.com/mcp
|
|
72
72
|
```
|
|
73
73
|
|
|
74
74
|
Then open Dispatch → Agents to choose whether the gateway exposes every app or
|
|
@@ -79,8 +79,8 @@ only selected app IDs. External agents call `list_apps` to see the granted set,
|
|
|
79
79
|
Use a direct app URL only when you intentionally want one isolated app:
|
|
80
80
|
|
|
81
81
|
```text
|
|
82
|
-
https://mail.agent-native.com/
|
|
83
|
-
https://<your-app>.agent-native.com/
|
|
82
|
+
https://mail.agent-native.com/mcp
|
|
83
|
+
https://<your-app>.agent-native.com/mcp
|
|
84
84
|
```
|
|
85
85
|
|
|
86
86
|
Claude / Claude Desktop: add a custom connector with the URL, click Connect,
|
|
@@ -104,7 +104,7 @@ npx @agent-native/core@latest connect https://mail.agent-native.com
|
|
|
104
104
|
|
|
105
105
|
The command opens the app in the browser, the user clicks **Authorize**, and a
|
|
106
106
|
per-user, scoped, revocable token is written to the selected client config. The
|
|
107
|
-
no-CLI equivalent is `https://<app>/
|
|
107
|
+
no-CLI equivalent is `https://<app>/mcp/connect`, which shows
|
|
108
108
|
the copyable MCP URL, Claude / ChatGPT / Cursor / Claude Code / Codex / Other
|
|
109
109
|
steps, and static-token fallback for clients that need it.
|
|
110
110
|
|
|
@@ -130,7 +130,7 @@ that MCP URL; pass `--client` to limit which configs it searches. Pass
|
|
|
130
130
|
Under the hood: a logged-in browser session mints an `A2A_SECRET`-signed JWT
|
|
131
131
|
carrying the caller's `sub` + `org_domain` and a unique `jti`, so tool runs
|
|
132
132
|
stay tenant-scoped via `runWithRequestContext`. The existing
|
|
133
|
-
`/
|
|
133
|
+
`/mcp` endpoint accepts it like any bearer — no new endpoint.
|
|
134
134
|
The same Connect page lists and revokes minted tokens by `jti`; treat them
|
|
135
135
|
like personal access tokens. Nothing exposes the deployment's shared secret.
|
|
136
136
|
|
|
@@ -146,7 +146,13 @@ agent has a predictable surface without guessing per-app action names:
|
|
|
146
146
|
"Open …" link and, with `embed: true`, an inline full-app MCP App in capable
|
|
147
147
|
hosts.
|
|
148
148
|
- `ask_app({ app, message })` — routes a natural-language task to that app's
|
|
149
|
-
in-app agent (delegates to the existing `ask-agent` meta-tool).
|
|
149
|
+
in-app agent (delegates to the existing `ask-agent` meta-tool). It also
|
|
150
|
+
accepts `async` and `maxWaitMs`; hosted calls wait at most 25 seconds inline
|
|
151
|
+
and return a durable `taskId` plus an `ask_app_status` poll instruction when
|
|
152
|
+
the task is still running.
|
|
153
|
+
- `ask_app_status({ app, taskId })` — retrieves the current or terminal result
|
|
154
|
+
for a durable `ask_app` task. Dispatch checks the selected-app grant again
|
|
155
|
+
before polling.
|
|
150
156
|
- `create_workspace_app({ name, template })` — scaffolds + boots a new app via
|
|
151
157
|
the workspace path (rejects non-allow-listed templates), returns its running
|
|
152
158
|
URL + deep link.
|
|
@@ -375,7 +381,7 @@ the `[mcp_servers.*]` block in `~/.codex/config.toml` for Codex,
|
|
|
375
381
|
user `mcp.json` for GitHub Copilot / VS Code, and the Claude-Code JSON shape
|
|
376
382
|
for Cowork. The entry runs `pnpm exec agent-native mcp serve --app <id>`, by
|
|
377
383
|
default a **thin stdio proxy** to the running local app's
|
|
378
|
-
`/
|
|
384
|
+
`/mcp` (live registry + HMR + correct deep links stay the single
|
|
379
385
|
source of truth; `--standalone` builds the registry in-process). Companion
|
|
380
386
|
subcommands: `mcp uninstall`, `mcp status`, `mcp token [--rotate]`. You can
|
|
381
387
|
also hand-write an `http` `.mcp.json` entry with a token you supply yourself —
|
|
@@ -121,7 +121,24 @@ index the growing tables first.
|
|
|
121
121
|
- Data the UI doesn't display (export formats, alternate renderings) belongs in a
|
|
122
122
|
separate on-demand action, not baked into the hot read.
|
|
123
123
|
|
|
124
|
-
## 6.
|
|
124
|
+
## 6. SSR shell caching — load-bearing, do not undo
|
|
125
|
+
|
|
126
|
+
Every SSR HTML page and React Router `.data` response is one impersonal,
|
|
127
|
+
public shell, hard-cached at the CDN and served identically to every visitor —
|
|
128
|
+
logged in or not. This is the single biggest lever on first-response latency:
|
|
129
|
+
one shared cache entry serves the whole site instead of a per-user render on
|
|
130
|
+
every request. Adding `private`, `no-store`, `Vary: Cookie`, a session read, or
|
|
131
|
+
an auth branch to the SSR path defeats the cache for **every visitor**, not
|
|
132
|
+
just one.
|
|
133
|
+
|
|
134
|
+
If you're debugging a slow first response, check whether something
|
|
135
|
+
re-personalized the shell before concluding the render itself is slow — the
|
|
136
|
+
fix is client-side data loading after the shell paints, never per-user SSR.
|
|
137
|
+
See the `authentication` skill for the full model and `guard:ssr-cache-shell`
|
|
138
|
+
plus `ssr-handler.spec.ts` (`packages/core/src/server/ssr-handler.ts`) for the
|
|
139
|
+
enforced contract.
|
|
140
|
+
|
|
141
|
+
## 7. Big payloads and long lists
|
|
125
142
|
|
|
126
143
|
- **Paginate or window** unbounded lists (messages, responses, events, activity).
|
|
127
144
|
Don't load the entire history on open; load a recent window and fetch older on
|
|
@@ -144,3 +161,5 @@ index the growing tables first.
|
|
|
144
161
|
- [ ] Client fires independent queries in parallel, not a waterfall.
|
|
145
162
|
- [ ] No heavy recompute on every read; no aggressive polling of heavy endpoints.
|
|
146
163
|
- [ ] Unbounded lists are paginated/windowed; large blobs aren't inlined on the hot path.
|
|
164
|
+
- [ ] SSR HTML/`.data` path stays session-blind and cacheable — no `private`,
|
|
165
|
+
`no-store`, `Vary: Cookie`, or auth branch added to it.
|
|
@@ -147,6 +147,16 @@ export default defineEventHandler(async (event) => {
|
|
|
147
147
|
|
|
148
148
|
- Never create unprotected routes that modify data.
|
|
149
149
|
|
|
150
|
+
**Exception — the SSR HTML/`.data` catch-all is deliberately session-blind.**
|
|
151
|
+
The rule above is for routes that read or mutate user data. The SSR page
|
|
152
|
+
render and React Router `.data` route are different: they serve one
|
|
153
|
+
impersonal, public-cacheable shell to every visitor by design, and loaders on
|
|
154
|
+
that path render no user data. Do not "fix" this by adding `getSession`,
|
|
155
|
+
`private`, or `no-store` to it — that regresses the CDN cache contract for the
|
|
156
|
+
whole site. Data scoping lives in actions and API routes; the client gates
|
|
157
|
+
private UI after the shell loads. See the `authentication` skill and
|
|
158
|
+
`guard:ssr-cache-shell` / `ssr-handler.spec.ts`.
|
|
159
|
+
|
|
150
160
|
## Human-in-the-Loop Approval for High-Consequence Actions
|
|
151
161
|
|
|
152
162
|
For a small set of outward-facing, hard-to-undo operations — sending an email, charging a card, deleting an account, posting publicly — auth and access control are necessary but not sufficient: you also do not want the **agent** to perform them autonomously. Set `needsApproval` on the `defineAction` so the agent cannot run the action without a human approving the specific call.
|
|
@@ -147,6 +147,16 @@ export default defineEventHandler(async (event) => {
|
|
|
147
147
|
|
|
148
148
|
- Never create unprotected routes that modify data.
|
|
149
149
|
|
|
150
|
+
**Exception — the SSR HTML/`.data` catch-all is deliberately session-blind.**
|
|
151
|
+
The rule above is for routes that read or mutate user data. The SSR page
|
|
152
|
+
render and React Router `.data` route are different: they serve one
|
|
153
|
+
impersonal, public-cacheable shell to every visitor by design, and loaders on
|
|
154
|
+
that path render no user data. Do not "fix" this by adding `getSession`,
|
|
155
|
+
`private`, or `no-store` to it — that regresses the CDN cache contract for the
|
|
156
|
+
whole site. Data scoping lives in actions and API routes; the client gates
|
|
157
|
+
private UI after the shell loads. See the `authentication` skill and
|
|
158
|
+
`guard:ssr-cache-shell` / `ssr-handler.spec.ts`.
|
|
159
|
+
|
|
150
160
|
## Human-in-the-Loop Approval for High-Consequence Actions
|
|
151
161
|
|
|
152
162
|
For a small set of outward-facing, hard-to-undo operations — sending an email, charging a card, deleting an account, posting publicly — auth and access control are necessary but not sufficient: you also do not want the **agent** to perform them autonomously. Set `needsApproval` on the `defineAction` so the agent cannot run the action without a human approving the specific call.
|
|
@@ -245,14 +245,73 @@
|
|
|
245
245
|
transform-origin: top left;
|
|
246
246
|
}
|
|
247
247
|
|
|
248
|
-
/*
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
248
|
+
/* INTENTIONAL — DO NOT REMOVE OR REPLACE WITH rrweb's STOCK CURSOR.
|
|
249
|
+
The recorded visitor cursor is a core session-replay affordance: users need
|
|
250
|
+
to see the Mac-style arrow where the visitor clicked, including on dark
|
|
251
|
+
recordings. rrweb's bundled cursor is a small black sprite that disappears
|
|
252
|
+
against those pages. This high-contrast arrow stays inside the replayer
|
|
253
|
+
wrapper and scales with the fit-to-stage transform. */
|
|
254
|
+
.an-replay-stage-root .replayer-mouse {
|
|
255
|
+
position: absolute;
|
|
256
|
+
z-index: 2;
|
|
257
|
+
width: 1.125rem;
|
|
258
|
+
height: 1.5rem;
|
|
259
|
+
border-radius: 0;
|
|
260
|
+
background: transparent;
|
|
261
|
+
background-image: none;
|
|
262
|
+
box-shadow: none;
|
|
263
|
+
transform: none;
|
|
264
|
+
transition:
|
|
265
|
+
left 80ms linear,
|
|
266
|
+
top 80ms linear;
|
|
267
|
+
pointer-events: none;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
.an-replay-stage-root .replayer-mouse::before {
|
|
271
|
+
content: "";
|
|
272
|
+
position: absolute;
|
|
273
|
+
inset: 0;
|
|
274
|
+
background: hsl(0 0% 100%);
|
|
275
|
+
clip-path: polygon(0 0, 0 77%, 30% 57%, 48% 100%, 68% 92%, 50% 51%, 92% 51%);
|
|
276
|
+
filter: drop-shadow(0 0 1px hsl(0 0% 0% / 0.95))
|
|
277
|
+
drop-shadow(0 1px 3px hsl(0 0% 0% / 0.35));
|
|
278
|
+
}
|
|
279
|
+
|
|
252
280
|
.an-replay-stage-root .replayer-mouse::after {
|
|
281
|
+
content: "";
|
|
282
|
+
position: absolute;
|
|
283
|
+
left: -0.5rem;
|
|
284
|
+
top: -0.5rem;
|
|
285
|
+
width: 1rem;
|
|
286
|
+
height: 1rem;
|
|
287
|
+
border: 2px solid hsl(217 91% 60%);
|
|
288
|
+
border-radius: 9999px;
|
|
289
|
+
background: transparent;
|
|
253
290
|
opacity: 0;
|
|
254
291
|
}
|
|
255
292
|
|
|
293
|
+
/* rrweb toggles `.active` on mouse interactions; pulse a click ripple. */
|
|
294
|
+
.an-replay-stage-root .replayer-mouse.active::after {
|
|
295
|
+
animation: an-replay-mouse-click 0.4s ease-out 1;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
@keyframes an-replay-mouse-click {
|
|
299
|
+
0% {
|
|
300
|
+
opacity: 0.5;
|
|
301
|
+
transform: scale(1);
|
|
302
|
+
}
|
|
303
|
+
100% {
|
|
304
|
+
opacity: 0;
|
|
305
|
+
transform: scale(3.5);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
.an-replay-stage-root .replayer-mouse-tail {
|
|
310
|
+
position: absolute;
|
|
311
|
+
inset: 0;
|
|
312
|
+
pointer-events: none;
|
|
313
|
+
}
|
|
314
|
+
|
|
256
315
|
.analytics-session-snippet .plan-code-surface {
|
|
257
316
|
border: 0;
|
|
258
317
|
border-radius: 0;
|
|
@@ -986,11 +986,14 @@ function ReplayPlayer({
|
|
|
986
986
|
/>
|
|
987
987
|
<button
|
|
988
988
|
type="button"
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
989
|
+
className={cn(
|
|
990
|
+
"absolute inset-0 z-20 rounded-[inherit] border-0 bg-transparent p-0 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-default",
|
|
991
|
+
// INTENTIONAL — DO NOT REMOVE `cursor-none` while playing.
|
|
992
|
+
// The recorded cursor is the meaningful pointer here;
|
|
993
|
+
// hiding the viewer's stationary pointer keeps the
|
|
994
|
+
// Mac-style replay cursor easy to follow.
|
|
995
|
+
playing ? "cursor-none" : "cursor-pointer",
|
|
996
|
+
)}
|
|
994
997
|
disabled={disabled}
|
|
995
998
|
aria-label={
|
|
996
999
|
playing ? t("sessions.pause") : t("sessions.play")
|