@agent-native/core 0.98.17 → 0.99.1
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 +25 -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/agent/production-agent.ts +21 -0
- 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/pr-visual-recap-workflow.ts +1 -1
- 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/analytics.ts +13 -0
- 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/action-filters-a2a.ts +13 -0
- package/corpus/core/src/server/agent-chat-plugin.ts +42 -9
- package/corpus/core/src/server/agent-teams.ts +17 -0
- 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 +12 -2
- 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/assets/replay-cursor.svg +17 -0
- package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +4 -3
- package/corpus/templates/analytics/app/global.css +71 -4
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +32 -4
- package/corpus/templates/analytics/app/pages/monitoring/errors/IssueDetail.tsx +1 -1
- package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +49 -11
- package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +4 -6
- package/corpus/templates/analytics/changelog/2026-07-13-all-time-dashboard-filters-no-longer-send-invalid-dates-to-b.md +6 -0
- 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-error-issue-titles-wrap-instead-of-overflowing.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-13-saving-a-new-dashboard-view-no-longer-fails-with-a-server-er.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-13-session-replay-cursors-stay-hidden-until-their-first-recorde.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-13-session-replay-links-now-support-cmd-click-and-middle-click-.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/lib/dashboards-store.ts +43 -4
- package/corpus/templates/analytics/server/lib/error-capture.ts +24 -5
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +5 -0
- 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/library/recording-card.tsx +27 -26
- package/corpus/templates/clips/app/components/library/space-card.tsx +4 -6
- 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/app/components/sidebar/DocumentSidebar.tsx +18 -16
- 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/agent/production-agent.d.ts +9 -0
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +12 -0
- package/dist/agent/production-agent.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/pr-visual-recap-workflow.d.ts +1 -1
- package/dist/cli/pr-visual-recap-workflow.d.ts.map +1 -1
- package/dist/cli/pr-visual-recap-workflow.js +1 -1
- package/dist/cli/pr-visual-recap-workflow.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/analytics.d.ts.map +1 -1
- package/dist/client/analytics.js +11 -0
- package/dist/client/analytics.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/routes.d.ts +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 +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 +2 -2
- package/dist/server/agent-chat/action-filters-a2a.d.ts.map +1 -1
- package/dist/server/agent-chat/action-filters-a2a.js +11 -1
- package/dist/server/agent-chat/action-filters-a2a.js.map +1 -1
- 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/agent-teams.d.ts.map +1 -1
- package/dist/server/agent-teams.js +15 -1
- package/dist/server/agent-teams.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 +11 -2
- 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 +2 -2
- 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
|
@@ -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.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
+
<svg
|
|
3
|
+
version="1.1"
|
|
4
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
5
|
+
viewBox="-0.8 -0.8 22.8 30.4"
|
|
6
|
+
shape-rendering="geometricPrecision"
|
|
7
|
+
>
|
|
8
|
+
<path
|
|
9
|
+
d="M 2.5 1.8 C 2.2 1.5 1.8 1.7 1.8 2.1 V 21.9 C 1.8 22.5 2.5 22.8 2.9 22.4 L 7.4 17.5 L 11.5 26.2 C 11.7 26.7 12.3 26.9 12.8 26.7 L 15.7 25.3 C 16.2 25.1 16.4 24.5 16.2 24 L 12.4 15.4 H 18.4 C 19.1 15.4 19.4 14.5 18.9 14 Z"
|
|
10
|
+
fill="#000000"
|
|
11
|
+
stroke="#FFFFFF"
|
|
12
|
+
stroke-width="4.35"
|
|
13
|
+
stroke-linecap="round"
|
|
14
|
+
stroke-linejoin="round"
|
|
15
|
+
paint-order="stroke fill"
|
|
16
|
+
/>
|
|
17
|
+
</svg>
|
|
@@ -24,6 +24,7 @@ import {
|
|
|
24
24
|
type ReactNode,
|
|
25
25
|
} from "react";
|
|
26
26
|
import { createPortal } from "react-dom";
|
|
27
|
+
import { Link } from "react-router";
|
|
27
28
|
import {
|
|
28
29
|
Area,
|
|
29
30
|
AreaChart,
|
|
@@ -1579,12 +1580,12 @@ function TableRenderer({
|
|
|
1579
1580
|
{replayHref ? (
|
|
1580
1581
|
<span className="inline-flex flex-col gap-0.5">
|
|
1581
1582
|
<span>{content}</span>
|
|
1582
|
-
<
|
|
1583
|
-
|
|
1583
|
+
<Link
|
|
1584
|
+
to={replayHref}
|
|
1584
1585
|
className="text-xs font-medium text-primary hover:underline"
|
|
1585
1586
|
>
|
|
1586
1587
|
{t("sessions.watchReplay")}
|
|
1587
|
-
</
|
|
1588
|
+
</Link>
|
|
1588
1589
|
</span>
|
|
1589
1590
|
) : (
|
|
1590
1591
|
content
|
|
@@ -245,14 +245,81 @@
|
|
|
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. Use the normal black Mac cursor with its white outline;
|
|
253
|
+
the small shadow below keeps it legible on either background. */
|
|
254
|
+
.an-replay-stage-root .replayer-mouse {
|
|
255
|
+
position: absolute;
|
|
256
|
+
z-index: 2;
|
|
257
|
+
/* Render at 2x locally, then downscale to the compact 0.72rem x 0.96rem
|
|
258
|
+
screen size. This keeps the small cursor's rounded outline smooth. */
|
|
259
|
+
width: 1.44rem;
|
|
260
|
+
height: 1.92rem;
|
|
261
|
+
border-radius: 0;
|
|
262
|
+
background: transparent;
|
|
263
|
+
background-image: none;
|
|
264
|
+
box-shadow: none;
|
|
265
|
+
visibility: hidden;
|
|
266
|
+
/* The stage is fit-to-container, but the recorded cursor should stay at a
|
|
267
|
+
normal on-screen size. The stage supplies the inverse scale variable. */
|
|
268
|
+
transform: scale(calc(var(--an-replay-cursor-scale, 1) * 0.5));
|
|
269
|
+
transform-origin: top left;
|
|
270
|
+
transition:
|
|
271
|
+
left 80ms linear,
|
|
272
|
+
top 80ms linear;
|
|
273
|
+
pointer-events: none;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
.an-replay-stage-root .replayer-mouse.has-position {
|
|
277
|
+
visibility: visible;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
.an-replay-stage-root .replayer-mouse::before {
|
|
281
|
+
content: "";
|
|
282
|
+
position: absolute;
|
|
283
|
+
inset: 0;
|
|
284
|
+
background: url("./assets/replay-cursor.svg") center / contain no-repeat;
|
|
285
|
+
filter: drop-shadow(0 1px 1px hsl(0 0% 0% / 0.4));
|
|
286
|
+
}
|
|
287
|
+
|
|
252
288
|
.an-replay-stage-root .replayer-mouse::after {
|
|
289
|
+
content: "";
|
|
290
|
+
position: absolute;
|
|
291
|
+
left: -0.5rem;
|
|
292
|
+
top: -0.5rem;
|
|
293
|
+
width: 1rem;
|
|
294
|
+
height: 1rem;
|
|
295
|
+
border: 2px solid hsl(217 91% 60%);
|
|
296
|
+
border-radius: 9999px;
|
|
297
|
+
background: transparent;
|
|
253
298
|
opacity: 0;
|
|
254
299
|
}
|
|
255
300
|
|
|
301
|
+
/* rrweb toggles `.active` on mouse interactions; pulse a click ripple. */
|
|
302
|
+
.an-replay-stage-root .replayer-mouse.active::after {
|
|
303
|
+
animation: an-replay-mouse-click 0.4s ease-out 1;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
@keyframes an-replay-mouse-click {
|
|
307
|
+
0% {
|
|
308
|
+
opacity: 0.5;
|
|
309
|
+
transform: scale(1);
|
|
310
|
+
}
|
|
311
|
+
100% {
|
|
312
|
+
opacity: 0;
|
|
313
|
+
transform: scale(3.5);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
.an-replay-stage-root .replayer-mouse-tail {
|
|
318
|
+
position: absolute;
|
|
319
|
+
inset: 0;
|
|
320
|
+
pointer-events: none;
|
|
321
|
+
}
|
|
322
|
+
|
|
256
323
|
.analytics-session-snippet .plan-code-surface {
|
|
257
324
|
border: 0;
|
|
258
325
|
border-radius: 0;
|
|
@@ -41,6 +41,12 @@ function daysAgo(n: number): string {
|
|
|
41
41
|
return d.toISOString().slice(0, 10);
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
+
// Keep the legacy "all" date-range sentinel out of provider queries. Analytics
|
|
45
|
+
// data cannot predate the Unix epoch, so this is equivalent to an unbounded
|
|
46
|
+
// lower date while remaining valid for BigQuery DATE/TIMESTAMP expressions.
|
|
47
|
+
const ALL_TIME_START = "1970-01-01";
|
|
48
|
+
const ISO_DATE_RE = /^\d{4}-\d{2}-\d{2}$/;
|
|
49
|
+
|
|
44
50
|
/** Date-valued filters whose default may use the "Nd" / "today" shorthand. */
|
|
45
51
|
const DATE_FILTER_TYPES: ReadonlySet<FilterType> = new Set([
|
|
46
52
|
"date",
|
|
@@ -70,6 +76,18 @@ function resolveDefault(raw: string | undefined, type: FilterType): string {
|
|
|
70
76
|
return raw;
|
|
71
77
|
}
|
|
72
78
|
|
|
79
|
+
function resolveDateValue(
|
|
80
|
+
raw: string | undefined,
|
|
81
|
+
allTimeValue: string,
|
|
82
|
+
): string {
|
|
83
|
+
const value = raw?.trim();
|
|
84
|
+
if (!value) return "";
|
|
85
|
+
if (value.toLowerCase() === "all") return allTimeValue;
|
|
86
|
+
|
|
87
|
+
const resolved = resolveDefault(value, "date");
|
|
88
|
+
return ISO_DATE_RE.test(resolved) ? resolved : "";
|
|
89
|
+
}
|
|
90
|
+
|
|
73
91
|
export function resolveFilterVars(
|
|
74
92
|
filters: DashboardFilter[],
|
|
75
93
|
getParam: (key: string) => string,
|
|
@@ -79,17 +97,27 @@ export function resolveFilterVars(
|
|
|
79
97
|
if (f.type === "date-range") {
|
|
80
98
|
const startKey = `${f.id}Start`;
|
|
81
99
|
const endKey = `${f.id}End`;
|
|
82
|
-
out[startKey] =
|
|
83
|
-
|
|
100
|
+
out[startKey] =
|
|
101
|
+
resolveDateValue(getParam(startKey), ALL_TIME_START) ||
|
|
102
|
+
resolveDateValue(resolveDefault(f.default, f.type), ALL_TIME_START);
|
|
103
|
+
out[endKey] =
|
|
104
|
+
resolveDateValue(getParam(endKey), daysAgo(0)) || daysAgo(0);
|
|
84
105
|
} else if (f.type === "toggle" || f.type === "toggle-date") {
|
|
85
106
|
// Toggles have no "off value" default — if the user hasn't opted in
|
|
86
107
|
// via the URL, the SQL-side conditional block ({{?id}}...{{/id}})
|
|
87
108
|
// must see an empty value so it doesn't emit. Otherwise the filter
|
|
88
109
|
// looks "off" in the UI but still filters the data.
|
|
89
|
-
out[f.id] =
|
|
110
|
+
out[f.id] =
|
|
111
|
+
f.type === "toggle-date"
|
|
112
|
+
? resolveDateValue(getParam(f.id), ALL_TIME_START)
|
|
113
|
+
: getParam(f.id);
|
|
90
114
|
} else {
|
|
91
115
|
const v = getParam(f.id);
|
|
92
|
-
out[f.id] =
|
|
116
|
+
out[f.id] =
|
|
117
|
+
f.type === "date"
|
|
118
|
+
? resolveDateValue(v, ALL_TIME_START) ||
|
|
119
|
+
resolveDateValue(resolveDefault(f.default, f.type), ALL_TIME_START)
|
|
120
|
+
: v || resolveDefault(f.default, f.type);
|
|
93
121
|
}
|
|
94
122
|
}
|
|
95
123
|
return out;
|
|
@@ -102,7 +102,7 @@ export function IssueDetail({
|
|
|
102
102
|
{statusLabel(issue.status)}
|
|
103
103
|
</span>
|
|
104
104
|
</div>
|
|
105
|
-
<h2 className="
|
|
105
|
+
<h2 className="break-words text-lg font-semibold text-foreground">
|
|
106
106
|
{issue.title}
|
|
107
107
|
</h2>
|
|
108
108
|
{issue.culprit ? (
|
|
@@ -34,6 +34,7 @@ import {
|
|
|
34
34
|
} from "@tabler/icons-react";
|
|
35
35
|
import { useQuery } from "@tanstack/react-query";
|
|
36
36
|
import {
|
|
37
|
+
type CSSProperties,
|
|
37
38
|
type ReactNode,
|
|
38
39
|
useCallback,
|
|
39
40
|
useEffect,
|
|
@@ -711,6 +712,7 @@ function ReplayPlayer({
|
|
|
711
712
|
if (!stageRootRef.current) return;
|
|
712
713
|
let cancelled = false;
|
|
713
714
|
let localReplayer: any = null;
|
|
715
|
+
let stopCursorVisibilityObserver = () => {};
|
|
714
716
|
|
|
715
717
|
async function loadReplay() {
|
|
716
718
|
const replayEvents = eventsRef.current;
|
|
@@ -761,6 +763,8 @@ function ReplayPlayer({
|
|
|
761
763
|
// Do not mutate recorded URLs/CSS; suppress viewer-page referrer leakage
|
|
762
764
|
// at the iframe boundary while retaining historical visual resources.
|
|
763
765
|
localReplayer.iframe?.setAttribute?.("referrerpolicy", "no-referrer");
|
|
766
|
+
stopCursorVisibilityObserver =
|
|
767
|
+
hideReplayCursorUntilPosition(localReplayer);
|
|
764
768
|
replayerRef.current = localReplayer;
|
|
765
769
|
const meta = localReplayer.getMetaData?.();
|
|
766
770
|
const total = Number(meta?.totalTime ?? replayDuration(replayEvents));
|
|
@@ -827,6 +831,7 @@ function ReplayPlayer({
|
|
|
827
831
|
|
|
828
832
|
return () => {
|
|
829
833
|
cancelled = true;
|
|
834
|
+
stopCursorVisibilityObserver();
|
|
830
835
|
if (rafRef.current != null) cancelAnimationFrame(rafRef.current);
|
|
831
836
|
rafRef.current = null;
|
|
832
837
|
try {
|
|
@@ -977,20 +982,27 @@ function ReplayPlayer({
|
|
|
977
982
|
<div
|
|
978
983
|
ref={stageRootRef}
|
|
979
984
|
className="an-replay-stage-root absolute left-1/2 top-1/2"
|
|
980
|
-
style={
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
985
|
+
style={
|
|
986
|
+
{
|
|
987
|
+
width: playerWidth,
|
|
988
|
+
height: playerHeight,
|
|
989
|
+
"--an-replay-cursor-scale": String(1 / fitScale),
|
|
990
|
+
transform: `translate(-50%, -50%) scale(${fitScale})`,
|
|
991
|
+
transformOrigin: "center center",
|
|
992
|
+
} as CSSProperties
|
|
993
|
+
}
|
|
986
994
|
/>
|
|
987
995
|
<button
|
|
988
996
|
type="button"
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
997
|
+
className={cn(
|
|
998
|
+
"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",
|
|
999
|
+
// INTENTIONAL — KEEP THE VIEWER CURSOR VISIBLE.
|
|
1000
|
+
// The recorded cursor is a separate overlay, while this
|
|
1001
|
+
// button owns the live hover target for pause/play. Do
|
|
1002
|
+
// not add `cursor-none`: it makes the user's cursor
|
|
1003
|
+
// disappear when they move over the preview.
|
|
1004
|
+
"cursor-pointer",
|
|
1005
|
+
)}
|
|
994
1006
|
disabled={disabled}
|
|
995
1007
|
aria-label={
|
|
996
1008
|
playing ? t("sessions.pause") : t("sessions.play")
|
|
@@ -2275,6 +2287,32 @@ function hasPlayableReplayEvents(events: unknown[]): boolean {
|
|
|
2275
2287
|
return false;
|
|
2276
2288
|
}
|
|
2277
2289
|
|
|
2290
|
+
function hideReplayCursorUntilPosition(replayer: any): () => void {
|
|
2291
|
+
const cursor = replayer?.mouse as HTMLElement | undefined;
|
|
2292
|
+
if (!cursor || typeof MutationObserver === "undefined") return () => {};
|
|
2293
|
+
|
|
2294
|
+
let observer: MutationObserver | null = null;
|
|
2295
|
+
const revealWhenPositioned = () => {
|
|
2296
|
+
if (!cursor.style.left || !cursor.style.top) return;
|
|
2297
|
+
cursor.classList.add("has-position");
|
|
2298
|
+
observer?.disconnect();
|
|
2299
|
+
observer = null;
|
|
2300
|
+
};
|
|
2301
|
+
|
|
2302
|
+
cursor.classList.remove("has-position");
|
|
2303
|
+
observer = new MutationObserver(revealWhenPositioned);
|
|
2304
|
+
observer.observe(cursor, {
|
|
2305
|
+
attributes: true,
|
|
2306
|
+
attributeFilter: ["style"],
|
|
2307
|
+
});
|
|
2308
|
+
revealWhenPositioned();
|
|
2309
|
+
|
|
2310
|
+
return () => {
|
|
2311
|
+
observer?.disconnect();
|
|
2312
|
+
observer = null;
|
|
2313
|
+
};
|
|
2314
|
+
}
|
|
2315
|
+
|
|
2278
2316
|
export function replayViewportDimensions(
|
|
2279
2317
|
events: AnyReplayEvent[],
|
|
2280
2318
|
): ReplayViewportDimensions | null {
|
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
} from "@tabler/icons-react";
|
|
23
23
|
import { useQuery } from "@tanstack/react-query";
|
|
24
24
|
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
25
|
-
import { Link,
|
|
25
|
+
import { Link, useSearchParams } from "react-router";
|
|
26
26
|
import { toast } from "sonner";
|
|
27
27
|
|
|
28
28
|
import { Badge } from "@/components/ui/badge";
|
|
@@ -205,7 +205,6 @@ export function useDebouncedUrlFilter(
|
|
|
205
205
|
|
|
206
206
|
export default function SessionsPage() {
|
|
207
207
|
const t = useT();
|
|
208
|
-
const navigate = useNavigate();
|
|
209
208
|
const [searchParams, setSearchParams] = useSearchParams();
|
|
210
209
|
const range = readRange(searchParams.get("range"));
|
|
211
210
|
const app = searchParams.get("app") ?? "";
|
|
@@ -389,11 +388,10 @@ export default function SessionsPage() {
|
|
|
389
388
|
recording.startedAt;
|
|
390
389
|
const deviceLabel = sessionDeviceLabel(recording);
|
|
391
390
|
return (
|
|
392
|
-
<
|
|
391
|
+
<Link
|
|
393
392
|
key={recording.id}
|
|
394
|
-
|
|
393
|
+
to={href}
|
|
395
394
|
className="analytics-session-row grid w-full gap-3 px-4 py-3 text-left transition-colors hover:bg-muted/35 focus-visible:bg-muted/35 focus-visible:outline-none"
|
|
396
|
-
onClick={() => navigate(href)}
|
|
397
395
|
aria-label={t("sessions.watchReplay")}
|
|
398
396
|
>
|
|
399
397
|
<span className="inline-flex h-10 w-[92px] items-center justify-center gap-2 rounded-md bg-primary/10 font-medium text-primary">
|
|
@@ -446,7 +444,7 @@ export default function SessionsPage() {
|
|
|
446
444
|
</span>
|
|
447
445
|
) : null}
|
|
448
446
|
</span>
|
|
449
|
-
</
|
|
447
|
+
</Link>
|
|
450
448
|
);
|
|
451
449
|
})}
|
|
452
450
|
</div>
|