@agent-native/core 0.98.16 → 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 +21 -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 +59 -8
- 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/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/embedding/agent.d.ts.map +1 -1
- package/dist/embedding/agent.js +6 -7
- package/dist/embedding/agent.js.map +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 +2 -2
- package/dist/observability/routes.d.ts +3 -3
- package/dist/progress/routes.d.ts +1 -1
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/dist/resources/handlers.d.ts +3 -3
- package/dist/secrets/routes.d.ts +6 -6
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +60 -9
- package/dist/server/agent-chat-plugin.js.map +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/server/transcribe-voice.d.ts +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
|
@@ -540,6 +540,8 @@ export async function callAgent(
|
|
|
540
540
|
userEmail?: string;
|
|
541
541
|
orgDomain?: string;
|
|
542
542
|
orgSecret?: string;
|
|
543
|
+
/** Origin used to build links back to the receiving app. */
|
|
544
|
+
requestOrigin?: string;
|
|
543
545
|
/**
|
|
544
546
|
* Use async/poll instead of a single blocking POST. Recommended for
|
|
545
547
|
* cross-app calls that may exceed a synchronous serverless request budget.
|
|
@@ -571,6 +573,7 @@ export async function callAgent(
|
|
|
571
573
|
const metadata: Record<string, unknown> = {};
|
|
572
574
|
if (opts?.userEmail) metadata.userEmail = opts.userEmail;
|
|
573
575
|
if (opts?.orgDomain) metadata.orgDomain = opts.orgDomain;
|
|
576
|
+
if (opts?.requestOrigin) metadata.requestOrigin = opts.requestOrigin;
|
|
574
577
|
|
|
575
578
|
// Default to async + poll. The receiving A2A server's `_process-task` route
|
|
576
579
|
// runs the handler in a fresh function execution (cross-platform queue
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
resolveAgentChatProcessRunDispatchPath,
|
|
9
9
|
} from "../agent/durable-background.js";
|
|
10
10
|
import { withConfiguredAppBasePath } from "../server/app-base-path.js";
|
|
11
|
+
import { getOrigin, isConfiguredAppOrigin } from "../server/google-oauth.js";
|
|
11
12
|
import { fireInternalDispatch } from "../server/self-dispatch.js";
|
|
12
13
|
import { agentChat } from "../shared/agent-chat.js";
|
|
13
14
|
import {
|
|
@@ -46,6 +47,70 @@ const A2A_QUEUED_DISPATCH_STUCK_AFTER_MS = 10_000;
|
|
|
46
47
|
const A2A_PROCESSING_STUCK_AFTER_MS = 5 * 60 * 1000;
|
|
47
48
|
const A2A_PROCESSING_HEARTBEAT_MS = 30_000;
|
|
48
49
|
|
|
50
|
+
/**
|
|
51
|
+
* Request origin is routing/link context, not an identity signal. Accept only
|
|
52
|
+
* an absolute HTTP(S) origin from caller metadata so queued runs can preserve
|
|
53
|
+
* custom-domain/workspace links without allowing arbitrary values to leak
|
|
54
|
+
* into browser or artifact URLs.
|
|
55
|
+
*/
|
|
56
|
+
function requestOriginFromMetadata(
|
|
57
|
+
metadata: Record<string, unknown> | undefined,
|
|
58
|
+
): string | undefined {
|
|
59
|
+
const raw = metadata?.requestOrigin;
|
|
60
|
+
if (typeof raw !== "string" || !raw.trim()) return undefined;
|
|
61
|
+
try {
|
|
62
|
+
const url = new URL(raw);
|
|
63
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") return undefined;
|
|
64
|
+
return url.origin;
|
|
65
|
+
} catch {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function requestOriginFromEvent(event: any | undefined): string | undefined {
|
|
71
|
+
if (!event) return undefined;
|
|
72
|
+
try {
|
|
73
|
+
return requestOriginFromMetadata({
|
|
74
|
+
requestOrigin: getOrigin(event as any),
|
|
75
|
+
});
|
|
76
|
+
} catch {
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Prefer the origin resolved from the receiving request. A distinct public
|
|
83
|
+
* browser origin is allowed only when the receiver configured it explicitly;
|
|
84
|
+
* arbitrary caller metadata must not steer links or service-token URLs.
|
|
85
|
+
*/
|
|
86
|
+
function requestOriginForContext(
|
|
87
|
+
metadata: Record<string, unknown> | undefined,
|
|
88
|
+
event: any | undefined,
|
|
89
|
+
): string | undefined {
|
|
90
|
+
if (!event) return undefined;
|
|
91
|
+
const receiverOrigin = requestOriginFromEvent(event);
|
|
92
|
+
const metadataOrigin = requestOriginFromMetadata(metadata);
|
|
93
|
+
if (
|
|
94
|
+
metadataOrigin &&
|
|
95
|
+
(metadataOrigin === receiverOrigin || isConfiguredAppOrigin(metadataOrigin))
|
|
96
|
+
) {
|
|
97
|
+
return metadataOrigin;
|
|
98
|
+
}
|
|
99
|
+
return receiverOrigin;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function trustedA2AMetadata(
|
|
103
|
+
metadata: Record<string, unknown> | undefined,
|
|
104
|
+
event: any | undefined,
|
|
105
|
+
): Record<string, unknown> | undefined {
|
|
106
|
+
if (!metadata) return undefined;
|
|
107
|
+
const trusted = { ...metadata };
|
|
108
|
+
const requestOrigin = requestOriginForContext(metadata, event);
|
|
109
|
+
if (requestOrigin) trusted.requestOrigin = requestOrigin;
|
|
110
|
+
else delete trusted.requestOrigin;
|
|
111
|
+
return trusted;
|
|
112
|
+
}
|
|
113
|
+
|
|
49
114
|
/**
|
|
50
115
|
* Hard cap on how long a task may sit in submitted/working (never reaching
|
|
51
116
|
* `processing`) before the dispatch-retry loop in
|
|
@@ -172,6 +237,12 @@ export async function processA2ATaskFromQueue(
|
|
|
172
237
|
const processorMeta = (meta.__a2a_processor ?? {}) as Record<string, unknown>;
|
|
173
238
|
const verifiedEmail = processorMeta.verifiedEmail as string | undefined;
|
|
174
239
|
const orgDomainHint = processorMeta.orgDomainHint as string | undefined;
|
|
240
|
+
// The processor metadata was created by the authenticated inbound handler
|
|
241
|
+
// from that request's resolved origin. Prefer it over the processor event,
|
|
242
|
+
// whose host may be an internal worker/dispatch origin. Legacy tasks that
|
|
243
|
+
// predate this metadata fall back to the processor event.
|
|
244
|
+
const requestOrigin =
|
|
245
|
+
requestOriginFromMetadata(processorMeta) ?? requestOriginFromEvent(event);
|
|
175
246
|
const contextId =
|
|
176
247
|
(processorMeta.contextId as string | null | undefined) ?? undefined;
|
|
177
248
|
const callerMetadata =
|
|
@@ -197,7 +268,11 @@ export async function processA2ATaskFromQueue(
|
|
|
197
268
|
).unref?.();
|
|
198
269
|
try {
|
|
199
270
|
await runWithRequestContext(
|
|
200
|
-
{
|
|
271
|
+
{
|
|
272
|
+
userEmail: verifiedEmail,
|
|
273
|
+
orgId: resolvedOrgId,
|
|
274
|
+
...(requestOrigin ? { requestOrigin } : {}),
|
|
275
|
+
},
|
|
201
276
|
() =>
|
|
202
277
|
runHandlerAndPersist(
|
|
203
278
|
taskId,
|
|
@@ -349,7 +424,7 @@ function makeHandlerContext(
|
|
|
349
424
|
* inside `runWithRequestContext` so downstream actions see the org.
|
|
350
425
|
*/
|
|
351
426
|
async function withA2ARequestContext<T>(
|
|
352
|
-
|
|
427
|
+
metadata: Record<string, unknown> | undefined,
|
|
353
428
|
event: any | undefined,
|
|
354
429
|
fn: () => Promise<T>,
|
|
355
430
|
): Promise<T> {
|
|
@@ -366,9 +441,14 @@ async function withA2ARequestContext<T>(
|
|
|
366
441
|
(event?.context?.__a2aOrgDomain as string | undefined) ?? undefined;
|
|
367
442
|
|
|
368
443
|
const resolvedOrgId = await resolveVerifiedA2AOrgId(verifiedEmail, orgDomain);
|
|
444
|
+
const requestOrigin = requestOriginForContext(metadata, event);
|
|
369
445
|
|
|
370
446
|
return runWithRequestContext(
|
|
371
|
-
{
|
|
447
|
+
{
|
|
448
|
+
userEmail: verifiedEmail,
|
|
449
|
+
orgId: resolvedOrgId,
|
|
450
|
+
...(requestOrigin ? { requestOrigin } : {}),
|
|
451
|
+
},
|
|
372
452
|
fn,
|
|
373
453
|
) as Promise<T>;
|
|
374
454
|
}
|
|
@@ -528,14 +608,17 @@ async function handleSend(
|
|
|
528
608
|
// to metadata.orgDomain which is caller-supplied and unverified.
|
|
529
609
|
const orgDomainHint =
|
|
530
610
|
(event?.context?.__a2aOrgDomain as string | undefined) ?? undefined;
|
|
611
|
+
const requestOrigin = requestOriginForContext(metadata, event);
|
|
612
|
+
const safeMetadata = trustedA2AMetadata(metadata, event);
|
|
531
613
|
|
|
532
614
|
const taskMetadata: Record<string, unknown> = {
|
|
533
|
-
...(
|
|
615
|
+
...(safeMetadata ?? {}),
|
|
534
616
|
__a2a_processor: {
|
|
535
617
|
verifiedEmail,
|
|
536
618
|
orgDomainHint,
|
|
619
|
+
...(requestOrigin ? { requestOrigin } : {}),
|
|
537
620
|
contextId: contextId ?? null,
|
|
538
|
-
callerMetadata:
|
|
621
|
+
callerMetadata: safeMetadata ?? null,
|
|
539
622
|
},
|
|
540
623
|
};
|
|
541
624
|
const task = await createTask(
|
|
@@ -571,7 +654,12 @@ async function handleSend(
|
|
|
571
654
|
);
|
|
572
655
|
await updateTask(task.id, { state: "working" });
|
|
573
656
|
|
|
574
|
-
const ctx = makeHandlerContext(
|
|
657
|
+
const ctx = makeHandlerContext(
|
|
658
|
+
task.id,
|
|
659
|
+
contextId,
|
|
660
|
+
trustedA2AMetadata(metadata, event),
|
|
661
|
+
event,
|
|
662
|
+
);
|
|
575
663
|
|
|
576
664
|
try {
|
|
577
665
|
const result = getHandler(config)(message, ctx.context);
|
|
@@ -653,7 +741,7 @@ async function handleStream(
|
|
|
653
741
|
const { context, artifacts } = makeHandlerContext(
|
|
654
742
|
task.id,
|
|
655
743
|
contextId,
|
|
656
|
-
metadata,
|
|
744
|
+
trustedA2AMetadata(metadata, event),
|
|
657
745
|
event,
|
|
658
746
|
);
|
|
659
747
|
|
|
@@ -15,11 +15,11 @@
|
|
|
15
15
|
* agent-native connect --all [--client ...] (separate first-party app MCP resources)
|
|
16
16
|
*
|
|
17
17
|
* Server contract (implemented by another agent on `<url>`):
|
|
18
|
-
* POST <url>/
|
|
18
|
+
* POST <url>/mcp/connect/device/start (no auth)
|
|
19
19
|
* body { client?, app? }
|
|
20
20
|
* → { device_code, user_code, verification_uri,
|
|
21
21
|
* verification_uri_complete, interval, expires_in }
|
|
22
|
-
* POST <url>/
|
|
22
|
+
* POST <url>/mcp/connect/device/poll (no auth)
|
|
23
23
|
* body { device_code }
|
|
24
24
|
* → { status: "pending" }
|
|
25
25
|
* | { status: "approved", token, mcpUrl, serverName, mcpServerEntry }
|
|
@@ -35,6 +35,10 @@ import fs from "node:fs";
|
|
|
35
35
|
import os from "node:os";
|
|
36
36
|
import path from "node:path";
|
|
37
37
|
|
|
38
|
+
import {
|
|
39
|
+
MCP_LEGACY_ROUTE_PREFIX,
|
|
40
|
+
MCP_PUBLIC_ROUTE_PREFIX,
|
|
41
|
+
} from "../mcp/route-paths.js";
|
|
38
42
|
import { findWorkspaceRoot } from "../mcp/workspace-resolve.js";
|
|
39
43
|
import {
|
|
40
44
|
CLIENTS,
|
|
@@ -52,9 +56,10 @@ import {
|
|
|
52
56
|
} from "./plan-publish-store.js";
|
|
53
57
|
import { TEMPLATES, visibleTemplates } from "./templates-meta.js";
|
|
54
58
|
|
|
55
|
-
const DEVICE_START_PATH =
|
|
56
|
-
const DEVICE_POLL_PATH =
|
|
57
|
-
const MCP_PATH =
|
|
59
|
+
const DEVICE_START_PATH = `${MCP_PUBLIC_ROUTE_PREFIX}/connect/device/start`;
|
|
60
|
+
const DEVICE_POLL_PATH = `${MCP_PUBLIC_ROUTE_PREFIX}/connect/device/poll`;
|
|
61
|
+
const MCP_PATH = MCP_PUBLIC_ROUTE_PREFIX;
|
|
62
|
+
const LEGACY_MCP_PATH = MCP_LEGACY_ROUTE_PREFIX;
|
|
58
63
|
const SERVER_NAME_PREFIX = "agent-native";
|
|
59
64
|
const CONNECT_PREFERENCES_VERSION = 1;
|
|
60
65
|
|
|
@@ -64,16 +69,15 @@ const CONNECT_PREFERENCES_VERSION = 1;
|
|
|
64
69
|
* cannot import from there — it imports connect.ts, which would be circular).
|
|
65
70
|
*/
|
|
66
71
|
const CANONICAL_SERVER_NAME_BY_MCP_URL: Readonly<Record<string, string>> = {
|
|
67
|
-
"https://plan.agent-native.com/
|
|
68
|
-
"https://assets.agent-native.com/
|
|
69
|
-
"https://design.agent-native.com/
|
|
70
|
-
"https://context-xray.agent-native.com/
|
|
71
|
-
"agent-native-context-xray",
|
|
72
|
+
"https://plan.agent-native.com/mcp": "plan",
|
|
73
|
+
"https://assets.agent-native.com/mcp": "agent-native-assets",
|
|
74
|
+
"https://design.agent-native.com/mcp": "agent-native-design",
|
|
75
|
+
"https://context-xray.agent-native.com/mcp": "agent-native-context-xray",
|
|
72
76
|
};
|
|
73
77
|
const LEGACY_SERVER_NAMES_BY_MCP_URL: Readonly<
|
|
74
78
|
Record<string, readonly string[]>
|
|
75
79
|
> = {
|
|
76
|
-
"https://plan.agent-native.com/
|
|
80
|
+
"https://plan.agent-native.com/mcp": [
|
|
77
81
|
"agent-native-plan",
|
|
78
82
|
"agent-native-plans",
|
|
79
83
|
"agent-native-visual-plans",
|
|
@@ -759,8 +763,9 @@ function responseMessage(json: any, fallback: string): string {
|
|
|
759
763
|
function stripMcpPath(baseUrl: string): string {
|
|
760
764
|
const parsed = new URL(baseUrl);
|
|
761
765
|
const pathname = parsed.pathname.replace(/\/+$/, "");
|
|
762
|
-
|
|
763
|
-
|
|
766
|
+
const suffix = mcpPathSuffix(pathname);
|
|
767
|
+
if (suffix) {
|
|
768
|
+
parsed.pathname = pathname.slice(0, -suffix.length) || "/";
|
|
764
769
|
parsed.search = "";
|
|
765
770
|
parsed.hash = "";
|
|
766
771
|
return `${parsed.origin}${parsed.pathname}`.replace(/\/+$/, "");
|
|
@@ -771,8 +776,9 @@ function stripMcpPath(baseUrl: string): string {
|
|
|
771
776
|
function mcpUrlForBaseUrl(baseUrl: string): string {
|
|
772
777
|
const parsed = new URL(baseUrl);
|
|
773
778
|
const pathname = parsed.pathname.replace(/\/+$/, "");
|
|
774
|
-
|
|
775
|
-
|
|
779
|
+
const suffix = mcpPathSuffix(pathname);
|
|
780
|
+
if (suffix) {
|
|
781
|
+
parsed.pathname = `${pathname.slice(0, -suffix.length)}${MCP_PATH}`;
|
|
776
782
|
parsed.search = "";
|
|
777
783
|
parsed.hash = "";
|
|
778
784
|
return `${parsed.origin}${parsed.pathname}`;
|
|
@@ -805,7 +811,10 @@ async function validateOAuthMcpServer(
|
|
|
805
811
|
const metadata = (await response.json().catch(() => null)) as {
|
|
806
812
|
resource?: unknown;
|
|
807
813
|
} | null;
|
|
808
|
-
if (
|
|
814
|
+
if (
|
|
815
|
+
canonicalMcpUrl(String(metadata?.resource ?? "")) !==
|
|
816
|
+
canonicalMcpUrl(mcpUrl)
|
|
817
|
+
) {
|
|
809
818
|
logErr(
|
|
810
819
|
` ${metadataUrl} did not advertise the expected MCP resource ` +
|
|
811
820
|
`${mcpUrl}.`,
|
|
@@ -980,7 +989,7 @@ export async function runDeviceFlow(
|
|
|
980
989
|
if (poll.status === "approved") {
|
|
981
990
|
if (isTTY) process.stdout.write("\r\x1b[K");
|
|
982
991
|
const token = poll.token ?? "";
|
|
983
|
-
const mcpUrl = poll.mcpUrl ??
|
|
992
|
+
const mcpUrl = mcpUrlForBaseUrl(poll.mcpUrl ?? baseUrl);
|
|
984
993
|
const serverName = poll.serverName ?? `${SERVER_NAME_PREFIX}-${appSlug}`;
|
|
985
994
|
const headers =
|
|
986
995
|
poll.mcpServerEntry &&
|
|
@@ -990,7 +999,12 @@ export async function runDeviceFlow(
|
|
|
990
999
|
? (poll.mcpServerEntry.headers as Record<string, string>)
|
|
991
1000
|
: undefined;
|
|
992
1001
|
logOut(" Approved.");
|
|
993
|
-
return {
|
|
1002
|
+
return {
|
|
1003
|
+
token: token || undefined,
|
|
1004
|
+
mcpUrl,
|
|
1005
|
+
serverName,
|
|
1006
|
+
...(headers ? { headers } : {}),
|
|
1007
|
+
};
|
|
994
1008
|
}
|
|
995
1009
|
if (poll.status === "expired") {
|
|
996
1010
|
if (isTTY) process.stdout.write("\r\x1b[K");
|
|
@@ -1383,12 +1397,25 @@ function canonicalMcpUrl(value: string | undefined): string | undefined {
|
|
|
1383
1397
|
try {
|
|
1384
1398
|
const url = new URL(value);
|
|
1385
1399
|
url.hash = "";
|
|
1400
|
+
const pathname = url.pathname.replace(/\/+$/, "");
|
|
1401
|
+
if (pathname === LEGACY_MCP_PATH || pathname.endsWith(LEGACY_MCP_PATH)) {
|
|
1402
|
+
url.pathname = `${pathname.slice(0, -LEGACY_MCP_PATH.length)}${MCP_PATH}`;
|
|
1403
|
+
}
|
|
1386
1404
|
return url.toString().replace(/\/+$/, "");
|
|
1387
1405
|
} catch {
|
|
1388
1406
|
return undefined;
|
|
1389
1407
|
}
|
|
1390
1408
|
}
|
|
1391
1409
|
|
|
1410
|
+
function mcpPathSuffix(pathname: string): string | undefined {
|
|
1411
|
+
const normalized = pathname.replace(/\/+$/, "");
|
|
1412
|
+
if (normalized === LEGACY_MCP_PATH || normalized.endsWith(LEGACY_MCP_PATH)) {
|
|
1413
|
+
return LEGACY_MCP_PATH;
|
|
1414
|
+
}
|
|
1415
|
+
if (normalized === MCP_PATH || normalized.endsWith(MCP_PATH)) return MCP_PATH;
|
|
1416
|
+
return undefined;
|
|
1417
|
+
}
|
|
1418
|
+
|
|
1392
1419
|
function sameMcpUrl(a: string | undefined, b: string | undefined): boolean {
|
|
1393
1420
|
const left = canonicalMcpUrl(a);
|
|
1394
1421
|
const right = canonicalMcpUrl(b);
|
|
@@ -1663,7 +1690,7 @@ function devMcpUrl(
|
|
|
1663
1690
|
gatewayUrls: Map<string, string>,
|
|
1664
1691
|
): string {
|
|
1665
1692
|
const base = gatewayUrls.get(app.name) ?? `${gatewayUrl}/${app.name}`;
|
|
1666
|
-
return `${base.replace(/\/+$/, "")}
|
|
1693
|
+
return `${base.replace(/\/+$/, "")}${MCP_PATH}`;
|
|
1667
1694
|
}
|
|
1668
1695
|
|
|
1669
1696
|
function serverNameForApp(app: ConnectableApp): string {
|
|
@@ -1856,14 +1883,13 @@ function preferredReconnectEntry(
|
|
|
1856
1883
|
|
|
1857
1884
|
/**
|
|
1858
1885
|
* Return true when `url` is an agent-native MCP endpoint.
|
|
1859
|
-
* Matches
|
|
1860
|
-
*
|
|
1886
|
+
* Matches either the public `/mcp` path or the legacy `/_agent-native/mcp`
|
|
1887
|
+
* path, regardless of the MCP server's name in the config.
|
|
1861
1888
|
*/
|
|
1862
1889
|
function isAgentNativeMcpUrl(url: string | undefined): boolean {
|
|
1863
1890
|
if (!url) return false;
|
|
1864
1891
|
try {
|
|
1865
|
-
|
|
1866
|
-
return pathname === MCP_PATH || pathname.endsWith(MCP_PATH);
|
|
1892
|
+
return Boolean(mcpPathSuffix(new URL(url).pathname));
|
|
1867
1893
|
} catch {
|
|
1868
1894
|
return false;
|
|
1869
1895
|
}
|
|
@@ -2036,7 +2062,7 @@ async function resolveReconnectTarget(
|
|
|
2036
2062
|
logErr(" Re-run with a URL or --name <serverName>. For example:");
|
|
2037
2063
|
for (const u of urlList) {
|
|
2038
2064
|
// Strip the MCP path suffix for a cleaner reconnect URL suggestion.
|
|
2039
|
-
const baseUrl = u
|
|
2065
|
+
const baseUrl = stripMcpPath(u);
|
|
2040
2066
|
logErr(` npx -y @agent-native/core@latest reconnect ${baseUrl}`);
|
|
2041
2067
|
}
|
|
2042
2068
|
return null;
|
|
@@ -27,6 +27,9 @@ import fs from "node:fs";
|
|
|
27
27
|
import os from "node:os";
|
|
28
28
|
import path from "node:path";
|
|
29
29
|
|
|
30
|
+
const MCP_LEGACY_ROUTE_PREFIX = "/_agent-native/mcp";
|
|
31
|
+
const MCP_PUBLIC_ROUTE_PREFIX = "/mcp";
|
|
32
|
+
|
|
30
33
|
export type ClientId =
|
|
31
34
|
| "claude-code"
|
|
32
35
|
| "claude-code-cli"
|
|
@@ -671,6 +674,13 @@ export function canonicalUrl(value: string | undefined): string | undefined {
|
|
|
671
674
|
const u = new URL(value);
|
|
672
675
|
u.hash = "";
|
|
673
676
|
u.search = "";
|
|
677
|
+
const pathname = u.pathname.replace(/\/+$/, "");
|
|
678
|
+
if (
|
|
679
|
+
pathname === MCP_LEGACY_ROUTE_PREFIX ||
|
|
680
|
+
pathname.endsWith(MCP_LEGACY_ROUTE_PREFIX)
|
|
681
|
+
) {
|
|
682
|
+
u.pathname = `${pathname.slice(0, -MCP_LEGACY_ROUTE_PREFIX.length)}${MCP_PUBLIC_ROUTE_PREFIX}`;
|
|
683
|
+
}
|
|
674
684
|
return u.toString().replace(/\/+$/, "");
|
|
675
685
|
} catch {
|
|
676
686
|
return undefined;
|
|
@@ -17,6 +17,7 @@ import crypto from "node:crypto";
|
|
|
17
17
|
import fs from "node:fs";
|
|
18
18
|
import path from "node:path";
|
|
19
19
|
|
|
20
|
+
import { MCP_PUBLIC_ROUTE_PREFIX } from "../mcp/route-paths.js";
|
|
20
21
|
import { runScreenMemoryMCPStdio } from "../mcp/screen-memory-stdio.js";
|
|
21
22
|
import { runMCPStdio } from "../mcp/stdio.js";
|
|
22
23
|
import {
|
|
@@ -178,7 +179,7 @@ function ensureLocalToken(
|
|
|
178
179
|
/**
|
|
179
180
|
* Detect a hosted deployment URL. When the workspace .env points at a hosted
|
|
180
181
|
* origin (APP_URL / BETTER_AUTH_URL with a non-localhost host) we write an
|
|
181
|
-
* `http` client entry pointing at `<origin>/
|
|
182
|
+
* `http` client entry pointing at `<origin>/mcp` with a JWT
|
|
182
183
|
* bearer instead of a stdio entry.
|
|
183
184
|
*/
|
|
184
185
|
function detectHostedUrl(cwd: string): string | undefined {
|
|
@@ -193,7 +194,8 @@ function detectHostedUrl(cwd: string): string | undefined {
|
|
|
193
194
|
try {
|
|
194
195
|
const u = new URL(v);
|
|
195
196
|
if (!/^(localhost|127\.0\.0\.1|\[::1\])$/.test(u.hostname)) {
|
|
196
|
-
|
|
197
|
+
const appPath = u.pathname.replace(/\/+$/, "");
|
|
198
|
+
return `${u.origin}${appPath === "/" ? "" : appPath}${MCP_PUBLIC_ROUTE_PREFIX}`;
|
|
197
199
|
}
|
|
198
200
|
} catch {
|
|
199
201
|
// not a URL — skip
|
|
@@ -501,9 +503,7 @@ async function cmdStatus(): Promise<void> {
|
|
|
501
503
|
logOut(
|
|
502
504
|
hostedUrl
|
|
503
505
|
? ` MCP URL: ${hostedUrl} (hosted)`
|
|
504
|
-
: ` MCP URL: ${origin}/
|
|
505
|
-
port ? ` (port ${port})` : ""
|
|
506
|
-
}`,
|
|
506
|
+
: ` MCP URL: ${origin}/mcp${port ? ` (port ${port})` : ""}`,
|
|
507
507
|
);
|
|
508
508
|
logOut(` ACCESS_TOKEN: ${hasToken ? "set" : "not set"} (.env)`);
|
|
509
509
|
logOut(` A2A_SECRET: ${hasA2A ? "set" : "not set"}`);
|
|
@@ -55,7 +55,7 @@ of using a generic image generator.
|
|
|
55
55
|
|
|
56
56
|
## Cross-App Use
|
|
57
57
|
|
|
58
|
-
- Hosted default: connect \`https://assets.agent-native.com/
|
|
58
|
+
- Hosted default: connect \`https://assets.agent-native.com/mcp\`.
|
|
59
59
|
Do not put shared secrets in skill files.
|
|
60
60
|
- For CLI/code-editor clients, keep any \`npx @agent-native/core@latest connect\` command
|
|
61
61
|
running until browser authorization finishes. Stopping it early can leave the
|
|
@@ -92,7 +92,7 @@ separate those jobs; use it, and hold this bar:
|
|
|
92
92
|
|
|
93
93
|
## Cross-App Use
|
|
94
94
|
|
|
95
|
-
- Hosted default: connect \`https://design.agent-native.com/
|
|
95
|
+
- Hosted default: connect \`https://design.agent-native.com/mcp\`.
|
|
96
96
|
Do not put shared secrets in skill files.
|
|
97
97
|
- For CLI/code-editor clients, keep any \`npx @agent-native/core@latest connect\` command
|
|
98
98
|
running until browser authorization finishes. Stopping it early can leave the
|
|
@@ -48,7 +48,7 @@ register MCP where possible without authenticating (leave auth to the host or ru
|
|
|
48
48
|
"npx @agent-native/core@latest connect" later). Pass --mcp-url to register that connector against
|
|
49
49
|
a custom origin (an ngrok tunnel, a local dev server, or a self-hosted
|
|
50
50
|
deployment) instead of the built-in hosted default — a bare origin gets the
|
|
51
|
-
standard /
|
|
51
|
+
standard /mcp path appended. Use app-skill pack for marketplace
|
|
52
52
|
bundles and custom adapter output.
|
|
53
53
|
|
|
54
54
|
When installing visual-plan, visual-recap, or visualize-repo interactively, the
|
|
@@ -76,5 +76,5 @@ client. Reconnect re-authenticates WITHOUT reinstalling and finds the entry by
|
|
|
76
76
|
URL regardless of connector name. Never reinstall from scratch just to fix auth.
|
|
77
77
|
Continue once the connector is available.
|
|
78
78
|
|
|
79
|
-
Hosted default: connect \`https://plan.agent-native.com/
|
|
79
|
+
Hosted default: connect \`https://plan.agent-native.com/mcp\`. Do
|
|
80
80
|
not put shared secrets in skill files.`;
|
|
@@ -465,6 +465,6 @@ If a Plans tool returns \`needs auth\`, \`Unauthorized\`, or \`Session terminate
|
|
|
465
465
|
not keep retrying it — stop and give the user the per-client reconnect step from
|
|
466
466
|
\`references/connection.md\`, then continue once the connector is available.
|
|
467
467
|
|
|
468
|
-
Hosted default: connect \`https://plan.agent-native.com/
|
|
468
|
+
Hosted default: connect \`https://plan.agent-native.com/mcp\`. Do
|
|
469
469
|
not put shared secrets in skill files.
|
|
470
470
|
`;
|
|
@@ -270,7 +270,7 @@ Resolve the URL in this order:
|
|
|
270
270
|
the plan.
|
|
271
271
|
2. Use a \`localhost\`/dev origin ONLY when the recap was created through a Plan
|
|
272
272
|
MCP bound to that same origin — i.e. that MCP's url is
|
|
273
|
-
\`http://localhost:<port>/
|
|
273
|
+
\`http://localhost:<port>/mcp\`. Creating through the hosted MCP
|
|
274
274
|
and linking to localhost is the exact mismatch that 404s.
|
|
275
275
|
3. If only a plan id is available, build the MCP origin's absolute URL
|
|
276
276
|
(hosted: \`https://plan.agent-native.com/plans/<id>\`) and say it was inferred.
|
|
@@ -278,7 +278,7 @@ Resolve the URL in this order:
|
|
|
278
278
|
If the user wants to review on localhost but the recap was created through the
|
|
279
279
|
hosted MCP, say so plainly: the local dev server cannot see it. To view a recap
|
|
280
280
|
on localhost (e.g. to exercise un-deployed local renderer changes), they must
|
|
281
|
-
connect a LOCAL Plan MCP (\`http://localhost:<port>/
|
|
281
|
+
connect a LOCAL Plan MCP (\`http://localhost:<port>/mcp\`) and
|
|
282
282
|
re-create the recap through it so it lands in the local database; offer to do
|
|
283
283
|
that rather than handing over a localhost URL that will not resolve.
|
|
284
284
|
|
|
@@ -11,6 +11,10 @@ import os from "node:os";
|
|
|
11
11
|
import path from "node:path";
|
|
12
12
|
import { fileURLToPath } from "node:url";
|
|
13
13
|
|
|
14
|
+
import {
|
|
15
|
+
MCP_LEGACY_ROUTE_PREFIX,
|
|
16
|
+
MCP_PUBLIC_ROUTE_PREFIX,
|
|
17
|
+
} from "../mcp/route-paths.js";
|
|
14
18
|
import {
|
|
15
19
|
buildAppSkillPack,
|
|
16
20
|
ensureAppSkill,
|
|
@@ -72,7 +76,7 @@ export const BUILT_IN_APP_SKILLS = {
|
|
|
72
76
|
"Create, search, select, and export brand image and video assets from the Assets app.",
|
|
73
77
|
hosted: {
|
|
74
78
|
url: "https://assets.agent-native.com",
|
|
75
|
-
mcpUrl: "https://assets.agent-native.com/
|
|
79
|
+
mcpUrl: "https://assets.agent-native.com/mcp",
|
|
76
80
|
},
|
|
77
81
|
mcp: { serverName: "agent-native-assets" },
|
|
78
82
|
auth: {
|
|
@@ -118,7 +122,7 @@ export const BUILT_IN_APP_SKILLS = {
|
|
|
118
122
|
"Edit docs, blogs, resources, and MDX content through the Content app, including repo-backed Local File Mode.",
|
|
119
123
|
hosted: {
|
|
120
124
|
url: "https://content.agent-native.com",
|
|
121
|
-
mcpUrl: "https://content.agent-native.com/
|
|
125
|
+
mcpUrl: "https://content.agent-native.com/mcp",
|
|
122
126
|
},
|
|
123
127
|
mcp: { serverName: "agent-native-content" },
|
|
124
128
|
auth: {
|
|
@@ -170,7 +174,7 @@ export const BUILT_IN_APP_SKILLS = {
|
|
|
170
174
|
"Explore, compare, iterate, and export interactive UI design prototypes from the Design app.",
|
|
171
175
|
hosted: {
|
|
172
176
|
url: "https://design.agent-native.com",
|
|
173
|
-
mcpUrl: "https://design.agent-native.com/
|
|
177
|
+
mcpUrl: "https://design.agent-native.com/mcp",
|
|
174
178
|
},
|
|
175
179
|
mcp: { serverName: "agent-native-design" },
|
|
176
180
|
auth: {
|
|
@@ -247,7 +251,7 @@ export const BUILT_IN_APP_SKILLS = {
|
|
|
247
251
|
"Create rich interactive visual plans, recaps, and repo-native visual docs with diagrams, file maps, annotated code and diffs, API/schema summaries, feedback, and HTML export.",
|
|
248
252
|
hosted: {
|
|
249
253
|
url: "https://plan.agent-native.com",
|
|
250
|
-
mcpUrl: "https://plan.agent-native.com/
|
|
254
|
+
mcpUrl: "https://plan.agent-native.com/mcp",
|
|
251
255
|
},
|
|
252
256
|
mcp: { serverName: "plan", aliases: ["agent-native-plans"] },
|
|
253
257
|
auth: {
|
|
@@ -317,7 +321,7 @@ export const BUILT_IN_APP_SKILLS = {
|
|
|
317
321
|
"Visualize local Codex and Claude Code context usage with warnings and optimization tips.",
|
|
318
322
|
hosted: {
|
|
319
323
|
url: "https://context-xray.agent-native.com",
|
|
320
|
-
mcpUrl: "https://context-xray.agent-native.com/
|
|
324
|
+
mcpUrl: "https://context-xray.agent-native.com/mcp",
|
|
321
325
|
},
|
|
322
326
|
mcp: { serverName: "agent-native-context-xray" },
|
|
323
327
|
auth: { mode: "none" },
|
|
@@ -2771,8 +2775,11 @@ function preserveMcpUrlAppPathOverride(
|
|
|
2771
2775
|
return target;
|
|
2772
2776
|
}
|
|
2773
2777
|
const trimmedPath = parsed.pathname.replace(/\/+$/, "");
|
|
2774
|
-
const
|
|
2775
|
-
|
|
2778
|
+
const mcpSuffix = [MCP_LEGACY_ROUTE_PREFIX, MCP_PUBLIC_ROUTE_PREFIX].find(
|
|
2779
|
+
(suffix) => trimmedPath === suffix || trimmedPath.endsWith(suffix),
|
|
2780
|
+
);
|
|
2781
|
+
const appPath = mcpSuffix
|
|
2782
|
+
? trimmedPath.slice(0, -mcpSuffix.length).replace(/\/+$/, "")
|
|
2776
2783
|
: trimmedPath;
|
|
2777
2784
|
if (!appPath) return target;
|
|
2778
2785
|
const url = `${parsed.origin}${appPath}`;
|
|
@@ -2782,7 +2789,7 @@ function preserveMcpUrlAppPathOverride(
|
|
|
2782
2789
|
...target.loaded,
|
|
2783
2790
|
manifest: {
|
|
2784
2791
|
...target.loaded.manifest,
|
|
2785
|
-
hosted: { url, mcpUrl: `${url}
|
|
2792
|
+
hosted: { url, mcpUrl: `${url}${MCP_PUBLIC_ROUTE_PREFIX}` },
|
|
2786
2793
|
},
|
|
2787
2794
|
},
|
|
2788
2795
|
};
|
|
@@ -2870,7 +2877,8 @@ async function runCommand(
|
|
|
2870
2877
|
/**
|
|
2871
2878
|
* Resolve a `--mcp-url` override into the `{ url, mcpUrl }` pair the manifest
|
|
2872
2879
|
* expects. Accepts a bare origin (`https://x.ngrok-free.dev`) — appending the
|
|
2873
|
-
* standard `/
|
|
2880
|
+
* standard `/mcp` path — or a full MCP URL already ending in `/mcp` or the
|
|
2881
|
+
* legacy `/_agent-native/mcp` path.
|
|
2874
2882
|
*/
|
|
2875
2883
|
function resolveMcpUrlOverride(input: string): { url: string; mcpUrl: string } {
|
|
2876
2884
|
let parsed: URL;
|
|
@@ -2884,9 +2892,12 @@ function resolveMcpUrlOverride(input: string): { url: string; mcpUrl: string } {
|
|
|
2884
2892
|
}
|
|
2885
2893
|
const origin = parsed.origin;
|
|
2886
2894
|
const trimmedPath = parsed.pathname.replace(/\/+$/, "");
|
|
2887
|
-
const
|
|
2888
|
-
|
|
2889
|
-
|
|
2895
|
+
const mcpSuffix = [MCP_LEGACY_ROUTE_PREFIX, MCP_PUBLIC_ROUTE_PREFIX].find(
|
|
2896
|
+
(suffix) => trimmedPath === suffix || trimmedPath.endsWith(suffix),
|
|
2897
|
+
);
|
|
2898
|
+
const mcpUrl = mcpSuffix
|
|
2899
|
+
? `${origin}${trimmedPath.slice(0, -mcpSuffix.length)}${MCP_PUBLIC_ROUTE_PREFIX}`
|
|
2900
|
+
: `${origin}${MCP_PUBLIC_ROUTE_PREFIX}`;
|
|
2890
2901
|
return { url: origin, mcpUrl };
|
|
2891
2902
|
}
|
|
2892
2903
|
|
|
@@ -447,6 +447,11 @@ export function McpIntegrationDialog({
|
|
|
447
447
|
<div className="min-h-0 flex-1 overflow-y-auto px-7 py-5">
|
|
448
448
|
<div className="space-y-3">
|
|
449
449
|
{renderScopeSelector()}
|
|
450
|
+
{selected?.setupNoteKey && (
|
|
451
|
+
<div className="rounded-md border border-amber-500/20 bg-amber-500/5 px-3 py-2 text-[11px] leading-relaxed text-amber-700 dark:text-amber-300">
|
|
452
|
+
{t(selected.setupNoteKey)}
|
|
453
|
+
</div>
|
|
454
|
+
)}
|
|
450
455
|
{selected?.authMode === "oauth" && (
|
|
451
456
|
<div className="rounded-md border border-blue-500/20 bg-blue-500/5 px-3 py-2 text-[11px] leading-relaxed text-blue-700 dark:text-blue-300">
|
|
452
457
|
{t("mcpIntegrations.oauthNotice")}
|
|
@@ -21,6 +21,7 @@ export interface DefaultMcpIntegration {
|
|
|
21
21
|
url: string;
|
|
22
22
|
authMode: McpIntegrationAuthMode;
|
|
23
23
|
docsUrl?: string;
|
|
24
|
+
setupNoteKey?: string;
|
|
24
25
|
headerPlaceholder?: string;
|
|
25
26
|
keywords: string[];
|
|
26
27
|
}
|
|
@@ -99,6 +100,22 @@ export const DEFAULT_MCP_INTEGRATIONS: DefaultMcpIntegration[] = [
|
|
|
99
100
|
docsUrl: "https://www.builder.io/c/docs/fusion-connect-to-linear",
|
|
100
101
|
keywords: ["issues", "tickets", "planning", "project management"],
|
|
101
102
|
},
|
|
103
|
+
{
|
|
104
|
+
id: "atlassian",
|
|
105
|
+
name: "Atlassian",
|
|
106
|
+
provider: "atlassian",
|
|
107
|
+
description: "Read and write Jira issues and Confluence content.",
|
|
108
|
+
descriptionKey: "mcpIntegrations.catalog.atlassian.description",
|
|
109
|
+
useCase:
|
|
110
|
+
"project management, issue tracking, documentation, team collaboration",
|
|
111
|
+
useCaseKey: "mcpIntegrations.catalog.atlassian.useCase",
|
|
112
|
+
url: "https://mcp.atlassian.com/v1/mcp/authv2",
|
|
113
|
+
authMode: "oauth",
|
|
114
|
+
docsUrl:
|
|
115
|
+
"https://developer.atlassian.com/cloud/rovo-mcp/guides/getting-started/",
|
|
116
|
+
setupNoteKey: "mcpIntegrations.catalog.atlassian.setupNote",
|
|
117
|
+
keywords: ["atlassian", "jira", "confluence", "issues", "tickets"],
|
|
118
|
+
},
|
|
102
119
|
{
|
|
103
120
|
id: "supabase",
|
|
104
121
|
name: "Supabase",
|